Token MicroMigos

 

Overview [ERC-721]

Max Total Supply:
20,000 MICROMIGOS

Holders:
7,067

Transfers:
-

Contract:
0x2a20fbcf095eb347eda8c107bc3ddff165e0f22b0x2a20FbCf095eb347edA8C107Bc3ddFF165E0f22b

Social Profiles:
Not Available, Update ?

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MicroMigos

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at basescan.org on 2024-04-14
*/

// File: @openzeppelin/contracts/utils/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // Any calls to nonReentrant after this point will fail
        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.20;

/**
 * @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 v5.0.0) (utils/math/Math.sol)

pragma solidity ^0.8.20;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Muldiv operation overflow.
     */
    error MathOverflowedMulDiv();

    enum Rounding {
        Floor, // Toward negative infinity
        Ceil, // Toward positive infinity
        Trunc, // Toward zero
        Expand // Away from zero
    }

    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     */
    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.
     */
    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.
     */
    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.
     */
    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.
     */
    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 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 towards infinity instead
     * of rounding towards zero.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        if (b == 0) {
            // Guarantee the same behavior as in a regular Solidity division.
            return a / b;
        }

        // (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 = x * y; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

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

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            if (denominator <= prod1) {
                revert MathOverflowedMulDiv();
            }

            ///////////////////////////////////////////////
            // 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.

            uint256 twos = denominator & (0 - denominator);
            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 (unsignedRoundsUp(rounding) && 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
     * towards zero.
     *
     * 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 + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2 of a positive value rounded towards zero.
     * 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 + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10 of a positive value rounded towards zero.
     * 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 + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
        }
    }

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

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

    /**
     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
     */
    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
        return uint8(rounding) % 2 == 1;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)

pragma solidity ^0.8.20;



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

    /**
     * @dev The `value` string doesn't fit in the specified `length`.
     */
    error StringsInsufficientHexLength(uint256 value, uint256 length);

    /**
     * @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), HEX_DIGITS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toStringSigned(int256 value) internal pure returns (string memory) {
        return string.concat(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) {
        uint256 localValue = value;
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = HEX_DIGITS[localValue & 0xf];
            localValue >>= 4;
        }
        if (localValue != 0) {
            revert StringsInsufficientHexLength(value, length);
        }
        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 bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.20;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the Merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates Merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     *@dev The multiproof provided is not valid.
     */
    error MerkleProofInvalidMultiproof();

    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

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

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

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

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

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

        // Check proof validity.
        if (leavesLen + proofLen != totalHashes + 1) {
            revert MerkleProofInvalidMultiproof();
        }

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

        if (totalHashes > 0) {
            if (proofPos != proofLen) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

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

        // Check proof validity.
        if (leavesLen + proofLen != totalHashes + 1) {
            revert MerkleProofInvalidMultiproof();
        }

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

        if (totalHashes > 0) {
            if (proofPos != proofLen) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Sorts the pair (a, b) and hashes the result.
     */
    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    /**
     * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory.
     */
    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @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 v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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: 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: 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();
        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();

        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 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) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // 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, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @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.
     * 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) public payable virtual override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

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

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

        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) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

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

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

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

        if (to == address(0)) revert TransferToZeroAddress();

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

        emit Transfer(from, to, tokenId);
        _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();
            }
    }

    /**
     * @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();
            } else {
                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();

        _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:
            // - `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)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // 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`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _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();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _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();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

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

    // =============================================================
    //                        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();
        }

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

// File: erc721a/contracts/extensions/IERC721AQueryable.sol


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

pragma solidity ^0.8.4;


/**
 * @dev Interface of ERC721AQueryable.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

// File: erc721a/contracts/extensions/ERC721AQueryable.sol


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

pragma solidity ^0.8.4;



/**
 * @title ERC721AQueryable.
 *
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] calldata tokenIds)
        external
        view
        virtual
        override
        returns (TokenOwnership[] memory)
    {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view virtual override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

// File: contracts/MicroMigosDelegateV2.sol



pragma solidity >=0.8.9 <0.9.0;

/*



███╗   ███╗██╗ ██████╗██████╗  ██████╗ ███╗   ███╗██╗ ██████╗  ██████╗ ███████╗
████╗ ████║██║██╔════╝██╔══██╗██╔═══██╗████╗ ████║██║██╔════╝ ██╔═══██╗██╔════╝
██╔████╔██║██║██║     ██████╔╝██║   ██║██╔████╔██║██║██║  ███╗██║   ██║███████╗
██║╚██╔╝██║██║██║     ██╔══██╗██║   ██║██║╚██╔╝██║██║██║   ██║██║   ██║╚════██║
██║ ╚═╝ ██║██║╚██████╗██║  ██║╚██████╔╝██║ ╚═╝ ██║██║╚██████╔╝╚██████╔╝███████║
╚═╝     ╚═╝╚═╝ ╚═════╝╚═╝  ╚═╝ ╚═════╝ ╚═╝     ╚═╝╚═╝ ╚═════╝  ╚═════╝ ╚══════╝



*/






interface IDelegationRegistryV1 {
    function checkDelegateForAll(
        address delegate,
        address vault
    ) external view returns (bool);
}

interface IDelegationRegistryV2 {
    function checkDelegateForAll(
        address delegate,
        address vault,
        bytes32 rules
    ) external view returns (bool);
}

contract MicroMigos is ERC721AQueryable, ReentrancyGuard, Ownable(msg.sender) {
    using Strings for uint256;
    address private constant _DELEGATION_REGISTRY_V1 = 0x00000000000076A84feF008CDAbe6409d2FE638B;
    address private constant _DELEGATION_REGISTRY_V2 = 0x00000000000000447e69651d841bD8D104Bed493;
    bytes32 public merkleRoot;
    mapping(address => uint256) public freeMintsByAddress;
    mapping(address => uint256) public freePublicMintsByAddress;
    mapping(address => uint256) public mintedAmountByAddress;
    string public uriPrefix = "";
    string public uriSuffix = ".json";
    string public hiddenMetadataUri;
    uint256 public maxFreeAmountPerAddress;
    uint256 public maxFreePublicAmountPerAddress;
    uint256 public maxMintAmountPerAddress;
    uint256 public maxSupply;
    uint256 public cost;
    bool public paused = true;
    bool public whitelistMintEnabled = false;
    bool public revealed = false;

    constructor(
        string memory _tokenName,
        string memory _tokenSymbol,
        uint256 _cost,
        uint256 _maxSupply,
        uint256 _maxFreeAmountPerAddress,
        uint256 _maxFreePublicAmountPerAddress,
        uint256 _maxMintAmountPerAddress,
        string memory _hiddenMetadataUri
    ) ERC721A(_tokenName, _tokenSymbol) {
        setCost(_cost);
        maxSupply = _maxSupply;
        setMaxFreeAmountPerAddress(_maxFreeAmountPerAddress);
        setMaxFreePublicAmountPerAddress(_maxFreePublicAmountPerAddress);
        setMaxMintAmountPerAddress(_maxMintAmountPerAddress);
        setHiddenMetadataUri(_hiddenMetadataUri);
    }

    modifier teamMintCompliance(uint256 _mintAmount) {
        require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
        _;
    }

    function checkDelegationsV1(address _mintForAddress, address _minterAddress) public view returns(bool)  {
        bool isDelegateValid = false;

        if (_mintForAddress != address(0) && _mintForAddress != _minterAddress) {
            if (
                IDelegationRegistryV1(_DELEGATION_REGISTRY_V1)
                .checkDelegateForAll(
                _minterAddress,
                _mintForAddress
            )
            ) {
                isDelegateValid = true;
            }
        }
        return isDelegateValid;
    }

    function checkDelegationsV2(address _mintForAddress, address _minterAddress) public view returns(bool)  {
        bool isDelegateValid = false;

        if (_mintForAddress != address(0) && _mintForAddress != _minterAddress) {
            if (
                IDelegationRegistryV2(_DELEGATION_REGISTRY_V2)
                .checkDelegateForAll(
                _minterAddress,
                _mintForAddress,
                "0x"
            )
            ) {
                isDelegateValid = true;
            }
        }
        return isDelegateValid;
    }

    function checkDelegations(address _mintForAddress, address _minterAddress) public view returns(bool)  {
        bool isDelegateValid = false;

        if (_mintForAddress != address(0) && _mintForAddress != _minterAddress) {
            if (
                checkDelegationsV1(_mintForAddress , _minterAddress)
                || checkDelegationsV2(_mintForAddress , _minterAddress)
            ) {
                isDelegateValid = true;
            }
        }
        return isDelegateValid;
    }

    modifier mintCompliance(address _mintForAddress, uint256 _mintAmount) {
        require(tx.origin == msg.sender, 'No Contract Minting!');
        require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
        address minter = checkDelegations(_mintForAddress, msg.sender) ? _mintForAddress : msg.sender;
        require(_mintAmount > 0 && mintedAmountByAddress[minter] + _mintAmount <= maxMintAmountPerAddress, 'Minted max amount for address!');

        _;
    }

    modifier mintPriceComplianceWL(address _mintForAddress, uint256 _mintAmount) {
        uint256 _mintCost = cost * _mintAmount;
        address minter = checkDelegations(_mintForAddress, msg.sender) ? _mintForAddress : msg.sender;
        uint256 _freeMintsRemainingForAddress = maxFreeAmountPerAddress - freeMintsByAddress[minter] > 0 ? maxFreeAmountPerAddress - freeMintsByAddress[minter] : 0;
        uint256 _freeMintsToDiscount = 0;

        if (_freeMintsRemainingForAddress > 0) {
            _freeMintsToDiscount = _freeMintsRemainingForAddress <= _mintAmount ? _freeMintsRemainingForAddress : _mintAmount;
        }

        _mintCost = _mintCost - (_freeMintsToDiscount * cost) ;

        require(msg.value >= _mintCost, 'Insufficient funds!');
        _;
    }

    modifier mintPriceCompliance(address _mintForAddress, uint256 _mintAmount) {
        uint256 _mintCost = cost * _mintAmount;
        address minter = checkDelegations(_mintForAddress, msg.sender) ? _mintForAddress : msg.sender;
        uint256 _freePublicMintsRemainingForAddress = maxFreePublicAmountPerAddress - freePublicMintsByAddress[minter] > 0 ? maxFreePublicAmountPerAddress - freePublicMintsByAddress[minter] : 0;
        uint256 _freeMintsToDiscount = 0;

        if (_freePublicMintsRemainingForAddress > 0) {
            _freeMintsToDiscount = _freePublicMintsRemainingForAddress <= _mintAmount ? _freePublicMintsRemainingForAddress : _mintAmount;
        }

        _mintCost = _mintCost - (_freeMintsToDiscount * cost) ;

        require(msg.value >= _mintCost, 'Insufficient funds!');
        _;
    }

    function updateFreeMintsByAddress(address _minterForAddress, uint256 _mintAmount) private {
        uint256 freeMints = _mintAmount <= maxFreeAmountPerAddress - freeMintsByAddress[_minterForAddress] ?
            _mintAmount :
            maxFreeAmountPerAddress - freeMintsByAddress[_minterForAddress];

        if (freeMints > 0) {
            freeMintsByAddress[_minterForAddress] += freeMints;
        }
    }

    function updateFreePublicMintsByAddress(address _minterForAddress, uint256 _mintAmount) private {
        uint256 freeMints = _mintAmount <= maxFreePublicAmountPerAddress - freePublicMintsByAddress[_minterForAddress] ?
            _mintAmount :
            maxFreePublicAmountPerAddress - freePublicMintsByAddress[_minterForAddress];

        if (freeMints > 0) {
            freePublicMintsByAddress[_minterForAddress] += freeMints;
        }
    }

    function whitelistMint(address _mintForAddress, uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable mintCompliance(_mintForAddress, _mintAmount) mintPriceComplianceWL(_mintForAddress, _mintAmount) nonReentrant {
        require(whitelistMintEnabled, 'The whitelist sale is not enabled!');
        address minter = checkDelegations(_mintForAddress, msg.sender) ? _mintForAddress : msg.sender;

        bytes32 leaf = keccak256(abi.encodePacked(minter));
        require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Invalid proof!');

        updateFreeMintsByAddress(minter, _mintAmount);
        mintedAmountByAddress[minter] += _mintAmount;

        _safeMint(msg.sender, _mintAmount);
    }

    function mint(address _mintForAddress, uint256 _mintAmount) public payable mintCompliance(_mintForAddress, _mintAmount) mintPriceCompliance(_mintForAddress, _mintAmount) nonReentrant {
        require(!paused, 'The contract is paused!');
        address minter = checkDelegations(_mintForAddress, msg.sender) ? _mintForAddress : msg.sender;

        updateFreePublicMintsByAddress(minter, _mintAmount);
        mintedAmountByAddress[minter] += _mintAmount;

        _safeMint(msg.sender, _mintAmount);
    }

    function setMaxFreeAmountPerAddress(uint256 _maxFreeAmountPerAddress) public onlyOwner {
        maxFreeAmountPerAddress = _maxFreeAmountPerAddress;
    }

    function setMaxFreePublicAmountPerAddress(uint256 _maxFreePublicAmountPerAddress) public onlyOwner {
        maxFreePublicAmountPerAddress = _maxFreePublicAmountPerAddress;
    }

    function setMaxMintAmountPerAddress(uint256 _maxMintAmountPerAddress) public onlyOwner {
        maxMintAmountPerAddress = _maxMintAmountPerAddress;
    }

    function mintForAddress(uint256 _mintAmount, address _receiver) public teamMintCompliance(_mintAmount) onlyOwner {
        _safeMint(_receiver, _mintAmount);
    }

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

    function tokenURI(uint256 _tokenId) public view virtual override(ERC721A, IERC721A) returns (string memory) {
        require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');

        if (revealed == false) {
            return hiddenMetadataUri;
        }

        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
            : '';
    }

    function setMaxSupply(uint256 _maxSupply) public onlyOwner {
        maxSupply = _maxSupply;
    }

    function setRevealed(bool _state) public onlyOwner {
        revealed = _state;
    }

    function setCost(uint256 _cost) public onlyOwner {
        cost = _cost;
    }

    function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
        hiddenMetadataUri = _hiddenMetadataUri;
    }

    function setUriPrefix(string memory _uriPrefix) public onlyOwner {
        uriPrefix = _uriPrefix;
    }

    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }

    function setPaused(bool _state) public onlyOwner {
        paused = _state;
    }

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

    function setWhitelistMintEnabled(bool _state) public onlyOwner {
        whitelistMintEnabled = _state;
    }

    function withdraw() public onlyOwner nonReentrant {
        (bool os, ) = payable(owner()).call{value: address(this).balance}('');
        require(os);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_maxFreeAmountPerAddress","type":"uint256"},{"internalType":"uint256","name":"_maxFreePublicAmountPerAddress","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerAddress","type":"uint256"},{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","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":[{"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":[{"internalType":"address","name":"_mintForAddress","type":"address"},{"internalType":"address","name":"_minterAddress","type":"address"}],"name":"checkDelegations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_mintForAddress","type":"address"},{"internalType":"address","name":"_minterAddress","type":"address"}],"name":"checkDelegationsV1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_mintForAddress","type":"address"},{"internalType":"address","name":"_minterAddress","type":"address"}],"name":"checkDelegationsV2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintsByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freePublicMintsByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeAmountPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreePublicAmountPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_mintForAddress","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedAmountByAddress","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFreeAmountPerAddress","type":"uint256"}],"name":"setMaxFreeAmountPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFreePublicAmountPerAddress","type":"uint256"}],"name":"setMaxFreePublicAmountPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerAddress","type":"uint256"}],"name":"setMaxMintAmountPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","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":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_mintForAddress","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052805f815250600e9081610021919061064f565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600f9081610066919061064f565b50600160165f6101000a81548160ff0219169083151502179055505f601660016101000a81548160ff0219169083151502179055505f601660026101000a81548160ff0219169083151502179055503480156100c0575f80fd5b50604051615a72380380615a7283398181016040528101906100e29190610868565b33888881600290816100f4919061064f565b508060039081610104919061064f565b5061011361020160201b60201c565b5f81905550505060016008819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610192575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161018991906109ac565b60405180910390fd5b6101a18161020960201b60201c565b506101b1866102cc60201b60201c565b846014819055506101c7846102e460201b60201c565b6101d6836102fc60201b60201c565b6101e58261031460201b60201c565b6101f48161032c60201b60201c565b50505050505050506109c5565b5f6001905090565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6102da61034d60201b60201c565b8060158190555050565b6102f261034d60201b60201c565b8060118190555050565b61030a61034d60201b60201c565b8060128190555050565b61032261034d60201b60201c565b8060138190555050565b61033a61034d60201b60201c565b8060109081610349919061064f565b5050565b61035b6103e660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1661037f6103ed60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146103e4576103a86103e660201b60201c565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016103db91906109ac565b60405180910390fd5b565b5f33905090565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061049057607f821691505b6020821081036104a3576104a261044c565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026105057fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826104ca565b61050f86836104ca565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61055361054e61054984610527565b610530565b610527565b9050919050565b5f819050919050565b61056c83610539565b6105806105788261055a565b8484546104d6565b825550505050565b5f90565b610594610588565b61059f818484610563565b505050565b5b818110156105c2576105b75f8261058c565b6001810190506105a5565b5050565b601f821115610607576105d8816104a9565b6105e1846104bb565b810160208510156105f0578190505b6106046105fc856104bb565b8301826105a4565b50505b505050565b5f82821c905092915050565b5f6106275f198460080261060c565b1980831691505092915050565b5f61063f8383610618565b9150826002028217905092915050565b61065882610415565b67ffffffffffffffff8111156106715761067061041f565b5b61067b8254610479565b6106868282856105c6565b5f60209050601f8311600181146106b7575f84156106a5578287015190505b6106af8582610634565b865550610716565b601f1984166106c5866104a9565b5f5b828110156106ec578489015182556001820191506020850194506020810190506106c7565b868310156107095784890151610705601f891682610618565b8355505b6001600288020188555050505b505050505050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b61075082610737565b810181811067ffffffffffffffff8211171561076f5761076e61041f565b5b80604052505050565b5f61078161071e565b905061078d8282610747565b919050565b5f67ffffffffffffffff8211156107ac576107ab61041f565b5b6107b582610737565b9050602081019050919050565b8281835e5f83830152505050565b5f6107e26107dd84610792565b610778565b9050828152602081018484840111156107fe576107fd610733565b5b6108098482856107c2565b509392505050565b5f82601f8301126108255761082461072f565b5b81516108358482602086016107d0565b91505092915050565b61084781610527565b8114610851575f80fd5b50565b5f815190506108628161083e565b92915050565b5f805f805f805f80610100898b03121561088557610884610727565b5b5f89015167ffffffffffffffff8111156108a2576108a161072b565b5b6108ae8b828c01610811565b985050602089015167ffffffffffffffff8111156108cf576108ce61072b565b5b6108db8b828c01610811565b97505060406108ec8b828c01610854565b96505060606108fd8b828c01610854565b955050608061090e8b828c01610854565b94505060a061091f8b828c01610854565b93505060c06109308b828c01610854565b92505060e089015167ffffffffffffffff8111156109515761095061072b565b5b61095d8b828c01610811565b9150509295985092959890939650565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6109968261096d565b9050919050565b6109a68161098c565b82525050565b5f6020820190506109bf5f83018461099d565b92915050565b6150a0806109d25f395ff3fe60806040526004361061034f575f3560e01c80635d3155f3116101c5578063a22cb465116100f6578063e0a8085311610094578063e985e9c51161006e578063e985e9c514610c2b578063efbd73f414610c67578063f2fde38b14610c8f578063ff94ac1814610cb75761034f565b8063e0a8085314610b8b578063e40cca5e14610bb3578063e56ee43214610bef5761034f565b8063b88d4fde116100d0578063b88d4fde14610acd578063c23dc68f14610ae9578063c87b56dd14610b25578063d5abeb0114610b615761034f565b8063a22cb46514610a53578063a45ba8e714610a7b578063b767a09814610aa55761034f565b8063715018a6116101635780638462151c1161013d5780638462151c146109875780638da5cb5b146109c357806395d89b41146109ed57806399a2557a14610a175761034f565b8063715018a6146109215780637cb64759146109375780637ec4a6591461095f5761034f565b80636352211e1161019f5780636352211e146108575780636caede3d146108935780636f8b44b0146108bd57806370a08231146108e55761034f565b80635d3155f3146107c75780635f17e265146107f157806362b99ad41461082d5761034f565b80633ccfd60b1161029f5780634fdd43cb1161023d5780635697f53e116102175780635697f53e1461070f5780635bbb2177146107375780635c41d75e146107735780635c975abb1461079d5761034f565b80634fdd43cb1461069357806351830227146106bb5780635503a0e8146106e55761034f565b80634220cda0116102795780634220cda0146105f757806342842e0e1461063357806344a0d68a1461064f5780634b11faaf146106775761034f565b80633ccfd60b1461058957806340c10f191461059f578063418aa6ef146105bb5761034f565b806316ba10e01161030c57806323b872dd116102e657806323b872dd146104df57806328a60112146104fb5780632eb4a7ab14610537578063315dc3f2146105615761034f565b806316ba10e01461046557806316c38b3c1461048d57806318160ddd146104b55761034f565b806301ffc9a71461035357806306fdde031461038f578063081812fc146103b9578063095ea7b3146103f557806312649bf01461041157806313faede61461043b575b5f80fd5b34801561035e575f80fd5b5061037960048036038101906103749190613a75565b610cdf565b6040516103869190613aba565b60405180910390f35b34801561039a575f80fd5b506103a3610d70565b6040516103b09190613b43565b60405180910390f35b3480156103c4575f80fd5b506103df60048036038101906103da9190613b96565b610e00565b6040516103ec9190613c00565b60405180910390f35b61040f600480360381019061040a9190613c43565b610e7a565b005b34801561041c575f80fd5b50610425610fb9565b6040516104329190613c90565b60405180910390f35b348015610446575f80fd5b5061044f610fbf565b60405161045c9190613c90565b60405180910390f35b348015610470575f80fd5b5061048b60048036038101906104869190613dd5565b610fc5565b005b348015610498575f80fd5b506104b360048036038101906104ae9190613e46565b610fe0565b005b3480156104c0575f80fd5b506104c9611004565b6040516104d69190613c90565b60405180910390f35b6104f960048036038101906104f49190613e71565b611019565b005b348015610506575f80fd5b50610521600480360381019061051c9190613ec1565b611327565b60405161052e9190613c90565b60405180910390f35b348015610542575f80fd5b5061054b61133c565b6040516105589190613f04565b60405180910390f35b34801561056c575f80fd5b5061058760048036038101906105829190613b96565b611342565b005b348015610594575f80fd5b5061059d611354565b005b6105b960048036038101906105b49190613c43565b6113e7565b005b3480156105c6575f80fd5b506105e160048036038101906105dc9190613f1d565b611798565b6040516105ee9190613aba565b60405180910390f35b348015610602575f80fd5b5061061d60048036038101906106189190613ec1565b6118a7565b60405161062a9190613c90565b60405180910390f35b61064d60048036038101906106489190613e71565b6118bc565b005b34801561065a575f80fd5b5061067560048036038101906106709190613b96565b6118db565b005b610691600480360381019061068c9190613fb8565b6118ed565b005b34801561069e575f80fd5b506106b960048036038101906106b49190613dd5565b611d57565b005b3480156106c6575f80fd5b506106cf611d72565b6040516106dc9190613aba565b60405180910390f35b3480156106f0575f80fd5b506106f9611d85565b6040516107069190613b43565b60405180910390f35b34801561071a575f80fd5b5061073560048036038101906107309190613b96565b611e11565b005b348015610742575f80fd5b5061075d6004803603810190610758919061407e565b611e23565b60405161076a9190614221565b60405180910390f35b34801561077e575f80fd5b50610787611ee3565b6040516107949190613c90565b60405180910390f35b3480156107a8575f80fd5b506107b1611ee9565b6040516107be9190613aba565b60405180910390f35b3480156107d2575f80fd5b506107db611efb565b6040516107e89190613c90565b60405180910390f35b3480156107fc575f80fd5b5061081760048036038101906108129190613ec1565b611f01565b6040516108249190613c90565b60405180910390f35b348015610838575f80fd5b50610841611f16565b60405161084e9190613b43565b60405180910390f35b348015610862575f80fd5b5061087d60048036038101906108789190613b96565b611fa2565b60405161088a9190613c00565b60405180910390f35b34801561089e575f80fd5b506108a7611fb3565b6040516108b49190613aba565b60405180910390f35b3480156108c8575f80fd5b506108e360048036038101906108de9190613b96565b611fc6565b005b3480156108f0575f80fd5b5061090b60048036038101906109069190613ec1565b611fd8565b6040516109189190613c90565b60405180910390f35b34801561092c575f80fd5b5061093561208d565b005b348015610942575f80fd5b5061095d6004803603810190610958919061426b565b6120a0565b005b34801561096a575f80fd5b5061098560048036038101906109809190613dd5565b6120b2565b005b348015610992575f80fd5b506109ad60048036038101906109a89190613ec1565b6120cd565b6040516109ba919061434d565b60405180910390f35b3480156109ce575f80fd5b506109d7612209565b6040516109e49190613c00565b60405180910390f35b3480156109f8575f80fd5b50610a01612231565b604051610a0e9190613b43565b60405180910390f35b348015610a22575f80fd5b50610a3d6004803603810190610a38919061436d565b6122c1565b604051610a4a919061434d565b60405180910390f35b348015610a5e575f80fd5b50610a796004803603810190610a7491906143bd565b6124c0565b005b348015610a86575f80fd5b50610a8f6125c6565b604051610a9c9190613b43565b60405180910390f35b348015610ab0575f80fd5b50610acb6004803603810190610ac69190613e46565b612652565b005b610ae76004803603810190610ae29190614499565b612677565b005b348015610af4575f80fd5b50610b0f6004803603810190610b0a9190613b96565b6126e9565b604051610b1c919061456c565b60405180910390f35b348015610b30575f80fd5b50610b4b6004803603810190610b469190613b96565b612753565b604051610b589190613b43565b60405180910390f35b348015610b6c575f80fd5b50610b756128a5565b604051610b829190613c90565b60405180910390f35b348015610b96575f80fd5b50610bb16004803603810190610bac9190613e46565b6128ab565b005b348015610bbe575f80fd5b50610bd96004803603810190610bd49190613f1d565b6128d0565b604051610be69190613aba565b60405180910390f35b348015610bfa575f80fd5b50610c156004803603810190610c109190613f1d565b612972565b604051610c229190613aba565b60405180910390f35b348015610c36575f80fd5b50610c516004803603810190610c4c9190613f1d565b612a80565b604051610c5e9190613aba565b60405180910390f35b348015610c72575f80fd5b50610c8d6004803603810190610c889190614585565b612b0e565b005b348015610c9a575f80fd5b50610cb56004803603810190610cb09190613ec1565b612b7d565b005b348015610cc2575f80fd5b50610cdd6004803603810190610cd89190613b96565b612c01565b005b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d3957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d695750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610d7f906145f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610dab906145f0565b8015610df65780601f10610dcd57610100808354040283529160200191610df6565b820191905f5260205f20905b815481529060010190602001808311610dd957829003601f168201915b5050505050905090565b5f610e0a82612c13565b610e40576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610e8482611fa2565b90508073ffffffffffffffffffffffffffffffffffffffff16610ea5612c6d565b73ffffffffffffffffffffffffffffffffffffffff1614610f0857610ed181610ecc612c6d565b612a80565b610f07576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60125481565b60155481565b610fcd612c74565b80600f9081610fdc91906147bd565b5050565b610fe8612c74565b8060165f6101000a81548160ff02191690831515021790555050565b5f61100d612cfb565b6001545f540303905090565b5f61102382612d03565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461108a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8061109584612dc6565b915091506110ab81876110a6612c6d565b612de9565b6110f7576110c0866110bb612c6d565b612a80565b6110f6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361115c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111698686866001612e2c565b8015611173575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81546001019190508190555061123b85611217888887612e32565b7c020000000000000000000000000000000000000000000000000000000017612e59565b60045f8681526020019081526020015f20819055505f7c02000000000000000000000000000000000000000000000000000000008416036112b7575f6001850190505f60045f8381526020019081526020015f2054036112b5575f5481146112b4578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461131f8686866001612e83565b505050505050565b600d602052805f5260405f205f915090505481565b600a5481565b61134a612c74565b8060128190555050565b61135c612c74565b611364612e89565b5f61136d612209565b73ffffffffffffffffffffffffffffffffffffffff1647604051611390906148b9565b5f6040518083038185875af1925050503d805f81146113ca576040519150601f19603f3d011682016040523d82523d5f602084013e6113cf565b606091505b50509050806113dc575f80fd5b506113e5612ecf565b565b81813373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e90614917565b60405180910390fd5b60145481611463611004565b61146d9190614962565b11156114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a5906149df565b60405180910390fd5b5f6114b983336128d0565b6114c357336114c5565b825b90505f82118015611520575060135482600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461151d9190614962565b11155b61155f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155690614a47565b60405180910390fd5b84845f816015546115709190614a65565b90505f61157d84336128d0565b6115875733611589565b835b90505f80600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546012546115d89190614aa6565b116115e3575f61162f565b600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460125461162e9190614aa6565b5b90505f8082111561164d5784821115611648578461164a565b815b90505b6015548161165b9190614a65565b846116669190614aa6565b9350833410156116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a290614b23565b60405180910390fd5b6116b3612e89565b60165f9054906101000a900460ff1615611702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f990614b8b565b60405180910390fd5b5f61170d8c336128d0565b6117175733611719565b8b5b9050611725818c612ed9565b8a600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117719190614962565b92505081905550611782338c612fe1565b5061178b612ecf565b5050505050505050505050565b5f805f90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561180557508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561189d576d76a84fef008cdabe6409d2fe638b73ffffffffffffffffffffffffffffffffffffffff16639c395bc284866040518363ffffffff1660e01b8152600401611853929190614ba9565b602060405180830381865afa15801561186e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118929190614be4565b1561189c57600190505b5b8091505092915050565b600c602052805f5260405f205f915090505481565b6118d683838360405180602001604052805f815250612677565b505050565b6118e3612c74565b8060158190555050565b83833373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195490614917565b60405180910390fd5b60145481611969611004565b6119739190614962565b11156119b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ab906149df565b60405180910390fd5b5f6119bf83336128d0565b6119c957336119cb565b825b90505f82118015611a26575060135482600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611a239190614962565b11155b611a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5c90614a47565b60405180910390fd5b86865f81601554611a769190614a65565b90505f611a8384336128d0565b611a8d5733611a8f565b835b90505f80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054601154611ade9190614aa6565b11611ae9575f611b35565b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054601154611b349190614aa6565b5b90505f80821115611b535784821115611b4e5784611b50565b815b90505b60155481611b619190614a65565b84611b6c9190614aa6565b935083341015611bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba890614b23565b60405180910390fd5b611bb9612e89565b601660019054906101000a900460ff16611c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bff90614c7f565b60405180910390fd5b5f611c138e336128d0565b611c1d5733611c1f565b8d5b90505f81604051602001611c339190614ce2565b604051602081830303815290604052805190602001209050611c988d8d808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050600a5483612ffe565b611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce90614d46565b60405180910390fd5b611ce1828f613014565b8d600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611d2d9190614962565b92505081905550611d3e338f612fe1565b5050611d48612ecf565b50505050505050505050505050565b611d5f612c74565b8060109081611d6e91906147bd565b5050565b601660029054906101000a900460ff1681565b600f8054611d92906145f0565b80601f0160208091040260200160405190810160405280929190818152602001828054611dbe906145f0565b8015611e095780601f10611de057610100808354040283529160200191611e09565b820191905f5260205f20905b815481529060010190602001808311611dec57829003601f168201915b505050505081565b611e19612c74565b8060138190555050565b60605f8383905090505f8167ffffffffffffffff811115611e4757611e46613cb1565b5b604051908082528060200260200182016040528015611e8057816020015b611e6d6139c4565b815260200190600190039081611e655790505b5090505f5b828114611ed757611eae868683818110611ea257611ea1614d64565b5b905060200201356126e9565b828281518110611ec157611ec0614d64565b5b6020026020010181905250806001019050611e85565b50809250505092915050565b60135481565b60165f9054906101000a900460ff1681565b60115481565b600b602052805f5260405f205f915090505481565b600e8054611f23906145f0565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4f906145f0565b8015611f9a5780601f10611f7157610100808354040283529160200191611f9a565b820191905f5260205f20905b815481529060010190602001808311611f7d57829003601f168201915b505050505081565b5f611fac82612d03565b9050919050565b601660019054906101000a900460ff1681565b611fce612c74565b8060148190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361203e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b612095612c74565b61209e5f61311c565b565b6120a8612c74565b80600a8190555050565b6120ba612c74565b80600e90816120c991906147bd565b5050565b60605f805f6120db85611fd8565b90505f8167ffffffffffffffff8111156120f8576120f7613cb1565b5b6040519080825280602002602001820160405280156121265781602001602082028036833780820191505090505b5090506121316139c4565b5f61213a612cfb565b90505b8386146121fb5761214d816131df565b915081604001516121f0575f73ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff161461219557815f015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036121ef57808387806001019850815181106121e2576121e1614d64565b5b6020026020010181815250505b5b80600101905061213d565b508195505050505050919050565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054612240906145f0565b80601f016020809104026020016040519081016040528092919081815260200182805461226c906145f0565b80156122b75780601f1061228e576101008083540402835291602001916122b7565b820191905f5260205f20905b81548152906001019060200180831161229a57829003601f168201915b5050505050905090565b60608183106122fc576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80612306613208565b9050612310612cfb565b8510156123225761231f612cfb565b94505b8084111561232e578093505b5f61233887611fd8565b90508486101561235a575f868603905081811015612354578091505b5061235e565b5f90505b5f8167ffffffffffffffff81111561237957612378613cb1565b5b6040519080825280602002602001820160405280156123a75781602001602082028036833780820191505090505b5090505f82036123bd57809450505050506124b9565b5f6123c7886126e9565b90505f81604001516123da57815f015190505b5f8990505b8881141580156123ef5750848714155b156124ab576123fd816131df565b925082604001516124a0575f73ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff161461244557825f015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361249f578084888060010199508151811061249257612491614d64565b5b6020026020010181815250505b5b8060010190506123df565b508583528296505050505050505b9392505050565b8060075f6124cc612c6d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612575612c6d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125ba9190613aba565b60405180910390a35050565b601080546125d3906145f0565b80601f01602080910402602001604051908101604052809291908181526020018280546125ff906145f0565b801561264a5780601f106126215761010080835404028352916020019161264a565b820191905f5260205f20905b81548152906001019060200180831161262d57829003601f168201915b505050505081565b61265a612c74565b80601660016101000a81548160ff02191690831515021790555050565b612682848484611019565b5f8373ffffffffffffffffffffffffffffffffffffffff163b146126e3576126ac84848484613210565b6126e2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6126f16139c4565b6126f96139c4565b612701612cfb565b8310806127155750612711613208565b8310155b15612723578091505061274e565b61272c836131df565b9050806040015115612741578091505061274e565b61274a8361335b565b9150505b919050565b606061275e82612c13565b61279d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279490614e01565b60405180910390fd5b5f1515601660029054906101000a900460ff1615150361284757601080546127c4906145f0565b80601f01602080910402602001604051908101604052809291908181526020018280546127f0906145f0565b801561283b5780601f106128125761010080835404028352916020019161283b565b820191905f5260205f20905b81548152906001019060200180831161281e57829003601f168201915b505050505090506128a0565b5f61285061337b565b90505f81511161286e5760405180602001604052805f81525061289c565b806128788461340b565b600f60405160200161288c93929190614ed9565b6040516020818303038152906040525b9150505b919050565b60145481565b6128b3612c74565b80601660026101000a81548160ff02191690831515021790555050565b5f805f90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561293d57508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156129685761294c8484611798565b8061295d575061295c8484612972565b5b1561296757600190505b5b8091505092915050565b5f805f90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156129df57508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15612a76576c447e69651d841bd8d104bed49373ffffffffffffffffffffffffffffffffffffffff1663e839bd5384866040518363ffffffff1660e01b8152600401612a2c929190614f2f565b602060405180830381865afa158015612a47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a6b9190614be4565b15612a7557600190505b5b8091505092915050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b8160145481612b1b611004565b612b259190614962565b1115612b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5d906149df565b60405180910390fd5b612b6e612c74565b612b788284612fe1565b505050565b612b85612c74565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612bf5575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612bec9190613c00565b60405180910390fd5b612bfe8161311c565b50565b612c09612c74565b8060118190555050565b5f81612c1d612cfb565b11158015612c2b57505f5482105b8015612c6657505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f33905090565b612c7c6134d5565b73ffffffffffffffffffffffffffffffffffffffff16612c9a612209565b73ffffffffffffffffffffffffffffffffffffffff1614612cf957612cbd6134d5565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401612cf09190613c00565b60405180910390fd5b565b5f6001905090565b5f8082905080612d11612cfb565b11612d8f575f54811015612d8e575f60045f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603612d8c575b5f8103612d825760045f836001900393508381526020019081526020015f20549050612d5b565b8092505050612dc1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8612e488686846134dc565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600260085403612ec5576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600881905550565b6001600881905550565b5f600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054601254612f259190614aa6565b821115612f7c57600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054601254612f779190614aa6565b612f7e565b815b90505f811115612fdc5780600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612fd49190614962565b925050819055505b505050565b612ffa828260405180602001604052805f8152506134e4565b5050565b5f8261300a858461357b565b1490509392505050565b5f600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546011546130609190614aa6565b8211156130b757600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546011546130b29190614aa6565b6130b9565b815b90505f8111156131175780600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461310f9190614962565b925050819055505b505050565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131e76139c4565b61320160045f8481526020019081526020015f20546135c9565b9050919050565b5f8054905090565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613235612c6d565b8786866040518563ffffffff1660e01b81526004016132579493929190614fb4565b6020604051808303815f875af192505050801561329257506040513d601f19601f8201168201806040525081019061328f9190615012565b60015b613308573d805f81146132c0576040519150601f19603f3d011682016040523d82523d5f602084013e6132c5565b606091505b505f815103613300576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6133636139c4565b61337461336f83612d03565b6135c9565b9050919050565b6060600e805461338a906145f0565b80601f01602080910402602001604051908101604052809291908181526020018280546133b6906145f0565b80156134015780601f106133d857610100808354040283529160200191613401565b820191905f5260205f20905b8154815290600101906020018083116133e457829003601f168201915b5050505050905090565b60605f60016134198461367d565b0190505f8167ffffffffffffffff81111561343757613436613cb1565b5b6040519080825280601f01601f1916602001820160405280156134695781602001600182028036833780820191505090505b5090505f82602001820190505b6001156134ca578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816134bf576134be61503d565b5b0494505f8503613476575b819350505050919050565b5f33905090565b5f9392505050565b6134ee83836137ce565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14613576575f805490505f83820390505b61352a5f868380600101945086613210565b613560576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061351857815f5414613573575f80fd5b50505b505050565b5f808290505f5b84518110156135be576135af828683815181106135a2576135a1614d64565b5b6020026020010151613977565b91508080600101915050613582565b508091505092915050565b6135d16139c4565b81815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff16815250505f7c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106136d9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816136cf576136ce61503d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613716576d04ee2d6d415b85acef8100000000838161370c5761370b61503d565b5b0492506020810190505b662386f26fc10000831061374557662386f26fc10000838161373b5761373a61503d565b5b0492506010810190505b6305f5e100831061376e576305f5e10083816137645761376361503d565b5b0492506008810190505b61271083106137935761271083816137895761378861503d565b5b0492506004810190505b606483106137b657606483816137ac576137ab61503d565b5b0492506002810190505b600a83106137c5576001810190505b80915050919050565b5f805490505f820361380c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138185f848385612e2c565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555061388a8361387b5f865f612e32565b613884856139a1565b17612e59565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146139245780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a46001810190506138eb565b505f820361395e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f8190555050506139725f848385612e83565b505050565b5f81831061398e5761398982846139b0565b613999565b61399883836139b0565b5b905092915050565b5f6001821460e11b9050919050565b5f825f528160205260405f20905092915050565b60405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f62ffffff1681525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a5481613a20565b8114613a5e575f80fd5b50565b5f81359050613a6f81613a4b565b92915050565b5f60208284031215613a8a57613a89613a18565b5b5f613a9784828501613a61565b91505092915050565b5f8115159050919050565b613ab481613aa0565b82525050565b5f602082019050613acd5f830184613aab565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f613b1582613ad3565b613b1f8185613add565b9350613b2f818560208601613aed565b613b3881613afb565b840191505092915050565b5f6020820190508181035f830152613b5b8184613b0b565b905092915050565b5f819050919050565b613b7581613b63565b8114613b7f575f80fd5b50565b5f81359050613b9081613b6c565b92915050565b5f60208284031215613bab57613baa613a18565b5b5f613bb884828501613b82565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613bea82613bc1565b9050919050565b613bfa81613be0565b82525050565b5f602082019050613c135f830184613bf1565b92915050565b613c2281613be0565b8114613c2c575f80fd5b50565b5f81359050613c3d81613c19565b92915050565b5f8060408385031215613c5957613c58613a18565b5b5f613c6685828601613c2f565b9250506020613c7785828601613b82565b9150509250929050565b613c8a81613b63565b82525050565b5f602082019050613ca35f830184613c81565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613ce782613afb565b810181811067ffffffffffffffff82111715613d0657613d05613cb1565b5b80604052505050565b5f613d18613a0f565b9050613d248282613cde565b919050565b5f67ffffffffffffffff821115613d4357613d42613cb1565b5b613d4c82613afb565b9050602081019050919050565b828183375f83830152505050565b5f613d79613d7484613d29565b613d0f565b905082815260208101848484011115613d9557613d94613cad565b5b613da0848285613d59565b509392505050565b5f82601f830112613dbc57613dbb613ca9565b5b8135613dcc848260208601613d67565b91505092915050565b5f60208284031215613dea57613de9613a18565b5b5f82013567ffffffffffffffff811115613e0757613e06613a1c565b5b613e1384828501613da8565b91505092915050565b613e2581613aa0565b8114613e2f575f80fd5b50565b5f81359050613e4081613e1c565b92915050565b5f60208284031215613e5b57613e5a613a18565b5b5f613e6884828501613e32565b91505092915050565b5f805f60608486031215613e8857613e87613a18565b5b5f613e9586828701613c2f565b9350506020613ea686828701613c2f565b9250506040613eb786828701613b82565b9150509250925092565b5f60208284031215613ed657613ed5613a18565b5b5f613ee384828501613c2f565b91505092915050565b5f819050919050565b613efe81613eec565b82525050565b5f602082019050613f175f830184613ef5565b92915050565b5f8060408385031215613f3357613f32613a18565b5b5f613f4085828601613c2f565b9250506020613f5185828601613c2f565b9150509250929050565b5f80fd5b5f80fd5b5f8083601f840112613f7857613f77613ca9565b5b8235905067ffffffffffffffff811115613f9557613f94613f5b565b5b602083019150836020820283011115613fb157613fb0613f5f565b5b9250929050565b5f805f8060608587031215613fd057613fcf613a18565b5b5f613fdd87828801613c2f565b9450506020613fee87828801613b82565b935050604085013567ffffffffffffffff81111561400f5761400e613a1c565b5b61401b87828801613f63565b925092505092959194509250565b5f8083601f84011261403e5761403d613ca9565b5b8235905067ffffffffffffffff81111561405b5761405a613f5b565b5b60208301915083602082028301111561407757614076613f5f565b5b9250929050565b5f806020838503121561409457614093613a18565b5b5f83013567ffffffffffffffff8111156140b1576140b0613a1c565b5b6140bd85828601614029565b92509250509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6140fb81613be0565b82525050565b5f67ffffffffffffffff82169050919050565b61411d81614101565b82525050565b61412c81613aa0565b82525050565b5f62ffffff82169050919050565b61414981614132565b82525050565b608082015f8201516141635f8501826140f2565b5060208201516141766020850182614114565b5060408201516141896040850182614123565b50606082015161419c6060850182614140565b50505050565b5f6141ad838361414f565b60808301905092915050565b5f602082019050919050565b5f6141cf826140c9565b6141d981856140d3565b93506141e4836140e3565b805f5b838110156142145781516141fb88826141a2565b9750614206836141b9565b9250506001810190506141e7565b5085935050505092915050565b5f6020820190508181035f83015261423981846141c5565b905092915050565b61424a81613eec565b8114614254575f80fd5b50565b5f8135905061426581614241565b92915050565b5f602082840312156142805761427f613a18565b5b5f61428d84828501614257565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6142c881613b63565b82525050565b5f6142d983836142bf565b60208301905092915050565b5f602082019050919050565b5f6142fb82614296565b61430581856142a0565b9350614310836142b0565b805f5b8381101561434057815161432788826142ce565b9750614332836142e5565b925050600181019050614313565b5085935050505092915050565b5f6020820190508181035f83015261436581846142f1565b905092915050565b5f805f6060848603121561438457614383613a18565b5b5f61439186828701613c2f565b93505060206143a286828701613b82565b92505060406143b386828701613b82565b9150509250925092565b5f80604083850312156143d3576143d2613a18565b5b5f6143e085828601613c2f565b92505060206143f185828601613e32565b9150509250929050565b5f67ffffffffffffffff82111561441557614414613cb1565b5b61441e82613afb565b9050602081019050919050565b5f61443d614438846143fb565b613d0f565b90508281526020810184848401111561445957614458613cad565b5b614464848285613d59565b509392505050565b5f82601f8301126144805761447f613ca9565b5b813561449084826020860161442b565b91505092915050565b5f805f80608085870312156144b1576144b0613a18565b5b5f6144be87828801613c2f565b94505060206144cf87828801613c2f565b93505060406144e087828801613b82565b925050606085013567ffffffffffffffff81111561450157614500613a1c565b5b61450d8782880161446c565b91505092959194509250565b608082015f82015161452d5f8501826140f2565b5060208201516145406020850182614114565b5060408201516145536040850182614123565b5060608201516145666060850182614140565b50505050565b5f60808201905061457f5f830184614519565b92915050565b5f806040838503121561459b5761459a613a18565b5b5f6145a885828601613b82565b92505060206145b985828601613c2f565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061460757607f821691505b60208210810361461a576146196145c3565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261467c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614641565b6146868683614641565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6146c16146bc6146b784613b63565b61469e565b613b63565b9050919050565b5f819050919050565b6146da836146a7565b6146ee6146e6826146c8565b84845461464d565b825550505050565b5f90565b6147026146f6565b61470d8184846146d1565b505050565b5b81811015614730576147255f826146fa565b600181019050614713565b5050565b601f8211156147755761474681614620565b61474f84614632565b8101602085101561475e578190505b61477261476a85614632565b830182614712565b50505b505050565b5f82821c905092915050565b5f6147955f198460080261477a565b1980831691505092915050565b5f6147ad8383614786565b9150826002028217905092915050565b6147c682613ad3565b67ffffffffffffffff8111156147df576147de613cb1565b5b6147e982546145f0565b6147f4828285614734565b5f60209050601f831160018114614825575f8415614813578287015190505b61481d85826147a2565b865550614884565b601f19841661483386614620565b5f5b8281101561485a57848901518255600182019150602085019450602081019050614835565b868310156148775784890151614873601f891682614786565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b50565b5f6148a45f8361488c565b91506148af82614896565b5f82019050919050565b5f6148c382614899565b9150819050919050565b7f4e6f20436f6e7472616374204d696e74696e67210000000000000000000000005f82015250565b5f614901601483613add565b915061490c826148cd565b602082019050919050565b5f6020820190508181035f83015261492e816148f5565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61496c82613b63565b915061497783613b63565b925082820190508082111561498f5761498e614935565b5b92915050565b7f4d617820737570706c79206578636565646564210000000000000000000000005f82015250565b5f6149c9601483613add565b91506149d482614995565b602082019050919050565b5f6020820190508181035f8301526149f6816149bd565b9050919050565b7f4d696e746564206d617820616d6f756e7420666f7220616464726573732100005f82015250565b5f614a31601e83613add565b9150614a3c826149fd565b602082019050919050565b5f6020820190508181035f830152614a5e81614a25565b9050919050565b5f614a6f82613b63565b9150614a7a83613b63565b9250828202614a8881613b63565b91508282048414831517614a9f57614a9e614935565b5b5092915050565b5f614ab082613b63565b9150614abb83613b63565b9250828203905081811115614ad357614ad2614935565b5b92915050565b7f496e73756666696369656e742066756e647321000000000000000000000000005f82015250565b5f614b0d601383613add565b9150614b1882614ad9565b602082019050919050565b5f6020820190508181035f830152614b3a81614b01565b9050919050565b7f54686520636f6e747261637420697320706175736564210000000000000000005f82015250565b5f614b75601783613add565b9150614b8082614b41565b602082019050919050565b5f6020820190508181035f830152614ba281614b69565b9050919050565b5f604082019050614bbc5f830185613bf1565b614bc96020830184613bf1565b9392505050565b5f81519050614bde81613e1c565b92915050565b5f60208284031215614bf957614bf8613a18565b5b5f614c0684828501614bd0565b91505092915050565b7f5468652077686974656c6973742073616c65206973206e6f7420656e61626c655f8201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b5f614c69602283613add565b9150614c7482614c0f565b604082019050919050565b5f6020820190508181035f830152614c9681614c5d565b9050919050565b5f8160601b9050919050565b5f614cb382614c9d565b9050919050565b5f614cc482614ca9565b9050919050565b614cdc614cd782613be0565b614cba565b82525050565b5f614ced8284614ccb565b60148201915081905092915050565b7f496e76616c69642070726f6f66210000000000000000000000000000000000005f82015250565b5f614d30600e83613add565b9150614d3b82614cfc565b602082019050919050565b5f6020820190508181035f830152614d5d81614d24565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f614deb602f83613add565b9150614df682614d91565b604082019050919050565b5f6020820190508181035f830152614e1881614ddf565b9050919050565b5f81905092915050565b5f614e3382613ad3565b614e3d8185614e1f565b9350614e4d818560208601613aed565b80840191505092915050565b5f8154614e65816145f0565b614e6f8186614e1f565b9450600182165f8114614e895760018114614e9e57614ed0565b60ff1983168652811515820286019350614ed0565b614ea785614620565b5f5b83811015614ec857815481890152600182019150602081019050614ea9565b838801955050505b50505092915050565b5f614ee48286614e29565b9150614ef08285614e29565b9150614efc8284614e59565b9150819050949350505050565b7f3078000000000000000000000000000000000000000000000000000000000000815250565b5f606082019050614f425f830185613bf1565b614f4f6020830184613bf1565b614f5b60408301614f09565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f614f8682614f62565b614f908185614f6c565b9350614fa0818560208601613aed565b614fa981613afb565b840191505092915050565b5f608082019050614fc75f830187613bf1565b614fd46020830186613bf1565b614fe16040830185613c81565b8181036060830152614ff38184614f7c565b905095945050505050565b5f8151905061500c81613a4b565b92915050565b5f6020828403121561502757615026613a18565b5b5f61503484828501614ffe565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffdfea2646970667358221220984a10cbe560ab3832d4bbb262c477f39fb8d1b6310defa3041274c86f357f1f64736f6c6343000819003300000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000aa87bee5380000000000000000000000000000000000000000000000000000000000000004e200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000a4d6963726f4d69676f7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d4943524f4d49474f5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c68747470733a2f2f697066732e696f2f697066732f626166796265696873736a6435757433677978776d79696768696a6e356972796e7335767277767067627977337a326277646f7636673269776d692f68696464656e2e6a736f6e00000000

Deployed Bytecode

0x60806040526004361061034f575f3560e01c80635d3155f3116101c5578063a22cb465116100f6578063e0a8085311610094578063e985e9c51161006e578063e985e9c514610c2b578063efbd73f414610c67578063f2fde38b14610c8f578063ff94ac1814610cb75761034f565b8063e0a8085314610b8b578063e40cca5e14610bb3578063e56ee43214610bef5761034f565b8063b88d4fde116100d0578063b88d4fde14610acd578063c23dc68f14610ae9578063c87b56dd14610b25578063d5abeb0114610b615761034f565b8063a22cb46514610a53578063a45ba8e714610a7b578063b767a09814610aa55761034f565b8063715018a6116101635780638462151c1161013d5780638462151c146109875780638da5cb5b146109c357806395d89b41146109ed57806399a2557a14610a175761034f565b8063715018a6146109215780637cb64759146109375780637ec4a6591461095f5761034f565b80636352211e1161019f5780636352211e146108575780636caede3d146108935780636f8b44b0146108bd57806370a08231146108e55761034f565b80635d3155f3146107c75780635f17e265146107f157806362b99ad41461082d5761034f565b80633ccfd60b1161029f5780634fdd43cb1161023d5780635697f53e116102175780635697f53e1461070f5780635bbb2177146107375780635c41d75e146107735780635c975abb1461079d5761034f565b80634fdd43cb1461069357806351830227146106bb5780635503a0e8146106e55761034f565b80634220cda0116102795780634220cda0146105f757806342842e0e1461063357806344a0d68a1461064f5780634b11faaf146106775761034f565b80633ccfd60b1461058957806340c10f191461059f578063418aa6ef146105bb5761034f565b806316ba10e01161030c57806323b872dd116102e657806323b872dd146104df57806328a60112146104fb5780632eb4a7ab14610537578063315dc3f2146105615761034f565b806316ba10e01461046557806316c38b3c1461048d57806318160ddd146104b55761034f565b806301ffc9a71461035357806306fdde031461038f578063081812fc146103b9578063095ea7b3146103f557806312649bf01461041157806313faede61461043b575b5f80fd5b34801561035e575f80fd5b5061037960048036038101906103749190613a75565b610cdf565b6040516103869190613aba565b60405180910390f35b34801561039a575f80fd5b506103a3610d70565b6040516103b09190613b43565b60405180910390f35b3480156103c4575f80fd5b506103df60048036038101906103da9190613b96565b610e00565b6040516103ec9190613c00565b60405180910390f35b61040f600480360381019061040a9190613c43565b610e7a565b005b34801561041c575f80fd5b50610425610fb9565b6040516104329190613c90565b60405180910390f35b348015610446575f80fd5b5061044f610fbf565b60405161045c9190613c90565b60405180910390f35b348015610470575f80fd5b5061048b60048036038101906104869190613dd5565b610fc5565b005b348015610498575f80fd5b506104b360048036038101906104ae9190613e46565b610fe0565b005b3480156104c0575f80fd5b506104c9611004565b6040516104d69190613c90565b60405180910390f35b6104f960048036038101906104f49190613e71565b611019565b005b348015610506575f80fd5b50610521600480360381019061051c9190613ec1565b611327565b60405161052e9190613c90565b60405180910390f35b348015610542575f80fd5b5061054b61133c565b6040516105589190613f04565b60405180910390f35b34801561056c575f80fd5b5061058760048036038101906105829190613b96565b611342565b005b348015610594575f80fd5b5061059d611354565b005b6105b960048036038101906105b49190613c43565b6113e7565b005b3480156105c6575f80fd5b506105e160048036038101906105dc9190613f1d565b611798565b6040516105ee9190613aba565b60405180910390f35b348015610602575f80fd5b5061061d60048036038101906106189190613ec1565b6118a7565b60405161062a9190613c90565b60405180910390f35b61064d60048036038101906106489190613e71565b6118bc565b005b34801561065a575f80fd5b5061067560048036038101906106709190613b96565b6118db565b005b610691600480360381019061068c9190613fb8565b6118ed565b005b34801561069e575f80fd5b506106b960048036038101906106b49190613dd5565b611d57565b005b3480156106c6575f80fd5b506106cf611d72565b6040516106dc9190613aba565b60405180910390f35b3480156106f0575f80fd5b506106f9611d85565b6040516107069190613b43565b60405180910390f35b34801561071a575f80fd5b5061073560048036038101906107309190613b96565b611e11565b005b348015610742575f80fd5b5061075d6004803603810190610758919061407e565b611e23565b60405161076a9190614221565b60405180910390f35b34801561077e575f80fd5b50610787611ee3565b6040516107949190613c90565b60405180910390f35b3480156107a8575f80fd5b506107b1611ee9565b6040516107be9190613aba565b60405180910390f35b3480156107d2575f80fd5b506107db611efb565b6040516107e89190613c90565b60405180910390f35b3480156107fc575f80fd5b5061081760048036038101906108129190613ec1565b611f01565b6040516108249190613c90565b60405180910390f35b348015610838575f80fd5b50610841611f16565b60405161084e9190613b43565b60405180910390f35b348015610862575f80fd5b5061087d60048036038101906108789190613b96565b611fa2565b60405161088a9190613c00565b60405180910390f35b34801561089e575f80fd5b506108a7611fb3565b6040516108b49190613aba565b60405180910390f35b3480156108c8575f80fd5b506108e360048036038101906108de9190613b96565b611fc6565b005b3480156108f0575f80fd5b5061090b60048036038101906109069190613ec1565b611fd8565b6040516109189190613c90565b60405180910390f35b34801561092c575f80fd5b5061093561208d565b005b348015610942575f80fd5b5061095d6004803603810190610958919061426b565b6120a0565b005b34801561096a575f80fd5b5061098560048036038101906109809190613dd5565b6120b2565b005b348015610992575f80fd5b506109ad60048036038101906109a89190613ec1565b6120cd565b6040516109ba919061434d565b60405180910390f35b3480156109ce575f80fd5b506109d7612209565b6040516109e49190613c00565b60405180910390f35b3480156109f8575f80fd5b50610a01612231565b604051610a0e9190613b43565b60405180910390f35b348015610a22575f80fd5b50610a3d6004803603810190610a38919061436d565b6122c1565b604051610a4a919061434d565b60405180910390f35b348015610a5e575f80fd5b50610a796004803603810190610a7491906143bd565b6124c0565b005b348015610a86575f80fd5b50610a8f6125c6565b604051610a9c9190613b43565b60405180910390f35b348015610ab0575f80fd5b50610acb6004803603810190610ac69190613e46565b612652565b005b610ae76004803603810190610ae29190614499565b612677565b005b348015610af4575f80fd5b50610b0f6004803603810190610b0a9190613b96565b6126e9565b604051610b1c919061456c565b60405180910390f35b348015610b30575f80fd5b50610b4b6004803603810190610b469190613b96565b612753565b604051610b589190613b43565b60405180910390f35b348015610b6c575f80fd5b50610b756128a5565b604051610b829190613c90565b60405180910390f35b348015610b96575f80fd5b50610bb16004803603810190610bac9190613e46565b6128ab565b005b348015610bbe575f80fd5b50610bd96004803603810190610bd49190613f1d565b6128d0565b604051610be69190613aba565b60405180910390f35b348015610bfa575f80fd5b50610c156004803603810190610c109190613f1d565b612972565b604051610c229190613aba565b60405180910390f35b348015610c36575f80fd5b50610c516004803603810190610c4c9190613f1d565b612a80565b604051610c5e9190613aba565b60405180910390f35b348015610c72575f80fd5b50610c8d6004803603810190610c889190614585565b612b0e565b005b348015610c9a575f80fd5b50610cb56004803603810190610cb09190613ec1565b612b7d565b005b348015610cc2575f80fd5b50610cdd6004803603810190610cd89190613b96565b612c01565b005b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d3957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d695750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610d7f906145f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610dab906145f0565b8015610df65780601f10610dcd57610100808354040283529160200191610df6565b820191905f5260205f20905b815481529060010190602001808311610dd957829003601f168201915b5050505050905090565b5f610e0a82612c13565b610e40576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610e8482611fa2565b90508073ffffffffffffffffffffffffffffffffffffffff16610ea5612c6d565b73ffffffffffffffffffffffffffffffffffffffff1614610f0857610ed181610ecc612c6d565b612a80565b610f07576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60125481565b60155481565b610fcd612c74565b80600f9081610fdc91906147bd565b5050565b610fe8612c74565b8060165f6101000a81548160ff02191690831515021790555050565b5f61100d612cfb565b6001545f540303905090565b5f61102382612d03565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461108a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8061109584612dc6565b915091506110ab81876110a6612c6d565b612de9565b6110f7576110c0866110bb612c6d565b612a80565b6110f6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361115c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111698686866001612e2c565b8015611173575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81546001019190508190555061123b85611217888887612e32565b7c020000000000000000000000000000000000000000000000000000000017612e59565b60045f8681526020019081526020015f20819055505f7c02000000000000000000000000000000000000000000000000000000008416036112b7575f6001850190505f60045f8381526020019081526020015f2054036112b5575f5481146112b4578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461131f8686866001612e83565b505050505050565b600d602052805f5260405f205f915090505481565b600a5481565b61134a612c74565b8060128190555050565b61135c612c74565b611364612e89565b5f61136d612209565b73ffffffffffffffffffffffffffffffffffffffff1647604051611390906148b9565b5f6040518083038185875af1925050503d805f81146113ca576040519150601f19603f3d011682016040523d82523d5f602084013e6113cf565b606091505b50509050806113dc575f80fd5b506113e5612ecf565b565b81813373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e90614917565b60405180910390fd5b60145481611463611004565b61146d9190614962565b11156114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a5906149df565b60405180910390fd5b5f6114b983336128d0565b6114c357336114c5565b825b90505f82118015611520575060135482600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461151d9190614962565b11155b61155f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155690614a47565b60405180910390fd5b84845f816015546115709190614a65565b90505f61157d84336128d0565b6115875733611589565b835b90505f80600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546012546115d89190614aa6565b116115e3575f61162f565b600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460125461162e9190614aa6565b5b90505f8082111561164d5784821115611648578461164a565b815b90505b6015548161165b9190614a65565b846116669190614aa6565b9350833410156116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a290614b23565b60405180910390fd5b6116b3612e89565b60165f9054906101000a900460ff1615611702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f990614b8b565b60405180910390fd5b5f61170d8c336128d0565b6117175733611719565b8b5b9050611725818c612ed9565b8a600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117719190614962565b92505081905550611782338c612fe1565b5061178b612ecf565b5050505050505050505050565b5f805f90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561180557508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561189d576d76a84fef008cdabe6409d2fe638b73ffffffffffffffffffffffffffffffffffffffff16639c395bc284866040518363ffffffff1660e01b8152600401611853929190614ba9565b602060405180830381865afa15801561186e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118929190614be4565b1561189c57600190505b5b8091505092915050565b600c602052805f5260405f205f915090505481565b6118d683838360405180602001604052805f815250612677565b505050565b6118e3612c74565b8060158190555050565b83833373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195490614917565b60405180910390fd5b60145481611969611004565b6119739190614962565b11156119b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ab906149df565b60405180910390fd5b5f6119bf83336128d0565b6119c957336119cb565b825b90505f82118015611a26575060135482600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611a239190614962565b11155b611a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5c90614a47565b60405180910390fd5b86865f81601554611a769190614a65565b90505f611a8384336128d0565b611a8d5733611a8f565b835b90505f80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054601154611ade9190614aa6565b11611ae9575f611b35565b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054601154611b349190614aa6565b5b90505f80821115611b535784821115611b4e5784611b50565b815b90505b60155481611b619190614a65565b84611b6c9190614aa6565b935083341015611bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba890614b23565b60405180910390fd5b611bb9612e89565b601660019054906101000a900460ff16611c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bff90614c7f565b60405180910390fd5b5f611c138e336128d0565b611c1d5733611c1f565b8d5b90505f81604051602001611c339190614ce2565b604051602081830303815290604052805190602001209050611c988d8d808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050600a5483612ffe565b611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce90614d46565b60405180910390fd5b611ce1828f613014565b8d600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611d2d9190614962565b92505081905550611d3e338f612fe1565b5050611d48612ecf565b50505050505050505050505050565b611d5f612c74565b8060109081611d6e91906147bd565b5050565b601660029054906101000a900460ff1681565b600f8054611d92906145f0565b80601f0160208091040260200160405190810160405280929190818152602001828054611dbe906145f0565b8015611e095780601f10611de057610100808354040283529160200191611e09565b820191905f5260205f20905b815481529060010190602001808311611dec57829003601f168201915b505050505081565b611e19612c74565b8060138190555050565b60605f8383905090505f8167ffffffffffffffff811115611e4757611e46613cb1565b5b604051908082528060200260200182016040528015611e8057816020015b611e6d6139c4565b815260200190600190039081611e655790505b5090505f5b828114611ed757611eae868683818110611ea257611ea1614d64565b5b905060200201356126e9565b828281518110611ec157611ec0614d64565b5b6020026020010181905250806001019050611e85565b50809250505092915050565b60135481565b60165f9054906101000a900460ff1681565b60115481565b600b602052805f5260405f205f915090505481565b600e8054611f23906145f0565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4f906145f0565b8015611f9a5780601f10611f7157610100808354040283529160200191611f9a565b820191905f5260205f20905b815481529060010190602001808311611f7d57829003601f168201915b505050505081565b5f611fac82612d03565b9050919050565b601660019054906101000a900460ff1681565b611fce612c74565b8060148190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361203e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b612095612c74565b61209e5f61311c565b565b6120a8612c74565b80600a8190555050565b6120ba612c74565b80600e90816120c991906147bd565b5050565b60605f805f6120db85611fd8565b90505f8167ffffffffffffffff8111156120f8576120f7613cb1565b5b6040519080825280602002602001820160405280156121265781602001602082028036833780820191505090505b5090506121316139c4565b5f61213a612cfb565b90505b8386146121fb5761214d816131df565b915081604001516121f0575f73ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff161461219557815f015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036121ef57808387806001019850815181106121e2576121e1614d64565b5b6020026020010181815250505b5b80600101905061213d565b508195505050505050919050565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054612240906145f0565b80601f016020809104026020016040519081016040528092919081815260200182805461226c906145f0565b80156122b75780601f1061228e576101008083540402835291602001916122b7565b820191905f5260205f20905b81548152906001019060200180831161229a57829003601f168201915b5050505050905090565b60608183106122fc576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80612306613208565b9050612310612cfb565b8510156123225761231f612cfb565b94505b8084111561232e578093505b5f61233887611fd8565b90508486101561235a575f868603905081811015612354578091505b5061235e565b5f90505b5f8167ffffffffffffffff81111561237957612378613cb1565b5b6040519080825280602002602001820160405280156123a75781602001602082028036833780820191505090505b5090505f82036123bd57809450505050506124b9565b5f6123c7886126e9565b90505f81604001516123da57815f015190505b5f8990505b8881141580156123ef5750848714155b156124ab576123fd816131df565b925082604001516124a0575f73ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff161461244557825f015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361249f578084888060010199508151811061249257612491614d64565b5b6020026020010181815250505b5b8060010190506123df565b508583528296505050505050505b9392505050565b8060075f6124cc612c6d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612575612c6d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125ba9190613aba565b60405180910390a35050565b601080546125d3906145f0565b80601f01602080910402602001604051908101604052809291908181526020018280546125ff906145f0565b801561264a5780601f106126215761010080835404028352916020019161264a565b820191905f5260205f20905b81548152906001019060200180831161262d57829003601f168201915b505050505081565b61265a612c74565b80601660016101000a81548160ff02191690831515021790555050565b612682848484611019565b5f8373ffffffffffffffffffffffffffffffffffffffff163b146126e3576126ac84848484613210565b6126e2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6126f16139c4565b6126f96139c4565b612701612cfb565b8310806127155750612711613208565b8310155b15612723578091505061274e565b61272c836131df565b9050806040015115612741578091505061274e565b61274a8361335b565b9150505b919050565b606061275e82612c13565b61279d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279490614e01565b60405180910390fd5b5f1515601660029054906101000a900460ff1615150361284757601080546127c4906145f0565b80601f01602080910402602001604051908101604052809291908181526020018280546127f0906145f0565b801561283b5780601f106128125761010080835404028352916020019161283b565b820191905f5260205f20905b81548152906001019060200180831161281e57829003601f168201915b505050505090506128a0565b5f61285061337b565b90505f81511161286e5760405180602001604052805f81525061289c565b806128788461340b565b600f60405160200161288c93929190614ed9565b6040516020818303038152906040525b9150505b919050565b60145481565b6128b3612c74565b80601660026101000a81548160ff02191690831515021790555050565b5f805f90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561293d57508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156129685761294c8484611798565b8061295d575061295c8484612972565b5b1561296757600190505b5b8091505092915050565b5f805f90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156129df57508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15612a76576c447e69651d841bd8d104bed49373ffffffffffffffffffffffffffffffffffffffff1663e839bd5384866040518363ffffffff1660e01b8152600401612a2c929190614f2f565b602060405180830381865afa158015612a47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a6b9190614be4565b15612a7557600190505b5b8091505092915050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b8160145481612b1b611004565b612b259190614962565b1115612b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5d906149df565b60405180910390fd5b612b6e612c74565b612b788284612fe1565b505050565b612b85612c74565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612bf5575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612bec9190613c00565b60405180910390fd5b612bfe8161311c565b50565b612c09612c74565b8060118190555050565b5f81612c1d612cfb565b11158015612c2b57505f5482105b8015612c6657505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f33905090565b612c7c6134d5565b73ffffffffffffffffffffffffffffffffffffffff16612c9a612209565b73ffffffffffffffffffffffffffffffffffffffff1614612cf957612cbd6134d5565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401612cf09190613c00565b60405180910390fd5b565b5f6001905090565b5f8082905080612d11612cfb565b11612d8f575f54811015612d8e575f60045f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603612d8c575b5f8103612d825760045f836001900393508381526020019081526020015f20549050612d5b565b8092505050612dc1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8612e488686846134dc565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600260085403612ec5576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600881905550565b6001600881905550565b5f600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054601254612f259190614aa6565b821115612f7c57600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054601254612f779190614aa6565b612f7e565b815b90505f811115612fdc5780600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612fd49190614962565b925050819055505b505050565b612ffa828260405180602001604052805f8152506134e4565b5050565b5f8261300a858461357b565b1490509392505050565b5f600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546011546130609190614aa6565b8211156130b757600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546011546130b29190614aa6565b6130b9565b815b90505f8111156131175780600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461310f9190614962565b925050819055505b505050565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131e76139c4565b61320160045f8481526020019081526020015f20546135c9565b9050919050565b5f8054905090565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613235612c6d565b8786866040518563ffffffff1660e01b81526004016132579493929190614fb4565b6020604051808303815f875af192505050801561329257506040513d601f19601f8201168201806040525081019061328f9190615012565b60015b613308573d805f81146132c0576040519150601f19603f3d011682016040523d82523d5f602084013e6132c5565b606091505b505f815103613300576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6133636139c4565b61337461336f83612d03565b6135c9565b9050919050565b6060600e805461338a906145f0565b80601f01602080910402602001604051908101604052809291908181526020018280546133b6906145f0565b80156134015780601f106133d857610100808354040283529160200191613401565b820191905f5260205f20905b8154815290600101906020018083116133e457829003601f168201915b5050505050905090565b60605f60016134198461367d565b0190505f8167ffffffffffffffff81111561343757613436613cb1565b5b6040519080825280601f01601f1916602001820160405280156134695781602001600182028036833780820191505090505b5090505f82602001820190505b6001156134ca578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816134bf576134be61503d565b5b0494505f8503613476575b819350505050919050565b5f33905090565b5f9392505050565b6134ee83836137ce565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14613576575f805490505f83820390505b61352a5f868380600101945086613210565b613560576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061351857815f5414613573575f80fd5b50505b505050565b5f808290505f5b84518110156135be576135af828683815181106135a2576135a1614d64565b5b6020026020010151613977565b91508080600101915050613582565b508091505092915050565b6135d16139c4565b81815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff16815250505f7c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106136d9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816136cf576136ce61503d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613716576d04ee2d6d415b85acef8100000000838161370c5761370b61503d565b5b0492506020810190505b662386f26fc10000831061374557662386f26fc10000838161373b5761373a61503d565b5b0492506010810190505b6305f5e100831061376e576305f5e10083816137645761376361503d565b5b0492506008810190505b61271083106137935761271083816137895761378861503d565b5b0492506004810190505b606483106137b657606483816137ac576137ab61503d565b5b0492506002810190505b600a83106137c5576001810190505b80915050919050565b5f805490505f820361380c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138185f848385612e2c565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555061388a8361387b5f865f612e32565b613884856139a1565b17612e59565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146139245780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a46001810190506138eb565b505f820361395e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f8190555050506139725f848385612e83565b505050565b5f81831061398e5761398982846139b0565b613999565b61399883836139b0565b5b905092915050565b5f6001821460e11b9050919050565b5f825f528160205260405f20905092915050565b60405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f62ffffff1681525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a5481613a20565b8114613a5e575f80fd5b50565b5f81359050613a6f81613a4b565b92915050565b5f60208284031215613a8a57613a89613a18565b5b5f613a9784828501613a61565b91505092915050565b5f8115159050919050565b613ab481613aa0565b82525050565b5f602082019050613acd5f830184613aab565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f613b1582613ad3565b613b1f8185613add565b9350613b2f818560208601613aed565b613b3881613afb565b840191505092915050565b5f6020820190508181035f830152613b5b8184613b0b565b905092915050565b5f819050919050565b613b7581613b63565b8114613b7f575f80fd5b50565b5f81359050613b9081613b6c565b92915050565b5f60208284031215613bab57613baa613a18565b5b5f613bb884828501613b82565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613bea82613bc1565b9050919050565b613bfa81613be0565b82525050565b5f602082019050613c135f830184613bf1565b92915050565b613c2281613be0565b8114613c2c575f80fd5b50565b5f81359050613c3d81613c19565b92915050565b5f8060408385031215613c5957613c58613a18565b5b5f613c6685828601613c2f565b9250506020613c7785828601613b82565b9150509250929050565b613c8a81613b63565b82525050565b5f602082019050613ca35f830184613c81565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613ce782613afb565b810181811067ffffffffffffffff82111715613d0657613d05613cb1565b5b80604052505050565b5f613d18613a0f565b9050613d248282613cde565b919050565b5f67ffffffffffffffff821115613d4357613d42613cb1565b5b613d4c82613afb565b9050602081019050919050565b828183375f83830152505050565b5f613d79613d7484613d29565b613d0f565b905082815260208101848484011115613d9557613d94613cad565b5b613da0848285613d59565b509392505050565b5f82601f830112613dbc57613dbb613ca9565b5b8135613dcc848260208601613d67565b91505092915050565b5f60208284031215613dea57613de9613a18565b5b5f82013567ffffffffffffffff811115613e0757613e06613a1c565b5b613e1384828501613da8565b91505092915050565b613e2581613aa0565b8114613e2f575f80fd5b50565b5f81359050613e4081613e1c565b92915050565b5f60208284031215613e5b57613e5a613a18565b5b5f613e6884828501613e32565b91505092915050565b5f805f60608486031215613e8857613e87613a18565b5b5f613e9586828701613c2f565b9350506020613ea686828701613c2f565b9250506040613eb786828701613b82565b9150509250925092565b5f60208284031215613ed657613ed5613a18565b5b5f613ee384828501613c2f565b91505092915050565b5f819050919050565b613efe81613eec565b82525050565b5f602082019050613f175f830184613ef5565b92915050565b5f8060408385031215613f3357613f32613a18565b5b5f613f4085828601613c2f565b9250506020613f5185828601613c2f565b9150509250929050565b5f80fd5b5f80fd5b5f8083601f840112613f7857613f77613ca9565b5b8235905067ffffffffffffffff811115613f9557613f94613f5b565b5b602083019150836020820283011115613fb157613fb0613f5f565b5b9250929050565b5f805f8060608587031215613fd057613fcf613a18565b5b5f613fdd87828801613c2f565b9450506020613fee87828801613b82565b935050604085013567ffffffffffffffff81111561400f5761400e613a1c565b5b61401b87828801613f63565b925092505092959194509250565b5f8083601f84011261403e5761403d613ca9565b5b8235905067ffffffffffffffff81111561405b5761405a613f5b565b5b60208301915083602082028301111561407757614076613f5f565b5b9250929050565b5f806020838503121561409457614093613a18565b5b5f83013567ffffffffffffffff8111156140b1576140b0613a1c565b5b6140bd85828601614029565b92509250509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6140fb81613be0565b82525050565b5f67ffffffffffffffff82169050919050565b61411d81614101565b82525050565b61412c81613aa0565b82525050565b5f62ffffff82169050919050565b61414981614132565b82525050565b608082015f8201516141635f8501826140f2565b5060208201516141766020850182614114565b5060408201516141896040850182614123565b50606082015161419c6060850182614140565b50505050565b5f6141ad838361414f565b60808301905092915050565b5f602082019050919050565b5f6141cf826140c9565b6141d981856140d3565b93506141e4836140e3565b805f5b838110156142145781516141fb88826141a2565b9750614206836141b9565b9250506001810190506141e7565b5085935050505092915050565b5f6020820190508181035f83015261423981846141c5565b905092915050565b61424a81613eec565b8114614254575f80fd5b50565b5f8135905061426581614241565b92915050565b5f602082840312156142805761427f613a18565b5b5f61428d84828501614257565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6142c881613b63565b82525050565b5f6142d983836142bf565b60208301905092915050565b5f602082019050919050565b5f6142fb82614296565b61430581856142a0565b9350614310836142b0565b805f5b8381101561434057815161432788826142ce565b9750614332836142e5565b925050600181019050614313565b5085935050505092915050565b5f6020820190508181035f83015261436581846142f1565b905092915050565b5f805f6060848603121561438457614383613a18565b5b5f61439186828701613c2f565b93505060206143a286828701613b82565b92505060406143b386828701613b82565b9150509250925092565b5f80604083850312156143d3576143d2613a18565b5b5f6143e085828601613c2f565b92505060206143f185828601613e32565b9150509250929050565b5f67ffffffffffffffff82111561441557614414613cb1565b5b61441e82613afb565b9050602081019050919050565b5f61443d614438846143fb565b613d0f565b90508281526020810184848401111561445957614458613cad565b5b614464848285613d59565b509392505050565b5f82601f8301126144805761447f613ca9565b5b813561449084826020860161442b565b91505092915050565b5f805f80608085870312156144b1576144b0613a18565b5b5f6144be87828801613c2f565b94505060206144cf87828801613c2f565b93505060406144e087828801613b82565b925050606085013567ffffffffffffffff81111561450157614500613a1c565b5b61450d8782880161446c565b91505092959194509250565b608082015f82015161452d5f8501826140f2565b5060208201516145406020850182614114565b5060408201516145536040850182614123565b5060608201516145666060850182614140565b50505050565b5f60808201905061457f5f830184614519565b92915050565b5f806040838503121561459b5761459a613a18565b5b5f6145a885828601613b82565b92505060206145b985828601613c2f565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061460757607f821691505b60208210810361461a576146196145c3565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261467c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614641565b6146868683614641565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6146c16146bc6146b784613b63565b61469e565b613b63565b9050919050565b5f819050919050565b6146da836146a7565b6146ee6146e6826146c8565b84845461464d565b825550505050565b5f90565b6147026146f6565b61470d8184846146d1565b505050565b5b81811015614730576147255f826146fa565b600181019050614713565b5050565b601f8211156147755761474681614620565b61474f84614632565b8101602085101561475e578190505b61477261476a85614632565b830182614712565b50505b505050565b5f82821c905092915050565b5f6147955f198460080261477a565b1980831691505092915050565b5f6147ad8383614786565b9150826002028217905092915050565b6147c682613ad3565b67ffffffffffffffff8111156147df576147de613cb1565b5b6147e982546145f0565b6147f4828285614734565b5f60209050601f831160018114614825575f8415614813578287015190505b61481d85826147a2565b865550614884565b601f19841661483386614620565b5f5b8281101561485a57848901518255600182019150602085019450602081019050614835565b868310156148775784890151614873601f891682614786565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b50565b5f6148a45f8361488c565b91506148af82614896565b5f82019050919050565b5f6148c382614899565b9150819050919050565b7f4e6f20436f6e7472616374204d696e74696e67210000000000000000000000005f82015250565b5f614901601483613add565b915061490c826148cd565b602082019050919050565b5f6020820190508181035f83015261492e816148f5565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61496c82613b63565b915061497783613b63565b925082820190508082111561498f5761498e614935565b5b92915050565b7f4d617820737570706c79206578636565646564210000000000000000000000005f82015250565b5f6149c9601483613add565b91506149d482614995565b602082019050919050565b5f6020820190508181035f8301526149f6816149bd565b9050919050565b7f4d696e746564206d617820616d6f756e7420666f7220616464726573732100005f82015250565b5f614a31601e83613add565b9150614a3c826149fd565b602082019050919050565b5f6020820190508181035f830152614a5e81614a25565b9050919050565b5f614a6f82613b63565b9150614a7a83613b63565b9250828202614a8881613b63565b91508282048414831517614a9f57614a9e614935565b5b5092915050565b5f614ab082613b63565b9150614abb83613b63565b9250828203905081811115614ad357614ad2614935565b5b92915050565b7f496e73756666696369656e742066756e647321000000000000000000000000005f82015250565b5f614b0d601383613add565b9150614b1882614ad9565b602082019050919050565b5f6020820190508181035f830152614b3a81614b01565b9050919050565b7f54686520636f6e747261637420697320706175736564210000000000000000005f82015250565b5f614b75601783613add565b9150614b8082614b41565b602082019050919050565b5f6020820190508181035f830152614ba281614b69565b9050919050565b5f604082019050614bbc5f830185613bf1565b614bc96020830184613bf1565b9392505050565b5f81519050614bde81613e1c565b92915050565b5f60208284031215614bf957614bf8613a18565b5b5f614c0684828501614bd0565b91505092915050565b7f5468652077686974656c6973742073616c65206973206e6f7420656e61626c655f8201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b5f614c69602283613add565b9150614c7482614c0f565b604082019050919050565b5f6020820190508181035f830152614c9681614c5d565b9050919050565b5f8160601b9050919050565b5f614cb382614c9d565b9050919050565b5f614cc482614ca9565b9050919050565b614cdc614cd782613be0565b614cba565b82525050565b5f614ced8284614ccb565b60148201915081905092915050565b7f496e76616c69642070726f6f66210000000000000000000000000000000000005f82015250565b5f614d30600e83613add565b9150614d3b82614cfc565b602082019050919050565b5f6020820190508181035f830152614d5d81614d24565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f614deb602f83613add565b9150614df682614d91565b604082019050919050565b5f6020820190508181035f830152614e1881614ddf565b9050919050565b5f81905092915050565b5f614e3382613ad3565b614e3d8185614e1f565b9350614e4d818560208601613aed565b80840191505092915050565b5f8154614e65816145f0565b614e6f8186614e1f565b9450600182165f8114614e895760018114614e9e57614ed0565b60ff1983168652811515820286019350614ed0565b614ea785614620565b5f5b83811015614ec857815481890152600182019150602081019050614ea9565b838801955050505b50505092915050565b5f614ee48286614e29565b9150614ef08285614e29565b9150614efc8284614e59565b9150819050949350505050565b7f3078000000000000000000000000000000000000000000000000000000000000815250565b5f606082019050614f425f830185613bf1565b614f4f6020830184613bf1565b614f5b60408301614f09565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f614f8682614f62565b614f908185614f6c565b9350614fa0818560208601613aed565b614fa981613afb565b840191505092915050565b5f608082019050614fc75f830187613bf1565b614fd46020830186613bf1565b614fe16040830185613c81565b8181036060830152614ff38184614f7c565b905095945050505050565b5f8151905061500c81613a4b565b92915050565b5f6020828403121561502757615026613a18565b5b5f61503484828501614ffe565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffdfea2646970667358221220984a10cbe560ab3832d4bbb262c477f39fb8d1b6310defa3041274c86f357f1f64736f6c63430008190033

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

00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000aa87bee5380000000000000000000000000000000000000000000000000000000000000004e200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000a4d6963726f4d69676f7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d4943524f4d49474f5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c68747470733a2f2f697066732e696f2f697066732f626166796265696873736a6435757433677978776d79696768696a6e356972796e7335767277767067627977337a326277646f7636673269776d692f68696464656e2e6a736f6e00000000

-----Decoded View---------------
Arg [0] : _tokenName (string): MicroMigos
Arg [1] : _tokenSymbol (string): MICROMIGOS
Arg [2] : _cost (uint256): 3000000000000000
Arg [3] : _maxSupply (uint256): 20000
Arg [4] : _maxFreeAmountPerAddress (uint256): 2
Arg [5] : _maxFreePublicAmountPerAddress (uint256): 1
Arg [6] : _maxMintAmountPerAddress (uint256): 5
Arg [7] : _hiddenMetadataUri (string): https://ipfs.io/ipfs/bafybeihssjd5ut3gyxwmyighijn5iryns5vrwvpgbyw3z2bwdov6g2iwmi/hidden.json

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 000000000000000000000000000000000000000000000000000aa87bee538000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000004e20
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [9] : 4d6963726f4d69676f7300000000000000000000000000000000000000000000
Arg [10] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [11] : 4d4943524f4d49474f5300000000000000000000000000000000000000000000
Arg [12] : 000000000000000000000000000000000000000000000000000000000000005c
Arg [13] : 68747470733a2f2f697066732e696f2f697066732f626166796265696873736a
Arg [14] : 6435757433677978776d79696768696a6e356972796e73357672777670676279
Arg [15] : 77337a326277646f7636673269776d692f68696464656e2e6a736f6e00000000


Deployed ByteCode Sourcemap

99683:10341:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55915:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56817:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63308:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62741:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100379:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100506:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109298:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109412:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52568:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66947:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100158:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100000:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;107605:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109734:160;;;;;;;;;;;;;:::i;:::-;;106918:515;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101491:555;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100092:59;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69868:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108950:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106182:728;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109038:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100611:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100256:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;107793:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93138:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100430:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100532:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100334:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100032:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100221:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58210:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100564:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108747:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53752:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36675:103;;;;;;;;;;;;;:::i;:::-;;109503:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109184:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97014:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36000:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56993:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94054:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63866:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100296:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109615:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70659:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92551:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108239:500;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100475:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108855:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102640:512;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102054:578;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64257:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;107957:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36933:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;107441:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55915:639;56000:4;56339:10;56324:25;;:11;:25;;;;:102;;;;56416:10;56401:25;;:11;:25;;;;56324:102;:179;;;;56493:10;56478:25;;:11;:25;;;;56324:179;56304:199;;55915:639;;;:::o;56817:100::-;56871:13;56904:5;56897:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56817:100;:::o;63308:218::-;63384:7;63409:16;63417:7;63409;:16::i;:::-;63404:64;;63434:34;;;;;;;;;;;;;;63404:64;63488:15;:24;63504:7;63488:24;;;;;;;;;;;:30;;;;;;;;;;;;63481:37;;63308:218;;;:::o;62741:408::-;62830:13;62846:16;62854:7;62846;:16::i;:::-;62830:32;;62902:5;62879:28;;:19;:17;:19::i;:::-;:28;;;62875:175;;62927:44;62944:5;62951:19;:17;:19::i;:::-;62927:16;:44::i;:::-;62922:128;;62999:35;;;;;;;;;;;;;;62922:128;62875:175;63095:2;63062:15;:24;63078:7;63062:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;63133:7;63129:2;63113:28;;63122:5;63113:28;;;;;;;;;;;;62819:330;62741:408;;:::o;100379:44::-;;;;:::o;100506:19::-;;;;:::o;109298:106::-;35886:13;:11;:13::i;:::-;109386:10:::1;109374:9;:22;;;;;;:::i;:::-;;109298:106:::0;:::o;109412:83::-;35886:13;:11;:13::i;:::-;109481:6:::1;109472;;:15;;;;;;;;;;;;;;;;;;109412:83:::0;:::o;52568:323::-;52629:7;52857:15;:13;:15::i;:::-;52842:12;;52826:13;;:28;:46;52819:53;;52568:323;:::o;66947:2825::-;67089:27;67119;67138:7;67119:18;:27::i;:::-;67089:57;;67204:4;67163:45;;67179:19;67163:45;;;67159:86;;67217:28;;;;;;;;;;;;;;67159:86;67259:27;67288:23;67315:35;67342:7;67315:26;:35::i;:::-;67258:92;;;;67450:68;67475:15;67492:4;67498:19;:17;:19::i;:::-;67450:24;:68::i;:::-;67445:180;;67538:43;67555:4;67561:19;:17;:19::i;:::-;67538:16;:43::i;:::-;67533:92;;67590:35;;;;;;;;;;;;;;67533:92;67445:180;67656:1;67642:16;;:2;:16;;;67638:52;;67667:23;;;;;;;;;;;;;;67638:52;67703:43;67725:4;67731:2;67735:7;67744:1;67703:21;:43::i;:::-;67839:15;67836:160;;;67979:1;67958:19;67951:30;67836:160;68376:18;:24;68395:4;68376:24;;;;;;;;;;;;;;;;68374:26;;;;;;;;;;;;68445:18;:22;68464:2;68445:22;;;;;;;;;;;;;;;;68443:24;;;;;;;;;;;68767:146;68804:2;68853:45;68868:4;68874:2;68878:19;68853:14;:45::i;:::-;48967:8;68825:73;68767:18;:146::i;:::-;68738:17;:26;68756:7;68738:26;;;;;;;;;;;:175;;;;69084:1;48967:8;69033:19;:47;:52;69029:627;;69106:19;69138:1;69128:7;:11;69106:33;;69295:1;69261:17;:30;69279:11;69261:30;;;;;;;;;;;;:35;69257:384;;69399:13;;69384:11;:28;69380:242;;69579:19;69546:17;:30;69564:11;69546:30;;;;;;;;;;;:52;;;;69380:242;69257:384;69087:569;69029:627;69703:7;69699:2;69684:27;;69693:4;69684:27;;;;;;;;;;;;69722:42;69743:4;69749:2;69753:7;69762:1;69722:20;:42::i;:::-;67078:2694;;;66947:2825;;;:::o;100158:56::-;;;;;;;;;;;;;;;;;:::o;100000:25::-;;;;:::o;107605:180::-;35886:13;:11;:13::i;:::-;107747:30:::1;107715:29;:62;;;;107605:180:::0;:::o;109734:160::-;35886:13;:11;:13::i;:::-;2442:21:::1;:19;:21::i;:::-;109796:7:::2;109817;:5;:7::i;:::-;109809:21;;109838;109809:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109795:69;;;109883:2;109875:11;;;::::0;::::2;;109784:110;2486:20:::1;:18;:20::i;:::-;109734:160::o:0;106918:515::-;107008:15;107025:11;103262:10;103249:23;;:9;:23;;;103241:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;103347:9;;103332:11;103316:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;103308:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;103392:14;103409:45;103426:15;103443:10;103409:16;:45::i;:::-;:76;;103475:10;103409:76;;;103457:15;103409:76;103392:93;;103518:1;103504:11;:15;:89;;;;;103570:23;;103555:11;103523:21;:29;103545:6;103523:29;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:70;;103504:89;103496:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;107058:15:::1;107075:11;104536:17;104563:11;104556:4;;:18;;;;:::i;:::-;104536:38;;104585:14;104602:45;104619:15;104636:10;104602:16;:45::i;:::-;:76;;104668:10;104602:76;;;104650:15;104602:76;104585:93;;104689:43;104802:1:::0;104767:24:::1;:32;104792:6;104767:32;;;;;;;;;;;;;;;;104735:29;;:64;;;;:::i;:::-;:68;:139;;104873:1;104735:139;;;104838:24;:32;104863:6;104838:32;;;;;;;;;;;;;;;;104806:29;;:64;;;;:::i;:::-;104735:139;104689:185;;104885:28;104972:1:::0;104934:35:::1;:39;104930:197;;;105052:11;105013:35;:50;;:102;;105104:11;105013:102;;;105066:35;105013:102;104990:125;;104930:197;105187:4;;105164:20;:27;;;;:::i;:::-;105151:9;:41;;;;:::i;:::-;105139:53;;105227:9;105214;:22;;105206:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;2442:21:::2;:19;:21::i;:::-;107121:6:::3;;;;;;;;;;;107120:7;107112:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;107166:14;107183:45;107200:15;107217:10;107183:16;:45::i;:::-;:76;;107249:10;107183:76;;;107231:15;107183:76;107166:93;;107272:51;107303:6;107311:11;107272:30;:51::i;:::-;107367:11;107334:21;:29;107356:6;107334:29;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;107391:34;107401:10;107413:11;107391:9;:34::i;:::-;107101:332;2486:20:::2;:18;:20::i;:::-;104525:755:::1;;;;103641:1;;103230:420:::0;106918:515;;;;:::o;101491:555::-;101588:4;101606:20;101629:5;101606:28;;101678:1;101651:29;;:15;:29;;;;:66;;;;;101703:14;101684:33;;:15;:33;;;;101651:66;101647:359;;;99851:42;101756:84;;;101859:14;101892:15;101756:166;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;101734:261;;;101975:4;101957:22;;101734:261;101647:359;102023:15;102016:22;;;101491:555;;;;:::o;100092:59::-;;;;;;;;;;;;;;;;;:::o;69868:193::-;70014:39;70031:4;70037:2;70041:7;70014:39;;;;;;;;;;;;:16;:39::i;:::-;69868:193;;;:::o;108950:80::-;35886:13;:11;:13::i;:::-;109017:5:::1;109010:4;:12;;;;108950:80:::0;:::o;106182:728::-;106314:15;106331:11;103262:10;103249:23;;:9;:23;;;103241:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;103347:9;;103332:11;103316:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;103308:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;103392:14;103409:45;103426:15;103443:10;103409:16;:45::i;:::-;:76;;103475:10;103409:76;;;103457:15;103409:76;103392:93;;103518:1;103504:11;:15;:89;;;;;103570:23;;103555:11;103523:21;:29;103545:6;103523:29;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:70;;103504:89;103496:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;106366:15:::1;106383:11;103746:17;103773:11;103766:4;;:18;;;;:::i;:::-;103746:38;;103795:14;103812:45;103829:15;103846:10;103812:16;:45::i;:::-;:76;;103878:10;103812:76;;;103860:15;103812:76;103795:93;;103899:37;103994:1:::0;103965:18:::1;:26;103984:6;103965:26;;;;;;;;;;;;;;;;103939:23;;:52;;;;:::i;:::-;:56;:115;;104053:1;103939:115;;;104024:18;:26;104043:6;104024:26;;;;;;;;;;;;;;;;103998:23;;:52;;;;:::i;:::-;103939:115;103899:155;;104065:28;104146:1:::0;104114:29:::1;:33;104110:179;;;104220:11;104187:29;:44;;:90;;104266:11;104187:90;;;104234:29;104187:90;104164:113;;104110:179;104349:4;;104326:20;:27;;;;:::i;:::-;104313:9;:41;;;;:::i;:::-;104301:53;;104389:9;104376;:22;;104368:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;2442:21:::2;:19;:21::i;:::-;106428:20:::3;;;;;;;;;;;106420:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;106498:14;106515:45;106532:15;106549:10;106515:16;:45::i;:::-;:76;;106581:10;106515:76;;;106563:15;106515:76;106498:93;;106604:12;106646:6;106629:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;106619:35;;;;;;106604:50;;106673;106692:12;;106673:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106706:10;;106718:4;106673:18;:50::i;:::-;106665:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;106755:45;106780:6;106788:11;106755:24;:45::i;:::-;106844:11;106811:21;:29;106833:6;106811:29;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;106868:34;106878:10;106890:11;106868:9;:34::i;:::-;106409:501;;2486:20:::2;:18;:20::i;:::-;103735:707:::1;;;;103641:1;;103230:420:::0;106182:728;;;;;;:::o;109038:138::-;35886:13;:11;:13::i;:::-;109150:18:::1;109130:17;:38;;;;;;:::i;:::-;;109038:138:::0;:::o;100611:28::-;;;;;;;;;;;;;:::o;100256:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;107793:156::-;35886:13;:11;:13::i;:::-;107917:24:::1;107891:23;:50;;;;107793:156:::0;:::o;93138:528::-;93282:23;93348:22;93373:8;;:15;;93348:40;;93403:34;93461:14;93440:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;93403:73;;93496:9;93491:125;93512:14;93507:1;:19;93491:125;;93568:32;93588:8;;93597:1;93588:11;;;;;;;:::i;:::-;;;;;;;;93568:19;:32::i;:::-;93552:10;93563:1;93552:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;93528:3;;;;;93491:125;;;;93637:10;93630:17;;;;93138:528;;;;:::o;100430:38::-;;;;:::o;100532:25::-;;;;;;;;;;;;;:::o;100334:38::-;;;;:::o;100032:53::-;;;;;;;;;;;;;;;;;:::o;100221:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58210:152::-;58282:7;58325:27;58344:7;58325:18;:27::i;:::-;58302:52;;58210:152;;;:::o;100564:40::-;;;;;;;;;;;;;:::o;108747:100::-;35886:13;:11;:13::i;:::-;108829:10:::1;108817:9;:22;;;;108747:100:::0;:::o;53752:233::-;53824:7;53865:1;53848:19;;:5;:19;;;53844:60;;53876:28;;;;;;;;;;;;;;53844:60;47911:13;53922:18;:25;53941:5;53922:25;;;;;;;;;;;;;;;;:55;53915:62;;53752:233;;;:::o;36675:103::-;35886:13;:11;:13::i;:::-;36740:30:::1;36767:1;36740:18;:30::i;:::-;36675:103::o:0;109503:104::-;35886:13;:11;:13::i;:::-;109588:11:::1;109575:10;:24;;;;109503:104:::0;:::o;109184:106::-;35886:13;:11;:13::i;:::-;109272:10:::1;109260:9;:22;;;;;;:::i;:::-;;109184:106:::0;:::o;97014:900::-;97092:16;97146:19;97180:25;97220:22;97245:16;97255:5;97245:9;:16::i;:::-;97220:41;;97276:25;97318:14;97304:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97276:57;;97348:31;;:::i;:::-;97399:9;97411:15;:13;:15::i;:::-;97399:27;;97394:472;97443:14;97428:11;:29;97394:472;;97495:15;97508:1;97495:12;:15::i;:::-;97483:27;;97533:9;:16;;;97574:8;97529:73;97650:1;97624:28;;:9;:14;;;:28;;;97620:111;;97697:9;:14;;;97677:34;;97620:111;97774:5;97753:26;;:17;:26;;;97749:102;;97830:1;97804:8;97813:13;;;;;;97804:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;97749:102;97394:472;97459:3;;;;;97394:472;;;;97887:8;97880:15;;;;;;;97014:900;;;:::o;36000:87::-;36046:7;36073:6;;;;;;;;;;;36066:13;;36000:87;:::o;56993:104::-;57049:13;57082:7;57075:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56993:104;:::o;94054:2513::-;94197:16;94264:4;94255:5;:13;94251:45;;94277:19;;;;;;;;;;;;;;94251:45;94311:19;94345:17;94365:14;:12;:14::i;:::-;94345:34;;94465:15;:13;:15::i;:::-;94457:5;:23;94453:87;;;94509:15;:13;:15::i;:::-;94501:23;;94453:87;94616:9;94609:4;:16;94605:73;;;94653:9;94646:16;;94605:73;94692:25;94720:16;94730:5;94720:9;:16::i;:::-;94692:44;;94914:4;94906:5;:12;94902:278;;;94939:19;94968:5;94961:4;:12;94939:34;;95010:17;94996:11;:31;94992:111;;;95072:11;95052:31;;94992:111;94920:198;94902:278;;;95163:1;95143:21;;94902:278;95194:25;95236:17;95222:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95194:60;;95294:1;95273:17;:22;95269:78;;95323:8;95316:15;;;;;;;;95269:78;95491:31;95525:26;95545:5;95525:19;:26::i;:::-;95491:60;;95566:25;95811:9;:16;;;95806:92;;95868:9;:14;;;95848:34;;95806:92;95917:9;95929:5;95917:17;;95912:478;95941:4;95936:1;:9;;:45;;;;;95964:17;95949:11;:32;;95936:45;95912:478;;;96019:15;96032:1;96019:12;:15::i;:::-;96007:27;;96057:9;:16;;;96098:8;96053:73;96174:1;96148:28;;:9;:14;;;:28;;;96144:111;;96221:9;:14;;;96201:34;;96144:111;96298:5;96277:26;;:17;:26;;;96273:102;;96354:1;96328:8;96337:13;;;;;;96328:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;96273:102;95912:478;95983:3;;;;;95912:478;;;;96492:11;96482:8;96475:29;96540:8;96533:15;;;;;;;;94054:2513;;;;;;:::o;63866:234::-;64013:8;63961:18;:39;63980:19;:17;:19::i;:::-;63961:39;;;;;;;;;;;;;;;:49;64001:8;63961:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;64073:8;64037:55;;64052:19;:17;:19::i;:::-;64037:55;;;64083:8;64037:55;;;;;;:::i;:::-;;;;;;;;63866:234;;:::o;100296:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;109615:111::-;35886:13;:11;:13::i;:::-;109712:6:::1;109689:20;;:29;;;;;;;;;;;;;;;;;;109615:111:::0;:::o;70659:407::-;70834:31;70847:4;70853:2;70857:7;70834:12;:31::i;:::-;70898:1;70880:2;:14;;;:19;70876:183;;70919:56;70950:4;70956:2;70960:7;70969:5;70919:30;:56::i;:::-;70914:145;;71003:40;;;;;;;;;;;;;;70914:145;70876:183;70659:407;;;;:::o;92551:428::-;92635:21;;:::i;:::-;92669:31;;:::i;:::-;92725:15;:13;:15::i;:::-;92715:7;:25;:54;;;;92755:14;:12;:14::i;:::-;92744:7;:25;;92715:54;92711:103;;;92793:9;92786:16;;;;;92711:103;92836:21;92849:7;92836:12;:21::i;:::-;92824:33;;92872:9;:16;;;92868:65;;;92912:9;92905:16;;;;;92868:65;92950:21;92963:7;92950:12;:21::i;:::-;92943:28;;;92551:428;;;;:::o;108239:500::-;108332:13;108366:17;108374:8;108366:7;:17::i;:::-;108358:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;108464:5;108452:17;;:8;;;;;;;;;;;:17;;;108448:74;;108493:17;108486:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108448:74;108534:28;108565:10;:8;:10::i;:::-;108534:41;;108624:1;108599:14;108593:28;:32;:138;;;;;;;;;;;;;;;;;108665:14;108681:19;:8;:17;:19::i;:::-;108702:9;108648:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;108593:138;108586:145;;;108239:500;;;;:::o;100475:24::-;;;;:::o;108855:87::-;35886:13;:11;:13::i;:::-;108928:6:::1;108917:8;;:17;;;;;;;;;;;;;;;;;;108855:87:::0;:::o;102640:512::-;102735:4;102753:20;102776:5;102753:28;;102825:1;102798:29;;:15;:29;;;;:66;;;;;102850:14;102831:33;;:15;:33;;;;102798:66;102794:318;;;102903:52;102922:15;102940:14;102903:18;:52::i;:::-;:125;;;;102976:52;102995:15;103013:14;102976:18;:52::i;:::-;102903:125;102881:220;;;103081:4;103063:22;;102881:220;102794:318;103129:15;103122:22;;;102640:512;;;;:::o;102054:578::-;102151:4;102169:20;102192:5;102169:28;;102241:1;102214:29;;:15;:29;;;;:66;;;;;102266:14;102247:33;;:15;:33;;;;102214:66;102210:382;;;99951:42;102319:84;;;102422:14;102455:15;102319:189;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;102297:284;;;102561:4;102543:22;;102297:284;102210:382;102609:15;102602:22;;;102054:578;;;;:::o;64257:164::-;64354:4;64378:18;:25;64397:5;64378:25;;;;;;;;;;;;;;;:35;64404:8;64378:35;;;;;;;;;;;;;;;;;;;;;;;;;64371:42;;64257:164;;;;:::o;107957:165::-;108047:11;101429:9;;101414:11;101398:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;101390:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35886:13:::1;:11;:13::i;:::-;108081:33:::2;108091:9;108102:11;108081:9;:33::i;:::-;107957:165:::0;;;:::o;36933:220::-;35886:13;:11;:13::i;:::-;37038:1:::1;37018:22;;:8;:22;;::::0;37014:93:::1;;37092:1;37064:31;;;;;;;;;;;:::i;:::-;;;;;;;;37014:93;37117:28;37136:8;37117:18;:28::i;:::-;36933:220:::0;:::o;107441:156::-;35886:13;:11;:13::i;:::-;107565:24:::1;107539:23;:50;;;;107441:156:::0;:::o;64679:282::-;64744:4;64800:7;64781:15;:13;:15::i;:::-;:26;;:66;;;;;64834:13;;64824:7;:23;64781:66;:153;;;;;64933:1;48687:8;64885:17;:26;64903:7;64885:26;;;;;;;;;;;;:44;:49;64781:153;64761:173;;64679:282;;;:::o;86987:105::-;87047:7;87074:10;87067:17;;86987:105;:::o;36165:166::-;36236:12;:10;:12::i;:::-;36225:23;;:7;:5;:7::i;:::-;:23;;;36221:103;;36299:12;:10;:12::i;:::-;36272:40;;;;;;;;;;;:::i;:::-;;;;;;;;36221:103;36165:166::o;108130:101::-;108195:7;108222:1;108215:8;;108130:101;:::o;59365:1275::-;59432:7;59452:12;59467:7;59452:22;;59535:4;59516:15;:13;:15::i;:::-;:23;59512:1061;;59569:13;;59562:4;:20;59558:1015;;;59607:14;59624:17;:23;59642:4;59624:23;;;;;;;;;;;;59607:40;;59741:1;48687:8;59713:6;:24;:29;59709:845;;60378:113;60395:1;60385:6;:11;60378:113;;60438:17;:25;60456:6;;;;;;;60438:25;;;;;;;;;;;;60429:34;;60378:113;;;60524:6;60517:13;;;;;;59709:845;59584:989;59558:1015;59512:1061;60601:31;;;;;;;;;;;;;;59365:1275;;;;:::o;65842:485::-;65944:27;65973:23;66014:38;66055:15;:24;66071:7;66055:24;;;;;;;;;;;66014:65;;66232:18;66209:41;;66289:19;66283:26;66264:45;;66194:126;65842:485;;;:::o;65070:659::-;65219:11;65384:16;65377:5;65373:28;65364:37;;65544:16;65533:9;65529:32;65516:45;;65694:15;65683:9;65680:30;65672:5;65661:9;65658:20;65655:56;65645:66;;65070:659;;;;;:::o;71728:159::-;;;;;:::o;86296:311::-;86431:7;86451:16;49091:3;86477:19;:41;;86451:68;;49091:3;86545:31;86556:4;86562:2;86566:9;86545:10;:31::i;:::-;86537:40;;:62;;86530:69;;;86296:311;;;;;:::o;61188:450::-;61268:14;61436:16;61429:5;61425:28;61416:37;;61613:5;61599:11;61574:23;61570:41;61567:52;61560:5;61557:63;61547:73;;61188:450;;;;:::o;72552:158::-;;;;;:::o;2522:315::-;1820:1;2651:7;;:18;2647:88;;2693:30;;;;;;;;;;;;;;2647:88;1820:1;2812:7;:17;;;;2522:315::o;2845:212::-;1777:1;3028:7;:21;;;;2845:212::o;105717:457::-;105824:17;105891:24;:43;105916:17;105891:43;;;;;;;;;;;;;;;;105859:29;;:75;;;;:::i;:::-;105844:11;:90;;:208;;106009:24;:43;106034:17;106009:43;;;;;;;;;;;;;;;;105977:29;;:75;;;;:::i;:::-;105844:208;;;105950:11;105844:208;105824:228;;106081:1;106069:9;:13;106065:102;;;106146:9;106099:24;:43;106124:17;106099:43;;;;;;;;;;;;;;;;:56;;;;;;;:::i;:::-;;;;;;;;106065:102;105813:361;105717:457;;:::o;80819:112::-;80896:27;80906:2;80910:8;80896:27;;;;;;;;;;;;:9;:27::i;:::-;80819:112;;:::o;24723:156::-;24814:4;24867;24838:25;24851:5;24858:4;24838:12;:25::i;:::-;:33;24831:40;;24723:156;;;;;:::o;105288:421::-;105389:17;105450:18;:37;105469:17;105450:37;;;;;;;;;;;;;;;;105424:23;;:63;;;;:::i;:::-;105409:11;:78;;:184;;105556:18;:37;105575:17;105556:37;;;;;;;;;;;;;;;;105530:23;;:63;;;;:::i;:::-;105409:184;;;105503:11;105409:184;105389:204;;105622:1;105610:9;:13;105606:96;;;105681:9;105640:18;:37;105659:17;105640:37;;;;;;;;;;;;;;;;:50;;;;;;;:::i;:::-;;;;;;;;105606:96;105378:331;105288:421;;:::o;37313:191::-;37387:16;37406:6;;;;;;;;;;;37387:25;;37432:8;37423:6;;:17;;;;;;;;;;;;;;;;;;37487:8;37456:40;;37477:8;37456:40;;;;;;;;;;;;37376:128;37313:191;:::o;58813:161::-;58881:21;;:::i;:::-;58922:44;58941:17;:24;58959:5;58941:24;;;;;;;;;;;;58922:18;:44::i;:::-;58915:51;;58813:161;;;:::o;52255:103::-;52310:7;52337:13;;52330:20;;52255:103;:::o;73150:716::-;73313:4;73359:2;73334:45;;;73380:19;:17;:19::i;:::-;73401:4;73407:7;73416:5;73334:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;73330:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73634:1;73617:6;:13;:18;73613:235;;73663:40;;;;;;;;;;;;;;73613:235;73806:6;73800:13;73791:6;73787:2;73783:15;73776:38;73330:529;73503:54;;;73493:64;;;:6;:64;;;;73486:71;;;73150:716;;;;;;:::o;58551:166::-;58621:21;;:::i;:::-;58662:47;58681:27;58700:7;58681:18;:27::i;:::-;58662:18;:47::i;:::-;58655:54;;58551:166;;;:::o;109902:119::-;109971:13;110004:9;109997:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109902:119;:::o;20852:718::-;20908:13;20959:14;20996:1;20976:17;20987:5;20976:10;:17::i;:::-;:21;20959:38;;21012:20;21046:6;21035:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21012:41;;21068:11;21197:6;21193:2;21189:15;21181:6;21177:28;21170:35;;21234:290;21241:4;21234:290;;;21266:5;;;;;;;;21408:10;21403:2;21396:5;21392:14;21387:32;21382:3;21374:46;21466:2;21457:11;;;;;;:::i;:::-;;;;;21500:1;21491:5;:10;21234:290;21487:21;21234:290;21545:6;21538:13;;;;;20852:718;;;:::o;34116:98::-;34169:7;34196:10;34189:17;;34116:98;:::o;85997:147::-;86134:6;85997:147;;;;;:::o;80046:689::-;80177:19;80183:2;80187:8;80177:5;:19::i;:::-;80256:1;80238:2;:14;;;:19;80234:483;;80278:11;80292:13;;80278:27;;80324:13;80346:8;80340:3;:14;80324:30;;80373:233;80404:62;80443:1;80447:2;80451:7;;;;;;80460:5;80404:30;:62::i;:::-;80399:167;;80502:40;;;;;;;;;;;;;;80399:167;80601:3;80593:5;:11;80373:233;;80688:3;80671:13;;:20;80667:34;;80693:8;;;80667:34;80259:458;;80234:483;80046:689;;;:::o;25442:296::-;25525:7;25545:20;25568:4;25545:27;;25588:9;25583:118;25607:5;:12;25603:1;:16;25583:118;;;25656:33;25666:12;25680:5;25686:1;25680:8;;;;;;;;:::i;:::-;;;;;;;;25656:9;:33::i;:::-;25641:48;;25621:3;;;;;;;25583:118;;;;25718:12;25711:19;;;25442:296;;;;:::o;60739:366::-;60805:31;;:::i;:::-;60882:6;60849:9;:14;;:41;;;;;;;;;;;48570:3;60935:6;:33;;60901:9;:24;;:68;;;;;;;;;;;61027:1;48687:8;60999:6;:24;:29;;60980:9;:16;;:48;;;;;;;;;;;49091:3;61068:6;:28;;61039:9;:19;;:58;;;;;;;;;;;60739:366;;;:::o;17256:948::-;17309:7;17329:14;17346:1;17329:18;;17396:8;17387:5;:17;17383:106;;17434:8;17425:17;;;;;;:::i;:::-;;;;;17471:2;17461:12;;;;17383:106;17516:8;17507:5;:17;17503:106;;17554:8;17545:17;;;;;;:::i;:::-;;;;;17591:2;17581:12;;;;17503:106;17636:8;17627:5;:17;17623:106;;17674:8;17665:17;;;;;;:::i;:::-;;;;;17711:2;17701:12;;;;17623:106;17756:7;17747:5;:16;17743:103;;17793:7;17784:16;;;;;;:::i;:::-;;;;;17829:1;17819:11;;;;17743:103;17873:7;17864:5;:16;17860:103;;17910:7;17901:16;;;;;;:::i;:::-;;;;;17946:1;17936:11;;;;17860:103;17990:7;17981:5;:16;17977:103;;18027:7;18018:16;;;;;;:::i;:::-;;;;;18063:1;18053:11;;;;17977:103;18107:7;18098:5;:16;18094:68;;18145:1;18135:11;;;;18094:68;18190:6;18183:13;;;17256:948;;;:::o;74328:2966::-;74401:20;74424:13;;74401:36;;74464:1;74452:8;:13;74448:44;;74474:18;;;;;;;;;;;;;;74448:44;74505:61;74535:1;74539:2;74543:12;74557:8;74505:21;:61::i;:::-;75049:1;48049:2;75019:1;:26;;75018:32;75006:8;:45;74980:18;:22;74999:2;74980:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;75328:139;75365:2;75419:33;75442:1;75446:2;75450:1;75419:14;:33::i;:::-;75386:30;75407:8;75386:20;:30::i;:::-;:66;75328:18;:139::i;:::-;75294:17;:31;75312:12;75294:31;;;;;;;;;;;:173;;;;75484:16;75515:11;75544:8;75529:12;:23;75515:37;;76065:16;76061:2;76057:25;76045:37;;76437:12;76397:8;76356:1;76294:25;76235:1;76174;76147:335;76808:1;76794:12;76790:20;76748:346;76849:3;76840:7;76837:16;76748:346;;77067:7;77057:8;77054:1;77027:25;77024:1;77021;77016:59;76902:1;76893:7;76889:15;76878:26;;76748:346;;;76752:77;77139:1;77127:8;:13;77123:45;;77149:19;;;;;;;;;;;;;;77123:45;77201:3;77185:13;:19;;;;74754:2462;;77226:60;77255:1;77259:2;77263:12;77277:8;77226:20;:60::i;:::-;74390:2904;74328:2966;;:::o;32872:149::-;32935:7;32966:1;32962;:5;:51;;32993:20;33008:1;33011;32993:14;:20::i;:::-;32962:51;;;32970:20;32985:1;32988;32970:14;:20::i;:::-;32962:51;32955:58;;32872:149;;;;:::o;61740:324::-;61810:14;62043:1;62033:8;62030:15;62004:24;62000:46;61990:56;;61740:324;;;:::o;33146:268::-;33214:13;33321:1;33315:4;33308:15;33350:1;33344:4;33337:15;33391:4;33385;33375:21;33366:30;;33146:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:139::-;1887:6;1882:3;1877;1871:23;1928:1;1919:6;1914:3;1910:16;1903:27;1798:139;;;:::o;1943:102::-;1984:6;2035:2;2031:7;2026:2;2019:5;2015:14;2011:28;2001:38;;1943:102;;;:::o;2051:377::-;2139:3;2167:39;2200:5;2167:39;:::i;:::-;2222:71;2286:6;2281:3;2222:71;:::i;:::-;2215:78;;2302:65;2360:6;2355:3;2348:4;2341:5;2337:16;2302:65;:::i;:::-;2392:29;2414:6;2392:29;:::i;:::-;2387:3;2383:39;2376:46;;2143:285;2051:377;;;;:::o;2434:313::-;2547:4;2585:2;2574:9;2570:18;2562:26;;2634:9;2628:4;2624:20;2620:1;2609:9;2605:17;2598:47;2662:78;2735:4;2726:6;2662:78;:::i;:::-;2654:86;;2434:313;;;;:::o;2753:77::-;2790:7;2819:5;2808:16;;2753:77;;;:::o;2836:122::-;2909:24;2927:5;2909:24;:::i;:::-;2902:5;2899:35;2889:63;;2948:1;2945;2938:12;2889:63;2836:122;:::o;2964:139::-;3010:5;3048:6;3035:20;3026:29;;3064:33;3091:5;3064:33;:::i;:::-;2964:139;;;;:::o;3109:329::-;3168:6;3217:2;3205:9;3196:7;3192:23;3188:32;3185:119;;;3223:79;;:::i;:::-;3185:119;3343:1;3368:53;3413:7;3404:6;3393:9;3389:22;3368:53;:::i;:::-;3358:63;;3314:117;3109:329;;;;:::o;3444:126::-;3481:7;3521:42;3514:5;3510:54;3499:65;;3444:126;;;:::o;3576:96::-;3613:7;3642:24;3660:5;3642:24;:::i;:::-;3631:35;;3576:96;;;:::o;3678:118::-;3765:24;3783:5;3765:24;:::i;:::-;3760:3;3753:37;3678:118;;:::o;3802:222::-;3895:4;3933:2;3922:9;3918:18;3910:26;;3946:71;4014:1;4003:9;3999:17;3990:6;3946:71;:::i;:::-;3802:222;;;;:::o;4030:122::-;4103:24;4121:5;4103:24;:::i;:::-;4096:5;4093:35;4083:63;;4142:1;4139;4132:12;4083:63;4030:122;:::o;4158:139::-;4204:5;4242:6;4229:20;4220:29;;4258:33;4285:5;4258:33;:::i;:::-;4158:139;;;;:::o;4303:474::-;4371:6;4379;4428:2;4416:9;4407:7;4403:23;4399:32;4396:119;;;4434:79;;:::i;:::-;4396:119;4554:1;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4525:117;4681:2;4707:53;4752:7;4743:6;4732:9;4728:22;4707:53;:::i;:::-;4697:63;;4652:118;4303:474;;;;;:::o;4783:118::-;4870:24;4888:5;4870:24;:::i;:::-;4865:3;4858:37;4783:118;;:::o;4907:222::-;5000:4;5038:2;5027:9;5023:18;5015:26;;5051:71;5119:1;5108:9;5104:17;5095:6;5051:71;:::i;:::-;4907:222;;;;:::o;5135:117::-;5244:1;5241;5234:12;5258:117;5367:1;5364;5357:12;5381:180;5429:77;5426:1;5419:88;5526:4;5523:1;5516:15;5550:4;5547:1;5540:15;5567:281;5650:27;5672:4;5650:27;:::i;:::-;5642:6;5638:40;5780:6;5768:10;5765:22;5744:18;5732:10;5729:34;5726:62;5723:88;;;5791:18;;:::i;:::-;5723:88;5831:10;5827:2;5820:22;5610:238;5567:281;;:::o;5854:129::-;5888:6;5915:20;;:::i;:::-;5905:30;;5944:33;5972:4;5964:6;5944:33;:::i;:::-;5854:129;;;:::o;5989:308::-;6051:4;6141:18;6133:6;6130:30;6127:56;;;6163:18;;:::i;:::-;6127:56;6201:29;6223:6;6201:29;:::i;:::-;6193:37;;6285:4;6279;6275:15;6267:23;;5989:308;;;:::o;6303:148::-;6401:6;6396:3;6391;6378:30;6442:1;6433:6;6428:3;6424:16;6417:27;6303:148;;;:::o;6457:425::-;6535:5;6560:66;6576:49;6618:6;6576:49;:::i;:::-;6560:66;:::i;:::-;6551:75;;6649:6;6642:5;6635:21;6687:4;6680:5;6676:16;6725:3;6716:6;6711:3;6707:16;6704:25;6701:112;;;6732:79;;:::i;:::-;6701:112;6822:54;6869:6;6864:3;6859;6822:54;:::i;:::-;6541:341;6457:425;;;;;:::o;6902:340::-;6958:5;7007:3;7000:4;6992:6;6988:17;6984:27;6974:122;;7015:79;;:::i;:::-;6974:122;7132:6;7119:20;7157:79;7232:3;7224:6;7217:4;7209:6;7205:17;7157:79;:::i;:::-;7148:88;;6964:278;6902:340;;;;:::o;7248:509::-;7317:6;7366:2;7354:9;7345:7;7341:23;7337:32;7334:119;;;7372:79;;:::i;:::-;7334:119;7520:1;7509:9;7505:17;7492:31;7550:18;7542:6;7539:30;7536:117;;;7572:79;;:::i;:::-;7536:117;7677:63;7732:7;7723:6;7712:9;7708:22;7677:63;:::i;:::-;7667:73;;7463:287;7248:509;;;;:::o;7763:116::-;7833:21;7848:5;7833:21;:::i;:::-;7826:5;7823:32;7813:60;;7869:1;7866;7859:12;7813:60;7763:116;:::o;7885:133::-;7928:5;7966:6;7953:20;7944:29;;7982:30;8006:5;7982:30;:::i;:::-;7885:133;;;;:::o;8024:323::-;8080:6;8129:2;8117:9;8108:7;8104:23;8100:32;8097:119;;;8135:79;;:::i;:::-;8097:119;8255:1;8280:50;8322:7;8313:6;8302:9;8298:22;8280:50;:::i;:::-;8270:60;;8226:114;8024:323;;;;:::o;8353:619::-;8430:6;8438;8446;8495:2;8483:9;8474:7;8470:23;8466:32;8463:119;;;8501:79;;:::i;:::-;8463:119;8621:1;8646:53;8691:7;8682:6;8671:9;8667:22;8646:53;:::i;:::-;8636:63;;8592:117;8748:2;8774:53;8819:7;8810:6;8799:9;8795:22;8774:53;:::i;:::-;8764:63;;8719:118;8876:2;8902:53;8947:7;8938:6;8927:9;8923:22;8902:53;:::i;:::-;8892:63;;8847:118;8353:619;;;;;:::o;8978:329::-;9037:6;9086:2;9074:9;9065:7;9061:23;9057:32;9054:119;;;9092:79;;:::i;:::-;9054:119;9212:1;9237:53;9282:7;9273:6;9262:9;9258:22;9237:53;:::i;:::-;9227:63;;9183:117;8978:329;;;;:::o;9313:77::-;9350:7;9379:5;9368:16;;9313:77;;;:::o;9396:118::-;9483:24;9501:5;9483:24;:::i;:::-;9478:3;9471:37;9396:118;;:::o;9520:222::-;9613:4;9651:2;9640:9;9636:18;9628:26;;9664:71;9732:1;9721:9;9717:17;9708:6;9664:71;:::i;:::-;9520:222;;;;:::o;9748:474::-;9816:6;9824;9873:2;9861:9;9852:7;9848:23;9844:32;9841:119;;;9879:79;;:::i;:::-;9841:119;9999:1;10024:53;10069:7;10060:6;10049:9;10045:22;10024:53;:::i;:::-;10014:63;;9970:117;10126:2;10152:53;10197:7;10188:6;10177:9;10173:22;10152:53;:::i;:::-;10142:63;;10097:118;9748:474;;;;;:::o;10228:117::-;10337:1;10334;10327:12;10351:117;10460:1;10457;10450:12;10491:568;10564:8;10574:6;10624:3;10617:4;10609:6;10605:17;10601:27;10591:122;;10632:79;;:::i;:::-;10591:122;10745:6;10732:20;10722:30;;10775:18;10767:6;10764:30;10761:117;;;10797:79;;:::i;:::-;10761:117;10911:4;10903:6;10899:17;10887:29;;10965:3;10957:4;10949:6;10945:17;10935:8;10931:32;10928:41;10925:128;;;10972:79;;:::i;:::-;10925:128;10491:568;;;;;:::o;11065:849::-;11169:6;11177;11185;11193;11242:2;11230:9;11221:7;11217:23;11213:32;11210:119;;;11248:79;;:::i;:::-;11210:119;11368:1;11393:53;11438:7;11429:6;11418:9;11414:22;11393:53;:::i;:::-;11383:63;;11339:117;11495:2;11521:53;11566:7;11557:6;11546:9;11542:22;11521:53;:::i;:::-;11511:63;;11466:118;11651:2;11640:9;11636:18;11623:32;11682:18;11674:6;11671:30;11668:117;;;11704:79;;:::i;:::-;11668:117;11817:80;11889:7;11880:6;11869:9;11865:22;11817:80;:::i;:::-;11799:98;;;;11594:313;11065:849;;;;;;;:::o;11937:568::-;12010:8;12020:6;12070:3;12063:4;12055:6;12051:17;12047:27;12037:122;;12078:79;;:::i;:::-;12037:122;12191:6;12178:20;12168:30;;12221:18;12213:6;12210:30;12207:117;;;12243:79;;:::i;:::-;12207:117;12357:4;12349:6;12345:17;12333:29;;12411:3;12403:4;12395:6;12391:17;12381:8;12377:32;12374:41;12371:128;;;12418:79;;:::i;:::-;12371:128;11937:568;;;;;:::o;12511:559::-;12597:6;12605;12654:2;12642:9;12633:7;12629:23;12625:32;12622:119;;;12660:79;;:::i;:::-;12622:119;12808:1;12797:9;12793:17;12780:31;12838:18;12830:6;12827:30;12824:117;;;12860:79;;:::i;:::-;12824:117;12973:80;13045:7;13036:6;13025:9;13021:22;12973:80;:::i;:::-;12955:98;;;;12751:312;12511:559;;;;;:::o;13076:146::-;13175:6;13209:5;13203:12;13193:22;;13076:146;;;:::o;13228:216::-;13359:11;13393:6;13388:3;13381:19;13433:4;13428:3;13424:14;13409:29;;13228:216;;;;:::o;13450:164::-;13549:4;13572:3;13564:11;;13602:4;13597:3;13593:14;13585:22;;13450:164;;;:::o;13620:108::-;13697:24;13715:5;13697:24;:::i;:::-;13692:3;13685:37;13620:108;;:::o;13734:101::-;13770:7;13810:18;13803:5;13799:30;13788:41;;13734:101;;;:::o;13841:105::-;13916:23;13933:5;13916:23;:::i;:::-;13911:3;13904:36;13841:105;;:::o;13952:99::-;14023:21;14038:5;14023:21;:::i;:::-;14018:3;14011:34;13952:99;;:::o;14057:91::-;14093:7;14133:8;14126:5;14122:20;14111:31;;14057:91;;;:::o;14154:105::-;14229:23;14246:5;14229:23;:::i;:::-;14224:3;14217:36;14154:105;;:::o;14337:866::-;14488:4;14483:3;14479:14;14575:4;14568:5;14564:16;14558:23;14594:63;14651:4;14646:3;14642:14;14628:12;14594:63;:::i;:::-;14503:164;14759:4;14752:5;14748:16;14742:23;14778:61;14833:4;14828:3;14824:14;14810:12;14778:61;:::i;:::-;14677:172;14933:4;14926:5;14922:16;14916:23;14952:57;15003:4;14998:3;14994:14;14980:12;14952:57;:::i;:::-;14859:160;15106:4;15099:5;15095:16;15089:23;15125:61;15180:4;15175:3;15171:14;15157:12;15125:61;:::i;:::-;15029:167;14457:746;14337:866;;:::o;15209:307::-;15342:10;15363:110;15469:3;15461:6;15363:110;:::i;:::-;15505:4;15500:3;15496:14;15482:28;;15209:307;;;;:::o;15522:145::-;15624:4;15656;15651:3;15647:14;15639:22;;15522:145;;;:::o;15749:988::-;15932:3;15961:86;16041:5;15961:86;:::i;:::-;16063:118;16174:6;16169:3;16063:118;:::i;:::-;16056:125;;16205:88;16287:5;16205:88;:::i;:::-;16316:7;16347:1;16332:380;16357:6;16354:1;16351:13;16332:380;;;16433:6;16427:13;16460:127;16583:3;16568:13;16460:127;:::i;:::-;16453:134;;16610:92;16695:6;16610:92;:::i;:::-;16600:102;;16392:320;16379:1;16376;16372:9;16367:14;;16332:380;;;16336:14;16728:3;16721:10;;15937:800;;;15749:988;;;;:::o;16743:501::-;16950:4;16988:2;16977:9;16973:18;16965:26;;17037:9;17031:4;17027:20;17023:1;17012:9;17008:17;17001:47;17065:172;17232:4;17223:6;17065:172;:::i;:::-;17057:180;;16743:501;;;;:::o;17250:122::-;17323:24;17341:5;17323:24;:::i;:::-;17316:5;17313:35;17303:63;;17362:1;17359;17352:12;17303:63;17250:122;:::o;17378:139::-;17424:5;17462:6;17449:20;17440:29;;17478:33;17505:5;17478:33;:::i;:::-;17378:139;;;;:::o;17523:329::-;17582:6;17631:2;17619:9;17610:7;17606:23;17602:32;17599:119;;;17637:79;;:::i;:::-;17599:119;17757:1;17782:53;17827:7;17818:6;17807:9;17803:22;17782:53;:::i;:::-;17772:63;;17728:117;17523:329;;;;:::o;17858:114::-;17925:6;17959:5;17953:12;17943:22;;17858:114;;;:::o;17978:184::-;18077:11;18111:6;18106:3;18099:19;18151:4;18146:3;18142:14;18127:29;;17978:184;;;;:::o;18168:132::-;18235:4;18258:3;18250:11;;18288:4;18283:3;18279:14;18271:22;;18168:132;;;:::o;18306:108::-;18383:24;18401:5;18383:24;:::i;:::-;18378:3;18371:37;18306:108;;:::o;18420:179::-;18489:10;18510:46;18552:3;18544:6;18510:46;:::i;:::-;18588:4;18583:3;18579:14;18565:28;;18420:179;;;;:::o;18605:113::-;18675:4;18707;18702:3;18698:14;18690:22;;18605:113;;;:::o;18754:732::-;18873:3;18902:54;18950:5;18902:54;:::i;:::-;18972:86;19051:6;19046:3;18972:86;:::i;:::-;18965:93;;19082:56;19132:5;19082:56;:::i;:::-;19161:7;19192:1;19177:284;19202:6;19199:1;19196:13;19177:284;;;19278:6;19272:13;19305:63;19364:3;19349:13;19305:63;:::i;:::-;19298:70;;19391:60;19444:6;19391:60;:::i;:::-;19381:70;;19237:224;19224:1;19221;19217:9;19212:14;;19177:284;;;19181:14;19477:3;19470:10;;18878:608;;;18754:732;;;;:::o;19492:373::-;19635:4;19673:2;19662:9;19658:18;19650:26;;19722:9;19716:4;19712:20;19708:1;19697:9;19693:17;19686:47;19750:108;19853:4;19844:6;19750:108;:::i;:::-;19742:116;;19492:373;;;;:::o;19871:619::-;19948:6;19956;19964;20013:2;20001:9;19992:7;19988:23;19984:32;19981:119;;;20019:79;;:::i;:::-;19981:119;20139:1;20164:53;20209:7;20200:6;20189:9;20185:22;20164:53;:::i;:::-;20154:63;;20110:117;20266:2;20292:53;20337:7;20328:6;20317:9;20313:22;20292:53;:::i;:::-;20282:63;;20237:118;20394:2;20420:53;20465:7;20456:6;20445:9;20441:22;20420:53;:::i;:::-;20410:63;;20365:118;19871:619;;;;;:::o;20496:468::-;20561:6;20569;20618:2;20606:9;20597:7;20593:23;20589:32;20586:119;;;20624:79;;:::i;:::-;20586:119;20744:1;20769:53;20814:7;20805:6;20794:9;20790:22;20769:53;:::i;:::-;20759:63;;20715:117;20871:2;20897:50;20939:7;20930:6;20919:9;20915:22;20897:50;:::i;:::-;20887:60;;20842:115;20496:468;;;;;:::o;20970:307::-;21031:4;21121:18;21113:6;21110:30;21107:56;;;21143:18;;:::i;:::-;21107:56;21181:29;21203:6;21181:29;:::i;:::-;21173:37;;21265:4;21259;21255:15;21247:23;;20970:307;;;:::o;21283:423::-;21360:5;21385:65;21401:48;21442:6;21401:48;:::i;:::-;21385:65;:::i;:::-;21376:74;;21473:6;21466:5;21459:21;21511:4;21504:5;21500:16;21549:3;21540:6;21535:3;21531:16;21528:25;21525:112;;;21556:79;;:::i;:::-;21525:112;21646:54;21693:6;21688:3;21683;21646:54;:::i;:::-;21366:340;21283:423;;;;;:::o;21725:338::-;21780:5;21829:3;21822:4;21814:6;21810:17;21806:27;21796:122;;21837:79;;:::i;:::-;21796:122;21954:6;21941:20;21979:78;22053:3;22045:6;22038:4;22030:6;22026:17;21979:78;:::i;:::-;21970:87;;21786:277;21725:338;;;;:::o;22069:943::-;22164:6;22172;22180;22188;22237:3;22225:9;22216:7;22212:23;22208:33;22205:120;;;22244:79;;:::i;:::-;22205:120;22364:1;22389:53;22434:7;22425:6;22414:9;22410:22;22389:53;:::i;:::-;22379:63;;22335:117;22491:2;22517:53;22562:7;22553:6;22542:9;22538:22;22517:53;:::i;:::-;22507:63;;22462:118;22619:2;22645:53;22690:7;22681:6;22670:9;22666:22;22645:53;:::i;:::-;22635:63;;22590:118;22775:2;22764:9;22760:18;22747:32;22806:18;22798:6;22795:30;22792:117;;;22828:79;;:::i;:::-;22792:117;22933:62;22987:7;22978:6;22967:9;22963:22;22933:62;:::i;:::-;22923:72;;22718:287;22069:943;;;;;;;:::o;23090:876::-;23251:4;23246:3;23242:14;23338:4;23331:5;23327:16;23321:23;23357:63;23414:4;23409:3;23405:14;23391:12;23357:63;:::i;:::-;23266:164;23522:4;23515:5;23511:16;23505:23;23541:61;23596:4;23591:3;23587:14;23573:12;23541:61;:::i;:::-;23440:172;23696:4;23689:5;23685:16;23679:23;23715:57;23766:4;23761:3;23757:14;23743:12;23715:57;:::i;:::-;23622:160;23869:4;23862:5;23858:16;23852:23;23888:61;23943:4;23938:3;23934:14;23920:12;23888:61;:::i;:::-;23792:167;23220:746;23090:876;;:::o;23972:351::-;24129:4;24167:3;24156:9;24152:19;24144:27;;24181:135;24313:1;24302:9;24298:17;24289:6;24181:135;:::i;:::-;23972:351;;;;:::o;24329:474::-;24397:6;24405;24454:2;24442:9;24433:7;24429:23;24425:32;24422:119;;;24460:79;;:::i;:::-;24422:119;24580:1;24605:53;24650:7;24641:6;24630:9;24626:22;24605:53;:::i;:::-;24595:63;;24551:117;24707:2;24733:53;24778:7;24769:6;24758:9;24754:22;24733:53;:::i;:::-;24723:63;;24678:118;24329:474;;;;;:::o;24809:180::-;24857:77;24854:1;24847:88;24954:4;24951:1;24944:15;24978:4;24975:1;24968:15;24995:320;25039:6;25076:1;25070:4;25066:12;25056:22;;25123:1;25117:4;25113:12;25144:18;25134:81;;25200:4;25192:6;25188:17;25178:27;;25134:81;25262:2;25254:6;25251:14;25231:18;25228:38;25225:84;;25281:18;;:::i;:::-;25225:84;25046:269;24995:320;;;:::o;25321:141::-;25370:4;25393:3;25385:11;;25416:3;25413:1;25406:14;25450:4;25447:1;25437:18;25429:26;;25321:141;;;:::o;25468:93::-;25505:6;25552:2;25547;25540:5;25536:14;25532:23;25522:33;;25468:93;;;:::o;25567:107::-;25611:8;25661:5;25655:4;25651:16;25630:37;;25567:107;;;;:::o;25680:393::-;25749:6;25799:1;25787:10;25783:18;25822:97;25852:66;25841:9;25822:97;:::i;:::-;25940:39;25970:8;25959:9;25940:39;:::i;:::-;25928:51;;26012:4;26008:9;26001:5;25997:21;25988:30;;26061:4;26051:8;26047:19;26040:5;26037:30;26027:40;;25756:317;;25680:393;;;;;:::o;26079:60::-;26107:3;26128:5;26121:12;;26079:60;;;:::o;26145:142::-;26195:9;26228:53;26246:34;26255:24;26273:5;26255:24;:::i;:::-;26246:34;:::i;:::-;26228:53;:::i;:::-;26215:66;;26145:142;;;:::o;26293:75::-;26336:3;26357:5;26350:12;;26293:75;;;:::o;26374:269::-;26484:39;26515:7;26484:39;:::i;:::-;26545:91;26594:41;26618:16;26594:41;:::i;:::-;26586:6;26579:4;26573:11;26545:91;:::i;:::-;26539:4;26532:105;26450:193;26374:269;;;:::o;26649:73::-;26694:3;26649:73;:::o;26728:189::-;26805:32;;:::i;:::-;26846:65;26904:6;26896;26890:4;26846:65;:::i;:::-;26781:136;26728:189;;:::o;26923:186::-;26983:120;27000:3;26993:5;26990:14;26983:120;;;27054:39;27091:1;27084:5;27054:39;:::i;:::-;27027:1;27020:5;27016:13;27007:22;;26983:120;;;26923:186;;:::o;27115:543::-;27216:2;27211:3;27208:11;27205:446;;;27250:38;27282:5;27250:38;:::i;:::-;27334:29;27352:10;27334:29;:::i;:::-;27324:8;27320:44;27517:2;27505:10;27502:18;27499:49;;;27538:8;27523:23;;27499:49;27561:80;27617:22;27635:3;27617:22;:::i;:::-;27607:8;27603:37;27590:11;27561:80;:::i;:::-;27220:431;;27205:446;27115:543;;;:::o;27664:117::-;27718:8;27768:5;27762:4;27758:16;27737:37;;27664:117;;;;:::o;27787:169::-;27831:6;27864:51;27912:1;27908:6;27900:5;27897:1;27893:13;27864:51;:::i;:::-;27860:56;27945:4;27939;27935:15;27925:25;;27838:118;27787:169;;;;:::o;27961:295::-;28037:4;28183:29;28208:3;28202:4;28183:29;:::i;:::-;28175:37;;28245:3;28242:1;28238:11;28232:4;28229:21;28221:29;;27961:295;;;;:::o;28261:1395::-;28378:37;28411:3;28378:37;:::i;:::-;28480:18;28472:6;28469:30;28466:56;;;28502:18;;:::i;:::-;28466:56;28546:38;28578:4;28572:11;28546:38;:::i;:::-;28631:67;28691:6;28683;28677:4;28631:67;:::i;:::-;28725:1;28749:4;28736:17;;28781:2;28773:6;28770:14;28798:1;28793:618;;;;29455:1;29472:6;29469:77;;;29521:9;29516:3;29512:19;29506:26;29497:35;;29469:77;29572:67;29632:6;29625:5;29572:67;:::i;:::-;29566:4;29559:81;29428:222;28763:887;;28793:618;28845:4;28841:9;28833:6;28829:22;28879:37;28911:4;28879:37;:::i;:::-;28938:1;28952:208;28966:7;28963:1;28960:14;28952:208;;;29045:9;29040:3;29036:19;29030:26;29022:6;29015:42;29096:1;29088:6;29084:14;29074:24;;29143:2;29132:9;29128:18;29115:31;;28989:4;28986:1;28982:12;28977:17;;28952:208;;;29188:6;29179:7;29176:19;29173:179;;;29246:9;29241:3;29237:19;29231:26;29289:48;29331:4;29323:6;29319:17;29308:9;29289:48;:::i;:::-;29281:6;29274:64;29196:156;29173:179;29398:1;29394;29386:6;29382:14;29378:22;29372:4;29365:36;28800:611;;;28763:887;;28353:1303;;;28261:1395;;:::o;29662:147::-;29763:11;29800:3;29785:18;;29662:147;;;;:::o;29815:114::-;;:::o;29935:398::-;30094:3;30115:83;30196:1;30191:3;30115:83;:::i;:::-;30108:90;;30207:93;30296:3;30207:93;:::i;:::-;30325:1;30320:3;30316:11;30309:18;;29935:398;;;:::o;30339:379::-;30523:3;30545:147;30688:3;30545:147;:::i;:::-;30538:154;;30709:3;30702:10;;30339:379;;;:::o;30724:170::-;30864:22;30860:1;30852:6;30848:14;30841:46;30724:170;:::o;30900:366::-;31042:3;31063:67;31127:2;31122:3;31063:67;:::i;:::-;31056:74;;31139:93;31228:3;31139:93;:::i;:::-;31257:2;31252:3;31248:12;31241:19;;30900:366;;;:::o;31272:419::-;31438:4;31476:2;31465:9;31461:18;31453:26;;31525:9;31519:4;31515:20;31511:1;31500:9;31496:17;31489:47;31553:131;31679:4;31553:131;:::i;:::-;31545:139;;31272:419;;;:::o;31697:180::-;31745:77;31742:1;31735:88;31842:4;31839:1;31832:15;31866:4;31863:1;31856:15;31883:191;31923:3;31942:20;31960:1;31942:20;:::i;:::-;31937:25;;31976:20;31994:1;31976:20;:::i;:::-;31971:25;;32019:1;32016;32012:9;32005:16;;32040:3;32037:1;32034:10;32031:36;;;32047:18;;:::i;:::-;32031:36;31883:191;;;;:::o;32080:170::-;32220:22;32216:1;32208:6;32204:14;32197:46;32080:170;:::o;32256:366::-;32398:3;32419:67;32483:2;32478:3;32419:67;:::i;:::-;32412:74;;32495:93;32584:3;32495:93;:::i;:::-;32613:2;32608:3;32604:12;32597:19;;32256:366;;;:::o;32628:419::-;32794:4;32832:2;32821:9;32817:18;32809:26;;32881:9;32875:4;32871:20;32867:1;32856:9;32852:17;32845:47;32909:131;33035:4;32909:131;:::i;:::-;32901:139;;32628:419;;;:::o;33053:180::-;33193:32;33189:1;33181:6;33177:14;33170:56;33053:180;:::o;33239:366::-;33381:3;33402:67;33466:2;33461:3;33402:67;:::i;:::-;33395:74;;33478:93;33567:3;33478:93;:::i;:::-;33596:2;33591:3;33587:12;33580:19;;33239:366;;;:::o;33611:419::-;33777:4;33815:2;33804:9;33800:18;33792:26;;33864:9;33858:4;33854:20;33850:1;33839:9;33835:17;33828:47;33892:131;34018:4;33892:131;:::i;:::-;33884:139;;33611:419;;;:::o;34036:410::-;34076:7;34099:20;34117:1;34099:20;:::i;:::-;34094:25;;34133:20;34151:1;34133:20;:::i;:::-;34128:25;;34188:1;34185;34181:9;34210:30;34228:11;34210:30;:::i;:::-;34199:41;;34389:1;34380:7;34376:15;34373:1;34370:22;34350:1;34343:9;34323:83;34300:139;;34419:18;;:::i;:::-;34300:139;34084:362;34036:410;;;;:::o;34452:194::-;34492:4;34512:20;34530:1;34512:20;:::i;:::-;34507:25;;34546:20;34564:1;34546:20;:::i;:::-;34541:25;;34590:1;34587;34583:9;34575:17;;34614:1;34608:4;34605:11;34602:37;;;34619:18;;:::i;:::-;34602:37;34452:194;;;;:::o;34652:169::-;34792:21;34788:1;34780:6;34776:14;34769:45;34652:169;:::o;34827:366::-;34969:3;34990:67;35054:2;35049:3;34990:67;:::i;:::-;34983:74;;35066:93;35155:3;35066:93;:::i;:::-;35184:2;35179:3;35175:12;35168:19;;34827:366;;;:::o;35199:419::-;35365:4;35403:2;35392:9;35388:18;35380:26;;35452:9;35446:4;35442:20;35438:1;35427:9;35423:17;35416:47;35480:131;35606:4;35480:131;:::i;:::-;35472:139;;35199:419;;;:::o;35624:173::-;35764:25;35760:1;35752:6;35748:14;35741:49;35624:173;:::o;35803:366::-;35945:3;35966:67;36030:2;36025:3;35966:67;:::i;:::-;35959:74;;36042:93;36131:3;36042:93;:::i;:::-;36160:2;36155:3;36151:12;36144:19;;35803:366;;;:::o;36175:419::-;36341:4;36379:2;36368:9;36364:18;36356:26;;36428:9;36422:4;36418:20;36414:1;36403:9;36399:17;36392:47;36456:131;36582:4;36456:131;:::i;:::-;36448:139;;36175:419;;;:::o;36600:332::-;36721:4;36759:2;36748:9;36744:18;36736:26;;36772:71;36840:1;36829:9;36825:17;36816:6;36772:71;:::i;:::-;36853:72;36921:2;36910:9;36906:18;36897:6;36853:72;:::i;:::-;36600:332;;;;;:::o;36938:137::-;36992:5;37023:6;37017:13;37008:22;;37039:30;37063:5;37039:30;:::i;:::-;36938:137;;;;:::o;37081:345::-;37148:6;37197:2;37185:9;37176:7;37172:23;37168:32;37165:119;;;37203:79;;:::i;:::-;37165:119;37323:1;37348:61;37401:7;37392:6;37381:9;37377:22;37348:61;:::i;:::-;37338:71;;37294:125;37081:345;;;;:::o;37432:221::-;37572:34;37568:1;37560:6;37556:14;37549:58;37641:4;37636:2;37628:6;37624:15;37617:29;37432:221;:::o;37659:366::-;37801:3;37822:67;37886:2;37881:3;37822:67;:::i;:::-;37815:74;;37898:93;37987:3;37898:93;:::i;:::-;38016:2;38011:3;38007:12;38000:19;;37659:366;;;:::o;38031:419::-;38197:4;38235:2;38224:9;38220:18;38212:26;;38284:9;38278:4;38274:20;38270:1;38259:9;38255:17;38248:47;38312:131;38438:4;38312:131;:::i;:::-;38304:139;;38031:419;;;:::o;38456:94::-;38489:8;38537:5;38533:2;38529:14;38508:35;;38456:94;;;:::o;38556:::-;38595:7;38624:20;38638:5;38624:20;:::i;:::-;38613:31;;38556:94;;;:::o;38656:100::-;38695:7;38724:26;38744:5;38724:26;:::i;:::-;38713:37;;38656:100;;;:::o;38762:157::-;38867:45;38887:24;38905:5;38887:24;:::i;:::-;38867:45;:::i;:::-;38862:3;38855:58;38762:157;;:::o;38925:256::-;39037:3;39052:75;39123:3;39114:6;39052:75;:::i;:::-;39152:2;39147:3;39143:12;39136:19;;39172:3;39165:10;;38925:256;;;;:::o;39187:164::-;39327:16;39323:1;39315:6;39311:14;39304:40;39187:164;:::o;39357:366::-;39499:3;39520:67;39584:2;39579:3;39520:67;:::i;:::-;39513:74;;39596:93;39685:3;39596:93;:::i;:::-;39714:2;39709:3;39705:12;39698:19;;39357:366;;;:::o;39729:419::-;39895:4;39933:2;39922:9;39918:18;39910:26;;39982:9;39976:4;39972:20;39968:1;39957:9;39953:17;39946:47;40010:131;40136:4;40010:131;:::i;:::-;40002:139;;39729:419;;;:::o;40154:180::-;40202:77;40199:1;40192:88;40299:4;40296:1;40289:15;40323:4;40320:1;40313:15;40340:234;40480:34;40476:1;40468:6;40464:14;40457:58;40549:17;40544:2;40536:6;40532:15;40525:42;40340:234;:::o;40580:366::-;40722:3;40743:67;40807:2;40802:3;40743:67;:::i;:::-;40736:74;;40819:93;40908:3;40819:93;:::i;:::-;40937:2;40932:3;40928:12;40921:19;;40580:366;;;:::o;40952:419::-;41118:4;41156:2;41145:9;41141:18;41133:26;;41205:9;41199:4;41195:20;41191:1;41180:9;41176:17;41169:47;41233:131;41359:4;41233:131;:::i;:::-;41225:139;;40952:419;;;:::o;41377:148::-;41479:11;41516:3;41501:18;;41377:148;;;;:::o;41531:390::-;41637:3;41665:39;41698:5;41665:39;:::i;:::-;41720:89;41802:6;41797:3;41720:89;:::i;:::-;41713:96;;41818:65;41876:6;41871:3;41864:4;41857:5;41853:16;41818:65;:::i;:::-;41908:6;41903:3;41899:16;41892:23;;41641:280;41531:390;;;;:::o;41951:874::-;42054:3;42091:5;42085:12;42120:36;42146:9;42120:36;:::i;:::-;42172:89;42254:6;42249:3;42172:89;:::i;:::-;42165:96;;42292:1;42281:9;42277:17;42308:1;42303:166;;;;42483:1;42478:341;;;;42270:549;;42303:166;42387:4;42383:9;42372;42368:25;42363:3;42356:38;42449:6;42442:14;42435:22;42427:6;42423:35;42418:3;42414:45;42407:52;;42303:166;;42478:341;42545:38;42577:5;42545:38;:::i;:::-;42605:1;42619:154;42633:6;42630:1;42627:13;42619:154;;;42707:7;42701:14;42697:1;42692:3;42688:11;42681:35;42757:1;42748:7;42744:15;42733:26;;42655:4;42652:1;42648:12;42643:17;;42619:154;;;42802:6;42797:3;42793:16;42786:23;;42485:334;;42270:549;;42058:767;;41951:874;;;;:::o;42831:589::-;43056:3;43078:95;43169:3;43160:6;43078:95;:::i;:::-;43071:102;;43190:95;43281:3;43272:6;43190:95;:::i;:::-;43183:102;;43302:92;43390:3;43381:6;43302:92;:::i;:::-;43295:99;;43411:3;43404:10;;42831:589;;;;;;:::o;43426:162::-;43577:4;43572:3;43565:17;43426:162;:::o;43594:568::-;43806:4;43844:2;43833:9;43829:18;43821:26;;43857:71;43925:1;43914:9;43910:17;43901:6;43857:71;:::i;:::-;43938:72;44006:2;43995:9;43991:18;43982:6;43938:72;:::i;:::-;44020:135;44151:2;44140:9;44136:18;44020:135;:::i;:::-;43594:568;;;;;:::o;44168:98::-;44219:6;44253:5;44247:12;44237:22;;44168:98;;;:::o;44272:168::-;44355:11;44389:6;44384:3;44377:19;44429:4;44424:3;44420:14;44405:29;;44272:168;;;;:::o;44446:373::-;44532:3;44560:38;44592:5;44560:38;:::i;:::-;44614:70;44677:6;44672:3;44614:70;:::i;:::-;44607:77;;44693:65;44751:6;44746:3;44739:4;44732:5;44728:16;44693:65;:::i;:::-;44783:29;44805:6;44783:29;:::i;:::-;44778:3;44774:39;44767:46;;44536:283;44446:373;;;;:::o;44825:640::-;45020:4;45058:3;45047:9;45043:19;45035:27;;45072:71;45140:1;45129:9;45125:17;45116:6;45072:71;:::i;:::-;45153:72;45221:2;45210:9;45206:18;45197:6;45153:72;:::i;:::-;45235;45303:2;45292:9;45288:18;45279:6;45235:72;:::i;:::-;45354:9;45348:4;45344:20;45339:2;45328:9;45324:18;45317:48;45382:76;45453:4;45444:6;45382:76;:::i;:::-;45374:84;;44825:640;;;;;;;:::o;45471:141::-;45527:5;45558:6;45552:13;45543:22;;45574:32;45600:5;45574:32;:::i;:::-;45471:141;;;;:::o;45618:349::-;45687:6;45736:2;45724:9;45715:7;45711:23;45707:32;45704:119;;;45742:79;;:::i;:::-;45704:119;45862:1;45887:63;45942:7;45933:6;45922:9;45918:22;45887:63;:::i;:::-;45877:73;;45833:127;45618:349;;;;:::o;45973:180::-;46021:77;46018:1;46011:88;46118:4;46115:1;46108:15;46142:4;46139:1;46132:15

Swarm Source

ipfs://984a10cbe560ab3832d4bbb262c477f39fb8d1b6310defa3041274c86f357f1f
Loading