ETH Price: $3,047.16 (+2.48%)
Gas: 4 Gwei

Token

PlanetMan (PlanetMan)
 

Overview

Max Total Supply

1,066 PlanetMan

Holders

883

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
kenken777.eth
Balance
1 PlanetMan
0x150b7e512654167f92D27B3f0F5fb14F131184EA
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:
PlanetMan

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-30
*/

//File: fs://c12714761c8944bd80e2bf619fc588ca/NFT/Opensea/IOperatorFilterRegistry.sol

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}//File: fs://c12714761c8944bd80e2bf619fc588ca/NFT/Opensea/OperatorFilterer.sol

pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}//File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol

// OpenZeppelin Contracts (last updated v4.9.2) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofLen = proof.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            require(proofPos == proofLen, "MerkleProof: invalid multiproof");
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofLen = proof.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            require(proofPos == proofLen, "MerkleProof: invalid multiproof");
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}
//File: @openzeppelin/contracts/utils/math/SignedMath.sol

// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}
//File: @openzeppelin/contracts/utils/math/Math.sol

// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}
//File: @openzeppelin/contracts/utils/Strings.sol

// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)

pragma solidity ^0.8.0;



/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return keccak256(bytes(a)) == keccak256(bytes(b));
    }
}
//File: @openzeppelin/contracts/utils/Context.sol

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

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
//File: @openzeppelin/contracts/utils/Address.sol

// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}
//File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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;

    /**
     * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);
}
//File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

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

pragma solidity ^0.8.0;


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

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

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

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

pragma solidity ^0.8.0;


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

// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(
        uint256 tokenId,
        uint256 salePrice
    ) external view returns (address receiver, uint256 royaltyAmount);
}
//File: fs://c12714761c8944bd80e2bf619fc588ca/NFT/Opensea/DefaultOperatorFilterer.sol

pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}//File: @openzeppelin/contracts/token/common/ERC2981.sol

// OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}
//File: @openzeppelin/contracts/access/Ownable.sol

// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

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

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

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

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

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

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

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

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

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

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}

    /**
     * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
     *
     * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
     * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
     * that `ownerOf(tokenId)` is `a`.
     */
    // solhint-disable-next-line func-name-mixedcase
    function __unsafe_increaseBalance(address account, uint256 amount) internal {
        _balances[account] += amount;
    }
}
//File: fs://c12714761c8944bd80e2bf619fc588ca/NFT/PlanetMan.sol

pragma solidity ^0.8.18;







contract PlanetMan is ERC721, Ownable, ERC2981, DefaultOperatorFilterer {

    constructor(
        string memory _baseURI,
        address receiver,
        uint96 feeNumerator
    ) ERC721("PlanetMan", "PlanetMan") {
        tokenIdByRarity[0] = 7000;
        tokenIdByRarity[1] = 2000;
        tokenIdByRarity[2] = 500;
        tokenIdByRarity[3] = 50;
        tokenIdByRarity[4] = 0;
        baseURI = _baseURI;
        _setDefaultRoyalty(receiver, feeNumerator);
    }

/** Metadata of PlanetMan **/
    string public baseURI;

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

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "PlanetMan: Token not exist.");
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, Strings.toString(tokenId), ".json")) : "";
    }

/** Free Mint Whitelist **/
    bytes32 public merkleRoot;

    function setWhitelist(bytes32 _merkleRoot) public onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function verify(address sender, uint256 _rarity, bytes32[] calldata merkleProof) public view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(sender, _rarity));
        return MerkleProof.verify(merkleProof, merkleRoot, leaf);
    }

/** Mint **/
    /* Status */
    bool public Open;

    function setOpen(bool _Open) public onlyOwner {
        Open = _Open;
    }

    /* Quantity */
    uint256 public totalSupply;

    uint256 public immutable Max = 10000;

    uint256[] public maxRarity  = [3000, 5000, 1500, 450, 50];

    uint256[] public maxPublic  = [3000, 4850, 1420, 435, 45];

    uint256[] public maxAirdrop = [   0,  150,   50,   0,  0];

    uint256[] public maxReserve = [   0,    0,   30,  15,  5];

    mapping (uint256 => uint256) public numberMinted;    /* Quantity minted for every rarity */

    mapping (uint256 => uint256) public numberAirdroped; /* Quantity airdroped for every rarity */

    mapping (uint256 => uint256) public numberReserved;  /* Quantity reserved for every rarity */

    /* Price */
    uint256[] public Price = [0 ether, 0.02 ether, 0.08 ether, 0.2 ether, 0.5 ether];

    /* Rarity */
    mapping (uint256 => uint256) public tokenIdByRarity; /* Track minting progress of different rarity */

    mapping (uint256 => uint256) private rarity; /* Mapping tokenId to Rarity */

    function Rarity(uint256 tokenId) public view returns (uint256) {
        require(_exists(tokenId), "PlanetMan: Token not exist.");
        return rarity[tokenId];
    }

    /* Mint Limit */
    mapping (address => mapping(uint256 => bool)) public alreadyMinted;

    event mintRecord(address indexed owner, uint256 indexed tokenId, uint256 indexed time);

    /* Public Mint */
    function Mint(address owner, uint256 _rarity, bytes32[] calldata merkleProof) public payable {
        require(Open, "PlanetMan: Mint is closed.");
        require(tx.origin == msg.sender, "PlanetMan: Contracts are not allowed.");
        require(_rarity < 5, "PlanetMan: Incorrect rarity inputs.");
        require(!alreadyMinted[owner][_rarity], "PlanetMan: Limit 1 per rarity.");
        require(totalSupply < Max, "PlanetMan: Exceed the max supply.");
        require(numberMinted[_rarity] < maxPublic[_rarity], "PlanetMan: Exceed the public mint limit of that rarity.");
        uint256 _Price = Price[_rarity];
        if (!verify(owner, _rarity, merkleProof)) {
            require(msg.value >= _Price, "PlanetMan: Not enough payment.");
        }
        tokenIdByRarity[_rarity] ++;
        uint256 tokenId = tokenIdByRarity[_rarity];

        _safeMint(owner, tokenId);

        numberMinted[_rarity] ++;
        totalSupply ++;
        rarity[tokenId] = _rarity;
        alreadyMinted[owner][_rarity] = true;

        emit mintRecord(owner, tokenId, block.timestamp);
    }

    /* Airdrop Mint */
    function Airdrop(address owner, uint256 _rarity) public onlyOwner {
        require(_rarity < 5, "PlanetMan: Incorrect rarity inputs.");
        require(totalSupply < Max, "PlanetMan: Exceed the max supply.");
        require(numberAirdroped[_rarity] < maxAirdrop[_rarity], "PlanetMan: Exceed the airdrop limit of that rarity.");
        tokenIdByRarity[_rarity] ++;
        uint256 tokenId = tokenIdByRarity[_rarity];

        _safeMint(owner, tokenId);

        numberAirdroped[_rarity] ++;
        totalSupply ++;
        rarity[tokenId] = _rarity;

        emit mintRecord(owner, tokenId, block.timestamp);
    }

    /* Reserve Mint */
    function Reserve(address _reserve, uint256 _rarity) public onlyOwner {
        require(_rarity < 5, "PlanetMan: Incorrect rarity inputs.");
        require(numberReserved[_rarity] < maxReserve[_rarity], "PlanetMan: Exceed the reserve limit of that rarity.");
        require(totalSupply < Max, "PlanetMan: Exceed the max supply.");
        tokenIdByRarity[_rarity] ++;
        uint256 tokenId = tokenIdByRarity[_rarity];

        _safeMint(_reserve, tokenId);
        
        numberReserved[_rarity] ++;
        totalSupply ++;
        rarity[tokenId] = _rarity;

        emit mintRecord(_reserve, tokenId, block.timestamp);
    }

/** Binding Tokens With Wallet Address **/
    mapping (address => uint256[]) public wallet_token;

    function getAllTokens(address owner) public view returns (uint256[] memory) {
        return wallet_token[owner];
    }

    function addToken(address user, uint256 tokenId) internal {
        wallet_token[user].push(tokenId);
    }

    function removeToken(address user, uint256 tokenId) internal {
        uint256[] storage token = wallet_token[user];
        for (uint256 i=0; i<token.length; i++) {
            if(token[i] == tokenId) {
                token[i] = token[token.length - 1];
                token.pop();
                break;
            }
        }
    }

    function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);
        for (uint256 i=0; i<batchSize; i++) {
            uint256 tokenId = firstTokenId + i;
            if (from != address(0)) {
                removeToken(from, tokenId);
            }
            if (to != address(0)) {
                addToken(to, tokenId);
            }
        }
    }

/** Royalty **/
    function setRoyaltyInfo(address receiver, uint96 feeNumerator) external onlyOwner {
        _setDefaultRoyalty(receiver, feeNumerator);
    }

    function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) external onlyOwner {
        _setTokenRoyalty(tokenId, receiver, feeNumerator);
    }

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

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

/** Withdraw **/
    function Withdraw(address recipient) public payable onlyOwner {
        payable(recipient).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"time","type":"uint256"}],"name":"mintRecord","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_rarity","type":"uint256"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Max","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_rarity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Rarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reserve","type":"address"},{"internalType":"uint256","name":"_rarity","type":"uint256"}],"name":"Reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"Withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"alreadyMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getAllTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxAirdrop","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxRarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"numberAirdroped","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"numberReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_Open","type":"bool"}],"name":"setOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setWhitelist","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":"","type":"uint256"}],"name":"tokenIdByRarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"_rarity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"wallet_token","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

612710608052610140604052610bb860a090815261138860c0526105dc60e0526101c2610100526032610120526200003c90600d906005620005a0565b506040805160a081018252610bb881526112f2602082015261058c918101919091526101b36060820152602d60808201526200007d90600e906005620005a0565b506040805160a081018252600080825260966020830152603292820192909252606081018290526080810191909152620000bc90600f906005620005f6565b506040805160a08101825260008082526020820152601e91810191909152600f6060820152600560808201819052620000f891601091620005f6565b506040805160a0810182526000815266470de4df820000602082015267011c37937e080000918101919091526702c68af0bb14000060608201526706f05b59d3b2000060808201526200015090601490600562000639565b503480156200015e57600080fd5b5060405162003fee38038062003fee8339810160408190526200018191620006e4565b733cc6cdda760b79bafa08df41ecfa224f810dceb6600160405180604001604052806009815260200168283630b732ba26b0b760b91b81525060405180604001604052806009815260200168283630b732ba26b0b760b91b8152508160009081620001ed91906200086d565b506001620001fc82826200086d565b50505062000219620002136200044560201b60201c565b62000449565b6daaeb6d7670e522a718067333cd4e3b156200035e578015620002ac57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200028d57600080fd5b505af1158015620002a2573d6000803e3d6000fd5b505050506200035e565b6001600160a01b03821615620002fd5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000272565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200034457600080fd5b505af115801562000359573d6000803e3d6000fd5b505050505b50506015602052611b587fa31547ce6245cdb9ecea19cf8c7eb9f5974025bb4075011409251ae855b30aed556107d07f27739e4bb5e6f8b5e4b57a047dca8767cc9b982a011081e086cbb0dfa9de818d556101f47f07d4ff730d9753101d832555708a37d38c2c45fce8cacaefc99f06074e93fe0b5560327fb3a65e8276bd33b3e4f7d6081ebd9899187264822358758dca2e2bc37b2a9c2755600460009081527f8191f4eb6b8bafbfe9a5389c8d07d7f5fd81137a7ee653fc4358269845ee1d2e5560096200042f84826200086d565b506200043c82826200049b565b50505062000939565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b03821611156200050f5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620005675760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640162000506565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600755565b828054828255906000526020600020908101928215620005e4579160200282015b82811115620005e4578251829061ffff16905591602001919060010190620005c1565b50620005f292915062000682565b5090565b828054828255906000526020600020908101928215620005e4579160200282015b82811115620005e4578251829060ff1690559160200191906001019062000617565b828054828255906000526020600020908101928215620005e4579160200282015b82811115620005e457825182906001600160401b03169055916020019190600101906200065a565b5b80821115620005f2576000815560010162000683565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b0381168114620006c757600080fd5b919050565b80516001600160601b0381168114620006c757600080fd5b600080600060608486031215620006fa57600080fd5b83516001600160401b03808211156200071257600080fd5b818601915086601f8301126200072757600080fd5b8151818111156200073c576200073c62000699565b604051601f8201601f19908116603f0116810190838211818310171562000767576200076762000699565b816040528281526020935089848487010111156200078457600080fd5b600091505b82821015620007a8578482018401518183018501529083019062000789565b6000848483010152809750505050620007c3818701620006af565b93505050620007d560408501620006cc565b90509250925092565b600181811c90821680620007f357607f821691505b6020821081036200081457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200086857600081815260208120601f850160051c81016020861015620008435750805b601f850160051c820191505b8181101562000864578281556001016200084f565b5050505b505050565b81516001600160401b0381111562000889576200088962000699565b620008a1816200089a8454620007de565b846200081a565b602080601f831160018114620008d95760008415620008c05750858301515b600019600386901b1c1916600185901b17855562000864565b600085815260208120601f198616915b828110156200090a57888601518255948401946001909101908401620008e9565b5085821015620009295787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6080516136846200096a6000396000818161078401528181610b290152818161137301526117db01526136846000f3fe6080604052600436106102fd5760003560e01c806363f32f631161018f578063a0f82817116100e1578063de8f42781161008a578063f2fde38b11610064578063f2fde38b146108f6578063f676115114610916578063fef569011461092957600080fd5b8063de8f427814610853578063e985e9c514610880578063ec2db2a3146108c957600080fd5b8063b88d4fde116100bb578063b88d4fde146107f3578063c0d757a714610813578063c87b56dd1461083357600080fd5b8063a0f8281714610772578063a22cb465146107a6578063a55a3d0f146107c657600080fd5b80638b023075116101435780638da5cb5b1161011d5780638da5cb5b1461071f57806394a214ae1461073d57806395d89b411461075d57600080fd5b80638b023075146106bf5780638be0861e146106df5780638c32c568146106ff57600080fd5b80636fdca5e0116101745780636fdca5e01461066a57806370a082311461068a578063715018a6146106aa57600080fd5b806363f32f63146106355780636c0360eb1461065557600080fd5b80632eb4a7ab116102535780635944c753116101fc5780636089fa44116101d65780636089fa44146105d557806361c8427c146105f55780636352211e1461061557600080fd5b80635944c7531461057b57806359ebeb901461059b5780635aef2174146105b557600080fd5b8063440bc7f31161022d578063440bc7f31461051b578063441cb3c21461053b57806355f804b31461055b57600080fd5b80632eb4a7ab146104c357806341f43434146104d957806342842e0e146104fb57600080fd5b8063081812fc116102b557806318160ddd1161028f57806318160ddd1461044e57806323b872dd146104645780632a55205a1461048457600080fd5b8063081812fc146103c9578063095ea7b314610401578063178b6de61461042157600080fd5b806302fa7c47116102e657806302fa7c471461037257806303aaed7b1461039457806306fdde03146103a757600080fd5b8063018a20281461030257806301ffc9a714610342575b600080fd5b34801561030e57600080fd5b5061032f61031d366004612e83565b60116020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561034e57600080fd5b5061036261035d366004612eb2565b610964565b6040519015158152602001610339565b34801561037e57600080fd5b5061039261038d366004612f07565b610975565b005b6103926103a2366004612f3a565b61098b565b3480156103b357600080fd5b506103bc610da3565b6040516103399190613014565b3480156103d557600080fd5b506103e96103e4366004612e83565b610e35565b6040516001600160a01b039091168152602001610339565b34801561040d57600080fd5b5061039261041c366004613027565b610e5c565b34801561042d57600080fd5b5061044161043c366004613051565b610f25565b604051610339919061306c565b34801561045a57600080fd5b5061032f600c5481565b34801561047057600080fd5b5061039261047f3660046130b0565b610f91565b34801561049057600080fd5b506104a461049f3660046130ec565b61106a565b604080516001600160a01b039093168352602083019190915201610339565b3480156104cf57600080fd5b5061032f600a5481565b3480156104e557600080fd5b506103e96daaeb6d7670e522a718067333cd4e81565b34801561050757600080fd5b506103926105163660046130b0565b611125565b34801561052757600080fd5b50610392610536366004612e83565b6111f3565b34801561054757600080fd5b5061032f610556366004612e83565b611200565b34801561056757600080fd5b5061039261057636600461319a565b611221565b34801561058757600080fd5b506103926105963660046131e3565b611235565b3480156105a757600080fd5b50600b546103629060ff1681565b3480156105c157600080fd5b5061032f6105d0366004612e83565b611248565b3480156105e157600080fd5b5061032f6105f0366004612e83565b611258565b34801561060157600080fd5b50610392610610366004613027565b611268565b34801561062157600080fd5b506103e9610630366004612e83565b6114a2565b34801561064157600080fd5b5061032f610650366004612e83565b611507565b34801561066157600080fd5b506103bc611517565b34801561067657600080fd5b5061039261068536600461322d565b6115a5565b34801561069657600080fd5b5061032f6106a5366004613051565b6115c0565b3480156106b657600080fd5b5061039261165a565b3480156106cb57600080fd5b5061032f6106da366004612e83565b61166e565b3480156106eb57600080fd5b506103626106fa366004612f3a565b6116e5565b34801561070b57600080fd5b5061039261071a366004613027565b611775565b34801561072b57600080fd5b506006546001600160a01b03166103e9565b34801561074957600080fd5b5061032f610758366004613027565b61194b565b34801561076957600080fd5b506103bc61197c565b34801561077e57600080fd5b5061032f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107b257600080fd5b506103926107c136600461324a565b61198b565b3480156107d257600080fd5b5061032f6107e1366004612e83565b60136020526000908152604090205481565b3480156107ff57600080fd5b5061039261080e366004613281565b611a4f565b34801561081f57600080fd5b5061032f61082e366004612e83565b611b2b565b34801561083f57600080fd5b506103bc61084e366004612e83565b611b3b565b34801561085f57600080fd5b5061032f61086e366004612e83565b60156020526000908152604090205481565b34801561088c57600080fd5b5061036261089b3660046132fd565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108d557600080fd5b5061032f6108e4366004612e83565b60126020526000908152604090205481565b34801561090257600080fd5b50610392610911366004613051565b611bfe565b610392610924366004613051565b611c8e565b34801561093557600080fd5b50610362610944366004613027565b601760209081526000928352604080842090915290825290205460ff1681565b600061096f82611ccb565b92915050565b61097d611d09565b6109878282611d63565b5050565b600b5460ff166109e25760405162461bcd60e51b815260206004820152601a60248201527f506c616e65744d616e3a204d696e7420697320636c6f7365642e00000000000060448201526064015b60405180910390fd5b323314610a575760405162461bcd60e51b815260206004820152602560248201527f506c616e65744d616e3a20436f6e74726163747320617265206e6f7420616c6c60448201527f6f7765642e00000000000000000000000000000000000000000000000000000060648201526084016109d9565b60058310610ab35760405162461bcd60e51b815260206004820152602360248201527f506c616e65744d616e3a20496e636f72726563742072617269747920696e70756044820152623a399760e91b60648201526084016109d9565b6001600160a01b038416600090815260176020908152604080832086845290915290205460ff1615610b275760405162461bcd60e51b815260206004820152601e60248201527f506c616e65744d616e3a204c696d6974203120706572207261726974792e000060448201526064016109d9565b7f0000000000000000000000000000000000000000000000000000000000000000600c5410610ba25760405162461bcd60e51b815260206004820152602160248201527f506c616e65744d616e3a2045786365656420746865206d617820737570706c796044820152601760f91b60648201526084016109d9565b600e8381548110610bb557610bb5613327565b9060005260206000200154601160008581526020019081526020016000205410610c475760405162461bcd60e51b815260206004820152603760248201527f506c616e65744d616e3a2045786365656420746865207075626c6963206d696e60448201527f74206c696d6974206f662074686174207261726974792e00000000000000000060648201526084016109d9565b600060148481548110610c5c57610c5c613327565b90600052602060002001549050610c75858585856116e5565b610cc95780341015610cc95760405162461bcd60e51b815260206004820152601e60248201527f506c616e65744d616e3a204e6f7420656e6f756768207061796d656e742e000060448201526064016109d9565b6000848152601560205260408120805491610ce383613353565b9091555050600084815260156020526040902054610d018682611e6a565b6000858152601160205260408120805491610d1b83613353565b9091555050600c8054906000610d3083613353565b909155505060008181526016602090815260408083208890556001600160a01b03891680845260178352818420898552909252808320805460ff191660011790555142928492917f081c457af6379f941938f3edc94d93dc6ea5fe0575704effe3645a0d03086cfe9190a4505050505050565b606060008054610db29061336c565b80601f0160208091040260200160405190810160405280929190818152602001828054610dde9061336c565b8015610e2b5780601f10610e0057610100808354040283529160200191610e2b565b820191906000526020600020905b815481529060010190602001808311610e0e57829003601f168201915b5050505050905090565b6000610e4082611e84565b506000908152600460205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15610f1657604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610eca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eee91906133a6565b610f1657604051633b79c77360e21b81526001600160a01b03821660048201526024016109d9565b610f208383611ee8565b505050565b6001600160a01b038116600090815260186020908152604091829020805483518184028101840190945280845260609392830182828015610f8557602002820191906000526020600020905b815481526020019060010190808311610f71575b50505050509050919050565b826daaeb6d7670e522a718067333cd4e3b1561105957336001600160a01b03821603610fc757610fc2848484612032565b611064565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611016573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103a91906133a6565b61105957604051633b79c77360e21b81523360048201526024016109d9565b611064848484612032565b50505050565b60008281526008602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff169282019290925282916110e95750604080518082019091526007546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b60208101516000906127109061110d906bffffffffffffffffffffffff16876133c3565b61111791906133da565b915196919550909350505050565b826daaeb6d7670e522a718067333cd4e3b156111e857336001600160a01b0382160361115657610fc28484846120a9565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156111a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c991906133a6565b6111e857604051633b79c77360e21b81523360048201526024016109d9565b6110648484846120a9565b6111fb611d09565b600a55565b600d818154811061121057600080fd5b600091825260209091200154905081565b611229611d09565b6009610987828261344a565b61123d611d09565b610f208383836120c4565b6010818154811061121057600080fd5b600f818154811061121057600080fd5b611270611d09565b600581106112cc5760405162461bcd60e51b815260206004820152602360248201527f506c616e65744d616e3a20496e636f72726563742072617269747920696e70756044820152623a399760e91b60648201526084016109d9565b601081815481106112df576112df613327565b90600052602060002001546013600083815260200190815260200160002054106113715760405162461bcd60e51b815260206004820152603360248201527f506c616e65744d616e3a20457863656564207468652072657365727665206c6960448201527f6d6974206f662074686174207261726974792e0000000000000000000000000060648201526084016109d9565b7f0000000000000000000000000000000000000000000000000000000000000000600c54106113ec5760405162461bcd60e51b815260206004820152602160248201527f506c616e65744d616e3a2045786365656420746865206d617820737570706c796044820152601760f91b60648201526084016109d9565b600081815260156020526040812080549161140683613353565b90915550506000818152601560205260409020546114248382611e6a565b600082815260136020526040812080549161143e83613353565b9091555050600c805490600061145383613353565b909155505060008181526016602052604080822084905551429183916001600160a01b038716917f081c457af6379f941938f3edc94d93dc6ea5fe0575704effe3645a0d03086cfe91a4505050565b6000818152600260205260408120546001600160a01b03168061096f5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e204944000000000000000060448201526064016109d9565b6014818154811061121057600080fd5b600980546115249061336c565b80601f01602080910402602001604051908101604052809291908181526020018280546115509061336c565b801561159d5780601f106115725761010080835404028352916020019161159d565b820191906000526020600020905b81548152906001019060200180831161158057829003601f168201915b505050505081565b6115ad611d09565b600b805460ff1916911515919091179055565b60006001600160a01b03821661163e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e6572000000000000000000000000000000000000000000000060648201526084016109d9565b506001600160a01b031660009081526003602052604090205490565b611662611d09565b61166c60006121dc565b565b6000818152600260205260408120546001600160a01b03166116d25760405162461bcd60e51b815260206004820152601b60248201527f506c616e65744d616e3a20546f6b656e206e6f742065786973742e000000000060448201526064016109d9565b5060009081526016602052604090205490565b6040516bffffffffffffffffffffffff19606086901b16602082015260348101849052600090819060540160405160208183030381529060405280519060200120905061176984848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a54915084905061223b565b9150505b949350505050565b61177d611d09565b600581106117d95760405162461bcd60e51b815260206004820152602360248201527f506c616e65744d616e3a20496e636f72726563742072617269747920696e70756044820152623a399760e91b60648201526084016109d9565b7f0000000000000000000000000000000000000000000000000000000000000000600c54106118545760405162461bcd60e51b815260206004820152602160248201527f506c616e65744d616e3a2045786365656420746865206d617820737570706c796044820152601760f91b60648201526084016109d9565b600f818154811061186757611867613327565b90600052602060002001546012600083815260200190815260200160002054106118f95760405162461bcd60e51b815260206004820152603360248201527f506c616e65744d616e3a20457863656564207468652061697264726f70206c6960448201527f6d6974206f662074686174207261726974792e0000000000000000000000000060648201526084016109d9565b600081815260156020526040812080549161191383613353565b90915550506000818152601560205260409020546119318382611e6a565b600082815260126020526040812080549161143e83613353565b6018602052816000526040600020818154811061196757600080fd5b90600052602060002001600091509150505481565b606060018054610db29061336c565b816daaeb6d7670e522a718067333cd4e3b15611a4557604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156119f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1d91906133a6565b611a4557604051633b79c77360e21b81526001600160a01b03821660048201526024016109d9565b610f208383612251565b836daaeb6d7670e522a718067333cd4e3b15611b1857336001600160a01b03821603611a8657611a818585858561225c565b611b24565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611ad5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af991906133a6565b611b1857604051633b79c77360e21b81523360048201526024016109d9565b611b248585858561225c565b5050505050565b600e818154811061121057600080fd5b6000818152600260205260409020546060906001600160a01b0316611ba25760405162461bcd60e51b815260206004820152601b60248201527f506c616e65744d616e3a20546f6b656e206e6f742065786973742e000000000060448201526064016109d9565b600060098054611bb19061336c565b905011611bcd576040518060200160405280600081525061096f565b6009611bd8836122d4565b604051602001611be992919061350a565b60405160208183030381529060405292915050565b611c06611d09565b6001600160a01b038116611c825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109d9565b611c8b816121dc565b50565b611c96611d09565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610987573d6000803e3d6000fd5b60006001600160e01b031982167f2a55205a00000000000000000000000000000000000000000000000000000000148061096f575061096f82612374565b6006546001600160a01b0316331461166c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109d9565b6127106bffffffffffffffffffffffff82161115611dd65760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016109d9565b6001600160a01b038216611e2c5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016109d9565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff9091166020909201829052600160a01b90910217600755565b61098782826040518060200160405280600081525061240f565b6000818152600260205260409020546001600160a01b0316611c8b5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e204944000000000000000060448201526064016109d9565b6000611ef3826114a2565b9050806001600160a01b0316836001600160a01b031603611f7c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016109d9565b336001600160a01b0382161480611fb657506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6120285760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016109d9565b610f20838361248d565b61203c3382612508565b61209e5760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b60648201526084016109d9565b610f20838383612586565b610f2083838360405180602001604052806000815250611a4f565b6127106bffffffffffffffffffffffff821611156121375760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016109d9565b6001600160a01b03821661218d5760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d6574657273000000000060448201526064016109d9565b6040805180820182526001600160a01b0393841681526bffffffffffffffffffffffff92831660208083019182526000968752600890529190942093519051909116600160a01b029116179055565b600680546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826122488584612799565b14949350505050565b6109873383836127e6565b6122663383612508565b6122c85760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b60648201526084016109d9565b611064848484846128b4565b606060006122e183612932565b600101905060008167ffffffffffffffff8111156123015761230161310e565b6040519080825280601f01601f19166020018201604052801561232b576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461233557509392505050565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806123d757506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061096f57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461096f565b6124198383612a14565b6124266000848484612bba565b610f205760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016109d9565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906124cf826114a2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612514836114a2565b9050806001600160a01b0316846001600160a01b0316148061255b57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061176d5750836001600160a01b031661257484610e35565b6001600160a01b031614949350505050565b826001600160a01b0316612599826114a2565b6001600160a01b0316146125fd5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109d9565b6001600160a01b0382166126785760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109d9565b6126858383836001612d03565b826001600160a01b0316612698826114a2565b6001600160a01b0316146126fc5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109d9565b6000818152600460209081526040808320805473ffffffffffffffffffffffffffffffffffffffff199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815b84518110156127de576127ca828683815181106127bd576127bd613327565b6020026020010151612d83565b9150806127d681613353565b91505061279e565b509392505050565b816001600160a01b0316836001600160a01b0316036128475760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109d9565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6128bf848484612586565b6128cb84848484612bba565b6110645760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016109d9565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061297b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106129a7576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106129c557662386f26fc10000830492506010015b6305f5e10083106129dd576305f5e100830492506008015b61271083106129f157612710830492506004015b60648310612a03576064830492506002015b600a831061096f5760010192915050565b6001600160a01b038216612a6a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109d9565b6000818152600260205260409020546001600160a01b031615612acf5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109d9565b612add600083836001612d03565b6000818152600260205260409020546001600160a01b031615612b425760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109d9565b6001600160a01b0382166000818152600360209081526040808320805460010190558483526002909152808220805473ffffffffffffffffffffffffffffffffffffffff19168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15612cfb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612bfe9033908990889088906004016135b9565b6020604051808303816000875af1925050508015612c39575060408051601f3d908101601f19168201909252612c36918101906135f5565b60015b612ce1573d808015612c67576040519150601f19603f3d011682016040523d82523d6000602084013e612c6c565b606091505b508051600003612cd95760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016109d9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061176d565b50600161176d565b60005b81811015611b24576000612d1a8285613612565b90506001600160a01b03861615612d3557612d358682612db5565b6001600160a01b03851615612d70576001600160a01b0385166000908152601860209081526040822080546001810182559083529120018190555b5080612d7b81613353565b915050612d06565b6000818310612d9f576000828152602084905260409020612dae565b60008381526020839052604090205b9392505050565b6001600160a01b0382166000908152601860205260408120905b81548110156110645782828281548110612deb57612deb613327565b906000526020600020015403612e715781548290612e0b90600190613625565b81548110612e1b57612e1b613327565b9060005260206000200154828281548110612e3857612e38613327565b906000526020600020018190555081805480612e5657612e56613638565b60019003818190600052602060002001600090559055611064565b80612e7b81613353565b915050612dcf565b600060208284031215612e9557600080fd5b5035919050565b6001600160e01b031981168114611c8b57600080fd5b600060208284031215612ec457600080fd5b8135612dae81612e9c565b80356001600160a01b0381168114612ee657600080fd5b919050565b80356bffffffffffffffffffffffff81168114612ee657600080fd5b60008060408385031215612f1a57600080fd5b612f2383612ecf565b9150612f3160208401612eeb565b90509250929050565b60008060008060608587031215612f5057600080fd5b612f5985612ecf565b935060208501359250604085013567ffffffffffffffff80821115612f7d57600080fd5b818701915087601f830112612f9157600080fd5b813581811115612fa057600080fd5b8860208260051b8501011115612fb557600080fd5b95989497505060200194505050565b60005b83811015612fdf578181015183820152602001612fc7565b50506000910152565b60008151808452613000816020860160208601612fc4565b601f01601f19169290920160200192915050565b602081526000612dae6020830184612fe8565b6000806040838503121561303a57600080fd5b61304383612ecf565b946020939093013593505050565b60006020828403121561306357600080fd5b612dae82612ecf565b6020808252825182820181905260009190848201906040850190845b818110156130a457835183529284019291840191600101613088565b50909695505050505050565b6000806000606084860312156130c557600080fd5b6130ce84612ecf565b92506130dc60208501612ecf565b9150604084013590509250925092565b600080604083850312156130ff57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561313f5761313f61310e565b604051601f8501601f19908116603f011681019082821181831017156131675761316761310e565b8160405280935085815286868601111561318057600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156131ac57600080fd5b813567ffffffffffffffff8111156131c357600080fd5b8201601f810184136131d457600080fd5b61176d84823560208401613124565b6000806000606084860312156131f857600080fd5b8335925061320860208501612ecf565b915061321660408501612eeb565b90509250925092565b8015158114611c8b57600080fd5b60006020828403121561323f57600080fd5b8135612dae8161321f565b6000806040838503121561325d57600080fd5b61326683612ecf565b915060208301356132768161321f565b809150509250929050565b6000806000806080858703121561329757600080fd5b6132a085612ecf565b93506132ae60208601612ecf565b925060408501359150606085013567ffffffffffffffff8111156132d157600080fd5b8501601f810187136132e257600080fd5b6132f187823560208401613124565b91505092959194509250565b6000806040838503121561331057600080fd5b61331983612ecf565b9150612f3160208401612ecf565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016133655761336561333d565b5060010190565b600181811c9082168061338057607f821691505b6020821081036133a057634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156133b857600080fd5b8151612dae8161321f565b808202811582820484141761096f5761096f61333d565b6000826133f757634e487b7160e01b600052601260045260246000fd5b500490565b601f821115610f2057600081815260208120601f850160051c810160208610156134235750805b601f850160051c820191505b818110156134425782815560010161342f565b505050505050565b815167ffffffffffffffff8111156134645761346461310e565b61347881613472845461336c565b846133fc565b602080601f8311600181146134ad57600084156134955750858301515b600019600386901b1c1916600185901b178555613442565b600085815260208120601f198616915b828110156134dc578886015182559484019460019091019084016134bd565b50858210156134fa5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008084546135188161336c565b60018281168015613530576001811461354557613574565b60ff1984168752821515830287019450613574565b8860005260208060002060005b8581101561356b5781548a820152908401908201613552565b50505082870194505b505050508351613588818360208801612fc4565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526135eb6080830184612fe8565b9695505050505050565b60006020828403121561360757600080fd5b8151612dae81612e9c565b8082018082111561096f5761096f61333d565b8181038181111561096f5761096f61333d565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220f093c5f0151715aab36d09e32a52cd21d28028ae3c38ec0250f9e6f54492b8e864736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000600000000000000000000000008ba381c8db160b293ff95b1d647e5dc4525653f100000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696233643377676374613374636a6834376a74717274326a77696c73777274716534713234687132377632337572727a636c6768652f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102fd5760003560e01c806363f32f631161018f578063a0f82817116100e1578063de8f42781161008a578063f2fde38b11610064578063f2fde38b146108f6578063f676115114610916578063fef569011461092957600080fd5b8063de8f427814610853578063e985e9c514610880578063ec2db2a3146108c957600080fd5b8063b88d4fde116100bb578063b88d4fde146107f3578063c0d757a714610813578063c87b56dd1461083357600080fd5b8063a0f8281714610772578063a22cb465146107a6578063a55a3d0f146107c657600080fd5b80638b023075116101435780638da5cb5b1161011d5780638da5cb5b1461071f57806394a214ae1461073d57806395d89b411461075d57600080fd5b80638b023075146106bf5780638be0861e146106df5780638c32c568146106ff57600080fd5b80636fdca5e0116101745780636fdca5e01461066a57806370a082311461068a578063715018a6146106aa57600080fd5b806363f32f63146106355780636c0360eb1461065557600080fd5b80632eb4a7ab116102535780635944c753116101fc5780636089fa44116101d65780636089fa44146105d557806361c8427c146105f55780636352211e1461061557600080fd5b80635944c7531461057b57806359ebeb901461059b5780635aef2174146105b557600080fd5b8063440bc7f31161022d578063440bc7f31461051b578063441cb3c21461053b57806355f804b31461055b57600080fd5b80632eb4a7ab146104c357806341f43434146104d957806342842e0e146104fb57600080fd5b8063081812fc116102b557806318160ddd1161028f57806318160ddd1461044e57806323b872dd146104645780632a55205a1461048457600080fd5b8063081812fc146103c9578063095ea7b314610401578063178b6de61461042157600080fd5b806302fa7c47116102e657806302fa7c471461037257806303aaed7b1461039457806306fdde03146103a757600080fd5b8063018a20281461030257806301ffc9a714610342575b600080fd5b34801561030e57600080fd5b5061032f61031d366004612e83565b60116020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561034e57600080fd5b5061036261035d366004612eb2565b610964565b6040519015158152602001610339565b34801561037e57600080fd5b5061039261038d366004612f07565b610975565b005b6103926103a2366004612f3a565b61098b565b3480156103b357600080fd5b506103bc610da3565b6040516103399190613014565b3480156103d557600080fd5b506103e96103e4366004612e83565b610e35565b6040516001600160a01b039091168152602001610339565b34801561040d57600080fd5b5061039261041c366004613027565b610e5c565b34801561042d57600080fd5b5061044161043c366004613051565b610f25565b604051610339919061306c565b34801561045a57600080fd5b5061032f600c5481565b34801561047057600080fd5b5061039261047f3660046130b0565b610f91565b34801561049057600080fd5b506104a461049f3660046130ec565b61106a565b604080516001600160a01b039093168352602083019190915201610339565b3480156104cf57600080fd5b5061032f600a5481565b3480156104e557600080fd5b506103e96daaeb6d7670e522a718067333cd4e81565b34801561050757600080fd5b506103926105163660046130b0565b611125565b34801561052757600080fd5b50610392610536366004612e83565b6111f3565b34801561054757600080fd5b5061032f610556366004612e83565b611200565b34801561056757600080fd5b5061039261057636600461319a565b611221565b34801561058757600080fd5b506103926105963660046131e3565b611235565b3480156105a757600080fd5b50600b546103629060ff1681565b3480156105c157600080fd5b5061032f6105d0366004612e83565b611248565b3480156105e157600080fd5b5061032f6105f0366004612e83565b611258565b34801561060157600080fd5b50610392610610366004613027565b611268565b34801561062157600080fd5b506103e9610630366004612e83565b6114a2565b34801561064157600080fd5b5061032f610650366004612e83565b611507565b34801561066157600080fd5b506103bc611517565b34801561067657600080fd5b5061039261068536600461322d565b6115a5565b34801561069657600080fd5b5061032f6106a5366004613051565b6115c0565b3480156106b657600080fd5b5061039261165a565b3480156106cb57600080fd5b5061032f6106da366004612e83565b61166e565b3480156106eb57600080fd5b506103626106fa366004612f3a565b6116e5565b34801561070b57600080fd5b5061039261071a366004613027565b611775565b34801561072b57600080fd5b506006546001600160a01b03166103e9565b34801561074957600080fd5b5061032f610758366004613027565b61194b565b34801561076957600080fd5b506103bc61197c565b34801561077e57600080fd5b5061032f7f000000000000000000000000000000000000000000000000000000000000271081565b3480156107b257600080fd5b506103926107c136600461324a565b61198b565b3480156107d257600080fd5b5061032f6107e1366004612e83565b60136020526000908152604090205481565b3480156107ff57600080fd5b5061039261080e366004613281565b611a4f565b34801561081f57600080fd5b5061032f61082e366004612e83565b611b2b565b34801561083f57600080fd5b506103bc61084e366004612e83565b611b3b565b34801561085f57600080fd5b5061032f61086e366004612e83565b60156020526000908152604090205481565b34801561088c57600080fd5b5061036261089b3660046132fd565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108d557600080fd5b5061032f6108e4366004612e83565b60126020526000908152604090205481565b34801561090257600080fd5b50610392610911366004613051565b611bfe565b610392610924366004613051565b611c8e565b34801561093557600080fd5b50610362610944366004613027565b601760209081526000928352604080842090915290825290205460ff1681565b600061096f82611ccb565b92915050565b61097d611d09565b6109878282611d63565b5050565b600b5460ff166109e25760405162461bcd60e51b815260206004820152601a60248201527f506c616e65744d616e3a204d696e7420697320636c6f7365642e00000000000060448201526064015b60405180910390fd5b323314610a575760405162461bcd60e51b815260206004820152602560248201527f506c616e65744d616e3a20436f6e74726163747320617265206e6f7420616c6c60448201527f6f7765642e00000000000000000000000000000000000000000000000000000060648201526084016109d9565b60058310610ab35760405162461bcd60e51b815260206004820152602360248201527f506c616e65744d616e3a20496e636f72726563742072617269747920696e70756044820152623a399760e91b60648201526084016109d9565b6001600160a01b038416600090815260176020908152604080832086845290915290205460ff1615610b275760405162461bcd60e51b815260206004820152601e60248201527f506c616e65744d616e3a204c696d6974203120706572207261726974792e000060448201526064016109d9565b7f0000000000000000000000000000000000000000000000000000000000002710600c5410610ba25760405162461bcd60e51b815260206004820152602160248201527f506c616e65744d616e3a2045786365656420746865206d617820737570706c796044820152601760f91b60648201526084016109d9565b600e8381548110610bb557610bb5613327565b9060005260206000200154601160008581526020019081526020016000205410610c475760405162461bcd60e51b815260206004820152603760248201527f506c616e65744d616e3a2045786365656420746865207075626c6963206d696e60448201527f74206c696d6974206f662074686174207261726974792e00000000000000000060648201526084016109d9565b600060148481548110610c5c57610c5c613327565b90600052602060002001549050610c75858585856116e5565b610cc95780341015610cc95760405162461bcd60e51b815260206004820152601e60248201527f506c616e65744d616e3a204e6f7420656e6f756768207061796d656e742e000060448201526064016109d9565b6000848152601560205260408120805491610ce383613353565b9091555050600084815260156020526040902054610d018682611e6a565b6000858152601160205260408120805491610d1b83613353565b9091555050600c8054906000610d3083613353565b909155505060008181526016602090815260408083208890556001600160a01b03891680845260178352818420898552909252808320805460ff191660011790555142928492917f081c457af6379f941938f3edc94d93dc6ea5fe0575704effe3645a0d03086cfe9190a4505050505050565b606060008054610db29061336c565b80601f0160208091040260200160405190810160405280929190818152602001828054610dde9061336c565b8015610e2b5780601f10610e0057610100808354040283529160200191610e2b565b820191906000526020600020905b815481529060010190602001808311610e0e57829003601f168201915b5050505050905090565b6000610e4082611e84565b506000908152600460205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15610f1657604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610eca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eee91906133a6565b610f1657604051633b79c77360e21b81526001600160a01b03821660048201526024016109d9565b610f208383611ee8565b505050565b6001600160a01b038116600090815260186020908152604091829020805483518184028101840190945280845260609392830182828015610f8557602002820191906000526020600020905b815481526020019060010190808311610f71575b50505050509050919050565b826daaeb6d7670e522a718067333cd4e3b1561105957336001600160a01b03821603610fc757610fc2848484612032565b611064565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611016573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103a91906133a6565b61105957604051633b79c77360e21b81523360048201526024016109d9565b611064848484612032565b50505050565b60008281526008602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff169282019290925282916110e95750604080518082019091526007546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b60208101516000906127109061110d906bffffffffffffffffffffffff16876133c3565b61111791906133da565b915196919550909350505050565b826daaeb6d7670e522a718067333cd4e3b156111e857336001600160a01b0382160361115657610fc28484846120a9565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156111a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c991906133a6565b6111e857604051633b79c77360e21b81523360048201526024016109d9565b6110648484846120a9565b6111fb611d09565b600a55565b600d818154811061121057600080fd5b600091825260209091200154905081565b611229611d09565b6009610987828261344a565b61123d611d09565b610f208383836120c4565b6010818154811061121057600080fd5b600f818154811061121057600080fd5b611270611d09565b600581106112cc5760405162461bcd60e51b815260206004820152602360248201527f506c616e65744d616e3a20496e636f72726563742072617269747920696e70756044820152623a399760e91b60648201526084016109d9565b601081815481106112df576112df613327565b90600052602060002001546013600083815260200190815260200160002054106113715760405162461bcd60e51b815260206004820152603360248201527f506c616e65744d616e3a20457863656564207468652072657365727665206c6960448201527f6d6974206f662074686174207261726974792e0000000000000000000000000060648201526084016109d9565b7f0000000000000000000000000000000000000000000000000000000000002710600c54106113ec5760405162461bcd60e51b815260206004820152602160248201527f506c616e65744d616e3a2045786365656420746865206d617820737570706c796044820152601760f91b60648201526084016109d9565b600081815260156020526040812080549161140683613353565b90915550506000818152601560205260409020546114248382611e6a565b600082815260136020526040812080549161143e83613353565b9091555050600c805490600061145383613353565b909155505060008181526016602052604080822084905551429183916001600160a01b038716917f081c457af6379f941938f3edc94d93dc6ea5fe0575704effe3645a0d03086cfe91a4505050565b6000818152600260205260408120546001600160a01b03168061096f5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e204944000000000000000060448201526064016109d9565b6014818154811061121057600080fd5b600980546115249061336c565b80601f01602080910402602001604051908101604052809291908181526020018280546115509061336c565b801561159d5780601f106115725761010080835404028352916020019161159d565b820191906000526020600020905b81548152906001019060200180831161158057829003601f168201915b505050505081565b6115ad611d09565b600b805460ff1916911515919091179055565b60006001600160a01b03821661163e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e6572000000000000000000000000000000000000000000000060648201526084016109d9565b506001600160a01b031660009081526003602052604090205490565b611662611d09565b61166c60006121dc565b565b6000818152600260205260408120546001600160a01b03166116d25760405162461bcd60e51b815260206004820152601b60248201527f506c616e65744d616e3a20546f6b656e206e6f742065786973742e000000000060448201526064016109d9565b5060009081526016602052604090205490565b6040516bffffffffffffffffffffffff19606086901b16602082015260348101849052600090819060540160405160208183030381529060405280519060200120905061176984848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a54915084905061223b565b9150505b949350505050565b61177d611d09565b600581106117d95760405162461bcd60e51b815260206004820152602360248201527f506c616e65744d616e3a20496e636f72726563742072617269747920696e70756044820152623a399760e91b60648201526084016109d9565b7f0000000000000000000000000000000000000000000000000000000000002710600c54106118545760405162461bcd60e51b815260206004820152602160248201527f506c616e65744d616e3a2045786365656420746865206d617820737570706c796044820152601760f91b60648201526084016109d9565b600f818154811061186757611867613327565b90600052602060002001546012600083815260200190815260200160002054106118f95760405162461bcd60e51b815260206004820152603360248201527f506c616e65744d616e3a20457863656564207468652061697264726f70206c6960448201527f6d6974206f662074686174207261726974792e0000000000000000000000000060648201526084016109d9565b600081815260156020526040812080549161191383613353565b90915550506000818152601560205260409020546119318382611e6a565b600082815260126020526040812080549161143e83613353565b6018602052816000526040600020818154811061196757600080fd5b90600052602060002001600091509150505481565b606060018054610db29061336c565b816daaeb6d7670e522a718067333cd4e3b15611a4557604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156119f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1d91906133a6565b611a4557604051633b79c77360e21b81526001600160a01b03821660048201526024016109d9565b610f208383612251565b836daaeb6d7670e522a718067333cd4e3b15611b1857336001600160a01b03821603611a8657611a818585858561225c565b611b24565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611ad5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af991906133a6565b611b1857604051633b79c77360e21b81523360048201526024016109d9565b611b248585858561225c565b5050505050565b600e818154811061121057600080fd5b6000818152600260205260409020546060906001600160a01b0316611ba25760405162461bcd60e51b815260206004820152601b60248201527f506c616e65744d616e3a20546f6b656e206e6f742065786973742e000000000060448201526064016109d9565b600060098054611bb19061336c565b905011611bcd576040518060200160405280600081525061096f565b6009611bd8836122d4565b604051602001611be992919061350a565b60405160208183030381529060405292915050565b611c06611d09565b6001600160a01b038116611c825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109d9565b611c8b816121dc565b50565b611c96611d09565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610987573d6000803e3d6000fd5b60006001600160e01b031982167f2a55205a00000000000000000000000000000000000000000000000000000000148061096f575061096f82612374565b6006546001600160a01b0316331461166c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109d9565b6127106bffffffffffffffffffffffff82161115611dd65760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016109d9565b6001600160a01b038216611e2c5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016109d9565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff9091166020909201829052600160a01b90910217600755565b61098782826040518060200160405280600081525061240f565b6000818152600260205260409020546001600160a01b0316611c8b5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e204944000000000000000060448201526064016109d9565b6000611ef3826114a2565b9050806001600160a01b0316836001600160a01b031603611f7c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016109d9565b336001600160a01b0382161480611fb657506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6120285760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016109d9565b610f20838361248d565b61203c3382612508565b61209e5760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b60648201526084016109d9565b610f20838383612586565b610f2083838360405180602001604052806000815250611a4f565b6127106bffffffffffffffffffffffff821611156121375760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016109d9565b6001600160a01b03821661218d5760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d6574657273000000000060448201526064016109d9565b6040805180820182526001600160a01b0393841681526bffffffffffffffffffffffff92831660208083019182526000968752600890529190942093519051909116600160a01b029116179055565b600680546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826122488584612799565b14949350505050565b6109873383836127e6565b6122663383612508565b6122c85760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b60648201526084016109d9565b611064848484846128b4565b606060006122e183612932565b600101905060008167ffffffffffffffff8111156123015761230161310e565b6040519080825280601f01601f19166020018201604052801561232b576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461233557509392505050565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806123d757506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061096f57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461096f565b6124198383612a14565b6124266000848484612bba565b610f205760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016109d9565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906124cf826114a2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612514836114a2565b9050806001600160a01b0316846001600160a01b0316148061255b57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061176d5750836001600160a01b031661257484610e35565b6001600160a01b031614949350505050565b826001600160a01b0316612599826114a2565b6001600160a01b0316146125fd5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109d9565b6001600160a01b0382166126785760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109d9565b6126858383836001612d03565b826001600160a01b0316612698826114a2565b6001600160a01b0316146126fc5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109d9565b6000818152600460209081526040808320805473ffffffffffffffffffffffffffffffffffffffff199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815b84518110156127de576127ca828683815181106127bd576127bd613327565b6020026020010151612d83565b9150806127d681613353565b91505061279e565b509392505050565b816001600160a01b0316836001600160a01b0316036128475760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109d9565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6128bf848484612586565b6128cb84848484612bba565b6110645760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016109d9565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061297b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106129a7576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106129c557662386f26fc10000830492506010015b6305f5e10083106129dd576305f5e100830492506008015b61271083106129f157612710830492506004015b60648310612a03576064830492506002015b600a831061096f5760010192915050565b6001600160a01b038216612a6a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109d9565b6000818152600260205260409020546001600160a01b031615612acf5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109d9565b612add600083836001612d03565b6000818152600260205260409020546001600160a01b031615612b425760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109d9565b6001600160a01b0382166000818152600360209081526040808320805460010190558483526002909152808220805473ffffffffffffffffffffffffffffffffffffffff19168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15612cfb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612bfe9033908990889088906004016135b9565b6020604051808303816000875af1925050508015612c39575060408051601f3d908101601f19168201909252612c36918101906135f5565b60015b612ce1573d808015612c67576040519150601f19603f3d011682016040523d82523d6000602084013e612c6c565b606091505b508051600003612cd95760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016109d9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061176d565b50600161176d565b60005b81811015611b24576000612d1a8285613612565b90506001600160a01b03861615612d3557612d358682612db5565b6001600160a01b03851615612d70576001600160a01b0385166000908152601860209081526040822080546001810182559083529120018190555b5080612d7b81613353565b915050612d06565b6000818310612d9f576000828152602084905260409020612dae565b60008381526020839052604090205b9392505050565b6001600160a01b0382166000908152601860205260408120905b81548110156110645782828281548110612deb57612deb613327565b906000526020600020015403612e715781548290612e0b90600190613625565b81548110612e1b57612e1b613327565b9060005260206000200154828281548110612e3857612e38613327565b906000526020600020018190555081805480612e5657612e56613638565b60019003818190600052602060002001600090559055611064565b80612e7b81613353565b915050612dcf565b600060208284031215612e9557600080fd5b5035919050565b6001600160e01b031981168114611c8b57600080fd5b600060208284031215612ec457600080fd5b8135612dae81612e9c565b80356001600160a01b0381168114612ee657600080fd5b919050565b80356bffffffffffffffffffffffff81168114612ee657600080fd5b60008060408385031215612f1a57600080fd5b612f2383612ecf565b9150612f3160208401612eeb565b90509250929050565b60008060008060608587031215612f5057600080fd5b612f5985612ecf565b935060208501359250604085013567ffffffffffffffff80821115612f7d57600080fd5b818701915087601f830112612f9157600080fd5b813581811115612fa057600080fd5b8860208260051b8501011115612fb557600080fd5b95989497505060200194505050565b60005b83811015612fdf578181015183820152602001612fc7565b50506000910152565b60008151808452613000816020860160208601612fc4565b601f01601f19169290920160200192915050565b602081526000612dae6020830184612fe8565b6000806040838503121561303a57600080fd5b61304383612ecf565b946020939093013593505050565b60006020828403121561306357600080fd5b612dae82612ecf565b6020808252825182820181905260009190848201906040850190845b818110156130a457835183529284019291840191600101613088565b50909695505050505050565b6000806000606084860312156130c557600080fd5b6130ce84612ecf565b92506130dc60208501612ecf565b9150604084013590509250925092565b600080604083850312156130ff57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561313f5761313f61310e565b604051601f8501601f19908116603f011681019082821181831017156131675761316761310e565b8160405280935085815286868601111561318057600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156131ac57600080fd5b813567ffffffffffffffff8111156131c357600080fd5b8201601f810184136131d457600080fd5b61176d84823560208401613124565b6000806000606084860312156131f857600080fd5b8335925061320860208501612ecf565b915061321660408501612eeb565b90509250925092565b8015158114611c8b57600080fd5b60006020828403121561323f57600080fd5b8135612dae8161321f565b6000806040838503121561325d57600080fd5b61326683612ecf565b915060208301356132768161321f565b809150509250929050565b6000806000806080858703121561329757600080fd5b6132a085612ecf565b93506132ae60208601612ecf565b925060408501359150606085013567ffffffffffffffff8111156132d157600080fd5b8501601f810187136132e257600080fd5b6132f187823560208401613124565b91505092959194509250565b6000806040838503121561331057600080fd5b61331983612ecf565b9150612f3160208401612ecf565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016133655761336561333d565b5060010190565b600181811c9082168061338057607f821691505b6020821081036133a057634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156133b857600080fd5b8151612dae8161321f565b808202811582820484141761096f5761096f61333d565b6000826133f757634e487b7160e01b600052601260045260246000fd5b500490565b601f821115610f2057600081815260208120601f850160051c810160208610156134235750805b601f850160051c820191505b818110156134425782815560010161342f565b505050505050565b815167ffffffffffffffff8111156134645761346461310e565b61347881613472845461336c565b846133fc565b602080601f8311600181146134ad57600084156134955750858301515b600019600386901b1c1916600185901b178555613442565b600085815260208120601f198616915b828110156134dc578886015182559484019460019091019084016134bd565b50858210156134fa5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008084546135188161336c565b60018281168015613530576001811461354557613574565b60ff1984168752821515830287019450613574565b8860005260208060002060005b8581101561356b5781548a820152908401908201613552565b50505082870194505b505050508351613588818360208801612fc4565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526135eb6080830184612fe8565b9695505050505050565b60006020828403121561360757600080fd5b8151612dae81612e9c565b8082018082111561096f5761096f61333d565b8181038181111561096f5761096f61333d565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220f093c5f0151715aab36d09e32a52cd21d28028ae3c38ec0250f9e6f54492b8e864736f6c63430008120033

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

00000000000000000000000000000000000000000000000000000000000000600000000000000000000000008ba381c8db160b293ff95b1d647e5dc4525653f100000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696233643377676374613374636a6834376a74717274326a77696c73777274716534713234687132377632337572727a636c6768652f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseURI (string): ipfs://bafybeib3d3wgcta3tcjh47jtqrt2jwilswrtqe4q24hq27v23urrzclghe/
Arg [1] : receiver (address): 0x8ba381C8Db160B293ff95b1D647E5dC4525653F1
Arg [2] : feeNumerator (uint96): 500

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 0000000000000000000000008ba381c8db160b293ff95b1d647e5dc4525653f1
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [4] : 697066733a2f2f626166796265696233643377676374613374636a6834376a74
Arg [5] : 717274326a77696c73777274716534713234687132377632337572727a636c67
Arg [6] : 68652f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

77281:8177:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79171:48;;;;;;;;;;-1:-1:-1;79171:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;345:25:1;;;333:2;318:18;79171:48:0;;;;;;;;85128:170;;;;;;;;;;-1:-1:-1;85128:170:0;;;;;:::i;:::-;;:::i;:::-;;;978:14:1;;971:22;953:41;;941:2;926:18;85128:170:0;813:187:1;83866:143:0;;;;;;;;;;-1:-1:-1;83866:143:0;;;;;:::i;:::-;;:::i;:::-;;80184:1106;;;;;;:::i;:::-;;:::i;62249:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;63761:171::-;;;;;;;;;;-1:-1:-1;63761:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3335:55:1;;;3317:74;;3305:2;3290:18;63761:171:0;3171:226:1;84377:157:0;;;;;;;;;;-1:-1:-1;84377:157:0;;;;;:::i;:::-;;:::i;82740:121::-;;;;;;;;;;-1:-1:-1;82740:121:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;78827:26::-;;;;;;;;;;;;;;;;84542:163;;;;;;;;;;-1:-1:-1;84542:163:0;;;;;:::i;:::-;;:::i;54768:438::-;;;;;;;;;;-1:-1:-1;54768:438:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5267:55:1;;;5249:74;;5354:2;5339:18;;5332:34;;;;5222:18;54768:438:0;5075:297:1;78259:25:0;;;;;;;;;;;;;;;;2963:143;;;;;;;;;;;;3063:42;2963:143;;84713:171;;;;;;;;;;-1:-1:-1;84713:171:0;;;;;:::i;:::-;;:::i;78293:103::-;;;;;;;;;;-1:-1:-1;78293:103:0;;;;;:::i;:::-;;:::i;78907:57::-;;;;;;;;;;-1:-1:-1;78907:57:0;;;;;:::i;:::-;;:::i;77837:102::-;;;;;;;;;;-1:-1:-1;77837:102:0;;;;;:::i;:::-;;:::i;84017:168::-;;;;;;;;;;-1:-1:-1;84017:168:0;;;;;:::i;:::-;;:::i;78697:16::-;;;;;;;;;;-1:-1:-1;78697:16:0;;;;;;;;79105:57;;;;;;;;;;-1:-1:-1;79105:57:0;;;;;:::i;:::-;;:::i;79039:::-;;;;;;;;;;-1:-1:-1;79039:57:0;;;;;:::i;:::-;;:::i;81984:645::-;;;;;;;;;;-1:-1:-1;81984:645:0;;;;;:::i;:::-;;:::i;61959:223::-;;;;;;;;;;-1:-1:-1;61959:223:0;;;;;:::i;:::-;;:::i;79490:80::-;;;;;;;;;;-1:-1:-1;79490:80:0;;;;;:::i;:::-;;:::i;77807:21::-;;;;;;;;;;;;;:::i;78722:77::-;;;;;;;;;;-1:-1:-1;78722:77:0;;;;;:::i;:::-;;:::i;61690:207::-;;;;;;;;;;-1:-1:-1;61690:207:0;;;;;:::i;:::-;;:::i;59100:103::-;;;;;;;;;;;;;:::i;79790:171::-;;;;;;;;;;-1:-1:-1;79790:171:0;;;;;:::i;:::-;;:::i;78404:253::-;;;;;;;;;;-1:-1:-1;78404:253:0;;;;;:::i;:::-;;:::i;81322:630::-;;;;;;;;;;-1:-1:-1;81322:630:0;;;;;:::i;:::-;;:::i;58459:87::-;;;;;;;;;;-1:-1:-1;58532:6:0;;-1:-1:-1;;;;;58532:6:0;58459:87;;82681:50;;;;;;;;;;-1:-1:-1;82681:50:0;;;;;:::i;:::-;;:::i;62418:104::-;;;;;;;;;;;;;:::i;78862:36::-;;;;;;;;;;;;;;;84193:176;;;;;;;;;;-1:-1:-1;84193:176:0;;;;;:::i;:::-;;:::i;79372:50::-;;;;;;;;;;-1:-1:-1;79372:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;84892:228;;;;;;;;;;-1:-1:-1;84892:228:0;;;;;:::i;:::-;;:::i;78973:57::-;;;;;;;;;;-1:-1:-1;78973:57:0;;;;;:::i;:::-;;:::i;77947:275::-;;;;;;;;;;-1:-1:-1;77947:275:0;;;;;:::i;:::-;;:::i;79597:51::-;;;;;;;;;;-1:-1:-1;79597:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;64230:164;;;;;;;;;;-1:-1:-1;64230:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;64351:25:0;;;64327:4;64351:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;64230:164;79270:51;;;;;;;;;;-1:-1:-1;79270:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;59358:201;;;;;;;;;;-1:-1:-1;59358:201:0;;;;;:::i;:::-;;:::i;85324:131::-;;;;;;:::i;:::-;;:::i;79991:66::-;;;;;;;;;;-1:-1:-1;79991:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;85128:170;85230:4;85254:36;85278:11;85254:23;:36::i;:::-;85247:43;85128:170;-1:-1:-1;;85128:170:0:o;83866:143::-;58345:13;:11;:13::i;:::-;83959:42:::1;83978:8;83988:12;83959:18;:42::i;:::-;83866:143:::0;;:::o;80184:1106::-;80296:4;;;;80288:43;;;;-1:-1:-1;;;80288:43:0;;9447:2:1;80288:43:0;;;9429:21:1;9486:2;9466:18;;;9459:30;9525:28;9505:18;;;9498:56;9571:18;;80288:43:0;;;;;;;;;80350:9;80363:10;80350:23;80342:73;;;;-1:-1:-1;;;80342:73:0;;9802:2:1;80342:73:0;;;9784:21:1;9841:2;9821:18;;;9814:30;9880:34;9860:18;;;9853:62;9951:7;9931:18;;;9924:35;9976:19;;80342:73:0;9600:401:1;80342:73:0;80444:1;80434:7;:11;80426:59;;;;-1:-1:-1;;;80426:59:0;;10208:2:1;80426:59:0;;;10190:21:1;10247:2;10227:18;;;10220:30;10286:34;10266:18;;;10259:62;-1:-1:-1;;;10337:18:1;;;10330:33;10380:19;;80426:59:0;10006:399:1;80426:59:0;-1:-1:-1;;;;;80505:20:0;;;;;;:13;:20;;;;;;;;:29;;;;;;;;;;;80504:30;80496:73;;;;-1:-1:-1;;;80496:73:0;;10612:2:1;80496:73:0;;;10594:21:1;10651:2;10631:18;;;10624:30;10690:32;10670:18;;;10663:60;10740:18;;80496:73:0;10410:354:1;80496:73:0;80602:3;80588:11;;:17;80580:63;;;;-1:-1:-1;;;80580:63:0;;10971:2:1;80580:63:0;;;10953:21:1;11010:2;10990:18;;;10983:30;11049:34;11029:18;;;11022:62;-1:-1:-1;;;11100:18:1;;;11093:31;11141:19;;80580:63:0;10769:397:1;80580:63:0;80686:9;80696:7;80686:18;;;;;;;;:::i;:::-;;;;;;;;;80662:12;:21;80675:7;80662:21;;;;;;;;;;;;:42;80654:110;;;;-1:-1:-1;;;80654:110:0;;11562:2:1;80654:110:0;;;11544:21:1;11601:2;11581:18;;;11574:30;11640:34;11620:18;;;11613:62;11711:25;11691:18;;;11684:53;11754:19;;80654:110:0;11360:419:1;80654:110:0;80775:14;80792:5;80798:7;80792:14;;;;;;;;:::i;:::-;;;;;;;;;80775:31;;80822:35;80829:5;80836:7;80845:11;;80822:6;:35::i;:::-;80817:131;;80895:6;80882:9;:19;;80874:62;;;;-1:-1:-1;;;80874:62:0;;11986:2:1;80874:62:0;;;11968:21:1;12025:2;12005:18;;;11998:30;12064:32;12044:18;;;12037:60;12114:18;;80874:62:0;11784:354:1;80874:62:0;80958:24;;;;:15;:24;;;;;:27;;;;;;:::i;:::-;;;;-1:-1:-1;;80996:15:0;81014:24;;;:15;:24;;;;;;81051:25;81061:5;81014:24;81051:9;:25::i;:::-;81089:21;;;;:12;:21;;;;;:24;;;;;;:::i;:::-;;;;-1:-1:-1;;81124:11:0;:14;;;:11;:14;;;:::i;:::-;;;;-1:-1:-1;;81149:15:0;;;;:6;:15;;;;;;;;:25;;;-1:-1:-1;;;;;81185:20:0;;;;;:13;:20;;;;;:29;;;;;;;;;:36;;-1:-1:-1;;81185:36:0;81217:4;81185:36;;;81239:43;81266:15;;81156:7;;81185:20;81239:43;;81149:15;81239:43;80277:1013;;80184:1106;;;;:::o;62249:100::-;62303:13;62336:5;62329:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62249:100;:::o;63761:171::-;63837:7;63857:23;63872:7;63857:14;:23::i;:::-;-1:-1:-1;63900:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;63900:24:0;;63761:171::o;84377:157::-;84473:8;3063:42;4957:45;:49;4953:225;;5028:67;;-1:-1:-1;;;5028:67:0;;5079:4;5028:67;;;13149:34:1;-1:-1:-1;;;;;13219:15:1;;13199:18;;;13192:43;3063:42:0;;5028;;13061:18:1;;5028:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5023:144;;5123:28;;-1:-1:-1;;;5123:28:0;;-1:-1:-1;;;;;3335:55:1;;5123:28:0;;;3317:74:1;3290:18;;5123:28:0;3171:226:1;5023:144:0;84494:32:::1;84508:8;84518:7;84494:13;:32::i;:::-;84377:157:::0;;;:::o;82740:121::-;-1:-1:-1;;;;;82834:19:0;;;;;;:12;:19;;;;;;;;;82827:26;;;;;;;;;;;;;;;;;82798:16;;82827:26;;;82834:19;82827:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82740:121;;;:::o;84542:163::-;84643:4;3063:42;4211:45;:49;4207:539;;4500:10;-1:-1:-1;;;;;4492:18:0;;;4488:85;;84660:37:::1;84679:4;84685:2;84689:7;84660:18;:37::i;:::-;4551:7:::0;;4488:85;4592:69;;-1:-1:-1;;;4592:69:0;;4643:4;4592:69;;;13149:34:1;4650:10:0;13199:18:1;;;13192:43;3063:42:0;;4592;;13061:18:1;;4592:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4587:148;;4689:30;;-1:-1:-1;;;4689:30:0;;4708:10;4689:30;;;3317:74:1;3290:18;;4689:30:0;3171:226:1;4587:148:0;84660:37:::1;84679:4;84685:2;84689:7;84660:18;:37::i;:::-;84542:163:::0;;;;:::o;54768:438::-;54863:7;54921:26;;;:17;:26;;;;;;;;54892:55;;;;;;;;;-1:-1:-1;;;;;54892:55:0;;;;;-1:-1:-1;;;54892:55:0;;;;;;;;;;;;54863:7;;54960:92;;-1:-1:-1;55011:29:0;;;;;;;;;55021:19;55011:29;-1:-1:-1;;;;;55011:29:0;;;;-1:-1:-1;;;55011:29:0;;;;;;;;54960:92;55101:23;;;;55064:21;;55572:5;;55089:35;;55088:57;55089:35;:9;:35;:::i;:::-;55088:57;;;;:::i;:::-;55166:16;;;;;-1:-1:-1;54768:438:0;;-1:-1:-1;;;;54768:438:0:o;84713:171::-;84818:4;3063:42;4211:45;:49;4207:539;;4500:10;-1:-1:-1;;;;;4492:18:0;;;4488:85;;84835:41:::1;84858:4;84864:2;84868:7;84835:22;:41::i;4488:85::-:0;4592:69;;-1:-1:-1;;;4592:69:0;;4643:4;4592:69;;;13149:34:1;4650:10:0;13199:18:1;;;13192:43;3063:42:0;;4592;;13061:18:1;;4592:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4587:148;;4689:30;;-1:-1:-1;;;4689:30:0;;4708:10;4689:30;;;3317:74:1;3290:18;;4689:30:0;3171:226:1;4587:148:0;84835:41:::1;84858:4;84864:2;84868:7;84835:22;:41::i;78293:103::-:0;58345:13;:11;:13::i;:::-;78364:10:::1;:24:::0;78293:103::o;78907:57::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78907:57:0;:::o;77837:102::-;58345:13;:11;:13::i;:::-;77911:7:::1;:20;77921:10:::0;77911:7;:20:::1;:::i;84017:168::-:0;58345:13;:11;:13::i;:::-;84128:49:::1;84145:7;84154:8;84164:12;84128:16;:49::i;79105:57::-:0;;;;;;;;;;;;79039;;;;;;;;;;;;81984:645;58345:13;:11;:13::i;:::-;82082:1:::1;82072:7;:11;82064:59;;;::::0;-1:-1:-1;;;82064:59:0;;10208:2:1;82064:59:0::1;::::0;::::1;10190:21:1::0;10247:2;10227:18;;;10220:30;10286:34;10266:18;;;10259:62;-1:-1:-1;;;10337:18:1;;;10330:33;10380:19;;82064:59:0::1;10006:399:1::0;82064:59:0::1;82168:10;82179:7;82168:19;;;;;;;;:::i;:::-;;;;;;;;;82142:14;:23;82157:7;82142:23;;;;;;;;;;;;:45;82134:109;;;::::0;-1:-1:-1;;;82134:109:0;;16543:2:1;82134:109:0::1;::::0;::::1;16525:21:1::0;16582:2;16562:18;;;16555:30;16621:34;16601:18;;;16594:62;16692:21;16672:18;;;16665:49;16731:19;;82134:109:0::1;16341:415:1::0;82134:109:0::1;82276:3;82262:11;;:17;82254:63;;;::::0;-1:-1:-1;;;82254:63:0;;10971:2:1;82254:63:0::1;::::0;::::1;10953:21:1::0;11010:2;10990:18;;;10983:30;11049:34;11029:18;;;11022:62;-1:-1:-1;;;11100:18:1;;;11093:31;11141:19;;82254:63:0::1;10769:397:1::0;82254:63:0::1;82328:24;::::0;;;:15:::1;:24;::::0;;;;:27;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;82366:15:0::1;82384:24:::0;;;:15:::1;:24;::::0;;;;;82421:28:::1;82431:8:::0;82384:24;82421:9:::1;:28::i;:::-;82470:23;::::0;;;:14:::1;:23;::::0;;;;:26;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;82507:11:0::1;:14:::0;;;:11:::1;:14;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;82532:15:0::1;::::0;;;:6:::1;:15;::::0;;;;;:25;;;82575:46;82605:15:::1;::::0;82539:7;;-1:-1:-1;;;;;82575:46:0;::::1;::::0;::::1;::::0;::::1;82053:576;81984:645:::0;;:::o;61959:223::-;62031:7;66692:16;;;:7;:16;;;;;;-1:-1:-1;;;;;66692:16:0;;62095:56;;;;-1:-1:-1;;;62095:56:0;;16963:2:1;62095:56:0;;;16945:21:1;17002:2;16982:18;;;16975:30;17041:26;17021:18;;;17014:54;17085:18;;62095:56:0;16761:348:1;79490:80:0;;;;;;;;;;;;77807:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;78722:77::-;58345:13;:11;:13::i;:::-;78779:4:::1;:12:::0;;-1:-1:-1;;78779:12:0::1;::::0;::::1;;::::0;;;::::1;::::0;;78722:77::o;61690:207::-;61762:7;-1:-1:-1;;;;;61790:19:0;;61782:73;;;;-1:-1:-1;;;61782:73:0;;17316:2:1;61782:73:0;;;17298:21:1;17355:2;17335:18;;;17328:30;17394:34;17374:18;;;17367:62;17465:11;17445:18;;;17438:39;17494:19;;61782:73:0;17114:405:1;61782:73:0;-1:-1:-1;;;;;;61873:16:0;;;;;:9;:16;;;;;;;61690:207::o;59100:103::-;58345:13;:11;:13::i;:::-;59165:30:::1;59192:1;59165:18;:30::i;:::-;59100:103::o:0;79790:171::-;79844:7;66692:16;;;:7;:16;;;;;;-1:-1:-1;;;;;66692:16:0;79864:56;;;;-1:-1:-1;;;79864:56:0;;17726:2:1;79864:56:0;;;17708:21:1;17765:2;17745:18;;;17738:30;17804:29;17784:18;;;17777:57;17851:18;;79864:56:0;17524:351:1;79864:56:0;-1:-1:-1;79938:15:0;;;;:6;:15;;;;;;;79790:171::o;78404:253::-;78548:33;;-1:-1:-1;;18057:2:1;18053:15;;;18049:53;78548:33:0;;;18037:66:1;18119:12;;;18112:28;;;78506:4:0;;;;18156:12:1;;78548:33:0;;;;;;;;;;;;78538:44;;;;;;78523:59;;78600:49;78619:11;;78600:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;78632:10:0;;;-1:-1:-1;78644:4:0;;-1:-1:-1;78600:18:0;:49::i;:::-;78593:56;;;78404:253;;;;;;;:::o;81322:630::-;58345:13;:11;:13::i;:::-;81417:1:::1;81407:7;:11;81399:59;;;::::0;-1:-1:-1;;;81399:59:0;;10208:2:1;81399:59:0::1;::::0;::::1;10190:21:1::0;10247:2;10227:18;;;10220:30;10286:34;10266:18;;;10259:62;-1:-1:-1;;;10337:18:1;;;10330:33;10380:19;;81399:59:0::1;10006:399:1::0;81399:59:0::1;81491:3;81477:11;;:17;81469:63;;;::::0;-1:-1:-1;;;81469:63:0;;10971:2:1;81469:63:0::1;::::0;::::1;10953:21:1::0;11010:2;10990:18;;;10983:30;11049:34;11029:18;;;11022:62;-1:-1:-1;;;11100:18:1;;;11093:31;11141:19;;81469:63:0::1;10769:397:1::0;81469:63:0::1;81578:10;81589:7;81578:19;;;;;;;;:::i;:::-;;;;;;;;;81551:15;:24;81567:7;81551:24;;;;;;;;;;;;:46;81543:110;;;::::0;-1:-1:-1;;;81543:110:0;;18381:2:1;81543:110:0::1;::::0;::::1;18363:21:1::0;18420:2;18400:18;;;18393:30;18459:34;18439:18;;;18432:62;18530:21;18510:18;;;18503:49;18569:19;;81543:110:0::1;18179:415:1::0;81543:110:0::1;81664:24;::::0;;;:15:::1;:24;::::0;;;;:27;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;81702:15:0::1;81720:24:::0;;;:15:::1;:24;::::0;;;;;81757:25:::1;81767:5:::0;81720:24;81757:9:::1;:25::i;:::-;81795:24;::::0;;;:15:::1;:24;::::0;;;;:27;;;::::1;::::0;::::1;:::i;82681:50::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62418:104::-;62474:13;62507:7;62500:14;;;;;:::i;84193:176::-;84297:8;3063:42;4957:45;:49;4953:225;;5028:67;;-1:-1:-1;;;5028:67:0;;5079:4;5028:67;;;13149:34:1;-1:-1:-1;;;;;13219:15:1;;13199:18;;;13192:43;3063:42:0;;5028;;13061:18:1;;5028:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5023:144;;5123:28;;-1:-1:-1;;;5123:28:0;;-1:-1:-1;;;;;3335:55:1;;5123:28:0;;;3317:74:1;3290:18;;5123:28:0;3171:226:1;5023:144:0;84318:43:::1;84342:8;84352;84318:23;:43::i;84892:228::-:0;85043:4;3063:42;4211:45;:49;4207:539;;4500:10;-1:-1:-1;;;;;4492:18:0;;;4488:85;;85065:47:::1;85088:4;85094:2;85098:7;85107:4;85065:22;:47::i;:::-;4551:7:::0;;4488:85;4592:69;;-1:-1:-1;;;4592:69:0;;4643:4;4592:69;;;13149:34:1;4650:10:0;13199:18:1;;;13192:43;3063:42:0;;4592;;13061:18:1;;4592:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4587:148;;4689:30;;-1:-1:-1;;;4689:30:0;;4708:10;4689:30;;;3317:74:1;3290:18;;4689:30:0;3171:226:1;4587:148:0;85065:47:::1;85088:4;85094:2;85098:7;85107:4;85065:22;:47::i;:::-;84892:228:::0;;;;;:::o;78973:57::-;;;;;;;;;;;;77947:275;67094:4;66692:16;;;:7;:16;;;;;;78012:13;;-1:-1:-1;;;;;66692:16:0;78038:56;;;;-1:-1:-1;;;78038:56:0;;17726:2:1;78038:56:0;;;17708:21:1;17765:2;17745:18;;;17738:30;17804:29;17784:18;;;17777:57;17851:18;;78038:56:0;17524:351:1;78038:56:0;78136:1;78118:7;78112:21;;;;;:::i;:::-;;;:25;:102;;;;;;;;;;;;;;;;;78164:7;78173:25;78190:7;78173:16;:25::i;:::-;78147:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78105:109;77947:275;-1:-1:-1;;77947:275:0:o;59358:201::-;58345:13;:11;:13::i;:::-;-1:-1:-1;;;;;59447:22:0;::::1;59439:73;;;::::0;-1:-1:-1;;;59439:73:0;;19993:2:1;59439:73:0::1;::::0;::::1;19975:21:1::0;20032:2;20012:18;;;20005:30;20071:34;20051:18;;;20044:62;20142:8;20122:18;;;20115:36;20168:19;;59439:73:0::1;19791:402:1::0;59439:73:0::1;59523:28;59542:8;59523:18;:28::i;:::-;59358:201:::0;:::o;85324:131::-;58345:13;:11;:13::i;:::-;85397:50:::1;::::0;-1:-1:-1;;;;;85397:27:0;::::1;::::0;85425:21:::1;85397:50:::0;::::1;;;::::0;::::1;::::0;;;85425:21;85397:27;:50;::::1;;;;;;;;;;;;;::::0;::::1;;;;54498:215:::0;54600:4;-1:-1:-1;;;;;;54624:41:0;;54639:26;54624:41;;:81;;;54669:36;54693:11;54669:23;:36::i;58624:132::-;58532:6;;-1:-1:-1;;;;;58532:6:0;33159:10;58688:23;58680:68;;;;-1:-1:-1;;;58680:68:0;;20400:2:1;58680:68:0;;;20382:21:1;;;20419:18;;;20412:30;20478:34;20458:18;;;20451:62;20530:18;;58680:68:0;20198:356:1;55856:332:0;55572:5;55959:33;;;;;55951:88;;;;-1:-1:-1;;;55951:88:0;;20761:2:1;55951:88:0;;;20743:21:1;20800:2;20780:18;;;20773:30;20839:34;20819:18;;;20812:62;-1:-1:-1;;;20890:18:1;;;20883:40;20940:19;;55951:88:0;20559:406:1;55951:88:0;-1:-1:-1;;;;;56058:22:0;;56050:60;;;;-1:-1:-1;;;56050:60:0;;21172:2:1;56050:60:0;;;21154:21:1;21211:2;21191:18;;;21184:30;21250:27;21230:18;;;21223:55;21295:18;;56050:60:0;20970:349:1;56050:60:0;56145:35;;;;;;;;;-1:-1:-1;;;;;56145:35:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;56123:57:0;;;;:19;:57;55856:332::o;67930:110::-;68006:26;68016:2;68020:7;68006:26;;;;;;;;;;;;:9;:26::i;73324:135::-;67094:4;66692:16;;;:7;:16;;;;;;-1:-1:-1;;;;;66692:16:0;73398:53;;;;-1:-1:-1;;;73398:53:0;;16963:2:1;73398:53:0;;;16945:21:1;17002:2;16982:18;;;16975:30;17041:26;17021:18;;;17014:54;17085:18;;73398:53:0;16761:348:1;63279:416:0;63360:13;63376:23;63391:7;63376:14;:23::i;:::-;63360:39;;63424:5;-1:-1:-1;;;;;63418:11:0;:2;-1:-1:-1;;;;;63418:11:0;;63410:57;;;;-1:-1:-1;;;63410:57:0;;21526:2:1;63410:57:0;;;21508:21:1;21565:2;21545:18;;;21538:30;21604:34;21584:18;;;21577:62;21675:3;21655:18;;;21648:31;21696:19;;63410:57:0;21324:397:1;63410:57:0;33159:10;-1:-1:-1;;;;;63502:21:0;;;;:62;;-1:-1:-1;;;;;;64351:25:0;;64327:4;64351:25;;;:18;:25;;;;;;;;33159:10;64351:35;;;;;;;;;;63527:37;63480:173;;;;-1:-1:-1;;;63480:173:0;;21928:2:1;63480:173:0;;;21910:21:1;21967:2;21947:18;;;21940:30;22006:34;21986:18;;;21979:62;22077:31;22057:18;;;22050:59;22126:19;;63480:173:0;21726:425:1;63480:173:0;63666:21;63675:2;63679:7;63666:8;:21::i;64461:301::-;64622:41;33159:10;64655:7;64622:18;:41::i;:::-;64614:99;;;;-1:-1:-1;;;64614:99:0;;22358:2:1;64614:99:0;;;22340:21:1;22397:2;22377:18;;;22370:30;22436:34;22416:18;;;22409:62;-1:-1:-1;;;22487:18:1;;;22480:43;22540:19;;64614:99:0;22156:409:1;64614:99:0;64726:28;64736:4;64742:2;64746:7;64726:9;:28::i;64833:151::-;64937:39;64954:4;64960:2;64964:7;64937:39;;;;;;;;;;;;:16;:39::i;56639:356::-;55572:5;56757:33;;;;;56749:88;;;;-1:-1:-1;;;56749:88:0;;20761:2:1;56749:88:0;;;20743:21:1;20800:2;20780:18;;;20773:30;20839:34;20819:18;;;20812:62;-1:-1:-1;;;20890:18:1;;;20883:40;20940:19;;56749:88:0;20559:406:1;56749:88:0;-1:-1:-1;;;;;56856:22:0;;56848:62;;;;-1:-1:-1;;;56848:62:0;;22772:2:1;56848:62:0;;;22754:21:1;22811:2;22791:18;;;22784:30;22850:29;22830:18;;;22823:57;22897:18;;56848:62:0;22570:351:1;56848:62:0;56952:35;;;;;;;;-1:-1:-1;;;;;56952:35:0;;;;;;;;;;;;;;;;-1:-1:-1;56923:26:0;;;:17;:26;;;;;;:64;;;;;;;-1:-1:-1;;;56923:64:0;;;;;;56639:356::o;59719:191::-;59812:6;;;-1:-1:-1;;;;;59829:17:0;;;-1:-1:-1;;59829:17:0;;;;;;;59862:40;;59812:6;;;59829:17;59812:6;;59862:40;;59793:16;;59862:40;59782:128;59719:191;:::o;6421:156::-;6512:4;6565;6536:25;6549:5;6556:4;6536:12;:25::i;:::-;:33;;6421:156;-1:-1:-1;;;;6421:156:0:o;64004:155::-;64099:52;33159:10;64132:8;64142;64099:18;:52::i;65055:279::-;65186:41;33159:10;65219:7;65186:18;:41::i;:::-;65178:99;;;;-1:-1:-1;;;65178:99:0;;22358:2:1;65178:99:0;;;22340:21:1;22397:2;22377:18;;;22370:30;22436:34;22416:18;;;22409:62;-1:-1:-1;;;22487:18:1;;;22480:43;22540:19;;65178:99:0;22156:409:1;65178:99:0;65288:38;65302:4;65308:2;65312:7;65321:4;65288:13;:38::i;30001:716::-;30057:13;30108:14;30125:17;30136:5;30125:10;:17::i;:::-;30145:1;30125:21;30108:38;;30161:20;30195:6;30184:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30184:18:0;-1:-1:-1;30161:41:0;-1:-1:-1;30326:28:0;;;30342:2;30326:28;30383:288;-1:-1:-1;;30415:5:0;30557:8;30552:2;30541:14;;30536:30;30415:5;30523:44;30613:2;30604:11;;;-1:-1:-1;30634:21:0;30383:288;30634:21;-1:-1:-1;30692:6:0;30001:716;-1:-1:-1;;;30001:716:0:o;61321:305::-;61423:4;-1:-1:-1;;;;;;61460:40:0;;61475:25;61460:40;;:105;;-1:-1:-1;;;;;;;61517:48:0;;61532:33;61517:48;61460:105;:158;;;-1:-1:-1;51673:25:0;-1:-1:-1;;;;;;51658:40:0;;;61582:36;51549:157;68267:285;68362:18;68368:2;68372:7;68362:5;:18::i;:::-;68413:53;68444:1;68448:2;68452:7;68461:4;68413:22;:53::i;:::-;68391:153;;;;-1:-1:-1;;;68391:153:0;;23128:2:1;68391:153:0;;;23110:21:1;23167:2;23147:18;;;23140:30;23206:34;23186:18;;;23179:62;-1:-1:-1;;;23257:18:1;;;23250:48;23315:19;;68391:153:0;22926:414:1;72637:174:0;72712:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;72712:29:0;-1:-1:-1;;;;;72712:29:0;;;;;;;;:24;;72766:23;72712:24;72766:14;:23::i;:::-;-1:-1:-1;;;;;72757:46:0;;;;;;;;;;;72637:174;;:::o;67324:264::-;67417:4;67434:13;67450:23;67465:7;67450:14;:23::i;:::-;67434:39;;67503:5;-1:-1:-1;;;;;67492:16:0;:7;-1:-1:-1;;;;;67492:16:0;;:52;;;-1:-1:-1;;;;;;64351:25:0;;;64327:4;64351:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;67512:32;67492:87;;;;67572:7;-1:-1:-1;;;;;67548:31:0;:20;67560:7;67548:11;:20::i;:::-;-1:-1:-1;;;;;67548:31:0;;67484:96;67324:264;-1:-1:-1;;;;67324:264:0:o;71289:1229::-;71414:4;-1:-1:-1;;;;;71387:31:0;:23;71402:7;71387:14;:23::i;:::-;-1:-1:-1;;;;;71387:31:0;;71379:81;;;;-1:-1:-1;;;71379:81:0;;23547:2:1;71379:81:0;;;23529:21:1;23586:2;23566:18;;;23559:30;23625:34;23605:18;;;23598:62;-1:-1:-1;;;23676:18:1;;;23669:35;23721:19;;71379:81:0;23345:401:1;71379:81:0;-1:-1:-1;;;;;71479:16:0;;71471:65;;;;-1:-1:-1;;;71471:65:0;;23953:2:1;71471:65:0;;;23935:21:1;23992:2;23972:18;;;23965:30;24031:34;24011:18;;;24004:62;24102:6;24082:18;;;24075:34;24126:19;;71471:65:0;23751:400:1;71471:65:0;71549:42;71570:4;71576:2;71580:7;71589:1;71549:20;:42::i;:::-;71721:4;-1:-1:-1;;;;;71694:31:0;:23;71709:7;71694:14;:23::i;:::-;-1:-1:-1;;;;;71694:31:0;;71686:81;;;;-1:-1:-1;;;71686:81:0;;23547:2:1;71686:81:0;;;23529:21:1;23586:2;23566:18;;;23559:30;23625:34;23605:18;;;23598:62;-1:-1:-1;;;23676:18:1;;;23669:35;23721:19;;71686:81:0;23345:401:1;71686:81:0;71839:24;;;;:15;:24;;;;;;;;71832:31;;-1:-1:-1;;71832:31:0;;;;;;-1:-1:-1;;;;;72315:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;72315:20:0;;;72350:13;;;;;;;;;:18;;71832:31;72350:18;;;72390:16;;;:7;:16;;;;;;:21;;;;;;;;;;72429:27;;71855:7;;72429:27;;;84377:157;;;:::o;7220:296::-;7303:7;7346:4;7303:7;7361:118;7385:5;:12;7381:1;:16;7361:118;;;7434:33;7444:12;7458:5;7464:1;7458:8;;;;;;;;:::i;:::-;;;;;;;7434:9;:33::i;:::-;7419:48;-1:-1:-1;7399:3:0;;;;:::i;:::-;;;;7361:118;;;-1:-1:-1;7496:12:0;7220:296;-1:-1:-1;;;7220:296:0:o;72954:281::-;73075:8;-1:-1:-1;;;;;73066:17:0;:5;-1:-1:-1;;;;;73066:17:0;;73058:55;;;;-1:-1:-1;;;73058:55:0;;24358:2:1;73058:55:0;;;24340:21:1;24397:2;24377:18;;;24370:30;24436:27;24416:18;;;24409:55;24481:18;;73058:55:0;24156:349:1;73058:55:0;-1:-1:-1;;;;;73124:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;73124:46:0;;;;;;;;;;73186:41;;953::1;;;73186::0;;926:18:1;73186:41:0;;;;;;;72954:281;;;:::o;66215:270::-;66328:28;66338:4;66344:2;66348:7;66328:9;:28::i;:::-;66375:47;66398:4;66404:2;66408:7;66417:4;66375:22;:47::i;:::-;66367:110;;;;-1:-1:-1;;;66367:110:0;;23128:2:1;66367:110:0;;;23110:21:1;23167:2;23147:18;;;23140:30;23206:34;23186:18;;;23179:62;-1:-1:-1;;;23257:18:1;;;23250:48;23315:19;;66367:110:0;22926:414:1;26838:948:0;26891:7;;26978:8;26969:17;;26965:106;;27016:8;27007:17;;;-1:-1:-1;27053:2:0;27043:12;26965:106;27098:8;27089:5;:17;27085:106;;27136:8;27127:17;;;-1:-1:-1;27173:2:0;27163:12;27085:106;27218:8;27209:5;:17;27205:106;;27256:8;27247:17;;;-1:-1:-1;27293:2:0;27283:12;27205:106;27338:7;27329:5;:16;27325:103;;27375:7;27366:16;;;-1:-1:-1;27411:1:0;27401:11;27325:103;27455:7;27446:5;:16;27442:103;;27492:7;27483:16;;;-1:-1:-1;27528:1:0;27518:11;27442:103;27572:7;27563:5;:16;27559:103;;27609:7;27600:16;;;-1:-1:-1;27645:1:0;27635:11;27559:103;27689:7;27680:5;:16;27676:68;;27727:1;27717:11;27772:6;26838:948;-1:-1:-1;;26838:948:0:o;68888:942::-;-1:-1:-1;;;;;68968:16:0;;68960:61;;;;-1:-1:-1;;;68960:61:0;;24712:2:1;68960:61:0;;;24694:21:1;;;24731:18;;;24724:30;24790:34;24770:18;;;24763:62;24842:18;;68960:61:0;24510:356:1;68960:61:0;67094:4;66692:16;;;:7;:16;;;;;;-1:-1:-1;;;;;66692:16:0;67118:31;69032:58;;;;-1:-1:-1;;;69032:58:0;;25073:2:1;69032:58:0;;;25055:21:1;25112:2;25092:18;;;25085:30;25151;25131:18;;;25124:58;25199:18;;69032:58:0;24871:352:1;69032:58:0;69103:48;69132:1;69136:2;69140:7;69149:1;69103:20;:48::i;:::-;67094:4;66692:16;;;:7;:16;;;;;;-1:-1:-1;;;;;66692:16:0;67118:31;69241:58;;;;-1:-1:-1;;;69241:58:0;;25073:2:1;69241:58:0;;;25055:21:1;25112:2;25092:18;;;25085:30;25151;25131:18;;;25124:58;25199:18;;69241:58:0;24871:352:1;69241:58:0;-1:-1:-1;;;;;69648:13:0;;;;;;:9;:13;;;;;;;;:18;;69665:1;69648:18;;;69690:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;69690:21:0;;;;;69729:33;69698:7;;69648:13;;69729:33;;69648:13;;69729:33;83866:143;;:::o;74023:853::-;74177:4;-1:-1:-1;;;;;74198:13:0;;35059:19;:23;74194:675;;74234:71;;-1:-1:-1;;;74234:71:0;;-1:-1:-1;;;;;74234:36:0;;;;;:71;;33159:10;;74285:4;;74291:7;;74300:4;;74234:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74234:71:0;;;;;;;;-1:-1:-1;;74234:71:0;;;;;;;;;;;;:::i;:::-;;;74230:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74475:6;:13;74492:1;74475:18;74471:328;;74518:60;;-1:-1:-1;;;74518:60:0;;23128:2:1;74518:60:0;;;23110:21:1;23167:2;23147:18;;;23140:30;23206:34;23186:18;;;23179:62;-1:-1:-1;;;23257:18:1;;;23250:48;23315:19;;74518:60:0;22926:414:1;74471:328:0;74749:6;74743:13;74734:6;74730:2;74726:15;74719:38;74230:584;-1:-1:-1;;;;;;74356:51:0;-1:-1:-1;;;74356:51:0;;-1:-1:-1;74349:58:0;;74194:675;-1:-1:-1;74853:4:0;74846:11;;83340:501;83551:9;83546:288;83566:9;83564:1;:11;83546:288;;;83597:15;83615:16;83630:1;83615:12;:16;:::i;:::-;83597:34;-1:-1:-1;;;;;;83650:18:0;;;83646:85;;83689:26;83701:4;83707:7;83689:11;:26::i;:::-;-1:-1:-1;;;;;83749:16:0;;;83745:78;;-1:-1:-1;;;;;82938:18:0;;;;;;:12;:18;;;;;;;:32;;;;;;;;;;;;;;;;83786:21;-1:-1:-1;83577:3:0;;;;:::i;:::-;;;;83546:288;;14658:149;14721:7;14752:1;14748;:5;:51;;14883:13;14977:15;;;15013:4;15006:15;;;15060:4;15044:21;;14748:51;;;14883:13;14977:15;;;15013:4;15006:15;;;15060:4;15044:21;;14756:20;14741:58;14658:149;-1:-1:-1;;;14658:149:0:o;82986:346::-;-1:-1:-1;;;;;83084:18:0;;83058:23;83084:18;;;:12;:18;;;;;;83113:212;83133:12;;83131:14;;83113:212;;;83182:7;83170:5;83176:1;83170:8;;;;;;;;:::i;:::-;;;;;;;;;:19;83167:147;;83227:12;;83221:5;;83227:16;;83242:1;;83227:16;:::i;:::-;83221:23;;;;;;;;:::i;:::-;;;;;;;;;83210:5;83216:1;83210:8;;;;;;;;:::i;:::-;;;;;;;;:34;;;;83263:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;83293:5;;83167:147;83147:3;;;;:::i;:::-;;;;83113:212;;14:180:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;381:177::-;-1:-1:-1;;;;;;459:5:1;455:78;448:5;445:89;435:117;;548:1;545;538:12;563:245;621:6;674:2;662:9;653:7;649:23;645:32;642:52;;;690:1;687;680:12;642:52;729:9;716:23;748:30;772:5;748:30;:::i;1005:196::-;1073:20;;-1:-1:-1;;;;;1122:54:1;;1112:65;;1102:93;;1191:1;1188;1181:12;1102:93;1005:196;;;:::o;1206:179::-;1273:20;;1333:26;1322:38;;1312:49;;1302:77;;1375:1;1372;1365:12;1390:258;1457:6;1465;1518:2;1506:9;1497:7;1493:23;1489:32;1486:52;;;1534:1;1531;1524:12;1486:52;1557:29;1576:9;1557:29;:::i;:::-;1547:39;;1605:37;1638:2;1627:9;1623:18;1605:37;:::i;:::-;1595:47;;1390:258;;;;;:::o;1653:757::-;1757:6;1765;1773;1781;1834:2;1822:9;1813:7;1809:23;1805:32;1802:52;;;1850:1;1847;1840:12;1802:52;1873:29;1892:9;1873:29;:::i;:::-;1863:39;;1949:2;1938:9;1934:18;1921:32;1911:42;;2004:2;1993:9;1989:18;1976:32;2027:18;2068:2;2060:6;2057:14;2054:34;;;2084:1;2081;2074:12;2054:34;2122:6;2111:9;2107:22;2097:32;;2167:7;2160:4;2156:2;2152:13;2148:27;2138:55;;2189:1;2186;2179:12;2138:55;2229:2;2216:16;2255:2;2247:6;2244:14;2241:34;;;2271:1;2268;2261:12;2241:34;2324:7;2319:2;2309:6;2306:1;2302:14;2298:2;2294:23;2290:32;2287:45;2284:65;;;2345:1;2342;2335:12;2284:65;1653:757;;;;-1:-1:-1;;2376:2:1;2368:11;;-1:-1:-1;;;1653:757:1:o;2415:250::-;2500:1;2510:113;2524:6;2521:1;2518:13;2510:113;;;2600:11;;;2594:18;2581:11;;;2574:39;2546:2;2539:10;2510:113;;;-1:-1:-1;;2657:1:1;2639:16;;2632:27;2415:250::o;2670:271::-;2712:3;2750:5;2744:12;2777:6;2772:3;2765:19;2793:76;2862:6;2855:4;2850:3;2846:14;2839:4;2832:5;2828:16;2793:76;:::i;:::-;2923:2;2902:15;-1:-1:-1;;2898:29:1;2889:39;;;;2930:4;2885:50;;2670:271;-1:-1:-1;;2670:271:1:o;2946:220::-;3095:2;3084:9;3077:21;3058:4;3115:45;3156:2;3145:9;3141:18;3133:6;3115:45;:::i;3402:254::-;3470:6;3478;3531:2;3519:9;3510:7;3506:23;3502:32;3499:52;;;3547:1;3544;3537:12;3499:52;3570:29;3589:9;3570:29;:::i;:::-;3560:39;3646:2;3631:18;;;;3618:32;;-1:-1:-1;;;3402:254:1:o;3661:186::-;3720:6;3773:2;3761:9;3752:7;3748:23;3744:32;3741:52;;;3789:1;3786;3779:12;3741:52;3812:29;3831:9;3812:29;:::i;3852:632::-;4023:2;4075:21;;;4145:13;;4048:18;;;4167:22;;;3994:4;;4023:2;4246:15;;;;4220:2;4205:18;;;3994:4;4289:169;4303:6;4300:1;4297:13;4289:169;;;4364:13;;4352:26;;4433:15;;;;4398:12;;;;4325:1;4318:9;4289:169;;;-1:-1:-1;4475:3:1;;3852:632;-1:-1:-1;;;;;;3852:632:1:o;4489:328::-;4566:6;4574;4582;4635:2;4623:9;4614:7;4610:23;4606:32;4603:52;;;4651:1;4648;4641:12;4603:52;4674:29;4693:9;4674:29;:::i;:::-;4664:39;;4722:38;4756:2;4745:9;4741:18;4722:38;:::i;:::-;4712:48;;4807:2;4796:9;4792:18;4779:32;4769:42;;4489:328;;;;;:::o;4822:248::-;4890:6;4898;4951:2;4939:9;4930:7;4926:23;4922:32;4919:52;;;4967:1;4964;4957:12;4919:52;-1:-1:-1;;4990:23:1;;;5060:2;5045:18;;;5032:32;;-1:-1:-1;4822:248:1:o;6006:184::-;-1:-1:-1;;;6055:1:1;6048:88;6155:4;6152:1;6145:15;6179:4;6176:1;6169:15;6195:632;6260:5;6290:18;6331:2;6323:6;6320:14;6317:40;;;6337:18;;:::i;:::-;6412:2;6406:9;6380:2;6466:15;;-1:-1:-1;;6462:24:1;;;6488:2;6458:33;6454:42;6442:55;;;6512:18;;;6532:22;;;6509:46;6506:72;;;6558:18;;:::i;:::-;6598:10;6594:2;6587:22;6627:6;6618:15;;6657:6;6649;6642:22;6697:3;6688:6;6683:3;6679:16;6676:25;6673:45;;;6714:1;6711;6704:12;6673:45;6764:6;6759:3;6752:4;6744:6;6740:17;6727:44;6819:1;6812:4;6803:6;6795;6791:19;6787:30;6780:41;;;;6195:632;;;;;:::o;6832:451::-;6901:6;6954:2;6942:9;6933:7;6929:23;6925:32;6922:52;;;6970:1;6967;6960:12;6922:52;7010:9;6997:23;7043:18;7035:6;7032:30;7029:50;;;7075:1;7072;7065:12;7029:50;7098:22;;7151:4;7143:13;;7139:27;-1:-1:-1;7129:55:1;;7180:1;7177;7170:12;7129:55;7203:74;7269:7;7264:2;7251:16;7246:2;7242;7238:11;7203:74;:::i;7288:326::-;7364:6;7372;7380;7433:2;7421:9;7412:7;7408:23;7404:32;7401:52;;;7449:1;7446;7439:12;7401:52;7485:9;7472:23;7462:33;;7514:38;7548:2;7537:9;7533:18;7514:38;:::i;:::-;7504:48;;7571:37;7604:2;7593:9;7589:18;7571:37;:::i;:::-;7561:47;;7288:326;;;;;:::o;7619:118::-;7705:5;7698:13;7691:21;7684:5;7681:32;7671:60;;7727:1;7724;7717:12;7742:241;7798:6;7851:2;7839:9;7830:7;7826:23;7822:32;7819:52;;;7867:1;7864;7857:12;7819:52;7906:9;7893:23;7925:28;7947:5;7925:28;:::i;7988:315::-;8053:6;8061;8114:2;8102:9;8093:7;8089:23;8085:32;8082:52;;;8130:1;8127;8120:12;8082:52;8153:29;8172:9;8153:29;:::i;:::-;8143:39;;8232:2;8221:9;8217:18;8204:32;8245:28;8267:5;8245:28;:::i;:::-;8292:5;8282:15;;;7988:315;;;;;:::o;8308:667::-;8403:6;8411;8419;8427;8480:3;8468:9;8459:7;8455:23;8451:33;8448:53;;;8497:1;8494;8487:12;8448:53;8520:29;8539:9;8520:29;:::i;:::-;8510:39;;8568:38;8602:2;8591:9;8587:18;8568:38;:::i;:::-;8558:48;;8653:2;8642:9;8638:18;8625:32;8615:42;;8708:2;8697:9;8693:18;8680:32;8735:18;8727:6;8724:30;8721:50;;;8767:1;8764;8757:12;8721:50;8790:22;;8843:4;8835:13;;8831:27;-1:-1:-1;8821:55:1;;8872:1;8869;8862:12;8821:55;8895:74;8961:7;8956:2;8943:16;8938:2;8934;8930:11;8895:74;:::i;:::-;8885:84;;;8308:667;;;;;;;:::o;8980:260::-;9048:6;9056;9109:2;9097:9;9088:7;9084:23;9080:32;9077:52;;;9125:1;9122;9115:12;9077:52;9148:29;9167:9;9148:29;:::i;:::-;9138:39;;9196:38;9230:2;9219:9;9215:18;9196:38;:::i;11171:184::-;-1:-1:-1;;;11220:1:1;11213:88;11320:4;11317:1;11310:15;11344:4;11341:1;11334:15;12143:184;-1:-1:-1;;;12192:1:1;12185:88;12292:4;12289:1;12282:15;12316:4;12313:1;12306:15;12332:135;12371:3;12392:17;;;12389:43;;12412:18;;:::i;:::-;-1:-1:-1;12459:1:1;12448:13;;12332:135::o;12472:437::-;12551:1;12547:12;;;;12594;;;12615:61;;12669:4;12661:6;12657:17;12647:27;;12615:61;12722:2;12714:6;12711:14;12691:18;12688:38;12685:218;;-1:-1:-1;;;12756:1:1;12749:88;12860:4;12857:1;12850:15;12888:4;12885:1;12878:15;12685:218;;12472:437;;;:::o;13246:245::-;13313:6;13366:2;13354:9;13345:7;13341:23;13337:32;13334:52;;;13382:1;13379;13372:12;13334:52;13414:9;13408:16;13433:28;13455:5;13433:28;:::i;13496:168::-;13569:9;;;13600;;13617:15;;;13611:22;;13597:37;13587:71;;13638:18;;:::i;13858:274::-;13898:1;13924;13914:189;;-1:-1:-1;;;13956:1:1;13949:88;14060:4;14057:1;14050:15;14088:4;14085:1;14078:15;13914:189;-1:-1:-1;14117:9:1;;13858:274::o;14263:545::-;14365:2;14360:3;14357:11;14354:448;;;14401:1;14426:5;14422:2;14415:17;14471:4;14467:2;14457:19;14541:2;14529:10;14525:19;14522:1;14518:27;14512:4;14508:38;14577:4;14565:10;14562:20;14559:47;;;-1:-1:-1;14600:4:1;14559:47;14655:2;14650:3;14646:12;14643:1;14639:20;14633:4;14629:31;14619:41;;14710:82;14728:2;14721:5;14718:13;14710:82;;;14773:17;;;14754:1;14743:13;14710:82;;;14714:3;;;14263:545;;;:::o;14984:1352::-;15110:3;15104:10;15137:18;15129:6;15126:30;15123:56;;;15159:18;;:::i;:::-;15188:97;15278:6;15238:38;15270:4;15264:11;15238:38;:::i;:::-;15232:4;15188:97;:::i;:::-;15340:4;;15404:2;15393:14;;15421:1;15416:663;;;;16123:1;16140:6;16137:89;;;-1:-1:-1;16192:19:1;;;16186:26;16137:89;-1:-1:-1;;14941:1:1;14937:11;;;14933:24;14929:29;14919:40;14965:1;14961:11;;;14916:57;16239:81;;15386:944;;15416:663;14210:1;14203:14;;;14247:4;14234:18;;-1:-1:-1;;15452:20:1;;;15570:236;15584:7;15581:1;15578:14;15570:236;;;15673:19;;;15667:26;15652:42;;15765:27;;;;15733:1;15721:14;;;;15600:19;;15570:236;;;15574:3;15834:6;15825:7;15822:19;15819:201;;;15895:19;;;15889:26;-1:-1:-1;;15978:1:1;15974:14;;;15990:3;15970:24;15966:37;15962:42;15947:58;15932:74;;15819:201;-1:-1:-1;;;;;16066:1:1;16050:14;;;16046:22;16033:36;;-1:-1:-1;14984:1352:1:o;18599:1187::-;18876:3;18905:1;18938:6;18932:13;18968:36;18994:9;18968:36;:::i;:::-;19023:1;19040:18;;;19067:133;;;;19214:1;19209:356;;;;19033:532;;19067:133;-1:-1:-1;;19100:24:1;;19088:37;;19173:14;;19166:22;19154:35;;19145:45;;;-1:-1:-1;19067:133:1;;19209:356;19240:6;19237:1;19230:17;19270:4;19315:2;19312:1;19302:16;19340:1;19354:165;19368:6;19365:1;19362:13;19354:165;;;19446:14;;19433:11;;;19426:35;19489:16;;;;19383:10;;19354:165;;;19358:3;;;19548:6;19543:3;19539:16;19532:23;;19033:532;;;;;19596:6;19590:13;19612:68;19671:8;19666:3;19659:4;19651:6;19647:17;19612:68;:::i;:::-;19743:7;19702:18;;19729:22;;;19778:1;19767:13;;18599:1187;-1:-1:-1;;;;18599:1187:1:o;25228:512::-;25422:4;-1:-1:-1;;;;;25532:2:1;25524:6;25520:15;25509:9;25502:34;25584:2;25576:6;25572:15;25567:2;25556:9;25552:18;25545:43;;25624:6;25619:2;25608:9;25604:18;25597:34;25667:3;25662:2;25651:9;25647:18;25640:31;25688:46;25729:3;25718:9;25714:19;25706:6;25688:46;:::i;:::-;25680:54;25228:512;-1:-1:-1;;;;;;25228:512:1:o;25745:249::-;25814:6;25867:2;25855:9;25846:7;25842:23;25838:32;25835:52;;;25883:1;25880;25873:12;25835:52;25915:9;25909:16;25934:30;25958:5;25934:30;:::i;25999:125::-;26064:9;;;26085:10;;;26082:36;;;26098:18;;:::i;26129:128::-;26196:9;;;26217:11;;;26214:37;;;26231:18;;:::i;26262:184::-;-1:-1:-1;;;26311:1:1;26304:88;26411:4;26408:1;26401:15;26435:4;26432:1;26425:15

Swarm Source

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