ETH Price: $3,273.15 (+0.82%)
Gas: 1 Gwei

Token

The Carrotz (The Carrotz)
 

Overview

Max Total Supply

45 The Carrotz

Holders

34

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
knightnah.eth
Balance
2 The Carrotz
0x47bA2d564d75677485638acfFe54A5CAB90807Fa
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:
CarrotzContract

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

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

// File: ContractEnkardia/ContractEnkardia/lib/Constants.sol


pragma solidity ^0.8.13;

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;
// File: ContractEnkardia/ContractEnkardia/IOperatorFilterRegistry.sol


pragma solidity ^0.8;

interface IOperatorFilterRegistry {
    /**
     * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns
     *         true if supplied registrant address is not registered.
     */
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);

    /**
     * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner.
     */
    function register(address registrant) external;

    /**
     * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes.
     */
    function registerAndSubscribe(address registrant, address subscription) external;

    /**
     * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another
     *         address without subscribing.
     */
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;

    /**
     * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner.
     *         Note that this does not remove any filtered addresses or codeHashes.
     *         Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes.
     */
    function unregister(address addr) external;

    /**
     * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered.
     */
    function updateOperator(address registrant, address operator, bool filtered) external;

    /**
     * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates.
     */
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;

    /**
     * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered.
     */
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;

    /**
     * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates.
     */
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;

    /**
     * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous
     *         subscription if present.
     *         Note that accounts with subscriptions may go on to subscribe to other accounts - in this case,
     *         subscriptions will not be forwarded. Instead the former subscription's existing entries will still be
     *         used.
     */
    function subscribe(address registrant, address registrantToSubscribe) external;

    /**
     * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes.
     */
    function unsubscribe(address registrant, bool copyExistingEntries) external;

    /**
     * @notice Get the subscription address of a given registrant, if any.
     */
    function subscriptionOf(address addr) external returns (address registrant);

    /**
     * @notice Get the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscribers(address registrant) external returns (address[] memory);

    /**
     * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscriberAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr.
     */
    function copyEntriesOf(address registrant, address registrantToCopy) external;

    /**
     * @notice Returns true if operator is filtered by a given address or its subscription.
     */
    function isOperatorFiltered(address registrant, address operator) external returns (bool);

    /**
     * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription.
     */
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);

    /**
     * @notice Returns true if a codeHash is filtered by a given address or its subscription.
     */
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);

    /**
     * @notice Returns a list of filtered operators for a given address or its subscription.
     */
    function filteredOperators(address addr) external returns (address[] memory);

    /**
     * @notice Returns the set of filtered codeHashes for a given address or its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);

    /**
     * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);

    /**
     * @notice Returns true if an address has registered
     */
    function isRegistered(address addr) external returns (bool);

    /**
     * @dev Convenience method to compute the code hash of an arbitrary contract
     */
    function codeHashOf(address addr) external returns (bytes32);
}

// File: ContractEnkardia/ContractEnkardia/OperatorFilterer.sol


pragma solidity ^0.8;


/**
 * @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.
 *         Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract OperatorFilterer {
    /// @dev Emitted when an operator is not allowed.
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);

    /// @dev The constructor that is called when the contract is being deployed.
    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));
                }
            }
        }
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    modifier onlyAllowedOperator(address from) virtual {
        // 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) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    /**
     * @dev A helper function to check if an operator approval is allowed.
     */
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // under normal circumstances, this function will revert rather than return false, but inheriting contracts
            // may specify their own OperatorFilterRegistry implementations, which may behave differently
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

// File: ContractEnkardia/ContractEnkardia/DefaultOperatorFilterer.sol


pragma solidity ^0.8;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 * @dev    Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    /// @dev The constructor that is called when the contract is being deployed.
    constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// 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.8.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) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 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 10, 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 * 8) < 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/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.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 anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/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: @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: ContractEnkardia/ERC721A/contracts/IERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

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

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

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

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: ContractEnkardia/ERC721A/contracts/ERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) _revert(BalanceQueryForZeroAddress.selector);
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) _revert(URIQueryForNonexistentToken.selector);

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

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

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Returns whether the ownership slot at `index` is initialized.
     * An uninitialized slot does not necessarily mean that the slot has no owner.
     */
    function _ownershipIsInitialized(uint256 index) internal view virtual returns (bool) {
        return _packedOwnerships[index] != 0;
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256 packed) {
        if (_startTokenId() <= tokenId) {
            packed = _packedOwnerships[tokenId];
            // If the data at the starting slot does not exist, start the scan.
            if (packed == 0) {
                if (tokenId >= _currentIndex) _revert(OwnerQueryForNonexistentToken.selector);
                // Invariant:
                // There will always be an initialized ownership slot
                // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                // before an unintialized ownership slot
                // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                // Hence, `tokenId` will not underflow.
                //
                // We can directly compare the packed value.
                // If the address is zero, packed will be zero.
                for (;;) {
                    unchecked {
                        packed = _packedOwnerships[--tokenId];
                    }
                    if (packed == 0) continue;
                    if (packed & _BITMASK_BURNED == 0) return packed;
                    // Otherwise, the token is burned, and we must revert.
                    // This handles the case of batch burned tokens, where only the burned bit
                    // of the starting slot is set, and remaining slots are left uninitialized.
                    _revert(OwnerQueryForNonexistentToken.selector);
                }
            }
            // Otherwise, the data exists and we can skip the scan.
            // This is possible because we have already achieved the target condition.
            // This saves 2143 gas on transfers of initialized tokens.
            // If the token is not burned, return `packed`. Otherwise, revert.
            if (packed & _BITMASK_BURNED == 0) return packed;
        }
        _revert(OwnerQueryForNonexistentToken.selector);
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     */
    function approve(address to, uint256 tokenId) public payable virtual override {
        _approve(to, tokenId, true);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) _revert(ApprovalQueryForNonexistentToken.selector);

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool result) {
        if (_startTokenId() <= tokenId) {
            if (tokenId < _currentIndex) {
                uint256 packed;
                while ((packed = _packedOwnerships[tokenId]) == 0) --tokenId;
                result = packed & _BITMASK_BURNED == 0;
            }
        }
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
        from = address(uint160(uint256(uint160(from)) & _BITMASK_ADDRESS));

        if (address(uint160(prevOwnershipPacked)) != from) _revert(TransferFromIncorrectOwner.selector);

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector);

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

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

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
        uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS;
        assembly {
            // Emit the `Transfer` event.
            log4(
                0, // Start of data (0, since no data).
                0, // End of data (0, since no data).
                _TRANSFER_EVENT_SIGNATURE, // Signature.
                from, // `from`.
                toMasked, // `to`.
                tokenId // `tokenId`.
            )
        }
        if (toMasked == 0) _revert(TransferToZeroAddress.selector);

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                _revert(TransferToNonERC721ReceiverImplementer.selector);
            }
    }

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

    /**
     * @dev Hook that is called after a set of serially-ordered token IDs
     * have been transferred. This includes minting.
     * And also called after one token has been burned.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                _revert(TransferToNonERC721ReceiverImplementer.selector);
            }
            assembly {
                revert(add(32, reason), mload(reason))
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) _revert(MintZeroQuantity.selector);

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
            uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS;

            if (toMasked == 0) _revert(MintToZeroAddress.selector);

            uint256 end = startTokenId + quantity;
            uint256 tokenId = startTokenId;

            do {
                assembly {
                    // Emit the `Transfer` event.
                    log4(
                        0, // Start of data (0, since no data).
                        0, // End of data (0, since no data).
                        _TRANSFER_EVENT_SIGNATURE, // Signature.
                        0, // `address(0)`.
                        toMasked, // `to`.
                        tokenId // `tokenId`.
                    )
                }
                // The `!=` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
            } while (++tokenId != end);

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) _revert(MintToZeroAddress.selector);
        if (quantity == 0) _revert(MintZeroQuantity.selector);
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) _revert(MintERC2309QuantityExceedsLimit.selector);

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        _revert(TransferToNonERC721ReceiverImplementer.selector);
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) _revert(bytes4(0));
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                       APPROVAL OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_approve(to, tokenId, false)`.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _approve(to, tokenId, false);
    }

    /**
     * @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:
     *
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        bool approvalCheck
    ) internal virtual {
        address owner = ownerOf(tokenId);

        if (approvalCheck && _msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                _revert(ApprovalCallerNotOwnerNorApproved.selector);
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector);
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) _revert(OwnershipNotInitializedForExtraData.selector);
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }

    /**
     * @dev For more efficient reverts.
     */
    function _revert(bytes4 errorSelector) internal pure {
        assembly {
            mstore(0x00, errorSelector)
            revert(0x00, 0x04)
        }
    }
}

// File: ContractEnkardia/ContractEnkardia/Carrotz.sol


pragma solidity ^0.8;







contract CarrotzContract is ERC721A, ERC2981, DefaultOperatorFilterer, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;

    // Constants
    uint256 public constant MAX_MINT_WHITELIST = 10;
    uint256 public constant MAX_MINT_PUBLIC = 20;
    uint256 public constant FREE_MINT_WHITELIST = 1;
    uint256 public constant FREE_MINT_PUBLIC = 2;
    uint256 public constant MINT_PRICE_WHITELIST = 0.015 ether;
    uint256 public constant MINT_PRICE_PUBLIC = 0.02 ether;
    uint256 public constant MAX_SUPPLY = 2000;
    uint256 public constant FREE_SUPPLY = 500;
    string public constant BASE_EXTENSION = ".json";
    string public constant BASE_URI = "ipfs://QmSwRo6ddmkzxZd5qkczzaE7ibAiioCkm9wF6YqgRaaJH9/";

    // Variables
    uint256 public publicOpen;
    uint256 public wlOpen;
    mapping(address => uint256) public mintedFree;
    mapping(address => uint256) public mintedPaid;
    mapping(address => bool) public whitelist;
    uint256 public totalFreeMinted;
    uint256 public totalPaidMinted;
    bool public teamMinted;

    constructor() ERC721A("The Carrotz", "The Carrotz") {
        _setDefaultRoyalty(msg.sender, 500);
        wlOpen = 1687870800; // 27th 1pm
        publicOpen = wlOpen + 6 hours;
    }
    
    function mint(uint256 _amount) public payable {
        require(totalFreeMinted.add(totalPaidMinted).add(_amount) <= MAX_SUPPLY, "Exceeds max supply");
        require(block.timestamp >= wlOpen, "Minting not open yet");

        uint256 cost;
        uint256 amountToPay = _amount;
        uint256 freeToMint = 0;

        if (totalFreeMinted < FREE_SUPPLY) {
            uint256 freeAmount;
            
            if (block.timestamp < publicOpen && whitelist[msg.sender]) {
                freeAmount = FREE_MINT_WHITELIST;
            } else {
                freeAmount = FREE_MINT_PUBLIC;
            }

            freeAmount = freeAmount > mintedFree[msg.sender] ? freeAmount - mintedFree[msg.sender] : 0;
            freeToMint = freeAmount > _amount ? _amount : freeAmount;
            amountToPay = _amount.sub(freeToMint);
        }

        if (block.timestamp < publicOpen) {
            require(whitelist[msg.sender], "Not in whitelist");
            require(mintedPaid[msg.sender].add(amountToPay) <= MAX_MINT_WHITELIST, "Exceeds max mint for whitelist");
            cost = MINT_PRICE_WHITELIST.mul(amountToPay);
        } else {
            require(mintedPaid[msg.sender].add(amountToPay) <= MAX_MINT_PUBLIC, "Exceeds max mint for public");
            cost = MINT_PRICE_PUBLIC.mul(amountToPay);
        }

        require(msg.value >= cost, "Insufficient ETH sent for mint");

        mintedFree[msg.sender] = mintedFree[msg.sender].add(freeToMint);
        totalFreeMinted = totalFreeMinted.add(freeToMint);
        mintedPaid[msg.sender] = mintedPaid[msg.sender].add(amountToPay);
        totalPaidMinted = totalPaidMinted.add(amountToPay);

        // Transfer the Ether to the contract owner
        if (msg.value > 0) {
            payable(owner()).transfer(msg.value);
        }
        
        _mint(msg.sender, _amount);
    }

    function mint23Team() external onlyOwner {
        require(teamMinted == false);
        _mint(owner(), 23);
        teamMinted = true;
    }

    function getMintInfo(uint256 _desiredAmount, address _minter) public view returns (uint256 cost, uint256 maxAmount) {
        cost = 0;
        maxAmount = 0;

        if (totalFreeMinted.add(totalPaidMinted).add(_desiredAmount) <= MAX_SUPPLY && block.timestamp >= wlOpen) {
            uint256 amountToPay = _desiredAmount;
            uint256 freeToMint = 0;
            uint256 freeAmount = 0;

            if (totalFreeMinted < FREE_SUPPLY) {
                if (block.timestamp < publicOpen && whitelist[_minter]) {
                    freeAmount = FREE_MINT_WHITELIST;
                } else if (block.timestamp >= publicOpen) {
                    freeAmount = FREE_MINT_PUBLIC;
                }

                freeAmount = freeAmount > mintedFree[_minter] ? freeAmount - mintedFree[_minter] : 0;
                freeToMint = freeAmount > _desiredAmount ? _desiredAmount : freeAmount;
                amountToPay = _desiredAmount.sub(freeToMint);
            }

            if (block.timestamp < publicOpen && whitelist[_minter]) {
                if (mintedPaid[_minter].add(amountToPay) <= MAX_MINT_WHITELIST) {
                    cost = MINT_PRICE_WHITELIST.mul(amountToPay);
                    maxAmount = freeToMint.add(amountToPay);
                } else {
                    maxAmount = freeToMint.add(MAX_MINT_WHITELIST - mintedPaid[_minter]);
                    cost = MINT_PRICE_WHITELIST.mul(MAX_MINT_WHITELIST - mintedPaid[_minter]);
                }
            } else if (block.timestamp >= publicOpen) {
                if (mintedPaid[_minter].add(amountToPay) <= MAX_MINT_PUBLIC) {
                    cost = MINT_PRICE_PUBLIC.mul(amountToPay);
                    maxAmount = freeToMint.add(amountToPay);
                } else {
                    maxAmount = freeToMint.add(MAX_MINT_PUBLIC - mintedPaid[_minter]);
                    cost = MINT_PRICE_PUBLIC.mul(MAX_MINT_PUBLIC - mintedPaid[_minter]);
                }
            }
        }

        return (cost, maxAmount);
    }

    function addToWhitelist(address[] calldata addressList) external onlyOwner {
        for (uint i = 0; i < addressList.length; i++) {
            whitelist[addressList[i]] = true;
        }
    }

    function removeFromWhitelist(address[] calldata addressList) external onlyOwner {
        for (uint i = 0; i < addressList.length; i++) {
            delete whitelist[addressList[i]];
        }
    }

    function emergencyOpenMint() external onlyOwner {
        wlOpen = block.timestamp;
        publicOpen = wlOpen + 6 hours;
    }

    function emergencyOpenFcfs() external onlyOwner {
        publicOpen = block.timestamp;
        wlOpen = publicOpen - 6 hours;
    }

    function mintState() view external returns(uint state) {
        if (block.timestamp < wlOpen) state = 0;
        else if (block.timestamp >= wlOpen && block.timestamp < publicOpen) state = 1;
        else if (block.timestamp >= publicOpen) state = 2;
        return state;
    }

    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(_tokenId), "Token does not exist!");

        return
            string(
                abi.encodePacked(
                    BASE_URI,
                    _tokenId.toString(),
                    BASE_EXTENSION
                )
            );
    }

    // OpenSea Enforcer functions
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public payable override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId, data);
    }
    
    function supportsInterface(
        bytes4 interfaceId
    ) public view virtual override(ERC721A, ERC2981) returns (bool) {
        return 
            ERC721A.supportsInterface(interfaceId) || 
            ERC2981.supportsInterface(interfaceId);
    }

    function initWl() internal {
        whitelist[0xf03A4C89A8D14ACA07C62479cBdDde753ad6233b] = true;
        whitelist[0xCcCb76953089072DF94C15762dF81Ad4786aa2Db] = true;
        whitelist[0x2B1f2858fCE17213B46b52ae8d308a5fD1BE3b24] = true;
        whitelist[0x37BC058f6eb74F6f77bAB2C88E02f4535777344c] = true;
        whitelist[0xfDA5498583cBf5B9982a9d4563745e9b0cE74aBC] = true;
        whitelist[0x172bFF9DE0356749a074114393478455dcEb1dDd] = true;
        whitelist[0xf910a209C0686f76200bFA1Fb01037c1F8FbbA7D] = true;
        whitelist[0x8D17a220f9EBE8BeE396E601Af4fc47743c409d0] = true;
        whitelist[0x977b69AC9B5eB664C1B7f12D736aEb51C2e64Cd1] = true;
        whitelist[0x23A7494fEdf00619cfb7423960b58B9B01150537] = true;
        whitelist[0xA6740EC280dca36E05e691b3229A59e4ed9Ea4af] = true;
        whitelist[0x34Ca227D0a9fe241289b0C3861a61Ecb5d0e8e88] = true;
        whitelist[0xbF559099Bc938A9114cae01E1208b9751C404343] = true;
        whitelist[0x3928FA28AB3456B9b74E04156a0327bCB6b14D56] = true;
        whitelist[0x253C042f709e568E7bF599046a026eC7a6d5dd47] = true;
        whitelist[0xA614E340B46c347296F9F680Ea1fD1Ba125192De] = true;
        whitelist[0x95Ca3e4F428a867fccfdcdedDd2ba79d9238E7B0] = true;
        whitelist[0x0D8B49bE1176b7c9436167A4FaA2C0F8547Aa7E7] = true;
        whitelist[0x9f13A6aE7D3F5F7ee5CC232d398F543aCf078F26] = true;
        whitelist[0xe4b2da70c752671dff9f0644967Cde041AD0e6Af] = true;
        whitelist[0xD5CD998e0268e0C5E8Ba7736781C6E1494FCc07d] = true;
        whitelist[0x74E94A88D6FC23Efcf571E90B14EE290915802bF] = true;
        whitelist[0x1F312652201D5425C24322139Be39f1bbDcFAc69] = true;
        whitelist[0x356C9915BF8711B2d8D14e91BbdDD4BD3Ea14A58] = true;
        whitelist[0xcA53c086b4c6e9b69ab162634bF1c52028522531] = true;
        whitelist[0x008DBA3dE3A8b4654bf74D536FE4BE8f1311ddb8] = true;
        whitelist[0xD56181DfA8C833fDb4c545301154DEe70d783653] = true;
        whitelist[0xFD1c6c3105352C8e6E61eb20F9c9DA99e301ADC6] = true;
        whitelist[0xBe17431D4FBb36e7A24b9026AA07E41D368233CB] = true;
        whitelist[0x332b4a450c0262A5B0d6dB7E0336899F4ddf9947] = true;
        whitelist[0xC38e07206018140040c940A8cb4102E76C23CB16] = true;
        whitelist[0xD100a6f2723A9c2f0b833CE4B35023D9C63E1545] = true;
        whitelist[0x477DbEC58BAd6f6318ca70AFF2d9953BA3b4dCbb] = true;
        whitelist[0x0290bAd3Dc58Aa95AAC7E165E0999FE2A1a047A1] = true;
        whitelist[0x3d4FbAC05963165cD00aa4F500dC77638F29359c] = true;
        whitelist[0xe68e795EF44052C489ce570BA6572358d5C6680f] = true;
        whitelist[0x38504f61fD97f0917cF6685F6519942E0fD6d926] = true;
        whitelist[0x50AF4A1c782b6c68aEB5bCe6eeC5fBf30A769D6E] = true;
        whitelist[0xc4962D1D85e2e9ca3d5380390FBF2382a87b32D4] = true;
        whitelist[0x3D6bf109B1CbA1c626c01Aa737CA3DCde6F46Bf1] = true;
        whitelist[0xdC96ec380093a9dEA62636944A6c0f509A5d641D] = true;
        whitelist[0xAd44D11ef8019adC52F46443F0a27098Ad086486] = true;
        whitelist[0x80058Aa95daB107D79f600E6131a1FD00B262105] = true;
        whitelist[0x18eAB583B9a4cc805359c814da65C8C412C22ba6] = true;
        whitelist[0x9B9e1b73d7346286520a3dDb36dD6e530dB1537E] = true;
        whitelist[0x7F3bee8Ed460d3c8F1BB7dF37d43e1c4bC0E4159] = true;
        whitelist[0x0794CefCDb136e160c884DF8e134fc294503a504] = true;
        whitelist[0xEe7978D41462D23d785A020e948A48926271A870] = true;
        whitelist[0x43b45cA3aC8DC9FF7bf4EbdF824d75760EFE9d07] = true;
        whitelist[0xc611aC187751E6792A5c548bfCF80F9c1A15A50D] = true;
        whitelist[0x656211f6eC16B75c1cd6F423c0134ad141f0C5d6] = true;
        whitelist[0xE85DBB09A699c0543C363c3f6E51ef0049e3edC5] = true;
        whitelist[0x59C7602dFf791B5eC0348Cc0F6bDB73066De34E7] = true;
        whitelist[0xFBD99A273f18714c3893708A47b796a7ed6CBD4f] = true;
        whitelist[0x21C6baBB004E9aAa33d368ba227602686DEFed3C] = true;
        whitelist[0x997D22170e91Cc91Fcb3F52AF677E486816e7364] = true;
        whitelist[0xb9A17e131aB04B680Cd05dBc33A7E324A8D5e894] = true;
        whitelist[0x737FEfc91A4E1f7cdA843880AA285C4E8A9EF7E0] = true;
        whitelist[0x215DDCe5d1d12D26861d608858a213e749584657] = true;
        whitelist[0xb991175200A225f124C7BB820751411144D03552] = true;
        whitelist[0x0A76658Cdf816a572AE1883217D1d0ee546725C1] = true;
        whitelist[0xF95e8785CA65e6ac36da484c9507B78E427De453] = true;
        whitelist[0x019Aa3358AD5a788CcB6393d3Bd9fbc990414054] = true;
        whitelist[0xa4C45893F095F9DA82AcD9B52Fa16a7Eb947B02c] = true;
        whitelist[0x4C1a3AA19BecFc7bA64878045e42dd06167Dc699] = true;
        whitelist[0x5d7cbDB9adb0d3FE3651845DeD0433f90bAbe055] = true;
        whitelist[0x918B1Fae44b01AdaFB76e620d91DCB884a08f5F9] = true;
        whitelist[0xa03D83048Db96CfE9ee0c288689F7A07b85a2AD2] = true;
        whitelist[0xD0e8C95Ee57694e1B105907B89c05b7171A92692] = true;
        whitelist[0xf6c2997ffF7affe4A7601988539089Ce3af9DAAe] = true;
        whitelist[0x99dFe8F8574D00c31d1543C7549A731129461113] = true;
        whitelist[0x4Bb8Ee32aac8b538b193333e58Ca3816cC7671cD] = true;
        whitelist[0xc6579463baB5BCB90a9635bef91CcAa78fFFD7b1] = true;
        whitelist[0xBbcF026F909fE2eCE5689e136F050F38fC4b472e] = true;
        whitelist[0x64bde4b06ccca328d76D47D7B2b4c54f94922A6c] = true;
        whitelist[0xC6779f81e6E1C8626A7a83220A67f0BaDda9115f] = true;
        whitelist[0x3A8A085e9362084E1c71d937a4c3fE664E7832Bc] = true;
        whitelist[0xd92e2f8C08fb61D3c2191C435735a3cddF7e013C] = true;
        whitelist[0xD63b1828B35D1F4075Aa7F8a32D69c87795AA8D1] = true;
        whitelist[0xEC225a1Fd31603790f5125Ab5621E80D8047E901] = true;
        whitelist[0x5FC2E9c6E1F32FcbFDdf5BDCd7cb9AF59bdC9b4B] = true;
        whitelist[0xddF6De3A7eCF342Fa3Af23a1A796829a5E3AFc93] = true;
        whitelist[0x7fC4Caa51e07cC7E25e34314e9881e88616E9E37] = true;
        whitelist[0x39D53165b15a67AA82D7Ed2c0AaD47A43a318fa6] = true;
        whitelist[0x0Edfa76A60D989B8911C8E9E949a9854B0607fE5] = true;
        whitelist[0x0705f087FB70C784094Ac6482a38AbA82a73Aca7] = true;
        whitelist[0x8d4028c2FB187452ce49A69514f0AD51ebc5c19b] = true;
        whitelist[0x47EaEc8cA6DDb250544F6185EA8503EDc93a834A] = true;
        whitelist[0xFD7A8935EcE990f06304E38EeAeA647feF07eBD4] = true;
        whitelist[0x50C2618D13f34E62375f5EED5336FefC3581fdA8] = true;
        whitelist[0x54450EDf860Df79347a202866E880C689d364e80] = true;
        whitelist[0x0A4E5cA0F6681ca903D736d589Cfb3Fc6aC08F35] = true;
        whitelist[0x4A69c3a1DA84c23661EBEcB12Df3318cfb8bBcdE] = true;
        whitelist[0x81D42EC28DBb33F3583038195CaF1f44DC1c8753] = true;
        whitelist[0x5D60886a6018088DbE8ff85E6B438ae409C7D193] = true;
        whitelist[0x5Aa889B6d4A447bCCDec25A5bDeA4f6e3755E863] = true;
        whitelist[0xDeaD9F6D2208b6Da3Db0E5CdEC8814a098D44199] = true;
        whitelist[0xCdfb83642Eb801d05e77302BD919De5f92C21ED5] = true;
        whitelist[0x3Ab62BaFACbb8030CCa852924b41aD3aF7919a41] = true;
        whitelist[0xfBb210aB20a551fBC6Eb062F85bcF30040797D44] = true;
        whitelist[0x0D4Cc1bccBAF2481155a3e6f54b6743dB9ec39E6] = true;
        whitelist[0x4b3757B48F70bF8Ff9D6474381e43DFECF9D5BA9] = true;
        whitelist[0x56f9f1efa72E1E4BA56E74574d45C5A43624960A] = true;
        whitelist[0x8fd5a8d39229e66321c78B0F0A806717C265d80e] = true;
        whitelist[0xF08C2C228c488815ae500BD7D0F98dD1E8c49Fab] = true;
        whitelist[0x7a3741108217319DC6958827FDe572AF213dE41e] = true;
        whitelist[0x3C23975c937d880d9B601F7FF674e7bF14a8359F] = true;
        whitelist[0x1d4E93a8a6299051472D618b45bE9F333951F7AE] = true;
        whitelist[0x5d571d126F427aF40aeABe434DD6CF0aA487c0A4] = true;
        whitelist[0x144c02f5370Be541e123Fa5cF9083E30Ab7c5a04] = true;
        whitelist[0xbDf3DFF1090194Db81ad03D65b07D5842cE220b9] = true;
        whitelist[0x3bcf3426692A406032D271dA0E050f665B4b3F67] = true;
        whitelist[0xF13d63c10e9Ee31F2E26101B95fA44af072cB8a1] = true;
        whitelist[0x28156730f1F2f588fcc3e9ED2f5793CAD354282c] = true;
        whitelist[0x55eb72F2A5694aee534B8dd2cf7ea1F8bAe584C5] = true;
        whitelist[0xB7b2297Ccb4b921deB22F4e43d7EbddE7A0a4d45] = true;
        whitelist[0x640F2499Aa01755116516bc82F84c72357BB3E1a] = true;
        whitelist[0x84334B7170376b36C7cc2214da1c304682c8d83f] = true;
        whitelist[0x97D722875D270aC502071d52869E8D05deB58cBB] = true;
        whitelist[0x2F6Bb93b36CD91C1969d24F783C038C1537f0e30] = true;
        whitelist[0x9F2F290a213c9970C693AA23aE96c27dFE879Adb] = true;
        whitelist[0x2e9a2A5e91FEdC88d3550D815F5907006e93A008] = true;
        whitelist[0x9659D4698b3a66c135e4BdD8Be06d84C889154fF] = true;
        whitelist[0xE2155675D790a6A4B9a460862ae9a0b26305eaeF] = true;
        whitelist[0x2f98f2D97A571591197232D04f8B4989755599FF] = true;
        whitelist[0xfc6b6862Ef4E88a899AC03a0513EBF33e80Cd432] = true;
        whitelist[0xDba797B6a5c14Bff9eD3753Ecb38c92c7E86A2d6] = true;
        whitelist[0x55FcCBc6c3164692e5a8A62cc5f9CA4e40CAf57F] = true;
        whitelist[0xc8915E6eB2Ce78d2818606DF6D74605F3C3418c4] = true;
        whitelist[0x86fB98Cef52a02bBeF066B21a1BCEFD6DB235039] = true;
        whitelist[0xbcd562d5743Ad1F97da6DEea093461CCcd344F10] = true;
        whitelist[0xfF032987AFB855B302c7678Ec36FbF312d268F7b] = true;
        whitelist[0x950c589C8fD106790F877A93C3ca339948C5d68c] = true;
        whitelist[0x4B90c639cFAe70d715a0F6ab96253A9A8f5b862E] = true;
        whitelist[0x12Bb206124930a2533F9147f2f134a5372EA5b91] = true;
        whitelist[0x2438a0F10518C5E2262C5eb9f8A4476692e0EeCd] = true;
        whitelist[0xfd829521010D0FE2Dd1D203F867549ef827aEF2D] = true;
        whitelist[0x1a13b044B9bC01b19072661A4CD63bd20FEC3687] = true;
        whitelist[0x38151BEB36276CDb25bA044F72d2FFA1539f88dc] = true;
        whitelist[0xde197FFd6ba7F264Ba7Cdf016E48c4dbdf782064] = true;
        whitelist[0x0Dffa0D8f5e3B7Ed53b9d11C3789dA2BE46758Ea] = true;
        whitelist[0xD7F2a6ad9d6D407842Da01eC5B81D8646C8C87B5] = true;
        whitelist[0x923Ada6487AaE22bC1f12027618A2A6DeE645DA5] = true;
        whitelist[0x4C8455351ABC38391fB9D06CeCca87E429E81F86] = true;
        whitelist[0x0e8F71c94F6eBf2949f1fb65a579b94200a75d6A] = true;
        whitelist[0x4c70c0ce91602Db64Ab86d522439a68e1A981b23] = true;
        whitelist[0xa40Cd8AC5d59b78ae5786DACF9Ff16a7712F645E] = true;
        whitelist[0xaA0CD688DF3bB2e501165cFF07c9dCE683dE0b88] = true;
        whitelist[0xc5555798C0F46016280B62871a879a13064D2336] = true;
        whitelist[0xDb075017593060427b729A50daD132004bc402EA] = true;
        whitelist[0xc486F7eF93C1961374186129077a0230116d8Db8] = true;
        whitelist[0xbA282a20d32248680003DFC1ED8168CBe0B41Fa4] = true;
        whitelist[0x13214c6DFE518592c970A1B36E1A844996FD4C33] = true;
        whitelist[0x94f604e11683eB2e39180DDDC64094698D7579B1] = true;
        whitelist[0xD81cCC0c14FCCbF9111bA030652aE45a1b85c13E] = true;
        whitelist[0x5C70633b8b78326F0A587528590Eb1cfFBe76eeE] = true;
        whitelist[0x5B90400667fB6e6f7952ebb44cdC074f95d8177f] = true;
        whitelist[0xc123Cc025Cb7bed2d8d258D6E005780D3Cb2629A] = true;
        whitelist[0x53dA3Df491c3F648b74c8DC459E8fb9Cf0841EFE] = true;
        whitelist[0xcada6C66116458be3cFE4157477e2b7013DB9Bc8] = true;
        whitelist[0x8B4A4c7Ffd3116e2DBa4af91EEc78c0722548E20] = true;
        whitelist[0xdb21bDF8EBF4Ee33dA75B922A260cFF0B85FE3C2] = true;
        whitelist[0x4f6bCEffCB3B3Abfd5873109a5F7088E4A7D93Af] = true;
        whitelist[0x6c4AEC5EA9e714a7Be23fb9e60BAedEE093b5c47] = true;
        whitelist[0x3D49DB743505E9cC8068bb2974672867C47545eA] = true;
        whitelist[0xfFf049824fd1ecDfbA1C9Fd2da125EA0c3eC9AaE] = true;
        whitelist[0x115A8DBA086A865ACC49AFFc8bf5299Fcac72fD4] = true;
        whitelist[0x77eDcc641D9cF3d8F3bFdE9a059EB0dAFe879790] = true;
        whitelist[0x568c50Fd91F1b7E56C810D314DEb5368e72EDd9e] = true;
        whitelist[0x44941809D2FfaA9099B94409FEFC89B16A0F45b0] = true;
        whitelist[0xeb17ED1d341bc61A2cB82751E14825975920E359] = true;
        whitelist[0x31494f0dC9D8B10e3a604E5E8A6B0E3535EFfe6a] = true;
        whitelist[0xC2BBfA869877B8Bf2AEbaC55f3881BAb21a21542] = true;
        whitelist[0xa57ABf3cfd0E9722eD712e782f12D4ce146aeFE7] = true;
        whitelist[0x18127166DD88A9C75f33BB85209597d0bD785967] = true;
        whitelist[0xD7ff2D1588d47cDcECe05E33968a84a6BDC2fEb1] = true;
        whitelist[0x862fD8Ba75d6858DA149EAE01Fa9f3DE7765527a] = true;
        whitelist[0xDb59dd5A1e02645908746fd4Dac69734A8559f6E] = true;
        whitelist[0x27Bbb4f42BdE862ff9Df700CECD43F634E0b5e9B] = true;
        whitelist[0x4B52Bcc4b49A94048E959BFacEcE0A961F7693d0] = true;
        whitelist[0xca2666880926d4Fc298e474F7e66d53B39fF4757] = true;
        whitelist[0xB85Bb5596AC087dD1cB03A2F9947833710135C4b] = true;
        whitelist[0x5D7a5bdA784aBA8AB48396EEEf9F3381250Cd65E] = true;
        whitelist[0xa222eE471990a559C1F46Bc874F373acFa32e6e9] = true;
        whitelist[0x6Ef966c37BB3d5f4Ac162f4EDFB27f3Ce729E419] = true;
        whitelist[0x75F5f17406e5eCeE8FFCf8011BB4cC6f4DD46eD3] = true;
        whitelist[0xb74dE96D154CC700a76025ab0F2c11a97E3fBc4E] = true;
        whitelist[0x4306E0b1f2DE74F6B94E0d2e1b0d7f5c45b67fC9] = true;
        whitelist[0x50eA3f87875Fcc6f5670FaEa69Ae45d0CD3C649d] = true;
        whitelist[0xd7B0281a96E3F309564F6c3Addf0B3852A5E9622] = true;
        whitelist[0x955FC5cC4c0Cc2E255d1693b91a3e0Eff5da4F03] = true;
        whitelist[0xf6F78237f48B541656e7c6312253F4743188861F] = true;
        whitelist[0x69b418E8eF7471EEf7a80245B87a14eAC52a6B28] = true;
        whitelist[0xEBA79C8902D1C18a87603E339f3d45eBc6CF1817] = true;
        whitelist[0xE6C986f4A4B32c73aE73110b9812Cf43F7836EFB] = true;
        whitelist[0x4b67EC0BF2fe540CD4014b4D0938d6a14EEB577B] = true;
        whitelist[0x1a0BbabFB78D065ba2Ffa964630B13d4A7b8e283] = true;
        whitelist[0xBb6b7D9cF93d6Ad37A851445974960be2e236403] = true;
        whitelist[0x2247FABd537Ddb0CcfF67196CB573aaeAC02ed70] = true;
        whitelist[0x494f8965639cf305ea30dB7371c9cD8173E37EA6] = true;
        whitelist[0x373a15E17e21475c2EA1FEbD1F22191bf6Ac3b40] = true;
        whitelist[0x08D496C9cF496dA6333819f24b691EC04Da830f0] = true;
        whitelist[0x312D2e7dF6Bf07B592d4Aa7F3BC8BD011a68A8cB] = true;
        whitelist[0x646d83Ba1840dB6D100E455Fc5602367838DF4e3] = true;
        whitelist[0xe44D61473e3816DEA491Df3797167988D1A22Fd2] = true;
        whitelist[0x71FB19fd5791699e95032A0ddF8F482261a095b4] = true;
        whitelist[0x162382a00A826c8FaAdEf9875e67D3233768cB31] = true;
        whitelist[0x88d697dE90889596F624F9bBfA144CB8C4eCA676] = true;
        whitelist[0xf96A186195262f85928880D6bc1cc5Dd22ceaf42] = true;
        whitelist[0xe59E036dE50CD81509E28B6C2a7fAc7e3346fA68] = true;
        whitelist[0x63eC40ffD185e7DE69f0922478f3Ad98cbeeDE9A] = true;
        whitelist[0xAE8AD72b10b606BA38d01E816527A23c5b069509] = true;
        whitelist[0xF7e25D8B3791E9C2b9D5e6190b3F444BC4b0E80B] = true;
        whitelist[0x43eEa2E44f23524F4D573B3E98C6D471a84CefA2] = true;
        whitelist[0x2260909Cbd5d5e4Fac768c738fAf163f425b48DF] = true;
        whitelist[0x219895b55A5b88d6a32D48Ba28793CD8010d6Ee6] = true;
        whitelist[0xDC4F2F9aCb36Da79C27dA4a1eb226B81b51cEb9B] = true;
        whitelist[0xaC3247801ca573F88A8B6675F59A0232132532F4] = true;
        whitelist[0xb7F890197550BF6f87f4d1Ed92cC69A8BB32C04f] = true;
        whitelist[0x5404A4D869b31e1ce899B02C54A0C3556A21e4bD] = true;
        whitelist[0x612d8b36Ef942CD035B03Dc228a1aFdA28d43d18] = true;
        whitelist[0x532F18649Cc8D8D09d427409383C3F8c53C032A9] = true;
        whitelist[0x6c9E02eAD987B05835332cf3381bfE6D13c6b27A] = true;
        whitelist[0x51201c1472fE8663d6B91B761Ba396422c40e7A7] = true;
        whitelist[0x23B540Ad5fEFfbf0bADa6fb65b419DffC4524Bc7] = true;
        whitelist[0x24877757fd4c9a029E702f12Af7dFE3FbD57820E] = true;
        whitelist[0xc96CdEA7cF6236f3e62919C816448fd4D8d6009b] = true;
        whitelist[0xF6bfcF958a5D9C95765969d6704E685a673Ab0DE] = true;
        whitelist[0xa4270519A1ED788A1E0f597DBEb6AaE3d7dB2199] = true;
        whitelist[0xF3352bD2B4D11908d30b21AFB92805ed0017030b] = true;
        whitelist[0xBF9d8c49f0a910cD98feFBa098fe2405A8f06EFe] = true;
        whitelist[0x8c4A285c92b971E0508B79d54a35d985EB006a09] = true;
        whitelist[0x5fc460265E46458435273EB92Cc6d89b842611d2] = true;
        whitelist[0x6DfFE2014b2F60b4E5CAa8e8258E6be90bDf8694] = true;
        whitelist[0x1345E047f847c8b73c51111ffb511c29B6737709] = true;
        whitelist[0x7e3cE3Ad2Ffc04343a9cEbc726b4131b60c2927a] = true;
        whitelist[0xEf0F34669f9b9D53Cc8b0cEFDE50b9d27355B293] = true;
        whitelist[0xe8eeCf0228B0eD6E885B934f8bFb9161240d6E5B] = true;
        whitelist[0x49E3371cBc4d51aFCbfF9e295Ab91ee34bcf26Ed] = true;
        whitelist[0xE33B49C068ddCdB576Bd18Dc69c272f4600B18Fd] = true;
        whitelist[0x2Aeb5f1b609696bA2D7d0942f668908a1608fB9E] = true;
        whitelist[0x99244FD465d24dd233a0a067c23440B629b552Dc] = true;
        whitelist[0x7aB1cB052a99c6b5D0cA34175Ae60f8316D29Bf5] = true;
        whitelist[0x9E34702FE8878F122E153Fe586FbC4162658BF58] = true;
        whitelist[0xfB23aCdA916351B0B271fabFE50e16e8c9A92a2b] = true;
        whitelist[0x6def6445893aEdE553bC6544643616b53F328f38] = true;
        whitelist[0xa843362b483A7c1ef6784602C89C9Bf5D6c5E282] = true;
        whitelist[0x1fD1E6Eeda4cde0A9D564356cef7A9637db872Ad] = true;
        whitelist[0xc1233d91eABB314723106d08FD42E2863c1c2e16] = true;
        whitelist[0x051C5559BC2a7Bd0066E58006E6747B4e7A7c328] = true;
        whitelist[0xB4Be85887D68A3dFDd5e9826A5b7744379FD34E4] = true;
        whitelist[0x1f2C12E691dEd35b5F663B8f14e73922a00Ded94] = true;
        whitelist[0xB5E5cCD5aDA260b7C62aCb174A888231e4fF3683] = true;
        whitelist[0x9557a93c5852bb5D6AEaD51627239187DEd13C08] = true;
        whitelist[0xB16CDc1f5DBc9D0637422C408c099c5EDab69830] = true;
        whitelist[0x9FAa2e996366b0dB8989fb0F140F30d731B88434] = true;
        whitelist[0x42DdFA7855199bdb666D16f346683Bd4355C1c4B] = true;
        whitelist[0x3EdC6fC51E3fb43857e4a7a7755eb4B61c477077] = true;
        whitelist[0x691AbBe6d8aC6a284Eb6bD08240e3AFF0F25d016] = true;
        whitelist[0x592467de8e2d90cf2eF255b27D6aCf3AFC32a43C] = true;
        whitelist[0x44df89C5df80DeB8abB87CF71c249586520e3826] = true;
        whitelist[0x0eB1FC6AAA220aC62Bf8C42C655F899Eb4FC9561] = true;
        whitelist[0xdD13c7c4e84011B22230cD284cD0c48cBeB0B217 ] = true;
        whitelist[0x18A100CdA80Fdc7274EE14E6e3CD6B0b6CdE4ed8] = true;
        whitelist[0x0898EA214BDA9d32e4C97cCFaE54363e11199A80] = true;
        whitelist[0x57903f3DbDC520191B2AD065cf2237E89B617B15] = true;
        whitelist[0x0FbfdA03999B8320B292E7D5289728c01Ed8de44] = true;
        whitelist[0xED638d2de9E7b6E8D06514A161bb2cEFf28bfCDd] = true;
        whitelist[0xD4d3E342902766344075D06c94391e61A9bB7e60] = true;
        whitelist[0x21100971d97cE316630793238CA06Af426171E94] = true;
        whitelist[0x57F835090F138E57042Ba602973cbF88292f6f93] = true;
        whitelist[0x5Ca8035FD1937DEaD7d1577348A79fa5B440F417] = true;
        whitelist[0xCCC7aAd892060574Ea2C89548aBaF060AFB568f4] = true;
        whitelist[0xA4cf064D02E35Aed6340df50D0c9e121B16B1Bb6] = true;
        whitelist[0xe470872c0c2a9387481Ee6A01a27bf1E0669EBA9] = true;
        whitelist[0xEA471194ADCcbb913f5a3FF0af4a4914ac2C3B79] = true;
        whitelist[0xec9DD4D4768446c2549eb408739F0D9e051113d8] = true;
        whitelist[0x1025049DcAed60766f34c8F8aFd5DD0151D98B39] = true;
        whitelist[0xC0946AD17B40A661A56E9e9063300F3179d67D55] = true;
        whitelist[0xC454259dAA76b9629cCF1cd59630Cfd81A3D35E6] = true;
        whitelist[0x4e755aEeA8af4a50ff6D4c0c2B36aB100A0CC399] = true;
        whitelist[0x0314b76803735A3560FFC59E781a171eb49D0c69] = true;
        whitelist[0xA4e372e7f07057F537E02E1Bb6f0a1023ad9e639] = true;
        whitelist[0x686e4B8F4bEF04Ad36861EECBE62Da1E964b555B] = true;
        whitelist[0xD3e38e08965980D78a5d4Bc5e9e2931DEc4Fb3e8] = true;
        whitelist[0xc4FDe386ff2cb3a6eE527970dA4D72b9a424db2F] = true;
        whitelist[0xd30252a943259911018617A13a34a62941847Dc0] = true;
        whitelist[0x488aa9C4BE0770612EfB9Feb942114a95d8A0A5F] = true;
        whitelist[0xA865c8cdfcD73B5c23371988c81DaF7F364B395e] = true;
        whitelist[0x57e766997eD89eC496fdF3FA315D12bc2aE87E63] = true;
        whitelist[0x6C42C30C87081a53AbBFcD1D6ADfC4816a371f30] = true;
        whitelist[0xd024c93588fB2fC5Da321eba704d2302D2c9443A] = true;
        whitelist[0xf026EE4353dBFA0AF713a6D42C03dAcB7F07A9A5] = true;
        whitelist[0x755C8d16D5298395922d791db8EAEf7294de0Cd4] = true;
        whitelist[0x38f8B2aC82773573eB5e9151870361563AE166A7] = true;
        whitelist[0xe53Cd10d1B802101e766b6fDa4CE1ad476567b5B] = true;
        whitelist[0x060F6383C0a5c04F063d5330DcA113aC4Af5C99D] = true;
        whitelist[0x55FA9F8f4755D020efB55Ff7a33068B326144a2B] = true;
        whitelist[0xA4182F5DeDeA830F5fEf7276C4cD9cfc11F68783] = true;
        whitelist[0xF92d2Faa1EfEf8bBd39150DfF58a96686DA09914] = true;
        whitelist[0x7C89867e28a971848fa908D42D9C5e6F456A093f] = true;
        whitelist[0x317A72CAa9dcAd31D931d1BEc4Aa2DF32C59B842] = true;
        whitelist[0x772Ec4695cECdfF105de3875c934Cd6EE8540756] = true;
        whitelist[0xF46e9A726721954f590619D3862A91f30dA02f3E] = true;
        whitelist[0x3Ece982Cf573c53b383cB95BDc29a2781B7D5A83] = true;
        whitelist[0x2c0205A117caDD1ECb842453710db7755648f633] = true;
        whitelist[0x146c879461eC856A287910a746677E692A5203c4] = true;
        whitelist[0x31d35bDA1daEE81236439eC5cD7F1DdC988829Ea] = true;
        whitelist[0xE75b6c11e7a8Dd3f7d51Ab0f7a6669Fe22e6aD41] = true;
        whitelist[0xfE721f7Db4B09D739D942c02752B96BB5F7454F1] = true;
        whitelist[0x02ff44eBd3A432915f2A30E8087721200d9038d7] = true;
        whitelist[0x7FB0ad0039E27E1cE9521C2D76D632AC3b3EBD3A] = true;
        whitelist[0x8e037f7Fd208f57dF23381B095aA8cD0b690CfF1] = true;
        whitelist[0x9a36D4D379B9Ba1270F49dDA5510E89B5BB07C6d] = true;
        whitelist[0x12a92623A8b698DF20f62ebDfC76f4c7Fe2Aa7b8] = true;
        whitelist[0xD4262407Ab46769960Ff4141405D7F2d1173BDe6] = true;
        whitelist[0xC51BE51c7d06e2C72d4AA1C3DE8CC454FfE1D339] = true;
        whitelist[0x2F595b88f1d8f091fbE45985265E9adBdfDb85d5] = true;
        whitelist[0x08B93bbF65E897Ab789a56dAD62D0Ac0158baAAF] = true;
        whitelist[0xa9911eDf7aCc458d429Ff495dB5ED487308Ac49F] = true;
        whitelist[0xe8d876A510b0C860921A2d30e83cF63247c33612] = true;
        whitelist[0xA99501bEfB474a86a4E071f164032f5D7AE5F9e3] = true;
        whitelist[0x7631a76e19f118c0C453c843BC716bD68F4689e8] = true;
        whitelist[0xBba1Fb1378f8143bb7dC6Dd3617274ed05645723] = true;
        whitelist[0x4358e08585dd1dbf0Fe29aA8cF7372F620eae7f6] = true;
        whitelist[0x2FF1f99638d3906C72b65ccF401333f6704797aC] = true;
        whitelist[0xc3787781039BcFdF011376B00de8edf752a93Db1] = true;
        whitelist[0x0c8BD9Cd85545DF9cb42F19C0ae55eC9dF5b0dcc] = true;
        whitelist[0x4f75804Ac5aC8ec9A5046C75d79f5E84473B2338] = true;
        whitelist[0xE4471279812d283e9285c8c4A1Fc1C42C64Adaf6] = true;
        whitelist[0xAd11966551c4860bbEC7d8294843A2d74A273dDc] = true;
        whitelist[0x5678F92F425ABa27F22781A37Ae6e8a44804eEa8] = true;
        whitelist[0x4A2AC2E17A66a82b33cA83635b1Bb9488698811d] = true;
        whitelist[0x245f223614222f4550E43d2F4c267cb791CE078A] = true;
        whitelist[0xD5Cff943cd22c2F68DCd704B9f4E44B3F7230b60] = true;
        whitelist[0x394b0CA58672253287a2b4BB2EE8ae73D3bad4c2] = true;
        whitelist[0x92c4f9b7Db19ee06Aa0E0C8267ED764aE540D297] = true;
        whitelist[0x05BEab108486185760d13526b31937cf49a47B9c] = true;
        whitelist[0x76ac1b58201D6a51059cf7BF8bf0CA5e76A10cB1] = true;
        whitelist[0x81F591D8199cCFf1156A70BD0Db484c5CD26443d] = true;
        whitelist[0x99aD52a36Fa960CE95509CEF13e7F9df371c7b3A] = true;
        whitelist[0x5d176B7daCeA96Db482430e5b98Aab87b0f9D4a6] = true;
        whitelist[0xAB75604A23E75e3fC44e22f85E35F581b1B64851] = true;
        whitelist[0xa2585Be1d95956005655B73Cc2D55379c0569E84] = true;
        whitelist[0x6656Fd8f040B398244057896CC4c65E1FBDDA393] = true;
        whitelist[0x7F437771d52D1907DBEbE574E26BC3A1B522C1Ef] = true;
        whitelist[0x5B22d954Cb04c181E20d6262Ac8894737AF72e25] = true;
        whitelist[0xe265E2BAE51B893b5236118276DA06D05D0e255d] = true;
        whitelist[0xB502B9056f97929e49992a9a3B522c8C74DFafbd] = true;
        whitelist[0x02C435d8189D9a983CDBD77F2109fdd5663A33BB] = true;
        whitelist[0xEE191a3915f13B2F68d14Be93310C6F39432b7A0] = true;
        whitelist[0x6Ca1a3E8B1e05416189B616AeA2caF2a6d0Aa167] = true;
        whitelist[0xcF08be72e2433069C8D4E23cDc7a2ED68D1F2AC3] = true;
        whitelist[0x46c6540D66bb8339Cfebe6D864B018De0e98D591] = true;
        whitelist[0xdad3e16b087879228709c6c28e6a809C39A6d0F4] = true;
        whitelist[0x547267c134d67Fa66dEC8Da44876E0bb5210B78B] = true;
        whitelist[0xf693c14B507912621A223B6F550b46e45F950CE7] = true;
        whitelist[0xd957cBBCfE92864183b10D318711E9993f4b536a] = true;
        whitelist[0xA7A884C7EbEC1c22A464d4197136c1FD1aF044aF] = true;
        whitelist[0x39C1645B9b7aF942e561B1428B2201659C845729] = true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BASE_EXTENSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_MINT_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_MINT_WHITELIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_WHITELIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE_WHITELIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addressList","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyOpenFcfs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyOpenMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_desiredAmount","type":"uint256"},{"internalType":"address","name":"_minter","type":"address"}],"name":"getMintInfo","outputs":[{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mint23Team","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintState","outputs":[{"internalType":"uint256","name":"state","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicOpen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addressList","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","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":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"totalFreeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPaidMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlOpen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600b81526020017f54686520436172726f747a0000000000000000000000000000000000000000008152506040518060400160405280600b81526020017f54686520436172726f747a0000000000000000000000000000000000000000008152508160029081620000a6919062000823565b508060039081620000b8919062000823565b50620000c96200032560201b60201c565b600081905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620002c65780156200018c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001529291906200094f565b600060405180830381600087803b1580156200016d57600080fd5b505af115801562000182573d6000803e3d6000fd5b50505050620002c5565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000246576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200020c9291906200094f565b600060405180830381600087803b1580156200022757600080fd5b505af11580156200023c573d6000803e3d6000fd5b50505050620002c4565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200028f91906200097c565b600060405180830381600087803b158015620002aa57600080fd5b505af1158015620002bf573d6000803e3d6000fd5b505050505b5b5b5050620002e8620002dc6200032e60201b60201c565b6200033660201b60201c565b620002fc336101f4620003fc60201b60201c565b63649add50600c81905550615460600c54620003199190620009c8565b600b8190555062000b1e565b60006001905090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200040c6200059f60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156200046d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004649062000a8a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620004df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004d69062000afc565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200062b57607f821691505b602082108103620006415762000640620005e3565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200066c565b620006b786836200066c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000704620006fe620006f884620006cf565b620006d9565b620006cf565b9050919050565b6000819050919050565b6200072083620006e3565b620007386200072f826200070b565b84845462000679565b825550505050565b600090565b6200074f62000740565b6200075c81848462000715565b505050565b5b8181101562000784576200077860008262000745565b60018101905062000762565b5050565b601f821115620007d3576200079d8162000647565b620007a8846200065c565b81016020851015620007b8578190505b620007d0620007c7856200065c565b83018262000761565b50505b505050565b600082821c905092915050565b6000620007f860001984600802620007d8565b1980831691505092915050565b6000620008138383620007e5565b9150826002028217905092915050565b6200082e82620005a9565b67ffffffffffffffff8111156200084a5762000849620005b4565b5b62000856825462000612565b6200086382828562000788565b600060209050601f8311600181146200089b576000841562000886578287015190505b62000892858262000805565b86555062000902565b601f198416620008ab8662000647565b60005b82811015620008d557848901518255600182019150602085019450602081019050620008ae565b86831015620008f55784890151620008f1601f891682620007e5565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000937826200090a565b9050919050565b62000949816200092a565b82525050565b60006040820190506200096660008301856200093e565b6200097560208301846200093e565b9392505050565b60006020820190506200099360008301846200093e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620009d582620006cf565b9150620009e283620006cf565b9250828201905080821115620009fd57620009fc62000999565b5b92915050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000a72602a8362000a03565b915062000a7f8262000a14565b604082019050919050565b6000602082019050818103600083015262000aa58162000a63565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000ae460198362000a03565b915062000af18262000aac565b602082019050919050565b6000602082019050818103600083015262000b178162000ad5565b9050919050565b6140438062000b2e6000396000f3fe6080604052600436106102725760003560e01c80637281fbd81161014f578063ba70c515116100c1578063df3fdf001161007a578063df3fdf001461092d578063e8b5498d14610958578063e985e9c514610983578063f2fde38b146109c0578063fd75e554146109e9578063ff0cc47714610a1457610272565b8063ba70c51514610819578063c051e38a14610844578063c3151fed1461086f578063c87b56dd1461089a578063dad7b5c9146108d7578063dbddb26a1461090257610272565b806395d89b411161011357806395d89b41146107255780639858cf19146107505780639b19251a1461077b578063a0712d68146107b8578063a22cb465146107d4578063b88d4fde146107fd57610272565b80637281fbd81461062b5780637f649783146106565780638422e2dc1461067f5780638536128d146106bc5780638da5cb5b146106fa57610272565b806332cb6b0c116101e8578063583950b0116101ac578063583950b01461051957806358941a4d1461054457806363172ac11461056f5780636352211e1461059a57806370a08231146105d7578063715018a61461061457610272565b806332cb6b0c1461046757806341f434341461049257806342842e0e146104bd5780634d6aeefa146104d9578063548db174146104f057610272565b80631a904acb1161023a5780631a904acb14610363578063209848011461038e57806323b872dd146103cb57806327fda1a1146103e75780632a55205a146104125780633039dfa51461045057610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c57806318160ddd14610338575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906130aa565b610a2b565b6040516102ab91906130f2565b60405180910390f35b3480156102c057600080fd5b506102c9610a4d565b6040516102d6919061319d565b60405180910390f35b3480156102eb57600080fd5b50610306600480360381019061030191906131f5565b610adf565b6040516103139190613263565b60405180910390f35b610336600480360381019061033191906132aa565b610b3d565b005b34801561034457600080fd5b5061034d610b4d565b60405161035a91906132f9565b60405180910390f35b34801561036f57600080fd5b50610378610b64565b60405161038591906132f9565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613314565b610b6a565b6040516103c291906132f9565b60405180910390f35b6103e560048036038101906103e09190613341565b610b82565b005b3480156103f357600080fd5b506103fc610bd1565b60405161040991906132f9565b60405180910390f35b34801561041e57600080fd5b5061043960048036038101906104349190613394565b610bdc565b6040516104479291906133d4565b60405180910390f35b34801561045c57600080fd5b50610465610dc6565b005b34801561047357600080fd5b5061047c610e1d565b60405161048991906132f9565b60405180910390f35b34801561049e57600080fd5b506104a7610e23565b6040516104b4919061345c565b60405180910390f35b6104d760048036038101906104d29190613341565b610e35565b005b3480156104e557600080fd5b506104ee610e84565b005b3480156104fc57600080fd5b50610517600480360381019061051291906134dc565b610eab565b005b34801561052557600080fd5b5061052e610f4f565b60405161053b91906132f9565b60405180910390f35b34801561055057600080fd5b50610559610f54565b60405161056691906132f9565b60405180910390f35b34801561057b57600080fd5b50610584610f59565b60405161059191906132f9565b60405180910390f35b3480156105a657600080fd5b506105c160048036038101906105bc91906131f5565b610f5e565b6040516105ce9190613263565b60405180910390f35b3480156105e357600080fd5b506105fe60048036038101906105f99190613314565b610f70565b60405161060b91906132f9565b60405180910390f35b34801561062057600080fd5b50610629611007565b005b34801561063757600080fd5b5061064061101b565b60405161064d91906132f9565b60405180910390f35b34801561066257600080fd5b5061067d600480360381019061067891906134dc565b611020565b005b34801561068b57600080fd5b506106a660048036038101906106a19190613314565b6110cd565b6040516106b391906132f9565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de9190613529565b6110e5565b6040516106f1929190613569565b60405180910390f35b34801561070657600080fd5b5061070f6115a6565b60405161071c9190613263565b60405180910390f35b34801561073157600080fd5b5061073a6115d0565b604051610747919061319d565b60405180910390f35b34801561075c57600080fd5b50610765611662565b60405161077291906132f9565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190613314565b611668565b6040516107af91906130f2565b60405180910390f35b6107d260048036038101906107cd91906131f5565b611688565b005b3480156107e057600080fd5b506107fb60048036038101906107f691906135be565b611c89565b005b6108176004803603810190610812919061372e565b611d94565b005b34801561082557600080fd5b5061082e611de5565b60405161083b91906132f9565b60405180910390f35b34801561085057600080fd5b50610859611deb565b60405161086691906132f9565b60405180910390f35b34801561087b57600080fd5b50610884611e34565b60405161089191906132f9565b60405180910390f35b3480156108a657600080fd5b506108c160048036038101906108bc91906131f5565b611e3f565b6040516108ce919061319d565b60405180910390f35b3480156108e357600080fd5b506108ec611f09565b6040516108f991906132f9565b60405180910390f35b34801561090e57600080fd5b50610917611f0f565b604051610924919061319d565b60405180910390f35b34801561093957600080fd5b50610942611f2b565b60405161094f919061319d565b60405180910390f35b34801561096457600080fd5b5061096d611f64565b60405161097a91906130f2565b60405180910390f35b34801561098f57600080fd5b506109aa60048036038101906109a591906137b1565b611f77565b6040516109b791906130f2565b60405180910390f35b3480156109cc57600080fd5b506109e760048036038101906109e29190613314565b61200b565b005b3480156109f557600080fd5b506109fe61208e565b604051610a0b91906132f9565b60405180910390f35b348015610a2057600080fd5b50610a29612094565b005b6000610a36826120bb565b80610a465750610a458261214d565b5b9050919050565b606060028054610a5c90613820565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8890613820565b8015610ad55780601f10610aaa57610100808354040283529160200191610ad5565b820191906000526020600020905b815481529060010190602001808311610ab857829003601f168201915b5050505050905090565b6000610aea826121c7565b610aff57610afe63cf4700e460e01b612240565b5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610b498282600161224a565b5050565b6000610b57612379565b6001546000540303905090565b600c5481565b600d6020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bc057610bbf33612382565b5b610bcb84848461247f565b50505050565b66354a6ba7a1800081565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610d715760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610d7b612740565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610da79190613880565b610db191906138f1565b90508160000151819350935050509250929050565b610dce61274a565b60001515601260009054906101000a900460ff16151514610dee57600080fd5b610e00610df96115a6565b60176127c8565b6001601260006101000a81548160ff021916908315150217905550565b6107d081565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e7357610e7233612382565b5b610e7e84848461292b565b50505050565b610e8c61274a565b42600c81905550615460600c54610ea39190613922565b600b81905550565b610eb361274a565b60005b82829050811015610f4a57600f6000848484818110610ed857610ed7613956565b5b9050602002016020810190610eed9190613314565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690558080610f4290613985565b915050610eb6565b505050565b600181565b600a81565b601481565b6000610f698261294b565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fb657610fb5638f4eb60460e01b612240565b5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61100f61274a565b6110196000612a37565b565b600281565b61102861274a565b60005b828290508110156110c8576001600f600085858581811061104f5761104e613956565b5b90506020020160208101906110649190613314565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806110c090613985565b91505061102b565b505050565b600e6020528060005260406000206000915090505481565b60008060009150600090506107d061111c8561110e601154601054612afd90919063ffffffff16565b612afd90919063ffffffff16565b1115801561112c5750600c544210155b1561159f5760008490506000806101f4601054101561127e57600b544210801561119f5750600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156111ad57600190506111bc565b600b5442106111bb57600290505b5b600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111611209576000611255565b600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548161125491906139cd565b5b90508681116112645780611266565b865b915061127b8288612b1390919063ffffffff16565b92505b600b54421080156112d85750600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561143957600a61133184600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612afd90919063ffffffff16565b1161136c576113508366354a6ba7a18000612b2990919063ffffffff16565b94506113658383612afd90919063ffffffff16565b9350611434565b6113ca600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a6113bb91906139cd565b83612afd90919063ffffffff16565b9350611431600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a61141b91906139cd565b66354a6ba7a18000612b2990919063ffffffff16565b94505b61159b565b600b54421061159a57601461149684600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612afd90919063ffffffff16565b116114d1576114b58366470de4df820000612b2990919063ffffffff16565b94506114ca8383612afd90919063ffffffff16565b9350611599565b61152f600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601461152091906139cd565b83612afd90919063ffffffff16565b9350611596600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601461158091906139cd565b66470de4df820000612b2990919063ffffffff16565b94505b5b5b5050505b9250929050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546115df90613820565b80601f016020809104026020016040519081016040528092919081815260200182805461160b90613820565b80156116585780601f1061162d57610100808354040283529160200191611658565b820191906000526020600020905b81548152906001019060200180831161163b57829003601f168201915b5050505050905090565b6101f481565b600f6020528060005260406000206000915054906101000a900460ff1681565b6107d06116b4826116a6601154601054612afd90919063ffffffff16565b612afd90919063ffffffff16565b11156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90613a4d565b60405180910390fd5b600c5442101561173a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173190613ab9565b60405180910390fd5b60008082905060006101f46010541015611880576000600b54421080156117aa5750600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156117b857600190506117bd565b600290505b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811161180a576000611856565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548161185591906139cd565b5b90508481116118655780611867565b845b915061187c8286612b1390919063ffffffff16565b9250505b600b544210156119cc57600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d90613b25565b60405180910390fd5b600a61196a83600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612afd90919063ffffffff16565b11156119ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a290613b91565b60405180910390fd5b6119c58266354a6ba7a18000612b2990919063ffffffff16565b9250611a7e565b6014611a2083600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612afd90919063ffffffff16565b1115611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5890613bfd565b60405180910390fd5b611a7b8266470de4df820000612b2990919063ffffffff16565b92505b82341015611ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab890613c69565b60405180910390fd5b611b1381600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612afd90919063ffffffff16565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b6b81601054612afd90919063ffffffff16565b601081905550611bc382600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612afd90919063ffffffff16565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611c1b82601154612afd90919063ffffffff16565b6011819055506000341115611c7957611c326115a6565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611c77573d6000803e3d6000fd5b505b611c8333856127c8565b50505050565b8060076000611c96612b3f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d43612b3f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d8891906130f2565b60405180910390a35050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611dd257611dd133612382565b5b611dde85858585612b47565b5050505050565b600b5481565b6000600c54421015611e005760009050611e31565b600c544210158015611e135750600b5442105b15611e215760019050611e30565b600b544210611e2f57600290505b5b5b90565b66470de4df82000081565b6060611e4a826121c7565b611e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8090613cd5565b60405180910390fd5b604051806060016040528060368152602001613fd860369139611eab83612b99565b6040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250604051602001611ef393929190613d31565b6040516020818303038152906040529050919050565b60105481565b604051806060016040528060368152602001613fd86036913981565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525081565b601260009054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61201361274a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207990613dd4565b60405180910390fd5b61208b81612a37565b50565b60115481565b61209c61274a565b42600b81905550615460600b546120b391906139cd565b600c81905550565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061211657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121465750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121c057506121bf82612c67565b5b9050919050565b6000816121d2612379565b1161223b5760005482101561223a5760005b6000600460008581526020019081526020016000205491508103612213578261220c90613df4565b92506121e4565b60007c01000000000000000000000000000000000000000000000000000000008216149150505b5b919050565b8060005260046000fd5b600061225583610f5e565b905081801561229757508073ffffffffffffffffffffffffffffffffffffffff1661227e612b3f565b73ffffffffffffffffffffffffffffffffffffffff1614155b156122c3576122ad816122a8612b3f565b611f77565b6122c2576122c163cfb3b94260e01b612240565b5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60006001905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561247c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016123f9929190613e1d565b602060405180830381865afa158015612416573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243a9190613e5b565b61247b57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016124729190613263565b60405180910390fd5b5b50565b600061248a8261294b565b905073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161693508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146124ff576124fe63a114810060e01b612240565b5b60008061250b84612cd1565b91509150612521818761251c612b3f565b612cf8565b61254c5761253686612531612b3f565b611f77565b61254b5761254a6359c896be60e01b612240565b5b5b6125598686866001612d3c565b801561256457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506126328561260e888887612d42565b7c020000000000000000000000000000000000000000000000000000000017612d6a565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036126b857600060018501905060006004600083815260200190815260200160002054036126b65760005481146126b5578360046000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff8673ffffffffffffffffffffffffffffffffffffffff161690508481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46000810361272a5761272963ea553b3460e01b612240565b5b6127378787876001612d95565b50505050505050565b6000612710905090565b612752612d9b565b73ffffffffffffffffffffffffffffffffffffffff166127706115a6565b73ffffffffffffffffffffffffffffffffffffffff16146127c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bd90613ed4565b60405180910390fd5b565b600080549050600082036127e7576127e663b562e8dd60e01b612240565b5b6127f46000848385612d3c565b612814836128056000866000612d42565b61280e85612da3565b17612d6a565b6004600083815260200190815260200160002081905550600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff16169050600081036128cc576128cb632e07630060e01b612240565b5b6000838301905060008390505b808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a48181600101915081036128d957816000819055505050506129266000848385612d95565b505050565b61294683838360405180602001604052806000815250611d94565b505050565b600081612956612379565b11612a215760046000838152602001908152602001600020549050600081036129f85760005482106129935761299263df2d9b4260e01b612240565b5b5b600460008360019003935083815260200190815260200160002054905060008103156129f35760007c010000000000000000000000000000000000000000000000000000000082160315612a32576129f263df2d9b4260e01b612240565b5b612994565b60007c010000000000000000000000000000000000000000000000000000000082160315612a32575b612a3163df2d9b4260e01b612240565b5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612b0b9190613922565b905092915050565b60008183612b2191906139cd565b905092915050565b60008183612b379190613880565b905092915050565b600033905090565b612b52848484610b82565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612b9357612b7d84848484612db3565b612b9257612b9163d1a57ed660e01b612240565b5b5b50505050565b606060006001612ba884612ee2565b01905060008167ffffffffffffffff811115612bc757612bc6613603565b5b6040519080825280601f01601f191660200182016040528015612bf95781602001600182028036833780820191505090505b509050600082602001820190505b600115612c5c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612c5057612c4f6138c2565b5b04945060008503612c07575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612d59868684613035565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612dd9612b3f565b8786866040518563ffffffff1660e01b8152600401612dfb9493929190613f49565b6020604051808303816000875af1925050508015612e3757506040513d601f19601f82011682018060405250810190612e349190613faa565b60015b612e8f573d8060008114612e67576040519150601f19603f3d011682016040523d82523d6000602084013e612e6c565b606091505b506000815103612e8757612e8663d1a57ed660e01b612240565b5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612f40577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612f3657612f356138c2565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612f7d576d04ee2d6d415b85acef81000000008381612f7357612f726138c2565b5b0492506020810190505b662386f26fc100008310612fac57662386f26fc100008381612fa257612fa16138c2565b5b0492506010810190505b6305f5e1008310612fd5576305f5e1008381612fcb57612fca6138c2565b5b0492506008810190505b6127108310612ffa576127108381612ff057612fef6138c2565b5b0492506004810190505b6064831061301d5760648381613013576130126138c2565b5b0492506002810190505b600a831061302c576001810190505b80915050919050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61308781613052565b811461309257600080fd5b50565b6000813590506130a48161307e565b92915050565b6000602082840312156130c0576130bf613048565b5b60006130ce84828501613095565b91505092915050565b60008115159050919050565b6130ec816130d7565b82525050565b600060208201905061310760008301846130e3565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561314757808201518184015260208101905061312c565b60008484015250505050565b6000601f19601f8301169050919050565b600061316f8261310d565b6131798185613118565b9350613189818560208601613129565b61319281613153565b840191505092915050565b600060208201905081810360008301526131b78184613164565b905092915050565b6000819050919050565b6131d2816131bf565b81146131dd57600080fd5b50565b6000813590506131ef816131c9565b92915050565b60006020828403121561320b5761320a613048565b5b6000613219848285016131e0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061324d82613222565b9050919050565b61325d81613242565b82525050565b60006020820190506132786000830184613254565b92915050565b61328781613242565b811461329257600080fd5b50565b6000813590506132a48161327e565b92915050565b600080604083850312156132c1576132c0613048565b5b60006132cf85828601613295565b92505060206132e0858286016131e0565b9150509250929050565b6132f3816131bf565b82525050565b600060208201905061330e60008301846132ea565b92915050565b60006020828403121561332a57613329613048565b5b600061333884828501613295565b91505092915050565b60008060006060848603121561335a57613359613048565b5b600061336886828701613295565b935050602061337986828701613295565b925050604061338a868287016131e0565b9150509250925092565b600080604083850312156133ab576133aa613048565b5b60006133b9858286016131e0565b92505060206133ca858286016131e0565b9150509250929050565b60006040820190506133e96000830185613254565b6133f660208301846132ea565b9392505050565b6000819050919050565b600061342261341d61341884613222565b6133fd565b613222565b9050919050565b600061343482613407565b9050919050565b600061344682613429565b9050919050565b6134568161343b565b82525050565b6000602082019050613471600083018461344d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261349c5761349b613477565b5b8235905067ffffffffffffffff8111156134b9576134b861347c565b5b6020830191508360208202830111156134d5576134d4613481565b5b9250929050565b600080602083850312156134f3576134f2613048565b5b600083013567ffffffffffffffff8111156135115761351061304d565b5b61351d85828601613486565b92509250509250929050565b600080604083850312156135405761353f613048565b5b600061354e858286016131e0565b925050602061355f85828601613295565b9150509250929050565b600060408201905061357e60008301856132ea565b61358b60208301846132ea565b9392505050565b61359b816130d7565b81146135a657600080fd5b50565b6000813590506135b881613592565b92915050565b600080604083850312156135d5576135d4613048565b5b60006135e385828601613295565b92505060206135f4858286016135a9565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61363b82613153565b810181811067ffffffffffffffff8211171561365a57613659613603565b5b80604052505050565b600061366d61303e565b90506136798282613632565b919050565b600067ffffffffffffffff82111561369957613698613603565b5b6136a282613153565b9050602081019050919050565b82818337600083830152505050565b60006136d16136cc8461367e565b613663565b9050828152602081018484840111156136ed576136ec6135fe565b5b6136f88482856136af565b509392505050565b600082601f83011261371557613714613477565b5b81356137258482602086016136be565b91505092915050565b6000806000806080858703121561374857613747613048565b5b600061375687828801613295565b945050602061376787828801613295565b9350506040613778878288016131e0565b925050606085013567ffffffffffffffff8111156137995761379861304d565b5b6137a587828801613700565b91505092959194509250565b600080604083850312156137c8576137c7613048565b5b60006137d685828601613295565b92505060206137e785828601613295565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061383857607f821691505b60208210810361384b5761384a6137f1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061388b826131bf565b9150613896836131bf565b92508282026138a4816131bf565b915082820484148315176138bb576138ba613851565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006138fc826131bf565b9150613907836131bf565b925082613917576139166138c2565b5b828204905092915050565b600061392d826131bf565b9150613938836131bf565b92508282019050808211156139505761394f613851565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613990826131bf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139c2576139c1613851565b5b600182019050919050565b60006139d8826131bf565b91506139e3836131bf565b92508282039050818111156139fb576139fa613851565b5b92915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b6000613a37601283613118565b9150613a4282613a01565b602082019050919050565b60006020820190508181036000830152613a6681613a2a565b9050919050565b7f4d696e74696e67206e6f74206f70656e20796574000000000000000000000000600082015250565b6000613aa3601483613118565b9150613aae82613a6d565b602082019050919050565b60006020820190508181036000830152613ad281613a96565b9050919050565b7f4e6f7420696e2077686974656c69737400000000000000000000000000000000600082015250565b6000613b0f601083613118565b9150613b1a82613ad9565b602082019050919050565b60006020820190508181036000830152613b3e81613b02565b9050919050565b7f45786365656473206d6178206d696e7420666f722077686974656c6973740000600082015250565b6000613b7b601e83613118565b9150613b8682613b45565b602082019050919050565b60006020820190508181036000830152613baa81613b6e565b9050919050565b7f45786365656473206d6178206d696e7420666f72207075626c69630000000000600082015250565b6000613be7601b83613118565b9150613bf282613bb1565b602082019050919050565b60006020820190508181036000830152613c1681613bda565b9050919050565b7f496e73756666696369656e74204554482073656e7420666f72206d696e740000600082015250565b6000613c53601e83613118565b9150613c5e82613c1d565b602082019050919050565b60006020820190508181036000830152613c8281613c46565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374210000000000000000000000600082015250565b6000613cbf601583613118565b9150613cca82613c89565b602082019050919050565b60006020820190508181036000830152613cee81613cb2565b9050919050565b600081905092915050565b6000613d0b8261310d565b613d158185613cf5565b9350613d25818560208601613129565b80840191505092915050565b6000613d3d8286613d00565b9150613d498285613d00565b9150613d558284613d00565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613dbe602683613118565b9150613dc982613d62565b604082019050919050565b60006020820190508181036000830152613ded81613db1565b9050919050565b6000613dff826131bf565b915060008203613e1257613e11613851565b5b600182039050919050565b6000604082019050613e326000830185613254565b613e3f6020830184613254565b9392505050565b600081519050613e5581613592565b92915050565b600060208284031215613e7157613e70613048565b5b6000613e7f84828501613e46565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ebe602083613118565b9150613ec982613e88565b602082019050919050565b60006020820190508181036000830152613eed81613eb1565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613f1b82613ef4565b613f258185613eff565b9350613f35818560208601613129565b613f3e81613153565b840191505092915050565b6000608082019050613f5e6000830187613254565b613f6b6020830186613254565b613f7860408301856132ea565b8181036060830152613f8a8184613f10565b905095945050505050565b600081519050613fa48161307e565b92915050565b600060208284031215613fc057613fbf613048565b5b6000613fce84828501613f95565b9150509291505056fe697066733a2f2f516d5377526f3664646d6b7a785a6435716b637a7a61453769624169696f436b6d397746365971675261614a48392fa2646970667358221220ee70ef8f05dc55a433f9a61327295046d704ced52dcb02f4d1886638ea45a87564736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102725760003560e01c80637281fbd81161014f578063ba70c515116100c1578063df3fdf001161007a578063df3fdf001461092d578063e8b5498d14610958578063e985e9c514610983578063f2fde38b146109c0578063fd75e554146109e9578063ff0cc47714610a1457610272565b8063ba70c51514610819578063c051e38a14610844578063c3151fed1461086f578063c87b56dd1461089a578063dad7b5c9146108d7578063dbddb26a1461090257610272565b806395d89b411161011357806395d89b41146107255780639858cf19146107505780639b19251a1461077b578063a0712d68146107b8578063a22cb465146107d4578063b88d4fde146107fd57610272565b80637281fbd81461062b5780637f649783146106565780638422e2dc1461067f5780638536128d146106bc5780638da5cb5b146106fa57610272565b806332cb6b0c116101e8578063583950b0116101ac578063583950b01461051957806358941a4d1461054457806363172ac11461056f5780636352211e1461059a57806370a08231146105d7578063715018a61461061457610272565b806332cb6b0c1461046757806341f434341461049257806342842e0e146104bd5780634d6aeefa146104d9578063548db174146104f057610272565b80631a904acb1161023a5780631a904acb14610363578063209848011461038e57806323b872dd146103cb57806327fda1a1146103e75780632a55205a146104125780633039dfa51461045057610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c57806318160ddd14610338575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906130aa565b610a2b565b6040516102ab91906130f2565b60405180910390f35b3480156102c057600080fd5b506102c9610a4d565b6040516102d6919061319d565b60405180910390f35b3480156102eb57600080fd5b50610306600480360381019061030191906131f5565b610adf565b6040516103139190613263565b60405180910390f35b610336600480360381019061033191906132aa565b610b3d565b005b34801561034457600080fd5b5061034d610b4d565b60405161035a91906132f9565b60405180910390f35b34801561036f57600080fd5b50610378610b64565b60405161038591906132f9565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613314565b610b6a565b6040516103c291906132f9565b60405180910390f35b6103e560048036038101906103e09190613341565b610b82565b005b3480156103f357600080fd5b506103fc610bd1565b60405161040991906132f9565b60405180910390f35b34801561041e57600080fd5b5061043960048036038101906104349190613394565b610bdc565b6040516104479291906133d4565b60405180910390f35b34801561045c57600080fd5b50610465610dc6565b005b34801561047357600080fd5b5061047c610e1d565b60405161048991906132f9565b60405180910390f35b34801561049e57600080fd5b506104a7610e23565b6040516104b4919061345c565b60405180910390f35b6104d760048036038101906104d29190613341565b610e35565b005b3480156104e557600080fd5b506104ee610e84565b005b3480156104fc57600080fd5b50610517600480360381019061051291906134dc565b610eab565b005b34801561052557600080fd5b5061052e610f4f565b60405161053b91906132f9565b60405180910390f35b34801561055057600080fd5b50610559610f54565b60405161056691906132f9565b60405180910390f35b34801561057b57600080fd5b50610584610f59565b60405161059191906132f9565b60405180910390f35b3480156105a657600080fd5b506105c160048036038101906105bc91906131f5565b610f5e565b6040516105ce9190613263565b60405180910390f35b3480156105e357600080fd5b506105fe60048036038101906105f99190613314565b610f70565b60405161060b91906132f9565b60405180910390f35b34801561062057600080fd5b50610629611007565b005b34801561063757600080fd5b5061064061101b565b60405161064d91906132f9565b60405180910390f35b34801561066257600080fd5b5061067d600480360381019061067891906134dc565b611020565b005b34801561068b57600080fd5b506106a660048036038101906106a19190613314565b6110cd565b6040516106b391906132f9565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de9190613529565b6110e5565b6040516106f1929190613569565b60405180910390f35b34801561070657600080fd5b5061070f6115a6565b60405161071c9190613263565b60405180910390f35b34801561073157600080fd5b5061073a6115d0565b604051610747919061319d565b60405180910390f35b34801561075c57600080fd5b50610765611662565b60405161077291906132f9565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190613314565b611668565b6040516107af91906130f2565b60405180910390f35b6107d260048036038101906107cd91906131f5565b611688565b005b3480156107e057600080fd5b506107fb60048036038101906107f691906135be565b611c89565b005b6108176004803603810190610812919061372e565b611d94565b005b34801561082557600080fd5b5061082e611de5565b60405161083b91906132f9565b60405180910390f35b34801561085057600080fd5b50610859611deb565b60405161086691906132f9565b60405180910390f35b34801561087b57600080fd5b50610884611e34565b60405161089191906132f9565b60405180910390f35b3480156108a657600080fd5b506108c160048036038101906108bc91906131f5565b611e3f565b6040516108ce919061319d565b60405180910390f35b3480156108e357600080fd5b506108ec611f09565b6040516108f991906132f9565b60405180910390f35b34801561090e57600080fd5b50610917611f0f565b604051610924919061319d565b60405180910390f35b34801561093957600080fd5b50610942611f2b565b60405161094f919061319d565b60405180910390f35b34801561096457600080fd5b5061096d611f64565b60405161097a91906130f2565b60405180910390f35b34801561098f57600080fd5b506109aa60048036038101906109a591906137b1565b611f77565b6040516109b791906130f2565b60405180910390f35b3480156109cc57600080fd5b506109e760048036038101906109e29190613314565b61200b565b005b3480156109f557600080fd5b506109fe61208e565b604051610a0b91906132f9565b60405180910390f35b348015610a2057600080fd5b50610a29612094565b005b6000610a36826120bb565b80610a465750610a458261214d565b5b9050919050565b606060028054610a5c90613820565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8890613820565b8015610ad55780601f10610aaa57610100808354040283529160200191610ad5565b820191906000526020600020905b815481529060010190602001808311610ab857829003601f168201915b5050505050905090565b6000610aea826121c7565b610aff57610afe63cf4700e460e01b612240565b5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610b498282600161224a565b5050565b6000610b57612379565b6001546000540303905090565b600c5481565b600d6020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bc057610bbf33612382565b5b610bcb84848461247f565b50505050565b66354a6ba7a1800081565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610d715760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610d7b612740565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610da79190613880565b610db191906138f1565b90508160000151819350935050509250929050565b610dce61274a565b60001515601260009054906101000a900460ff16151514610dee57600080fd5b610e00610df96115a6565b60176127c8565b6001601260006101000a81548160ff021916908315150217905550565b6107d081565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e7357610e7233612382565b5b610e7e84848461292b565b50505050565b610e8c61274a565b42600c81905550615460600c54610ea39190613922565b600b81905550565b610eb361274a565b60005b82829050811015610f4a57600f6000848484818110610ed857610ed7613956565b5b9050602002016020810190610eed9190613314565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690558080610f4290613985565b915050610eb6565b505050565b600181565b600a81565b601481565b6000610f698261294b565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fb657610fb5638f4eb60460e01b612240565b5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61100f61274a565b6110196000612a37565b565b600281565b61102861274a565b60005b828290508110156110c8576001600f600085858581811061104f5761104e613956565b5b90506020020160208101906110649190613314565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806110c090613985565b91505061102b565b505050565b600e6020528060005260406000206000915090505481565b60008060009150600090506107d061111c8561110e601154601054612afd90919063ffffffff16565b612afd90919063ffffffff16565b1115801561112c5750600c544210155b1561159f5760008490506000806101f4601054101561127e57600b544210801561119f5750600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156111ad57600190506111bc565b600b5442106111bb57600290505b5b600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111611209576000611255565b600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548161125491906139cd565b5b90508681116112645780611266565b865b915061127b8288612b1390919063ffffffff16565b92505b600b54421080156112d85750600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561143957600a61133184600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612afd90919063ffffffff16565b1161136c576113508366354a6ba7a18000612b2990919063ffffffff16565b94506113658383612afd90919063ffffffff16565b9350611434565b6113ca600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a6113bb91906139cd565b83612afd90919063ffffffff16565b9350611431600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a61141b91906139cd565b66354a6ba7a18000612b2990919063ffffffff16565b94505b61159b565b600b54421061159a57601461149684600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612afd90919063ffffffff16565b116114d1576114b58366470de4df820000612b2990919063ffffffff16565b94506114ca8383612afd90919063ffffffff16565b9350611599565b61152f600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601461152091906139cd565b83612afd90919063ffffffff16565b9350611596600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601461158091906139cd565b66470de4df820000612b2990919063ffffffff16565b94505b5b5b5050505b9250929050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546115df90613820565b80601f016020809104026020016040519081016040528092919081815260200182805461160b90613820565b80156116585780601f1061162d57610100808354040283529160200191611658565b820191906000526020600020905b81548152906001019060200180831161163b57829003601f168201915b5050505050905090565b6101f481565b600f6020528060005260406000206000915054906101000a900460ff1681565b6107d06116b4826116a6601154601054612afd90919063ffffffff16565b612afd90919063ffffffff16565b11156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90613a4d565b60405180910390fd5b600c5442101561173a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173190613ab9565b60405180910390fd5b60008082905060006101f46010541015611880576000600b54421080156117aa5750600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156117b857600190506117bd565b600290505b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811161180a576000611856565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548161185591906139cd565b5b90508481116118655780611867565b845b915061187c8286612b1390919063ffffffff16565b9250505b600b544210156119cc57600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d90613b25565b60405180910390fd5b600a61196a83600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612afd90919063ffffffff16565b11156119ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a290613b91565b60405180910390fd5b6119c58266354a6ba7a18000612b2990919063ffffffff16565b9250611a7e565b6014611a2083600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612afd90919063ffffffff16565b1115611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5890613bfd565b60405180910390fd5b611a7b8266470de4df820000612b2990919063ffffffff16565b92505b82341015611ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab890613c69565b60405180910390fd5b611b1381600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612afd90919063ffffffff16565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b6b81601054612afd90919063ffffffff16565b601081905550611bc382600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612afd90919063ffffffff16565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611c1b82601154612afd90919063ffffffff16565b6011819055506000341115611c7957611c326115a6565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611c77573d6000803e3d6000fd5b505b611c8333856127c8565b50505050565b8060076000611c96612b3f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d43612b3f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d8891906130f2565b60405180910390a35050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611dd257611dd133612382565b5b611dde85858585612b47565b5050505050565b600b5481565b6000600c54421015611e005760009050611e31565b600c544210158015611e135750600b5442105b15611e215760019050611e30565b600b544210611e2f57600290505b5b5b90565b66470de4df82000081565b6060611e4a826121c7565b611e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8090613cd5565b60405180910390fd5b604051806060016040528060368152602001613fd860369139611eab83612b99565b6040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250604051602001611ef393929190613d31565b6040516020818303038152906040529050919050565b60105481565b604051806060016040528060368152602001613fd86036913981565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525081565b601260009054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61201361274a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207990613dd4565b60405180910390fd5b61208b81612a37565b50565b60115481565b61209c61274a565b42600b81905550615460600b546120b391906139cd565b600c81905550565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061211657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121465750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121c057506121bf82612c67565b5b9050919050565b6000816121d2612379565b1161223b5760005482101561223a5760005b6000600460008581526020019081526020016000205491508103612213578261220c90613df4565b92506121e4565b60007c01000000000000000000000000000000000000000000000000000000008216149150505b5b919050565b8060005260046000fd5b600061225583610f5e565b905081801561229757508073ffffffffffffffffffffffffffffffffffffffff1661227e612b3f565b73ffffffffffffffffffffffffffffffffffffffff1614155b156122c3576122ad816122a8612b3f565b611f77565b6122c2576122c163cfb3b94260e01b612240565b5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60006001905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561247c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016123f9929190613e1d565b602060405180830381865afa158015612416573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243a9190613e5b565b61247b57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016124729190613263565b60405180910390fd5b5b50565b600061248a8261294b565b905073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161693508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146124ff576124fe63a114810060e01b612240565b5b60008061250b84612cd1565b91509150612521818761251c612b3f565b612cf8565b61254c5761253686612531612b3f565b611f77565b61254b5761254a6359c896be60e01b612240565b5b5b6125598686866001612d3c565b801561256457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506126328561260e888887612d42565b7c020000000000000000000000000000000000000000000000000000000017612d6a565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036126b857600060018501905060006004600083815260200190815260200160002054036126b65760005481146126b5578360046000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff8673ffffffffffffffffffffffffffffffffffffffff161690508481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46000810361272a5761272963ea553b3460e01b612240565b5b6127378787876001612d95565b50505050505050565b6000612710905090565b612752612d9b565b73ffffffffffffffffffffffffffffffffffffffff166127706115a6565b73ffffffffffffffffffffffffffffffffffffffff16146127c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bd90613ed4565b60405180910390fd5b565b600080549050600082036127e7576127e663b562e8dd60e01b612240565b5b6127f46000848385612d3c565b612814836128056000866000612d42565b61280e85612da3565b17612d6a565b6004600083815260200190815260200160002081905550600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff16169050600081036128cc576128cb632e07630060e01b612240565b5b6000838301905060008390505b808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a48181600101915081036128d957816000819055505050506129266000848385612d95565b505050565b61294683838360405180602001604052806000815250611d94565b505050565b600081612956612379565b11612a215760046000838152602001908152602001600020549050600081036129f85760005482106129935761299263df2d9b4260e01b612240565b5b5b600460008360019003935083815260200190815260200160002054905060008103156129f35760007c010000000000000000000000000000000000000000000000000000000082160315612a32576129f263df2d9b4260e01b612240565b5b612994565b60007c010000000000000000000000000000000000000000000000000000000082160315612a32575b612a3163df2d9b4260e01b612240565b5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612b0b9190613922565b905092915050565b60008183612b2191906139cd565b905092915050565b60008183612b379190613880565b905092915050565b600033905090565b612b52848484610b82565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612b9357612b7d84848484612db3565b612b9257612b9163d1a57ed660e01b612240565b5b5b50505050565b606060006001612ba884612ee2565b01905060008167ffffffffffffffff811115612bc757612bc6613603565b5b6040519080825280601f01601f191660200182016040528015612bf95781602001600182028036833780820191505090505b509050600082602001820190505b600115612c5c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612c5057612c4f6138c2565b5b04945060008503612c07575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612d59868684613035565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612dd9612b3f565b8786866040518563ffffffff1660e01b8152600401612dfb9493929190613f49565b6020604051808303816000875af1925050508015612e3757506040513d601f19601f82011682018060405250810190612e349190613faa565b60015b612e8f573d8060008114612e67576040519150601f19603f3d011682016040523d82523d6000602084013e612e6c565b606091505b506000815103612e8757612e8663d1a57ed660e01b612240565b5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612f40577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612f3657612f356138c2565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612f7d576d04ee2d6d415b85acef81000000008381612f7357612f726138c2565b5b0492506020810190505b662386f26fc100008310612fac57662386f26fc100008381612fa257612fa16138c2565b5b0492506010810190505b6305f5e1008310612fd5576305f5e1008381612fcb57612fca6138c2565b5b0492506008810190505b6127108310612ffa576127108381612ff057612fef6138c2565b5b0492506004810190505b6064831061301d5760648381613013576130126138c2565b5b0492506002810190505b600a831061302c576001810190505b80915050919050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61308781613052565b811461309257600080fd5b50565b6000813590506130a48161307e565b92915050565b6000602082840312156130c0576130bf613048565b5b60006130ce84828501613095565b91505092915050565b60008115159050919050565b6130ec816130d7565b82525050565b600060208201905061310760008301846130e3565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561314757808201518184015260208101905061312c565b60008484015250505050565b6000601f19601f8301169050919050565b600061316f8261310d565b6131798185613118565b9350613189818560208601613129565b61319281613153565b840191505092915050565b600060208201905081810360008301526131b78184613164565b905092915050565b6000819050919050565b6131d2816131bf565b81146131dd57600080fd5b50565b6000813590506131ef816131c9565b92915050565b60006020828403121561320b5761320a613048565b5b6000613219848285016131e0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061324d82613222565b9050919050565b61325d81613242565b82525050565b60006020820190506132786000830184613254565b92915050565b61328781613242565b811461329257600080fd5b50565b6000813590506132a48161327e565b92915050565b600080604083850312156132c1576132c0613048565b5b60006132cf85828601613295565b92505060206132e0858286016131e0565b9150509250929050565b6132f3816131bf565b82525050565b600060208201905061330e60008301846132ea565b92915050565b60006020828403121561332a57613329613048565b5b600061333884828501613295565b91505092915050565b60008060006060848603121561335a57613359613048565b5b600061336886828701613295565b935050602061337986828701613295565b925050604061338a868287016131e0565b9150509250925092565b600080604083850312156133ab576133aa613048565b5b60006133b9858286016131e0565b92505060206133ca858286016131e0565b9150509250929050565b60006040820190506133e96000830185613254565b6133f660208301846132ea565b9392505050565b6000819050919050565b600061342261341d61341884613222565b6133fd565b613222565b9050919050565b600061343482613407565b9050919050565b600061344682613429565b9050919050565b6134568161343b565b82525050565b6000602082019050613471600083018461344d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261349c5761349b613477565b5b8235905067ffffffffffffffff8111156134b9576134b861347c565b5b6020830191508360208202830111156134d5576134d4613481565b5b9250929050565b600080602083850312156134f3576134f2613048565b5b600083013567ffffffffffffffff8111156135115761351061304d565b5b61351d85828601613486565b92509250509250929050565b600080604083850312156135405761353f613048565b5b600061354e858286016131e0565b925050602061355f85828601613295565b9150509250929050565b600060408201905061357e60008301856132ea565b61358b60208301846132ea565b9392505050565b61359b816130d7565b81146135a657600080fd5b50565b6000813590506135b881613592565b92915050565b600080604083850312156135d5576135d4613048565b5b60006135e385828601613295565b92505060206135f4858286016135a9565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61363b82613153565b810181811067ffffffffffffffff8211171561365a57613659613603565b5b80604052505050565b600061366d61303e565b90506136798282613632565b919050565b600067ffffffffffffffff82111561369957613698613603565b5b6136a282613153565b9050602081019050919050565b82818337600083830152505050565b60006136d16136cc8461367e565b613663565b9050828152602081018484840111156136ed576136ec6135fe565b5b6136f88482856136af565b509392505050565b600082601f83011261371557613714613477565b5b81356137258482602086016136be565b91505092915050565b6000806000806080858703121561374857613747613048565b5b600061375687828801613295565b945050602061376787828801613295565b9350506040613778878288016131e0565b925050606085013567ffffffffffffffff8111156137995761379861304d565b5b6137a587828801613700565b91505092959194509250565b600080604083850312156137c8576137c7613048565b5b60006137d685828601613295565b92505060206137e785828601613295565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061383857607f821691505b60208210810361384b5761384a6137f1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061388b826131bf565b9150613896836131bf565b92508282026138a4816131bf565b915082820484148315176138bb576138ba613851565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006138fc826131bf565b9150613907836131bf565b925082613917576139166138c2565b5b828204905092915050565b600061392d826131bf565b9150613938836131bf565b92508282019050808211156139505761394f613851565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613990826131bf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139c2576139c1613851565b5b600182019050919050565b60006139d8826131bf565b91506139e3836131bf565b92508282039050818111156139fb576139fa613851565b5b92915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b6000613a37601283613118565b9150613a4282613a01565b602082019050919050565b60006020820190508181036000830152613a6681613a2a565b9050919050565b7f4d696e74696e67206e6f74206f70656e20796574000000000000000000000000600082015250565b6000613aa3601483613118565b9150613aae82613a6d565b602082019050919050565b60006020820190508181036000830152613ad281613a96565b9050919050565b7f4e6f7420696e2077686974656c69737400000000000000000000000000000000600082015250565b6000613b0f601083613118565b9150613b1a82613ad9565b602082019050919050565b60006020820190508181036000830152613b3e81613b02565b9050919050565b7f45786365656473206d6178206d696e7420666f722077686974656c6973740000600082015250565b6000613b7b601e83613118565b9150613b8682613b45565b602082019050919050565b60006020820190508181036000830152613baa81613b6e565b9050919050565b7f45786365656473206d6178206d696e7420666f72207075626c69630000000000600082015250565b6000613be7601b83613118565b9150613bf282613bb1565b602082019050919050565b60006020820190508181036000830152613c1681613bda565b9050919050565b7f496e73756666696369656e74204554482073656e7420666f72206d696e740000600082015250565b6000613c53601e83613118565b9150613c5e82613c1d565b602082019050919050565b60006020820190508181036000830152613c8281613c46565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374210000000000000000000000600082015250565b6000613cbf601583613118565b9150613cca82613c89565b602082019050919050565b60006020820190508181036000830152613cee81613cb2565b9050919050565b600081905092915050565b6000613d0b8261310d565b613d158185613cf5565b9350613d25818560208601613129565b80840191505092915050565b6000613d3d8286613d00565b9150613d498285613d00565b9150613d558284613d00565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613dbe602683613118565b9150613dc982613d62565b604082019050919050565b60006020820190508181036000830152613ded81613db1565b9050919050565b6000613dff826131bf565b915060008203613e1257613e11613851565b5b600182039050919050565b6000604082019050613e326000830185613254565b613e3f6020830184613254565b9392505050565b600081519050613e5581613592565b92915050565b600060208284031215613e7157613e70613048565b5b6000613e7f84828501613e46565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ebe602083613118565b9150613ec982613e88565b602082019050919050565b60006020820190508181036000830152613eed81613eb1565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613f1b82613ef4565b613f258185613eff565b9350613f35818560208601613129565b613f3e81613153565b840191505092915050565b6000608082019050613f5e6000830187613254565b613f6b6020830186613254565b613f7860408301856132ea565b8181036060830152613f8a8184613f10565b905095945050505050565b600081519050613fa48161307e565b92915050565b600060208284031215613fc057613fbf613048565b5b6000613fce84828501613f95565b9150509291505056fe697066733a2f2f516d5377526f3664646d6b7a785a6435716b637a7a61453769624169696f436b6d397746365971675261614a48392fa2646970667358221220ee70ef8f05dc55a433f9a61327295046d704ced52dcb02f4d1886638ea45a87564736f6c63430008120033

Deployed Bytecode Sourcemap

99444:33533:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107111:259;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64983:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72017:227;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71734:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60725:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100250:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100278:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106418:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99825:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43175:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;102642:145;;;;;;;;;;;;;:::i;:::-;;99951:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7742:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106631:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;105282:131;;;;;;;;;;;;;:::i;:::-;;105071:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99720:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99615;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99669:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66385:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61909:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37860:103;;;;;;;;;;;;;:::i;:::-;;99774:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104865:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100330:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102795:2062;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;37212:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65159:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99999:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100382;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100735:1899;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72584:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106852:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100218:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105564:284;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99890:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105965:410;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100430:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100101:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100047:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100504:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72975:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38118:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100467:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105421:135;;;;;;;;;;;;;:::i;:::-;;107111:259;107230:4;107268:38;107294:11;107268:25;:38::i;:::-;:94;;;;107324:38;107350:11;107324:25;:38::i;:::-;107268:94;107247:115;;107111:259;;;:::o;64983:100::-;65037:13;65070:5;65063:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64983:100;:::o;72017:227::-;72093:7;72118:16;72126:7;72118;:16::i;:::-;72113:73;;72136:50;72144:41;;;72136:7;:50::i;:::-;72113:73;72206:15;:24;72222:7;72206:24;;;;;;;;;;;:30;;;;;;;;;;;;72199:37;;72017:227;;;:::o;71734:124::-;71823:27;71832:2;71836:7;71845:4;71823:8;:27::i;:::-;71734:124;;:::o;60725:323::-;60786:7;61014:15;:13;:15::i;:::-;60999:12;;60983:13;;:28;:46;60976:53;;60725:323;:::o;100250:21::-;;;;:::o;100278:45::-;;;;;;;;;;;;;;;;;:::o;106418:205::-;106561:4;9258:10;9250:18;;:4;:18;;;9246:83;;9285:32;9306:10;9285:20;:32::i;:::-;9246:83;106578:37:::1;106597:4;106603:2;106607:7;106578:18;:37::i;:::-;106418:205:::0;;;;:::o;99825:58::-;99872:11;99825:58;:::o;43175:438::-;43270:7;43279;43299:26;43328:17;:26;43346:7;43328:26;;;;;;;;;;;43299:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43399:1;43371:30;;:7;:16;;;:30;;;43367:92;;43428:19;43418:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43367:92;43471:21;43535:17;:15;:17::i;:::-;43495:57;;43508:7;:23;;;43496:35;;:9;:35;;;;:::i;:::-;43495:57;;;;:::i;:::-;43471:81;;43573:7;:16;;;43591:13;43565:40;;;;;;43175:438;;;;;:::o;102642:145::-;37098:13;:11;:13::i;:::-;102716:5:::1;102702:19;;:10;;;;;;;;;;;:19;;;102694:28;;;::::0;::::1;;102733:18;102739:7;:5;:7::i;:::-;102748:2;102733:5;:18::i;:::-;102775:4;102762:10;;:17;;;;;;;;;;;;;;;;;;102642:145::o:0;99951:41::-;99988:4;99951:41;:::o;7742:143::-;156:42;7742:143;:::o;106631:213::-;106778:4;9258:10;9250:18;;:4;:18;;;9246:83;;9285:32;9306:10;9285:20;:32::i;:::-;9246:83;106795:41:::1;106818:4;106824:2;106828:7;106795:22;:41::i;:::-;106631:213:::0;;;;:::o;105282:131::-;37098:13;:11;:13::i;:::-;105350:15:::1;105341:6;:24;;;;105398:7;105389:6;;:16;;;;:::i;:::-;105376:10;:29;;;;105282:131::o:0;105071:203::-;37098:13;:11;:13::i;:::-;105167:6:::1;105162:105;105183:11;;:18;;105179:1;:22;105162:105;;;105230:9;:25;105240:11;;105252:1;105240:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;105230:25;;;;;;;;;;;;;;;;105223:32;;;;;;;;;;;105203:3;;;;;:::i;:::-;;;;105162:105;;;;105071:203:::0;;:::o;99720:47::-;99766:1;99720:47;:::o;99615:::-;99660:2;99615:47;:::o;99669:44::-;99711:2;99669:44;:::o;66385:152::-;66457:7;66500:27;66519:7;66500:18;:27::i;:::-;66477:52;;66385:152;;;:::o;61909:242::-;61981:7;62022:1;62005:19;;:5;:19;;;62001:69;;62026:44;62034:35;;;62026:7;:44::i;:::-;62001:69;56068:13;62088:18;:25;62107:5;62088:25;;;;;;;;;;;;;;;;:55;62081:62;;61909:242;;;:::o;37860:103::-;37098:13;:11;:13::i;:::-;37925:30:::1;37952:1;37925:18;:30::i;:::-;37860:103::o:0;99774:44::-;99817:1;99774:44;:::o;104865:198::-;37098:13;:11;:13::i;:::-;104956:6:::1;104951:105;104972:11;;:18;;104968:1;:22;104951:105;;;105040:4;105012:9;:25;105022:11;;105034:1;105022:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;105012:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;104992:3;;;;;:::i;:::-;;;;104951:105;;;;104865:198:::0;;:::o;100330:45::-;;;;;;;;;;;;;;;;;:::o;102795:2062::-;102878:12;102892:17;102929:1;102922:8;;102953:1;102941:13;;99988:4;102971:56;103012:14;102971:36;102991:15;;102971;;:19;;:36;;;;:::i;:::-;:40;;:56;;;;:::i;:::-;:70;;:99;;;;;103064:6;;103045:15;:25;;102971:99;102967:1846;;;103087:19;103109:14;103087:36;;103138:18;103175;100037:3;103218:15;;:29;103214:570;;;103290:10;;103272:15;:28;:50;;;;;103304:9;:18;103314:7;103304:18;;;;;;;;;;;;;;;;;;;;;;;;;103272:50;103268:244;;;99766:1;103347:32;;103268:244;;;103428:10;;103409:15;:29;103405:107;;99817:1;103463:29;;103405:107;103268:244;103558:10;:19;103569:7;103558:19;;;;;;;;;;;;;;;;103545:10;:32;:71;;103615:1;103545:71;;;103593:10;:19;103604:7;103593:19;;;;;;;;;;;;;;;;103580:10;:32;;;;:::i;:::-;103545:71;103532:84;;103661:14;103648:10;:27;:57;;103695:10;103648:57;;;103678:14;103648:57;103635:70;;103738:30;103757:10;103738:14;:18;;:30;;;;:::i;:::-;103724:44;;103214:570;103822:10;;103804:15;:28;:50;;;;;103836:9;:18;103846:7;103836:18;;;;;;;;;;;;;;;;;;;;;;;;;103804:50;103800:1002;;;99660:2;103879:36;103903:11;103879:10;:19;103890:7;103879:19;;;;;;;;;;;;;;;;:23;;:36;;;;:::i;:::-;:58;103875:426;;103969:37;103994:11;99872;103969:24;;:37;;;;:::i;:::-;103962:44;;104041:27;104056:11;104041:10;:14;;:27;;;;:::i;:::-;104029:39;;103875:426;;;104129:56;104165:10;:19;104176:7;104165:19;;;;;;;;;;;;;;;;99660:2;104144:40;;;;:::i;:::-;104129:10;:14;;:56;;;;:::i;:::-;104117:68;;104215:66;104261:10;:19;104272:7;104261:19;;;;;;;;;;;;;;;;99660:2;104240:40;;;;:::i;:::-;99872:11;104215:24;;:66;;;;:::i;:::-;104208:73;;103875:426;103800:1002;;;104345:10;;104326:15;:29;104322:480;;99711:2;104380:36;104404:11;104380:10;:19;104391:7;104380:19;;;;;;;;;;;;;;;;:23;;:36;;;;:::i;:::-;:55;104376:411;;104467:34;104489:11;99934:10;104467:21;;:34;;;;:::i;:::-;104460:41;;104536:27;104551:11;104536:10;:14;;:27;;;;:::i;:::-;104524:39;;104376:411;;;104624:53;104657:10;:19;104668:7;104657:19;;;;;;;;;;;;;;;;99711:2;104639:37;;;;:::i;:::-;104624:10;:14;;:53;;;;:::i;:::-;104612:65;;104707:60;104747:10;:19;104758:7;104747:19;;;;;;;;;;;;;;;;99711:2;104729:37;;;;:::i;:::-;99934:10;104707:21;;:60;;;;:::i;:::-;104700:67;;104376:411;104322:480;103800:1002;103072:1741;;;102967:1846;102795:2062;;;;;:::o;37212:87::-;37258:7;37285:6;;;;;;;;;;;37278:13;;37212:87;:::o;65159:104::-;65215:13;65248:7;65241:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65159:104;:::o;99999:41::-;100037:3;99999:41;:::o;100382:::-;;;;;;;;;;;;;;;;;;;;;;:::o;100735:1899::-;99988:4;100800:49;100841:7;100800:36;100820:15;;100800;;:19;;:36;;;;:::i;:::-;:40;;:49;;;;:::i;:::-;:63;;100792:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;100924:6;;100905:15;:25;;100897:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;100968:12;100991:19;101013:7;100991:29;;101031:18;100037:3;101070:15;;:29;101066:534;;;101116:18;101185:10;;101167:15;:28;:53;;;;;101199:9;:21;101209:10;101199:21;;;;;;;;;;;;;;;;;;;;;;;;;101167:53;101163:196;;;99766:1;101241:32;;101163:196;;;99817:1;101314:29;;101163:196;101401:10;:22;101412:10;101401:22;;;;;;;;;;;;;;;;101388:10;:35;:77;;101464:1;101388:77;;;101439:10;:22;101450:10;101439:22;;;;;;;;;;;;;;;;101426:10;:35;;;;:::i;:::-;101388:77;101375:90;;101506:7;101493:10;:20;:43;;101526:10;101493:43;;;101516:7;101493:43;101480:56;;101565:23;101577:10;101565:7;:11;;:23;;;;:::i;:::-;101551:37;;101101:499;101066:534;101634:10;;101616:15;:28;101612:476;;;101669:9;:21;101679:10;101669:21;;;;;;;;;;;;;;;;;;;;;;;;;101661:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;99660:2;101734:39;101761:11;101734:10;:22;101745:10;101734:22;;;;;;;;;;;;;;;;:26;;:39;;;;:::i;:::-;:61;;101726:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;101852:37;101877:11;99872;101852:24;;:37;;;;:::i;:::-;101845:44;;101612:476;;;99711:2;101930:39;101957:11;101930:10;:22;101941:10;101930:22;;;;;;;;;;;;;;;;:26;;:39;;;;:::i;:::-;:58;;101922:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;102042:34;102064:11;99934:10;102042:21;;:34;;;;:::i;:::-;102035:41;;101612:476;102121:4;102108:9;:17;;102100:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;102198:38;102225:10;102198;:22;102209:10;102198:22;;;;;;;;;;;;;;;;:26;;:38;;;;:::i;:::-;102173:10;:22;102184:10;102173:22;;;;;;;;;;;;;;;:63;;;;102265:31;102285:10;102265:15;;:19;;:31;;;;:::i;:::-;102247:15;:49;;;;102332:39;102359:11;102332:10;:22;102343:10;102332:22;;;;;;;;;;;;;;;;:26;;:39;;;;:::i;:::-;102307:10;:22;102318:10;102307:22;;;;;;;;;;;;;;;:64;;;;102400:32;102420:11;102400:15;;:19;;:32;;;;:::i;:::-;102382:15;:50;;;;102514:1;102502:9;:13;102498:82;;;102540:7;:5;:7::i;:::-;102532:25;;:36;102558:9;102532:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102498:82;102600:26;102606:10;102618:7;102600:5;:26::i;:::-;100781:1853;;;100735:1899;:::o;72584:234::-;72731:8;72679:18;:39;72698:19;:17;:19::i;:::-;72679:39;;;;;;;;;;;;;;;:49;72719:8;72679:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;72791:8;72755:55;;72770:19;:17;:19::i;:::-;72755:55;;;72801:8;72755:55;;;;;;:::i;:::-;;;;;;;;72584:234;;:::o;106852:247::-;107027:4;9258:10;9250:18;;:4;:18;;;9246:83;;9285:32;9306:10;9285:20;:32::i;:::-;9246:83;107044:47:::1;107067:4;107073:2;107077:7;107086:4;107044:22;:47::i;:::-;106852:247:::0;;;;;:::o;100218:25::-;;;;:::o;105564:284::-;105607:10;105652:6;;105634:15;:24;105630:187;;;105668:1;105660:9;;105630:187;;;105708:6;;105689:15;:25;;:57;;;;;105736:10;;105718:15;:28;105689:57;105685:132;;;105756:1;105748:9;;105685:132;;;105796:10;;105777:15;:29;105773:44;;105816:1;105808:9;;105773:44;105685:132;105630:187;105564:284;:::o;99890:54::-;99934:10;99890:54;:::o;105965:410::-;106067:13;106106:17;106114:8;106106:7;:17::i;:::-;106098:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;106246:8;;;;;;;;;;;;;;;;;106277:19;:8;:17;:19::i;:::-;106319:14;;;;;;;;;;;;;;;;;106207:145;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;106162:205;;105965:410;;;:::o;100430:30::-;;;;:::o;100101:90::-;;;;;;;;;;;;;;;;;;;:::o;100047:47::-;;;;;;;;;;;;;;;;;;;:::o;100504:22::-;;;;;;;;;;;;;:::o;72975:164::-;73072:4;73096:18;:25;73115:5;73096:25;;;;;;;;;;;;;;;:35;73122:8;73096:35;;;;;;;;;;;;;;;;;;;;;;;;;73089:42;;72975:164;;;;:::o;38118:201::-;37098:13;:11;:13::i;:::-;38227:1:::1;38207:22;;:8;:22;;::::0;38199:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;38283:28;38302:8;38283:18;:28::i;:::-;38118:201:::0;:::o;100467:30::-;;;;:::o;105421:135::-;37098:13;:11;:13::i;:::-;105493:15:::1;105480:10;:28;;;;105541:7;105528:10;;:20;;;;:::i;:::-;105519:6;:29;;;;105421:135::o:0;64081:639::-;64166:4;64505:10;64490:25;;:11;:25;;;;:102;;;;64582:10;64567:25;;:11;:25;;;;64490:102;:179;;;;64659:10;64644:25;;:11;:25;;;;64490:179;64470:199;;64081:639;;;:::o;42905:215::-;43007:4;43046:26;43031:41;;;:11;:41;;;;:81;;;;43076:36;43100:11;43076:23;:36::i;:::-;43031:81;43024:88;;42905:215;;;:::o;73397:368::-;73462:11;73509:7;73490:15;:13;:15::i;:::-;:26;73486:272;;73547:13;;73537:7;:23;73533:214;;;73581:14;73614:60;73662:1;73631:17;:26;73649:7;73631:26;;;;;;;;;;;;73622:35;;;73621:42;73614:60;;73665:9;;;;:::i;:::-;;;73614:60;;;73730:1;56844:8;73702:6;:24;:29;73693:38;;73562:185;73533:214;73486:272;73397:368;;;:::o;99175:165::-;99276:13;99270:4;99263:27;99317:4;99311;99304:18;90608:474;90737:13;90753:16;90761:7;90753;:16::i;:::-;90737:32;;90786:13;:45;;;;;90826:5;90803:28;;:19;:17;:19::i;:::-;:28;;;;90786:45;90782:201;;;90851:44;90868:5;90875:19;:17;:19::i;:::-;90851:16;:44::i;:::-;90846:137;;90916:51;90924:42;;;90916:7;:51::i;:::-;90846:137;90782:201;91028:2;90995:15;:24;91011:7;90995:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;91066:7;91062:2;91046:28;;91055:5;91046:28;;;;;;;;;;;;90726:356;90608:474;;;:::o;105856:101::-;105921:7;105948:1;105941:8;;105856:101;:::o;9667:647::-;9906:1;156:42;9858:45;;;:49;9854:453;;;156:42;10157;;;10208:4;10215:8;10157:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10152:144;;10271:8;10252:28;;;;;;;;;;;:::i;:::-;;;;;;;;10152:144;9854:453;9667:647;:::o;75751:3523::-;75893:27;75923;75942:7;75923:18;:27::i;:::-;75893:57;;57526:14;76094:4;76078:22;;:41;76055:66;;76179:4;76138:45;;76154:19;76138:45;;;76134:95;;76185:44;76193:35;;;76185:7;:44::i;:::-;76134:95;76243:27;76272:23;76299:35;76326:7;76299:26;:35::i;:::-;76242:92;;;;76434:68;76459:15;76476:4;76482:19;:17;:19::i;:::-;76434:24;:68::i;:::-;76429:189;;76522:43;76539:4;76545:19;:17;:19::i;:::-;76522:16;:43::i;:::-;76517:101;;76567:51;76575:42;;;76567:7;:51::i;:::-;76517:101;76429:189;76631:43;76653:4;76659:2;76663:7;76672:1;76631:21;:43::i;:::-;76767:15;76764:160;;;76907:1;76886:19;76879:30;76764:160;77304:18;:24;77323:4;77304:24;;;;;;;;;;;;;;;;77302:26;;;;;;;;;;;;77373:18;:22;77392:2;77373:22;;;;;;;;;;;;;;;;77371:24;;;;;;;;;;;77695:146;77732:2;77781:45;77796:4;77802:2;77806:19;77781:14;:45::i;:::-;57124:8;77753:73;77695:18;:146::i;:::-;77666:17;:26;77684:7;77666:26;;;;;;;;;;;:175;;;;78012:1;57124:8;77961:19;:47;:52;77957:627;;78034:19;78066:1;78056:7;:11;78034:33;;78223:1;78189:17;:30;78207:11;78189:30;;;;;;;;;;;;:35;78185:384;;78327:13;;78312:11;:28;78308:242;;78507:19;78474:17;:30;78492:11;78474:30;;;;;;;;;;;:52;;;;78308:242;78185:384;78015:569;77957:627;78697:16;57526:14;78732:2;78716:20;;:39;78697:58;;79096:7;79060:8;79026:4;78968:25;78913:1;78856;78833:299;79169:1;79157:8;:13;79153:58;;79172:39;79180:30;;;79172:7;:39::i;:::-;79153:58;79224:42;79245:4;79251:2;79255:7;79264:1;79224:20;:42::i;:::-;75882:3392;;;;75751:3523;;;:::o;43895:97::-;43953:6;43979:5;43972:12;;43895:97;:::o;37377:132::-;37452:12;:10;:12::i;:::-;37441:23;;:7;:5;:7::i;:::-;:23;;;37433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37377:132::o;83814:2305::-;83887:20;83910:13;;83887:36;;83950:1;83938:8;:13;83934:53;;83953:34;83961:25;;;83953:7;:34::i;:::-;83934:53;84000:61;84030:1;84034:2;84038:12;84052:8;84000:21;:61::i;:::-;84534:139;84571:2;84625:33;84648:1;84652:2;84656:1;84625:14;:33::i;:::-;84592:30;84613:8;84592:20;:30::i;:::-;:66;84534:18;:139::i;:::-;84500:17;:31;84518:12;84500:31;;;;;;;;;;;:173;;;;84960:1;56206:2;84930:1;:26;;84929:32;84917:8;:45;84891:18;:22;84910:2;84891:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;85073:16;57526:14;85108:2;85092:20;;:39;85073:58;;85164:1;85152:8;:13;85148:54;;85167:35;85175:26;;;85167:7;:35::i;:::-;85148:54;85219:11;85248:8;85233:12;:23;85219:37;;85271:15;85289:12;85271:30;;85318:676;85737:7;85693:8;85648:1;85582:25;85519:1;85454;85423:358;85989:3;85976:9;;;;;;:16;85318:676;;86026:3;86010:13;:19;;;;84249:1792;;;86051:60;86080:1;86084:2;86088:12;86102:8;86051:20;:60::i;:::-;83876:2243;83814:2305;;:::o;79370:193::-;79516:39;79533:4;79539:2;79543:7;79516:39;;;;;;;;;;;;:16;:39::i;:::-;79370:193;;;:::o;67865:2012::-;67932:14;67982:7;67963:15;:13;:15::i;:::-;:26;67959:1853;;68015:17;:26;68033:7;68015:26;;;;;;;;;;;;68006:35;;68151:1;68141:6;:11;68137:1292;;68188:13;;68177:7;:24;68173:77;;68203:47;68211:38;;;68203:7;:47::i;:::-;68173:77;68807:607;68885:17;:28;68903:9;;;;;;;68885:28;;;;;;;;;;;;68876:37;;68973:1;68963:6;:11;68959:25;68976:8;68959:25;69039:1;56844:8;69011:6;:24;:29;69007:48;69042:13;69007:48;69347:47;69355:38;;;69347:7;:47::i;:::-;68807:607;;;68137:1292;69784:1;56844:8;69756:6;:24;:29;69752:48;69787:13;69752:48;67959:1853;69822:47;69830:38;;;69822:7;:47::i;:::-;67865:2012;;;;:::o;38479:191::-;38553:16;38572:6;;;;;;;;;;;38553:25;;38598:8;38589:6;;:17;;;;;;;;;;;;;;;;;;38653:8;38622:40;;38643:8;38622:40;;;;;;;;;;;;38542:128;38479:191;:::o;13973:98::-;14031:7;14062:1;14058;:5;;;;:::i;:::-;14051:12;;13973:98;;;;:::o;14354:::-;14412:7;14443:1;14439;:5;;;;:::i;:::-;14432:12;;14354:98;;;;:::o;14711:::-;14769:7;14800:1;14796;:5;;;;:::i;:::-;14789:12;;14711:98;;;;:::o;97156:105::-;97216:7;97243:10;97236:17;;97156:105;:::o;80161:416::-;80336:31;80349:4;80355:2;80359:7;80336:12;:31::i;:::-;80400:1;80382:2;:14;;;:19;80378:192;;80421:56;80452:4;80458:2;80462:7;80471:5;80421:30;:56::i;:::-;80416:154;;80498:56;80506:47;;;80498:7;:56::i;:::-;80416:154;80378:192;80161:416;;;;:::o;32682:716::-;32738:13;32789:14;32826:1;32806:17;32817:5;32806:10;:17::i;:::-;:21;32789:38;;32842:20;32876:6;32865:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32842:41;;32898:11;33027:6;33023:2;33019:15;33011:6;33007:28;33000:35;;33064:288;33071:4;33064:288;;;33096:5;;;;;;;;33238:8;33233:2;33226:5;33222:14;33217:30;33212:3;33204:44;33294:2;33285:11;;;;;;:::i;:::-;;;;;33328:1;33319:5;:10;33064:288;33315:21;33064:288;33373:6;33366:13;;;;;32682:716;;;:::o;40459:157::-;40544:4;40583:25;40568:40;;;:11;:40;;;;40561:47;;40459:157;;;:::o;74646:485::-;74748:27;74777:23;74818:38;74859:15;:24;74875:7;74859:24;;;;;;;;;;;74818:65;;75036:18;75013:41;;75093:19;75087:26;75068:45;;74998:126;74646:485;;;:::o;73874:659::-;74023:11;74188:16;74181:5;74177:28;74168:37;;74348:16;74337:9;74333:32;74320:45;;74498:15;74487:9;74484:30;74476:5;74465:9;74462:20;74459:56;74449:66;;73874:659;;;;;:::o;81239:159::-;;;;;:::o;96465:311::-;96600:7;96620:16;57248:3;96646:19;:41;;96620:68;;57248:3;96714:31;96725:4;96731:2;96735:9;96714:10;:31::i;:::-;96706:40;;:62;;96699:69;;;96465:311;;;;;:::o;70425:450::-;70505:14;70673:16;70666:5;70662:28;70653:37;;70850:5;70836:11;70811:23;70807:41;70804:52;70797:5;70794:63;70784:73;;70425:450;;;;:::o;82063:158::-;;;;;:::o;35763:98::-;35816:7;35843:10;35836:17;;35763:98;:::o;70977:324::-;71047:14;71280:1;71270:8;71267:15;71241:24;71237:46;71227:56;;70977:324;;;:::o;82661:691::-;82824:4;82870:2;82845:45;;;82891:19;:17;:19::i;:::-;82912:4;82918:7;82927:5;82845:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;82841:504;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83145:1;83128:6;:13;:18;83124:115;;83167:56;83175:47;;;83167:7;:56::i;:::-;83124:115;83311:6;83305:13;83296:6;83292:2;83288:15;83281:38;82841:504;83014:54;;;83004:64;;;:6;:64;;;;82997:71;;;82661:691;;;;;;:::o;29546:922::-;29599:7;29619:14;29636:1;29619:18;;29686:6;29677:5;:15;29673:102;;29722:6;29713:15;;;;;;:::i;:::-;;;;;29757:2;29747:12;;;;29673:102;29802:6;29793:5;:15;29789:102;;29838:6;29829:15;;;;;;:::i;:::-;;;;;29873:2;29863:12;;;;29789:102;29918:6;29909:5;:15;29905:102;;29954:6;29945:15;;;;;;:::i;:::-;;;;;29989:2;29979:12;;;;29905:102;30034:5;30025;:14;30021:99;;30069:5;30060:14;;;;;;:::i;:::-;;;;;30103:1;30093:11;;;;30021:99;30147:5;30138;:14;30134:99;;30182:5;30173:14;;;;;;:::i;:::-;;;;;30216:1;30206:11;;;;30134:99;30260:5;30251;:14;30247:99;;30295:5;30286:14;;;;;;:::i;:::-;;;;;30329:1;30319:11;;;;30247:99;30373:5;30364;:14;30360:66;;30409:1;30399:11;;;;30360:66;30454:6;30447:13;;;29546:922;;;:::o;96166:147::-;96303:6;96166:147;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:329::-;5301:6;5350:2;5338:9;5329:7;5325:23;5321:32;5318:119;;;5356:79;;:::i;:::-;5318:119;5476:1;5501:53;5546:7;5537:6;5526:9;5522:22;5501:53;:::i;:::-;5491:63;;5447:117;5242:329;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:474::-;6270:6;6278;6327:2;6315:9;6306:7;6302:23;6298:32;6295:119;;;6333:79;;:::i;:::-;6295:119;6453:1;6478:53;6523:7;6514:6;6503:9;6499:22;6478:53;:::i;:::-;6468:63;;6424:117;6580:2;6606:53;6651:7;6642:6;6631:9;6627:22;6606:53;:::i;:::-;6596:63;;6551:118;6202:474;;;;;:::o;6682:332::-;6803:4;6841:2;6830:9;6826:18;6818:26;;6854:71;6922:1;6911:9;6907:17;6898:6;6854:71;:::i;:::-;6935:72;7003:2;6992:9;6988:18;6979:6;6935:72;:::i;:::-;6682:332;;;;;:::o;7020:60::-;7048:3;7069:5;7062:12;;7020:60;;;:::o;7086:142::-;7136:9;7169:53;7187:34;7196:24;7214:5;7196:24;:::i;:::-;7187:34;:::i;:::-;7169:53;:::i;:::-;7156:66;;7086:142;;;:::o;7234:126::-;7284:9;7317:37;7348:5;7317:37;:::i;:::-;7304:50;;7234:126;;;:::o;7366:157::-;7447:9;7480:37;7511:5;7480:37;:::i;:::-;7467:50;;7366:157;;;:::o;7529:193::-;7647:68;7709:5;7647:68;:::i;:::-;7642:3;7635:81;7529:193;;:::o;7728:284::-;7852:4;7890:2;7879:9;7875:18;7867:26;;7903:102;8002:1;7991:9;7987:17;7978:6;7903:102;:::i;:::-;7728:284;;;;:::o;8018:117::-;8127:1;8124;8117:12;8141:117;8250:1;8247;8240:12;8264:117;8373:1;8370;8363:12;8404:568;8477:8;8487:6;8537:3;8530:4;8522:6;8518:17;8514:27;8504:122;;8545:79;;:::i;:::-;8504:122;8658:6;8645:20;8635:30;;8688:18;8680:6;8677:30;8674:117;;;8710:79;;:::i;:::-;8674:117;8824:4;8816:6;8812:17;8800:29;;8878:3;8870:4;8862:6;8858:17;8848:8;8844:32;8841:41;8838:128;;;8885:79;;:::i;:::-;8838:128;8404:568;;;;;:::o;8978:559::-;9064:6;9072;9121:2;9109:9;9100:7;9096:23;9092:32;9089:119;;;9127:79;;:::i;:::-;9089:119;9275:1;9264:9;9260:17;9247:31;9305:18;9297:6;9294:30;9291:117;;;9327:79;;:::i;:::-;9291:117;9440:80;9512:7;9503:6;9492:9;9488:22;9440:80;:::i;:::-;9422:98;;;;9218:312;8978:559;;;;;:::o;9543:474::-;9611:6;9619;9668:2;9656:9;9647:7;9643:23;9639:32;9636:119;;;9674:79;;:::i;:::-;9636:119;9794:1;9819:53;9864:7;9855:6;9844:9;9840:22;9819:53;:::i;:::-;9809:63;;9765:117;9921:2;9947:53;9992:7;9983:6;9972:9;9968:22;9947:53;:::i;:::-;9937:63;;9892:118;9543:474;;;;;:::o;10023:332::-;10144:4;10182:2;10171:9;10167:18;10159:26;;10195:71;10263:1;10252:9;10248:17;10239:6;10195:71;:::i;:::-;10276:72;10344:2;10333:9;10329:18;10320:6;10276:72;:::i;:::-;10023:332;;;;;:::o;10361:116::-;10431:21;10446:5;10431:21;:::i;:::-;10424:5;10421:32;10411:60;;10467:1;10464;10457:12;10411:60;10361:116;:::o;10483:133::-;10526:5;10564:6;10551:20;10542:29;;10580:30;10604:5;10580:30;:::i;:::-;10483:133;;;;:::o;10622:468::-;10687:6;10695;10744:2;10732:9;10723:7;10719:23;10715:32;10712:119;;;10750:79;;:::i;:::-;10712:119;10870:1;10895:53;10940:7;10931:6;10920:9;10916:22;10895:53;:::i;:::-;10885:63;;10841:117;10997:2;11023:50;11065:7;11056:6;11045:9;11041:22;11023:50;:::i;:::-;11013:60;;10968:115;10622:468;;;;;:::o;11096:117::-;11205:1;11202;11195:12;11219:180;11267:77;11264:1;11257:88;11364:4;11361:1;11354:15;11388:4;11385:1;11378:15;11405:281;11488:27;11510:4;11488:27;:::i;:::-;11480:6;11476:40;11618:6;11606:10;11603:22;11582:18;11570:10;11567:34;11564:62;11561:88;;;11629:18;;:::i;:::-;11561:88;11669:10;11665:2;11658:22;11448:238;11405:281;;:::o;11692:129::-;11726:6;11753:20;;:::i;:::-;11743:30;;11782:33;11810:4;11802:6;11782:33;:::i;:::-;11692:129;;;:::o;11827:307::-;11888:4;11978:18;11970:6;11967:30;11964:56;;;12000:18;;:::i;:::-;11964:56;12038:29;12060:6;12038:29;:::i;:::-;12030:37;;12122:4;12116;12112:15;12104:23;;11827:307;;;:::o;12140:146::-;12237:6;12232:3;12227;12214:30;12278:1;12269:6;12264:3;12260:16;12253:27;12140:146;;;:::o;12292:423::-;12369:5;12394:65;12410:48;12451:6;12410:48;:::i;:::-;12394:65;:::i;:::-;12385:74;;12482:6;12475:5;12468:21;12520:4;12513:5;12509:16;12558:3;12549:6;12544:3;12540:16;12537:25;12534:112;;;12565:79;;:::i;:::-;12534:112;12655:54;12702:6;12697:3;12692;12655:54;:::i;:::-;12375:340;12292:423;;;;;:::o;12734:338::-;12789:5;12838:3;12831:4;12823:6;12819:17;12815:27;12805:122;;12846:79;;:::i;:::-;12805:122;12963:6;12950:20;12988:78;13062:3;13054:6;13047:4;13039:6;13035:17;12988:78;:::i;:::-;12979:87;;12795:277;12734:338;;;;:::o;13078:943::-;13173:6;13181;13189;13197;13246:3;13234:9;13225:7;13221:23;13217:33;13214:120;;;13253:79;;:::i;:::-;13214:120;13373:1;13398:53;13443:7;13434:6;13423:9;13419:22;13398:53;:::i;:::-;13388:63;;13344:117;13500:2;13526:53;13571:7;13562:6;13551:9;13547:22;13526:53;:::i;:::-;13516:63;;13471:118;13628:2;13654:53;13699:7;13690:6;13679:9;13675:22;13654:53;:::i;:::-;13644:63;;13599:118;13784:2;13773:9;13769:18;13756:32;13815:18;13807:6;13804:30;13801:117;;;13837:79;;:::i;:::-;13801:117;13942:62;13996:7;13987:6;13976:9;13972:22;13942:62;:::i;:::-;13932:72;;13727:287;13078:943;;;;;;;:::o;14027:474::-;14095:6;14103;14152:2;14140:9;14131:7;14127:23;14123:32;14120:119;;;14158:79;;:::i;:::-;14120:119;14278:1;14303:53;14348:7;14339:6;14328:9;14324:22;14303:53;:::i;:::-;14293:63;;14249:117;14405:2;14431:53;14476:7;14467:6;14456:9;14452:22;14431:53;:::i;:::-;14421:63;;14376:118;14027:474;;;;;:::o;14507:180::-;14555:77;14552:1;14545:88;14652:4;14649:1;14642:15;14676:4;14673:1;14666:15;14693:320;14737:6;14774:1;14768:4;14764:12;14754:22;;14821:1;14815:4;14811:12;14842:18;14832:81;;14898:4;14890:6;14886:17;14876:27;;14832:81;14960:2;14952:6;14949:14;14929:18;14926:38;14923:84;;14979:18;;:::i;:::-;14923:84;14744:269;14693:320;;;:::o;15019:180::-;15067:77;15064:1;15057:88;15164:4;15161:1;15154:15;15188:4;15185:1;15178:15;15205:410;15245:7;15268:20;15286:1;15268:20;:::i;:::-;15263:25;;15302:20;15320:1;15302:20;:::i;:::-;15297:25;;15357:1;15354;15350:9;15379:30;15397:11;15379:30;:::i;:::-;15368:41;;15558:1;15549:7;15545:15;15542:1;15539:22;15519:1;15512:9;15492:83;15469:139;;15588:18;;:::i;:::-;15469:139;15253:362;15205:410;;;;:::o;15621:180::-;15669:77;15666:1;15659:88;15766:4;15763:1;15756:15;15790:4;15787:1;15780:15;15807:185;15847:1;15864:20;15882:1;15864:20;:::i;:::-;15859:25;;15898:20;15916:1;15898:20;:::i;:::-;15893:25;;15937:1;15927:35;;15942:18;;:::i;:::-;15927:35;15984:1;15981;15977:9;15972:14;;15807:185;;;;:::o;15998:191::-;16038:3;16057:20;16075:1;16057:20;:::i;:::-;16052:25;;16091:20;16109:1;16091:20;:::i;:::-;16086:25;;16134:1;16131;16127:9;16120:16;;16155:3;16152:1;16149:10;16146:36;;;16162:18;;:::i;:::-;16146:36;15998:191;;;;:::o;16195:180::-;16243:77;16240:1;16233:88;16340:4;16337:1;16330:15;16364:4;16361:1;16354:15;16381:233;16420:3;16443:24;16461:5;16443:24;:::i;:::-;16434:33;;16489:66;16482:5;16479:77;16476:103;;16559:18;;:::i;:::-;16476:103;16606:1;16599:5;16595:13;16588:20;;16381:233;;;:::o;16620:194::-;16660:4;16680:20;16698:1;16680:20;:::i;:::-;16675:25;;16714:20;16732:1;16714:20;:::i;:::-;16709:25;;16758:1;16755;16751:9;16743:17;;16782:1;16776:4;16773:11;16770:37;;;16787:18;;:::i;:::-;16770:37;16620:194;;;;:::o;16820:168::-;16960:20;16956:1;16948:6;16944:14;16937:44;16820:168;:::o;16994:366::-;17136:3;17157:67;17221:2;17216:3;17157:67;:::i;:::-;17150:74;;17233:93;17322:3;17233:93;:::i;:::-;17351:2;17346:3;17342:12;17335:19;;16994:366;;;:::o;17366:419::-;17532:4;17570:2;17559:9;17555:18;17547:26;;17619:9;17613:4;17609:20;17605:1;17594:9;17590:17;17583:47;17647:131;17773:4;17647:131;:::i;:::-;17639:139;;17366:419;;;:::o;17791:170::-;17931:22;17927:1;17919:6;17915:14;17908:46;17791:170;:::o;17967:366::-;18109:3;18130:67;18194:2;18189:3;18130:67;:::i;:::-;18123:74;;18206:93;18295:3;18206:93;:::i;:::-;18324:2;18319:3;18315:12;18308:19;;17967:366;;;:::o;18339:419::-;18505:4;18543:2;18532:9;18528:18;18520:26;;18592:9;18586:4;18582:20;18578:1;18567:9;18563:17;18556:47;18620:131;18746:4;18620:131;:::i;:::-;18612:139;;18339:419;;;:::o;18764:166::-;18904:18;18900:1;18892:6;18888:14;18881:42;18764:166;:::o;18936:366::-;19078:3;19099:67;19163:2;19158:3;19099:67;:::i;:::-;19092:74;;19175:93;19264:3;19175:93;:::i;:::-;19293:2;19288:3;19284:12;19277:19;;18936:366;;;:::o;19308:419::-;19474:4;19512:2;19501:9;19497:18;19489:26;;19561:9;19555:4;19551:20;19547:1;19536:9;19532:17;19525:47;19589:131;19715:4;19589:131;:::i;:::-;19581:139;;19308:419;;;:::o;19733:180::-;19873:32;19869:1;19861:6;19857:14;19850:56;19733:180;:::o;19919:366::-;20061:3;20082:67;20146:2;20141:3;20082:67;:::i;:::-;20075:74;;20158:93;20247:3;20158:93;:::i;:::-;20276:2;20271:3;20267:12;20260:19;;19919:366;;;:::o;20291:419::-;20457:4;20495:2;20484:9;20480:18;20472:26;;20544:9;20538:4;20534:20;20530:1;20519:9;20515:17;20508:47;20572:131;20698:4;20572:131;:::i;:::-;20564:139;;20291:419;;;:::o;20716:177::-;20856:29;20852:1;20844:6;20840:14;20833:53;20716:177;:::o;20899:366::-;21041:3;21062:67;21126:2;21121:3;21062:67;:::i;:::-;21055:74;;21138:93;21227:3;21138:93;:::i;:::-;21256:2;21251:3;21247:12;21240:19;;20899:366;;;:::o;21271:419::-;21437:4;21475:2;21464:9;21460:18;21452:26;;21524:9;21518:4;21514:20;21510:1;21499:9;21495:17;21488:47;21552:131;21678:4;21552:131;:::i;:::-;21544:139;;21271:419;;;:::o;21696:180::-;21836:32;21832:1;21824:6;21820:14;21813:56;21696:180;:::o;21882:366::-;22024:3;22045:67;22109:2;22104:3;22045:67;:::i;:::-;22038:74;;22121:93;22210:3;22121:93;:::i;:::-;22239:2;22234:3;22230:12;22223:19;;21882:366;;;:::o;22254:419::-;22420:4;22458:2;22447:9;22443:18;22435:26;;22507:9;22501:4;22497:20;22493:1;22482:9;22478:17;22471:47;22535:131;22661:4;22535:131;:::i;:::-;22527:139;;22254:419;;;:::o;22679:171::-;22819:23;22815:1;22807:6;22803:14;22796:47;22679:171;:::o;22856:366::-;22998:3;23019:67;23083:2;23078:3;23019:67;:::i;:::-;23012:74;;23095:93;23184:3;23095:93;:::i;:::-;23213:2;23208:3;23204:12;23197:19;;22856:366;;;:::o;23228:419::-;23394:4;23432:2;23421:9;23417:18;23409:26;;23481:9;23475:4;23471:20;23467:1;23456:9;23452:17;23445:47;23509:131;23635:4;23509:131;:::i;:::-;23501:139;;23228:419;;;:::o;23653:148::-;23755:11;23792:3;23777:18;;23653:148;;;;:::o;23807:390::-;23913:3;23941:39;23974:5;23941:39;:::i;:::-;23996:89;24078:6;24073:3;23996:89;:::i;:::-;23989:96;;24094:65;24152:6;24147:3;24140:4;24133:5;24129:16;24094:65;:::i;:::-;24184:6;24179:3;24175:16;24168:23;;23917:280;23807:390;;;;:::o;24203:595::-;24431:3;24453:95;24544:3;24535:6;24453:95;:::i;:::-;24446:102;;24565:95;24656:3;24647:6;24565:95;:::i;:::-;24558:102;;24677:95;24768:3;24759:6;24677:95;:::i;:::-;24670:102;;24789:3;24782:10;;24203:595;;;;;;:::o;24804:225::-;24944:34;24940:1;24932:6;24928:14;24921:58;25013:8;25008:2;25000:6;24996:15;24989:33;24804:225;:::o;25035:366::-;25177:3;25198:67;25262:2;25257:3;25198:67;:::i;:::-;25191:74;;25274:93;25363:3;25274:93;:::i;:::-;25392:2;25387:3;25383:12;25376:19;;25035:366;;;:::o;25407:419::-;25573:4;25611:2;25600:9;25596:18;25588:26;;25660:9;25654:4;25650:20;25646:1;25635:9;25631:17;25624:47;25688:131;25814:4;25688:131;:::i;:::-;25680:139;;25407:419;;;:::o;25832:171::-;25871:3;25894:24;25912:5;25894:24;:::i;:::-;25885:33;;25940:4;25933:5;25930:15;25927:41;;25948:18;;:::i;:::-;25927:41;25995:1;25988:5;25984:13;25977:20;;25832:171;;;:::o;26009:332::-;26130:4;26168:2;26157:9;26153:18;26145:26;;26181:71;26249:1;26238:9;26234:17;26225:6;26181:71;:::i;:::-;26262:72;26330:2;26319:9;26315:18;26306:6;26262:72;:::i;:::-;26009:332;;;;;:::o;26347:137::-;26401:5;26432:6;26426:13;26417:22;;26448:30;26472:5;26448:30;:::i;:::-;26347:137;;;;:::o;26490:345::-;26557:6;26606:2;26594:9;26585:7;26581:23;26577:32;26574:119;;;26612:79;;:::i;:::-;26574:119;26732:1;26757:61;26810:7;26801:6;26790:9;26786:22;26757:61;:::i;:::-;26747:71;;26703:125;26490:345;;;;:::o;26841:182::-;26981:34;26977:1;26969:6;26965:14;26958:58;26841:182;:::o;27029:366::-;27171:3;27192:67;27256:2;27251:3;27192:67;:::i;:::-;27185:74;;27268:93;27357:3;27268:93;:::i;:::-;27386:2;27381:3;27377:12;27370:19;;27029:366;;;:::o;27401:419::-;27567:4;27605:2;27594:9;27590:18;27582:26;;27654:9;27648:4;27644:20;27640:1;27629:9;27625:17;27618:47;27682:131;27808:4;27682:131;:::i;:::-;27674:139;;27401:419;;;:::o;27826:98::-;27877:6;27911:5;27905:12;27895:22;;27826:98;;;:::o;27930:168::-;28013:11;28047:6;28042:3;28035:19;28087:4;28082:3;28078:14;28063:29;;27930:168;;;;:::o;28104:373::-;28190:3;28218:38;28250:5;28218:38;:::i;:::-;28272:70;28335:6;28330:3;28272:70;:::i;:::-;28265:77;;28351:65;28409:6;28404:3;28397:4;28390:5;28386:16;28351:65;:::i;:::-;28441:29;28463:6;28441:29;:::i;:::-;28436:3;28432:39;28425:46;;28194:283;28104:373;;;;:::o;28483:640::-;28678:4;28716:3;28705:9;28701:19;28693:27;;28730:71;28798:1;28787:9;28783:17;28774:6;28730:71;:::i;:::-;28811:72;28879:2;28868:9;28864:18;28855:6;28811:72;:::i;:::-;28893;28961:2;28950:9;28946:18;28937:6;28893:72;:::i;:::-;29012:9;29006:4;29002:20;28997:2;28986:9;28982:18;28975:48;29040:76;29111:4;29102:6;29040:76;:::i;:::-;29032:84;;28483:640;;;;;;;:::o;29129:141::-;29185:5;29216:6;29210:13;29201:22;;29232:32;29258:5;29232:32;:::i;:::-;29129:141;;;;:::o;29276:349::-;29345:6;29394:2;29382:9;29373:7;29369:23;29365:32;29362:119;;;29400:79;;:::i;:::-;29362:119;29520:1;29545:63;29600:7;29591:6;29580:9;29576:22;29545:63;:::i;:::-;29535:73;;29491:127;29276:349;;;;:::o

Swarm Source

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