ETH Price: $2,457.23 (-4.66%)

Token

Project Origin NFT (PONFT)
 

Overview

Max Total Supply

357 PONFT

Holders

147

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
noclue.eth
Balance
5 PONFT
0xB361b55b2bC39099853595bfaB7a87c5c3e350Be
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ProjectOriginNFT

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 2021-11-15
*/

/**
 *Submitted for verification at Etherscan.io on 2021-11-11
*/

/**
 *Submitted for verification at Etherscan.io on 2021-10-29
*/

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

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);
}

library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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

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);
}

interface IERC721Metadata is IERC721 {

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

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

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

/*
 * @dev 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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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}. 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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract Whitelist is Ownable {
  mapping(address => bool) public whitelist;
  
  event WhitelistedAddressAdded(address addr);
  event WhitelistedAddressRemoved(address addr);

  function addAddressToWhitelist(address addr) onlyOwner public returns(bool success) {
    if (!whitelist[addr]) {
      whitelist[addr] = true;
      emit WhitelistedAddressAdded(addr);
      success = true; 
    }
  }
  
  function addAddressesToWhitelist(address[] calldata addrs) onlyOwner public returns(bool success) {
    for (uint256 i = 0; i < addrs.length; i++) {
      if (addAddressToWhitelist(addrs[i])) {
        success = true;
      }
    }
  }

  function removeAddressFromWhitelist(address addr) onlyOwner public returns(bool success) {
    if (whitelist[addr]) {
      whitelist[addr] = false;
      emit WhitelistedAddressRemoved(addr);
      success = true;
    }
  }

  function removeAddressesFromWhitelist(address[] calldata addrs) onlyOwner public returns(bool success) {
    for (uint256 i = 0; i < addrs.length; i++) {
      if (removeAddressFromWhitelist(addrs[i])) {
        success = true;
      }
    }
  }

}

contract ProjectOriginNFT is ERC721Enumerable, Whitelist {
  using Strings for uint256;
  using SafeMath for uint256;
  string private baseURI;
  bool public isSaleStarted=false;
  string public notRevealedUri;
  uint256 public cost = 0.08 ether;
  uint256 public maxSupply = 10000;
  uint256 public nftPerAddressLimitOnPreSale = 3;
  uint256 public nftPerTxLimitOnGeneralSale = 15;
  bool public paused = false;
  bool public revealed = false;
  uint256 public generalSaleTime;
  mapping(address => uint256) public addressMintedBalance;


  constructor(
    string memory _name,
    string memory _symbol,
    string memory _initBaseURI,
    string memory _initNotRevealedUri
  ) ERC721(_name, _symbol) payable{
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);
  }

  // internal
  function _baseURI() internal view virtual override returns (string memory) {
    return baseURI;
  }


function mintAsOwner(uint _mintAmount) public onlyOwner{
    require(!paused, "the contract is paused");
    uint256 supply = totalSupply();
    require(supply + _mintAmount <= maxSupply, "Exceeds maximum Originators supply");
    if(isSaleStarted) {
        require(_mintAmount <= nftPerTxLimitOnGeneralSale, "Max NFTs per transaction exceeded");
    }
    for (uint256 i = 1; i <= _mintAmount; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function mint(uint _mintAmount) public payable {
        require(isSaleStarted,'sale is not started');
        require(!paused, "the contract is paused");
        uint256 supply = totalSupply();
        require(supply + _mintAmount <= maxSupply, "Exceeds maximum Originators supply");
        require(msg.value >= cost * _mintAmount, "Insufficient funds");

        if(block.timestamp < generalSaleTime) {
            require(whitelist[msg.sender], "User is not whitelisted");
            uint256 ownerMintedCount = addressMintedBalance[msg.sender];
            require(ownerMintedCount + _mintAmount <= nftPerAddressLimitOnPreSale, "Max NFTs per address exceeded for pre-sale.");
            for (uint256 i = 1; i <= _mintAmount; i++) {
                addressMintedBalance[msg.sender]++;
                _safeMint(msg.sender, supply + i);
            }
        }
        else{
            require(_mintAmount <= nftPerTxLimitOnGeneralSale, "Max NFTs per transaction exceeded");
            for (uint256 i = 1; i <= _mintAmount; i++) {
                _safeMint(msg.sender, supply + i);
            }
        }
    }

  function walletOfOwner(address _owner) public view returns (uint256[] memory){
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokenIds;
  }

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory){
      
    require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
    
    if(revealed == false) {
        return notRevealedUri;
    }

    string memory currentBaseURI = _baseURI();
    return string(abi.encodePacked(currentBaseURI, tokenId.toString()));
  }

  function reveal() public onlyOwner {
      revealed = true;
  }
  
  function startPresale() public onlyOwner {
      isSaleStarted=true;
      generalSaleTime = block.timestamp + 24 hours;
  }
  
  function stopPresale() public onlyOwner {
      isSaleStarted=false;
      generalSaleTime = 0;
  }
  
  function setGeneralSaleNftcount(uint256 _limit) public onlyOwner {
     nftPerTxLimitOnGeneralSale = _limit;
  }
  
  function setPreSaleNftcount(uint256 _limit) public onlyOwner {
    nftPerAddressLimitOnPreSale = _limit;
  }
  
  function setCost(uint256 _newCost) public onlyOwner {
    cost = _newCost;
  }


  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    baseURI = _newBaseURI;
  }

  function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
    notRevealedUri = _notRevealedURI;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }
  
  function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"payable","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"WhitelistedAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"WhitelistedAddressRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAddressToWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"addAddressesToWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generalSaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintAsOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimitOnPreSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerTxLimitOnGeneralSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAddressFromWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"removeAddressesFromWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setGeneralSaleNftcount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setPreSaleNftcount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040819052600d805460ff1916905567011c37937e080000600f90815561271060105560036011556012556013805461ffff19169055620030493881900390819083398101604081905262000056916200032c565b8351849084906200006f906000906020850190620001cf565b50805162000085906001906020840190620001cf565b50505060006200009a6200010860201b60201c565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000f3826200010c565b620000fe8162000174565b5050505062000438565b3390565b600a546001600160a01b031633146200015b5760405162461bcd60e51b815260206004820181905260248201526000805160206200302983398151915260448201526064015b60405180910390fd5b80516200017090600c906020840190620001cf565b5050565b600a546001600160a01b03163314620001bf5760405162461bcd60e51b8152602060048201819052602482015260008051602062003029833981519152604482015260640162000152565b80516200017090600e9060208401905b828054620001dd90620003e5565b90600052602060002090601f0160209004810192826200020157600085556200024c565b82601f106200021c57805160ff19168380011785556200024c565b828001600101855582156200024c579182015b828111156200024c5782518255916020019190600101906200022f565b506200025a9291506200025e565b5090565b5b808211156200025a57600081556001016200025f565b600082601f8301126200028757600080fd5b81516001600160401b0380821115620002a457620002a462000422565b604051601f8301601f19908116603f01168101908282118183101715620002cf57620002cf62000422565b81604052838152602092508683858801011115620002ec57600080fd5b600091505b83821015620003105785820183015181830184015290820190620002f1565b83821115620003225760008385830101525b9695505050505050565b600080600080608085870312156200034357600080fd5b84516001600160401b03808211156200035b57600080fd5b620003698883890162000275565b955060208701519150808211156200038057600080fd5b6200038e8883890162000275565b94506040870151915080821115620003a557600080fd5b620003b38883890162000275565b93506060870151915080821115620003ca57600080fd5b50620003d98782880162000275565b91505092959194509250565b600181811c90821680620003fa57607f821691505b602082108114156200041c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612be180620004486000396000f3fe6080604052600436106102885760003560e01c80634f6ccce71161015a578063a0712d68116100c1578063d5abeb011161007a578063d5abeb011461077a578063e2ec6ec314610790578063e985e9c5146107b0578063f2c4ce1e146107f9578063f2fde38b14610819578063f450fb891461083957600080fd5b8063a0712d68146106d2578063a22cb465146106e5578063a475b5dd14610705578063b28a2c571461071a578063b88d4fde1461073a578063c87b56dd1461075a57600080fd5b8063715018a611610113578063715018a614610624578063762b9ef7146106395780637b9417c81461064f5780638da5cb5b1461066f57806395d89b411461068d5780639b19251a146106a257600080fd5b80634f6ccce71461056b578063518302271461058b57806355f804b3146105aa5780635c975abb146105ca5780636352211e146105e457806370a082311461060457600080fd5b806323b872dd116101fe5780633b80b7d3116101b75780633b80b7d3146104b95780633c8f7594146104d35780633ccfd60b146104e957806342842e0e146104fe578063438b63001461051e57806344a0d68a1461054b57600080fd5b806323b872dd1461040357806324953eaa14610423578063286dd3f51461044357806329efc9dd146104635780632f745c59146104795780633604f93f1461049957600080fd5b8063081c8c4411610250578063081c8c4414610353578063095ea7b31461036857806313faede61461038857806318160ddd146103ac57806318cae269146103c15780631ad2ad1a146103ee57600080fd5b806301ffc9a71461028d57806302329a29146102c257806304c98b2b146102e457806306fdde03146102f9578063081812fc1461031b575b600080fd5b34801561029957600080fd5b506102ad6102a8366004612746565b610859565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd36600461272b565b610884565b005b3480156102f057600080fd5b506102e26108ca565b34801561030557600080fd5b5061030e610913565b6040516102b991906128be565b34801561032757600080fd5b5061033b6103363660046127c9565b6109a5565b6040516001600160a01b0390911681526020016102b9565b34801561035f57600080fd5b5061030e610a3a565b34801561037457600080fd5b506102e261038336600461268c565b610ac8565b34801561039457600080fd5b5061039e600f5481565b6040519081526020016102b9565b3480156103b857600080fd5b5060085461039e565b3480156103cd57600080fd5b5061039e6103dc366004612555565b60156020526000908152604090205481565b3480156103fa57600080fd5b506102e2610bde565b34801561040f57600080fd5b506102e261041e3660046125aa565b610c19565b34801561042f57600080fd5b506102ad61043e3660046126b6565b610c4a565b34801561044f57600080fd5b506102ad61045e366004612555565b610ccf565b34801561046f57600080fd5b5061039e60145481565b34801561048557600080fd5b5061039e61049436600461268c565b610d7b565b3480156104a557600080fd5b506102e26104b43660046127c9565b610e11565b3480156104c557600080fd5b50600d546102ad9060ff1681565b3480156104df57600080fd5b5061039e60125481565b3480156104f557600080fd5b506102e2610e40565b34801561050a57600080fd5b506102e26105193660046125aa565b610e9d565b34801561052a57600080fd5b5061053e610539366004612555565b610eb8565b6040516102b9919061287a565b34801561055757600080fd5b506102e26105663660046127c9565b610f5a565b34801561057757600080fd5b5061039e6105863660046127c9565b610f89565b34801561059757600080fd5b506013546102ad90610100900460ff1681565b3480156105b657600080fd5b506102e26105c5366004612780565b61101c565b3480156105d657600080fd5b506013546102ad9060ff1681565b3480156105f057600080fd5b5061033b6105ff3660046127c9565b611059565b34801561061057600080fd5b5061039e61061f366004612555565b6110d0565b34801561063057600080fd5b506102e2611157565b34801561064557600080fd5b5061039e60115481565b34801561065b57600080fd5b506102ad61066a366004612555565b6111cb565b34801561067b57600080fd5b50600a546001600160a01b031661033b565b34801561069957600080fd5b5061030e61126c565b3480156106ae57600080fd5b506102ad6106bd366004612555565b600b6020526000908152604090205460ff1681565b6102e26106e03660046127c9565b61127b565b3480156106f157600080fd5b506102e2610700366004612662565b611524565b34801561071157600080fd5b506102e26115e9565b34801561072657600080fd5b506102e26107353660046127c9565b611624565b34801561074657600080fd5b506102e26107553660046125e6565b61172a565b34801561076657600080fd5b5061030e6107753660046127c9565b61175c565b34801561078657600080fd5b5061039e60105481565b34801561079c57600080fd5b506102ad6107ab3660046126b6565b6118ba565b3480156107bc57600080fd5b506102ad6107cb366004612577565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561080557600080fd5b506102e2610814366004612780565b611938565b34801561082557600080fd5b506102e2610834366004612555565b611975565b34801561084557600080fd5b506102e26108543660046127c9565b611a60565b60006001600160e01b0319821663780e9d6360e01b148061087e575061087e82611a8f565b92915050565b600a546001600160a01b031633146108b75760405162461bcd60e51b81526004016108ae906129a6565b60405180910390fd5b6013805460ff1916911515919091179055565b600a546001600160a01b031633146108f45760405162461bcd60e51b81526004016108ae906129a6565b600d805460ff1916600117905561090e4262015180612a2c565b601455565b60606000805461092290612aba565b80601f016020809104026020016040519081016040528092919081815260200182805461094e90612aba565b801561099b5780601f106109705761010080835404028352916020019161099b565b820191906000526020600020905b81548152906001019060200180831161097e57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a1e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108ae565b506000908152600460205260409020546001600160a01b031690565b600e8054610a4790612aba565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7390612aba565b8015610ac05780601f10610a9557610100808354040283529160200191610ac0565b820191906000526020600020905b815481529060010190602001808311610aa357829003601f168201915b505050505081565b6000610ad382611059565b9050806001600160a01b0316836001600160a01b03161415610b415760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108ae565b336001600160a01b0382161480610b5d5750610b5d81336107cb565b610bcf5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108ae565b610bd98383611adf565b505050565b600a546001600160a01b03163314610c085760405162461bcd60e51b81526004016108ae906129a6565b600d805460ff191690556000601455565b610c233382611b4d565b610c3f5760405162461bcd60e51b81526004016108ae906129db565b610bd9838383611c44565b600a546000906001600160a01b03163314610c775760405162461bcd60e51b81526004016108ae906129a6565b60005b82811015610cc857610cac848483818110610c9757610c97612b66565b905060200201602081019061045e9190612555565b15610cb657600191505b80610cc081612af5565b915050610c7a565b5092915050565b600a546000906001600160a01b03163314610cfc5760405162461bcd60e51b81526004016108ae906129a6565b6001600160a01b0382166000908152600b602052604090205460ff1615610d76576001600160a01b0382166000818152600b6020908152604091829020805460ff1916905590519182527ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a91015b60405180910390a15060015b919050565b6000610d86836110d0565b8210610de85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108ae565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610e3b5760405162461bcd60e51b81526004016108ae906129a6565b601155565b600a546001600160a01b03163314610e6a5760405162461bcd60e51b81526004016108ae906129a6565b6040514790339082156108fc029083906000818181858888f19350505050158015610e99573d6000803e3d6000fd5b5050565b610bd98383836040518060200160405280600081525061172a565b60606000610ec5836110d0565b905060008167ffffffffffffffff811115610ee257610ee2612b7c565b604051908082528060200260200182016040528015610f0b578160200160208202803683370190505b50905060005b82811015610f5257610f238582610d7b565b828281518110610f3557610f35612b66565b602090810291909101015280610f4a81612af5565b915050610f11565b509392505050565b600a546001600160a01b03163314610f845760405162461bcd60e51b81526004016108ae906129a6565b600f55565b6000610f9460085490565b8210610ff75760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016108ae565b6008828154811061100a5761100a612b66565b90600052602060002001549050919050565b600a546001600160a01b031633146110465760405162461bcd60e51b81526004016108ae906129a6565b8051610e9990600c90602084019061241f565b6000818152600260205260408120546001600160a01b03168061087e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108ae565b60006001600160a01b03821661113b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108ae565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146111815760405162461bcd60e51b81526004016108ae906129a6565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b600a546000906001600160a01b031633146111f85760405162461bcd60e51b81526004016108ae906129a6565b6001600160a01b0382166000908152600b602052604090205460ff16610d76576001600160a01b0382166000818152600b6020908152604091829020805460ff1916600117905590519182527fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f9101610d6a565b60606001805461092290612aba565b600d5460ff166112c35760405162461bcd60e51b81526020600482015260136024820152721cd85b19481a5cc81b9bdd081cdd185c9d1959606a1b60448201526064016108ae565b60135460ff161561130f5760405162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b60448201526064016108ae565b600061131a60085490565b60105490915061132a8383612a2c565b11156113485760405162461bcd60e51b81526004016108ae90612964565b81600f546113569190612a58565b34101561139a5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b60448201526064016108ae565b6014544210156114d857336000908152600b602052604090205460ff166114035760405162461bcd60e51b815260206004820152601760248201527f55736572206973206e6f742077686974656c697374656400000000000000000060448201526064016108ae565b336000908152601560205260409020546011546114208483612a2c565b11156114825760405162461bcd60e51b815260206004820152602b60248201527f4d6178204e46547320706572206164647265737320657863656564656420666f60448201526a391038393296b9b0b6329760a91b60648201526084016108ae565b60015b8381116114d2573360009081526015602052604081208054916114a783612af5565b909155506114c09050336114bb8386612a2c565b611def565b806114ca81612af5565b915050611485565b50505050565b6012548211156114fa5760405162461bcd60e51b81526004016108ae90612923565b60015b828111610bd957611512336114bb8385612a2c565b8061151c81612af5565b9150506114fd565b6001600160a01b03821633141561157d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108ae565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146116135760405162461bcd60e51b81526004016108ae906129a6565b6013805461ff001916610100179055565b600a546001600160a01b0316331461164e5760405162461bcd60e51b81526004016108ae906129a6565b60135460ff161561169a5760405162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b60448201526064016108ae565b60006116a560085490565b6010549091506116b58383612a2c565b11156116d35760405162461bcd60e51b81526004016108ae90612964565b600d5460ff1615611700576012548211156117005760405162461bcd60e51b81526004016108ae90612923565b60015b828111610bd957611718336114bb8385612a2c565b8061172281612af5565b915050611703565b6117343383611b4d565b6117505760405162461bcd60e51b81526004016108ae906129db565b6114d284848484611e09565b6000818152600260205260409020546060906001600160a01b03166117db5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108ae565b601354610100900460ff1661187c57600e80546117f790612aba565b80601f016020809104026020016040519081016040528092919081815260200182805461182390612aba565b80156118705780601f1061184557610100808354040283529160200191611870565b820191906000526020600020905b81548152906001019060200180831161185357829003601f168201915b50505050509050919050565b6000611886611e3c565b90508061189284611e4b565b6040516020016118a392919061280e565b604051602081830303815290604052915050919050565b600a546000906001600160a01b031633146118e75760405162461bcd60e51b81526004016108ae906129a6565b60005b82811015610cc85761191c84848381811061190757611907612b66565b905060200201602081019061066a9190612555565b1561192657600191505b8061193081612af5565b9150506118ea565b600a546001600160a01b031633146119625760405162461bcd60e51b81526004016108ae906129a6565b8051610e9990600e90602084019061241f565b600a546001600160a01b0316331461199f5760405162461bcd60e51b81526004016108ae906129a6565b6001600160a01b038116611a045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ae565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314611a8a5760405162461bcd60e51b81526004016108ae906129a6565b601255565b60006001600160e01b031982166380ac58cd60e01b1480611ac057506001600160e01b03198216635b5e139f60e01b145b8061087e57506301ffc9a760e01b6001600160e01b031983161461087e565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b1482611059565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611bc65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108ae565b6000611bd183611059565b9050806001600160a01b0316846001600160a01b03161480611c0c5750836001600160a01b0316611c01846109a5565b6001600160a01b0316145b80611c3c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611c5782611059565b6001600160a01b031614611cbf5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108ae565b6001600160a01b038216611d215760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108ae565b611d2c838383611f49565b611d37600082611adf565b6001600160a01b0383166000908152600360205260408120805460019290611d60908490612a77565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d8e908490612a2c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610e99828260405180602001604052806000815250612001565b611e14848484611c44565b611e2084848484612034565b6114d25760405162461bcd60e51b81526004016108ae906128d1565b6060600c805461092290612aba565b606081611e6f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e995780611e8381612af5565b9150611e929050600a83612a44565b9150611e73565b60008167ffffffffffffffff811115611eb457611eb4612b7c565b6040519080825280601f01601f191660200182016040528015611ede576020820181803683370190505b5090505b8415611c3c57611ef3600183612a77565b9150611f00600a86612b10565b611f0b906030612a2c565b60f81b818381518110611f2057611f20612b66565b60200101906001600160f81b031916908160001a905350611f42600a86612a44565b9450611ee2565b6001600160a01b038316611fa457611f9f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611fc7565b816001600160a01b0316836001600160a01b031614611fc757611fc78382612141565b6001600160a01b038216611fde57610bd9816121de565b826001600160a01b0316826001600160a01b031614610bd957610bd9828261228d565b61200b83836122d1565b6120186000848484612034565b610bd95760405162461bcd60e51b81526004016108ae906128d1565b60006001600160a01b0384163b1561213657604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061207890339089908890889060040161283d565b602060405180830381600087803b15801561209257600080fd5b505af19250505080156120c2575060408051601f3d908101601f191682019092526120bf91810190612763565b60015b61211c573d8080156120f0576040519150601f19603f3d011682016040523d82523d6000602084013e6120f5565b606091505b5080516121145760405162461bcd60e51b81526004016108ae906128d1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c3c565b506001949350505050565b6000600161214e846110d0565b6121589190612a77565b6000838152600760205260409020549091508082146121ab576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906121f090600190612a77565b6000838152600960205260408120546008805493945090928490811061221857612218612b66565b90600052602060002001549050806008838154811061223957612239612b66565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061227157612271612b50565b6001900381819060005260206000200160009055905550505050565b6000612298836110d0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166123275760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108ae565b6000818152600260205260409020546001600160a01b03161561238c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108ae565b61239860008383611f49565b6001600160a01b03821660009081526003602052604081208054600192906123c1908490612a2c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461242b90612aba565b90600052602060002090601f01602090048101928261244d5760008555612493565b82601f1061246657805160ff1916838001178555612493565b82800160010185558215612493579182015b82811115612493578251825591602001919060010190612478565b5061249f9291506124a3565b5090565b5b8082111561249f57600081556001016124a4565b600067ffffffffffffffff808411156124d3576124d3612b7c565b604051601f8501601f19908116603f011681019082821181831017156124fb576124fb612b7c565b8160405280935085815286868601111561251457600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114610d7657600080fd5b80358015158114610d7657600080fd5b60006020828403121561256757600080fd5b6125708261252e565b9392505050565b6000806040838503121561258a57600080fd5b6125938361252e565b91506125a16020840161252e565b90509250929050565b6000806000606084860312156125bf57600080fd5b6125c88461252e565b92506125d66020850161252e565b9150604084013590509250925092565b600080600080608085870312156125fc57600080fd5b6126058561252e565b93506126136020860161252e565b925060408501359150606085013567ffffffffffffffff81111561263657600080fd5b8501601f8101871361264757600080fd5b612656878235602084016124b8565b91505092959194509250565b6000806040838503121561267557600080fd5b61267e8361252e565b91506125a160208401612545565b6000806040838503121561269f57600080fd5b6126a88361252e565b946020939093013593505050565b600080602083850312156126c957600080fd5b823567ffffffffffffffff808211156126e157600080fd5b818501915085601f8301126126f557600080fd5b81358181111561270457600080fd5b8660208260051b850101111561271957600080fd5b60209290920196919550909350505050565b60006020828403121561273d57600080fd5b61257082612545565b60006020828403121561275857600080fd5b813561257081612b92565b60006020828403121561277557600080fd5b815161257081612b92565b60006020828403121561279257600080fd5b813567ffffffffffffffff8111156127a957600080fd5b8201601f810184136127ba57600080fd5b611c3c848235602084016124b8565b6000602082840312156127db57600080fd5b5035919050565b600081518084526127fa816020860160208601612a8e565b601f01601f19169290920160200192915050565b60008351612820818460208801612a8e565b835190830190612834818360208801612a8e565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612870908301846127e2565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156128b257835183529284019291840191600101612896565b50909695505050505050565b60208152600061257060208301846127e2565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526021908201527f4d6178204e46547320706572207472616e73616374696f6e20657863656564656040820152601960fa1b606082015260800190565b60208082526022908201527f45786365656473206d6178696d756d204f726967696e61746f727320737570706040820152616c7960f01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612a3f57612a3f612b24565b500190565b600082612a5357612a53612b3a565b500490565b6000816000190483118215151615612a7257612a72612b24565b500290565b600082821015612a8957612a89612b24565b500390565b60005b83811015612aa9578181015183820152602001612a91565b838111156114d25750506000910152565b600181811c90821680612ace57607f821691505b60208210811415612aef57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612b0957612b09612b24565b5060010190565b600082612b1f57612b1f612b3a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114612ba857600080fd5b5056fea2646970667358221220a8c82dd67fc7e4cc5c1835ec85a1c948519015b2a1d426c9a3951927017b2ba364736f6c634300080700334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000001250726f6a656374204f726967696e204e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005504f4e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a68747470733a2f2f70726f6a6563746f726967696e2e696f2f6d657461646174613f746f6b656e49643d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f70726f6a6563746f726967696e2e696f2f756e72657665616c65642f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102885760003560e01c80634f6ccce71161015a578063a0712d68116100c1578063d5abeb011161007a578063d5abeb011461077a578063e2ec6ec314610790578063e985e9c5146107b0578063f2c4ce1e146107f9578063f2fde38b14610819578063f450fb891461083957600080fd5b8063a0712d68146106d2578063a22cb465146106e5578063a475b5dd14610705578063b28a2c571461071a578063b88d4fde1461073a578063c87b56dd1461075a57600080fd5b8063715018a611610113578063715018a614610624578063762b9ef7146106395780637b9417c81461064f5780638da5cb5b1461066f57806395d89b411461068d5780639b19251a146106a257600080fd5b80634f6ccce71461056b578063518302271461058b57806355f804b3146105aa5780635c975abb146105ca5780636352211e146105e457806370a082311461060457600080fd5b806323b872dd116101fe5780633b80b7d3116101b75780633b80b7d3146104b95780633c8f7594146104d35780633ccfd60b146104e957806342842e0e146104fe578063438b63001461051e57806344a0d68a1461054b57600080fd5b806323b872dd1461040357806324953eaa14610423578063286dd3f51461044357806329efc9dd146104635780632f745c59146104795780633604f93f1461049957600080fd5b8063081c8c4411610250578063081c8c4414610353578063095ea7b31461036857806313faede61461038857806318160ddd146103ac57806318cae269146103c15780631ad2ad1a146103ee57600080fd5b806301ffc9a71461028d57806302329a29146102c257806304c98b2b146102e457806306fdde03146102f9578063081812fc1461031b575b600080fd5b34801561029957600080fd5b506102ad6102a8366004612746565b610859565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd36600461272b565b610884565b005b3480156102f057600080fd5b506102e26108ca565b34801561030557600080fd5b5061030e610913565b6040516102b991906128be565b34801561032757600080fd5b5061033b6103363660046127c9565b6109a5565b6040516001600160a01b0390911681526020016102b9565b34801561035f57600080fd5b5061030e610a3a565b34801561037457600080fd5b506102e261038336600461268c565b610ac8565b34801561039457600080fd5b5061039e600f5481565b6040519081526020016102b9565b3480156103b857600080fd5b5060085461039e565b3480156103cd57600080fd5b5061039e6103dc366004612555565b60156020526000908152604090205481565b3480156103fa57600080fd5b506102e2610bde565b34801561040f57600080fd5b506102e261041e3660046125aa565b610c19565b34801561042f57600080fd5b506102ad61043e3660046126b6565b610c4a565b34801561044f57600080fd5b506102ad61045e366004612555565b610ccf565b34801561046f57600080fd5b5061039e60145481565b34801561048557600080fd5b5061039e61049436600461268c565b610d7b565b3480156104a557600080fd5b506102e26104b43660046127c9565b610e11565b3480156104c557600080fd5b50600d546102ad9060ff1681565b3480156104df57600080fd5b5061039e60125481565b3480156104f557600080fd5b506102e2610e40565b34801561050a57600080fd5b506102e26105193660046125aa565b610e9d565b34801561052a57600080fd5b5061053e610539366004612555565b610eb8565b6040516102b9919061287a565b34801561055757600080fd5b506102e26105663660046127c9565b610f5a565b34801561057757600080fd5b5061039e6105863660046127c9565b610f89565b34801561059757600080fd5b506013546102ad90610100900460ff1681565b3480156105b657600080fd5b506102e26105c5366004612780565b61101c565b3480156105d657600080fd5b506013546102ad9060ff1681565b3480156105f057600080fd5b5061033b6105ff3660046127c9565b611059565b34801561061057600080fd5b5061039e61061f366004612555565b6110d0565b34801561063057600080fd5b506102e2611157565b34801561064557600080fd5b5061039e60115481565b34801561065b57600080fd5b506102ad61066a366004612555565b6111cb565b34801561067b57600080fd5b50600a546001600160a01b031661033b565b34801561069957600080fd5b5061030e61126c565b3480156106ae57600080fd5b506102ad6106bd366004612555565b600b6020526000908152604090205460ff1681565b6102e26106e03660046127c9565b61127b565b3480156106f157600080fd5b506102e2610700366004612662565b611524565b34801561071157600080fd5b506102e26115e9565b34801561072657600080fd5b506102e26107353660046127c9565b611624565b34801561074657600080fd5b506102e26107553660046125e6565b61172a565b34801561076657600080fd5b5061030e6107753660046127c9565b61175c565b34801561078657600080fd5b5061039e60105481565b34801561079c57600080fd5b506102ad6107ab3660046126b6565b6118ba565b3480156107bc57600080fd5b506102ad6107cb366004612577565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561080557600080fd5b506102e2610814366004612780565b611938565b34801561082557600080fd5b506102e2610834366004612555565b611975565b34801561084557600080fd5b506102e26108543660046127c9565b611a60565b60006001600160e01b0319821663780e9d6360e01b148061087e575061087e82611a8f565b92915050565b600a546001600160a01b031633146108b75760405162461bcd60e51b81526004016108ae906129a6565b60405180910390fd5b6013805460ff1916911515919091179055565b600a546001600160a01b031633146108f45760405162461bcd60e51b81526004016108ae906129a6565b600d805460ff1916600117905561090e4262015180612a2c565b601455565b60606000805461092290612aba565b80601f016020809104026020016040519081016040528092919081815260200182805461094e90612aba565b801561099b5780601f106109705761010080835404028352916020019161099b565b820191906000526020600020905b81548152906001019060200180831161097e57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a1e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108ae565b506000908152600460205260409020546001600160a01b031690565b600e8054610a4790612aba565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7390612aba565b8015610ac05780601f10610a9557610100808354040283529160200191610ac0565b820191906000526020600020905b815481529060010190602001808311610aa357829003601f168201915b505050505081565b6000610ad382611059565b9050806001600160a01b0316836001600160a01b03161415610b415760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108ae565b336001600160a01b0382161480610b5d5750610b5d81336107cb565b610bcf5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108ae565b610bd98383611adf565b505050565b600a546001600160a01b03163314610c085760405162461bcd60e51b81526004016108ae906129a6565b600d805460ff191690556000601455565b610c233382611b4d565b610c3f5760405162461bcd60e51b81526004016108ae906129db565b610bd9838383611c44565b600a546000906001600160a01b03163314610c775760405162461bcd60e51b81526004016108ae906129a6565b60005b82811015610cc857610cac848483818110610c9757610c97612b66565b905060200201602081019061045e9190612555565b15610cb657600191505b80610cc081612af5565b915050610c7a565b5092915050565b600a546000906001600160a01b03163314610cfc5760405162461bcd60e51b81526004016108ae906129a6565b6001600160a01b0382166000908152600b602052604090205460ff1615610d76576001600160a01b0382166000818152600b6020908152604091829020805460ff1916905590519182527ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a91015b60405180910390a15060015b919050565b6000610d86836110d0565b8210610de85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108ae565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610e3b5760405162461bcd60e51b81526004016108ae906129a6565b601155565b600a546001600160a01b03163314610e6a5760405162461bcd60e51b81526004016108ae906129a6565b6040514790339082156108fc029083906000818181858888f19350505050158015610e99573d6000803e3d6000fd5b5050565b610bd98383836040518060200160405280600081525061172a565b60606000610ec5836110d0565b905060008167ffffffffffffffff811115610ee257610ee2612b7c565b604051908082528060200260200182016040528015610f0b578160200160208202803683370190505b50905060005b82811015610f5257610f238582610d7b565b828281518110610f3557610f35612b66565b602090810291909101015280610f4a81612af5565b915050610f11565b509392505050565b600a546001600160a01b03163314610f845760405162461bcd60e51b81526004016108ae906129a6565b600f55565b6000610f9460085490565b8210610ff75760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016108ae565b6008828154811061100a5761100a612b66565b90600052602060002001549050919050565b600a546001600160a01b031633146110465760405162461bcd60e51b81526004016108ae906129a6565b8051610e9990600c90602084019061241f565b6000818152600260205260408120546001600160a01b03168061087e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108ae565b60006001600160a01b03821661113b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108ae565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146111815760405162461bcd60e51b81526004016108ae906129a6565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b600a546000906001600160a01b031633146111f85760405162461bcd60e51b81526004016108ae906129a6565b6001600160a01b0382166000908152600b602052604090205460ff16610d76576001600160a01b0382166000818152600b6020908152604091829020805460ff1916600117905590519182527fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f9101610d6a565b60606001805461092290612aba565b600d5460ff166112c35760405162461bcd60e51b81526020600482015260136024820152721cd85b19481a5cc81b9bdd081cdd185c9d1959606a1b60448201526064016108ae565b60135460ff161561130f5760405162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b60448201526064016108ae565b600061131a60085490565b60105490915061132a8383612a2c565b11156113485760405162461bcd60e51b81526004016108ae90612964565b81600f546113569190612a58565b34101561139a5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b60448201526064016108ae565b6014544210156114d857336000908152600b602052604090205460ff166114035760405162461bcd60e51b815260206004820152601760248201527f55736572206973206e6f742077686974656c697374656400000000000000000060448201526064016108ae565b336000908152601560205260409020546011546114208483612a2c565b11156114825760405162461bcd60e51b815260206004820152602b60248201527f4d6178204e46547320706572206164647265737320657863656564656420666f60448201526a391038393296b9b0b6329760a91b60648201526084016108ae565b60015b8381116114d2573360009081526015602052604081208054916114a783612af5565b909155506114c09050336114bb8386612a2c565b611def565b806114ca81612af5565b915050611485565b50505050565b6012548211156114fa5760405162461bcd60e51b81526004016108ae90612923565b60015b828111610bd957611512336114bb8385612a2c565b8061151c81612af5565b9150506114fd565b6001600160a01b03821633141561157d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108ae565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146116135760405162461bcd60e51b81526004016108ae906129a6565b6013805461ff001916610100179055565b600a546001600160a01b0316331461164e5760405162461bcd60e51b81526004016108ae906129a6565b60135460ff161561169a5760405162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b60448201526064016108ae565b60006116a560085490565b6010549091506116b58383612a2c565b11156116d35760405162461bcd60e51b81526004016108ae90612964565b600d5460ff1615611700576012548211156117005760405162461bcd60e51b81526004016108ae90612923565b60015b828111610bd957611718336114bb8385612a2c565b8061172281612af5565b915050611703565b6117343383611b4d565b6117505760405162461bcd60e51b81526004016108ae906129db565b6114d284848484611e09565b6000818152600260205260409020546060906001600160a01b03166117db5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108ae565b601354610100900460ff1661187c57600e80546117f790612aba565b80601f016020809104026020016040519081016040528092919081815260200182805461182390612aba565b80156118705780601f1061184557610100808354040283529160200191611870565b820191906000526020600020905b81548152906001019060200180831161185357829003601f168201915b50505050509050919050565b6000611886611e3c565b90508061189284611e4b565b6040516020016118a392919061280e565b604051602081830303815290604052915050919050565b600a546000906001600160a01b031633146118e75760405162461bcd60e51b81526004016108ae906129a6565b60005b82811015610cc85761191c84848381811061190757611907612b66565b905060200201602081019061066a9190612555565b1561192657600191505b8061193081612af5565b9150506118ea565b600a546001600160a01b031633146119625760405162461bcd60e51b81526004016108ae906129a6565b8051610e9990600e90602084019061241f565b600a546001600160a01b0316331461199f5760405162461bcd60e51b81526004016108ae906129a6565b6001600160a01b038116611a045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ae565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314611a8a5760405162461bcd60e51b81526004016108ae906129a6565b601255565b60006001600160e01b031982166380ac58cd60e01b1480611ac057506001600160e01b03198216635b5e139f60e01b145b8061087e57506301ffc9a760e01b6001600160e01b031983161461087e565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b1482611059565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611bc65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108ae565b6000611bd183611059565b9050806001600160a01b0316846001600160a01b03161480611c0c5750836001600160a01b0316611c01846109a5565b6001600160a01b0316145b80611c3c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611c5782611059565b6001600160a01b031614611cbf5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108ae565b6001600160a01b038216611d215760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108ae565b611d2c838383611f49565b611d37600082611adf565b6001600160a01b0383166000908152600360205260408120805460019290611d60908490612a77565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d8e908490612a2c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610e99828260405180602001604052806000815250612001565b611e14848484611c44565b611e2084848484612034565b6114d25760405162461bcd60e51b81526004016108ae906128d1565b6060600c805461092290612aba565b606081611e6f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e995780611e8381612af5565b9150611e929050600a83612a44565b9150611e73565b60008167ffffffffffffffff811115611eb457611eb4612b7c565b6040519080825280601f01601f191660200182016040528015611ede576020820181803683370190505b5090505b8415611c3c57611ef3600183612a77565b9150611f00600a86612b10565b611f0b906030612a2c565b60f81b818381518110611f2057611f20612b66565b60200101906001600160f81b031916908160001a905350611f42600a86612a44565b9450611ee2565b6001600160a01b038316611fa457611f9f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611fc7565b816001600160a01b0316836001600160a01b031614611fc757611fc78382612141565b6001600160a01b038216611fde57610bd9816121de565b826001600160a01b0316826001600160a01b031614610bd957610bd9828261228d565b61200b83836122d1565b6120186000848484612034565b610bd95760405162461bcd60e51b81526004016108ae906128d1565b60006001600160a01b0384163b1561213657604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061207890339089908890889060040161283d565b602060405180830381600087803b15801561209257600080fd5b505af19250505080156120c2575060408051601f3d908101601f191682019092526120bf91810190612763565b60015b61211c573d8080156120f0576040519150601f19603f3d011682016040523d82523d6000602084013e6120f5565b606091505b5080516121145760405162461bcd60e51b81526004016108ae906128d1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c3c565b506001949350505050565b6000600161214e846110d0565b6121589190612a77565b6000838152600760205260409020549091508082146121ab576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906121f090600190612a77565b6000838152600960205260408120546008805493945090928490811061221857612218612b66565b90600052602060002001549050806008838154811061223957612239612b66565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061227157612271612b50565b6001900381819060005260206000200160009055905550505050565b6000612298836110d0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166123275760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108ae565b6000818152600260205260409020546001600160a01b03161561238c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108ae565b61239860008383611f49565b6001600160a01b03821660009081526003602052604081208054600192906123c1908490612a2c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461242b90612aba565b90600052602060002090601f01602090048101928261244d5760008555612493565b82601f1061246657805160ff1916838001178555612493565b82800160010185558215612493579182015b82811115612493578251825591602001919060010190612478565b5061249f9291506124a3565b5090565b5b8082111561249f57600081556001016124a4565b600067ffffffffffffffff808411156124d3576124d3612b7c565b604051601f8501601f19908116603f011681019082821181831017156124fb576124fb612b7c565b8160405280935085815286868601111561251457600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114610d7657600080fd5b80358015158114610d7657600080fd5b60006020828403121561256757600080fd5b6125708261252e565b9392505050565b6000806040838503121561258a57600080fd5b6125938361252e565b91506125a16020840161252e565b90509250929050565b6000806000606084860312156125bf57600080fd5b6125c88461252e565b92506125d66020850161252e565b9150604084013590509250925092565b600080600080608085870312156125fc57600080fd5b6126058561252e565b93506126136020860161252e565b925060408501359150606085013567ffffffffffffffff81111561263657600080fd5b8501601f8101871361264757600080fd5b612656878235602084016124b8565b91505092959194509250565b6000806040838503121561267557600080fd5b61267e8361252e565b91506125a160208401612545565b6000806040838503121561269f57600080fd5b6126a88361252e565b946020939093013593505050565b600080602083850312156126c957600080fd5b823567ffffffffffffffff808211156126e157600080fd5b818501915085601f8301126126f557600080fd5b81358181111561270457600080fd5b8660208260051b850101111561271957600080fd5b60209290920196919550909350505050565b60006020828403121561273d57600080fd5b61257082612545565b60006020828403121561275857600080fd5b813561257081612b92565b60006020828403121561277557600080fd5b815161257081612b92565b60006020828403121561279257600080fd5b813567ffffffffffffffff8111156127a957600080fd5b8201601f810184136127ba57600080fd5b611c3c848235602084016124b8565b6000602082840312156127db57600080fd5b5035919050565b600081518084526127fa816020860160208601612a8e565b601f01601f19169290920160200192915050565b60008351612820818460208801612a8e565b835190830190612834818360208801612a8e565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612870908301846127e2565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156128b257835183529284019291840191600101612896565b50909695505050505050565b60208152600061257060208301846127e2565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526021908201527f4d6178204e46547320706572207472616e73616374696f6e20657863656564656040820152601960fa1b606082015260800190565b60208082526022908201527f45786365656473206d6178696d756d204f726967696e61746f727320737570706040820152616c7960f01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612a3f57612a3f612b24565b500190565b600082612a5357612a53612b3a565b500490565b6000816000190483118215151615612a7257612a72612b24565b500290565b600082821015612a8957612a89612b24565b500390565b60005b83811015612aa9578181015183820152602001612a91565b838111156114d25750506000910152565b600181811c90821680612ace57607f821691505b60208210811415612aef57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612b0957612b09612b24565b5060010190565b600082612b1f57612b1f612b3a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114612ba857600080fd5b5056fea2646970667358221220a8c82dd67fc7e4cc5c1835ec85a1c948519015b2a1d426c9a3951927017b2ba364736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000001250726f6a656374204f726967696e204e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005504f4e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a68747470733a2f2f70726f6a6563746f726967696e2e696f2f6d657461646174613f746f6b656e49643d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f70726f6a6563746f726967696e2e696f2f756e72657665616c65642f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Project Origin NFT
Arg [1] : _symbol (string): PONFT
Arg [2] : _initBaseURI (string): https://projectorigin.io/metadata?tokenId=
Arg [3] : _initNotRevealedUri (string): https://projectorigin.io/unrevealed/

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [5] : 50726f6a656374204f726967696e204e46540000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 504f4e4654000000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000002a
Arg [9] : 68747470733a2f2f70726f6a6563746f726967696e2e696f2f6d657461646174
Arg [10] : 613f746f6b656e49643d00000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [12] : 68747470733a2f2f70726f6a6563746f726967696e2e696f2f756e7265766561
Arg [13] : 6c65642f00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

48018:4393:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40731:237;;;;;;;;;;-1:-1:-1;40731:237:0;;;;;:::i;:::-;;:::i;:::-;;;7160:14:1;;7153:22;7135:41;;7123:2;7108:18;40731:237:0;;;;;;;;52187:73;;;;;;;;;;-1:-1:-1;52187:73:0;;;;;:::i;:::-;;:::i;:::-;;51384:127;;;;;;;;;;;;;:::i;29250:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30710:221::-;;;;;;;;;;-1:-1:-1;30710:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5821:32:1;;;5803:51;;5791:2;5776:18;30710:221:0;5657:203:1;48204:28:0;;;;;;;;;;;;;:::i;30247:397::-;;;;;;;;;;-1:-1:-1;30247:397:0;;;;;:::i;:::-;;:::i;48237:32::-;;;;;;;;;;;;;;;;;;;17379:25:1;;;17367:2;17352:18;48237:32:0;17233:177:1;41384:113:0;;;;;;;;;;-1:-1:-1;41472:10:0;:17;41384:113;;48512:55;;;;;;;;;;-1:-1:-1;48512:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;51519:102;;;;;;;;;;;;;:::i;31600:305::-;;;;;;;;;;-1:-1:-1;31600:305:0;;;;;:::i;:::-;;:::i;47758:251::-;;;;;;;;;;-1:-1:-1;47758:251:0;;;;;:::i;:::-;;:::i;47522:230::-;;;;;;;;;;-1:-1:-1;47522:230:0;;;;;:::i;:::-;;:::i;48477:30::-;;;;;;;;;;;;;;;;41052:256;;;;;;;;;;-1:-1:-1;41052:256:0;;;;;:::i;:::-;;:::i;51751:110::-;;;;;;;;;;-1:-1:-1;51751:110:0;;;;;:::i;:::-;;:::i;48168:31::-;;;;;;;;;;-1:-1:-1;48168:31:0;;;;;;;;48362:46;;;;;;;;;;;;;;;;52268:140;;;;;;;;;;;;;:::i;31976:151::-;;;;;;;;;;-1:-1:-1;31976:151:0;;;;;:::i;:::-;;:::i;50589:329::-;;;;;;;;;;-1:-1:-1;50589:329:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;51869:80::-;;;;;;;;;;-1:-1:-1;51869:80:0;;;;;:::i;:::-;;:::i;41574:233::-;;;;;;;;;;-1:-1:-1;41574:233:0;;;;;:::i;:::-;;:::i;48444:28::-;;;;;;;;;;-1:-1:-1;48444:28:0;;;;;;;;;;;51957:98;;;;;;;;;;-1:-1:-1;51957:98:0;;;;;:::i;:::-;;:::i;48413:26::-;;;;;;;;;;-1:-1:-1;48413:26:0;;;;;;;;28944:239;;;;;;;;;;-1:-1:-1;28944:239:0;;;;;:::i;:::-;;:::i;28674:208::-;;;;;;;;;;-1:-1:-1;28674:208:0;;;;;:::i;:::-;;:::i;19055:148::-;;;;;;;;;;;;;:::i;48311:46::-;;;;;;;;;;;;;;;;47043:224;;;;;;;;;;-1:-1:-1;47043:224:0;;;;;:::i;:::-;;:::i;18404:87::-;;;;;;;;;;-1:-1:-1;18477:6:0;;-1:-1:-1;;;;;18477:6:0;18404:87;;29419:104;;;;;;;;;;;;;:::i;46893:41::-;;;;;;;;;;-1:-1:-1;46893:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;49444:1139;;;;;;:::i;:::-;;:::i;31003:295::-;;;;;;;;;;-1:-1:-1;31003:295:0;;;;;:::i;:::-;;:::i;51311:65::-;;;;;;;;;;;;;:::i;48961:475::-;;;;;;;;;;-1:-1:-1;48961:475:0;;;;;:::i;:::-;;:::i;32198:285::-;;;;;;;;;;-1:-1:-1;32198:285:0;;;;;:::i;:::-;;:::i;50924:381::-;;;;;;;;;;-1:-1:-1;50924:381:0;;;;;:::i;:::-;;:::i;48274:32::-;;;;;;;;;;;;;;;;47275:241;;;;;;;;;;-1:-1:-1;47275:241:0;;;;;:::i;:::-;;:::i;31369:164::-;;;;;;;;;;-1:-1:-1;31369:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;31490:25:0;;;31466:4;31490:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31369:164;52061:120;;;;;;;;;;-1:-1:-1;52061:120:0;;;;;:::i;:::-;;:::i;19358:244::-;;;;;;;;;;-1:-1:-1;19358:244:0;;;;;:::i;:::-;;:::i;51629:114::-;;;;;;;;;;-1:-1:-1;51629:114:0;;;;;:::i;:::-;;:::i;40731:237::-;40833:4;-1:-1:-1;;;;;;40857:50:0;;-1:-1:-1;;;40857:50:0;;:103;;;40924:36;40948:11;40924:23;:36::i;:::-;40850:110;40731:237;-1:-1:-1;;40731:237:0:o;52187:73::-;18477:6;;-1:-1:-1;;;;;18477:6:0;17128:10;18624:23;18616:68;;;;-1:-1:-1;;;18616:68:0;;;;;;;:::i;:::-;;;;;;;;;52239:6:::1;:15:::0;;-1:-1:-1;;52239:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52187:73::o;51384:127::-;18477:6;;-1:-1:-1;;;;;18477:6:0;17128:10;18624:23;18616:68;;;;-1:-1:-1;;;18616:68:0;;;;;;;:::i;:::-;51434:13:::1;:18:::0;;-1:-1:-1;;51434:18:0::1;51448:4;51434:18;::::0;;51479:26:::1;:15;51497:8;51479:26;:::i;:::-;51461:15;:44:::0;51384:127::o;29250:100::-;29304:13;29337:5;29330:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29250:100;:::o;30710:221::-;30786:7;34039:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34039:16:0;30806:73;;;;-1:-1:-1;;;30806:73:0;;13491:2:1;30806:73:0;;;13473:21:1;13530:2;13510:18;;;13503:30;13569:34;13549:18;;;13542:62;-1:-1:-1;;;13620:18:1;;;13613:42;13672:19;;30806:73:0;13289:408:1;30806:73:0;-1:-1:-1;30899:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30899:24:0;;30710:221::o;48204:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30247:397::-;30328:13;30344:23;30359:7;30344:14;:23::i;:::-;30328:39;;30392:5;-1:-1:-1;;;;;30386:11:0;:2;-1:-1:-1;;;;;30386:11:0;;;30378:57;;;;-1:-1:-1;;;30378:57:0;;15790:2:1;30378:57:0;;;15772:21:1;15829:2;15809:18;;;15802:30;15868:34;15848:18;;;15841:62;-1:-1:-1;;;15919:18:1;;;15912:31;15960:19;;30378:57:0;15588:397:1;30378:57:0;17128:10;-1:-1:-1;;;;;30456:21:0;;;;:62;;-1:-1:-1;30481:37:0;30498:5;17128:10;31369:164;:::i;30481:37::-;30448:154;;;;-1:-1:-1;;;30448:154:0;;11884:2:1;30448:154:0;;;11866:21:1;11923:2;11903:18;;;11896:30;11962:34;11942:18;;;11935:62;12033:26;12013:18;;;12006:54;12077:19;;30448:154:0;11682:420:1;30448:154:0;30615:21;30624:2;30628:7;30615:8;:21::i;:::-;30317:327;30247:397;;:::o;51519:102::-;18477:6;;-1:-1:-1;;;;;18477:6:0;17128:10;18624:23;18616:68;;;;-1:-1:-1;;;18616:68:0;;;;;;;:::i;:::-;51568:13:::1;:19:::0;;-1:-1:-1;;51568:19:0::1;::::0;;51582:5:::1;51596:15;:19:::0;51519:102::o;31600:305::-;31761:41;17128:10;31794:7;31761:18;:41::i;:::-;31753:103;;;;-1:-1:-1;;;31753:103:0;;;;;;;:::i;:::-;31869:28;31879:4;31885:2;31889:7;31869:9;:28::i;47758:251::-;18477:6;;47847:12;;-1:-1:-1;;;;;18477:6:0;17128:10;18624:23;18616:68;;;;-1:-1:-1;;;18616:68:0;;;;;;;:::i;:::-;47873:9:::1;47868:136;47888:16:::0;;::::1;47868:136;;;47924:36;47951:5;;47957:1;47951:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;47924:36::-;47920:77;;;47983:4;47973:14;;47920:77;47906:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47868:136;;;;47758:251:::0;;;;:::o;47522:230::-;18477:6;;47597:12;;-1:-1:-1;;;;;18477:6:0;17128:10;18624:23;18616:68;;;;-1:-1:-1;;;18616:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47622:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;::::1;;47618:129;;;-1:-1:-1::0;;;;;47648:15:0;::::1;47666:5;47648:15:::0;;;:9:::1;:15;::::0;;;;;;;;:23;;-1:-1:-1;;47648:23:0::1;::::0;;47685:31;;5803:51:1;;;47685:31:0::1;::::0;5776:18:1;47685:31:0::1;;;;;;;;-1:-1:-1::0;47735:4:0::1;47618:129;47522:230:::0;;;:::o;41052:256::-;41149:7;41185:23;41202:5;41185:16;:23::i;:::-;41177:5;:31;41169:87;;;;-1:-1:-1;;;41169:87:0;;7613:2:1;41169:87:0;;;7595:21:1;7652:2;7632:18;;;7625:30;7691:34;7671:18;;;7664:62;-1:-1:-1;;;7742:18:1;;;7735:41;7793:19;;41169:87:0;7411:407:1;41169:87:0;-1:-1:-1;;;;;;41274:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;41052:256::o;51751:110::-;18477:6;;-1:-1:-1;;;;;18477:6:0;17128:10;18624:23;18616:68;;;;-1:-1:-1;;;18616:68:0;;;;;;;:::i;:::-;51819:27:::1;:36:::0;51751:110::o;52268:140::-;18477:6;;-1:-1:-1;;;;;18477:6:0;17128:10;18624:23;18616:68;;;;-1:-1:-1;;;18616:68:0;;;;;;;:::i;:::-;52363:37:::1;::::0;52331:21:::1;::::0;52371:10:::1;::::0;52363:37;::::1;;;::::0;52331:21;;52316:12:::1;52363:37:::0;52316:12;52363:37;52331:21;52371:10;52363:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;52305:103;52268:140::o:0;31976:151::-;32080:39;32097:4;32103:2;32107:7;32080:39;;;;;;;;;;;;:16;:39::i;50589:329::-;50649:16;50673:23;50699:17;50709:6;50699:9;:17::i;:::-;50673:43;;50723:25;50765:15;50751:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50751:30:0;;50723:58;;50793:9;50788:103;50808:15;50804:1;:19;50788:103;;;50853:30;50873:6;50881:1;50853:19;:30::i;:::-;50839:8;50848:1;50839:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;50825:3;;;;:::i;:::-;;;;50788:103;;;-1:-1:-1;50904:8:0;50589:329;-1:-1:-1;;;50589:329:0:o;51869:80::-;18477:6;;-1:-1:-1;;;;;18477:6:0;17128:10;18624:23;18616:68;;;;-1:-1:-1;;;18616:68:0;;;;;;;:::i;:::-;51928:4:::1;:15:::0;51869:80::o;41574:233::-;41649:7;41685:30;41472:10;:17;;41384:113;41685:30;41677:5;:38;41669:95;;;;-1:-1:-1;;;41669:95:0;;16610:2:1;41669:95:0;;;16592:21:1;16649:2;16629:18;;;16622:30;16688:34;16668:18;;;16661:62;-1:-1:-1;;;16739:18:1;;;16732:42;16791:19;;41669:95:0;16408:408:1;41669:95:0;41782:10;41793:5;41782:17;;;;;;;;:::i;:::-;;;;;;;;;41775:24;;41574:233;;;:::o;51957:98::-;18477:6;;-1:-1:-1;;;;;18477:6:0;17128:10;18624:23;18616:68;;;;-1:-1:-1;;;18616:68:0;;;;;;;:::i;:::-;52028:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;28944:239::-:0;29016:7;29052:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29052:16:0;29087:19;29079:73;;;;-1:-1:-1;;;29079:73:0;;12720:2:1;29079:73:0;;;12702:21:1;12759:2;12739:18;;;12732:30;12798:34;12778:18;;;12771:62;-1:-1:-1;;;12849:18:1;;;12842:39;12898:19;;29079:73:0;12518:405:1;28674:208:0;28746:7;-1:-1:-1;;;;;28774:19:0;;28766:74;;;;-1:-1:-1;;;28766:74:0;;12309:2:1;28766:74:0;;;12291:21:1;12348:2;12328:18;;;12321:30;12387:34;12367:18;;;12360:62;-1:-1:-1;;;12438:18:1;;;12431:40;12488:19;;28766:74:0;12107:406:1;28766:74:0;-1:-1:-1;;;;;;28858:16:0;;;;;:9;:16;;;;;;;28674:208::o;19055:148::-;18477:6;;-1:-1:-1;;;;;18477:6:0;17128:10;18624:23;18616:68;;;;-1:-1:-1;;;18616:68:0;;;;;;;:::i;:::-;19146:6:::1;::::0;19125:40:::1;::::0;19162:1:::1;::::0;-1:-1:-1;;;;;19146:6:0::1;::::0;19125:40:::1;::::0;19162:1;;19125:40:::1;19176:6;:19:::0;;-1:-1:-1;;;;;;19176:19:0::1;::::0;;19055:148::o;47043:224::-;18477:6;;47113:12;;-1:-1:-1;;;;;18477:6:0;17128:10;18624:23;18616:68;;;;-1:-1:-1;;;18616:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47139:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;::::1;;47134:128;;-1:-1:-1::0;;;;;47165:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;;;;:22;;-1:-1:-1;;47165:22:0::1;47183:4;47165:22;::::0;;47201:29;;5803:51:1;;;47201:29:0::1;::::0;5776:18:1;47201:29:0::1;5657:203:1::0;29419:104:0;29475:13;29508:7;29501:14;;;;;:::i;49444:1139::-;49510:13;;;;49502:44;;;;-1:-1:-1;;;49502:44:0;;15442:2:1;49502:44:0;;;15424:21:1;15481:2;15461:18;;;15454:30;-1:-1:-1;;;15500:18:1;;;15493:49;15559:18;;49502:44:0;15240:343:1;49502:44:0;49566:6;;;;49565:7;49557:42;;;;-1:-1:-1;;;49557:42:0;;14265:2:1;49557:42:0;;;14247:21:1;14304:2;14284:18;;;14277:30;-1:-1:-1;;;14323:18:1;;;14316:52;14385:18;;49557:42:0;14063:346:1;49557:42:0;49610:14;49627:13;41472:10;:17;;41384:113;49627:13;49683:9;;49610:30;;-1:-1:-1;49659:20:0;49668:11;49610:30;49659:20;:::i;:::-;:33;;49651:80;;;;-1:-1:-1;;;49651:80:0;;;;;;;:::i;:::-;49770:11;49763:4;;:18;;;;:::i;:::-;49750:9;:31;;49742:62;;;;-1:-1:-1;;;49742:62:0;;11185:2:1;49742:62:0;;;11167:21:1;11224:2;11204:18;;;11197:30;-1:-1:-1;;;11243:18:1;;;11236:48;11301:18;;49742:62:0;10983:342:1;49742:62:0;49838:15;;49820;:33;49817:759;;;49888:10;49878:21;;;;:9;:21;;;;;;;;49870:57;;;;-1:-1:-1;;;49870:57:0;;11532:2:1;49870:57:0;;;11514:21:1;11571:2;11551:18;;;11544:30;11610:25;11590:18;;;11583:53;11653:18;;49870:57:0;11330:347:1;49870:57:0;49990:10;49942:24;49969:32;;;:20;:32;;;;;;50058:27;;50024:30;50043:11;49969:32;50024:30;:::i;:::-;:61;;50016:117;;;;-1:-1:-1;;;50016:117:0;;17023:2:1;50016:117:0;;;17005:21:1;17062:2;17042:18;;;17035:30;17101:34;17081:18;;;17074:62;-1:-1:-1;;;17152:18:1;;;17145:41;17203:19;;50016:117:0;16821:407:1;50016:117:0;50165:1;50148:164;50173:11;50168:1;:16;50148:164;;50231:10;50210:32;;;;:20;:32;;;;;:34;;;;;;:::i;:::-;;;;-1:-1:-1;50263:33:0;;-1:-1:-1;50273:10:0;50285;50294:1;50285:6;:10;:::i;:::-;50263:9;:33::i;:::-;50186:3;;;;:::i;:::-;;;;50148:164;;;;49855:468;52363:37:::1;52305:103;52268:140::o:0;49817:759::-;50375:26;;50360:11;:41;;50352:87;;;;-1:-1:-1;;;50352:87:0;;;;;;;:::i;:::-;50471:1;50454:111;50479:11;50474:1;:16;50454:111;;50516:33;50526:10;50538;50547:1;50538:6;:10;:::i;50516:33::-;50492:3;;;;:::i;:::-;;;;50454:111;;31003:295;-1:-1:-1;;;;;31106:24:0;;17128:10;31106:24;;31098:62;;;;-1:-1:-1;;;31098:62:0;;10418:2:1;31098:62:0;;;10400:21:1;10457:2;10437:18;;;10430:30;10496:27;10476:18;;;10469:55;10541:18;;31098:62:0;10216:349:1;31098:62:0;17128:10;31173:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;31173:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;31173:53:0;;;;;;;;;;31242:48;;7135:41:1;;;31173:42:0;;17128:10;31242:48;;7108:18:1;31242:48:0;;;;;;;31003:295;;:::o;51311:65::-;18477:6;;-1:-1:-1;;;;;18477:6:0;17128:10;18624:23;18616:68;;;;-1:-1:-1;;;18616:68:0;;;;;;;:::i;:::-;51355:8:::1;:15:::0;;-1:-1:-1;;51355:15:0::1;;;::::0;;51311:65::o;48961:475::-;18477:6;;-1:-1:-1;;;;;18477:6:0;17128:10;18624:23;18616:68;;;;-1:-1:-1;;;18616:68:0;;;;;;;:::i;:::-;49032:6:::1;::::0;::::1;;49031:7;49023:42;;;::::0;-1:-1:-1;;;49023:42:0;;14265:2:1;49023:42:0::1;::::0;::::1;14247:21:1::0;14304:2;14284:18;;;14277:30;-1:-1:-1;;;14323:18:1;;;14316:52;14385:18;;49023:42:0::1;14063:346:1::0;49023:42:0::1;49072:14;49089:13;41472:10:::0;:17;;41384:113;49089:13:::1;49141:9;::::0;49072:30;;-1:-1:-1;49117:20:0::1;49126:11:::0;49072:30;49117:20:::1;:::i;:::-;:33;;49109:80;;;;-1:-1:-1::0;;;49109:80:0::1;;;;;;;:::i;:::-;49199:13;::::0;::::1;;49196:124;;;49248:26;;49233:11;:41;;49225:87;;;;-1:-1:-1::0;;;49225:87:0::1;;;;;;;:::i;:::-;49343:1;49326:103;49351:11;49346:1;:16;49326:103;;49384:33;49394:10;49406;49415:1:::0;49406:6;:10:::1;:::i;49384:33::-;49364:3:::0;::::1;::::0;::::1;:::i;:::-;;;;49326:103;;32198:285:::0;32330:41;17128:10;32363:7;32330:18;:41::i;:::-;32322:103;;;;-1:-1:-1;;;32322:103:0;;;;;;;:::i;:::-;32436:39;32450:4;32456:2;32460:7;32469:5;32436:13;:39::i;50924:381::-;34015:4;34039:16;;;:7;:16;;;;;;50997:13;;-1:-1:-1;;;;;34039:16:0;51026:75;;;;-1:-1:-1;;;51026:75:0;;15026:2:1;51026:75:0;;;15008:21:1;15065:2;15045:18;;;15038:30;15104:34;15084:18;;;15077:62;-1:-1:-1;;;15155:18:1;;;15148:45;15210:19;;51026:75:0;14824:411:1;51026:75:0;51117:8;;;;;;;51114:62;;51154:14;51147:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50924:381;;;:::o;51114:62::-;51184:28;51215:10;:8;:10::i;:::-;51184:41;;51263:14;51279:18;:7;:16;:18::i;:::-;51246:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51232:67;;;50924:381;;;:::o;47275:241::-;18477:6;;47359:12;;-1:-1:-1;;;;;18477:6:0;17128:10;18624:23;18616:68;;;;-1:-1:-1;;;18616:68:0;;;;;;;:::i;:::-;47385:9:::1;47380:131;47400:16:::0;;::::1;47380:131;;;47436:31;47458:5;;47464:1;47458:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;47436:31::-;47432:72;;;47490:4;47480:14;;47432:72;47418:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47380:131;;52061:120:::0;18477:6;;-1:-1:-1;;;;;18477:6:0;17128:10;18624:23;18616:68;;;;-1:-1:-1;;;18616:68:0;;;;;;;:::i;:::-;52143:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;19358:244::-:0;18477:6;;-1:-1:-1;;;;;18477:6:0;17128:10;18624:23;18616:68;;;;-1:-1:-1;;;18616:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19447:22:0;::::1;19439:73;;;::::0;-1:-1:-1;;;19439:73:0;;8444:2:1;19439:73:0::1;::::0;::::1;8426:21:1::0;8483:2;8463:18;;;8456:30;8522:34;8502:18;;;8495:62;-1:-1:-1;;;8573:18:1;;;8566:36;8619:19;;19439:73:0::1;8242:402:1::0;19439:73:0::1;19549:6;::::0;19528:38:::1;::::0;-1:-1:-1;;;;;19528:38:0;;::::1;::::0;19549:6:::1;::::0;19528:38:::1;::::0;19549:6:::1;::::0;19528:38:::1;19577:6;:17:::0;;-1:-1:-1;;;;;;19577:17:0::1;-1:-1:-1::0;;;;;19577:17:0;;;::::1;::::0;;;::::1;::::0;;19358:244::o;51629:114::-;18477:6;;-1:-1:-1;;;;;18477:6:0;17128:10;18624:23;18616:68;;;;-1:-1:-1;;;18616:68:0;;;;;;;:::i;:::-;51702:26:::1;:35:::0;51629:114::o;28318:292::-;28420:4;-1:-1:-1;;;;;;28444:40:0;;-1:-1:-1;;;28444:40:0;;:105;;-1:-1:-1;;;;;;;28501:48:0;;-1:-1:-1;;;28501:48:0;28444:105;:158;;;-1:-1:-1;;;;;;;;;;10701:40:0;;;28566:36;10592:157;37827:174;37902:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;37902:29:0;-1:-1:-1;;;;;37902:29:0;;;;;;;;:24;;37956:23;37902:24;37956:14;:23::i;:::-;-1:-1:-1;;;;;37947:46:0;;;;;;;;;;;37827:174;;:::o;34244:348::-;34337:4;34039:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34039:16:0;34354:73;;;;-1:-1:-1;;;34354:73:0;;10772:2:1;34354:73:0;;;10754:21:1;10811:2;10791:18;;;10784:30;10850:34;10830:18;;;10823:62;-1:-1:-1;;;10901:18:1;;;10894:42;10953:19;;34354:73:0;10570:408:1;34354:73:0;34438:13;34454:23;34469:7;34454:14;:23::i;:::-;34438:39;;34507:5;-1:-1:-1;;;;;34496:16:0;:7;-1:-1:-1;;;;;34496:16:0;;:51;;;;34540:7;-1:-1:-1;;;;;34516:31:0;:20;34528:7;34516:11;:20::i;:::-;-1:-1:-1;;;;;34516:31:0;;34496:51;:87;;;-1:-1:-1;;;;;;31490:25:0;;;31466:4;31490:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;34551:32;34488:96;34244:348;-1:-1:-1;;;;34244:348:0:o;37165:544::-;37290:4;-1:-1:-1;;;;;37263:31:0;:23;37278:7;37263:14;:23::i;:::-;-1:-1:-1;;;;;37263:31:0;;37255:85;;;;-1:-1:-1;;;37255:85:0;;14616:2:1;37255:85:0;;;14598:21:1;14655:2;14635:18;;;14628:30;14694:34;14674:18;;;14667:62;-1:-1:-1;;;14745:18:1;;;14738:39;14794:19;;37255:85:0;14414:405:1;37255:85:0;-1:-1:-1;;;;;37359:16:0;;37351:65;;;;-1:-1:-1;;;37351:65:0;;10013:2:1;37351:65:0;;;9995:21:1;10052:2;10032:18;;;10025:30;10091:34;10071:18;;;10064:62;-1:-1:-1;;;10142:18:1;;;10135:34;10186:19;;37351:65:0;9811:400:1;37351:65:0;37429:39;37450:4;37456:2;37460:7;37429:20;:39::i;:::-;37533:29;37550:1;37554:7;37533:8;:29::i;:::-;-1:-1:-1;;;;;37575:15:0;;;;;;:9;:15;;;;;:20;;37594:1;;37575:15;:20;;37594:1;;37575:20;:::i;:::-;;;;-1:-1:-1;;;;;;;37606:13:0;;;;;;:9;:13;;;;;:18;;37623:1;;37606:13;:18;;37623:1;;37606:18;:::i;:::-;;;;-1:-1:-1;;37635:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37635:21:0;-1:-1:-1;;;;;37635:21:0;;;;;;;;;37674:27;;37635:16;;37674:27;;;;;;;37165:544;;;:::o;34934:110::-;35010:26;35020:2;35024:7;35010:26;;;;;;;;;;;;:9;:26::i;33365:272::-;33479:28;33489:4;33495:2;33499:7;33479:9;:28::i;:::-;33526:48;33549:4;33555:2;33559:7;33568:5;33526:22;:48::i;:::-;33518:111;;;;-1:-1:-1;;;33518:111:0;;;;;;;:::i;48853:102::-;48913:13;48942:7;48935:14;;;;;:::i;859:723::-;915:13;1136:10;1132:53;;-1:-1:-1;;1163:10:0;;;;;;;;;;;;-1:-1:-1;;;1163:10:0;;;;;859:723::o;1132:53::-;1210:5;1195:12;1251:78;1258:9;;1251:78;;1284:8;;;;:::i;:::-;;-1:-1:-1;1307:10:0;;-1:-1:-1;1315:2:0;1307:10;;:::i;:::-;;;1251:78;;;1339:19;1371:6;1361:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1361:17:0;;1339:39;;1389:154;1396:10;;1389:154;;1423:11;1433:1;1423:11;;:::i;:::-;;-1:-1:-1;1492:10:0;1500:2;1492:5;:10;:::i;:::-;1479:24;;:2;:24;:::i;:::-;1466:39;;1449:6;1456;1449:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1449:56:0;;;;;;;;-1:-1:-1;1520:11:0;1529:2;1520:11;;:::i;:::-;;;1389:154;;42420:555;-1:-1:-1;;;;;42592:18:0;;42588:187;;42627:40;42659:7;43802:10;:17;;43775:24;;;;:15;:24;;;;;:44;;;43830:24;;;;;;;;;;;;43698:164;42627:40;42588:187;;;42697:2;-1:-1:-1;;;;;42689:10:0;:4;-1:-1:-1;;;;;42689:10:0;;42685:90;;42716:47;42749:4;42755:7;42716:32;:47::i;:::-;-1:-1:-1;;;;;42789:16:0;;42785:183;;42822:45;42859:7;42822:36;:45::i;42785:183::-;42895:4;-1:-1:-1;;;;;42889:10:0;:2;-1:-1:-1;;;;;42889:10:0;;42885:83;;42916:40;42944:2;42948:7;42916:27;:40::i;35271:250::-;35367:18;35373:2;35377:7;35367:5;:18::i;:::-;35404:54;35435:1;35439:2;35443:7;35452:5;35404:22;:54::i;:::-;35396:117;;;;-1:-1:-1;;;35396:117:0;;;;;;;:::i;38566:843::-;38687:4;-1:-1:-1;;;;;38713:13:0;;3593:20;3632:8;38709:693;;38749:72;;-1:-1:-1;;;38749:72:0;;-1:-1:-1;;;;;38749:36:0;;;;;:72;;17128:10;;38800:4;;38806:7;;38815:5;;38749:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38749:72:0;;;;;;;;-1:-1:-1;;38749:72:0;;;;;;;;;;;;:::i;:::-;;;38745:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38995:13:0;;38991:341;;39038:60;;-1:-1:-1;;;39038:60:0;;;;;;;:::i;38991:341::-;39282:6;39276:13;39267:6;39263:2;39259:15;39252:38;38745:602;-1:-1:-1;;;;;;38872:55:0;-1:-1:-1;;;38872:55:0;;-1:-1:-1;38865:62:0;;38709:693;-1:-1:-1;39386:4:0;38566:843;;;;;;:::o;44489:988::-;44755:22;44805:1;44780:22;44797:4;44780:16;:22::i;:::-;:26;;;;:::i;:::-;44817:18;44838:26;;;:17;:26;;;;;;44755:51;;-1:-1:-1;44971:28:0;;;44967:328;;-1:-1:-1;;;;;45038:18:0;;45016:19;45038:18;;;:12;:18;;;;;;;;:34;;;;;;;;;45089:30;;;;;;:44;;;45206:30;;:17;:30;;;;;:43;;;44967:328;-1:-1:-1;45391:26:0;;;;:17;:26;;;;;;;;45384:33;;;-1:-1:-1;;;;;45435:18:0;;;;;:12;:18;;;;;:34;;;;;;;45428:41;44489:988::o;45772:1079::-;46050:10;:17;46025:22;;46050:21;;46070:1;;46050:21;:::i;:::-;46082:18;46103:24;;;:15;:24;;;;;;46476:10;:26;;46025:46;;-1:-1:-1;46103:24:0;;46025:46;;46476:26;;;;;;:::i;:::-;;;;;;;;;46454:48;;46540:11;46515:10;46526;46515:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;46620:28;;;:15;:28;;;;;;;:41;;;46792:24;;;;;46785:31;46827:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45843:1008;;;45772:1079;:::o;43276:221::-;43361:14;43378:20;43395:2;43378:16;:20::i;:::-;-1:-1:-1;;;;;43409:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;43454:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;43276:221:0:o;35857:382::-;-1:-1:-1;;;;;35937:16:0;;35929:61;;;;-1:-1:-1;;;35929:61:0;;13130:2:1;35929:61:0;;;13112:21:1;;;13149:18;;;13142:30;13208:34;13188:18;;;13181:62;13260:18;;35929:61:0;12928:356:1;35929:61:0;34015:4;34039:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34039:16:0;:30;36001:58;;;;-1:-1:-1;;;36001:58:0;;9656:2:1;36001:58:0;;;9638:21:1;9695:2;9675:18;;;9668:30;9734;9714:18;;;9707:58;9782:18;;36001:58:0;9454:352:1;36001:58:0;36072:45;36101:1;36105:2;36109:7;36072:20;:45::i;:::-;-1:-1:-1;;;;;36130:13:0;;;;;;:9;:13;;;;;:18;;36147:1;;36130:13;:18;;36147:1;;36130:18;:::i;:::-;;;;-1:-1:-1;;36159:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36159:21:0;-1:-1:-1;;;;;36159:21:0;;;;;;;;36198:33;;36159:16;;;36198:33;;36159:16;;36198:33;35857:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;828:160;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:186;1052:6;1105:2;1093:9;1084:7;1080:23;1076:32;1073:52;;;1121:1;1118;1111:12;1073:52;1144:29;1163:9;1144:29;:::i;:::-;1134:39;993:186;-1:-1:-1;;;993:186:1:o;1184:260::-;1252:6;1260;1313:2;1301:9;1292:7;1288:23;1284:32;1281:52;;;1329:1;1326;1319:12;1281:52;1352:29;1371:9;1352:29;:::i;:::-;1342:39;;1400:38;1434:2;1423:9;1419:18;1400:38;:::i;:::-;1390:48;;1184:260;;;;;:::o;1449:328::-;1526:6;1534;1542;1595:2;1583:9;1574:7;1570:23;1566:32;1563:52;;;1611:1;1608;1601:12;1563:52;1634:29;1653:9;1634:29;:::i;:::-;1624:39;;1682:38;1716:2;1705:9;1701:18;1682:38;:::i;:::-;1672:48;;1767:2;1756:9;1752:18;1739:32;1729:42;;1449:328;;;;;:::o;1782:666::-;1877:6;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;1994:29;2013:9;1994:29;:::i;:::-;1984:39;;2042:38;2076:2;2065:9;2061:18;2042:38;:::i;:::-;2032:48;;2127:2;2116:9;2112:18;2099:32;2089:42;;2182:2;2171:9;2167:18;2154:32;2209:18;2201:6;2198:30;2195:50;;;2241:1;2238;2231:12;2195:50;2264:22;;2317:4;2309:13;;2305:27;-1:-1:-1;2295:55:1;;2346:1;2343;2336:12;2295:55;2369:73;2434:7;2429:2;2416:16;2411:2;2407;2403:11;2369:73;:::i;:::-;2359:83;;;1782:666;;;;;;;:::o;2453:254::-;2518:6;2526;2579:2;2567:9;2558:7;2554:23;2550:32;2547:52;;;2595:1;2592;2585:12;2547:52;2618:29;2637:9;2618:29;:::i;:::-;2608:39;;2666:35;2697:2;2686:9;2682:18;2666:35;:::i;2712:254::-;2780:6;2788;2841:2;2829:9;2820:7;2816:23;2812:32;2809:52;;;2857:1;2854;2847:12;2809:52;2880:29;2899:9;2880:29;:::i;:::-;2870:39;2956:2;2941:18;;;;2928:32;;-1:-1:-1;;;2712:254:1:o;2971:615::-;3057:6;3065;3118:2;3106:9;3097:7;3093:23;3089:32;3086:52;;;3134:1;3131;3124:12;3086:52;3174:9;3161:23;3203:18;3244:2;3236:6;3233:14;3230:34;;;3260:1;3257;3250:12;3230:34;3298:6;3287:9;3283:22;3273:32;;3343:7;3336:4;3332:2;3328:13;3324:27;3314:55;;3365:1;3362;3355:12;3314:55;3405:2;3392:16;3431:2;3423:6;3420:14;3417:34;;;3447:1;3444;3437:12;3417:34;3500:7;3495:2;3485:6;3482:1;3478:14;3474:2;3470:23;3466:32;3463:45;3460:65;;;3521:1;3518;3511:12;3460:65;3552:2;3544:11;;;;;3574:6;;-1:-1:-1;2971:615:1;;-1:-1:-1;;;;2971:615:1:o;3591:180::-;3647:6;3700:2;3688:9;3679:7;3675:23;3671:32;3668:52;;;3716:1;3713;3706:12;3668:52;3739:26;3755:9;3739:26;:::i;3776:245::-;3834:6;3887:2;3875:9;3866:7;3862:23;3858:32;3855:52;;;3903:1;3900;3893:12;3855:52;3942:9;3929:23;3961:30;3985:5;3961:30;:::i;4026:249::-;4095:6;4148:2;4136:9;4127:7;4123:23;4119:32;4116:52;;;4164:1;4161;4154:12;4116:52;4196:9;4190:16;4215:30;4239:5;4215:30;:::i;4280:450::-;4349:6;4402:2;4390:9;4381:7;4377:23;4373:32;4370:52;;;4418:1;4415;4408:12;4370:52;4458:9;4445:23;4491:18;4483:6;4480:30;4477:50;;;4523:1;4520;4513:12;4477:50;4546:22;;4599:4;4591:13;;4587:27;-1:-1:-1;4577:55:1;;4628:1;4625;4618:12;4577:55;4651:73;4716:7;4711:2;4698:16;4693:2;4689;4685:11;4651:73;:::i;4735:180::-;4794:6;4847:2;4835:9;4826:7;4822:23;4818:32;4815:52;;;4863:1;4860;4853:12;4815:52;-1:-1:-1;4886:23:1;;4735:180;-1:-1:-1;4735:180:1:o;4920:257::-;4961:3;4999:5;4993:12;5026:6;5021:3;5014:19;5042:63;5098:6;5091:4;5086:3;5082:14;5075:4;5068:5;5064:16;5042:63;:::i;:::-;5159:2;5138:15;-1:-1:-1;;5134:29:1;5125:39;;;;5166:4;5121:50;;4920:257;-1:-1:-1;;4920:257:1:o;5182:470::-;5361:3;5399:6;5393:13;5415:53;5461:6;5456:3;5449:4;5441:6;5437:17;5415:53;:::i;:::-;5531:13;;5490:16;;;;5553:57;5531:13;5490:16;5587:4;5575:17;;5553:57;:::i;:::-;5626:20;;5182:470;-1:-1:-1;;;;5182:470:1:o;5865:488::-;-1:-1:-1;;;;;6134:15:1;;;6116:34;;6186:15;;6181:2;6166:18;;6159:43;6233:2;6218:18;;6211:34;;;6281:3;6276:2;6261:18;;6254:31;;;6059:4;;6302:45;;6327:19;;6319:6;6302:45;:::i;:::-;6294:53;5865:488;-1:-1:-1;;;;;;5865:488:1:o;6358:632::-;6529:2;6581:21;;;6651:13;;6554:18;;;6673:22;;;6500:4;;6529:2;6752:15;;;;6726:2;6711:18;;;6500:4;6795:169;6809:6;6806:1;6803:13;6795:169;;;6870:13;;6858:26;;6939:15;;;;6904:12;;;;6831:1;6824:9;6795:169;;;-1:-1:-1;6981:3:1;;6358:632;-1:-1:-1;;;;;;6358:632:1:o;7187:219::-;7336:2;7325:9;7318:21;7299:4;7356:44;7396:2;7385:9;7381:18;7373:6;7356:44;:::i;7823:414::-;8025:2;8007:21;;;8064:2;8044:18;;;8037:30;8103:34;8098:2;8083:18;;8076:62;-1:-1:-1;;;8169:2:1;8154:18;;8147:48;8227:3;8212:19;;7823:414::o;8649:397::-;8851:2;8833:21;;;8890:2;8870:18;;;8863:30;8929:34;8924:2;8909:18;;8902:62;-1:-1:-1;;;8995:2:1;8980:18;;8973:31;9036:3;9021:19;;8649:397::o;9051:398::-;9253:2;9235:21;;;9292:2;9272:18;;;9265:30;9331:34;9326:2;9311:18;;9304:62;-1:-1:-1;;;9397:2:1;9382:18;;9375:32;9439:3;9424:19;;9051:398::o;13702:356::-;13904:2;13886:21;;;13923:18;;;13916:30;13982:34;13977:2;13962:18;;13955:62;14049:2;14034:18;;13702:356::o;15990:413::-;16192:2;16174:21;;;16231:2;16211:18;;;16204:30;16270:34;16265:2;16250:18;;16243:62;-1:-1:-1;;;16336:2:1;16321:18;;16314:47;16393:3;16378:19;;15990:413::o;17415:128::-;17455:3;17486:1;17482:6;17479:1;17476:13;17473:39;;;17492:18;;:::i;:::-;-1:-1:-1;17528:9:1;;17415:128::o;17548:120::-;17588:1;17614;17604:35;;17619:18;;:::i;:::-;-1:-1:-1;17653:9:1;;17548:120::o;17673:168::-;17713:7;17779:1;17775;17771:6;17767:14;17764:1;17761:21;17756:1;17749:9;17742:17;17738:45;17735:71;;;17786:18;;:::i;:::-;-1:-1:-1;17826:9:1;;17673:168::o;17846:125::-;17886:4;17914:1;17911;17908:8;17905:34;;;17919:18;;:::i;:::-;-1:-1:-1;17956:9:1;;17846:125::o;17976:258::-;18048:1;18058:113;18072:6;18069:1;18066:13;18058:113;;;18148:11;;;18142:18;18129:11;;;18122:39;18094:2;18087:10;18058:113;;;18189:6;18186:1;18183:13;18180:48;;;-1:-1:-1;;18224:1:1;18206:16;;18199:27;17976:258::o;18239:380::-;18318:1;18314:12;;;;18361;;;18382:61;;18436:4;18428:6;18424:17;18414:27;;18382:61;18489:2;18481:6;18478:14;18458:18;18455:38;18452:161;;;18535:10;18530:3;18526:20;18523:1;18516:31;18570:4;18567:1;18560:15;18598:4;18595:1;18588:15;18452:161;;18239:380;;;:::o;18624:135::-;18663:3;-1:-1:-1;;18684:17:1;;18681:43;;;18704:18;;:::i;:::-;-1:-1:-1;18751:1:1;18740:13;;18624:135::o;18764:112::-;18796:1;18822;18812:35;;18827:18;;:::i;:::-;-1:-1:-1;18861:9:1;;18764:112::o;18881:127::-;18942:10;18937:3;18933:20;18930:1;18923:31;18973:4;18970:1;18963:15;18997:4;18994:1;18987:15;19013:127;19074:10;19069:3;19065:20;19062:1;19055:31;19105:4;19102:1;19095:15;19129:4;19126:1;19119:15;19145:127;19206:10;19201:3;19197:20;19194:1;19187:31;19237:4;19234:1;19227:15;19261:4;19258:1;19251:15;19277:127;19338:10;19333:3;19329:20;19326:1;19319:31;19369:4;19366:1;19359:15;19393:4;19390:1;19383:15;19409:127;19470:10;19465:3;19461:20;19458:1;19451:31;19501:4;19498:1;19491:15;19525:4;19522:1;19515:15;19541:131;-1:-1:-1;;;;;;19615:32:1;;19605:43;;19595:71;;19662:1;19659;19652:12;19595:71;19541:131;:::o

Swarm Source

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