ETH Price: $3,304.72 (-3.53%)
Gas: 6 Gwei

Token

DINOMONKVX (DINOVX)
 

Overview

Max Total Supply

748 DINOVX

Holders

143

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
39 DINOVX
0x087e9001d5c54de545c7f4b8777159c3de090616
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:
DinoMonksVX

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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



pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
// File: Ownable.sol



pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: Address.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
// File: Payment.sol


// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;



/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract Payment is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }


    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }


    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }


    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}
// File: IERC721Receiver.sol



pragma solidity ^0.8.0;

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



pragma solidity ^0.8.0;

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



pragma solidity ^0.8.0;


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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
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);
}
// File: IERC721Metadata.sol



pragma solidity ^0.8.0;


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

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

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


pragma solidity ^0.8.0;









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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: 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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

pragma solidity ^0.8.2;

abstract contract DINOMONKS {
  function ownerOf(uint256 tokenId) public view virtual returns (address);
}

contract DinoMonksVX is ERC721A, Ownable {  
    using Strings for uint256;
    string public _baseURIextended;

    // Claim States
    bool public dinomonksClaimActive = false;
    bool public hatchlingsClaimActive = false;

    DINOMONKS private dinomonks;

    mapping(uint256 => bool) public claimTracker;

    //signatures
    address dinomonksContractAddress = 0xBFb98bEACE995653401863943C8C990d8173fEB1;
    mapping(address => uint256) public isAllowedAmount;

    //settings
    uint256 public MAX_SUPPLY = 5398; //3689 dinomonk holders + max burnt hatchlings + 100 airdrops/reserves
    
    constructor() ERC721A("DINOMONKVX", "DINOVX") 
    {
        dinomonks = DINOMONKS(dinomonksContractAddress);
    }

    function hatchlingsClaim() external {
        uint256 ts = totalSupply();
        require(hatchlingsClaimActive,"Claim is not active");
        uint256 allowedTokens = isAllowedAmount[msg.sender];
        require(allowedTokens > 0,"Ineglible to Mint");
        require(ts + allowedTokens <= MAX_SUPPLY, "Purchase would exceed max tokens");
        _safeMint(msg.sender, allowedTokens);
        isAllowedAmount[msg.sender] = 0;
    }

    function dinomonksClaim(uint256[] calldata dinomonkIDs) external {
        uint256 ts = totalSupply();
        require(ts + dinomonkIDs.length <= MAX_SUPPLY, "Purchase would exceed max tokens");
        require(dinomonksClaimActive,"Claim is not active");
        require(dinomonkIDs.length > 0,"You must claim at least 1 token");
        for(uint256 x = 0; x < dinomonkIDs.length; x++) {
            require(dinomonks.ownerOf(dinomonkIDs[x]) == msg.sender,"You do not own these Dinomonks");
            require(claimTracker[dinomonkIDs[x]] == false,"An inputted token was already claimed");
            claimTracker[dinomonkIDs[x]] = true;
        }
        _safeMint(msg.sender, dinomonkIDs.length);   
    }

    function airdrop(address to, uint256 amount) external onlyOwner {
        uint256 ts = totalSupply();
        require(ts + amount <= MAX_SUPPLY, "Purchase would exceed max tokens");
         _safeMint(to, amount);          
    }

     // Allowed Minting
    function setHatchlingsClaimActive(bool _status) external onlyOwner {
        hatchlingsClaimActive = _status;
    }

    function setDinoMonksClaimActive(bool _status) external onlyOwner {
        dinomonksClaimActive = _status;
    }

    // allowlist functionality
	function allowlistSet(address[] calldata _addresses, uint allowed) public onlyOwner {
	for(uint256 i; i < _addresses.length; i++){
	    isAllowedAmount[_addresses[i]] = allowed;
	}
	}

    //check claim
    function checkClaimed(uint256 tokenId) public view returns (bool) {
        return claimTracker[tokenId];
    }

    //metadata
    function setMetadata(string memory baseURI_) external onlyOwner {
        _baseURIextended = baseURI_;
    }

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

    function withdraw() public payable onlyOwner {
    (bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
        require(success);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseURIextended","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256","name":"allowed","type":"uint256"}],"name":"allowlistSet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"checkClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimTracker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"dinomonkIDs","type":"uint256[]"}],"name":"dinomonksClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dinomonksClaimActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hatchlingsClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hatchlingsClaimActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAllowedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setDinoMonksClaimActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setHatchlingsClaimActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setMetadata","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":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526009805461ffff19169055600b80546001600160a01b03191673bfb98beace995653401863943c8c990d8173feb1179055611516600d553480156200004857600080fd5b50604080518082018252600a815269088929c9e9a9e9c96acb60b31b602080830191825283518085019094526006845265088929c9eacb60d31b908401528151919291620000999160019162000151565b508051620000af90600290602084019062000151565b505050620000cc620000c6620000fb60201b60201c565b620000ff565b600b546009805462010000600160b01b0319166001600160a01b03909216620100000291909117905562000233565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200015f90620001f7565b90600052602060002090601f016020900481019282620001835760008555620001ce565b82601f106200019e57805160ff1916838001178555620001ce565b82800160010185558215620001ce579182015b82811115620001ce578251825591602001919060010190620001b1565b50620001dc929150620001e0565b5090565b5b80821115620001dc5760008155600101620001e1565b600181811c908216806200020c57607f821691505b6020821081036200022d57634e487b7160e01b600052602260045260246000fd5b50919050565b61242c80620002436000396000f3fe6080604052600436106101f95760003560e01c80636352211e1161010d578063a22cb465116100a0578063c7622e9f1161006f578063c7622e9f14610597578063c87b56dd146105c4578063e985e9c5146105e4578063f2fde38b1461062d578063fe9a9fab1461064d57600080fd5b8063a22cb46514610517578063a49a1e7d14610537578063af0423c614610557578063b88d4fde1461057757600080fd5b80638ba4cc3c116100dc5780638ba4cc3c146104aa5780638da5cb5b146104ca578063958caa74146104e857806395d89b411461050257600080fd5b80636352211e14610440578063644ee24f1461046057806370a0823114610475578063715018a61461049557600080fd5b80632f745c59116101905780633ccfd60b1161015f5780633ccfd60b146103a957806342842e0e146103b15780634d449167146103d15780634f6ccce7146104015780635988f8f81461042157600080fd5b80632f745c591461032357806332cb6b0c1461034357806335a55caa1461035957806339b6c2441461038957600080fd5b8063095ea7b3116101cc578063095ea7b3146102a25780630d7bb211146102c457806318160ddd146102e457806323b872dd1461030357600080fd5b806301ffc9a7146101fe57806306fdde0314610233578063081812fc146102555780630928fc221461028d575b600080fd5b34801561020a57600080fd5b5061021e610219366004611d9a565b61066d565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b506102486106da565b60405161022a9190611e0f565b34801561026157600080fd5b50610275610270366004611e22565b61076c565b6040516001600160a01b03909116815260200161022a565b34801561029957600080fd5b506102486107fc565b3480156102ae57600080fd5b506102c26102bd366004611e50565b61088a565b005b3480156102d057600080fd5b506102c26102df366004611e91565b6109a1565b3480156102f057600080fd5b506000545b60405190815260200161022a565b34801561030f57600080fd5b506102c261031e366004611eac565b6109de565b34801561032f57600080fd5b506102f561033e366004611e50565b6109e9565b34801561034f57600080fd5b506102f5600d5481565b34801561036557600080fd5b5061021e610374366004611e22565b6000908152600a602052604090205460ff1690565b34801561039557600080fd5b506102c26103a4366004611f39565b610b44565b6102c2610bd7565b3480156103bd57600080fd5b506102c26103cc366004611eac565b610c59565b3480156103dd57600080fd5b5061021e6103ec366004611e22565b600a6020526000908152604090205460ff1681565b34801561040d57600080fd5b506102f561041c366004611e22565b610c74565b34801561042d57600080fd5b5060095461021e90610100900460ff1681565b34801561044c57600080fd5b5061027561045b366004611e22565b610cd6565b34801561046c57600080fd5b506102c2610ce8565b34801561048157600080fd5b506102f5610490366004611f85565b610dd2565b3480156104a157600080fd5b506102c2610e63565b3480156104b657600080fd5b506102c26104c5366004611e50565b610e99565b3480156104d657600080fd5b506007546001600160a01b0316610275565b3480156104f457600080fd5b5060095461021e9060ff1681565b34801561050e57600080fd5b50610248610efb565b34801561052357600080fd5b506102c2610532366004611fa2565b610f0a565b34801561054357600080fd5b506102c2610552366004612063565b610fce565b34801561056357600080fd5b506102c2610572366004611e91565b61100f565b34801561058357600080fd5b506102c26105923660046120ac565b611053565b3480156105a357600080fd5b506102f56105b2366004611f85565b600c6020526000908152604090205481565b3480156105d057600080fd5b506102486105df366004611e22565b611086565b3480156105f057600080fd5b5061021e6105ff36600461212c565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561063957600080fd5b506102c2610648366004611f85565b611153565b34801561065957600080fd5b506102c2610668366004612165565b6111eb565b60006001600160e01b031982166380ac58cd60e01b148061069e57506001600160e01b03198216635b5e139f60e01b145b806106b957506001600160e01b0319821663780e9d6360e01b145b806106d457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546106e9906121a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610715906121a7565b80156107625780601f1061073757610100808354040283529160200191610762565b820191906000526020600020905b81548152906001019060200180831161074557829003601f168201915b5050505050905090565b6000610779826000541190565b6107e05760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60088054610809906121a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610835906121a7565b80156108825780601f1061085757610100808354040283529160200191610882565b820191906000526020600020905b81548152906001019060200180831161086557829003601f168201915b505050505081565b600061089582610cd6565b9050806001600160a01b0316836001600160a01b0316036109035760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016107d7565b336001600160a01b038216148061091f575061091f81336105ff565b6109915760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016107d7565b61099c838383611490565b505050565b6007546001600160a01b031633146109cb5760405162461bcd60e51b81526004016107d7906121e1565b6009805460ff1916911515919091179055565b61099c8383836114ec565b60006109f483610dd2565b8210610a4d5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016107d7565b600080549080805b83811015610ae4576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610aa857805192505b876001600160a01b0316836001600160a01b031603610adb57868403610ad4575093506106d492505050565b6001909301925b50600101610a55565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016107d7565b6007546001600160a01b03163314610b6e5760405162461bcd60e51b81526004016107d7906121e1565b60005b82811015610bd15781600c6000868685818110610b9057610b90612216565b9050602002016020810190610ba59190611f85565b6001600160a01b0316815260208101919091526040016000205580610bc981612242565b915050610b71565b50505050565b6007546001600160a01b03163314610c015760405162461bcd60e51b81526004016107d7906121e1565b604051600090339047908381818185875af1925050503d8060008114610c43576040519150601f19603f3d011682016040523d82523d6000602084013e610c48565b606091505b5050905080610c5657600080fd5b50565b61099c83838360405180602001604052806000815250611053565b600080548210610cd25760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016107d7565b5090565b6000610ce1826117d1565b5192915050565b600054600954610100900460ff16610d385760405162461bcd60e51b8152602060048201526013602482015272436c61696d206973206e6f742061637469766560681b60448201526064016107d7565b336000908152600c602052604090205480610d895760405162461bcd60e51b8152602060048201526011602482015270125b9959db1a589b19481d1bc8135a5b9d607a1b60448201526064016107d7565b600d54610d96828461225b565b1115610db45760405162461bcd60e51b81526004016107d790612273565b610dbe33826118a8565b5050336000908152600c6020526040812055565b60006001600160a01b038216610e3e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016107d7565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b03163314610e8d5760405162461bcd60e51b81526004016107d7906121e1565b610e9760006118c2565b565b6007546001600160a01b03163314610ec35760405162461bcd60e51b81526004016107d7906121e1565b600054600d54610ed3838361225b565b1115610ef15760405162461bcd60e51b81526004016107d790612273565b61099c83836118a8565b6060600280546106e9906121a7565b336001600160a01b03831603610f625760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016107d7565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b03163314610ff85760405162461bcd60e51b81526004016107d7906121e1565b805161100b906008906020840190611cf4565b5050565b6007546001600160a01b031633146110395760405162461bcd60e51b81526004016107d7906121e1565b600980549115156101000261ff0019909216919091179055565b61105e8484846114ec565b61106a84848484611914565b610bd15760405162461bcd60e51b81526004016107d7906122a8565b6060611093826000541190565b6110f75760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107d7565b6000611101611a16565b90508051600003611121576040518060200160405280600081525061114c565b8061112b84611a25565b60405160200161113c9291906122fb565b6040516020818303038152906040525b9392505050565b6007546001600160a01b0316331461117d5760405162461bcd60e51b81526004016107d7906121e1565b6001600160a01b0381166111e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107d7565b610c56816118c2565b600054600d546111fb838361225b565b11156112195760405162461bcd60e51b81526004016107d790612273565b60095460ff166112615760405162461bcd60e51b8152602060048201526013602482015272436c61696d206973206e6f742061637469766560681b60448201526064016107d7565b816112ae5760405162461bcd60e51b815260206004820152601f60248201527f596f75206d75737420636c61696d206174206c65617374203120746f6b656e0060448201526064016107d7565b60005b828110156114855760095433906201000090046001600160a01b0316636352211e8686858181106112e4576112e4612216565b905060200201356040518263ffffffff1660e01b815260040161130991815260200190565b602060405180830381865afa158015611326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134a919061232a565b6001600160a01b0316146113a05760405162461bcd60e51b815260206004820152601e60248201527f596f7520646f206e6f74206f776e2074686573652044696e6f6d6f6e6b73000060448201526064016107d7565b600a60008585848181106113b6576113b6612216565b602090810292909201358352508101919091526040016000205460ff161561142e5760405162461bcd60e51b815260206004820152602560248201527f416e20696e70757474656420746f6b656e2077617320616c726561647920636c604482015264185a5b595960da1b60648201526084016107d7565b6001600a600086868581811061144657611446612216565b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550808061147d90612242565b9150506112b1565b5061099c33836118a8565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006114f7826117d1565b80519091506000906001600160a01b0316336001600160a01b0316148061152e5750336115238461076c565b6001600160a01b0316145b806115405750815161154090336105ff565b9050806115aa5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016107d7565b846001600160a01b031682600001516001600160a01b03161461161e5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016107d7565b6001600160a01b0384166116825760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107d7565b6116926000848460000151611490565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff16021790559086018083529120549091166117875761173a816000541190565b15611787578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60408051808201909152600080825260208201526117f0826000541190565b61184f5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016107d7565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561189e579392505050565b5060001901611851565b61100b828260405180602001604052806000815250611b26565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b15611a0a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611958903390899088908890600401612347565b6020604051808303816000875af1925050508015611993575060408051601f3d908101601f1916820190925261199091810190612384565b60015b6119f0573d8080156119c1576040519150601f19603f3d011682016040523d82523d6000602084013e6119c6565b606091505b5080516000036119e85760405162461bcd60e51b81526004016107d7906122a8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a0e565b5060015b949350505050565b6060600880546106e9906121a7565b606081600003611a4c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a765780611a6081612242565b9150611a6f9050600a836123b7565b9150611a50565b60008167ffffffffffffffff811115611a9157611a91611fd7565b6040519080825280601f01601f191660200182016040528015611abb576020820181803683370190505b5090505b8415611a0e57611ad06001836123cb565b9150611add600a866123e2565b611ae890603061225b565b60f81b818381518110611afd57611afd612216565b60200101906001600160f81b031916908160001a905350611b1f600a866123b7565b9450611abf565b61099c83838360016000546001600160a01b038516611b915760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107d7565b83600003611bf25760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b60648201526084016107d7565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b85811015611ceb5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315611cdf57611cc36000888488611914565b611cdf5760405162461bcd60e51b81526004016107d7906122a8565b60019182019101611c70565b506000556117ca565b828054611d00906121a7565b90600052602060002090601f016020900481019282611d225760008555611d68565b82601f10611d3b57805160ff1916838001178555611d68565b82800160010185558215611d68579182015b82811115611d68578251825591602001919060010190611d4d565b50610cd29291505b80821115610cd25760008155600101611d70565b6001600160e01b031981168114610c5657600080fd5b600060208284031215611dac57600080fd5b813561114c81611d84565b60005b83811015611dd2578181015183820152602001611dba565b83811115610bd15750506000910152565b60008151808452611dfb816020860160208601611db7565b601f01601f19169290920160200192915050565b60208152600061114c6020830184611de3565b600060208284031215611e3457600080fd5b5035919050565b6001600160a01b0381168114610c5657600080fd5b60008060408385031215611e6357600080fd5b8235611e6e81611e3b565b946020939093013593505050565b80358015158114611e8c57600080fd5b919050565b600060208284031215611ea357600080fd5b61114c82611e7c565b600080600060608486031215611ec157600080fd5b8335611ecc81611e3b565b92506020840135611edc81611e3b565b929592945050506040919091013590565b60008083601f840112611eff57600080fd5b50813567ffffffffffffffff811115611f1757600080fd5b6020830191508360208260051b8501011115611f3257600080fd5b9250929050565b600080600060408486031215611f4e57600080fd5b833567ffffffffffffffff811115611f6557600080fd5b611f7186828701611eed565b909790965060209590950135949350505050565b600060208284031215611f9757600080fd5b813561114c81611e3b565b60008060408385031215611fb557600080fd5b8235611fc081611e3b565b9150611fce60208401611e7c565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561200857612008611fd7565b604051601f8501601f19908116603f0116810190828211818310171561203057612030611fd7565b8160405280935085815286868601111561204957600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561207557600080fd5b813567ffffffffffffffff81111561208c57600080fd5b8201601f8101841361209d57600080fd5b611a0e84823560208401611fed565b600080600080608085870312156120c257600080fd5b84356120cd81611e3b565b935060208501356120dd81611e3b565b925060408501359150606085013567ffffffffffffffff81111561210057600080fd5b8501601f8101871361211157600080fd5b61212087823560208401611fed565b91505092959194509250565b6000806040838503121561213f57600080fd5b823561214a81611e3b565b9150602083013561215a81611e3b565b809150509250929050565b6000806020838503121561217857600080fd5b823567ffffffffffffffff81111561218f57600080fd5b61219b85828601611eed565b90969095509350505050565b600181811c908216806121bb57607f821691505b6020821081036121db57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016122545761225461222c565b5060010190565b6000821982111561226e5761226e61222c565b500190565b6020808252818101527f507572636861736520776f756c6420657863656564206d617820746f6b656e73604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6000835161230d818460208801611db7565b835190830190612321818360208801611db7565b01949350505050565b60006020828403121561233c57600080fd5b815161114c81611e3b565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061237a90830184611de3565b9695505050505050565b60006020828403121561239657600080fd5b815161114c81611d84565b634e487b7160e01b600052601260045260246000fd5b6000826123c6576123c66123a1565b500490565b6000828210156123dd576123dd61222c565b500390565b6000826123f1576123f16123a1565b50069056fea2646970667358221220df8d26e58e856f224c4b12d8a683fef82ccd12d43bbafb52a08ade48e19cae9464736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106101f95760003560e01c80636352211e1161010d578063a22cb465116100a0578063c7622e9f1161006f578063c7622e9f14610597578063c87b56dd146105c4578063e985e9c5146105e4578063f2fde38b1461062d578063fe9a9fab1461064d57600080fd5b8063a22cb46514610517578063a49a1e7d14610537578063af0423c614610557578063b88d4fde1461057757600080fd5b80638ba4cc3c116100dc5780638ba4cc3c146104aa5780638da5cb5b146104ca578063958caa74146104e857806395d89b411461050257600080fd5b80636352211e14610440578063644ee24f1461046057806370a0823114610475578063715018a61461049557600080fd5b80632f745c59116101905780633ccfd60b1161015f5780633ccfd60b146103a957806342842e0e146103b15780634d449167146103d15780634f6ccce7146104015780635988f8f81461042157600080fd5b80632f745c591461032357806332cb6b0c1461034357806335a55caa1461035957806339b6c2441461038957600080fd5b8063095ea7b3116101cc578063095ea7b3146102a25780630d7bb211146102c457806318160ddd146102e457806323b872dd1461030357600080fd5b806301ffc9a7146101fe57806306fdde0314610233578063081812fc146102555780630928fc221461028d575b600080fd5b34801561020a57600080fd5b5061021e610219366004611d9a565b61066d565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b506102486106da565b60405161022a9190611e0f565b34801561026157600080fd5b50610275610270366004611e22565b61076c565b6040516001600160a01b03909116815260200161022a565b34801561029957600080fd5b506102486107fc565b3480156102ae57600080fd5b506102c26102bd366004611e50565b61088a565b005b3480156102d057600080fd5b506102c26102df366004611e91565b6109a1565b3480156102f057600080fd5b506000545b60405190815260200161022a565b34801561030f57600080fd5b506102c261031e366004611eac565b6109de565b34801561032f57600080fd5b506102f561033e366004611e50565b6109e9565b34801561034f57600080fd5b506102f5600d5481565b34801561036557600080fd5b5061021e610374366004611e22565b6000908152600a602052604090205460ff1690565b34801561039557600080fd5b506102c26103a4366004611f39565b610b44565b6102c2610bd7565b3480156103bd57600080fd5b506102c26103cc366004611eac565b610c59565b3480156103dd57600080fd5b5061021e6103ec366004611e22565b600a6020526000908152604090205460ff1681565b34801561040d57600080fd5b506102f561041c366004611e22565b610c74565b34801561042d57600080fd5b5060095461021e90610100900460ff1681565b34801561044c57600080fd5b5061027561045b366004611e22565b610cd6565b34801561046c57600080fd5b506102c2610ce8565b34801561048157600080fd5b506102f5610490366004611f85565b610dd2565b3480156104a157600080fd5b506102c2610e63565b3480156104b657600080fd5b506102c26104c5366004611e50565b610e99565b3480156104d657600080fd5b506007546001600160a01b0316610275565b3480156104f457600080fd5b5060095461021e9060ff1681565b34801561050e57600080fd5b50610248610efb565b34801561052357600080fd5b506102c2610532366004611fa2565b610f0a565b34801561054357600080fd5b506102c2610552366004612063565b610fce565b34801561056357600080fd5b506102c2610572366004611e91565b61100f565b34801561058357600080fd5b506102c26105923660046120ac565b611053565b3480156105a357600080fd5b506102f56105b2366004611f85565b600c6020526000908152604090205481565b3480156105d057600080fd5b506102486105df366004611e22565b611086565b3480156105f057600080fd5b5061021e6105ff36600461212c565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561063957600080fd5b506102c2610648366004611f85565b611153565b34801561065957600080fd5b506102c2610668366004612165565b6111eb565b60006001600160e01b031982166380ac58cd60e01b148061069e57506001600160e01b03198216635b5e139f60e01b145b806106b957506001600160e01b0319821663780e9d6360e01b145b806106d457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546106e9906121a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610715906121a7565b80156107625780601f1061073757610100808354040283529160200191610762565b820191906000526020600020905b81548152906001019060200180831161074557829003601f168201915b5050505050905090565b6000610779826000541190565b6107e05760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60088054610809906121a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610835906121a7565b80156108825780601f1061085757610100808354040283529160200191610882565b820191906000526020600020905b81548152906001019060200180831161086557829003601f168201915b505050505081565b600061089582610cd6565b9050806001600160a01b0316836001600160a01b0316036109035760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016107d7565b336001600160a01b038216148061091f575061091f81336105ff565b6109915760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016107d7565b61099c838383611490565b505050565b6007546001600160a01b031633146109cb5760405162461bcd60e51b81526004016107d7906121e1565b6009805460ff1916911515919091179055565b61099c8383836114ec565b60006109f483610dd2565b8210610a4d5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016107d7565b600080549080805b83811015610ae4576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610aa857805192505b876001600160a01b0316836001600160a01b031603610adb57868403610ad4575093506106d492505050565b6001909301925b50600101610a55565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016107d7565b6007546001600160a01b03163314610b6e5760405162461bcd60e51b81526004016107d7906121e1565b60005b82811015610bd15781600c6000868685818110610b9057610b90612216565b9050602002016020810190610ba59190611f85565b6001600160a01b0316815260208101919091526040016000205580610bc981612242565b915050610b71565b50505050565b6007546001600160a01b03163314610c015760405162461bcd60e51b81526004016107d7906121e1565b604051600090339047908381818185875af1925050503d8060008114610c43576040519150601f19603f3d011682016040523d82523d6000602084013e610c48565b606091505b5050905080610c5657600080fd5b50565b61099c83838360405180602001604052806000815250611053565b600080548210610cd25760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016107d7565b5090565b6000610ce1826117d1565b5192915050565b600054600954610100900460ff16610d385760405162461bcd60e51b8152602060048201526013602482015272436c61696d206973206e6f742061637469766560681b60448201526064016107d7565b336000908152600c602052604090205480610d895760405162461bcd60e51b8152602060048201526011602482015270125b9959db1a589b19481d1bc8135a5b9d607a1b60448201526064016107d7565b600d54610d96828461225b565b1115610db45760405162461bcd60e51b81526004016107d790612273565b610dbe33826118a8565b5050336000908152600c6020526040812055565b60006001600160a01b038216610e3e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016107d7565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b03163314610e8d5760405162461bcd60e51b81526004016107d7906121e1565b610e9760006118c2565b565b6007546001600160a01b03163314610ec35760405162461bcd60e51b81526004016107d7906121e1565b600054600d54610ed3838361225b565b1115610ef15760405162461bcd60e51b81526004016107d790612273565b61099c83836118a8565b6060600280546106e9906121a7565b336001600160a01b03831603610f625760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016107d7565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b03163314610ff85760405162461bcd60e51b81526004016107d7906121e1565b805161100b906008906020840190611cf4565b5050565b6007546001600160a01b031633146110395760405162461bcd60e51b81526004016107d7906121e1565b600980549115156101000261ff0019909216919091179055565b61105e8484846114ec565b61106a84848484611914565b610bd15760405162461bcd60e51b81526004016107d7906122a8565b6060611093826000541190565b6110f75760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107d7565b6000611101611a16565b90508051600003611121576040518060200160405280600081525061114c565b8061112b84611a25565b60405160200161113c9291906122fb565b6040516020818303038152906040525b9392505050565b6007546001600160a01b0316331461117d5760405162461bcd60e51b81526004016107d7906121e1565b6001600160a01b0381166111e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107d7565b610c56816118c2565b600054600d546111fb838361225b565b11156112195760405162461bcd60e51b81526004016107d790612273565b60095460ff166112615760405162461bcd60e51b8152602060048201526013602482015272436c61696d206973206e6f742061637469766560681b60448201526064016107d7565b816112ae5760405162461bcd60e51b815260206004820152601f60248201527f596f75206d75737420636c61696d206174206c65617374203120746f6b656e0060448201526064016107d7565b60005b828110156114855760095433906201000090046001600160a01b0316636352211e8686858181106112e4576112e4612216565b905060200201356040518263ffffffff1660e01b815260040161130991815260200190565b602060405180830381865afa158015611326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134a919061232a565b6001600160a01b0316146113a05760405162461bcd60e51b815260206004820152601e60248201527f596f7520646f206e6f74206f776e2074686573652044696e6f6d6f6e6b73000060448201526064016107d7565b600a60008585848181106113b6576113b6612216565b602090810292909201358352508101919091526040016000205460ff161561142e5760405162461bcd60e51b815260206004820152602560248201527f416e20696e70757474656420746f6b656e2077617320616c726561647920636c604482015264185a5b595960da1b60648201526084016107d7565b6001600a600086868581811061144657611446612216565b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550808061147d90612242565b9150506112b1565b5061099c33836118a8565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006114f7826117d1565b80519091506000906001600160a01b0316336001600160a01b0316148061152e5750336115238461076c565b6001600160a01b0316145b806115405750815161154090336105ff565b9050806115aa5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016107d7565b846001600160a01b031682600001516001600160a01b03161461161e5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016107d7565b6001600160a01b0384166116825760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107d7565b6116926000848460000151611490565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff16021790559086018083529120549091166117875761173a816000541190565b15611787578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60408051808201909152600080825260208201526117f0826000541190565b61184f5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016107d7565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561189e579392505050565b5060001901611851565b61100b828260405180602001604052806000815250611b26565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b15611a0a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611958903390899088908890600401612347565b6020604051808303816000875af1925050508015611993575060408051601f3d908101601f1916820190925261199091810190612384565b60015b6119f0573d8080156119c1576040519150601f19603f3d011682016040523d82523d6000602084013e6119c6565b606091505b5080516000036119e85760405162461bcd60e51b81526004016107d7906122a8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a0e565b5060015b949350505050565b6060600880546106e9906121a7565b606081600003611a4c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a765780611a6081612242565b9150611a6f9050600a836123b7565b9150611a50565b60008167ffffffffffffffff811115611a9157611a91611fd7565b6040519080825280601f01601f191660200182016040528015611abb576020820181803683370190505b5090505b8415611a0e57611ad06001836123cb565b9150611add600a866123e2565b611ae890603061225b565b60f81b818381518110611afd57611afd612216565b60200101906001600160f81b031916908160001a905350611b1f600a866123b7565b9450611abf565b61099c83838360016000546001600160a01b038516611b915760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107d7565b83600003611bf25760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b60648201526084016107d7565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b85811015611ceb5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315611cdf57611cc36000888488611914565b611cdf5760405162461bcd60e51b81526004016107d7906122a8565b60019182019101611c70565b506000556117ca565b828054611d00906121a7565b90600052602060002090601f016020900481019282611d225760008555611d68565b82601f10611d3b57805160ff1916838001178555611d68565b82800160010185558215611d68579182015b82811115611d68578251825591602001919060010190611d4d565b50610cd29291505b80821115610cd25760008155600101611d70565b6001600160e01b031981168114610c5657600080fd5b600060208284031215611dac57600080fd5b813561114c81611d84565b60005b83811015611dd2578181015183820152602001611dba565b83811115610bd15750506000910152565b60008151808452611dfb816020860160208601611db7565b601f01601f19169290920160200192915050565b60208152600061114c6020830184611de3565b600060208284031215611e3457600080fd5b5035919050565b6001600160a01b0381168114610c5657600080fd5b60008060408385031215611e6357600080fd5b8235611e6e81611e3b565b946020939093013593505050565b80358015158114611e8c57600080fd5b919050565b600060208284031215611ea357600080fd5b61114c82611e7c565b600080600060608486031215611ec157600080fd5b8335611ecc81611e3b565b92506020840135611edc81611e3b565b929592945050506040919091013590565b60008083601f840112611eff57600080fd5b50813567ffffffffffffffff811115611f1757600080fd5b6020830191508360208260051b8501011115611f3257600080fd5b9250929050565b600080600060408486031215611f4e57600080fd5b833567ffffffffffffffff811115611f6557600080fd5b611f7186828701611eed565b909790965060209590950135949350505050565b600060208284031215611f9757600080fd5b813561114c81611e3b565b60008060408385031215611fb557600080fd5b8235611fc081611e3b565b9150611fce60208401611e7c565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561200857612008611fd7565b604051601f8501601f19908116603f0116810190828211818310171561203057612030611fd7565b8160405280935085815286868601111561204957600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561207557600080fd5b813567ffffffffffffffff81111561208c57600080fd5b8201601f8101841361209d57600080fd5b611a0e84823560208401611fed565b600080600080608085870312156120c257600080fd5b84356120cd81611e3b565b935060208501356120dd81611e3b565b925060408501359150606085013567ffffffffffffffff81111561210057600080fd5b8501601f8101871361211157600080fd5b61212087823560208401611fed565b91505092959194509250565b6000806040838503121561213f57600080fd5b823561214a81611e3b565b9150602083013561215a81611e3b565b809150509250929050565b6000806020838503121561217857600080fd5b823567ffffffffffffffff81111561218f57600080fd5b61219b85828601611eed565b90969095509350505050565b600181811c908216806121bb57607f821691505b6020821081036121db57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016122545761225461222c565b5060010190565b6000821982111561226e5761226e61222c565b500190565b6020808252818101527f507572636861736520776f756c6420657863656564206d617820746f6b656e73604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6000835161230d818460208801611db7565b835190830190612321818360208801611db7565b01949350505050565b60006020828403121561233c57600080fd5b815161114c81611e3b565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061237a90830184611de3565b9695505050505050565b60006020828403121561239657600080fd5b815161114c81611d84565b634e487b7160e01b600052601260045260246000fd5b6000826123c6576123c66123a1565b500490565b6000828210156123dd576123dd61222c565b500390565b6000826123f1576123f16123a1565b50069056fea2646970667358221220df8d26e58e856f224c4b12d8a683fef82ccd12d43bbafb52a08ade48e19cae9464736f6c634300080d0033

Deployed Bytecode Sourcemap

53618:3228:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40355:372;;;;;;;;;;-1:-1:-1;40355:372:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;40355:372:0;;;;;;;;42241:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43803:214::-;;;;;;;;;;-1:-1:-1;43803:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;43803:214:0;1528:203:1;53700:30:0;;;;;;;;;;;;;:::i;43324:413::-;;;;;;;;;;-1:-1:-1;43324:413:0;;;;;:::i;:::-;;:::i;:::-;;55933:115;;;;;;;;;;-1:-1:-1;55933:115:0;;;;;:::i;:::-;;:::i;38612:100::-;;;;;;;;;;-1:-1:-1;38665:7:0;38692:12;38612:100;;;2688:25:1;;;2676:2;2661:18;38612:100:0;2542:177:1;44679:162:0;;;;;;;;;;-1:-1:-1;44679:162:0;;;;;:::i;:::-;;:::i;39276:1007::-;;;;;;;;;;-1:-1:-1;39276:1007:0;;;;;:::i;:::-;;:::i;54123:32::-;;;;;;;;;;;;;;;;56299:113;;;;;;;;;;-1:-1:-1;56299:113:0;;;;;:::i;:::-;56359:4;56383:21;;;:12;:21;;;;;;;;;56299:113;56085:187;;;;;;;;;;-1:-1:-1;56085:187:0;;;;;:::i;:::-;;:::i;56679:164::-;;;:::i;44912:177::-;;;;;;;;;;-1:-1:-1;44912:177:0;;;;;:::i;:::-;;:::i;53893:44::-;;;;;;;;;;-1:-1:-1;53893:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;38789:187;;;;;;;;;;-1:-1:-1;38789:187:0;;;;;:::i;:::-;;:::i;53807:41::-;;;;;;;;;;-1:-1:-1;53807:41:0;;;;;;;;;;;42050:124;;;;;;;;;;-1:-1:-1;42050:124:0;;;;;:::i;:::-;;:::i;54365:440::-;;;;;;;;;;;;;:::i;40791:221::-;;;;;;;;;;-1:-1:-1;40791:221:0;;;;;:::i;:::-;;:::i;13942:94::-;;;;;;;;;;;;;:::i;55542:233::-;;;;;;;;;;-1:-1:-1;55542:233:0;;;;;:::i;:::-;;:::i;13291:87::-;;;;;;;;;;-1:-1:-1;13364:6:0;;-1:-1:-1;;;;;13364:6:0;13291:87;;53760:40;;;;;;;;;;-1:-1:-1;53760:40:0;;;;;;;;42410:104;;;;;;;;;;;;;:::i;44089:288::-;;;;;;;;;;-1:-1:-1;44089:288:0;;;;;:::i;:::-;;:::i;56436:110::-;;;;;;;;;;-1:-1:-1;56436:110:0;;;;;:::i;:::-;;:::i;55808:117::-;;;;;;;;;;-1:-1:-1;55808:117:0;;;;;:::i;:::-;;:::i;45160:355::-;;;;;;;;;;-1:-1:-1;45160:355:0;;;;;:::i;:::-;;:::i;54048:50::-;;;;;;;;;;-1:-1:-1;54048:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;42585:335;;;;;;;;;;-1:-1:-1;42585:335:0;;;;;:::i;:::-;;:::i;44448:164::-;;;;;;;;;;-1:-1:-1;44448:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;44569:25:0;;;44545:4;44569:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;44448:164;14191:192;;;;;;;;;;-1:-1:-1;14191:192:0;;;;;:::i;:::-;;:::i;54813:721::-;;;;;;;;;;-1:-1:-1;54813:721:0;;;;;:::i;:::-;;:::i;40355:372::-;40457:4;-1:-1:-1;;;;;;40494:40:0;;-1:-1:-1;;;40494:40:0;;:105;;-1:-1:-1;;;;;;;40551:48:0;;-1:-1:-1;;;40551:48:0;40494:105;:172;;;-1:-1:-1;;;;;;;40616:50:0;;-1:-1:-1;;;40616:50:0;40494:172;:225;;;-1:-1:-1;;;;;;;;;;30852:40:0;;;40683:36;40474:245;40355:372;-1:-1:-1;;40355:372:0:o;42241:100::-;42295:13;42328:5;42321:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42241:100;:::o;43803:214::-;43871:7;43899:16;43907:7;45827:4;45861:12;-1:-1:-1;45851:22:0;45770:111;43899:16;43891:74;;;;-1:-1:-1;;;43891:74:0;;8086:2:1;43891:74:0;;;8068:21:1;8125:2;8105:18;;;8098:30;8164:34;8144:18;;;8137:62;-1:-1:-1;;;8215:18:1;;;8208:43;8268:19;;43891:74:0;;;;;;;;;-1:-1:-1;43985:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;43985:24:0;;43803:214::o;53700:30::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43324:413::-;43397:13;43413:24;43429:7;43413:15;:24::i;:::-;43397:40;;43462:5;-1:-1:-1;;;;;43456:11:0;:2;-1:-1:-1;;;;;43456:11:0;;43448:58;;;;-1:-1:-1;;;43448:58:0;;8500:2:1;43448:58:0;;;8482:21:1;8539:2;8519:18;;;8512:30;8578:34;8558:18;;;8551:62;-1:-1:-1;;;8629:18:1;;;8622:32;8671:19;;43448:58:0;8298:398:1;43448:58:0;12192:10;-1:-1:-1;;;;;43541:21:0;;;;:62;;-1:-1:-1;43566:37:0;43583:5;12192:10;44448:164;:::i;43566:37::-;43519:169;;;;-1:-1:-1;;;43519:169:0;;8903:2:1;43519:169:0;;;8885:21:1;8942:2;8922:18;;;8915:30;8981:34;8961:18;;;8954:62;9052:27;9032:18;;;9025:55;9097:19;;43519:169:0;8701:421:1;43519:169:0;43701:28;43710:2;43714:7;43723:5;43701:8;:28::i;:::-;43386:351;43324:413;;:::o;55933:115::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;;;;;;:::i;:::-;56010:20:::1;:30:::0;;-1:-1:-1;;56010:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55933:115::o;44679:162::-;44805:28;44815:4;44821:2;44825:7;44805:9;:28::i;39276:1007::-;39365:7;39401:16;39411:5;39401:9;:16::i;:::-;39393:5;:24;39385:71;;;;-1:-1:-1;;;39385:71:0;;9690:2:1;39385:71:0;;;9672:21:1;9729:2;9709:18;;;9702:30;9768:34;9748:18;;;9741:62;-1:-1:-1;;;9819:18:1;;;9812:32;9861:19;;39385:71:0;9488:398:1;39385:71:0;39467:22;38692:12;;;39467:22;;39730:466;39750:14;39746:1;:18;39730:466;;;39790:31;39824:14;;;:11;:14;;;;;;;;;39790:48;;;;;;;;;-1:-1:-1;;;;;39790:48:0;;;;;-1:-1:-1;;;39790:48:0;;;;;;;;;;;;39861:28;39857:111;;39934:14;;;-1:-1:-1;39857:111:0;40011:5;-1:-1:-1;;;;;39990:26:0;:17;-1:-1:-1;;;;;39990:26:0;;39986:195;;40060:5;40045:11;:20;40041:85;;-1:-1:-1;40101:1:0;-1:-1:-1;40094:8:0;;-1:-1:-1;;;40094:8:0;40041:85;40148:13;;;;;39986:195;-1:-1:-1;39766:3:0;;39730:466;;;-1:-1:-1;40219:56:0;;-1:-1:-1;;;40219:56:0;;10093:2:1;40219:56:0;;;10075:21:1;10132:2;10112:18;;;10105:30;10171:34;10151:18;;;10144:62;-1:-1:-1;;;10222:18:1;;;10215:44;10276:19;;40219:56:0;9891:410:1;56085:187:0;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;;;;;;:::i;:::-;56177:9:::1;56173:95;56188:21:::0;;::::1;56173:95;;;56256:7;56223:15;:30;56239:10;;56250:1;56239:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56223:30:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;56223:30:0;:40;56211:3;::::1;::::0;::::1;:::i;:::-;;;;56173:95;;;;56085:187:::0;;;:::o;56679:164::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;;;;;;:::i;:::-;56750:58:::1;::::0;56732:12:::1;::::0;56758:10:::1;::::0;56782:21:::1;::::0;56732:12;56750:58;56732:12;56750:58;56782:21;56758:10;56750:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56731:77;;;56827:7;56819:16;;;::::0;::::1;;56724:119;56679:164::o:0;44912:177::-;45042:39;45059:4;45065:2;45069:7;45042:39;;;;;;;;;;;;:16;:39::i;38789:187::-;38856:7;38692:12;;38884:5;:21;38876:69;;;;-1:-1:-1;;;38876:69:0;;11122:2:1;38876:69:0;;;11104:21:1;11161:2;11141:18;;;11134:30;11200:34;11180:18;;;11173:62;-1:-1:-1;;;11251:18:1;;;11244:33;11294:19;;38876:69:0;10920:399:1;38876:69:0;-1:-1:-1;38963:5:0;38789:187::o;42050:124::-;42114:7;42141:20;42153:7;42141:11;:20::i;:::-;:25;;42050:124;-1:-1:-1;;42050:124:0:o;54365:440::-;54412:10;38692:12;54457:21;;;;;;;54449:52;;;;-1:-1:-1;;;54449:52:0;;11526:2:1;54449:52:0;;;11508:21:1;11565:2;11545:18;;;11538:30;-1:-1:-1;;;11584:18:1;;;11577:49;11643:18;;54449:52:0;11324:343:1;54449:52:0;54552:10;54512:21;54536:27;;;:15;:27;;;;;;54582:17;54574:46;;;;-1:-1:-1;;;54574:46:0;;11874:2:1;54574:46:0;;;11856:21:1;11913:2;11893:18;;;11886:30;-1:-1:-1;;;11932:18:1;;;11925:47;11989:18;;54574:46:0;11672:341:1;54574:46:0;54661:10;;54639:18;54644:13;54639:2;:18;:::i;:::-;:32;;54631:77;;;;-1:-1:-1;;;54631:77:0;;;;;;;:::i;:::-;54719:36;54729:10;54741:13;54719:9;:36::i;:::-;-1:-1:-1;;54782:10:0;54796:1;54766:27;;;:15;:27;;;;;:31;54365:440::o;40791:221::-;40855:7;-1:-1:-1;;;;;40883:19:0;;40875:75;;;;-1:-1:-1;;;40875:75:0;;12714:2:1;40875:75:0;;;12696:21:1;12753:2;12733:18;;;12726:30;12792:34;12772:18;;;12765:62;-1:-1:-1;;;12843:18:1;;;12836:41;12894:19;;40875:75:0;12512:407:1;40875:75:0;-1:-1:-1;;;;;;40976:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;40976:27:0;;40791:221::o;13942:94::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;;;;;;:::i;:::-;14007:21:::1;14025:1;14007:9;:21::i;:::-;13942:94::o:0;55542:233::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;;;;;;:::i;:::-;55617:10:::1;38692:12:::0;55677:10:::1;::::0;55662:11:::1;55667:6:::0;38692:12;55662:11:::1;:::i;:::-;:25;;55654:70;;;;-1:-1:-1::0;;;55654:70:0::1;;;;;;;:::i;:::-;55736:21;55746:2;55750:6;55736:9;:21::i;42410:104::-:0;42466:13;42499:7;42492:14;;;;;:::i;44089:288::-;12192:10;-1:-1:-1;;;;;44184:24:0;;;44176:63;;;;-1:-1:-1;;;44176:63:0;;13126:2:1;44176:63:0;;;13108:21:1;13165:2;13145:18;;;13138:30;13204:28;13184:18;;;13177:56;13250:18;;44176:63:0;12924:350:1;44176:63:0;12192:10;44252:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;44252:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;44252:53:0;;;;;;;;;;44321:48;;540:41:1;;;44252:42:0;;12192:10;44321:48;;513:18:1;44321:48:0;;;;;;;44089:288;;:::o;56436:110::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;;;;;;:::i;:::-;56511:27;;::::1;::::0;:16:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;:::-;;56436:110:::0;:::o;55808:117::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;;;;;;:::i;:::-;55886:21:::1;:31:::0;;;::::1;;;;-1:-1:-1::0;;55886:31:0;;::::1;::::0;;;::::1;::::0;;55808:117::o;45160:355::-;45319:28;45329:4;45335:2;45339:7;45319:9;:28::i;:::-;45380:48;45403:4;45409:2;45413:7;45422:5;45380:22;:48::i;:::-;45358:149;;;;-1:-1:-1;;;45358:149:0;;;;;;;:::i;42585:335::-;42658:13;42692:16;42700:7;45827:4;45861:12;-1:-1:-1;45851:22:0;45770:111;42692:16;42684:76;;;;-1:-1:-1;;;42684:76:0;;13901:2:1;42684:76:0;;;13883:21:1;13940:2;13920:18;;;13913:30;13979:34;13959:18;;;13952:62;-1:-1:-1;;;14030:18:1;;;14023:45;14085:19;;42684:76:0;13699:411:1;42684:76:0;42773:21;42797:10;:8;:10::i;:::-;42773:34;;42831:7;42825:21;42850:1;42825:26;:87;;;;;;;;;;;;;;;;;42878:7;42887:18;:7;:16;:18::i;:::-;42861:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42825:87;42818:94;42585:335;-1:-1:-1;;;42585:335:0:o;14191:192::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14280:22:0;::::1;14272:73;;;::::0;-1:-1:-1;;;14272:73:0;;14792:2:1;14272:73:0::1;::::0;::::1;14774:21:1::0;14831:2;14811:18;;;14804:30;14870:34;14850:18;;;14843:62;-1:-1:-1;;;14921:18:1;;;14914:36;14967:19;;14272:73:0::1;14590:402:1::0;14272:73:0::1;14356:19;14366:8;14356:9;:19::i;54813:721::-:0;54889:10;38692:12;54961:10;;54934:23;54939:11;38692:12;54934:23;:::i;:::-;:37;;54926:82;;;;-1:-1:-1;;;54926:82:0;;;;;;;:::i;:::-;55027:20;;;;55019:51;;;;-1:-1:-1;;;55019:51:0;;11526:2:1;55019:51:0;;;11508:21:1;11565:2;11545:18;;;11538:30;-1:-1:-1;;;11584:18:1;;;11577:49;11643:18;;55019:51:0;11324:343:1;55019:51:0;55089:22;55081:65;;;;-1:-1:-1;;;55081:65:0;;15199:2:1;55081:65:0;;;15181:21:1;15238:2;15218:18;;;15211:30;15277:33;15257:18;;;15250:61;15328:18;;55081:65:0;14997:355:1;55081:65:0;55161:9;55157:315;55176:22;;;55157:315;;;55228:9;;55265:10;;55228:9;;;-1:-1:-1;;;;;55228:9:0;:17;55246:11;;55258:1;55246:14;;;;;;;:::i;:::-;;;;;;;55228:33;;;;;;;;;;;;;2688:25:1;;2676:2;2661:18;;2542:177;55228:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55228:47:0;;55220:89;;;;-1:-1:-1;;;55220:89:0;;15815:2:1;55220:89:0;;;15797:21:1;15854:2;15834:18;;;15827:30;15893:32;15873:18;;;15866:60;15943:18;;55220:89:0;15613:354:1;55220:89:0;55332:12;:28;55345:11;;55357:1;55345:14;;;;;;;:::i;:::-;;;;;;;;;;55332:28;;-1:-1:-1;55332:28:0;;;;;;;;-1:-1:-1;55332:28:0;;;;:37;55324:86;;;;-1:-1:-1;;;55324:86:0;;16174:2:1;55324:86:0;;;16156:21:1;16213:2;16193:18;;;16186:30;16252:34;16232:18;;;16225:62;-1:-1:-1;;;16303:18:1;;;16296:35;16348:19;;55324:86:0;15972:401:1;55324:86:0;55456:4;55425:12;:28;55438:11;;55450:1;55438:14;;;;;;;:::i;:::-;;;;;;;55425:28;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;55200:3;;;;;:::i;:::-;;;;55157:315;;;-1:-1:-1;55482:41:0;55492:10;55504:11;55482:9;:41::i;50690:196::-;50805:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;50805:29:0;-1:-1:-1;;;;;50805:29:0;;;;;;;;;50850:28;;50805:24;;50850:28;;;;;;;50690:196;;;:::o;48570:2002::-;48685:35;48723:20;48735:7;48723:11;:20::i;:::-;48798:18;;48685:58;;-1:-1:-1;48756:22:0;;-1:-1:-1;;;;;48782:34:0;12192:10;-1:-1:-1;;;;;48782:34:0;;:87;;;-1:-1:-1;12192:10:0;48833:20;48845:7;48833:11;:20::i;:::-;-1:-1:-1;;;;;48833:36:0;;48782:87;:154;;;-1:-1:-1;48903:18:0;;48886:50;;12192:10;44448:164;:::i;48886:50::-;48756:181;;48958:17;48950:80;;;;-1:-1:-1;;;48950:80:0;;16580:2:1;48950:80:0;;;16562:21:1;16619:2;16599:18;;;16592:30;16658:34;16638:18;;;16631:62;-1:-1:-1;;;16709:18:1;;;16702:48;16767:19;;48950:80:0;16378:414:1;48950:80:0;49073:4;-1:-1:-1;;;;;49051:26:0;:13;:18;;;-1:-1:-1;;;;;49051:26:0;;49043:77;;;;-1:-1:-1;;;49043:77:0;;16999:2:1;49043:77:0;;;16981:21:1;17038:2;17018:18;;;17011:30;17077:34;17057:18;;;17050:62;-1:-1:-1;;;17128:18:1;;;17121:36;17174:19;;49043:77:0;16797:402:1;49043:77:0;-1:-1:-1;;;;;49139:16:0;;49131:66;;;;-1:-1:-1;;;49131:66:0;;17406:2:1;49131:66:0;;;17388:21:1;17445:2;17425:18;;;17418:30;17484:34;17464:18;;;17457:62;-1:-1:-1;;;17535:18:1;;;17528:35;17580:19;;49131:66:0;17204:401:1;49131:66:0;49318:49;49335:1;49339:7;49348:13;:18;;;49318:8;:49::i;:::-;-1:-1:-1;;;;;49663:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;49663:31:0;;;-1:-1:-1;;;;;49663:31:0;;;-1:-1:-1;;49663:31:0;;;;;;;49709:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;49709:29:0;;;;;;;;;;;;;49755:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;49800:61:0;;;;-1:-1:-1;;;49845:15:0;49800:61;;;;;;50135:11;;;50165:24;;;;;:29;50135:11;;50165:29;50161:295;;50233:20;50241:11;45827:4;45861:12;-1:-1:-1;45851:22:0;45770:111;50233:20;50229:212;;;50310:18;;;50278:24;;;:11;:24;;;;;;;;:50;;50393:28;;;;50351:70;;-1:-1:-1;;;50351:70:0;-1:-1:-1;;;;;;50351:70:0;;;-1:-1:-1;;;;;50278:50:0;;;50351:70;;;;;;;50229:212;49638:829;50503:7;50499:2;-1:-1:-1;;;;;50484:27:0;50493:4;-1:-1:-1;;;;;50484:27:0;;;;;;;;;;;50522:42;48674:1898;;48570:2002;;;:::o;41451:537::-;-1:-1:-1;;;;;;;;;;;;;;;;;41554:16:0;41562:7;45827:4;45861:12;-1:-1:-1;45851:22:0;45770:111;41554:16;41546:71;;;;-1:-1:-1;;;41546:71:0;;17812:2:1;41546:71:0;;;17794:21:1;17851:2;17831:18;;;17824:30;17890:34;17870:18;;;17863:62;-1:-1:-1;;;17941:18:1;;;17934:40;17991:19;;41546:71:0;17610:406:1;41546:71:0;41675:7;41655:245;41722:31;41756:17;;;:11;:17;;;;;;;;;41722:51;;;;;;;;;-1:-1:-1;;;;;41722:51:0;;;;;-1:-1:-1;;;41722:51:0;;;;;;;;;;;;41796:28;41792:93;;41856:9;41451:537;-1:-1:-1;;;41451:537:0:o;41792:93::-;-1:-1:-1;;;41695:6:0;41655:245;;45889:104;45958:27;45968:2;45972:8;45958:27;;;;;;;;;;;;:9;:27::i;14391:173::-;14466:6;;;-1:-1:-1;;;;;14483:17:0;;;-1:-1:-1;;;;;;14483:17:0;;;;;;;14516:40;;14466:6;;;14483:17;14466:6;;14516:40;;14447:16;;14516:40;14436:128;14391:173;:::o;51451:804::-;51606:4;-1:-1:-1;;;;;51627:13:0;;15628:20;15676:8;51623:625;;51663:72;;-1:-1:-1;;;51663:72:0;;-1:-1:-1;;;;;51663:36:0;;;;;:72;;12192:10;;51714:4;;51720:7;;51729:5;;51663:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51663:72:0;;;;;;;;-1:-1:-1;;51663:72:0;;;;;;;;;;;;:::i;:::-;;;51659:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51909:6;:13;51926:1;51909:18;51905:273;;51952:61;;-1:-1:-1;;;51952:61:0;;;;;;;:::i;51905:273::-;52128:6;52122:13;52113:6;52109:2;52105:15;52098:38;51659:534;-1:-1:-1;;;;;;51786:55:0;-1:-1:-1;;;51786:55:0;;-1:-1:-1;51779:62:0;;51623:625;-1:-1:-1;52232:4:0;51623:625;51451:804;;;;;;:::o;56554:117::-;56614:13;56647:16;56640:23;;;;;:::i;286:723::-;342:13;563:5;572:1;563:10;559:53;;-1:-1:-1;;590:10:0;;;;;;;;;;;;-1:-1:-1;;;590:10:0;;;;;286:723::o;559:53::-;637:5;622:12;678:78;685:9;;678:78;;711:8;;;;:::i;:::-;;-1:-1:-1;734:10:0;;-1:-1:-1;742:2:0;734:10;;:::i;:::-;;;678:78;;;766:19;798:6;788:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;788:17:0;;766:39;;816:154;823:10;;816:154;;850:11;860:1;850:11;;:::i;:::-;;-1:-1:-1;919:10:0;927:2;919:5;:10;:::i;:::-;906:24;;:2;:24;:::i;:::-;893:39;;876:6;883;876:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;876:56:0;;;;;;;;-1:-1:-1;947:11:0;956:2;947:11;;:::i;:::-;;;816:154;;46356:163;46479:32;46485:2;46489:8;46499:5;46506:4;46917:20;46940:12;-1:-1:-1;;;;;46971:16:0;;46963:62;;;;-1:-1:-1;;;46963:62:0;;19891:2:1;46963:62:0;;;19873:21:1;19930:2;19910:18;;;19903:30;19969:34;19949:18;;;19942:62;-1:-1:-1;;;20020:18:1;;;20013:31;20061:19;;46963:62:0;19689:397:1;46963:62:0;47044:8;47056:1;47044:13;47036:66;;;;-1:-1:-1;;;47036:66:0;;20293:2:1;47036:66:0;;;20275:21:1;20332:2;20312:18;;;20305:30;20371:34;20351:18;;;20344:62;-1:-1:-1;;;20422:18:1;;;20415:38;20470:19;;47036:66:0;20091:404:1;47036:66:0;-1:-1:-1;;;;;47454:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;47454:45:0;;-1:-1:-1;;;;;47454:45:0;;;;;;;;;;47514:50;;;;;;;;;;;;;;47581:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;47631:66:0;;;;-1:-1:-1;;;47681:15:0;47631:66;;;;;;;47581:25;;47766:415;47786:8;47782:1;:12;47766:415;;;47825:38;;47850:12;;-1:-1:-1;;;;;47825:38:0;;;47842:1;;47825:38;;47842:1;;47825:38;47886:4;47882:249;;;47949:59;47980:1;47984:2;47988:12;48002:5;47949:22;:59::i;:::-;47915:196;;;;-1:-1:-1;;;47915:196:0;;;;;;;:::i;:::-;48151:14;;;;;47796:3;47766:415;;;-1:-1:-1;48197:12:0;:27;48248:60;56085:187;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2192:160::-;2257:20;;2313:13;;2306:21;2296:32;;2286:60;;2342:1;2339;2332:12;2286:60;2192:160;;;:::o;2357:180::-;2413:6;2466:2;2454:9;2445:7;2441:23;2437:32;2434:52;;;2482:1;2479;2472:12;2434:52;2505:26;2521:9;2505:26;:::i;2724:456::-;2801:6;2809;2817;2870:2;2858:9;2849:7;2845:23;2841:32;2838:52;;;2886:1;2883;2876:12;2838:52;2925:9;2912:23;2944:31;2969:5;2944:31;:::i;:::-;2994:5;-1:-1:-1;3051:2:1;3036:18;;3023:32;3064:33;3023:32;3064:33;:::i;:::-;2724:456;;3116:7;;-1:-1:-1;;;3170:2:1;3155:18;;;;3142:32;;2724:456::o;3185:367::-;3248:8;3258:6;3312:3;3305:4;3297:6;3293:17;3289:27;3279:55;;3330:1;3327;3320:12;3279:55;-1:-1:-1;3353:20:1;;3396:18;3385:30;;3382:50;;;3428:1;3425;3418:12;3382:50;3465:4;3457:6;3453:17;3441:29;;3525:3;3518:4;3508:6;3505:1;3501:14;3493:6;3489:27;3485:38;3482:47;3479:67;;;3542:1;3539;3532:12;3479:67;3185:367;;;;;:::o;3557:505::-;3652:6;3660;3668;3721:2;3709:9;3700:7;3696:23;3692:32;3689:52;;;3737:1;3734;3727:12;3689:52;3777:9;3764:23;3810:18;3802:6;3799:30;3796:50;;;3842:1;3839;3832:12;3796:50;3881:70;3943:7;3934:6;3923:9;3919:22;3881:70;:::i;:::-;3970:8;;3855:96;;-1:-1:-1;4052:2:1;4037:18;;;;4024:32;;3557:505;-1:-1:-1;;;;3557:505:1:o;4067:247::-;4126:6;4179:2;4167:9;4158:7;4154:23;4150:32;4147:52;;;4195:1;4192;4185:12;4147:52;4234:9;4221:23;4253:31;4278:5;4253:31;:::i;4319:315::-;4384:6;4392;4445:2;4433:9;4424:7;4420:23;4416:32;4413:52;;;4461:1;4458;4451:12;4413:52;4500:9;4487:23;4519:31;4544:5;4519:31;:::i;:::-;4569:5;-1:-1:-1;4593:35:1;4624:2;4609:18;;4593:35;:::i;:::-;4583:45;;4319:315;;;;;:::o;4639:127::-;4700:10;4695:3;4691:20;4688:1;4681:31;4731:4;4728:1;4721:15;4755:4;4752:1;4745:15;4771:632;4836:5;4866:18;4907:2;4899:6;4896:14;4893:40;;;4913:18;;:::i;:::-;4988:2;4982:9;4956:2;5042:15;;-1:-1:-1;;5038:24:1;;;5064:2;5034:33;5030:42;5018:55;;;5088:18;;;5108:22;;;5085:46;5082:72;;;5134:18;;:::i;:::-;5174:10;5170:2;5163:22;5203:6;5194:15;;5233:6;5225;5218:22;5273:3;5264:6;5259:3;5255:16;5252:25;5249:45;;;5290:1;5287;5280:12;5249:45;5340:6;5335:3;5328:4;5320:6;5316:17;5303:44;5395:1;5388:4;5379:6;5371;5367:19;5363:30;5356:41;;;;4771:632;;;;;:::o;5408:451::-;5477:6;5530:2;5518:9;5509:7;5505:23;5501:32;5498:52;;;5546:1;5543;5536:12;5498:52;5586:9;5573:23;5619:18;5611:6;5608:30;5605:50;;;5651:1;5648;5641:12;5605:50;5674:22;;5727:4;5719:13;;5715:27;-1:-1:-1;5705:55:1;;5756:1;5753;5746:12;5705:55;5779:74;5845:7;5840:2;5827:16;5822:2;5818;5814:11;5779:74;:::i;5864:795::-;5959:6;5967;5975;5983;6036:3;6024:9;6015:7;6011:23;6007:33;6004:53;;;6053:1;6050;6043:12;6004:53;6092:9;6079:23;6111:31;6136:5;6111:31;:::i;:::-;6161:5;-1:-1:-1;6218:2:1;6203:18;;6190:32;6231:33;6190:32;6231:33;:::i;:::-;6283:7;-1:-1:-1;6337:2:1;6322:18;;6309:32;;-1:-1:-1;6392:2:1;6377:18;;6364:32;6419:18;6408:30;;6405:50;;;6451:1;6448;6441:12;6405:50;6474:22;;6527:4;6519:13;;6515:27;-1:-1:-1;6505:55:1;;6556:1;6553;6546:12;6505:55;6579:74;6645:7;6640:2;6627:16;6622:2;6618;6614:11;6579:74;:::i;:::-;6569:84;;;5864:795;;;;;;;:::o;6664:388::-;6732:6;6740;6793:2;6781:9;6772:7;6768:23;6764:32;6761:52;;;6809:1;6806;6799:12;6761:52;6848:9;6835:23;6867:31;6892:5;6867:31;:::i;:::-;6917:5;-1:-1:-1;6974:2:1;6959:18;;6946:32;6987:33;6946:32;6987:33;:::i;:::-;7039:7;7029:17;;;6664:388;;;;;:::o;7057:437::-;7143:6;7151;7204:2;7192:9;7183:7;7179:23;7175:32;7172:52;;;7220:1;7217;7210:12;7172:52;7260:9;7247:23;7293:18;7285:6;7282:30;7279:50;;;7325:1;7322;7315:12;7279:50;7364:70;7426:7;7417:6;7406:9;7402:22;7364:70;:::i;:::-;7453:8;;7338:96;;-1:-1:-1;7057:437:1;-1:-1:-1;;;;7057:437:1:o;7499:380::-;7578:1;7574:12;;;;7621;;;7642:61;;7696:4;7688:6;7684:17;7674:27;;7642:61;7749:2;7741:6;7738:14;7718:18;7715:38;7712:161;;7795:10;7790:3;7786:20;7783:1;7776:31;7830:4;7827:1;7820:15;7858:4;7855:1;7848:15;7712:161;;7499:380;;;:::o;9127:356::-;9329:2;9311:21;;;9348:18;;;9341:30;9407:34;9402:2;9387:18;;9380:62;9474:2;9459:18;;9127:356::o;10306:127::-;10367:10;10362:3;10358:20;10355:1;10348:31;10398:4;10395:1;10388:15;10422:4;10419:1;10412:15;10438:127;10499:10;10494:3;10490:20;10487:1;10480:31;10530:4;10527:1;10520:15;10554:4;10551:1;10544:15;10570:135;10609:3;10630:17;;;10627:43;;10650:18;;:::i;:::-;-1:-1:-1;10697:1:1;10686:13;;10570:135::o;12018:128::-;12058:3;12089:1;12085:6;12082:1;12079:13;12076:39;;;12095:18;;:::i;:::-;-1:-1:-1;12131:9:1;;12018:128::o;12151:356::-;12353:2;12335:21;;;12372:18;;;12365:30;12431:34;12426:2;12411:18;;12404:62;12498:2;12483:18;;12151:356::o;13279:415::-;13481:2;13463:21;;;13520:2;13500:18;;;13493:30;13559:34;13554:2;13539:18;;13532:62;-1:-1:-1;;;13625:2:1;13610:18;;13603:49;13684:3;13669:19;;13279:415::o;14115:470::-;14294:3;14332:6;14326:13;14348:53;14394:6;14389:3;14382:4;14374:6;14370:17;14348:53;:::i;:::-;14464:13;;14423:16;;;;14486:57;14464:13;14423:16;14520:4;14508:17;;14486:57;:::i;:::-;14559:20;;14115:470;-1:-1:-1;;;;14115:470:1:o;15357:251::-;15427:6;15480:2;15468:9;15459:7;15455:23;15451:32;15448:52;;;15496:1;15493;15486:12;15448:52;15528:9;15522:16;15547:31;15572:5;15547:31;:::i;18437:489::-;-1:-1:-1;;;;;18706:15:1;;;18688:34;;18758:15;;18753:2;18738:18;;18731:43;18805:2;18790:18;;18783:34;;;18853:3;18848:2;18833:18;;18826:31;;;18631:4;;18874:46;;18900:19;;18892:6;18874:46;:::i;:::-;18866:54;18437:489;-1:-1:-1;;;;;;18437:489:1:o;18931:249::-;19000:6;19053:2;19041:9;19032:7;19028:23;19024:32;19021:52;;;19069:1;19066;19059:12;19021:52;19101:9;19095:16;19120:30;19144:5;19120:30;:::i;19185:127::-;19246:10;19241:3;19237:20;19234:1;19227:31;19277:4;19274:1;19267:15;19301:4;19298:1;19291:15;19317:120;19357:1;19383;19373:35;;19388:18;;:::i;:::-;-1:-1:-1;19422:9:1;;19317:120::o;19442:125::-;19482:4;19510:1;19507;19504:8;19501:34;;;19515:18;;:::i;:::-;-1:-1:-1;19552:9:1;;19442:125::o;19572:112::-;19604:1;19630;19620:35;;19635:18;;:::i;:::-;-1:-1:-1;19669:9:1;;19572:112::o

Swarm Source

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