ETH Price: $3,476.51 (-1.18%)
Gas: 6 Gwei

Token

Wackies (WACK)
 

Overview

Max Total Supply

972 WACK

Holders

676

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
creolyang.eth
Balance
1 WACK
0xe6C6523Cd68E73C55958BcA91616b109B1ED061b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Wackies is an animated generative version of her portrait art with a supply of 2,500 unique pieces.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Wackies

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-04-17
*/

// SPDX-License-Identifier: MIT
/*
 __          __     _____ _  _______ ______  _____ 
 \ \        / /\   / ____| |/ /_   _|  ____|/ ____|
  \ \  /\  / /  \ | |    | ' /  | | | |__  | (___  
   \ \/  \/ / /\ \| |    |  <   | | |  __|  \___ \ 
    \  /\  / ____ \ |____| . \ _| |_| |____ ____) |
     \/  \/_/    \_\_____|_|\_\_____|______|_____/ 
                                                   
                by Devko.dev#7286
*/
// 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/cryptography/ECDSA.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// 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 (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @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/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/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 (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

// File: contract.sol


pragma solidity ^0.8.4;




contract Wackies is ERC721, Ownable {
    string private _tokenBaseURI = "https://gateway.pinata.cloud/ipfs/QmPwUNyn42xPfvBEFqo4oqtrtJ4tK6kBb8K3k31U8t9Q5t/";
    uint256 public WACK_MAX = 2500;
    uint256 public _tokensMinted;
    uint256 public WL1_PRICE = 0.02 ether;
    uint256 public WL2_PRICE = 0.08 ether;
    uint256 public PUBLIC_PRICE = 0.08 ether;

    bool public publicLive;
    bool public whitelistedLive;

    address private _signer = 0x40A9e33f85a1F310f0b435760eDFA436F11fc21b;
    string private constant SIG_WORD = "WACK_SC_D";

    mapping(address => uint256) public WL1_MINT_LIST;
    mapping(address => bool) public WL2_MINT_LIST;
    mapping(address => bool) public PUBLIC_MINT_LIST;

    using Strings for uint256;
    using ECDSA for bytes32;

    constructor() ERC721("Wackies", "WACK") {}

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    function matchAddresSigner(bytes memory signature, string memory whitelistingType) private view returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(msg.sender, SIG_WORD, whitelistingType))));
        return _signer == hash.recover(signature);
    }

    function gift(address[] calldata receivers) external onlyOwner {
        require(_tokensMinted + receivers.length <= WACK_MAX, "EXCEED_MAX");
        for (uint256 i = 0; i < receivers.length; i++) {
             _tokensMinted++;
            _safeMint(receivers[i], _tokensMinted);
        }
    }

    function founderMint(uint256 tokenQuantity) external onlyOwner {
        require(_tokensMinted + tokenQuantity <= WACK_MAX, "EXCEED_MAX");
        for (uint256 index = 0; index < tokenQuantity; index++) {
            _tokensMinted++;
            _safeMint(msg.sender, _tokensMinted);          
        }
    }

    function mint() payable external callerIsUser {
        require(publicLive, "MINT_CLOSED");
        require(_tokensMinted + 1 <= WACK_MAX, "EXCEED_MAX");
        require(!PUBLIC_MINT_LIST[msg.sender], "EXCEED_ALLOWED");
        require(PUBLIC_PRICE <= msg.value, "INSUFFICIENT_ETH");
        PUBLIC_MINT_LIST[msg.sender] = true;
        _tokensMinted++;
        _safeMint(msg.sender, _tokensMinted);
    }

    function whitelisted1Mint(uint256 tokenQuantity, bytes memory signature) payable external callerIsUser {
        require(whitelistedLive, "MINT_CLOSED");
        require(matchAddresSigner(signature, "type_1"), "DIRECT_MINT_DISALLOWED");
        require(WL1_MINT_LIST[msg.sender] + tokenQuantity <= 2, "EXCEED_ALLOWED");
        require(_tokensMinted + tokenQuantity <= WACK_MAX, "EXCEED_MAX");
        require(WL1_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");

        WL1_MINT_LIST[msg.sender] = WL1_MINT_LIST[msg.sender] + tokenQuantity;
        for (uint256 index = 1; index <= tokenQuantity; index++) {
        _tokensMinted++;
            _safeMint(msg.sender, _tokensMinted);
        }  
    }

    function whitelisted2Mint(bytes memory signature) payable external callerIsUser {
        require(whitelistedLive, "MINT_CLOSED");
        require(matchAddresSigner(signature, "type_2"), "DIRECT_MINT_DISALLOWED");
        require(!WL2_MINT_LIST[msg.sender], "EXCEED_ALLOWED");
        require(_tokensMinted + 1 <= WACK_MAX, "EXCEED_MAX");
        require(WL2_PRICE <= msg.value, "INSUFFICIENT_ETH");

        WL2_MINT_LIST[msg.sender] = true;
        _tokensMinted++;
        _safeMint(msg.sender, _tokensMinted);
    }

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

    function togglePrivateStatus() external onlyOwner {
        whitelistedLive = !whitelistedLive;
    }

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

    function setSigner(address newAddress) external onlyOwner {
        _signer = newAddress;
    }

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

    function withdraw() external onlyOwner {
        uint256 currentBalance = address(this).balance;
        payable(0xbB68F66f170F6093774dc96F9A1574DCC139ad01).transfer(currentBalance *  30 / 1000);
        payable(0x7889cD973b678995cb992862a2b486D9f4eB24Ae).transfer(currentBalance *  60 / 1000);
        payable(0x11111F01570EeAA3e5a2Fd51f4A2f127661B9834).transfer(currentBalance * 120 / 1000);
        payable(0x520D5d67c1c64fDCcEde0fcbF7a3E4648dFD4594).transfer(address(this).balance);
    }
    
    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()));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"PUBLIC_MINT_LIST","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WACK_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WL1_MINT_LIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WL1_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WL2_MINT_LIST","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WL2_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"founderMint","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":"receivers","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setSigner","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":"togglePrivateStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"whitelisted1Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"whitelisted2Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistedLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610100604052605160808181529062002bdd60a03980516200002a916007916020909101906200015f565b506109c460085566470de4df820000600a5567011c37937e080000600b819055600c55600d805462010000600160b01b0319167540a9e33f85a1f310f0b435760edfa436f11fc21b00001790553480156200008457600080fd5b5060408051808201825260078152665761636b69657360c81b6020808301918252835180850190945260048452635741434b60e01b908401528151919291620000d0916000916200015f565b508051620000e69060019060208401906200015f565b50505062000103620000fd6200010960201b60201c565b6200010d565b62000242565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200016d9062000205565b90600052602060002090601f016020900481019282620001915760008555620001dc565b82601f10620001ac57805160ff1916838001178555620001dc565b82800160010185558215620001dc579182015b82811115620001dc578251825591602001919060010190620001bf565b50620001ea929150620001ee565b5090565b5b80821115620001ea5760008155600101620001ef565b600181811c908216806200021a57607f821691505b602082108114156200023c57634e487b7160e01b600052602260045260246000fd5b50919050565b61298b80620002526000396000f3fe60806040526004361061021a5760003560e01c8063715018a611610123578063a819a68e116100ab578063d60a5f061161006f578063d60a5f06146105e6578063e41926fe146105f9578063e985e9c514610618578063f2fde38b14610661578063f42202e81461068157600080fd5b8063a819a68e14610561578063b7f751d814610577578063b88d4fde14610591578063c46eb685146105b1578063c87b56dd146105c657600080fd5b80638da5cb5b116100f25780638da5cb5b146104c957806395d89b41146104e757806397f5ec67146104fc578063a22cb46514610511578063a67250fc1461053157600080fd5b8063715018a61461045e57806379b8e7f81461047357806388b26500146104a05780638d6f5df6146104b357600080fd5b80633ccfd60b116101a65780635815f758116101755780635815f758146103b8578063611f3f10146103e85780636352211e146103fe5780636c19e7831461041e57806370a082311461043e57600080fd5b80633ccfd60b1461034d57806342842e0e1461036257806345b3a9171461038257806355f804b31461039857600080fd5b80631249c58b116101ed5780631249c58b146102d0578063163e1e61146102d857806318160ddd146102f857806323b872dd146103175780632a61b3c11461033757600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc14610276578063095ea7b3146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a366004612373565b6106a1565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106f3565b60405161024b919061261c565b34801561028257600080fd5b50610296610291366004612442565b610785565b6040516001600160a01b03909116815260200161024b565b3480156102ba57600080fd5b506102ce6102c93660046122d4565b61081f565b005b6102ce610935565b3480156102e457600080fd5b506102ce6102f33660046122fe565b610a32565b34801561030457600080fd5b506009545b60405190815260200161024b565b34801561032357600080fd5b506102ce6103323660046121f4565b610aef565b34801561034357600080fd5b50610309600a5481565b34801561035957600080fd5b506102ce610b20565b34801561036e57600080fd5b506102ce61037d3660046121f4565b610c9a565b34801561038e57600080fd5b50610309600b5481565b3480156103a457600080fd5b506102ce6103b33660046123e2565b610cb5565b3480156103c457600080fd5b5061023f6103d336600461219f565b60106020526000908152604090205460ff1681565b3480156103f457600080fd5b50610309600c5481565b34801561040a57600080fd5b50610296610419366004612442565b610ceb565b34801561042a57600080fd5b506102ce61043936600461219f565b610d62565b34801561044a57600080fd5b5061030961045936600461219f565b610db6565b34801561046a57600080fd5b506102ce610e3d565b34801561047f57600080fd5b5061030961048e36600461219f565b600e6020526000908152604090205481565b6102ce6104ae36600461245b565b610e71565b3480156104bf57600080fd5b5061030960095481565b3480156104d557600080fd5b506006546001600160a01b0316610296565b3480156104f357600080fd5b50610269611024565b34801561050857600080fd5b506102ce611033565b34801561051d57600080fd5b506102ce61052c366004612298565b611071565b34801561053d57600080fd5b5061023f61054c36600461219f565b600f6020526000908152604090205460ff1681565b34801561056d57600080fd5b5061030960085481565b34801561058357600080fd5b50600d5461023f9060ff1681565b34801561059d57600080fd5b506102ce6105ac366004612230565b61107c565b3480156105bd57600080fd5b506102ce6110b4565b3480156105d257600080fd5b506102696105e1366004612442565b6110fb565b6102ce6105f43660046123ad565b611194565b34801561060557600080fd5b50600d5461023f90610100900460ff1681565b34801561062457600080fd5b5061023f6106333660046121c1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561066d57600080fd5b506102ce61067c36600461219f565b611304565b34801561068d57600080fd5b506102ce61069c366004612442565b61139c565b60006001600160e01b031982166380ac58cd60e01b14806106d257506001600160e01b03198216635b5e139f60e01b145b806106ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461070290612867565b80601f016020809104026020016040519081016040528092919081815260200182805461072e90612867565b801561077b5780601f106107505761010080835404028352916020019161077b565b820191906000526020600020905b81548152906001019060200180831161075e57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108035760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061082a82610ceb565b9050806001600160a01b0316836001600160a01b031614156108985760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107fa565b336001600160a01b03821614806108b457506108b48133610633565b6109265760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107fa565b6109308383611433565b505050565b3233146109545760405162461bcd60e51b81526004016107fa906126ce565b600d5460ff166109765760405162461bcd60e51b81526004016107fa906126a9565b6008546009546109879060016127d9565b11156109a55760405162461bcd60e51b81526004016107fa9061273a565b3360009081526010602052604090205460ff16156109d55760405162461bcd60e51b81526004016107fa9061262f565b34600c5411156109f75760405162461bcd60e51b81526004016107fa906127af565b336000908152601060205260408120805460ff191660011790556009805491610a1f836128a2565b9190505550610a30336009546114a1565b565b6006546001600160a01b03163314610a5c5760405162461bcd60e51b81526004016107fa90612705565b600854600954610a6d9083906127d9565b1115610a8b5760405162461bcd60e51b81526004016107fa9061273a565b60005b818110156109305760098054906000610aa6836128a2565b9190505550610add838383818110610ac057610ac0612913565b9050602002016020810190610ad5919061219f565b6009546114a1565b80610ae7816128a2565b915050610a8e565b610af933826114bb565b610b155760405162461bcd60e51b81526004016107fa9061275e565b6109308383836115b2565b6006546001600160a01b03163314610b4a5760405162461bcd60e51b81526004016107fa90612705565b4773bb68f66f170f6093774dc96f9a1574dcc139ad016108fc6103e8610b7184601e612805565b610b7b91906127f1565b6040518115909202916000818181858888f19350505050158015610ba3573d6000803e3d6000fd5b50737889cd973b678995cb992862a2b486d9f4eb24ae6108fc6103e8610bca84603c612805565b610bd491906127f1565b6040518115909202916000818181858888f19350505050158015610bfc573d6000803e3d6000fd5b507311111f01570eeaa3e5a2fd51f4a2f127661b98346108fc6103e8610c23846078612805565b610c2d91906127f1565b6040518115909202916000818181858888f19350505050158015610c55573d6000803e3d6000fd5b5060405173520d5d67c1c64fdccede0fcbf7a3e4648dfd4594904780156108fc02916000818181858888f19350505050158015610c96573d6000803e3d6000fd5b5050565b6109308383836040518060200160405280600081525061107c565b6006546001600160a01b03163314610cdf5760405162461bcd60e51b81526004016107fa90612705565b6109306007838361205d565b6000818152600260205260408120546001600160a01b0316806106ed5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107fa565b6006546001600160a01b03163314610d8c5760405162461bcd60e51b81526004016107fa90612705565b600d80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60006001600160a01b038216610e215760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107fa565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610e675760405162461bcd60e51b81526004016107fa90612705565b610a30600061174e565b323314610e905760405162461bcd60e51b81526004016107fa906126ce565b600d54610100900460ff16610eb75760405162461bcd60e51b81526004016107fa906126a9565b610edf8160405180604001604052806006815260200165747970655f3160d01b8152506117a0565b610f245760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b60448201526064016107fa565b336000908152600e6020526040902054600290610f429084906127d9565b1115610f605760405162461bcd60e51b81526004016107fa9061262f565b60085482600954610f7191906127d9565b1115610f8f5760405162461bcd60e51b81526004016107fa9061273a565b3482600a54610f9e9190612805565b1115610fbc5760405162461bcd60e51b81526004016107fa906127af565b336000908152600e6020526040902054610fd79083906127d9565b336000908152600e602052604090205560015b8281116109305760098054906000611001836128a2565b9190505550611012336009546114a1565b8061101c816128a2565b915050610fea565b60606001805461070290612867565b6006546001600160a01b0316331461105d5760405162461bcd60e51b81526004016107fa90612705565b600d805460ff19811660ff90911615179055565b610c96338383611866565b61108633836114bb565b6110a25760405162461bcd60e51b81526004016107fa9061275e565b6110ae84848484611935565b50505050565b6006546001600160a01b031633146110de5760405162461bcd60e51b81526004016107fa90612705565b600d805461ff001981166101009182900460ff1615909102179055565b6000818152600260205260409020546060906001600160a01b03166111625760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e0060448201526064016107fa565b600761116d83611968565b60405160200161117e929190612538565b6040516020818303038152906040529050919050565b3233146111b35760405162461bcd60e51b81526004016107fa906126ce565b600d54610100900460ff166111da5760405162461bcd60e51b81526004016107fa906126a9565b61120281604051806040016040528060068152602001653a3cb832af9960d11b8152506117a0565b6112475760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b60448201526064016107fa565b336000908152600f602052604090205460ff16156112775760405162461bcd60e51b81526004016107fa9061262f565b6008546009546112889060016127d9565b11156112a65760405162461bcd60e51b81526004016107fa9061273a565b34600b5411156112c85760405162461bcd60e51b81526004016107fa906127af565b336000908152600f60205260408120805460ff1916600117905560098054916112f0836128a2565b9190505550611301336009546114a1565b50565b6006546001600160a01b0316331461132e5760405162461bcd60e51b81526004016107fa90612705565b6001600160a01b0381166113935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107fa565b6113018161174e565b6006546001600160a01b031633146113c65760405162461bcd60e51b81526004016107fa90612705565b600854816009546113d791906127d9565b11156113f55760405162461bcd60e51b81526004016107fa9061273a565b60005b81811015610c965760098054906000611410836128a2565b9190505550611421336009546114a1565b8061142b816128a2565b9150506113f8565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061146882610ceb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610c96828260405180602001604052806000815250611a66565b6000818152600260205260408120546001600160a01b03166115345760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107fa565b600061153f83610ceb565b9050806001600160a01b0316846001600160a01b0316148061157a5750836001600160a01b031661156f84610785565b6001600160a01b0316145b806115aa57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166115c582610ceb565b6001600160a01b0316146116295760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016107fa565b6001600160a01b03821661168b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107fa565b611696600082611433565b6001600160a01b03831660009081526003602052604081208054600192906116bf908490612824565b90915550506001600160a01b03821660009081526003602052604081208054600192906116ed9084906127d9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080336040518060400160405280600981526020016815d050d2d7d4d0d7d160ba1b815250846040516020016117d9939291906124ea565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f19818403018152919052805160209091012090506118468185611a99565b600d546201000090046001600160a01b0390811691161491505092915050565b816001600160a01b0316836001600160a01b031614156118c85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107fa565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6119408484846115b2565b61194c84848484611abd565b6110ae5760405162461bcd60e51b81526004016107fa90612657565b60608161198c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156119b657806119a0816128a2565b91506119af9050600a836127f1565b9150611990565b60008167ffffffffffffffff8111156119d1576119d1612929565b6040519080825280601f01601f1916602001820160405280156119fb576020820181803683370190505b5090505b84156115aa57611a10600183612824565b9150611a1d600a866128bd565b611a289060306127d9565b60f81b818381518110611a3d57611a3d612913565b60200101906001600160f81b031916908160001a905350611a5f600a866127f1565b94506119ff565b611a708383611bca565b611a7d6000848484611abd565b6109305760405162461bcd60e51b81526004016107fa90612657565b6000806000611aa88585611d0c565b91509150611ab581611d7c565b509392505050565b60006001600160a01b0384163b15611bbf57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611b019033908990889088906004016125df565b602060405180830381600087803b158015611b1b57600080fd5b505af1925050508015611b4b575060408051601f3d908101601f19168201909252611b4891810190612390565b60015b611ba5573d808015611b79576040519150601f19603f3d011682016040523d82523d6000602084013e611b7e565b606091505b508051611b9d5760405162461bcd60e51b81526004016107fa90612657565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115aa565b506001949350505050565b6001600160a01b038216611c205760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107fa565b6000818152600260205260409020546001600160a01b031615611c855760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107fa565b6001600160a01b0382166000908152600360205260408120805460019290611cae9084906127d9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080825160411415611d435760208301516040840151606085015160001a611d3787828585611f37565b94509450505050611d75565b825160401415611d6d5760208301516040840151611d62868383612024565b935093505050611d75565b506000905060025b9250929050565b6000816004811115611d9057611d906128fd565b1415611d995750565b6001816004811115611dad57611dad6128fd565b1415611dfb5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016107fa565b6002816004811115611e0f57611e0f6128fd565b1415611e5d5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016107fa565b6003816004811115611e7157611e716128fd565b1415611eca5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016107fa565b6004816004811115611ede57611ede6128fd565b14156113015760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016107fa565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611f6e575060009050600361201b565b8460ff16601b14158015611f8657508460ff16601c14155b15611f97575060009050600461201b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611feb573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166120145760006001925092505061201b565b9150600090505b94509492505050565b6000806001600160ff1b0383168161204160ff86901c601b6127d9565b905061204f87828885611f37565b935093505050935093915050565b82805461206990612867565b90600052602060002090601f01602090048101928261208b57600085556120d1565b82601f106120a45782800160ff198235161785556120d1565b828001600101855582156120d1579182015b828111156120d15782358255916020019190600101906120b6565b506120dd9291506120e1565b5090565b5b808211156120dd57600081556001016120e2565b80356001600160a01b038116811461210d57600080fd5b919050565b600082601f83011261212357600080fd5b813567ffffffffffffffff8082111561213e5761213e612929565b604051601f8301601f19908116603f0116810190828211818310171561216657612166612929565b8160405283815286602085880101111561217f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156121b157600080fd5b6121ba826120f6565b9392505050565b600080604083850312156121d457600080fd5b6121dd836120f6565b91506121eb602084016120f6565b90509250929050565b60008060006060848603121561220957600080fd5b612212846120f6565b9250612220602085016120f6565b9150604084013590509250925092565b6000806000806080858703121561224657600080fd5b61224f856120f6565b935061225d602086016120f6565b925060408501359150606085013567ffffffffffffffff81111561228057600080fd5b61228c87828801612112565b91505092959194509250565b600080604083850312156122ab57600080fd5b6122b4836120f6565b9150602083013580151581146122c957600080fd5b809150509250929050565b600080604083850312156122e757600080fd5b6122f0836120f6565b946020939093013593505050565b6000806020838503121561231157600080fd5b823567ffffffffffffffff8082111561232957600080fd5b818501915085601f83011261233d57600080fd5b81358181111561234c57600080fd5b8660208260051b850101111561236157600080fd5b60209290920196919550909350505050565b60006020828403121561238557600080fd5b81356121ba8161293f565b6000602082840312156123a257600080fd5b81516121ba8161293f565b6000602082840312156123bf57600080fd5b813567ffffffffffffffff8111156123d657600080fd5b6115aa84828501612112565b600080602083850312156123f557600080fd5b823567ffffffffffffffff8082111561240d57600080fd5b818501915085601f83011261242157600080fd5b81358181111561243057600080fd5b86602082850101111561236157600080fd5b60006020828403121561245457600080fd5b5035919050565b6000806040838503121561246e57600080fd5b82359150602083013567ffffffffffffffff81111561248c57600080fd5b61249885828601612112565b9150509250929050565b600081518084526124ba81602086016020860161283b565b601f01601f19169290920160200192915050565b600081516124e081856020860161283b565b9290920192915050565b6bffffffffffffffffffffffff198460601b1681526000835161251481601485016020880161283b565b83519083019061252b81601484016020880161283b565b0160140195945050505050565b600080845481600182811c91508083168061255457607f831692505b602080841082141561257457634e487b7160e01b86526022600452602486fd5b8180156125885760018114612599576125c6565b60ff198616895284890196506125c6565b60008b81526020902060005b868110156125be5781548b8201529085019083016125a5565b505084890196505b5050505050506125d681856124ce565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612612908301846124a2565b9695505050505050565b6020815260006121ba60208301846124a2565b6020808252600e908201526d115610d1515117d0531313d5d15160921b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600b908201526a1352539517d0d313d4d15160aa1b604082015260600190565b6020808252601e908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600a908201526908ab0868a8a88be9a82b60b31b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526010908201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b604082015260600190565b600082198211156127ec576127ec6128d1565b500190565b600082612800576128006128e7565b500490565b600081600019048311821515161561281f5761281f6128d1565b500290565b600082821015612836576128366128d1565b500390565b60005b8381101561285657818101518382015260200161283e565b838111156110ae5750506000910152565b600181811c9082168061287b57607f821691505b6020821081141561289c57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156128b6576128b66128d1565b5060010190565b6000826128cc576128cc6128e7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461130157600080fdfea264697066735822122002608c4437eaaee29e9a6575b701ff7cc40233076812bc6b4d3f4a0d0370844c64736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5077554e796e343278506676424546716f346f717472744a34744b366b4262384b336b3331553874395135742f

Deployed Bytecode

0x60806040526004361061021a5760003560e01c8063715018a611610123578063a819a68e116100ab578063d60a5f061161006f578063d60a5f06146105e6578063e41926fe146105f9578063e985e9c514610618578063f2fde38b14610661578063f42202e81461068157600080fd5b8063a819a68e14610561578063b7f751d814610577578063b88d4fde14610591578063c46eb685146105b1578063c87b56dd146105c657600080fd5b80638da5cb5b116100f25780638da5cb5b146104c957806395d89b41146104e757806397f5ec67146104fc578063a22cb46514610511578063a67250fc1461053157600080fd5b8063715018a61461045e57806379b8e7f81461047357806388b26500146104a05780638d6f5df6146104b357600080fd5b80633ccfd60b116101a65780635815f758116101755780635815f758146103b8578063611f3f10146103e85780636352211e146103fe5780636c19e7831461041e57806370a082311461043e57600080fd5b80633ccfd60b1461034d57806342842e0e1461036257806345b3a9171461038257806355f804b31461039857600080fd5b80631249c58b116101ed5780631249c58b146102d0578063163e1e61146102d857806318160ddd146102f857806323b872dd146103175780632a61b3c11461033757600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc14610276578063095ea7b3146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a366004612373565b6106a1565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106f3565b60405161024b919061261c565b34801561028257600080fd5b50610296610291366004612442565b610785565b6040516001600160a01b03909116815260200161024b565b3480156102ba57600080fd5b506102ce6102c93660046122d4565b61081f565b005b6102ce610935565b3480156102e457600080fd5b506102ce6102f33660046122fe565b610a32565b34801561030457600080fd5b506009545b60405190815260200161024b565b34801561032357600080fd5b506102ce6103323660046121f4565b610aef565b34801561034357600080fd5b50610309600a5481565b34801561035957600080fd5b506102ce610b20565b34801561036e57600080fd5b506102ce61037d3660046121f4565b610c9a565b34801561038e57600080fd5b50610309600b5481565b3480156103a457600080fd5b506102ce6103b33660046123e2565b610cb5565b3480156103c457600080fd5b5061023f6103d336600461219f565b60106020526000908152604090205460ff1681565b3480156103f457600080fd5b50610309600c5481565b34801561040a57600080fd5b50610296610419366004612442565b610ceb565b34801561042a57600080fd5b506102ce61043936600461219f565b610d62565b34801561044a57600080fd5b5061030961045936600461219f565b610db6565b34801561046a57600080fd5b506102ce610e3d565b34801561047f57600080fd5b5061030961048e36600461219f565b600e6020526000908152604090205481565b6102ce6104ae36600461245b565b610e71565b3480156104bf57600080fd5b5061030960095481565b3480156104d557600080fd5b506006546001600160a01b0316610296565b3480156104f357600080fd5b50610269611024565b34801561050857600080fd5b506102ce611033565b34801561051d57600080fd5b506102ce61052c366004612298565b611071565b34801561053d57600080fd5b5061023f61054c36600461219f565b600f6020526000908152604090205460ff1681565b34801561056d57600080fd5b5061030960085481565b34801561058357600080fd5b50600d5461023f9060ff1681565b34801561059d57600080fd5b506102ce6105ac366004612230565b61107c565b3480156105bd57600080fd5b506102ce6110b4565b3480156105d257600080fd5b506102696105e1366004612442565b6110fb565b6102ce6105f43660046123ad565b611194565b34801561060557600080fd5b50600d5461023f90610100900460ff1681565b34801561062457600080fd5b5061023f6106333660046121c1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561066d57600080fd5b506102ce61067c36600461219f565b611304565b34801561068d57600080fd5b506102ce61069c366004612442565b61139c565b60006001600160e01b031982166380ac58cd60e01b14806106d257506001600160e01b03198216635b5e139f60e01b145b806106ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461070290612867565b80601f016020809104026020016040519081016040528092919081815260200182805461072e90612867565b801561077b5780601f106107505761010080835404028352916020019161077b565b820191906000526020600020905b81548152906001019060200180831161075e57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108035760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061082a82610ceb565b9050806001600160a01b0316836001600160a01b031614156108985760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107fa565b336001600160a01b03821614806108b457506108b48133610633565b6109265760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107fa565b6109308383611433565b505050565b3233146109545760405162461bcd60e51b81526004016107fa906126ce565b600d5460ff166109765760405162461bcd60e51b81526004016107fa906126a9565b6008546009546109879060016127d9565b11156109a55760405162461bcd60e51b81526004016107fa9061273a565b3360009081526010602052604090205460ff16156109d55760405162461bcd60e51b81526004016107fa9061262f565b34600c5411156109f75760405162461bcd60e51b81526004016107fa906127af565b336000908152601060205260408120805460ff191660011790556009805491610a1f836128a2565b9190505550610a30336009546114a1565b565b6006546001600160a01b03163314610a5c5760405162461bcd60e51b81526004016107fa90612705565b600854600954610a6d9083906127d9565b1115610a8b5760405162461bcd60e51b81526004016107fa9061273a565b60005b818110156109305760098054906000610aa6836128a2565b9190505550610add838383818110610ac057610ac0612913565b9050602002016020810190610ad5919061219f565b6009546114a1565b80610ae7816128a2565b915050610a8e565b610af933826114bb565b610b155760405162461bcd60e51b81526004016107fa9061275e565b6109308383836115b2565b6006546001600160a01b03163314610b4a5760405162461bcd60e51b81526004016107fa90612705565b4773bb68f66f170f6093774dc96f9a1574dcc139ad016108fc6103e8610b7184601e612805565b610b7b91906127f1565b6040518115909202916000818181858888f19350505050158015610ba3573d6000803e3d6000fd5b50737889cd973b678995cb992862a2b486d9f4eb24ae6108fc6103e8610bca84603c612805565b610bd491906127f1565b6040518115909202916000818181858888f19350505050158015610bfc573d6000803e3d6000fd5b507311111f01570eeaa3e5a2fd51f4a2f127661b98346108fc6103e8610c23846078612805565b610c2d91906127f1565b6040518115909202916000818181858888f19350505050158015610c55573d6000803e3d6000fd5b5060405173520d5d67c1c64fdccede0fcbf7a3e4648dfd4594904780156108fc02916000818181858888f19350505050158015610c96573d6000803e3d6000fd5b5050565b6109308383836040518060200160405280600081525061107c565b6006546001600160a01b03163314610cdf5760405162461bcd60e51b81526004016107fa90612705565b6109306007838361205d565b6000818152600260205260408120546001600160a01b0316806106ed5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107fa565b6006546001600160a01b03163314610d8c5760405162461bcd60e51b81526004016107fa90612705565b600d80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60006001600160a01b038216610e215760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107fa565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610e675760405162461bcd60e51b81526004016107fa90612705565b610a30600061174e565b323314610e905760405162461bcd60e51b81526004016107fa906126ce565b600d54610100900460ff16610eb75760405162461bcd60e51b81526004016107fa906126a9565b610edf8160405180604001604052806006815260200165747970655f3160d01b8152506117a0565b610f245760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b60448201526064016107fa565b336000908152600e6020526040902054600290610f429084906127d9565b1115610f605760405162461bcd60e51b81526004016107fa9061262f565b60085482600954610f7191906127d9565b1115610f8f5760405162461bcd60e51b81526004016107fa9061273a565b3482600a54610f9e9190612805565b1115610fbc5760405162461bcd60e51b81526004016107fa906127af565b336000908152600e6020526040902054610fd79083906127d9565b336000908152600e602052604090205560015b8281116109305760098054906000611001836128a2565b9190505550611012336009546114a1565b8061101c816128a2565b915050610fea565b60606001805461070290612867565b6006546001600160a01b0316331461105d5760405162461bcd60e51b81526004016107fa90612705565b600d805460ff19811660ff90911615179055565b610c96338383611866565b61108633836114bb565b6110a25760405162461bcd60e51b81526004016107fa9061275e565b6110ae84848484611935565b50505050565b6006546001600160a01b031633146110de5760405162461bcd60e51b81526004016107fa90612705565b600d805461ff001981166101009182900460ff1615909102179055565b6000818152600260205260409020546060906001600160a01b03166111625760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e0060448201526064016107fa565b600761116d83611968565b60405160200161117e929190612538565b6040516020818303038152906040529050919050565b3233146111b35760405162461bcd60e51b81526004016107fa906126ce565b600d54610100900460ff166111da5760405162461bcd60e51b81526004016107fa906126a9565b61120281604051806040016040528060068152602001653a3cb832af9960d11b8152506117a0565b6112475760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b60448201526064016107fa565b336000908152600f602052604090205460ff16156112775760405162461bcd60e51b81526004016107fa9061262f565b6008546009546112889060016127d9565b11156112a65760405162461bcd60e51b81526004016107fa9061273a565b34600b5411156112c85760405162461bcd60e51b81526004016107fa906127af565b336000908152600f60205260408120805460ff1916600117905560098054916112f0836128a2565b9190505550611301336009546114a1565b50565b6006546001600160a01b0316331461132e5760405162461bcd60e51b81526004016107fa90612705565b6001600160a01b0381166113935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107fa565b6113018161174e565b6006546001600160a01b031633146113c65760405162461bcd60e51b81526004016107fa90612705565b600854816009546113d791906127d9565b11156113f55760405162461bcd60e51b81526004016107fa9061273a565b60005b81811015610c965760098054906000611410836128a2565b9190505550611421336009546114a1565b8061142b816128a2565b9150506113f8565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061146882610ceb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610c96828260405180602001604052806000815250611a66565b6000818152600260205260408120546001600160a01b03166115345760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107fa565b600061153f83610ceb565b9050806001600160a01b0316846001600160a01b0316148061157a5750836001600160a01b031661156f84610785565b6001600160a01b0316145b806115aa57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166115c582610ceb565b6001600160a01b0316146116295760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016107fa565b6001600160a01b03821661168b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107fa565b611696600082611433565b6001600160a01b03831660009081526003602052604081208054600192906116bf908490612824565b90915550506001600160a01b03821660009081526003602052604081208054600192906116ed9084906127d9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080336040518060400160405280600981526020016815d050d2d7d4d0d7d160ba1b815250846040516020016117d9939291906124ea565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f19818403018152919052805160209091012090506118468185611a99565b600d546201000090046001600160a01b0390811691161491505092915050565b816001600160a01b0316836001600160a01b031614156118c85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107fa565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6119408484846115b2565b61194c84848484611abd565b6110ae5760405162461bcd60e51b81526004016107fa90612657565b60608161198c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156119b657806119a0816128a2565b91506119af9050600a836127f1565b9150611990565b60008167ffffffffffffffff8111156119d1576119d1612929565b6040519080825280601f01601f1916602001820160405280156119fb576020820181803683370190505b5090505b84156115aa57611a10600183612824565b9150611a1d600a866128bd565b611a289060306127d9565b60f81b818381518110611a3d57611a3d612913565b60200101906001600160f81b031916908160001a905350611a5f600a866127f1565b94506119ff565b611a708383611bca565b611a7d6000848484611abd565b6109305760405162461bcd60e51b81526004016107fa90612657565b6000806000611aa88585611d0c565b91509150611ab581611d7c565b509392505050565b60006001600160a01b0384163b15611bbf57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611b019033908990889088906004016125df565b602060405180830381600087803b158015611b1b57600080fd5b505af1925050508015611b4b575060408051601f3d908101601f19168201909252611b4891810190612390565b60015b611ba5573d808015611b79576040519150601f19603f3d011682016040523d82523d6000602084013e611b7e565b606091505b508051611b9d5760405162461bcd60e51b81526004016107fa90612657565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115aa565b506001949350505050565b6001600160a01b038216611c205760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107fa565b6000818152600260205260409020546001600160a01b031615611c855760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107fa565b6001600160a01b0382166000908152600360205260408120805460019290611cae9084906127d9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080825160411415611d435760208301516040840151606085015160001a611d3787828585611f37565b94509450505050611d75565b825160401415611d6d5760208301516040840151611d62868383612024565b935093505050611d75565b506000905060025b9250929050565b6000816004811115611d9057611d906128fd565b1415611d995750565b6001816004811115611dad57611dad6128fd565b1415611dfb5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016107fa565b6002816004811115611e0f57611e0f6128fd565b1415611e5d5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016107fa565b6003816004811115611e7157611e716128fd565b1415611eca5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016107fa565b6004816004811115611ede57611ede6128fd565b14156113015760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016107fa565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611f6e575060009050600361201b565b8460ff16601b14158015611f8657508460ff16601c14155b15611f97575060009050600461201b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611feb573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166120145760006001925092505061201b565b9150600090505b94509492505050565b6000806001600160ff1b0383168161204160ff86901c601b6127d9565b905061204f87828885611f37565b935093505050935093915050565b82805461206990612867565b90600052602060002090601f01602090048101928261208b57600085556120d1565b82601f106120a45782800160ff198235161785556120d1565b828001600101855582156120d1579182015b828111156120d15782358255916020019190600101906120b6565b506120dd9291506120e1565b5090565b5b808211156120dd57600081556001016120e2565b80356001600160a01b038116811461210d57600080fd5b919050565b600082601f83011261212357600080fd5b813567ffffffffffffffff8082111561213e5761213e612929565b604051601f8301601f19908116603f0116810190828211818310171561216657612166612929565b8160405283815286602085880101111561217f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156121b157600080fd5b6121ba826120f6565b9392505050565b600080604083850312156121d457600080fd5b6121dd836120f6565b91506121eb602084016120f6565b90509250929050565b60008060006060848603121561220957600080fd5b612212846120f6565b9250612220602085016120f6565b9150604084013590509250925092565b6000806000806080858703121561224657600080fd5b61224f856120f6565b935061225d602086016120f6565b925060408501359150606085013567ffffffffffffffff81111561228057600080fd5b61228c87828801612112565b91505092959194509250565b600080604083850312156122ab57600080fd5b6122b4836120f6565b9150602083013580151581146122c957600080fd5b809150509250929050565b600080604083850312156122e757600080fd5b6122f0836120f6565b946020939093013593505050565b6000806020838503121561231157600080fd5b823567ffffffffffffffff8082111561232957600080fd5b818501915085601f83011261233d57600080fd5b81358181111561234c57600080fd5b8660208260051b850101111561236157600080fd5b60209290920196919550909350505050565b60006020828403121561238557600080fd5b81356121ba8161293f565b6000602082840312156123a257600080fd5b81516121ba8161293f565b6000602082840312156123bf57600080fd5b813567ffffffffffffffff8111156123d657600080fd5b6115aa84828501612112565b600080602083850312156123f557600080fd5b823567ffffffffffffffff8082111561240d57600080fd5b818501915085601f83011261242157600080fd5b81358181111561243057600080fd5b86602082850101111561236157600080fd5b60006020828403121561245457600080fd5b5035919050565b6000806040838503121561246e57600080fd5b82359150602083013567ffffffffffffffff81111561248c57600080fd5b61249885828601612112565b9150509250929050565b600081518084526124ba81602086016020860161283b565b601f01601f19169290920160200192915050565b600081516124e081856020860161283b565b9290920192915050565b6bffffffffffffffffffffffff198460601b1681526000835161251481601485016020880161283b565b83519083019061252b81601484016020880161283b565b0160140195945050505050565b600080845481600182811c91508083168061255457607f831692505b602080841082141561257457634e487b7160e01b86526022600452602486fd5b8180156125885760018114612599576125c6565b60ff198616895284890196506125c6565b60008b81526020902060005b868110156125be5781548b8201529085019083016125a5565b505084890196505b5050505050506125d681856124ce565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612612908301846124a2565b9695505050505050565b6020815260006121ba60208301846124a2565b6020808252600e908201526d115610d1515117d0531313d5d15160921b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600b908201526a1352539517d0d313d4d15160aa1b604082015260600190565b6020808252601e908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600a908201526908ab0868a8a88be9a82b60b31b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526010908201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b604082015260600190565b600082198211156127ec576127ec6128d1565b500190565b600082612800576128006128e7565b500490565b600081600019048311821515161561281f5761281f6128d1565b500290565b600082821015612836576128366128d1565b500390565b60005b8381101561285657818101518382015260200161283e565b838111156110ae5750506000910152565b600181811c9082168061287b57607f821691505b6020821081141561289c57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156128b6576128b66128d1565b5060010190565b6000826128cc576128cc6128e7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461130157600080fdfea264697066735822122002608c4437eaaee29e9a6575b701ff7cc40233076812bc6b4d3f4a0d0370844c64736f6c63430008070033

Deployed Bytecode Sourcemap

47262:4924:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34088:305;;;;;;;;;;-1:-1:-1;34088:305:0;;;;;:::i;:::-;;:::i;:::-;;;8959:14:1;;8952:22;8934:41;;8922:2;8907:18;34088:305:0;;;;;;;;35033:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;36592:221::-;;;;;;;;;;-1:-1:-1;36592:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8257:32:1;;;8239:51;;8227:2;8212:18;36592:221:0;8093:203:1;36115:411:0;;;;;;;;;;-1:-1:-1;36115:411:0;;;;;:::i;:::-;;:::i;:::-;;49207:413;;;:::i;48574:302::-;;;;;;;;;;-1:-1:-1;48574:302:0;;;;;:::i;:::-;;:::i;51329:92::-;;;;;;;;;;-1:-1:-1;51400:13:0;;51329:92;;;19677:25:1;;;19665:2;19650:18;51329:92:0;19531:177:1;37342:339:0;;;;;;;;;;-1:-1:-1;37342:339:0;;;;;:::i;:::-;;:::i;47498:37::-;;;;;;;;;;;;;;;;51429:498;;;;;;;;;;;;;:::i;37752:185::-;;;;;;;;;;-1:-1:-1;37752:185:0;;;;;:::i;:::-;;:::i;47542:37::-;;;;;;;;;;;;;;;;51110:106;;;;;;;;;;-1:-1:-1;51110:106:0;;;;;:::i;:::-;;:::i;47937:48::-;;;;;;;;;;-1:-1:-1;47937:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;47586:40;;;;;;;;;;;;;;;;34727:239;;;;;;;;;;-1:-1:-1;34727:239:0;;;;;:::i;:::-;;:::i;51224:97::-;;;;;;;;;;-1:-1:-1;51224:97:0;;;;;:::i;:::-;;:::i;34457:208::-;;;;;;;;;;-1:-1:-1;34457:208:0;;;;;:::i;:::-;;:::i;14709:103::-;;;;;;;;;;;;;:::i;47830:48::-;;;;;;;;;;-1:-1:-1;47830:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;49628:722;;;;;;:::i;:::-;;:::i;47463:28::-;;;;;;;;;;;;;;;;14058:87;;;;;;;;;;-1:-1:-1;14131:6:0;;-1:-1:-1;;;;;14131:6:0;14058:87;;35202:104;;;;;;;;;;;;;:::i;50895:96::-;;;;;;;;;;;;;:::i;36885:155::-;;;;;;;;;;-1:-1:-1;36885:155:0;;;;;:::i;:::-;;:::i;47885:45::-;;;;;;;;;;-1:-1:-1;47885:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;47426:30;;;;;;;;;;;;;;;;47635:22;;;;;;;;;;-1:-1:-1;47635:22:0;;;;;;;;38008:328;;;;;;;;;;-1:-1:-1;38008:328:0;;;;;:::i;:::-;;:::i;50999:103::-;;;;;;;;;;;;;:::i;51939:244::-;;;;;;;;;;-1:-1:-1;51939:244:0;;;;;:::i;:::-;;:::i;50358:529::-;;;;;;:::i;:::-;;:::i;47664:27::-;;;;;;;;;;-1:-1:-1;47664:27:0;;;;;;;;;;;37111:164;;;;;;;;;;-1:-1:-1;37111:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;37232:25:0;;;37208:4;37232:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;37111:164;14967:201;;;;;;;;;;-1:-1:-1;14967:201:0;;;;;:::i;:::-;;:::i;48884:315::-;;;;;;;;;;-1:-1:-1;48884:315:0;;;;;:::i;:::-;;:::i;34088:305::-;34190:4;-1:-1:-1;;;;;;34227:40:0;;-1:-1:-1;;;34227:40:0;;:105;;-1:-1:-1;;;;;;;34284:48:0;;-1:-1:-1;;;34284:48:0;34227:105;:158;;;-1:-1:-1;;;;;;;;;;26951:40:0;;;34349:36;34207:178;34088:305;-1:-1:-1;;34088:305:0:o;35033:100::-;35087:13;35120:5;35113:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35033:100;:::o;36592:221::-;36668:7;39935:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39935:16:0;36688:73;;;;-1:-1:-1;;;36688:73:0;;17095:2:1;36688:73:0;;;17077:21:1;17134:2;17114:18;;;17107:30;17173:34;17153:18;;;17146:62;-1:-1:-1;;;17224:18:1;;;17217:42;17276:19;;36688:73:0;;;;;;;;;-1:-1:-1;36781:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;36781:24:0;;36592:221::o;36115:411::-;36196:13;36212:23;36227:7;36212:14;:23::i;:::-;36196:39;;36260:5;-1:-1:-1;;;;;36254:11:0;:2;-1:-1:-1;;;;;36254:11:0;;;36246:57;;;;-1:-1:-1;;;36246:57:0;;18229:2:1;36246:57:0;;;18211:21:1;18268:2;18248:18;;;18241:30;18307:34;18287:18;;;18280:62;-1:-1:-1;;;18358:18:1;;;18351:31;18399:19;;36246:57:0;18027:397:1;36246:57:0;12862:10;-1:-1:-1;;;;;36338:21:0;;;;:62;;-1:-1:-1;36363:37:0;36380:5;12862:10;37111:164;:::i;36363:37::-;36316:168;;;;-1:-1:-1;;;36316:168:0;;15085:2:1;36316:168:0;;;15067:21:1;15124:2;15104:18;;;15097:30;15163:34;15143:18;;;15136:62;15234:26;15214:18;;;15207:54;15278:19;;36316:168:0;14883:420:1;36316:168:0;36497:21;36506:2;36510:7;36497:8;:21::i;:::-;36185:341;36115:411;;:::o;49207:413::-;48151:9;48164:10;48151:23;48143:66;;;;-1:-1:-1;;;48143:66:0;;;;;;;:::i;:::-;49272:10:::1;::::0;::::1;;49264:34;;;;-1:-1:-1::0;;;49264:34:0::1;;;;;;;:::i;:::-;49338:8;::::0;49317:13:::1;::::0;:17:::1;::::0;49333:1:::1;49317:17;:::i;:::-;:29;;49309:52;;;;-1:-1:-1::0;;;49309:52:0::1;;;;;;;:::i;:::-;49398:10;49381:28;::::0;;;:16:::1;:28;::::0;;;;;::::1;;49380:29;49372:56;;;;-1:-1:-1::0;;;49372:56:0::1;;;;;;;:::i;:::-;49463:9;49447:12;;:25;;49439:54;;;;-1:-1:-1::0;;;49439:54:0::1;;;;;;;:::i;:::-;49521:10;49504:28;::::0;;;:16:::1;:28;::::0;;;;:35;;-1:-1:-1;;49504:35:0::1;49535:4;49504:35;::::0;;49550:13:::1;:15:::0;;;::::1;::::0;::::1;:::i;:::-;;;;;;49576:36;49586:10;49598:13;;49576:9;:36::i;:::-;49207:413::o:0;48574:302::-;14131:6;;-1:-1:-1;;;;;14131:6:0;12862:10;14278:23;14270:68;;;;-1:-1:-1;;;14270:68:0;;;;;;;:::i;:::-;48692:8:::1;::::0;48656:13:::1;::::0;:32:::1;::::0;48672:9;;48656:32:::1;:::i;:::-;:44;;48648:67;;;;-1:-1:-1::0;;;48648:67:0::1;;;;;;;:::i;:::-;48731:9;48726:143;48746:20:::0;;::::1;48726:143;;;48789:13;:15:::0;;;:13:::1;:15;::::0;::::1;:::i;:::-;;;;;;48819:38;48829:9;;48839:1;48829:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;48843:13;;48819:9;:38::i;:::-;48768:3:::0;::::1;::::0;::::1;:::i;:::-;;;;48726:143;;37342:339:::0;37537:41;12862:10;37570:7;37537:18;:41::i;:::-;37529:103;;;;-1:-1:-1;;;37529:103:0;;;;;;;:::i;:::-;37645:28;37655:4;37661:2;37665:7;37645:9;:28::i;51429:498::-;14131:6;;-1:-1:-1;;;;;14131:6:0;12862:10;14278:23;14270:68;;;;-1:-1:-1;;;14270:68:0;;;;;;;:::i;:::-;51504:21:::1;51544:42;51536:89;51620:4;51597:20;51504:21:::0;51615:2:::1;51597:20;:::i;:::-;:27;;;;:::i;:::-;51536:89;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;51644:42:0::1;51636:89;51720:4;51697:20;:14:::0;51715:2:::1;51697:20;:::i;:::-;:27;;;;:::i;:::-;51636:89;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;51744:42:0::1;51736:89;51820:4;51797:20;:14:::0;51814:3:::1;51797:20;:::i;:::-;:27;;;;:::i;:::-;51736:89;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;51836:83:0::1;::::0;51844:42:::1;::::0;51897:21:::1;51836:83:::0;::::1;;;::::0;::::1;::::0;;;51897:21;51844:42;51836:83;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;51468:459;51429:498::o:0;37752:185::-;37890:39;37907:4;37913:2;37917:7;37890:39;;;;;;;;;;;;:16;:39::i;51110:106::-;14131:6;;-1:-1:-1;;;;;14131:6:0;12862:10;14278:23;14270:68;;;;-1:-1:-1;;;14270:68:0;;;;;;;:::i;:::-;51185:23:::1;:13;51201:7:::0;;51185:23:::1;:::i;34727:239::-:0;34799:7;34835:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34835:16:0;34870:19;34862:73;;;;-1:-1:-1;;;34862:73:0;;15921:2:1;34862:73:0;;;15903:21:1;15960:2;15940:18;;;15933:30;15999:34;15979:18;;;15972:62;-1:-1:-1;;;16050:18:1;;;16043:39;16099:19;;34862:73:0;15719:405:1;51224:97:0;14131:6;;-1:-1:-1;;;;;14131:6:0;12862:10;14278:23;14270:68;;;;-1:-1:-1;;;14270:68:0;;;;;;;:::i;:::-;51293:7:::1;:20:::0;;-1:-1:-1;;;;;51293:20:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;51293:20:0;;::::1;::::0;;;::::1;::::0;;51224:97::o;34457:208::-;34529:7;-1:-1:-1;;;;;34557:19:0;;34549:74;;;;-1:-1:-1;;;34549:74:0;;15510:2:1;34549:74:0;;;15492:21:1;15549:2;15529:18;;;15522:30;15588:34;15568:18;;;15561:62;-1:-1:-1;;;15639:18:1;;;15632:40;15689:19;;34549:74:0;15308:406:1;34549:74:0;-1:-1:-1;;;;;;34641:16:0;;;;;:9;:16;;;;;;;34457:208::o;14709:103::-;14131:6;;-1:-1:-1;;;;;14131:6:0;12862:10;14278:23;14270:68;;;;-1:-1:-1;;;14270:68:0;;;;;;;:::i;:::-;14774:30:::1;14801:1;14774:18;:30::i;49628:722::-:0;48151:9;48164:10;48151:23;48143:66;;;;-1:-1:-1;;;48143:66:0;;;;;;;:::i;:::-;49750:15:::1;::::0;::::1;::::0;::::1;;;49742:39;;;;-1:-1:-1::0;;;49742:39:0::1;;;;;;;:::i;:::-;49800:38;49818:9;49800:38;;;;;;;;;;;;;-1:-1:-1::0;;;49800:38:0::1;;::::0;:17:::1;:38::i;:::-;49792:73;;;::::0;-1:-1:-1;;;49792:73:0;;10168:2:1;49792:73:0::1;::::0;::::1;10150:21:1::0;10207:2;10187:18;;;10180:30;-1:-1:-1;;;10226:18:1;;;10219:52;10288:18;;49792:73:0::1;9966:346:1::0;49792:73:0::1;49898:10;49884:25;::::0;;;:13:::1;:25;::::0;;;;;49929:1:::1;::::0;49884:41:::1;::::0;49912:13;;49884:41:::1;:::i;:::-;:46;;49876:73;;;;-1:-1:-1::0;;;49876:73:0::1;;;;;;;:::i;:::-;50001:8;;49984:13;49968;;:29;;;;:::i;:::-;:41;;49960:64;;;;-1:-1:-1::0;;;49960:64:0::1;;;;;;;:::i;:::-;50072:9;50055:13;50043:9;;:25;;;;:::i;:::-;:38;;50035:67;;;;-1:-1:-1::0;;;50035:67:0::1;;;;;;;:::i;:::-;50157:10;50143:25;::::0;;;:13:::1;:25;::::0;;;;;:41:::1;::::0;50171:13;;50143:41:::1;:::i;:::-;50129:10;50115:25;::::0;;;:13:::1;:25;::::0;;;;:69;50216:1:::1;50195:146;50228:13;50219:5;:22;50195:146;;50263:13;:15:::0;;;:13:::1;:15;::::0;::::1;:::i;:::-;;;;;;50293:36;50303:10;50315:13;;50293:9;:36::i;:::-;50243:7:::0;::::1;::::0;::::1;:::i;:::-;;;;50195:146;;35202:104:::0;35258:13;35291:7;35284:14;;;;;:::i;50895:96::-;14131:6;;-1:-1:-1;;;;;14131:6:0;12862:10;14278:23;14270:68;;;;-1:-1:-1;;;14270:68:0;;;;;;;:::i;:::-;50973:10:::1;::::0;;-1:-1:-1;;50959:24:0;::::1;50973:10;::::0;;::::1;50972:11;50959:24;::::0;;50895:96::o;36885:155::-;36980:52;12862:10;37013:8;37023;36980:18;:52::i;38008:328::-;38183:41;12862:10;38216:7;38183:18;:41::i;:::-;38175:103;;;;-1:-1:-1;;;38175:103:0;;;;;;;:::i;:::-;38289:39;38303:4;38309:2;38313:7;38322:5;38289:13;:39::i;:::-;38008:328;;;;:::o;50999:103::-;14131:6;;-1:-1:-1;;;;;14131:6:0;12862:10;14278:23;14270:68;;;;-1:-1:-1;;;14270:68:0;;;;;;;:::i;:::-;51079:15:::1;::::0;;-1:-1:-1;;51060:34:0;::::1;51079:15;::::0;;;::::1;;;51078:16;51060:34:::0;;::::1;;::::0;;50999:103::o;51939:244::-;39911:4;39935:16;;;:7;:16;;;;;;52012:13;;-1:-1:-1;;;;;39935:16:0;52038:60;;;;-1:-1:-1;;;52038:60:0;;17869:2:1;52038:60:0;;;17851:21:1;17908:2;17888:18;;;17881:30;17947:33;17927:18;;;17920:61;17998:18;;52038:60:0;17667:355:1;52038:60:0;52140:13;52155:18;:7;:16;:18::i;:::-;52123:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52109:66;;51939:244;;;:::o;50358:529::-;48151:9;48164:10;48151:23;48143:66;;;;-1:-1:-1;;;48143:66:0;;;;;;;:::i;:::-;50457:15:::1;::::0;::::1;::::0;::::1;;;50449:39;;;;-1:-1:-1::0;;;50449:39:0::1;;;;;;;:::i;:::-;50507:38;50525:9;50507:38;;;;;;;;;;;;;-1:-1:-1::0;;;50507:38:0::1;;::::0;:17:::1;:38::i;:::-;50499:73;;;::::0;-1:-1:-1;;;50499:73:0;;10168:2:1;50499:73:0::1;::::0;::::1;10150:21:1::0;10207:2;10187:18;;;10180:30;-1:-1:-1;;;10226:18:1;;;10219:52;10288:18;;50499:73:0::1;9966:346:1::0;50499:73:0::1;50606:10;50592:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;50591:26;50583:53;;;;-1:-1:-1::0;;;50583:53:0::1;;;;;;;:::i;:::-;50676:8;::::0;50655:13:::1;::::0;:17:::1;::::0;50671:1:::1;50655:17;:::i;:::-;:29;;50647:52;;;;-1:-1:-1::0;;;50647:52:0::1;;;;;;;:::i;:::-;50731:9;50718;;:22;;50710:51;;;;-1:-1:-1::0;;;50710:51:0::1;;;;;;;:::i;:::-;50788:10;50774:25;::::0;;;:13:::1;:25;::::0;;;;:32;;-1:-1:-1;;50774:32:0::1;50802:4;50774:32;::::0;;50817:13:::1;:15:::0;;;::::1;::::0;::::1;:::i;:::-;;;;;;50843:36;50853:10;50865:13;;50843:9;:36::i;:::-;50358:529:::0;:::o;14967:201::-;14131:6;;-1:-1:-1;;;;;14131:6:0;12862:10;14278:23;14270:68;;;;-1:-1:-1;;;14270:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15056:22:0;::::1;15048:73;;;::::0;-1:-1:-1;;;15048:73:0;;11641:2:1;15048:73:0::1;::::0;::::1;11623:21:1::0;11680:2;11660:18;;;11653:30;11719:34;11699:18;;;11692:62;-1:-1:-1;;;11770:18:1;;;11763:36;11816:19;;15048:73:0::1;11439:402:1::0;15048:73:0::1;15132:28;15151:8;15132:18;:28::i;48884:315::-:0;14131:6;;-1:-1:-1;;;;;14131:6:0;12862:10;14278:23;14270:68;;;;-1:-1:-1;;;14270:68:0;;;;;;;:::i;:::-;48999:8:::1;;48982:13;48966;;:29;;;;:::i;:::-;:41;;48958:64;;;;-1:-1:-1::0;;;48958:64:0::1;;;;;;;:::i;:::-;49038:13;49033:159;49065:13;49057:5;:21;49033:159;;;49104:13;:15:::0;;;:13:::1;:15;::::0;::::1;:::i;:::-;;;;;;49134:36;49144:10;49156:13;;49134:9;:36::i;:::-;49080:7:::0;::::1;::::0;::::1;:::i;:::-;;;;49033:159;;43992:174:::0;44067:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;44067:29:0;-1:-1:-1;;;;;44067:29:0;;;;;;;;:24;;44121:23;44067:24;44121:14;:23::i;:::-;-1:-1:-1;;;;;44112:46:0;;;;;;;;;;;43992:174;;:::o;40830:110::-;40906:26;40916:2;40920:7;40906:26;;;;;;;;;;;;:9;:26::i;40140:348::-;40233:4;39935:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39935:16:0;40250:73;;;;-1:-1:-1;;;40250:73:0;;14313:2:1;40250:73:0;;;14295:21:1;14352:2;14332:18;;;14325:30;14391:34;14371:18;;;14364:62;-1:-1:-1;;;14442:18:1;;;14435:42;14494:19;;40250:73:0;14111:408:1;40250:73:0;40334:13;40350:23;40365:7;40350:14;:23::i;:::-;40334:39;;40403:5;-1:-1:-1;;;;;40392:16:0;:7;-1:-1:-1;;;;;40392:16:0;;:51;;;;40436:7;-1:-1:-1;;;;;40412:31:0;:20;40424:7;40412:11;:20::i;:::-;-1:-1:-1;;;;;40412:31:0;;40392:51;:87;;;-1:-1:-1;;;;;;37232:25:0;;;37208:4;37232:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;40447:32;40384:96;40140:348;-1:-1:-1;;;;40140:348:0:o;43249:625::-;43408:4;-1:-1:-1;;;;;43381:31:0;:23;43396:7;43381:14;:23::i;:::-;-1:-1:-1;;;;;43381:31:0;;43373:81;;;;-1:-1:-1;;;43373:81:0;;12048:2:1;43373:81:0;;;12030:21:1;12087:2;12067:18;;;12060:30;12126:34;12106:18;;;12099:62;-1:-1:-1;;;12177:18:1;;;12170:35;12222:19;;43373:81:0;11846:401:1;43373:81:0;-1:-1:-1;;;;;43473:16:0;;43465:65;;;;-1:-1:-1;;;43465:65:0;;13151:2:1;43465:65:0;;;13133:21:1;13190:2;13170:18;;;13163:30;13229:34;13209:18;;;13202:62;-1:-1:-1;;;13280:18:1;;;13273:34;13324:19;;43465:65:0;12949:400:1;43465:65:0;43647:29;43664:1;43668:7;43647:8;:29::i;:::-;-1:-1:-1;;;;;43689:15:0;;;;;;:9;:15;;;;;:20;;43708:1;;43689:15;:20;;43708:1;;43689:20;:::i;:::-;;;;-1:-1:-1;;;;;;;43720:13:0;;;;;;:9;:13;;;;;:18;;43737:1;;43720:13;:18;;43737:1;;43720:18;:::i;:::-;;;;-1:-1:-1;;43749:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;43749:21:0;-1:-1:-1;;;;;43749:21:0;;;;;;;;;43788:27;;43749:16;;43788:27;;;;;;;36185:341;36115:411;;:::o;15328:191::-;15421:6;;;-1:-1:-1;;;;;15438:17:0;;;-1:-1:-1;;;;;;15438:17:0;;;;;;;15471:40;;15421:6;;;15438:17;15421:6;;15471:40;;15402:16;;15471:40;15391:128;15328:191;:::o;48237:329::-;48342:4;48359:12;48464:10;48476:8;;;;;;;;;;;;;-1:-1:-1;;;48476:8:0;;;48486:16;48447:56;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;48447:56:0;;;;;;;;;;48437:67;;48447:56;48437:67;;;;7950:66:1;48384:121:0;;;7938:79:1;;;;8033:12;;;8026:28;8070:12;;48384:121:0;;;-1:-1:-1;;48384:121:0;;;;;;;;;48374:132;;48384:121;48374:132;;;;;-1:-1:-1;48535:23:0;48374:132;48548:9;48535:12;:23::i;:::-;48524:7;;;;;-1:-1:-1;;;;;48524:7:0;;;:34;;;;-1:-1:-1;;48237:329:0;;;;:::o;44308:315::-;44463:8;-1:-1:-1;;;;;44454:17:0;:5;-1:-1:-1;;;;;44454:17:0;;;44446:55;;;;-1:-1:-1;;;44446:55:0;;13556:2:1;44446:55:0;;;13538:21:1;13595:2;13575:18;;;13568:30;13634:27;13614:18;;;13607:55;13679:18;;44446:55:0;13354:349:1;44446:55:0;-1:-1:-1;;;;;44512:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;44512:46:0;;;;;;;;;;44574:41;;8934::1;;;44574::0;;8907:18:1;44574:41:0;;;;;;;44308:315;;;:::o;39218:::-;39375:28;39385:4;39391:2;39395:7;39375:9;:28::i;:::-;39422:48;39445:4;39451:2;39455:7;39464:5;39422:22;:48::i;:::-;39414:111;;;;-1:-1:-1;;;39414:111:0;;;;;;;:::i;810:723::-;866:13;1087:10;1083:53;;-1:-1:-1;;1114:10:0;;;;;;;;;;;;-1:-1:-1;;;1114:10:0;;;;;810:723::o;1083:53::-;1161:5;1146:12;1202:78;1209:9;;1202:78;;1235:8;;;;:::i;:::-;;-1:-1:-1;1258:10:0;;-1:-1:-1;1266:2:0;1258:10;;:::i;:::-;;;1202:78;;;1290:19;1322:6;1312:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1312:17:0;;1290:39;;1340:154;1347:10;;1340:154;;1374:11;1384:1;1374:11;;:::i;:::-;;-1:-1:-1;1443:10:0;1451:2;1443:5;:10;:::i;:::-;1430:24;;:2;:24;:::i;:::-;1417:39;;1400:6;1407;1400:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1400:56:0;;;;;;;;-1:-1:-1;1471:11:0;1480:2;1471:11;;:::i;:::-;;;1340:154;;41167:321;41297:18;41303:2;41307:7;41297:5;:18::i;:::-;41348:54;41379:1;41383:2;41387:7;41396:5;41348:22;:54::i;:::-;41326:154;;;;-1:-1:-1;;;41326:154:0;;;;;;;:::i;6986:231::-;7064:7;7085:17;7104:18;7126:27;7137:4;7143:9;7126:10;:27::i;:::-;7084:69;;;;7164:18;7176:5;7164:11;:18::i;:::-;-1:-1:-1;7200:9:0;6986:231;-1:-1:-1;;;6986:231:0:o;45188:799::-;45343:4;-1:-1:-1;;;;;45364:13:0;;17054:19;:23;45360:620;;45400:72;;-1:-1:-1;;;45400:72:0;;-1:-1:-1;;;;;45400:36:0;;;;;:72;;12862:10;;45451:4;;45457:7;;45466:5;;45400:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45400:72:0;;;;;;;;-1:-1:-1;;45400:72:0;;;;;;;;;;;;:::i;:::-;;;45396:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45642:13:0;;45638:272;;45685:60;;-1:-1:-1;;;45685:60:0;;;;;;;:::i;45638:272::-;45860:6;45854:13;45845:6;45841:2;45837:15;45830:38;45396:529;-1:-1:-1;;;;;;45523:51:0;-1:-1:-1;;;45523:51:0;;-1:-1:-1;45516:58:0;;45360:620;-1:-1:-1;45964:4:0;45188:799;;;;;;:::o;41824:439::-;-1:-1:-1;;;;;41904:16:0;;41896:61;;;;-1:-1:-1;;;41896:61:0;;16734:2:1;41896:61:0;;;16716:21:1;;;16753:18;;;16746:30;16812:34;16792:18;;;16785:62;16864:18;;41896:61:0;16532:356:1;41896:61:0;39911:4;39935:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39935:16:0;:30;41968:58;;;;-1:-1:-1;;;41968:58:0;;12454:2:1;41968:58:0;;;12436:21:1;12493:2;12473:18;;;12466:30;12532;12512:18;;;12505:58;12580:18;;41968:58:0;12252:352:1;41968:58:0;-1:-1:-1;;;;;42097:13:0;;;;;;:9;:13;;;;;:18;;42114:1;;42097:13;:18;;42114:1;;42097:18;:::i;:::-;;;;-1:-1:-1;;42126:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;42126:21:0;-1:-1:-1;;;;;42126:21:0;;;;;;;;42165:33;;42126:16;;;42165:33;;42126:16;;42165:33;51836:83:::1;51468:459;51429:498::o:0;4876:1308::-;4957:7;4966:12;5191:9;:16;5211:2;5191:22;5187:990;;;5487:4;5472:20;;5466:27;5537:4;5522:20;;5516:27;5595:4;5580:20;;5574:27;5230:9;5566:36;5638:25;5649:4;5566:36;5466:27;5516;5638:10;:25::i;:::-;5631:32;;;;;;;;;5187:990;5685:9;:16;5705:2;5685:22;5681:496;;;5960:4;5945:20;;5939:27;6011:4;5996:20;;5990:27;6053:23;6064:4;5939:27;5990;6053:10;:23::i;:::-;6046:30;;;;;;;;5681:496;-1:-1:-1;6125:1:0;;-1:-1:-1;6129:35:0;5681:496;4876:1308;;;;;:::o;3147:643::-;3225:20;3216:5;:29;;;;;;;;:::i;:::-;;3212:571;;;3147:643;:::o;3212:571::-;3323:29;3314:5;:38;;;;;;;;:::i;:::-;;3310:473;;;3369:34;;-1:-1:-1;;;3369:34:0;;9815:2:1;3369:34:0;;;9797:21:1;9854:2;9834:18;;;9827:30;9893:26;9873:18;;;9866:54;9937:18;;3369:34:0;9613:348:1;3310:473:0;3434:35;3425:5;:44;;;;;;;;:::i;:::-;;3421:362;;;3486:41;;-1:-1:-1;;;3486:41:0;;10519:2:1;3486:41:0;;;10501:21:1;10558:2;10538:18;;;10531:30;10597:33;10577:18;;;10570:61;10648:18;;3486:41:0;10317:355:1;3421:362:0;3558:30;3549:5;:39;;;;;;;;:::i;:::-;;3545:238;;;3605:44;;-1:-1:-1;;;3605:44:0;;13910:2:1;3605:44:0;;;13892:21:1;13949:2;13929:18;;;13922:30;13988:34;13968:18;;;13961:62;-1:-1:-1;;;14039:18:1;;;14032:32;14081:19;;3605:44:0;13708:398:1;3545:238:0;3680:30;3671:5;:39;;;;;;;;:::i;:::-;;3667:116;;;3727:44;;-1:-1:-1;;;3727:44:0;;16331:2:1;3727:44:0;;;16313:21:1;16370:2;16350:18;;;16343:30;16409:34;16389:18;;;16382:62;-1:-1:-1;;;16460:18:1;;;16453:32;16502:19;;3727:44:0;16129:398:1;8438:1632:0;8569:7;;9503:66;9490:79;;9486:163;;;-1:-1:-1;9602:1:0;;-1:-1:-1;9606:30:0;9586:51;;9486:163;9663:1;:7;;9668:2;9663:7;;:18;;;;;9674:1;:7;;9679:2;9674:7;;9663:18;9659:102;;;-1:-1:-1;9714:1:0;;-1:-1:-1;9718:30:0;9698:51;;9659:102;9875:24;;;9858:14;9875:24;;;;;;;;;9213:25:1;;;9286:4;9274:17;;9254:18;;;9247:45;;;;9308:18;;;9301:34;;;9351:18;;;9344:34;;;9875:24:0;;9185:19:1;;9875:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9875:24:0;;-1:-1:-1;;9875:24:0;;;-1:-1:-1;;;;;;;9914:20:0;;9910:103;;9967:1;9971:29;9951:50;;;;;;;9910:103;10033:6;-1:-1:-1;10041:20:0;;-1:-1:-1;8438:1632:0;;;;;;;;:::o;7480:344::-;7594:7;;-1:-1:-1;;;;;7640:80:0;;7594:7;7747:25;7763:3;7748:18;;;7770:2;7747:25;:::i;:::-;7731:42;;7791:25;7802:4;7808:1;7811;7814;7791:10;:25::i;:::-;7784:32;;;;;;7480:344;;;;;;:::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:718::-;234:5;287:3;280:4;272:6;268:17;264:27;254:55;;305:1;302;295:12;254:55;341:6;328:20;367:18;404:2;400;397:10;394:36;;;410:18;;:::i;:::-;485:2;479:9;453:2;539:13;;-1:-1:-1;;535:22:1;;;559:2;531:31;527:40;515:53;;;583:18;;;603:22;;;580:46;577:72;;;629:18;;:::i;:::-;669:10;665:2;658:22;704:2;696:6;689:18;750:3;743:4;738:2;730:6;726:15;722:26;719:35;716:55;;;767:1;764;757:12;716:55;831:2;824:4;816:6;812:17;805:4;797:6;793:17;780:54;878:1;871:4;866:2;858:6;854:15;850:26;843:37;898:6;889:15;;;;;;192:718;;;;:::o;915:186::-;974:6;1027:2;1015:9;1006:7;1002:23;998:32;995:52;;;1043:1;1040;1033:12;995:52;1066:29;1085:9;1066:29;:::i;:::-;1056:39;915:186;-1:-1:-1;;;915:186:1:o;1106:260::-;1174:6;1182;1235:2;1223:9;1214:7;1210:23;1206:32;1203:52;;;1251:1;1248;1241:12;1203:52;1274:29;1293:9;1274:29;:::i;:::-;1264:39;;1322:38;1356:2;1345:9;1341:18;1322:38;:::i;:::-;1312:48;;1106:260;;;;;:::o;1371:328::-;1448:6;1456;1464;1517:2;1505:9;1496:7;1492:23;1488:32;1485:52;;;1533:1;1530;1523:12;1485:52;1556:29;1575:9;1556:29;:::i;:::-;1546:39;;1604:38;1638:2;1627:9;1623:18;1604:38;:::i;:::-;1594:48;;1689:2;1678:9;1674:18;1661:32;1651:42;;1371:328;;;;;:::o;1704:537::-;1799:6;1807;1815;1823;1876:3;1864:9;1855:7;1851:23;1847:33;1844:53;;;1893:1;1890;1883:12;1844:53;1916:29;1935:9;1916:29;:::i;:::-;1906:39;;1964:38;1998:2;1987:9;1983:18;1964:38;:::i;:::-;1954:48;;2049:2;2038:9;2034:18;2021:32;2011:42;;2104:2;2093:9;2089:18;2076:32;2131:18;2123:6;2120:30;2117:50;;;2163:1;2160;2153:12;2117:50;2186:49;2227:7;2218:6;2207:9;2203:22;2186:49;:::i;:::-;2176:59;;;1704:537;;;;;;;:::o;2246:347::-;2311:6;2319;2372:2;2360:9;2351:7;2347:23;2343:32;2340:52;;;2388:1;2385;2378:12;2340:52;2411:29;2430:9;2411:29;:::i;:::-;2401:39;;2490:2;2479:9;2475:18;2462:32;2537:5;2530:13;2523:21;2516:5;2513:32;2503:60;;2559:1;2556;2549:12;2503:60;2582:5;2572:15;;;2246:347;;;;;:::o;2598:254::-;2666:6;2674;2727:2;2715:9;2706:7;2702:23;2698:32;2695:52;;;2743:1;2740;2733:12;2695:52;2766:29;2785:9;2766:29;:::i;:::-;2756:39;2842:2;2827:18;;;;2814:32;;-1:-1:-1;;;2598:254:1:o;2857:615::-;2943:6;2951;3004:2;2992:9;2983:7;2979:23;2975:32;2972:52;;;3020:1;3017;3010:12;2972:52;3060:9;3047:23;3089:18;3130:2;3122:6;3119:14;3116:34;;;3146:1;3143;3136:12;3116:34;3184:6;3173:9;3169:22;3159:32;;3229:7;3222:4;3218:2;3214:13;3210:27;3200:55;;3251:1;3248;3241:12;3200:55;3291:2;3278:16;3317:2;3309:6;3306:14;3303:34;;;3333:1;3330;3323:12;3303:34;3386:7;3381:2;3371:6;3368:1;3364:14;3360:2;3356:23;3352:32;3349:45;3346:65;;;3407:1;3404;3397:12;3346:65;3438:2;3430:11;;;;;3460:6;;-1:-1:-1;2857:615:1;;-1:-1:-1;;;;2857:615:1:o;3477:245::-;3535:6;3588:2;3576:9;3567:7;3563:23;3559:32;3556:52;;;3604:1;3601;3594:12;3556:52;3643:9;3630:23;3662:30;3686:5;3662:30;:::i;3727:249::-;3796:6;3849:2;3837:9;3828:7;3824:23;3820:32;3817:52;;;3865:1;3862;3855:12;3817:52;3897:9;3891:16;3916:30;3940:5;3916:30;:::i;3981:320::-;4049:6;4102:2;4090:9;4081:7;4077:23;4073:32;4070:52;;;4118:1;4115;4108:12;4070:52;4158:9;4145:23;4191:18;4183:6;4180:30;4177:50;;;4223:1;4220;4213:12;4177:50;4246:49;4287:7;4278:6;4267:9;4263:22;4246:49;:::i;4306:592::-;4377:6;4385;4438:2;4426:9;4417:7;4413:23;4409:32;4406:52;;;4454:1;4451;4444:12;4406:52;4494:9;4481:23;4523:18;4564:2;4556:6;4553:14;4550:34;;;4580:1;4577;4570:12;4550:34;4618:6;4607:9;4603:22;4593:32;;4663:7;4656:4;4652:2;4648:13;4644:27;4634:55;;4685:1;4682;4675:12;4634:55;4725:2;4712:16;4751:2;4743:6;4740:14;4737:34;;;4767:1;4764;4757:12;4737:34;4812:7;4807:2;4798:6;4794:2;4790:15;4786:24;4783:37;4780:57;;;4833:1;4830;4823:12;4903:180;4962:6;5015:2;5003:9;4994:7;4990:23;4986:32;4983:52;;;5031:1;5028;5021:12;4983:52;-1:-1:-1;5054:23:1;;4903:180;-1:-1:-1;4903:180:1:o;5088:388::-;5165:6;5173;5226:2;5214:9;5205:7;5201:23;5197:32;5194:52;;;5242:1;5239;5232:12;5194:52;5278:9;5265:23;5255:33;;5339:2;5328:9;5324:18;5311:32;5366:18;5358:6;5355:30;5352:50;;;5398:1;5395;5388:12;5352:50;5421:49;5462:7;5453:6;5442:9;5438:22;5421:49;:::i;:::-;5411:59;;;5088:388;;;;;:::o;5481:257::-;5522:3;5560:5;5554:12;5587:6;5582:3;5575:19;5603:63;5659:6;5652:4;5647:3;5643:14;5636:4;5629:5;5625:16;5603:63;:::i;:::-;5720:2;5699:15;-1:-1:-1;;5695:29:1;5686:39;;;;5727:4;5682:50;;5481:257;-1:-1:-1;;5481:257:1:o;5743:185::-;5785:3;5823:5;5817:12;5838:52;5883:6;5878:3;5871:4;5864:5;5860:16;5838:52;:::i;:::-;5906:16;;;;;5743:185;-1:-1:-1;;5743:185:1:o;5933:591::-;6195:26;6191:31;6182:6;6178:2;6174:15;6170:53;6165:3;6158:66;6140:3;6253:6;6247:13;6269:62;6324:6;6319:2;6314:3;6310:12;6303:4;6295:6;6291:17;6269:62;:::i;:::-;6391:13;;6350:16;;;;6413:63;6391:13;6462:2;6454:11;;6447:4;6435:17;;6413:63;:::i;:::-;6496:17;6515:2;6492:26;;5933:591;-1:-1:-1;;;;;5933:591:1:o;6529:1174::-;6705:3;6734:1;6767:6;6761:13;6797:3;6819:1;6847:9;6843:2;6839:18;6829:28;;6907:2;6896:9;6892:18;6929;6919:61;;6973:4;6965:6;6961:17;6951:27;;6919:61;6999:2;7047;7039:6;7036:14;7016:18;7013:38;7010:165;;;-1:-1:-1;;;7074:33:1;;7130:4;7127:1;7120:15;7160:4;7081:3;7148:17;7010:165;7191:18;7218:104;;;;7336:1;7331:320;;;;7184:467;;7218:104;-1:-1:-1;;7251:24:1;;7239:37;;7296:16;;;;-1:-1:-1;7218:104:1;;7331:320;19786:1;19779:14;;;19823:4;19810:18;;7426:1;7440:165;7454:6;7451:1;7448:13;7440:165;;;7532:14;;7519:11;;;7512:35;7575:16;;;;7469:10;;7440:165;;;7444:3;;7634:6;7629:3;7625:16;7618:23;;7184:467;;;;;;;7667:30;7693:3;7685:6;7667:30;:::i;:::-;7660:37;6529:1174;-1:-1:-1;;;;;6529:1174:1:o;8301:488::-;-1:-1:-1;;;;;8570:15:1;;;8552:34;;8622:15;;8617:2;8602:18;;8595:43;8669:2;8654:18;;8647:34;;;8717:3;8712:2;8697:18;;8690:31;;;8495:4;;8738:45;;8763:19;;8755:6;8738:45;:::i;:::-;8730:53;8301:488;-1:-1:-1;;;;;;8301:488:1:o;9389:219::-;9538:2;9527:9;9520:21;9501:4;9558:44;9598:2;9587:9;9583:18;9575:6;9558:44;:::i;10677:338::-;10879:2;10861:21;;;10918:2;10898:18;;;10891:30;-1:-1:-1;;;10952:2:1;10937:18;;10930:44;11006:2;10991:18;;10677:338::o;11020:414::-;11222:2;11204:21;;;11261:2;11241:18;;;11234:30;11300:34;11295:2;11280:18;;11273:62;-1:-1:-1;;;11366:2:1;11351:18;;11344:48;11424:3;11409:19;;11020:414::o;12609:335::-;12811:2;12793:21;;;12850:2;12830:18;;;12823:30;-1:-1:-1;;;12884:2:1;12869:18;;12862:41;12935:2;12920:18;;12609:335::o;14524:354::-;14726:2;14708:21;;;14765:2;14745:18;;;14738:30;14804:32;14799:2;14784:18;;14777:60;14869:2;14854:18;;14524:354::o;17306:356::-;17508:2;17490:21;;;17527:18;;;17520:30;17586:34;17581:2;17566:18;;17559:62;17653:2;17638:18;;17306:356::o;18429:334::-;18631:2;18613:21;;;18670:2;18650:18;;;18643:30;-1:-1:-1;;;18704:2:1;18689:18;;18682:40;18754:2;18739:18;;18429:334::o;18768:413::-;18970:2;18952:21;;;19009:2;18989:18;;;18982:30;19048:34;19043:2;19028:18;;19021:62;-1:-1:-1;;;19114:2:1;19099:18;;19092:47;19171:3;19156:19;;18768:413::o;19186:340::-;19388:2;19370:21;;;19427:2;19407:18;;;19400:30;-1:-1:-1;;;19461:2:1;19446:18;;19439:46;19517:2;19502:18;;19186:340::o;19839:128::-;19879:3;19910:1;19906:6;19903:1;19900:13;19897:39;;;19916:18;;:::i;:::-;-1:-1:-1;19952:9:1;;19839:128::o;19972:120::-;20012:1;20038;20028:35;;20043:18;;:::i;:::-;-1:-1:-1;20077:9:1;;19972:120::o;20097:168::-;20137:7;20203:1;20199;20195:6;20191:14;20188:1;20185:21;20180:1;20173:9;20166:17;20162:45;20159:71;;;20210:18;;:::i;:::-;-1:-1:-1;20250:9:1;;20097:168::o;20270:125::-;20310:4;20338:1;20335;20332:8;20329:34;;;20343:18;;:::i;:::-;-1:-1:-1;20380:9:1;;20270:125::o;20400:258::-;20472:1;20482:113;20496:6;20493:1;20490:13;20482:113;;;20572:11;;;20566:18;20553:11;;;20546:39;20518:2;20511:10;20482:113;;;20613:6;20610:1;20607:13;20604:48;;;-1:-1:-1;;20648:1:1;20630:16;;20623:27;20400:258::o;20663:380::-;20742:1;20738:12;;;;20785;;;20806:61;;20860:4;20852:6;20848:17;20838:27;;20806:61;20913:2;20905:6;20902:14;20882:18;20879:38;20876:161;;;20959:10;20954:3;20950:20;20947:1;20940:31;20994:4;20991:1;20984:15;21022:4;21019:1;21012:15;20876:161;;20663:380;;;:::o;21048:135::-;21087:3;-1:-1:-1;;21108:17:1;;21105:43;;;21128:18;;:::i;:::-;-1:-1:-1;21175:1:1;21164:13;;21048:135::o;21188:112::-;21220:1;21246;21236:35;;21251:18;;:::i;:::-;-1:-1:-1;21285:9:1;;21188:112::o;21305:127::-;21366:10;21361:3;21357:20;21354:1;21347:31;21397:4;21394:1;21387:15;21421:4;21418:1;21411:15;21437:127;21498:10;21493:3;21489:20;21486:1;21479:31;21529:4;21526:1;21519:15;21553:4;21550:1;21543:15;21569:127;21630:10;21625:3;21621:20;21618:1;21611:31;21661:4;21658:1;21651:15;21685:4;21682:1;21675:15;21701:127;21762:10;21757:3;21753:20;21750:1;21743:31;21793:4;21790:1;21783:15;21817:4;21814:1;21807:15;21833:127;21894:10;21889:3;21885:20;21882:1;21875:31;21925:4;21922:1;21915:15;21949:4;21946:1;21939:15;21965:131;-1:-1:-1;;;;;;22039:32:1;;22029:43;;22019:71;;22086:1;22083;22076:12

Swarm Source

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