ETH Price: $3,474.73 (+1.50%)
Gas: 11 Gwei

Token

Vandul Heist (HEIST)
 

Overview

Max Total Supply

399 HEIST

Holders

95

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xbb0173c0e8d5919e0a6a4066a1c506b16748e2d1
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
TheHeist

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-24
*/

// SPDX-License-Identifier: GPL-3.0

/**

    ╔═╗┌┬┐┬─┐┌─┐┌─┐┌┬┐╔╦╗┌─┐┬ ┌┬┐┌─┐
    ╚═╗ │ ├┬┘├┤ ├┤  │ ║║║├┤ │  │ └─┐
    ╚═╝ ┴ ┴└─└─┘└─┘ ┴ ╩ ╩└─┘┴─┘┴ └─┘
    Contract by @texoid__

*/

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

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

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

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

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

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

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

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

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

        if (totalHashes > 0) {
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

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

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

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

        if (totalHashes > 0) {
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

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

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

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

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

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

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.0;
/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

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

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

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

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

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

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

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

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

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


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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

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

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}


// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
 * @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;

    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
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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


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

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

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

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

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

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

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

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

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


// Contract - OperatorFilterer
pragma solidity ^0.8.4;
/**
 * @notice Optimized and flexible operator filterer to abide to OpenSea's
 * mandatory on-chain royalty enforcement in order for new collections to
 * receive royalties.
 * For more information, see:
 * See: https://github.com/ProjectOpenSea/operator-filter-registry
 */
abstract contract OperatorFilterer {
    /// @dev The default OpenSea operator blocklist subscription.
    address internal constant _DEFAULT_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

    /// @dev The OpenSea operator filter registry.
    address internal constant _OPERATOR_FILTER_REGISTRY = 0x000000000000AAeB6D7670E522A718067333cd4E;

    /// @dev Registers the current contract to OpenSea's operator filter,
    /// and subscribe to the default OpenSea operator blocklist.
    /// Note: Will not revert nor update existing settings for repeated registration.
    function _registerForOperatorFiltering() internal virtual {
        _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true);
    }

    /// @dev Registers the current contract to OpenSea's operator filter.
    /// Note: Will not revert nor update existing settings for repeated registration.
    function _registerForOperatorFiltering(address subscriptionOrRegistrantToCopy, bool subscribe)
        internal
        virtual
    {
        /// @solidity memory-safe-assembly
        assembly {
            let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`.

            // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty.
            subscriptionOrRegistrantToCopy := shr(96, shl(96, subscriptionOrRegistrantToCopy))

            for {} iszero(subscribe) {} {
                if iszero(subscriptionOrRegistrantToCopy) {
                    functionSelector := 0x4420e486 // `register(address)`.
                    break
                }
                functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`.
                break
            }
            // Store the function selector.
            mstore(0x00, shl(224, functionSelector))
            // Store the `address(this)`.
            mstore(0x04, address())
            // Store the `subscriptionOrRegistrantToCopy`.
            mstore(0x24, subscriptionOrRegistrantToCopy)
            // Register into the registry.
            if iszero(call(gas(), _OPERATOR_FILTER_REGISTRY, 0, 0x00, 0x44, 0x00, 0x04)) {
                // If the function selector has not been overwritten,
                // it is an out-of-gas error.
                if eq(shr(224, mload(0x00)), functionSelector) {
                    // To prevent gas under-estimation.
                    revert(0, 0)
                }
            }
            // Restore the part of the free memory pointer that was overwritten,
            // which is guaranteed to be zero, because of Solidity's memory size limits.
            mstore(0x24, 0)
        }
    }

    /// @dev Modifier to guard a function and revert if the caller is a blocked operator.
    modifier onlyAllowedOperator(address from) virtual {
        if (from != msg.sender) {
            if (!_isPriorityOperator(msg.sender)) {
                if (_operatorFilteringEnabled()) _revertIfBlocked(msg.sender);
            }
        }
        _;
    }

    /// @dev Modifier to guard a function from approving a blocked operator..
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        if (!_isPriorityOperator(operator)) {
            if (_operatorFilteringEnabled()) _revertIfBlocked(operator);
        }
        _;
    }

    /// @dev Helper function that reverts if the `operator` is blocked by the registry.
    function _revertIfBlocked(address operator) private view {
        /// @solidity memory-safe-assembly
        assembly {
            // Store the function selector of `isOperatorAllowed(address,address)`,
            // shifted left by 6 bytes, which is enough for 8tb of memory.
            // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL).
            mstore(0x00, 0xc6171134001122334455)
            // Store the `address(this)`.
            mstore(0x1a, address())
            // Store the `operator`.
            mstore(0x3a, operator)

            // `isOperatorAllowed` always returns true if it does not revert.
            if iszero(staticcall(gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00)) {
                // Bubble up the revert if the staticcall reverts.
                returndatacopy(0x00, 0x00, returndatasize())
                revert(0x00, returndatasize())
            }

            // We'll skip checking if `from` is inside the blacklist.
            // Even though that can block transferring out of wrapper contracts,
            // we don't want tokens to be stuck.

            // Restore the part of the free memory pointer that was overwritten,
            // which is guaranteed to be zero, if less than 8tb of memory is used.
            mstore(0x3a, 0)
        }
    }

    /// @dev For deriving contracts to override, so that operator filtering
    /// can be turned on / off.
    /// Returns true by default.
    function _operatorFilteringEnabled() internal view virtual returns (bool) {
        return true;
    }

    /// @dev For deriving contracts to override, so that preferred marketplaces can
    /// skip operator filtering, helping users save gas.
    /// Returns false for all inputs by default.
    function _isPriorityOperator(address) internal view virtual returns (bool) {
        return false;
    }
}


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


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


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


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

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

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

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

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

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

        return (royalty.receiver, royaltyAmount);
    }

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

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

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)
pragma solidity ^0.8.0;
/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(
        address[] calldata accounts,
        uint256[] calldata ids
    ) external view returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)
pragma solidity ^0.8.0;
/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)
pragma solidity ^0.8.0;
/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol)
pragma solidity ^0.8.0;
/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(
        address[] memory accounts,
        uint256[] memory ids
    ) public view virtual override returns (uint256[] memory) {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(address from, uint256 id, uint256 amount) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(address from, uint256[] memory ids, uint256[] memory amounts) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }

}


//- StreetMetlCratez implementation 
interface ICRATEZ {
    function burnMint(address _recipient, uint256 _tokenID, uint256 _amount) external;
}


//- Contract - Street Melt Open Edition
pragma solidity ^0.8.17;

error InvalidEdition();
error MintNotActive();
error NotEnoughETH();
error AlreadyClaimedFree();
error AmountExceedFreeAmount();
error InvalidMerkleProof();
error BurnRecipeNotExists();
error BurnNotActive();
error InsufficientBalanceForBurn();
error CrateRecipeNotExists();
error EditionExists();
error ArrayLengthMismatch();

contract TheHeist is ERC1155, OperatorFilterer, Ownable, ERC2981, ReentrancyGuard {
    using Strings for uint256;
    bool public operatorFilteringEnabled;

    //- Contract Meta
    string public name = "Vandul Heist";
    string public symbol = "HEIST";
    string public contractMetaLink;

    //- TokenURI
    string private baseURI;
    string private baseExtension = ".json";

    //- Edition Maps
    struct EditionToken { uint mintPrice; bool isValid; bool mintActive; }
    mapping (uint256 => EditionToken) public validEdition;

    /** Holder Claim Settings */
    bytes32 public merkleRoot;
    mapping(uint => mapping(address => bool)) holderFreeClaim;

    /** Burn Settings */
    struct BurnRecipe {  uint[] editionTokens; mapping(uint256 => uint256) burnAmount; bool burnActive; }
    mapping(uint256 => BurnRecipe) editionBurnRecipe;

    /** Crates settings */
    ICRATEZ public crateContract;
    struct CrateRecipe { uint[] editionTokens; mapping(uint256 => uint256) burnAmount; bool burnActive; }
    mapping(uint256 => CrateRecipe) crateBurnRecipe;

    /** Events */
    bool public leftoverBurnActive = false;
    event BurnEdition (address user, uint token_id, uint amount);

    //-
    constructor(
        string memory _baseURI,
        string memory _contractMeta
    ) ERC1155(_baseURI) {

        //- Setting token settings
        contractMetaLink = _contractMeta;
        baseURI = _baseURI;

        //- Edition Setup
        EditionToken storage _edition = validEdition[1];
        _edition.isValid = true;
        _edition.mintPrice = 0.003 ether;
        _edition.mintActive = false;

        _mint(msg.sender, 1, 1, "");

        //- Operator Filter
        _registerForOperatorFiltering();
        operatorFilteringEnabled = true;

        //- Setting default royaly to 5%
        _setDefaultRoyalty(msg.sender, 500);
    }

    //- Mint Functions
    function airdrop(address[] memory _receiver, uint256 _token, uint256 _amount) public onlyOwner {
        EditionToken storage _edition = validEdition[_token];
        if(!_edition.isValid) revert InvalidEdition();

        for(uint i = 0; i < _receiver.length; i++) {
            _mint(_receiver[i], _token, _amount, "");
        }
    }

    function mint(uint256 _token, uint256 _amount, bytes32[] calldata _merkleProof) public payable nonReentrant {

        uint _finalAmount = _amount;

        EditionToken storage _edition = validEdition[_token];

        if(!_edition.isValid) revert InvalidEdition();
        if(!_edition.mintActive) revert MintNotActive();

        if(msg.value < _edition.mintPrice * _amount) revert NotEnoughETH();

        //- Free Claims
        if(!holderFreeClaim[_token][msg.sender]) {
            bytes1 _holder = 0x01;
            bytes1 _whitelist = 0x02;

            bytes32 holder = keccak256(abi.encodePacked(msg.sender, _holder));
            if(MerkleProof.verify(_merkleProof, merkleRoot, holder)) {
                holderFreeClaim[_token][msg.sender] = true;
                _finalAmount += 5;
            }

            bytes32 whitelist = keccak256(abi.encodePacked(msg.sender, _whitelist));
            if(MerkleProof.verify(_merkleProof, merkleRoot, whitelist)) {
                holderFreeClaim[_token][msg.sender] = true;
                _finalAmount += 2;
            }
        }

        //- Minting 
        _mint(msg.sender, _token, _finalAmount, "");

    }

    function burnAndMint(uint256 _token, uint256 _amount) public payable nonReentrant {

        BurnRecipe storage _recipe = editionBurnRecipe[_token];

        if(_recipe.editionTokens.length == 0) revert BurnRecipeNotExists();
        if(!_recipe.burnActive) revert BurnNotActive();

        for(uint i = 0; i < _recipe.editionTokens.length; i++) {
            uint _tokenID = _recipe.editionTokens[i];
            uint _burnAmount = _recipe.burnAmount[_tokenID] * _amount;

            if(balanceOf(msg.sender, _tokenID) < _burnAmount) revert InsufficientBalanceForBurn();
        }

        for(uint i = 0; i < _recipe.editionTokens.length; i++) {
            uint _tokenID = _recipe.editionTokens[i];
            uint _burnAmount = _recipe.burnAmount[_tokenID] * _amount;

            _burn(msg.sender, _tokenID, _burnAmount);
        }

        //- Minting
        _mint(msg.sender, _token, _amount, "");

    }

    function crateBurnMint(uint256 _token, uint256 _amount) public payable nonReentrant {
        CrateRecipe storage _recipe = crateBurnRecipe[_token];

        if(_recipe.editionTokens.length == 0) revert CrateRecipeNotExists();
        if(!_recipe.burnActive) revert BurnNotActive();

        for(uint i = 0; i < _recipe.editionTokens.length; i++) {
            uint _tokenID = _recipe.editionTokens[i];
            uint _burnAmount = _recipe.burnAmount[_tokenID] * _amount;

            if(balanceOf(msg.sender, _tokenID) < _burnAmount) revert InsufficientBalanceForBurn();
        }

        for(uint i = 0; i < _recipe.editionTokens.length; i++) {
            uint _tokenID = _recipe.editionTokens[i];
            uint _burnAmount = _recipe.burnAmount[_tokenID] * _amount;

            _burn(msg.sender, _tokenID, _burnAmount);
        }

        //- Minting
        crateContract.burnMint(msg.sender, _token, _amount);
    }


    //- Public Functions
    function uri(uint256 tokenID) public view override returns (string memory) {
        EditionToken memory _edition = validEdition[tokenID];
        if(!_edition.isValid) revert InvalidEdition();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenID.toString(), baseExtension)) : baseURI;
    }


    //- Edition Setting Update Functions
    function addValidEdition(uint _tokenID, uint _cost, bool _isActive) public onlyOwner {
        EditionToken storage _edition = validEdition[_tokenID];
        if(_edition.isValid) revert EditionExists();

        _edition.mintPrice = _cost;
        _edition.mintActive = _isActive;

        _mint(msg.sender, _tokenID, 1, "");
    }

    function setEditionMintPrice(uint _tokenID, uint _cost) public onlyOwner {
        EditionToken storage _edition = validEdition[_tokenID];
        if(!_edition.isValid) revert EditionExists();

        _edition.mintPrice = _cost;
    }

    function toggleEditionMint(uint _tokenID) public onlyOwner {
        EditionToken storage _edition = validEdition[_tokenID];
        if(!_edition.isValid) revert EditionExists();

        _edition.mintActive = !_edition.mintActive;
    }


    //- Edition Burn functions
    function setBurnRecipe(uint _tokenID, uint[] memory _editions, uint[] memory _amounts) public onlyOwner {
        if(_editions.length != _amounts.length) revert ArrayLengthMismatch();

        BurnRecipe storage _burnRecipe = editionBurnRecipe[_tokenID];
        _burnRecipe.editionTokens = _editions;
        _burnRecipe.burnActive = false;

        for(uint i = 0; i < _editions.length; i++) {
            _burnRecipe.burnAmount[_editions[i]] = _amounts[i];
        }
    }

    function toggleBurn(uint _tokenID) public onlyOwner {
        BurnRecipe storage _burnRecipe = editionBurnRecipe[_tokenID];
        if(_burnRecipe.editionTokens.length == 0) revert BurnRecipeNotExists();
        _burnRecipe.burnActive = !_burnRecipe.burnActive;
    }


    //- Leftover token Burn
    function burnLeftover(uint[] memory _tokenID, uint[] memory _amount) public nonReentrant {
        if(_tokenID.length != _amount.length) revert ArrayLengthMismatch();
        if(!leftoverBurnActive) revert BurnNotActive();

        for(uint i = 0; i < _tokenID.length; i++) {

            _burn(msg.sender, _tokenID[i], _amount[i]);
            emit BurnEdition(msg.sender, _tokenID[i], _amount[i]);

        }
    }

    function toggleLeftoverBurn() public onlyOwner {
        leftoverBurnActive = !leftoverBurnActive;
    }


    //- Crate Setting update functions
    function setCrateRecipe(uint _crateID, uint[] memory _editions, uint[] memory _amounts) public onlyOwner {
        if(_editions.length != _amounts.length) revert ArrayLengthMismatch();

        CrateRecipe storage _crateRecipe = crateBurnRecipe[_crateID];
        _crateRecipe.editionTokens = _editions;
        _crateRecipe.burnActive = false;

        for(uint i = 0; i < _editions.length; i++) {
            _crateRecipe.burnAmount[_editions[i]] = _amounts[i];
        }
    }

    function toggleCrateBurn(uint _crateID) public onlyOwner {
        CrateRecipe storage _recipe = crateBurnRecipe[_crateID];
        if(_recipe.editionTokens.length == 0) revert CrateRecipeNotExists();
        _recipe.burnActive = !_recipe.burnActive;
    }


    //- Only Owner
    function updateBaseURI(string memory _uri) external onlyOwner {
        baseURI = _uri;
    }

    function updateContractURI(string memory _uri) external onlyOwner {
        contractMetaLink = _uri;
    }

    function contractURI() public view returns (string memory) {
        return contractMetaLink;
    }

    function updateCrateContract(address _address) public onlyOwner {
        crateContract = ICRATEZ(_address);
    }

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

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


    //- Operator Filter Registry
    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

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

    function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts,  bytes memory data ) public override onlyAllowedOperator(from) {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }

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

    function setDefaultRoyalty(address receiver, uint96 feeNumerator) public onlyOwner {
        _setDefaultRoyalty(receiver, feeNumerator);
    }

    function setOperatorFilteringEnabled(bool value) public onlyOwner {
        operatorFilteringEnabled = value;
    }

    function _operatorFilteringEnabled() internal view override returns (bool) {
        return operatorFilteringEnabled;
    }

    function _isPriorityOperator(address operator) internal pure override returns (bool) {
        return operator == address(0x1E0049783F008A0085193E00003D00cd54003c71);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"string","name":"_contractMeta","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"BurnNotActive","type":"error"},{"inputs":[],"name":"BurnRecipeNotExists","type":"error"},{"inputs":[],"name":"CrateRecipeNotExists","type":"error"},{"inputs":[],"name":"EditionExists","type":"error"},{"inputs":[],"name":"InsufficientBalanceForBurn","type":"error"},{"inputs":[],"name":"InvalidEdition","type":"error"},{"inputs":[],"name":"MintNotActive","type":"error"},{"inputs":[],"name":"NotEnoughETH","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"token_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BurnEdition","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"addValidEdition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_receiver","type":"address[]"},{"internalType":"uint256","name":"_token","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnAndMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenID","type":"uint256[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"name":"burnLeftover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractMetaLink","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"crateBurnMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"crateContract","outputs":[{"internalType":"contract ICRATEZ","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leftoverBurnActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"},{"internalType":"uint256[]","name":"_editions","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setBurnRecipe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_crateID","type":"uint256"},{"internalType":"uint256[]","name":"_editions","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setCrateRecipe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"},{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setEditionMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","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":"toggleBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_crateID","type":"uint256"}],"name":"toggleCrateBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"}],"name":"toggleEditionMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleLeftoverBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"updateContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateCrateContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"validEdition","outputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"bool","name":"isValid","type":"bool"},{"internalType":"bool","name":"mintActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600c81526020017f56616e64756c2048656973740000000000000000000000000000000000000000815250600890816200004a919062000c95565b506040518060400160405280600581526020017f48454953540000000000000000000000000000000000000000000000000000008152506009908162000091919062000c95565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c9081620000d8919062000c95565b506000601360006101000a81548160ff0219169083151502179055503480156200010157600080fd5b506040516200757538038062007575833981810160405281019062000127919062000ee0565b8162000139816200025460201b60201c565b506200015a6200014e6200026960201b60201c565b6200027160201b60201c565b600160068190555080600a908162000173919062000c95565b5081600b908162000185919062000c95565b506000600d600060018152602001908152602001600020905060018160010160006101000a81548160ff021916908315150217905550660aa87bee538000816000018190555060008160010160016101000a81548160ff0219169083151502179055506200020c33600180604051806020016040528060008152506200033760201b60201c565b6200021c6200051e60201b60201c565b6001600760006101000a81548160ff0219169083151502179055506200024b336101f46200054760201b60201c565b505050620015e6565b806002908162000265919062000c95565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603620003a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003a09062000fec565b60405180910390fd5b6000620003bb6200026960201b60201c565b90506000620003d085620006ea60201b60201c565b90506000620003e585620006ea60201b60201c565b9050620003fe836000898585896200076b60201b60201c565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200045f91906200103d565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051620004df92919062001089565b60405180910390a4620004fe836000898585896200077360201b60201c565b62000515836000898989896200077b60201b60201c565b50505050505050565b62000545733cc6cdda760b79bafa08df41ecfa224f810dceb660016200097460201b60201c565b565b62000557620009ee60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620005b8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005af906200112c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200062a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000621906200119e565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600460008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60606000600167ffffffffffffffff8111156200070c576200070b62000a26565b5b6040519080825280602002602001820160405280156200073b5781602001602082028036833780820191505090505b5090508281600081518110620007565762000755620011c0565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b620007a78473ffffffffffffffffffffffffffffffffffffffff16620009f860201b620024541760201c565b156200096c578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401620007f095949392919062001291565b6020604051808303816000875af19250505080156200082f57506040513d601f19601f820116820180604052508101906200082c919062001352565b60015b620008e0576200083e62001391565b806308c379a003620008a1575062000855620013b6565b80620008625750620008a3565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000898919062001492565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008d7906200152c565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146200096a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200096190620015c4565b60405180910390fd5b505b505050505050565b637d3e3dbe8260601b60601c925081620009a357826200099b57634420e4869050620009a3565b63a0af290390505b8060e01b60005230600452826024526004600060446000806daaeb6d7670e522a718067333cd4e5af1620009e4578060005160e01c03620009e357600080fd5b5b6000602452505050565b6000612710905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a9d57607f821691505b60208210810362000ab35762000ab262000a55565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000b1d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000ade565b62000b29868362000ade565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000b7662000b7062000b6a8462000b41565b62000b4b565b62000b41565b9050919050565b6000819050919050565b62000b928362000b55565b62000baa62000ba18262000b7d565b84845462000aeb565b825550505050565b600090565b62000bc162000bb2565b62000bce81848462000b87565b505050565b5b8181101562000bf65762000bea60008262000bb7565b60018101905062000bd4565b5050565b601f82111562000c455762000c0f8162000ab9565b62000c1a8462000ace565b8101602085101562000c2a578190505b62000c4262000c398562000ace565b83018262000bd3565b50505b505050565b600082821c905092915050565b600062000c6a6000198460080262000c4a565b1980831691505092915050565b600062000c85838362000c57565b9150826002028217905092915050565b62000ca08262000a1b565b67ffffffffffffffff81111562000cbc5762000cbb62000a26565b5b62000cc8825462000a84565b62000cd582828562000bfa565b600060209050601f83116001811462000d0d576000841562000cf8578287015190505b62000d04858262000c77565b86555062000d74565b601f19841662000d1d8662000ab9565b60005b8281101562000d475784890151825560018201915060208501945060208101905062000d20565b8683101562000d67578489015162000d63601f89168262000c57565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000db68262000d9a565b810181811067ffffffffffffffff8211171562000dd85762000dd762000a26565b5b80604052505050565b600062000ded62000d7c565b905062000dfb828262000dab565b919050565b600067ffffffffffffffff82111562000e1e5762000e1d62000a26565b5b62000e298262000d9a565b9050602081019050919050565b60005b8381101562000e5657808201518184015260208101905062000e39565b60008484015250505050565b600062000e7962000e738462000e00565b62000de1565b90508281526020810184848401111562000e985762000e9762000d95565b5b62000ea584828562000e36565b509392505050565b600082601f83011262000ec55762000ec462000d90565b5b815162000ed784826020860162000e62565b91505092915050565b6000806040838503121562000efa5762000ef962000d86565b5b600083015167ffffffffffffffff81111562000f1b5762000f1a62000d8b565b5b62000f298582860162000ead565b925050602083015167ffffffffffffffff81111562000f4d5762000f4c62000d8b565b5b62000f5b8582860162000ead565b9150509250929050565b600082825260208201905092915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600062000fd460218362000f65565b915062000fe18262000f76565b604082019050919050565b60006020820190508181036000830152620010078162000fc5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200104a8262000b41565b9150620010578362000b41565b92508282019050808211156200107257620010716200100e565b5b92915050565b620010838162000b41565b82525050565b6000604082019050620010a0600083018562001078565b620010af602083018462001078565b9392505050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062001114602a8362000f65565b91506200112182620010b6565b604082019050919050565b60006020820190508181036000830152620011478162001105565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006200118660198362000f65565b915062001193826200114e565b602082019050919050565b60006020820190508181036000830152620011b98162001177565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200121c82620011ef565b9050919050565b6200122e816200120f565b82525050565b600081519050919050565b600082825260208201905092915050565b60006200125d8262001234565b6200126981856200123f565b93506200127b81856020860162000e36565b620012868162000d9a565b840191505092915050565b600060a082019050620012a8600083018862001223565b620012b7602083018762001223565b620012c6604083018662001078565b620012d5606083018562001078565b8181036080830152620012e9818462001250565b90509695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6200132c81620012f5565b81146200133857600080fd5b50565b6000815190506200134c8162001321565b92915050565b6000602082840312156200136b576200136a62000d86565b5b60006200137b848285016200133b565b91505092915050565b60008160e01c9050919050565b600060033d1115620013b35760046000803e620013b060005162001384565b90505b90565b600060443d106200144e57620013cb62000d7c565b60043d036004823e80513d602482011167ffffffffffffffff82111715620013f55750506200144e565b808201805167ffffffffffffffff8111156200141557505050506200144e565b80602083010160043d038501811115620014345750505050506200144e565b620014458260200185018662000dab565b82955050505050505b90565b60006200145e8262000a1b565b6200146a818562000f65565b93506200147c81856020860162000e36565b620014878162000d9a565b840191505092915050565b60006020820190508181036000830152620014ae818462001451565b905092915050565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006200151460348362000f65565b91506200152182620014b6565b604082019050919050565b60006020820190508181036000830152620015478162001505565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000620015ac60288362000f65565b9150620015b9826200154e565b604082019050919050565b60006020820190508181036000830152620015df816200159d565b9050919050565b615f7f80620015f66000396000f3fe6080604052600436106102455760003560e01c80637cb6475911610139578063a5097e62116100b6578063e985e9c51161007a578063e985e9c514610806578063f12f3eb814610843578063f242432a1461086c578063f2fde38b14610895578063f45105eb146108be578063fb796e6c146108e757610245565b8063a5097e6214610751578063b7c0b8e81461077a578063bd96b070146107a3578063e6d37b88146107bf578063e8a3d485146107db57610245565b806395d89b41116100fd57806395d89b411461066a578063972d8061146106955780639a4ef883146106d4578063a22cb465146106ff578063a496dedf1461072857610245565b80637cb64759146105995780637e5b1e24146105c25780638252ac99146105eb5780638da5cb5b14610616578063931688cb1461064157610245565b80632eb2c2d6116101c75780634e1273f41161018b5780634e1273f4146104d75780635a91a93a14610514578063715018a61461053057806371662399146105475780637b61d5261461057057610245565b80632eb2c2d6146104395780632eb4a7ab1461046257806339d5c6881461048d5780633ccfd60b146104b65780634ac29279146104c057610245565b80630c9648931161020e5780630c964893146103415780630e89341c1461036a57806317f293f7146103a75780631d4dcb74146103d25780632a55205a146103fb57610245565b8062fdd58e1461024a57806301ffc9a71461028757806304634d8d146102c457806306cae05e146102ed57806306fdde0314610316575b600080fd5b34801561025657600080fd5b50610271600480360381019061026c9190613eb8565b610912565b60405161027e9190613f07565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613f7a565b6109da565b6040516102bb9190613fc2565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190614021565b6109fc565b005b3480156102f957600080fd5b50610314600480360381019061030f91906141ba565b610a12565b005b34801561032257600080fd5b5061032b610b16565b60405161033891906142c4565b60405180910390f35b34801561034d57600080fd5b50610368600480360381019061036391906142e6565b610ba4565b005b34801561037657600080fd5b50610391600480360381019061038c91906142e6565b610c36565b60405161039e91906142c4565b60405180910390f35b3480156103b357600080fd5b506103bc610db2565b6040516103c99190613fc2565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f4919061433f565b610dc5565b005b34801561040757600080fd5b50610422600480360381019061041d9190614392565b610e74565b6040516104309291906143e1565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b91906144bf565b61105e565b005b34801561046e57600080fd5b506104776110cd565b60405161048491906145a7565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af91906145c2565b6110d3565b005b6104be611236565b005b3480156104cc57600080fd5b506104d56112b7565b005b3480156104e357600080fd5b506104fe60048036038101906104f991906146fd565b6112eb565b60405161050b9190614833565b60405180910390f35b61052e60048036038101906105299190614392565b611404565b005b34801561053c57600080fd5b50610545611606565b005b34801561055357600080fd5b5061056e600480360381019061056991906142e6565b61161a565b005b34801561057c57600080fd5b50610597600480360381019061059291906142e6565b6116b3565b005b3480156105a557600080fd5b506105c060048036038101906105bb9190614881565b611745565b005b3480156105ce57600080fd5b506105e960048036038101906105e4919061494f565b611757565b005b3480156105f757600080fd5b50610600611772565b60405161060d91906142c4565b60405180910390f35b34801561062257600080fd5b5061062b611800565b6040516106389190614998565b60405180910390f35b34801561064d57600080fd5b506106686004803603810190610663919061494f565b61182a565b005b34801561067657600080fd5b5061067f611845565b60405161068c91906142c4565b60405180910390f35b3480156106a157600080fd5b506106bc60048036038101906106b791906142e6565b6118d3565b6040516106cb939291906149b3565b60405180910390f35b3480156106e057600080fd5b506106e9611917565b6040516106f69190614a49565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190614a64565b61193d565b005b34801561073457600080fd5b5061074f600480360381019061074a9190614aa4565b611972565b005b34801561075d57600080fd5b50610778600480360381019061077391906141ba565b611a34565b005b34801561078657600080fd5b506107a1600480360381019061079c9190614b13565b611b38565b005b6107bd60048036038101906107b89190614392565b611b5d565b005b6107d960048036038101906107d49190614b9b565b611dd5565b005b3480156107e757600080fd5b506107f0612168565b6040516107fd91906142c4565b60405180910390f35b34801561081257600080fd5b5061082d60048036038101906108289190614c0f565b6121fa565b60405161083a9190613fc2565b60405180910390f35b34801561084f57600080fd5b5061086a60048036038101906108659190614392565b61228e565b005b34801561087857600080fd5b50610893600480360381019061088e9190614c4f565b612303565b005b3480156108a157600080fd5b506108bc60048036038101906108b79190614ce6565b612372565b005b3480156108ca57600080fd5b506108e560048036038101906108e09190614ce6565b6123f5565b005b3480156108f357600080fd5b506108fc612441565b6040516109099190613fc2565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097990614d85565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006109e582612477565b806109f557506109f482612559565b5b9050919050565b610a046125d3565b610a0e8282612651565b5050565b610a1a6125d3565b8051825114610a55576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060126000858152602001908152602001600020905082816000019080519060200190610a84929190613da6565b5060008160020160006101000a81548160ff02191690831515021790555060005b8351811015610b0f57828181518110610ac157610ac0614da5565b5b6020026020010151826001016000868481518110610ae257610ae1614da5565b5b60200260200101518152602001908152602001600020819055508080610b0790614e03565b915050610aa5565b5050505050565b60088054610b2390614e7a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4f90614e7a565b8015610b9c5780601f10610b7157610100808354040283529160200191610b9c565b820191906000526020600020905b815481529060010190602001808311610b7f57829003601f168201915b505050505081565b610bac6125d3565b60006012600083815260200190815260200160002090506000816000018054905003610c04576040517fbff1696200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160009054906101000a900460ff16158160020160006101000a81548160ff0219169083151502179055505050565b60606000600d6000848152602001908152602001600020604051806060016040529081600082015481526020016001820160009054906101000a900460ff161515151581526020016001820160019054906101000a900460ff16151515158152505090508060200151610cd5576040517f720874cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600b8054610ce490614e7a565b905011610d7b57600b8054610cf890614e7a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2490614e7a565b8015610d715780601f10610d4657610100808354040283529160200191610d71565b820191906000526020600020905b815481529060010190602001808311610d5457829003601f168201915b5050505050610daa565b600b610d86846127e6565b600c604051602001610d9a93929190614f7f565b6040516020818303038152906040525b915050919050565b601360009054906101000a900460ff1681565b610dcd6125d3565b6000600d600085815260200190815260200160002090508060010160009054906101000a900460ff1615610e2d576040517f8e0867a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828160000181905550818160010160016101000a81548160ff021916908315150217905550610e6e33856001604051806020016040528060008152506128b4565b50505050565b6000806000600560008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036110095760046040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000611013612a64565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661103f9190614fb0565b6110499190615021565b90508160000151819350935050509250929050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110b85761109b33612a6e565b6110b7576110a7612aba565b156110b6576110b533612ad1565b5b5b5b6110c58686868686612b15565b505050505050565b600e5481565b6110db612bb6565b8051825114611116576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601360009054906101000a900460ff1661115c576040517fcc0fe59200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015611229576111a73384838151811061117f5761117e614da5565b5b602002602001015184848151811061119a57611199614da5565b5b6020026020010151612c05565b7f69d4bb13bbea9a876c029efe6d2867d50564690f5bcdabdff357b29654e8a490338483815181106111dc576111db614da5565b5b60200260200101518484815181106111f7576111f6614da5565b5b602002602001015160405161120e93929190615052565b60405180910390a1808061122190614e03565b91505061115f565b50611232612e4b565b5050565b61123e6125d3565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611264906150ba565b60006040518083038185875af1925050503d80600081146112a1576040519150601f19603f3d011682016040523d82523d6000602084013e6112a6565b606091505b50509050806112b457600080fd5b50565b6112bf6125d3565b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b60608151835114611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890615141565b60405180910390fd5b6000835167ffffffffffffffff81111561134e5761134d614077565b5b60405190808252806020026020018201604052801561137c5781602001602082028036833780820191505090505b50905060005b84518110156113f9576113c98582815181106113a1576113a0614da5565b5b60200260200101518583815181106113bc576113bb614da5565b5b6020026020010151610912565b8282815181106113dc576113db614da5565b5b602002602001018181525050806113f290614e03565b9050611382565b508091505092915050565b61140c612bb6565b60006010600084815260200190815260200160002090506000816000018054905003611464576040517f7b5c3f3300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160009054906101000a900460ff166114ac576040517fcc0fe59200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81600001805490508110156115605760008260000182815481106114d6576114d5614da5565b5b90600052602060002001549050600084846001016000848152602001908152602001600020546115069190614fb0565b9050806115133384610912565b101561154b576040517f7ad786d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050808061155890614e03565b9150506114af565b5060005b81600001805490508110156115dd57600082600001828154811061158b5761158a614da5565b5b90600052602060002001549050600084846001016000848152602001908152602001600020546115bb9190614fb0565b90506115c8338383612c05565b505080806115d590614e03565b915050611564565b506115f9338484604051806020016040528060008152506128b4565b50611602612e4b565b5050565b61160e6125d3565b6116186000612e55565b565b6116226125d3565b6000600d600083815260200190815260200160002090508060010160009054906101000a900460ff16611681576040517f8e0867a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060010160019054906101000a900460ff16158160010160016101000a81548160ff0219169083151502179055505050565b6116bb6125d3565b60006010600083815260200190815260200160002090506000816000018054905003611713576040517f7b5c3f3300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160009054906101000a900460ff16158160020160006101000a81548160ff0219169083151502179055505050565b61174d6125d3565b80600e8190555050565b61175f6125d3565b80600a908161176e91906152ee565b5050565b600a805461177f90614e7a565b80601f01602080910402602001604051908101604052809291908181526020018280546117ab90614e7a565b80156117f85780601f106117cd576101008083540402835291602001916117f8565b820191906000526020600020905b8154815290600101906020018083116117db57829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118326125d3565b80600b908161184191906152ee565b5050565b6009805461185290614e7a565b80601f016020809104026020016040519081016040528092919081815260200182805461187e90614e7a565b80156118cb5780601f106118a0576101008083540402835291602001916118cb565b820191906000526020600020905b8154815290600101906020018083116118ae57829003601f168201915b505050505081565b600d6020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16908060010160019054906101000a900460ff16905083565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b8161194781612a6e565b61196357611953612aba565b156119625761196181612ad1565b5b5b61196d8383612f1b565b505050565b61197a6125d3565b6000600d600084815260200190815260200160002090508060010160009054906101000a900460ff166119d9576040517f720874cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8451811015611a2d57611a1a8582815181106119fb576119fa614da5565b5b60200260200101518585604051806020016040528060008152506128b4565b8080611a2590614e03565b9150506119dc565b5050505050565b611a3c6125d3565b8051825114611a77576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060106000858152602001908152602001600020905082816000019080519060200190611aa6929190613da6565b5060008160020160006101000a81548160ff02191690831515021790555060005b8351811015611b3157828181518110611ae357611ae2614da5565b5b6020026020010151826001016000868481518110611b0457611b03614da5565b5b60200260200101518152602001908152602001600020819055508080611b2990614e03565b915050611ac7565b5050505050565b611b406125d3565b80600760006101000a81548160ff02191690831515021790555050565b611b65612bb6565b60006012600084815260200190815260200160002090506000816000018054905003611bbd576040517fbff1696200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160009054906101000a900460ff16611c05576040517fcc0fe59200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8160000180549050811015611cb9576000826000018281548110611c2f57611c2e614da5565b5b9060005260206000200154905060008484600101600084815260200190815260200160002054611c5f9190614fb0565b905080611c6c3384610912565b1015611ca4576040517f7ad786d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50508080611cb190614e03565b915050611c08565b5060005b8160000180549050811015611d36576000826000018281548110611ce457611ce3614da5565b5b9060005260206000200154905060008484600101600084815260200190815260200160002054611d149190614fb0565b9050611d21338383612c05565b50508080611d2e90614e03565b915050611cbd565b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efa793a03385856040518463ffffffff1660e01b8152600401611d9693929190615052565b600060405180830381600087803b158015611db057600080fd5b505af1158015611dc4573d6000803e3d6000fd5b5050505050611dd1612e4b565b5050565b611ddd612bb6565b60008390506000600d600087815260200190815260200160002090508060010160009054906101000a900460ff16611e41576040517f720874cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060010160019054906101000a900460ff16611e89576040517f914edb0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b848160000154611e999190614fb0565b341015611ed2576040517f583aa02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661213d576000600160f81b90506000600260f81b905060003383604051602001611f5b929190615455565b604051602081830303815290604052805190602001209050611fc1878780806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483612f31565b1561203f576001600f60008b815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060058561203c9190615481565b94505b60003383604051602001612054929190615455565b6040516020818303038152906040528051906020012090506120ba888880806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483612f31565b15612138576001600f60008c815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506002866121359190615481565b95505b505050505b612158338784604051806020016040528060008152506128b4565b5050612162612e4b565b50505050565b6060600a805461217790614e7a565b80601f01602080910402602001604051908101604052809291908181526020018280546121a390614e7a565b80156121f05780601f106121c5576101008083540402835291602001916121f0565b820191906000526020600020905b8154815290600101906020018083116121d357829003601f168201915b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122966125d3565b6000600d600084815260200190815260200160002090508060010160009054906101000a900460ff166122f5576040517f8e0867a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160000181905550505050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461235d5761234033612a6e565b61235c5761234c612aba565b1561235b5761235a33612ad1565b5b5b5b61236a8686868686612f48565b505050505050565b61237a6125d3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e090615527565b60405180910390fd5b6123f281612e55565b50565b6123fd6125d3565b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760009054906101000a900460ff1681565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061254257507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612552575061255182612fe9565b5b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125cc57506125cb82612477565b5b9050919050565b6125db613053565b73ffffffffffffffffffffffffffffffffffffffff166125f9611800565b73ffffffffffffffffffffffffffffffffffffffff161461264f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264690615593565b60405180910390fd5b565b612659612a64565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156126b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ae90615625565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271d90615691565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600460008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6060600060016127f58461305b565b01905060008167ffffffffffffffff81111561281457612813614077565b5b6040519080825280601f01601f1916602001820160405280156128465781602001600182028036833780820191505090505b509050600082602001820190505b6001156128a9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161289d5761289c614ff2565b5b04945060008503612854575b819350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291a90615723565b60405180910390fd5b600061292d613053565b9050600061293a856131ae565b90506000612947856131ae565b905061295883600089858589613228565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129b79190615481565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612a35929190615743565b60405180910390a4612a4c83600089858589613230565b612a5b83600089898989613238565b50505050505050565b6000612710905090565b6000731e0049783f008a0085193e00003d00cd54003c7173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000600760009054906101000a900460ff16905090565b69c617113400112233445560005230601a5280603a52600080604460166daaeb6d7670e522a718067333cd4e5afa612b0d573d6000803e3d6000fd5b6000603a5250565b612b1d613053565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612b635750612b6285612b5d613053565b6121fa565b5b612ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b99906157de565b60405180910390fd5b612baf858585858561340f565b5050505050565b600260065403612bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf29061584a565b60405180910390fd5b6002600681905550565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6b906158dc565b60405180910390fd5b6000612c7e613053565b90506000612c8b846131ae565b90506000612c98846131ae565b9050612cb883876000858560405180602001604052806000815250613228565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d469061596e565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612e1c929190615743565b60405180910390a4612e4284886000868660405180602001604052806000815250613230565b50505050505050565b6001600681905550565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612f2d612f26613053565b8383613730565b5050565b600082612f3e858461389c565b1490509392505050565b612f50613053565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612f965750612f9585612f90613053565b6121fa565b5b612fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fcc906157de565b60405180910390fd5b612fe285858585856138f2565b5050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106130b9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816130af576130ae614ff2565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106130f6576d04ee2d6d415b85acef810000000083816130ec576130eb614ff2565b5b0492506020810190505b662386f26fc10000831061312557662386f26fc10000838161311b5761311a614ff2565b5b0492506010810190505b6305f5e100831061314e576305f5e100838161314457613143614ff2565b5b0492506008810190505b612710831061317357612710838161316957613168614ff2565b5b0492506004810190505b60648310613196576064838161318c5761318b614ff2565b5b0492506002810190505b600a83106131a5576001810190505b80915050919050565b60606000600167ffffffffffffffff8111156131cd576131cc614077565b5b6040519080825280602002602001820160405280156131fb5781602001602082028036833780820191505090505b509050828160008151811061321357613212614da5565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b6132578473ffffffffffffffffffffffffffffffffffffffff16612454565b15613407578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161329d9594939291906159e3565b6020604051808303816000875af19250505080156132d957506040513d601f19601f820116820180604052508101906132d69190615a52565b60015b61337e576132e5615a8c565b806308c379a00361334157506132f9615aae565b806133045750613343565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333891906142c4565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337590615bb0565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133fc90615c42565b60405180910390fd5b505b505050505050565b8151835114613453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344a90615cd4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036134c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b990615d66565b60405180910390fd5b60006134cc613053565b90506134dc818787878787613228565b60005b845181101561368d5760008582815181106134fd576134fc614da5565b5b60200260200101519050600085838151811061351c5761351b614da5565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156135bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b490615df8565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136729190615481565b925050819055505050508061368690614e03565b90506134df565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051613704929190615e18565b60405180910390a461371a818787878787613230565b613728818787878787613b8d565b505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361379e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161379590615ec1565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161388f9190613fc2565b60405180910390a3505050565b60008082905060005b84518110156138e7576138d2828683815181106138c5576138c4614da5565b5b6020026020010151613d64565b915080806138df90614e03565b9150506138a5565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161395890615d66565b60405180910390fd5b600061396b613053565b90506000613978856131ae565b90506000613985856131ae565b9050613995838989858589613228565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015613a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2390615df8565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613ae19190615481565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051613b5e929190615743565b60405180910390a4613b74848a8a86868a613230565b613b82848a8a8a8a8a613238565b505050505050505050565b613bac8473ffffffffffffffffffffffffffffffffffffffff16612454565b15613d5c578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613bf2959493929190615ee1565b6020604051808303816000875af1925050508015613c2e57506040513d601f19601f82011682018060405250810190613c2b9190615a52565b60015b613cd357613c3a615a8c565b806308c379a003613c965750613c4e615aae565b80613c595750613c98565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c8d91906142c4565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cca90615bb0565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d5190615c42565b60405180910390fd5b505b505050505050565b6000818310613d7c57613d778284613d8f565b613d87565b613d868383613d8f565b5b905092915050565b600082600052816020526040600020905092915050565b828054828255906000526020600020908101928215613de2579160200282015b82811115613de1578251825591602001919060010190613dc6565b5b509050613def9190613df3565b5090565b5b80821115613e0c576000816000905550600101613df4565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e4f82613e24565b9050919050565b613e5f81613e44565b8114613e6a57600080fd5b50565b600081359050613e7c81613e56565b92915050565b6000819050919050565b613e9581613e82565b8114613ea057600080fd5b50565b600081359050613eb281613e8c565b92915050565b60008060408385031215613ecf57613ece613e1a565b5b6000613edd85828601613e6d565b9250506020613eee85828601613ea3565b9150509250929050565b613f0181613e82565b82525050565b6000602082019050613f1c6000830184613ef8565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f5781613f22565b8114613f6257600080fd5b50565b600081359050613f7481613f4e565b92915050565b600060208284031215613f9057613f8f613e1a565b5b6000613f9e84828501613f65565b91505092915050565b60008115159050919050565b613fbc81613fa7565b82525050565b6000602082019050613fd76000830184613fb3565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613ffe81613fdd565b811461400957600080fd5b50565b60008135905061401b81613ff5565b92915050565b6000806040838503121561403857614037613e1a565b5b600061404685828601613e6d565b92505060206140578582860161400c565b9150509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140af82614066565b810181811067ffffffffffffffff821117156140ce576140cd614077565b5b80604052505050565b60006140e1613e10565b90506140ed82826140a6565b919050565b600067ffffffffffffffff82111561410d5761410c614077565b5b602082029050602081019050919050565b600080fd5b6000614136614131846140f2565b6140d7565b905080838252602082019050602084028301858111156141595761415861411e565b5b835b81811015614182578061416e8882613ea3565b84526020840193505060208101905061415b565b5050509392505050565b600082601f8301126141a1576141a0614061565b5b81356141b1848260208601614123565b91505092915050565b6000806000606084860312156141d3576141d2613e1a565b5b60006141e186828701613ea3565b935050602084013567ffffffffffffffff81111561420257614201613e1f565b5b61420e8682870161418c565b925050604084013567ffffffffffffffff81111561422f5761422e613e1f565b5b61423b8682870161418c565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b60005b8381101561427f578082015181840152602081019050614264565b60008484015250505050565b600061429682614245565b6142a08185614250565b93506142b0818560208601614261565b6142b981614066565b840191505092915050565b600060208201905081810360008301526142de818461428b565b905092915050565b6000602082840312156142fc576142fb613e1a565b5b600061430a84828501613ea3565b91505092915050565b61431c81613fa7565b811461432757600080fd5b50565b60008135905061433981614313565b92915050565b60008060006060848603121561435857614357613e1a565b5b600061436686828701613ea3565b935050602061437786828701613ea3565b92505060406143888682870161432a565b9150509250925092565b600080604083850312156143a9576143a8613e1a565b5b60006143b785828601613ea3565b92505060206143c885828601613ea3565b9150509250929050565b6143db81613e44565b82525050565b60006040820190506143f660008301856143d2565b6144036020830184613ef8565b9392505050565b600080fd5b600067ffffffffffffffff82111561442a57614429614077565b5b61443382614066565b9050602081019050919050565b82818337600083830152505050565b600061446261445d8461440f565b6140d7565b90508281526020810184848401111561447e5761447d61440a565b5b614489848285614440565b509392505050565b600082601f8301126144a6576144a5614061565b5b81356144b684826020860161444f565b91505092915050565b600080600080600060a086880312156144db576144da613e1a565b5b60006144e988828901613e6d565b95505060206144fa88828901613e6d565b945050604086013567ffffffffffffffff81111561451b5761451a613e1f565b5b6145278882890161418c565b935050606086013567ffffffffffffffff81111561454857614547613e1f565b5b6145548882890161418c565b925050608086013567ffffffffffffffff81111561457557614574613e1f565b5b61458188828901614491565b9150509295509295909350565b6000819050919050565b6145a18161458e565b82525050565b60006020820190506145bc6000830184614598565b92915050565b600080604083850312156145d9576145d8613e1a565b5b600083013567ffffffffffffffff8111156145f7576145f6613e1f565b5b6146038582860161418c565b925050602083013567ffffffffffffffff81111561462457614623613e1f565b5b6146308582860161418c565b9150509250929050565b600067ffffffffffffffff82111561465557614654614077565b5b602082029050602081019050919050565b60006146796146748461463a565b6140d7565b9050808382526020820190506020840283018581111561469c5761469b61411e565b5b835b818110156146c557806146b18882613e6d565b84526020840193505060208101905061469e565b5050509392505050565b600082601f8301126146e4576146e3614061565b5b81356146f4848260208601614666565b91505092915050565b6000806040838503121561471457614713613e1a565b5b600083013567ffffffffffffffff81111561473257614731613e1f565b5b61473e858286016146cf565b925050602083013567ffffffffffffffff81111561475f5761475e613e1f565b5b61476b8582860161418c565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6147aa81613e82565b82525050565b60006147bc83836147a1565b60208301905092915050565b6000602082019050919050565b60006147e082614775565b6147ea8185614780565b93506147f583614791565b8060005b8381101561482657815161480d88826147b0565b9750614818836147c8565b9250506001810190506147f9565b5085935050505092915050565b6000602082019050818103600083015261484d81846147d5565b905092915050565b61485e8161458e565b811461486957600080fd5b50565b60008135905061487b81614855565b92915050565b60006020828403121561489757614896613e1a565b5b60006148a58482850161486c565b91505092915050565b600067ffffffffffffffff8211156148c9576148c8614077565b5b6148d282614066565b9050602081019050919050565b60006148f26148ed846148ae565b6140d7565b90508281526020810184848401111561490e5761490d61440a565b5b614919848285614440565b509392505050565b600082601f83011261493657614935614061565b5b81356149468482602086016148df565b91505092915050565b60006020828403121561496557614964613e1a565b5b600082013567ffffffffffffffff81111561498357614982613e1f565b5b61498f84828501614921565b91505092915050565b60006020820190506149ad60008301846143d2565b92915050565b60006060820190506149c86000830186613ef8565b6149d56020830185613fb3565b6149e26040830184613fb3565b949350505050565b6000819050919050565b6000614a0f614a0a614a0584613e24565b6149ea565b613e24565b9050919050565b6000614a21826149f4565b9050919050565b6000614a3382614a16565b9050919050565b614a4381614a28565b82525050565b6000602082019050614a5e6000830184614a3a565b92915050565b60008060408385031215614a7b57614a7a613e1a565b5b6000614a8985828601613e6d565b9250506020614a9a8582860161432a565b9150509250929050565b600080600060608486031215614abd57614abc613e1a565b5b600084013567ffffffffffffffff811115614adb57614ada613e1f565b5b614ae7868287016146cf565b9350506020614af886828701613ea3565b9250506040614b0986828701613ea3565b9150509250925092565b600060208284031215614b2957614b28613e1a565b5b6000614b378482850161432a565b91505092915050565b600080fd5b60008083601f840112614b5b57614b5a614061565b5b8235905067ffffffffffffffff811115614b7857614b77614b40565b5b602083019150836020820283011115614b9457614b9361411e565b5b9250929050565b60008060008060608587031215614bb557614bb4613e1a565b5b6000614bc387828801613ea3565b9450506020614bd487828801613ea3565b935050604085013567ffffffffffffffff811115614bf557614bf4613e1f565b5b614c0187828801614b45565b925092505092959194509250565b60008060408385031215614c2657614c25613e1a565b5b6000614c3485828601613e6d565b9250506020614c4585828601613e6d565b9150509250929050565b600080600080600060a08688031215614c6b57614c6a613e1a565b5b6000614c7988828901613e6d565b9550506020614c8a88828901613e6d565b9450506040614c9b88828901613ea3565b9350506060614cac88828901613ea3565b925050608086013567ffffffffffffffff811115614ccd57614ccc613e1f565b5b614cd988828901614491565b9150509295509295909350565b600060208284031215614cfc57614cfb613e1a565b5b6000614d0a84828501613e6d565b91505092915050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000614d6f602a83614250565b9150614d7a82614d13565b604082019050919050565b60006020820190508181036000830152614d9e81614d62565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e0e82613e82565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e4057614e3f614dd4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614e9257607f821691505b602082108103614ea557614ea4614e4b565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614ed881614e7a565b614ee28186614eab565b94506001821660008114614efd5760018114614f1257614f45565b60ff1983168652811515820286019350614f45565b614f1b85614eb6565b60005b83811015614f3d57815481890152600182019150602081019050614f1e565b838801955050505b50505092915050565b6000614f5982614245565b614f638185614eab565b9350614f73818560208601614261565b80840191505092915050565b6000614f8b8286614ecb565b9150614f978285614f4e565b9150614fa38284614ecb565b9150819050949350505050565b6000614fbb82613e82565b9150614fc683613e82565b9250828202614fd481613e82565b91508282048414831517614feb57614fea614dd4565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061502c82613e82565b915061503783613e82565b92508261504757615046614ff2565b5b828204905092915050565b600060608201905061506760008301866143d2565b6150746020830185613ef8565b6150816040830184613ef8565b949350505050565b600081905092915050565b50565b60006150a4600083615089565b91506150af82615094565b600082019050919050565b60006150c582615097565b9150819050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b600061512b602983614250565b9150615136826150cf565b604082019050919050565b6000602082019050818103600083015261515a8161511e565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026151ae7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615171565b6151b88683615171565b95508019841693508086168417925050509392505050565b60006151eb6151e66151e184613e82565b6149ea565b613e82565b9050919050565b6000819050919050565b615205836151d0565b615219615211826151f2565b84845461517e565b825550505050565b600090565b61522e615221565b6152398184846151fc565b505050565b5b8181101561525d57615252600082615226565b60018101905061523f565b5050565b601f8211156152a25761527381614eb6565b61527c84615161565b8101602085101561528b578190505b61529f61529785615161565b83018261523e565b50505b505050565b600082821c905092915050565b60006152c5600019846008026152a7565b1980831691505092915050565b60006152de83836152b4565b9150826002028217905092915050565b6152f782614245565b67ffffffffffffffff8111156153105761530f614077565b5b61531a8254614e7a565b615325828285615261565b600060209050601f8311600181146153585760008415615346578287015190505b61535085826152d2565b8655506153b8565b601f19841661536686614eb6565b60005b8281101561538e57848901518255600182019150602085019450602081019050615369565b868310156153ab57848901516153a7601f8916826152b4565b8355505b6001600288020188555050505b505050505050565b60008160601b9050919050565b60006153d8826153c0565b9050919050565b60006153ea826153cd565b9050919050565b6154026153fd82613e44565b6153df565b82525050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b61544f61544a82615408565b615434565b82525050565b600061546182856153f1565b601482019150615471828461543e565b6001820191508190509392505050565b600061548c82613e82565b915061549783613e82565b92508282019050808211156154af576154ae614dd4565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615511602683614250565b915061551c826154b5565b604082019050919050565b6000602082019050818103600083015261554081615504565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061557d602083614250565b915061558882615547565b602082019050919050565b600060208201905081810360008301526155ac81615570565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600061560f602a83614250565b915061561a826155b3565b604082019050919050565b6000602082019050818103600083015261563e81615602565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600061567b601983614250565b915061568682615645565b602082019050919050565b600060208201905081810360008301526156aa8161566e565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061570d602183614250565b9150615718826156b1565b604082019050919050565b6000602082019050818103600083015261573c81615700565b9050919050565b60006040820190506157586000830185613ef8565b6157656020830184613ef8565b9392505050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b60006157c8602e83614250565b91506157d38261576c565b604082019050919050565b600060208201905081810360008301526157f7816157bb565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615834601f83614250565b915061583f826157fe565b602082019050919050565b6000602082019050818103600083015261586381615827565b9050919050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006158c6602383614250565b91506158d18261586a565b604082019050919050565b600060208201905081810360008301526158f5816158b9565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000615958602483614250565b9150615963826158fc565b604082019050919050565b600060208201905081810360008301526159878161594b565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006159b58261598e565b6159bf8185615999565b93506159cf818560208601614261565b6159d881614066565b840191505092915050565b600060a0820190506159f860008301886143d2565b615a0560208301876143d2565b615a126040830186613ef8565b615a1f6060830185613ef8565b8181036080830152615a3181846159aa565b90509695505050505050565b600081519050615a4c81613f4e565b92915050565b600060208284031215615a6857615a67613e1a565b5b6000615a7684828501615a3d565b91505092915050565b60008160e01c9050919050565b600060033d1115615aab5760046000803e615aa8600051615a7f565b90505b90565b600060443d10615b3b57615ac0613e10565b60043d036004823e80513d602482011167ffffffffffffffff82111715615ae8575050615b3b565b808201805167ffffffffffffffff811115615b065750505050615b3b565b80602083010160043d038501811115615b23575050505050615b3b565b615b32826020018501866140a6565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615b9a603483614250565b9150615ba582615b3e565b604082019050919050565b60006020820190508181036000830152615bc981615b8d565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615c2c602883614250565b9150615c3782615bd0565b604082019050919050565b60006020820190508181036000830152615c5b81615c1f565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000615cbe602883614250565b9150615cc982615c62565b604082019050919050565b60006020820190508181036000830152615ced81615cb1565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615d50602583614250565b9150615d5b82615cf4565b604082019050919050565b60006020820190508181036000830152615d7f81615d43565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000615de2602a83614250565b9150615ded82615d86565b604082019050919050565b60006020820190508181036000830152615e1181615dd5565b9050919050565b60006040820190508181036000830152615e3281856147d5565b90508181036020830152615e4681846147d5565b90509392505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000615eab602983614250565b9150615eb682615e4f565b604082019050919050565b60006020820190508181036000830152615eda81615e9e565b9050919050565b600060a082019050615ef660008301886143d2565b615f0360208301876143d2565b8181036040830152615f1581866147d5565b90508181036060830152615f2981856147d5565b90508181036080830152615f3d81846159aa565b9050969550505050505056fea2646970667358221220c662ebfbaed5b0affef273e0dc817a819a88c8ef27bb5add9afa81f8aaa106d064736f6c63430008110033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f6170692e7374726565746d656c74732e636f6d2f68656973742f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c68747470733a2f2f6170692e7374726565746d656c74732e636f6d2f636f6c6c656374696f6e2f68656973740000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102455760003560e01c80637cb6475911610139578063a5097e62116100b6578063e985e9c51161007a578063e985e9c514610806578063f12f3eb814610843578063f242432a1461086c578063f2fde38b14610895578063f45105eb146108be578063fb796e6c146108e757610245565b8063a5097e6214610751578063b7c0b8e81461077a578063bd96b070146107a3578063e6d37b88146107bf578063e8a3d485146107db57610245565b806395d89b41116100fd57806395d89b411461066a578063972d8061146106955780639a4ef883146106d4578063a22cb465146106ff578063a496dedf1461072857610245565b80637cb64759146105995780637e5b1e24146105c25780638252ac99146105eb5780638da5cb5b14610616578063931688cb1461064157610245565b80632eb2c2d6116101c75780634e1273f41161018b5780634e1273f4146104d75780635a91a93a14610514578063715018a61461053057806371662399146105475780637b61d5261461057057610245565b80632eb2c2d6146104395780632eb4a7ab1461046257806339d5c6881461048d5780633ccfd60b146104b65780634ac29279146104c057610245565b80630c9648931161020e5780630c964893146103415780630e89341c1461036a57806317f293f7146103a75780631d4dcb74146103d25780632a55205a146103fb57610245565b8062fdd58e1461024a57806301ffc9a71461028757806304634d8d146102c457806306cae05e146102ed57806306fdde0314610316575b600080fd5b34801561025657600080fd5b50610271600480360381019061026c9190613eb8565b610912565b60405161027e9190613f07565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613f7a565b6109da565b6040516102bb9190613fc2565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190614021565b6109fc565b005b3480156102f957600080fd5b50610314600480360381019061030f91906141ba565b610a12565b005b34801561032257600080fd5b5061032b610b16565b60405161033891906142c4565b60405180910390f35b34801561034d57600080fd5b50610368600480360381019061036391906142e6565b610ba4565b005b34801561037657600080fd5b50610391600480360381019061038c91906142e6565b610c36565b60405161039e91906142c4565b60405180910390f35b3480156103b357600080fd5b506103bc610db2565b6040516103c99190613fc2565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f4919061433f565b610dc5565b005b34801561040757600080fd5b50610422600480360381019061041d9190614392565b610e74565b6040516104309291906143e1565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b91906144bf565b61105e565b005b34801561046e57600080fd5b506104776110cd565b60405161048491906145a7565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af91906145c2565b6110d3565b005b6104be611236565b005b3480156104cc57600080fd5b506104d56112b7565b005b3480156104e357600080fd5b506104fe60048036038101906104f991906146fd565b6112eb565b60405161050b9190614833565b60405180910390f35b61052e60048036038101906105299190614392565b611404565b005b34801561053c57600080fd5b50610545611606565b005b34801561055357600080fd5b5061056e600480360381019061056991906142e6565b61161a565b005b34801561057c57600080fd5b50610597600480360381019061059291906142e6565b6116b3565b005b3480156105a557600080fd5b506105c060048036038101906105bb9190614881565b611745565b005b3480156105ce57600080fd5b506105e960048036038101906105e4919061494f565b611757565b005b3480156105f757600080fd5b50610600611772565b60405161060d91906142c4565b60405180910390f35b34801561062257600080fd5b5061062b611800565b6040516106389190614998565b60405180910390f35b34801561064d57600080fd5b506106686004803603810190610663919061494f565b61182a565b005b34801561067657600080fd5b5061067f611845565b60405161068c91906142c4565b60405180910390f35b3480156106a157600080fd5b506106bc60048036038101906106b791906142e6565b6118d3565b6040516106cb939291906149b3565b60405180910390f35b3480156106e057600080fd5b506106e9611917565b6040516106f69190614a49565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190614a64565b61193d565b005b34801561073457600080fd5b5061074f600480360381019061074a9190614aa4565b611972565b005b34801561075d57600080fd5b50610778600480360381019061077391906141ba565b611a34565b005b34801561078657600080fd5b506107a1600480360381019061079c9190614b13565b611b38565b005b6107bd60048036038101906107b89190614392565b611b5d565b005b6107d960048036038101906107d49190614b9b565b611dd5565b005b3480156107e757600080fd5b506107f0612168565b6040516107fd91906142c4565b60405180910390f35b34801561081257600080fd5b5061082d60048036038101906108289190614c0f565b6121fa565b60405161083a9190613fc2565b60405180910390f35b34801561084f57600080fd5b5061086a60048036038101906108659190614392565b61228e565b005b34801561087857600080fd5b50610893600480360381019061088e9190614c4f565b612303565b005b3480156108a157600080fd5b506108bc60048036038101906108b79190614ce6565b612372565b005b3480156108ca57600080fd5b506108e560048036038101906108e09190614ce6565b6123f5565b005b3480156108f357600080fd5b506108fc612441565b6040516109099190613fc2565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097990614d85565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006109e582612477565b806109f557506109f482612559565b5b9050919050565b610a046125d3565b610a0e8282612651565b5050565b610a1a6125d3565b8051825114610a55576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060126000858152602001908152602001600020905082816000019080519060200190610a84929190613da6565b5060008160020160006101000a81548160ff02191690831515021790555060005b8351811015610b0f57828181518110610ac157610ac0614da5565b5b6020026020010151826001016000868481518110610ae257610ae1614da5565b5b60200260200101518152602001908152602001600020819055508080610b0790614e03565b915050610aa5565b5050505050565b60088054610b2390614e7a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4f90614e7a565b8015610b9c5780601f10610b7157610100808354040283529160200191610b9c565b820191906000526020600020905b815481529060010190602001808311610b7f57829003601f168201915b505050505081565b610bac6125d3565b60006012600083815260200190815260200160002090506000816000018054905003610c04576040517fbff1696200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160009054906101000a900460ff16158160020160006101000a81548160ff0219169083151502179055505050565b60606000600d6000848152602001908152602001600020604051806060016040529081600082015481526020016001820160009054906101000a900460ff161515151581526020016001820160019054906101000a900460ff16151515158152505090508060200151610cd5576040517f720874cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600b8054610ce490614e7a565b905011610d7b57600b8054610cf890614e7a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2490614e7a565b8015610d715780601f10610d4657610100808354040283529160200191610d71565b820191906000526020600020905b815481529060010190602001808311610d5457829003601f168201915b5050505050610daa565b600b610d86846127e6565b600c604051602001610d9a93929190614f7f565b6040516020818303038152906040525b915050919050565b601360009054906101000a900460ff1681565b610dcd6125d3565b6000600d600085815260200190815260200160002090508060010160009054906101000a900460ff1615610e2d576040517f8e0867a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828160000181905550818160010160016101000a81548160ff021916908315150217905550610e6e33856001604051806020016040528060008152506128b4565b50505050565b6000806000600560008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036110095760046040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000611013612a64565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661103f9190614fb0565b6110499190615021565b90508160000151819350935050509250929050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110b85761109b33612a6e565b6110b7576110a7612aba565b156110b6576110b533612ad1565b5b5b5b6110c58686868686612b15565b505050505050565b600e5481565b6110db612bb6565b8051825114611116576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601360009054906101000a900460ff1661115c576040517fcc0fe59200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015611229576111a73384838151811061117f5761117e614da5565b5b602002602001015184848151811061119a57611199614da5565b5b6020026020010151612c05565b7f69d4bb13bbea9a876c029efe6d2867d50564690f5bcdabdff357b29654e8a490338483815181106111dc576111db614da5565b5b60200260200101518484815181106111f7576111f6614da5565b5b602002602001015160405161120e93929190615052565b60405180910390a1808061122190614e03565b91505061115f565b50611232612e4b565b5050565b61123e6125d3565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611264906150ba565b60006040518083038185875af1925050503d80600081146112a1576040519150601f19603f3d011682016040523d82523d6000602084013e6112a6565b606091505b50509050806112b457600080fd5b50565b6112bf6125d3565b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b60608151835114611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890615141565b60405180910390fd5b6000835167ffffffffffffffff81111561134e5761134d614077565b5b60405190808252806020026020018201604052801561137c5781602001602082028036833780820191505090505b50905060005b84518110156113f9576113c98582815181106113a1576113a0614da5565b5b60200260200101518583815181106113bc576113bb614da5565b5b6020026020010151610912565b8282815181106113dc576113db614da5565b5b602002602001018181525050806113f290614e03565b9050611382565b508091505092915050565b61140c612bb6565b60006010600084815260200190815260200160002090506000816000018054905003611464576040517f7b5c3f3300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160009054906101000a900460ff166114ac576040517fcc0fe59200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81600001805490508110156115605760008260000182815481106114d6576114d5614da5565b5b90600052602060002001549050600084846001016000848152602001908152602001600020546115069190614fb0565b9050806115133384610912565b101561154b576040517f7ad786d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050808061155890614e03565b9150506114af565b5060005b81600001805490508110156115dd57600082600001828154811061158b5761158a614da5565b5b90600052602060002001549050600084846001016000848152602001908152602001600020546115bb9190614fb0565b90506115c8338383612c05565b505080806115d590614e03565b915050611564565b506115f9338484604051806020016040528060008152506128b4565b50611602612e4b565b5050565b61160e6125d3565b6116186000612e55565b565b6116226125d3565b6000600d600083815260200190815260200160002090508060010160009054906101000a900460ff16611681576040517f8e0867a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060010160019054906101000a900460ff16158160010160016101000a81548160ff0219169083151502179055505050565b6116bb6125d3565b60006010600083815260200190815260200160002090506000816000018054905003611713576040517f7b5c3f3300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160009054906101000a900460ff16158160020160006101000a81548160ff0219169083151502179055505050565b61174d6125d3565b80600e8190555050565b61175f6125d3565b80600a908161176e91906152ee565b5050565b600a805461177f90614e7a565b80601f01602080910402602001604051908101604052809291908181526020018280546117ab90614e7a565b80156117f85780601f106117cd576101008083540402835291602001916117f8565b820191906000526020600020905b8154815290600101906020018083116117db57829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118326125d3565b80600b908161184191906152ee565b5050565b6009805461185290614e7a565b80601f016020809104026020016040519081016040528092919081815260200182805461187e90614e7a565b80156118cb5780601f106118a0576101008083540402835291602001916118cb565b820191906000526020600020905b8154815290600101906020018083116118ae57829003601f168201915b505050505081565b600d6020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16908060010160019054906101000a900460ff16905083565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b8161194781612a6e565b61196357611953612aba565b156119625761196181612ad1565b5b5b61196d8383612f1b565b505050565b61197a6125d3565b6000600d600084815260200190815260200160002090508060010160009054906101000a900460ff166119d9576040517f720874cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8451811015611a2d57611a1a8582815181106119fb576119fa614da5565b5b60200260200101518585604051806020016040528060008152506128b4565b8080611a2590614e03565b9150506119dc565b5050505050565b611a3c6125d3565b8051825114611a77576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060106000858152602001908152602001600020905082816000019080519060200190611aa6929190613da6565b5060008160020160006101000a81548160ff02191690831515021790555060005b8351811015611b3157828181518110611ae357611ae2614da5565b5b6020026020010151826001016000868481518110611b0457611b03614da5565b5b60200260200101518152602001908152602001600020819055508080611b2990614e03565b915050611ac7565b5050505050565b611b406125d3565b80600760006101000a81548160ff02191690831515021790555050565b611b65612bb6565b60006012600084815260200190815260200160002090506000816000018054905003611bbd576040517fbff1696200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160009054906101000a900460ff16611c05576040517fcc0fe59200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8160000180549050811015611cb9576000826000018281548110611c2f57611c2e614da5565b5b9060005260206000200154905060008484600101600084815260200190815260200160002054611c5f9190614fb0565b905080611c6c3384610912565b1015611ca4576040517f7ad786d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50508080611cb190614e03565b915050611c08565b5060005b8160000180549050811015611d36576000826000018281548110611ce457611ce3614da5565b5b9060005260206000200154905060008484600101600084815260200190815260200160002054611d149190614fb0565b9050611d21338383612c05565b50508080611d2e90614e03565b915050611cbd565b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efa793a03385856040518463ffffffff1660e01b8152600401611d9693929190615052565b600060405180830381600087803b158015611db057600080fd5b505af1158015611dc4573d6000803e3d6000fd5b5050505050611dd1612e4b565b5050565b611ddd612bb6565b60008390506000600d600087815260200190815260200160002090508060010160009054906101000a900460ff16611e41576040517f720874cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060010160019054906101000a900460ff16611e89576040517f914edb0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b848160000154611e999190614fb0565b341015611ed2576040517f583aa02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661213d576000600160f81b90506000600260f81b905060003383604051602001611f5b929190615455565b604051602081830303815290604052805190602001209050611fc1878780806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483612f31565b1561203f576001600f60008b815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060058561203c9190615481565b94505b60003383604051602001612054929190615455565b6040516020818303038152906040528051906020012090506120ba888880806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483612f31565b15612138576001600f60008c815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506002866121359190615481565b95505b505050505b612158338784604051806020016040528060008152506128b4565b5050612162612e4b565b50505050565b6060600a805461217790614e7a565b80601f01602080910402602001604051908101604052809291908181526020018280546121a390614e7a565b80156121f05780601f106121c5576101008083540402835291602001916121f0565b820191906000526020600020905b8154815290600101906020018083116121d357829003601f168201915b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122966125d3565b6000600d600084815260200190815260200160002090508060010160009054906101000a900460ff166122f5576040517f8e0867a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160000181905550505050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461235d5761234033612a6e565b61235c5761234c612aba565b1561235b5761235a33612ad1565b5b5b5b61236a8686868686612f48565b505050505050565b61237a6125d3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e090615527565b60405180910390fd5b6123f281612e55565b50565b6123fd6125d3565b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760009054906101000a900460ff1681565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061254257507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612552575061255182612fe9565b5b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125cc57506125cb82612477565b5b9050919050565b6125db613053565b73ffffffffffffffffffffffffffffffffffffffff166125f9611800565b73ffffffffffffffffffffffffffffffffffffffff161461264f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264690615593565b60405180910390fd5b565b612659612a64565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156126b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ae90615625565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271d90615691565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600460008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6060600060016127f58461305b565b01905060008167ffffffffffffffff81111561281457612813614077565b5b6040519080825280601f01601f1916602001820160405280156128465781602001600182028036833780820191505090505b509050600082602001820190505b6001156128a9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161289d5761289c614ff2565b5b04945060008503612854575b819350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291a90615723565b60405180910390fd5b600061292d613053565b9050600061293a856131ae565b90506000612947856131ae565b905061295883600089858589613228565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129b79190615481565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612a35929190615743565b60405180910390a4612a4c83600089858589613230565b612a5b83600089898989613238565b50505050505050565b6000612710905090565b6000731e0049783f008a0085193e00003d00cd54003c7173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000600760009054906101000a900460ff16905090565b69c617113400112233445560005230601a5280603a52600080604460166daaeb6d7670e522a718067333cd4e5afa612b0d573d6000803e3d6000fd5b6000603a5250565b612b1d613053565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612b635750612b6285612b5d613053565b6121fa565b5b612ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b99906157de565b60405180910390fd5b612baf858585858561340f565b5050505050565b600260065403612bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf29061584a565b60405180910390fd5b6002600681905550565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6b906158dc565b60405180910390fd5b6000612c7e613053565b90506000612c8b846131ae565b90506000612c98846131ae565b9050612cb883876000858560405180602001604052806000815250613228565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d469061596e565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612e1c929190615743565b60405180910390a4612e4284886000868660405180602001604052806000815250613230565b50505050505050565b6001600681905550565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612f2d612f26613053565b8383613730565b5050565b600082612f3e858461389c565b1490509392505050565b612f50613053565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612f965750612f9585612f90613053565b6121fa565b5b612fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fcc906157de565b60405180910390fd5b612fe285858585856138f2565b5050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106130b9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816130af576130ae614ff2565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106130f6576d04ee2d6d415b85acef810000000083816130ec576130eb614ff2565b5b0492506020810190505b662386f26fc10000831061312557662386f26fc10000838161311b5761311a614ff2565b5b0492506010810190505b6305f5e100831061314e576305f5e100838161314457613143614ff2565b5b0492506008810190505b612710831061317357612710838161316957613168614ff2565b5b0492506004810190505b60648310613196576064838161318c5761318b614ff2565b5b0492506002810190505b600a83106131a5576001810190505b80915050919050565b60606000600167ffffffffffffffff8111156131cd576131cc614077565b5b6040519080825280602002602001820160405280156131fb5781602001602082028036833780820191505090505b509050828160008151811061321357613212614da5565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b6132578473ffffffffffffffffffffffffffffffffffffffff16612454565b15613407578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161329d9594939291906159e3565b6020604051808303816000875af19250505080156132d957506040513d601f19601f820116820180604052508101906132d69190615a52565b60015b61337e576132e5615a8c565b806308c379a00361334157506132f9615aae565b806133045750613343565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333891906142c4565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337590615bb0565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133fc90615c42565b60405180910390fd5b505b505050505050565b8151835114613453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344a90615cd4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036134c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b990615d66565b60405180910390fd5b60006134cc613053565b90506134dc818787878787613228565b60005b845181101561368d5760008582815181106134fd576134fc614da5565b5b60200260200101519050600085838151811061351c5761351b614da5565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156135bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b490615df8565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136729190615481565b925050819055505050508061368690614e03565b90506134df565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051613704929190615e18565b60405180910390a461371a818787878787613230565b613728818787878787613b8d565b505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361379e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161379590615ec1565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161388f9190613fc2565b60405180910390a3505050565b60008082905060005b84518110156138e7576138d2828683815181106138c5576138c4614da5565b5b6020026020010151613d64565b915080806138df90614e03565b9150506138a5565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161395890615d66565b60405180910390fd5b600061396b613053565b90506000613978856131ae565b90506000613985856131ae565b9050613995838989858589613228565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015613a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2390615df8565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613ae19190615481565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051613b5e929190615743565b60405180910390a4613b74848a8a86868a613230565b613b82848a8a8a8a8a613238565b505050505050505050565b613bac8473ffffffffffffffffffffffffffffffffffffffff16612454565b15613d5c578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613bf2959493929190615ee1565b6020604051808303816000875af1925050508015613c2e57506040513d601f19601f82011682018060405250810190613c2b9190615a52565b60015b613cd357613c3a615a8c565b806308c379a003613c965750613c4e615aae565b80613c595750613c98565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c8d91906142c4565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cca90615bb0565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d5190615c42565b60405180910390fd5b505b505050505050565b6000818310613d7c57613d778284613d8f565b613d87565b613d868383613d8f565b5b905092915050565b600082600052816020526040600020905092915050565b828054828255906000526020600020908101928215613de2579160200282015b82811115613de1578251825591602001919060010190613dc6565b5b509050613def9190613df3565b5090565b5b80821115613e0c576000816000905550600101613df4565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e4f82613e24565b9050919050565b613e5f81613e44565b8114613e6a57600080fd5b50565b600081359050613e7c81613e56565b92915050565b6000819050919050565b613e9581613e82565b8114613ea057600080fd5b50565b600081359050613eb281613e8c565b92915050565b60008060408385031215613ecf57613ece613e1a565b5b6000613edd85828601613e6d565b9250506020613eee85828601613ea3565b9150509250929050565b613f0181613e82565b82525050565b6000602082019050613f1c6000830184613ef8565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f5781613f22565b8114613f6257600080fd5b50565b600081359050613f7481613f4e565b92915050565b600060208284031215613f9057613f8f613e1a565b5b6000613f9e84828501613f65565b91505092915050565b60008115159050919050565b613fbc81613fa7565b82525050565b6000602082019050613fd76000830184613fb3565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613ffe81613fdd565b811461400957600080fd5b50565b60008135905061401b81613ff5565b92915050565b6000806040838503121561403857614037613e1a565b5b600061404685828601613e6d565b92505060206140578582860161400c565b9150509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140af82614066565b810181811067ffffffffffffffff821117156140ce576140cd614077565b5b80604052505050565b60006140e1613e10565b90506140ed82826140a6565b919050565b600067ffffffffffffffff82111561410d5761410c614077565b5b602082029050602081019050919050565b600080fd5b6000614136614131846140f2565b6140d7565b905080838252602082019050602084028301858111156141595761415861411e565b5b835b81811015614182578061416e8882613ea3565b84526020840193505060208101905061415b565b5050509392505050565b600082601f8301126141a1576141a0614061565b5b81356141b1848260208601614123565b91505092915050565b6000806000606084860312156141d3576141d2613e1a565b5b60006141e186828701613ea3565b935050602084013567ffffffffffffffff81111561420257614201613e1f565b5b61420e8682870161418c565b925050604084013567ffffffffffffffff81111561422f5761422e613e1f565b5b61423b8682870161418c565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b60005b8381101561427f578082015181840152602081019050614264565b60008484015250505050565b600061429682614245565b6142a08185614250565b93506142b0818560208601614261565b6142b981614066565b840191505092915050565b600060208201905081810360008301526142de818461428b565b905092915050565b6000602082840312156142fc576142fb613e1a565b5b600061430a84828501613ea3565b91505092915050565b61431c81613fa7565b811461432757600080fd5b50565b60008135905061433981614313565b92915050565b60008060006060848603121561435857614357613e1a565b5b600061436686828701613ea3565b935050602061437786828701613ea3565b92505060406143888682870161432a565b9150509250925092565b600080604083850312156143a9576143a8613e1a565b5b60006143b785828601613ea3565b92505060206143c885828601613ea3565b9150509250929050565b6143db81613e44565b82525050565b60006040820190506143f660008301856143d2565b6144036020830184613ef8565b9392505050565b600080fd5b600067ffffffffffffffff82111561442a57614429614077565b5b61443382614066565b9050602081019050919050565b82818337600083830152505050565b600061446261445d8461440f565b6140d7565b90508281526020810184848401111561447e5761447d61440a565b5b614489848285614440565b509392505050565b600082601f8301126144a6576144a5614061565b5b81356144b684826020860161444f565b91505092915050565b600080600080600060a086880312156144db576144da613e1a565b5b60006144e988828901613e6d565b95505060206144fa88828901613e6d565b945050604086013567ffffffffffffffff81111561451b5761451a613e1f565b5b6145278882890161418c565b935050606086013567ffffffffffffffff81111561454857614547613e1f565b5b6145548882890161418c565b925050608086013567ffffffffffffffff81111561457557614574613e1f565b5b61458188828901614491565b9150509295509295909350565b6000819050919050565b6145a18161458e565b82525050565b60006020820190506145bc6000830184614598565b92915050565b600080604083850312156145d9576145d8613e1a565b5b600083013567ffffffffffffffff8111156145f7576145f6613e1f565b5b6146038582860161418c565b925050602083013567ffffffffffffffff81111561462457614623613e1f565b5b6146308582860161418c565b9150509250929050565b600067ffffffffffffffff82111561465557614654614077565b5b602082029050602081019050919050565b60006146796146748461463a565b6140d7565b9050808382526020820190506020840283018581111561469c5761469b61411e565b5b835b818110156146c557806146b18882613e6d565b84526020840193505060208101905061469e565b5050509392505050565b600082601f8301126146e4576146e3614061565b5b81356146f4848260208601614666565b91505092915050565b6000806040838503121561471457614713613e1a565b5b600083013567ffffffffffffffff81111561473257614731613e1f565b5b61473e858286016146cf565b925050602083013567ffffffffffffffff81111561475f5761475e613e1f565b5b61476b8582860161418c565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6147aa81613e82565b82525050565b60006147bc83836147a1565b60208301905092915050565b6000602082019050919050565b60006147e082614775565b6147ea8185614780565b93506147f583614791565b8060005b8381101561482657815161480d88826147b0565b9750614818836147c8565b9250506001810190506147f9565b5085935050505092915050565b6000602082019050818103600083015261484d81846147d5565b905092915050565b61485e8161458e565b811461486957600080fd5b50565b60008135905061487b81614855565b92915050565b60006020828403121561489757614896613e1a565b5b60006148a58482850161486c565b91505092915050565b600067ffffffffffffffff8211156148c9576148c8614077565b5b6148d282614066565b9050602081019050919050565b60006148f26148ed846148ae565b6140d7565b90508281526020810184848401111561490e5761490d61440a565b5b614919848285614440565b509392505050565b600082601f83011261493657614935614061565b5b81356149468482602086016148df565b91505092915050565b60006020828403121561496557614964613e1a565b5b600082013567ffffffffffffffff81111561498357614982613e1f565b5b61498f84828501614921565b91505092915050565b60006020820190506149ad60008301846143d2565b92915050565b60006060820190506149c86000830186613ef8565b6149d56020830185613fb3565b6149e26040830184613fb3565b949350505050565b6000819050919050565b6000614a0f614a0a614a0584613e24565b6149ea565b613e24565b9050919050565b6000614a21826149f4565b9050919050565b6000614a3382614a16565b9050919050565b614a4381614a28565b82525050565b6000602082019050614a5e6000830184614a3a565b92915050565b60008060408385031215614a7b57614a7a613e1a565b5b6000614a8985828601613e6d565b9250506020614a9a8582860161432a565b9150509250929050565b600080600060608486031215614abd57614abc613e1a565b5b600084013567ffffffffffffffff811115614adb57614ada613e1f565b5b614ae7868287016146cf565b9350506020614af886828701613ea3565b9250506040614b0986828701613ea3565b9150509250925092565b600060208284031215614b2957614b28613e1a565b5b6000614b378482850161432a565b91505092915050565b600080fd5b60008083601f840112614b5b57614b5a614061565b5b8235905067ffffffffffffffff811115614b7857614b77614b40565b5b602083019150836020820283011115614b9457614b9361411e565b5b9250929050565b60008060008060608587031215614bb557614bb4613e1a565b5b6000614bc387828801613ea3565b9450506020614bd487828801613ea3565b935050604085013567ffffffffffffffff811115614bf557614bf4613e1f565b5b614c0187828801614b45565b925092505092959194509250565b60008060408385031215614c2657614c25613e1a565b5b6000614c3485828601613e6d565b9250506020614c4585828601613e6d565b9150509250929050565b600080600080600060a08688031215614c6b57614c6a613e1a565b5b6000614c7988828901613e6d565b9550506020614c8a88828901613e6d565b9450506040614c9b88828901613ea3565b9350506060614cac88828901613ea3565b925050608086013567ffffffffffffffff811115614ccd57614ccc613e1f565b5b614cd988828901614491565b9150509295509295909350565b600060208284031215614cfc57614cfb613e1a565b5b6000614d0a84828501613e6d565b91505092915050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000614d6f602a83614250565b9150614d7a82614d13565b604082019050919050565b60006020820190508181036000830152614d9e81614d62565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e0e82613e82565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e4057614e3f614dd4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614e9257607f821691505b602082108103614ea557614ea4614e4b565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614ed881614e7a565b614ee28186614eab565b94506001821660008114614efd5760018114614f1257614f45565b60ff1983168652811515820286019350614f45565b614f1b85614eb6565b60005b83811015614f3d57815481890152600182019150602081019050614f1e565b838801955050505b50505092915050565b6000614f5982614245565b614f638185614eab565b9350614f73818560208601614261565b80840191505092915050565b6000614f8b8286614ecb565b9150614f978285614f4e565b9150614fa38284614ecb565b9150819050949350505050565b6000614fbb82613e82565b9150614fc683613e82565b9250828202614fd481613e82565b91508282048414831517614feb57614fea614dd4565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061502c82613e82565b915061503783613e82565b92508261504757615046614ff2565b5b828204905092915050565b600060608201905061506760008301866143d2565b6150746020830185613ef8565b6150816040830184613ef8565b949350505050565b600081905092915050565b50565b60006150a4600083615089565b91506150af82615094565b600082019050919050565b60006150c582615097565b9150819050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b600061512b602983614250565b9150615136826150cf565b604082019050919050565b6000602082019050818103600083015261515a8161511e565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026151ae7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615171565b6151b88683615171565b95508019841693508086168417925050509392505050565b60006151eb6151e66151e184613e82565b6149ea565b613e82565b9050919050565b6000819050919050565b615205836151d0565b615219615211826151f2565b84845461517e565b825550505050565b600090565b61522e615221565b6152398184846151fc565b505050565b5b8181101561525d57615252600082615226565b60018101905061523f565b5050565b601f8211156152a25761527381614eb6565b61527c84615161565b8101602085101561528b578190505b61529f61529785615161565b83018261523e565b50505b505050565b600082821c905092915050565b60006152c5600019846008026152a7565b1980831691505092915050565b60006152de83836152b4565b9150826002028217905092915050565b6152f782614245565b67ffffffffffffffff8111156153105761530f614077565b5b61531a8254614e7a565b615325828285615261565b600060209050601f8311600181146153585760008415615346578287015190505b61535085826152d2565b8655506153b8565b601f19841661536686614eb6565b60005b8281101561538e57848901518255600182019150602085019450602081019050615369565b868310156153ab57848901516153a7601f8916826152b4565b8355505b6001600288020188555050505b505050505050565b60008160601b9050919050565b60006153d8826153c0565b9050919050565b60006153ea826153cd565b9050919050565b6154026153fd82613e44565b6153df565b82525050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b61544f61544a82615408565b615434565b82525050565b600061546182856153f1565b601482019150615471828461543e565b6001820191508190509392505050565b600061548c82613e82565b915061549783613e82565b92508282019050808211156154af576154ae614dd4565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615511602683614250565b915061551c826154b5565b604082019050919050565b6000602082019050818103600083015261554081615504565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061557d602083614250565b915061558882615547565b602082019050919050565b600060208201905081810360008301526155ac81615570565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600061560f602a83614250565b915061561a826155b3565b604082019050919050565b6000602082019050818103600083015261563e81615602565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600061567b601983614250565b915061568682615645565b602082019050919050565b600060208201905081810360008301526156aa8161566e565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061570d602183614250565b9150615718826156b1565b604082019050919050565b6000602082019050818103600083015261573c81615700565b9050919050565b60006040820190506157586000830185613ef8565b6157656020830184613ef8565b9392505050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b60006157c8602e83614250565b91506157d38261576c565b604082019050919050565b600060208201905081810360008301526157f7816157bb565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615834601f83614250565b915061583f826157fe565b602082019050919050565b6000602082019050818103600083015261586381615827565b9050919050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006158c6602383614250565b91506158d18261586a565b604082019050919050565b600060208201905081810360008301526158f5816158b9565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000615958602483614250565b9150615963826158fc565b604082019050919050565b600060208201905081810360008301526159878161594b565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006159b58261598e565b6159bf8185615999565b93506159cf818560208601614261565b6159d881614066565b840191505092915050565b600060a0820190506159f860008301886143d2565b615a0560208301876143d2565b615a126040830186613ef8565b615a1f6060830185613ef8565b8181036080830152615a3181846159aa565b90509695505050505050565b600081519050615a4c81613f4e565b92915050565b600060208284031215615a6857615a67613e1a565b5b6000615a7684828501615a3d565b91505092915050565b60008160e01c9050919050565b600060033d1115615aab5760046000803e615aa8600051615a7f565b90505b90565b600060443d10615b3b57615ac0613e10565b60043d036004823e80513d602482011167ffffffffffffffff82111715615ae8575050615b3b565b808201805167ffffffffffffffff811115615b065750505050615b3b565b80602083010160043d038501811115615b23575050505050615b3b565b615b32826020018501866140a6565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615b9a603483614250565b9150615ba582615b3e565b604082019050919050565b60006020820190508181036000830152615bc981615b8d565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615c2c602883614250565b9150615c3782615bd0565b604082019050919050565b60006020820190508181036000830152615c5b81615c1f565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000615cbe602883614250565b9150615cc982615c62565b604082019050919050565b60006020820190508181036000830152615ced81615cb1565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615d50602583614250565b9150615d5b82615cf4565b604082019050919050565b60006020820190508181036000830152615d7f81615d43565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000615de2602a83614250565b9150615ded82615d86565b604082019050919050565b60006020820190508181036000830152615e1181615dd5565b9050919050565b60006040820190508181036000830152615e3281856147d5565b90508181036020830152615e4681846147d5565b90509392505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000615eab602983614250565b9150615eb682615e4f565b604082019050919050565b60006020820190508181036000830152615eda81615e9e565b9050919050565b600060a082019050615ef660008301886143d2565b615f0360208301876143d2565b8181036040830152615f1581866147d5565b90508181036060830152615f2981856147d5565b90508181036080830152615f3d81846159aa565b9050969550505050505056fea2646970667358221220c662ebfbaed5b0affef273e0dc817a819a88c8ef27bb5add9afa81f8aaa106d064736f6c63430008110033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f6170692e7374726565746d656c74732e636f6d2f68656973742f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c68747470733a2f2f6170692e7374726565746d656c74732e636f6d2f636f6c6c656374696f6e2f68656973740000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseURI (string): https://api.streetmelts.com/heist/
Arg [1] : _contractMeta (string): https://api.streetmelts.com/collection/heist

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000022
Arg [3] : 68747470733a2f2f6170692e7374726565746d656c74732e636f6d2f68656973
Arg [4] : 742f000000000000000000000000000000000000000000000000000000000000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000002c
Arg [6] : 68747470733a2f2f6170692e7374726565746d656c74732e636f6d2f636f6c6c
Arg [7] : 656374696f6e2f68656973740000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

80539:11143:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64616:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90869:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91093:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88639:489;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80728:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89136:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85988:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81667:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86366:340;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52956:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;90616:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81134:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88049:426;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89990:168;;;:::i;:::-;;88483:106;;;;;;;;;;;;;:::i;:::-;;65012:499;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84057:938;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42175:103;;;;;;;;;;;;;:::i;:::-;;86962:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87739:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89878:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89529:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80807:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41527:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89426:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80770:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81038:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;81450:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90202:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82495:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87246:485;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91245:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85003:949;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82847:1202;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89645:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65811:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86714:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90386:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42433:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89754:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80660:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64616:230;64702:7;64749:1;64730:21;;:7;:21;;;64722:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;64816:9;:13;64826:2;64816:13;;;;;;;;;;;:22;64830:7;64816:22;;;;;;;;;;;;;;;;64809:29;;64616:230;;;;:::o;90869:216::-;90973:4;90997:38;91023:11;90997:25;:38::i;:::-;:80;;;;91039:38;91065:11;91039:25;:38::i;:::-;90997:80;90990:87;;90869:216;;;:::o;91093:144::-;41413:13;:11;:13::i;:::-;91187:42:::1;91206:8;91216:12;91187:18;:42::i;:::-;91093:144:::0;;:::o;88639:489::-;41413:13;:11;:13::i;:::-;88778:8:::1;:15;88758:9;:16;:35;88755:68;;88802:21;;;;;;;;;;;;;;88755:68;88836:32;88871:15;:25;88887:8;88871:25;;;;;;;;;;;88836:60;;88936:9;88907:12;:26;;:38;;;;;;;;;;;;:::i;:::-;;88982:5;88956:12;:23;;;:31;;;;;;;;;;;;;;;;;;89004:6;89000:121;89020:9;:16;89016:1;:20;89000:121;;;89098:8;89107:1;89098:11;;;;;;;;:::i;:::-;;;;;;;;89058:12;:23;;:37;89082:9;89092:1;89082:12;;;;;;;;:::i;:::-;;;;;;;;89058:37;;;;;;;;;;;:51;;;;89038:3;;;;;:::i;:::-;;;;89000:121;;;;88744:384;88639:489:::0;;;:::o;80728:35::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;89136:260::-;41413:13;:11;:13::i;:::-;89204:27:::1;89234:15;:25;89250:8;89234:25;;;;;;;;;;;89204:55;;89305:1;89273:7;:21;;:28;;;;:33:::0;89270:67:::1;;89315:22;;;;;;;;;;;;;;89270:67;89370:7;:18;;;;;;;;;;;;89369:19;89348:7;:18;;;:40;;;;;;;;;;;;;;;;;;89193:203;89136:260:::0;:::o;85988:326::-;86048:13;86074:28;86105:12;:21;86118:7;86105:21;;;;;;;;;;;86074:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86141:8;:16;;;86137:45;;86166:16;;;;;;;;;;;;;;86137:45;86224:1;86206:7;86200:21;;;;;:::i;:::-;;;:25;:106;;86299:7;86200:106;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86252:7;86261:18;:7;:16;:18::i;:::-;86281:13;86235:60;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;86200:106;86193:113;;;85988:326;;;:::o;81667:38::-;;;;;;;;;;;;;:::o;86366:340::-;41413:13;:11;:13::i;:::-;86462:29:::1;86494:12;:22;86507:8;86494:22;;;;;;;;;;;86462:54;;86530:8;:16;;;;;;;;;;;;86527:43;;;86555:15;;;;;;;;;;;;;;86527:43;86604:5;86583:8;:18;;:26;;;;86642:9;86620:8;:19;;;:31;;;;;;;;;;;;;;;;;;86664:34;86670:10;86682:8;86692:1;86664:34;;;;;;;;;;;::::0;:5:::1;:34::i;:::-;86451:255;86366:340:::0;;;:::o;52956:442::-;53053:7;53062;53082:26;53111:17;:27;53129:8;53111:27;;;;;;;;;;;53082:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53183:1;53155:30;;:7;:16;;;:30;;;53151:92;;53212:19;53202:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53151:92;53255:21;53320:17;:15;:17::i;:::-;53279:58;;53293:7;:23;;;53280:36;;:10;:36;;;;:::i;:::-;53279:58;;;;:::i;:::-;53255:82;;53358:7;:16;;;53376:13;53350:40;;;;;;52956:442;;;;;:::o;90616:245::-;90779:4;46217:10;46209:18;;:4;:18;;;46205:184;;46249:31;46269:10;46249:19;:31::i;:::-;46244:134;;46305:27;:25;:27::i;:::-;46301:61;;;46334:28;46351:10;46334:16;:28::i;:::-;46301:61;46244:134;46205:184;90796:57:::1;90824:4;90830:2;90834:3;90839:7;90848:4;90796:27;:57::i;:::-;90616:245:::0;;;;;;:::o;81134:25::-;;;;:::o;88049:426::-;39458:21;:19;:21::i;:::-;88171:7:::1;:14;88152:8;:15;:33;88149:66;;88194:21;;;;;;;;;;;;;;88149:66;88230:18;;;;;;;;;;;88226:46;;88257:15;;;;;;;;;;;;;;88226:46;88289:6;88285:183;88305:8;:15;88301:1;:19;88285:183;;;88344:42;88350:10;88362:8;88371:1;88362:11;;;;;;;;:::i;:::-;;;;;;;;88375:7;88383:1;88375:10;;;;;;;;:::i;:::-;;;;;;;;88344:5;:42::i;:::-;88406:48;88418:10;88430:8;88439:1;88430:11;;;;;;;;:::i;:::-;;;;;;;;88443:7;88451:1;88443:10;;;;;;;;:::i;:::-;;;;;;;;88406:48;;;;;;;;:::i;:::-;;;;;;;;88322:3;;;;;:::i;:::-;;;;88285:183;;;;39502:20:::0;:18;:20::i;:::-;88049:426;;:::o;89990:168::-;41413:13;:11;:13::i;:::-;90047:12:::1;90073:10;90065:24;;90097:21;90065:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90046:77;;;90142:7;90134:16;;;::::0;::::1;;90035:123;89990:168::o:0;88483:106::-;41413:13;:11;:13::i;:::-;88563:18:::1;;;;;;;;;;;88562:19;88541:18;;:40;;;;;;;;;;;;;;;;;;88483:106::o:0;65012:499::-;65148:16;65204:3;:10;65185:8;:15;:29;65177:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;65273:30;65320:8;:15;65306:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65273:63;;65354:9;65349:122;65373:8;:15;65369:1;:19;65349:122;;;65429:30;65439:8;65448:1;65439:11;;;;;;;;:::i;:::-;;;;;;;;65452:3;65456:1;65452:6;;;;;;;;:::i;:::-;;;;;;;;65429:9;:30::i;:::-;65410:13;65424:1;65410:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;65390:3;;;;:::i;:::-;;;65349:122;;;;65490:13;65483:20;;;65012:499;;;;:::o;84057:938::-;39458:21;:19;:21::i;:::-;84152:26:::1;84181:17;:25;84199:6;84181:25;;;;;;;;;;;84152:54;;84254:1;84222:7;:21;;:28;;;;:33:::0;84219:66:::1;;84264:21;;;;;;;;;;;;;;84219:66;84300:7;:18;;;;;;;;;;;;84296:46;;84327:15;;;;;;;;;;;;;;84296:46;84359:6;84355:296;84375:7;:21;;:28;;;;84371:1;:32;84355:296;;;84425:13;84441:7;:21;;84463:1;84441:24;;;;;;;;:::i;:::-;;;;;;;;;;84425:40;;84480:16;84530:7;84499;:18;;:28;84518:8;84499:28;;;;;;;;;;;;:38;;;;:::i;:::-;84480:57;;84591:11;84557:31;84567:10;84579:8;84557:9;:31::i;:::-;:45;84554:85;;;84611:28;;;;;;;;;;;;;;84554:85;84410:241;;84405:3;;;;;:::i;:::-;;;;84355:296;;;;84667:6;84663:251;84683:7;:21;;:28;;;;84679:1;:32;84663:251;;;84733:13;84749:7;:21;;84771:1;84749:24;;;;;;;;:::i;:::-;;;;;;;;;;84733:40;;84788:16;84838:7;84807;:18;;:28;84826:8;84807:28;;;;;;;;;;;;:38;;;;:::i;:::-;84788:57;;84862:40;84868:10;84880:8;84890:11;84862:5;:40::i;:::-;84718:196;;84713:3;;;;;:::i;:::-;;;;84663:251;;;;84947:38;84953:10;84965:6;84973:7;84947:38;;;;;;;;;;;::::0;:5:::1;:38::i;:::-;84139:856;39502:20:::0;:18;:20::i;:::-;84057:938;;:::o;42175:103::-;41413:13;:11;:13::i;:::-;42240:30:::1;42267:1;42240:18;:30::i;:::-;42175:103::o:0;86962:242::-;41413:13;:11;:13::i;:::-;87032:29:::1;87064:12;:22;87077:8;87064:22;;;;;;;;;;;87032:54;;87101:8;:16;;;;;;;;;;;;87097:44;;87126:15;;;;;;;;;;;;;;87097:44;87177:8;:19;;;;;;;;;;;;87176:20;87154:8;:19;;;:42;;;;;;;;;;;;;;;;;;87021:183;86962:242:::0;:::o;87739:271::-;41413:13;:11;:13::i;:::-;87802:30:::1;87835:17;:27;87853:8;87835:27;;;;;;;;;;;87802:60;;87912:1;87876:11;:25;;:32;;;;:37:::0;87873:70:::1;;87922:21;;;;;;;;;;;;;;87873:70;87980:11;:22;;;;;;;;;;;;87979:23;87954:11;:22;;;:48;;;;;;;;;;;;;;;;;;87791:219;87739:271:::0;:::o;89878:104::-;41413:13;:11;:13::i;:::-;89963:11:::1;89950:10;:24;;;;89878:104:::0;:::o;89529:108::-;41413:13;:11;:13::i;:::-;89625:4:::1;89606:16;:23;;;;;;:::i;:::-;;89529:108:::0;:::o;80807:30::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41527:87::-;41573:7;41600:6;;;;;;;;;;;41593:13;;41527:87;:::o;89426:95::-;41413:13;:11;:13::i;:::-;89509:4:::1;89499:7;:14;;;;;;:::i;:::-;;89426:95:::0;:::o;80770:30::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;81038:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;81450:28::-;;;;;;;;;;;;;:::o;90202:176::-;90306:8;46574:29;46594:8;46574:19;:29::i;:::-;46569:122;;46624:27;:25;:27::i;:::-;46620:59;;;46653:26;46670:8;46653:16;:26::i;:::-;46620:59;46569:122;90327:43:::1;90351:8;90361;90327:23;:43::i;:::-;90202:176:::0;;;:::o;82495:344::-;41413:13;:11;:13::i;:::-;82601:29:::1;82633:12;:20;82646:6;82633:20;;;;;;;;;;;82601:52;;82668:8;:16;;;;;;;;;;;;82664:45;;82693:16;;;;;;;;;;;;;;82664:45;82726:6;82722:110;82742:9;:16;82738:1;:20;82722:110;;;82780:40;82786:9;82796:1;82786:12;;;;;;;;:::i;:::-;;;;;;;;82800:6;82808:7;82780:40;;;;;;;;;;;::::0;:5:::1;:40::i;:::-;82760:3;;;;;:::i;:::-;;;;82722:110;;;;82590:249;82495:344:::0;;;:::o;87246:485::-;41413:13;:11;:13::i;:::-;87384:8:::1;:15;87364:9;:16;:35;87361:68;;87408:21;;;;;;;;;;;;;;87361:68;87442:30;87475:17;:27;87493:8;87475:27;;;;;;;;;;;87442:60;;87541:9;87513:11;:25;;:37;;;;;;;;;;;;:::i;:::-;;87586:5;87561:11;:22;;;:30;;;;;;;;;;;;;;;;;;87608:6;87604:120;87624:9;:16;87620:1;:20;87604:120;;;87701:8;87710:1;87701:11;;;;;;;;:::i;:::-;;;;;;;;87662;:22;;:36;87685:9;87695:1;87685:12;;;;;;;;:::i;:::-;;;;;;;;87662:36;;;;;;;;;;;:50;;;;87642:3;;;;;:::i;:::-;;;;87604:120;;;;87350:381;87246:485:::0;;;:::o;91245:117::-;41413:13;:11;:13::i;:::-;91349:5:::1;91322:24;;:32;;;;;;;;;;;;;;;;;;91245:117:::0;:::o;85003:949::-;39458:21;:19;:21::i;:::-;85098:27:::1;85128:15;:23;85144:6;85128:23;;;;;;;;;;;85098:53;;85199:1;85167:7;:21;;:28;;;;:33:::0;85164:67:::1;;85209:22;;;;;;;;;;;;;;85164:67;85246:7;:18;;;;;;;;;;;;85242:46;;85273:15;;;;;;;;;;;;;;85242:46;85305:6;85301:296;85321:7;:21;;:28;;;;85317:1;:32;85301:296;;;85371:13;85387:7;:21;;85409:1;85387:24;;;;;;;;:::i;:::-;;;;;;;;;;85371:40;;85426:16;85476:7;85445;:18;;:28;85464:8;85445:28;;;;;;;;;;;;:38;;;;:::i;:::-;85426:57;;85537:11;85503:31;85513:10;85525:8;85503:9;:31::i;:::-;:45;85500:85;;;85557:28;;;;;;;;;;;;;;85500:85;85356:241;;85351:3;;;;;:::i;:::-;;;;85301:296;;;;85613:6;85609:251;85629:7;:21;;:28;;;;85625:1;:32;85609:251;;;85679:13;85695:7;:21;;85717:1;85695:24;;;;;;;;:::i;:::-;;;;;;;;;;85679:40;;85734:16;85784:7;85753;:18;;:28;85772:8;85753:28;;;;;;;;;;;;:38;;;;:::i;:::-;85734:57;;85808:40;85814:10;85826:8;85836:11;85808:5;:40::i;:::-;85664:196;;85659:3;;;;;:::i;:::-;;;;85609:251;;;;85893:13;;;;;;;;;;;:22;;;85916:10;85928:6;85936:7;85893:51;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;85087:865;39502:20:::0;:18;:20::i;:::-;85003:949;;:::o;82847:1202::-;39458:21;:19;:21::i;:::-;82968:17:::1;82988:7;82968:27;;83008:29;83040:12;:20;83053:6;83040:20;;;;;;;;;;;83008:52;;83077:8;:16;;;;;;;;;;;;83073:45;;83102:16;;;;;;;;;;;;;;83073:45;83133:8;:19;;;;;;;;;;;;83129:47;;83161:15;;;;;;;;;;;;;;83129:47;83225:7;83204:8;:18;;;:28;;;;:::i;:::-;83192:9;:40;83189:66;;;83241:14;;;;;;;;;;;;;;83189:66;83297:15;:23;83313:6;83297:23;;;;;;;;;;;:35;83321:10;83297:35;;;;;;;;;;;;;;;;;;;;;;;;;83293:669;;83349:14;83366:4;83349:21;;;;83385:17;83405:4;83385:24;;;;83426:14;83470:10;83482:7;83453:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83443:48;;;;;;83426:65;;83509:52;83528:12;;83509:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83542:10;;83554:6;83509:18;:52::i;:::-;83506:170;;;83620:4;83582:15;:23;83598:6;83582:23;;;;;;;;;;;:35;83606:10;83582:35;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;83659:1;83643:17;;;;;:::i;:::-;;;83506:170;83692:17;83739:10;83751;83722:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83712:51;;;;;;83692:71;;83781:55;83800:12;;83781:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83814:10;;83826:9;83781:18;:55::i;:::-;83778:173;;;83895:4;83857:15;:23;83873:6;83857:23;;;;;;;;;;;:35;83881:10;83857:35;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;83934:1;83918:17;;;;;:::i;:::-;;;83778:173;83334:628;;;;83293:669;83996:43;84002:10;84014:6;84022:12;83996:43;;;;;;;;;;;::::0;:5:::1;:43::i;:::-;82955:1094;;39502:20:::0;:18;:20::i;:::-;82847:1202;;;;:::o;89645:101::-;89689:13;89722:16;89715:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89645:101;:::o;65811:168::-;65910:4;65934:18;:27;65953:7;65934:27;;;;;;;;;;;;;;;:37;65962:8;65934:37;;;;;;;;;;;;;;;;;;;;;;;;;65927:44;;65811:168;;;;:::o;86714:240::-;41413:13;:11;:13::i;:::-;86798:29:::1;86830:12;:22;86843:8;86830:22;;;;;;;;;;;86798:54;;86867:8;:16;;;;;;;;;;;;86863:44;;86892:15;;;;;;;;;;;;;;86863:44;86941:5;86920:8;:18;;:26;;;;86787:167;86714:240:::0;;:::o;90386:222::-;90528:4;46217:10;46209:18;;:4;:18;;;46205:184;;46249:31;46269:10;46249:19;:31::i;:::-;46244:134;;46305:27;:25;:27::i;:::-;46301:61;;;46334:28;46351:10;46334:16;:28::i;:::-;46301:61;46244:134;46205:184;90545:55:::1;90568:4;90574:2;90578:7;90587:6;90595:4;90545:22;:55::i;:::-;90386:222:::0;;;;;;:::o;42433:201::-;41413:13;:11;:13::i;:::-;42542:1:::1;42522:22;;:8;:22;;::::0;42514:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;42598:28;42617:8;42598:18;:28::i;:::-;42433:201:::0;:::o;89754:116::-;41413:13;:11;:13::i;:::-;89853:8:::1;89829:13;;:33;;;;;;;;;;;;;;;;;;89754:116:::0;:::o;80660:36::-;;;;;;;;;;;;;:::o;29022:326::-;29082:4;29339:1;29317:7;:19;;;:23;29310:30;;29022:326;;;:::o;63639:310::-;63741:4;63793:26;63778:41;;;:11;:41;;;;:110;;;;63851:37;63836:52;;;:11;:52;;;;63778:110;:163;;;;63905:36;63929:11;63905:23;:36::i;:::-;63778:163;63758:183;;63639:310;;;:::o;52686:215::-;52788:4;52827:26;52812:41;;;:11;:41;;;;:81;;;;52857:36;52881:11;52857:23;:36::i;:::-;52812:81;52805:88;;52686:215;;;:::o;41692:132::-;41767:12;:10;:12::i;:::-;41756:23;;:7;:5;:7::i;:::-;:23;;;41748:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41692:132::o;54048:332::-;54167:17;:15;:17::i;:::-;54151:33;;:12;:33;;;;54143:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;54270:1;54250:22;;:8;:22;;;54242:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;54337:35;;;;;;;;54349:8;54337:35;;;;;;54359:12;54337:35;;;;;54315:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54048:332;;:::o;24369:716::-;24425:13;24476:14;24513:1;24493:17;24504:5;24493:10;:17::i;:::-;:21;24476:38;;24529:20;24563:6;24552:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24529:41;;24585:11;24714:6;24710:2;24706:15;24698:6;24694:28;24687:35;;24751:288;24758:4;24751:288;;;24783:5;;;;;;;;24925:8;24920:2;24913:5;24909:14;24904:30;24899:3;24891:44;24981:2;24972:11;;;;;;:::i;:::-;;;;;25015:1;25006:5;:10;24751:288;25002:21;24751:288;25060:6;25053:13;;;;;24369:716;;;:::o;71232:686::-;71356:1;71342:16;;:2;:16;;;71334:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;71409:16;71428:12;:10;:12::i;:::-;71409:31;;71451:20;71474:21;71492:2;71474:17;:21::i;:::-;71451:44;;71506:24;71533:25;71551:6;71533:17;:25::i;:::-;71506:52;;71571:66;71592:8;71610:1;71614:2;71618:3;71623:7;71632:4;71571:20;:66::i;:::-;71671:6;71650:9;:13;71660:2;71650:13;;;;;;;;;;;:17;71664:2;71650:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;71730:2;71693:52;;71726:1;71693:52;;71708:8;71693:52;;;71734:2;71738:6;71693:52;;;;;;;:::i;:::-;;;;;;;;71758:65;71778:8;71796:1;71800:2;71804:3;71809:7;71818:4;71758:19;:65::i;:::-;71836:74;71867:8;71885:1;71889:2;71893;71897:6;71905:4;71836:30;:74::i;:::-;71323:595;;;71232:686;;;;:::o;53680:97::-;53738:6;53764:5;53757:12;;53680:97;:::o;91503:174::-;91582:4;91626:42;91606:63;;:8;:63;;;91599:70;;91503:174;;;:::o;91370:125::-;91439:4;91463:24;;;;;;;;;;;91456:31;;91370:125;:::o;46807:1359::-;47200:22;47194:4;47187:36;47293:9;47287:4;47280:23;47368:8;47362:4;47355:22;47545:4;47539;47533;47527;47500:25;47493:5;47482:68;47472:274;;47666:16;47660:4;47654;47639:44;47714:16;47708:4;47701:30;47472:274;48146:1;48140:4;48133:15;46807:1359;:::o;66534:438::-;66775:12;:10;:12::i;:::-;66767:20;;:4;:20;;;:60;;;;66791:36;66808:4;66814:12;:10;:12::i;:::-;66791:16;:36::i;:::-;66767:60;66745:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;66912:52;66935:4;66941:2;66945:3;66950:7;66959:4;66912:22;:52::i;:::-;66534:438;;;;;:::o;39538:293::-;38940:1;39672:7;;:19;39664:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38940:1;39805:7;:18;;;;39538:293::o;73432:774::-;73541:1;73525:18;;:4;:18;;;73517:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;73596:16;73615:12;:10;:12::i;:::-;73596:31;;73638:20;73661:21;73679:2;73661:17;:21::i;:::-;73638:44;;73693:24;73720:25;73738:6;73720:17;:25::i;:::-;73693:52;;73758:66;73779:8;73789:4;73803:1;73807:3;73812:7;73758:66;;;;;;;;;;;;:20;:66::i;:::-;73837:19;73859:9;:13;73869:2;73859:13;;;;;;;;;;;:19;73873:4;73859:19;;;;;;;;;;;;;;;;73837:41;;73912:6;73897:11;:21;;73889:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;74031:6;74017:11;:20;73995:9;:13;74005:2;73995:13;;;;;;;;;;;:19;74009:4;73995:19;;;;;;;;;;;;;;;:42;;;;74105:1;74066:54;;74091:4;74066:54;;74081:8;74066:54;;;74109:2;74113:6;74066:54;;;;;;;:::i;:::-;;;;;;;;74133:65;74153:8;74163:4;74177:1;74181:3;74186:7;74133:65;;;;;;;;;;;;:19;:65::i;:::-;73506:700;;;;73432:774;;;:::o;39839:213::-;38896:1;40022:7;:22;;;;39839:213::o;42794:191::-;42868:16;42887:6;;;;;;;;;;;42868:25;;42913:8;42904:6;;:17;;;;;;;;;;;;;;;;;;42968:8;42937:40;;42958:8;42937:40;;;;;;;;;;;;42857:128;42794:191;:::o;65584:155::-;65679:52;65698:12;:10;:12::i;:::-;65712:8;65722;65679:18;:52::i;:::-;65584:155;;:::o;1498:156::-;1589:4;1642;1613:25;1626:5;1633:4;1613:12;:25::i;:::-;:33;1606:40;;1498:156;;;;;:::o;66051:406::-;66267:12;:10;:12::i;:::-;66259:20;;:4;:20;;;:60;;;;66283:36;66300:4;66306:12;:10;:12::i;:::-;66283:16;:36::i;:::-;66259:60;66237:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;66404:45;66422:4;66428:2;66432;66436:6;66444:4;66404:17;:45::i;:::-;66051:406;;;;;:::o;50373:157::-;50458:4;50497:25;50482:40;;;:11;:40;;;;50475:47;;50373:157;;;:::o;27392:98::-;27445:7;27472:10;27465:17;;27392:98;:::o;19992:948::-;20045:7;20065:14;20082:1;20065:18;;20132:8;20123:5;:17;20119:106;;20170:8;20161:17;;;;;;:::i;:::-;;;;;20207:2;20197:12;;;;20119:106;20252:8;20243:5;:17;20239:106;;20290:8;20281:17;;;;;;:::i;:::-;;;;;20327:2;20317:12;;;;20239:106;20372:8;20363:5;:17;20359:106;;20410:8;20401:17;;;;;;:::i;:::-;;;;;20447:2;20437:12;;;;20359:106;20492:7;20483:5;:16;20479:103;;20529:7;20520:16;;;;;;:::i;:::-;;;;;20565:1;20555:11;;;;20479:103;20609:7;20600:5;:16;20596:103;;20646:7;20637:16;;;;;;:::i;:::-;;;;;20682:1;20672:11;;;;20596:103;20726:7;20717:5;:16;20713:103;;20763:7;20754:16;;;;;;:::i;:::-;;;;;20799:1;20789:11;;;;20713:103;20843:7;20834:5;:16;20830:68;;20881:1;20871:11;;;;20830:68;20926:6;20919:13;;;19992:948;;;:::o;79766:198::-;79832:16;79861:22;79900:1;79886:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79861:41;;79924:7;79913:5;79919:1;79913:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;79951:5;79944:12;;;79766:198;;;:::o;76789:221::-;;;;;;;:::o;77965:220::-;;;;;;;:::o;78193:744::-;78408:15;:2;:13;;;:15::i;:::-;78404:526;;;78461:2;78444:38;;;78483:8;78493:4;78499:2;78503:6;78511:4;78444:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;78440:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;78792:6;78785:14;;;;;;;;;;;:::i;:::-;;;;;;;;78440:479;;;78841:62;;;;;;;;;;:::i;:::-;;;;;;;;78440:479;78578:43;;;78566:55;;;:8;:55;;;;78562:154;;78646:50;;;;;;;;;;:::i;:::-;;;;;;;;78562:154;78517:214;78404:526;78193:744;;;;;;:::o;68768:1146::-;68995:7;:14;68981:3;:10;:28;68973:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;69087:1;69073:16;;:2;:16;;;69065:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;69144:16;69163:12;:10;:12::i;:::-;69144:31;;69188:60;69209:8;69219:4;69225:2;69229:3;69234:7;69243:4;69188:20;:60::i;:::-;69266:9;69261:421;69285:3;:10;69281:1;:14;69261:421;;;69317:10;69330:3;69334:1;69330:6;;;;;;;;:::i;:::-;;;;;;;;69317:19;;69351:14;69368:7;69376:1;69368:10;;;;;;;;:::i;:::-;;;;;;;;69351:27;;69395:19;69417:9;:13;69427:2;69417:13;;;;;;;;;;;:19;69431:4;69417:19;;;;;;;;;;;;;;;;69395:41;;69474:6;69459:11;:21;;69451:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;69607:6;69593:11;:20;69571:9;:13;69581:2;69571:13;;;;;;;;;;;:19;69585:4;69571:19;;;;;;;;;;;;;;;:42;;;;69664:6;69643:9;:13;69653:2;69643:13;;;;;;;;;;;:17;69657:2;69643:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;69302:380;;;69297:3;;;;:::i;:::-;;;69261:421;;;;69729:2;69699:47;;69723:4;69699:47;;69713:8;69699:47;;;69733:3;69738:7;69699:47;;;;;;;:::i;:::-;;;;;;;;69759:59;69779:8;69789:4;69795:2;69799:3;69804:7;69813:4;69759:19;:59::i;:::-;69831:75;69867:8;69877:4;69883:2;69887:3;69892:7;69901:4;69831:35;:75::i;:::-;68962:952;68768:1146;;;;;:::o;75534:297::-;75655:8;75646:17;;:5;:17;;;75638:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;75758:8;75720:18;:25;75739:5;75720:25;;;;;;;;;;;;;;;:35;75746:8;75720:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;75804:8;75782:41;;75797:5;75782:41;;;75814:8;75782:41;;;;;;:::i;:::-;;;;;;;;75534:297;;;:::o;2297:296::-;2380:7;2400:20;2423:4;2400:27;;2443:9;2438:118;2462:5;:12;2458:1;:16;2438:118;;;2511:33;2521:12;2535:5;2541:1;2535:8;;;;;;;;:::i;:::-;;;;;;;;2511:9;:33::i;:::-;2496:48;;2476:3;;;;;:::i;:::-;;;;2438:118;;;;2573:12;2566:19;;;2297:296;;;;:::o;67436:974::-;67638:1;67624:16;;:2;:16;;;67616:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;67695:16;67714:12;:10;:12::i;:::-;67695:31;;67737:20;67760:21;67778:2;67760:17;:21::i;:::-;67737:44;;67792:24;67819:25;67837:6;67819:17;:25::i;:::-;67792:52;;67857:60;67878:8;67888:4;67894:2;67898:3;67903:7;67912:4;67857:20;:60::i;:::-;67930:19;67952:9;:13;67962:2;67952:13;;;;;;;;;;;:19;67966:4;67952:19;;;;;;;;;;;;;;;;67930:41;;68005:6;67990:11;:21;;67982:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;68130:6;68116:11;:20;68094:9;:13;68104:2;68094:13;;;;;;;;;;;:19;68108:4;68094:19;;;;;;;;;;;;;;;:42;;;;68179:6;68158:9;:13;68168:2;68158:13;;;;;;;;;;;:17;68172:2;68158:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;68234:2;68203:46;;68228:4;68203:46;;68218:8;68203:46;;;68238:2;68242:6;68203:46;;;;;;;:::i;:::-;;;;;;;;68262:59;68282:8;68292:4;68298:2;68302:3;68307:7;68316:4;68262:19;:59::i;:::-;68334:68;68365:8;68375:4;68381:2;68385;68389:6;68397:4;68334:30;:68::i;:::-;67605:805;;;;67436:974;;;;;:::o;78945:813::-;79185:15;:2;:13;;;:15::i;:::-;79181:570;;;79238:2;79221:43;;;79265:8;79275:4;79281:3;79286:7;79295:4;79221:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;79217:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;79613:6;79606:14;;;;;;;;;;;:::i;:::-;;;;;;;;79217:523;;;79662:62;;;;;;;;;;:::i;:::-;;;;;;;;79217:523;79394:48;;;79382:60;;;:8;:60;;;;79378:159;;79467:50;;;;;;;;;;:::i;:::-;;;;;;;;79378:159;79301:251;79181:570;78945:813;;;;;;:::o;9501:149::-;9564:7;9595:1;9591;:5;:51;;9622:20;9637:1;9640;9622:14;:20::i;:::-;9591:51;;;9599:20;9614:1;9617;9599:14;:20::i;:::-;9591:51;9584:58;;9501:149;;;;:::o;9658:268::-;9726:13;9833:1;9827:4;9820:15;9862:1;9856:4;9849:15;9903:4;9897;9887:21;9878:30;;9658:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::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:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:109::-;3249:7;3289:26;3282:5;3278:38;3267:49;;3213:109;;;:::o;3328:120::-;3400:23;3417:5;3400:23;:::i;:::-;3393:5;3390:34;3380:62;;3438:1;3435;3428:12;3380:62;3328:120;:::o;3454:137::-;3499:5;3537:6;3524:20;3515:29;;3553:32;3579:5;3553:32;:::i;:::-;3454:137;;;;:::o;3597:472::-;3664:6;3672;3721:2;3709:9;3700:7;3696:23;3692:32;3689:119;;;3727:79;;:::i;:::-;3689:119;3847:1;3872:53;3917:7;3908:6;3897:9;3893:22;3872:53;:::i;:::-;3862:63;;3818:117;3974:2;4000:52;4044:7;4035:6;4024:9;4020:22;4000:52;:::i;:::-;3990:62;;3945:117;3597:472;;;;;:::o;4075:117::-;4184:1;4181;4174:12;4198:102;4239:6;4290:2;4286:7;4281:2;4274:5;4270:14;4266:28;4256:38;;4198:102;;;:::o;4306:180::-;4354:77;4351:1;4344:88;4451:4;4448:1;4441:15;4475:4;4472:1;4465:15;4492:281;4575:27;4597:4;4575:27;:::i;:::-;4567:6;4563:40;4705:6;4693:10;4690:22;4669:18;4657:10;4654:34;4651:62;4648:88;;;4716:18;;:::i;:::-;4648:88;4756:10;4752:2;4745:22;4535:238;4492:281;;:::o;4779:129::-;4813:6;4840:20;;:::i;:::-;4830:30;;4869:33;4897:4;4889:6;4869:33;:::i;:::-;4779:129;;;:::o;4914:311::-;4991:4;5081:18;5073:6;5070:30;5067:56;;;5103:18;;:::i;:::-;5067:56;5153:4;5145:6;5141:17;5133:25;;5213:4;5207;5203:15;5195:23;;4914:311;;;:::o;5231:117::-;5340:1;5337;5330:12;5371:710;5467:5;5492:81;5508:64;5565:6;5508:64;:::i;:::-;5492:81;:::i;:::-;5483:90;;5593:5;5622:6;5615:5;5608:21;5656:4;5649:5;5645:16;5638:23;;5709:4;5701:6;5697:17;5689:6;5685:30;5738:3;5730:6;5727:15;5724:122;;;5757:79;;:::i;:::-;5724:122;5872:6;5855:220;5889:6;5884:3;5881:15;5855:220;;;5964:3;5993:37;6026:3;6014:10;5993:37;:::i;:::-;5988:3;5981:50;6060:4;6055:3;6051:14;6044:21;;5931:144;5915:4;5910:3;5906:14;5899:21;;5855:220;;;5859:21;5473:608;;5371:710;;;;;:::o;6104:370::-;6175:5;6224:3;6217:4;6209:6;6205:17;6201:27;6191:122;;6232:79;;:::i;:::-;6191:122;6349:6;6336:20;6374:94;6464:3;6456:6;6449:4;6441:6;6437:17;6374:94;:::i;:::-;6365:103;;6181:293;6104:370;;;;:::o;6480:1039::-;6607:6;6615;6623;6672:2;6660:9;6651:7;6647:23;6643:32;6640:119;;;6678:79;;:::i;:::-;6640:119;6798:1;6823:53;6868:7;6859:6;6848:9;6844:22;6823:53;:::i;:::-;6813:63;;6769:117;6953:2;6942:9;6938:18;6925:32;6984:18;6976:6;6973:30;6970:117;;;7006:79;;:::i;:::-;6970:117;7111:78;7181:7;7172:6;7161:9;7157:22;7111:78;:::i;:::-;7101:88;;6896:303;7266:2;7255:9;7251:18;7238:32;7297:18;7289:6;7286:30;7283:117;;;7319:79;;:::i;:::-;7283:117;7424:78;7494:7;7485:6;7474:9;7470:22;7424:78;:::i;:::-;7414:88;;7209:303;6480:1039;;;;;:::o;7525:99::-;7577:6;7611:5;7605:12;7595:22;;7525:99;;;:::o;7630:169::-;7714:11;7748:6;7743:3;7736:19;7788:4;7783:3;7779:14;7764:29;;7630:169;;;;:::o;7805:246::-;7886:1;7896:113;7910:6;7907:1;7904:13;7896:113;;;7995:1;7990:3;7986:11;7980:18;7976:1;7971:3;7967:11;7960:39;7932:2;7929:1;7925:10;7920:15;;7896:113;;;8043:1;8034:6;8029:3;8025:16;8018:27;7867:184;7805:246;;;:::o;8057:377::-;8145:3;8173:39;8206:5;8173:39;:::i;:::-;8228:71;8292:6;8287:3;8228:71;:::i;:::-;8221:78;;8308:65;8366:6;8361:3;8354:4;8347:5;8343:16;8308:65;:::i;:::-;8398:29;8420:6;8398:29;:::i;:::-;8393:3;8389:39;8382:46;;8149:285;8057:377;;;;:::o;8440:313::-;8553:4;8591:2;8580:9;8576:18;8568:26;;8640:9;8634:4;8630:20;8626:1;8615:9;8611:17;8604:47;8668:78;8741:4;8732:6;8668:78;:::i;:::-;8660:86;;8440:313;;;;:::o;8759:329::-;8818:6;8867:2;8855:9;8846:7;8842:23;8838:32;8835:119;;;8873:79;;:::i;:::-;8835:119;8993:1;9018:53;9063:7;9054:6;9043:9;9039:22;9018:53;:::i;:::-;9008:63;;8964:117;8759:329;;;;:::o;9094:116::-;9164:21;9179:5;9164:21;:::i;:::-;9157:5;9154:32;9144:60;;9200:1;9197;9190:12;9144:60;9094:116;:::o;9216:133::-;9259:5;9297:6;9284:20;9275:29;;9313:30;9337:5;9313:30;:::i;:::-;9216:133;;;;:::o;9355:613::-;9429:6;9437;9445;9494:2;9482:9;9473:7;9469:23;9465:32;9462:119;;;9500:79;;:::i;:::-;9462:119;9620:1;9645:53;9690:7;9681:6;9670:9;9666:22;9645:53;:::i;:::-;9635:63;;9591:117;9747:2;9773:53;9818:7;9809:6;9798:9;9794:22;9773:53;:::i;:::-;9763:63;;9718:118;9875:2;9901:50;9943:7;9934:6;9923:9;9919:22;9901:50;:::i;:::-;9891:60;;9846:115;9355:613;;;;;:::o;9974:474::-;10042:6;10050;10099:2;10087:9;10078:7;10074:23;10070:32;10067:119;;;10105:79;;:::i;:::-;10067:119;10225:1;10250:53;10295:7;10286:6;10275:9;10271:22;10250:53;:::i;:::-;10240:63;;10196:117;10352:2;10378:53;10423:7;10414:6;10403:9;10399:22;10378:53;:::i;:::-;10368:63;;10323:118;9974:474;;;;;:::o;10454:118::-;10541:24;10559:5;10541:24;:::i;:::-;10536:3;10529:37;10454:118;;:::o;10578:332::-;10699:4;10737:2;10726:9;10722:18;10714:26;;10750:71;10818:1;10807:9;10803:17;10794:6;10750:71;:::i;:::-;10831:72;10899:2;10888:9;10884:18;10875:6;10831:72;:::i;:::-;10578:332;;;;;:::o;10916:117::-;11025:1;11022;11015:12;11039:307;11100:4;11190:18;11182:6;11179:30;11176:56;;;11212:18;;:::i;:::-;11176:56;11250:29;11272:6;11250:29;:::i;:::-;11242:37;;11334:4;11328;11324:15;11316:23;;11039:307;;;:::o;11352:146::-;11449:6;11444:3;11439;11426:30;11490:1;11481:6;11476:3;11472:16;11465:27;11352:146;;;:::o;11504:423::-;11581:5;11606:65;11622:48;11663:6;11622:48;:::i;:::-;11606:65;:::i;:::-;11597:74;;11694:6;11687:5;11680:21;11732:4;11725:5;11721:16;11770:3;11761:6;11756:3;11752:16;11749:25;11746:112;;;11777:79;;:::i;:::-;11746:112;11867:54;11914:6;11909:3;11904;11867:54;:::i;:::-;11587:340;11504:423;;;;;:::o;11946:338::-;12001:5;12050:3;12043:4;12035:6;12031:17;12027:27;12017:122;;12058:79;;:::i;:::-;12017:122;12175:6;12162:20;12200:78;12274:3;12266:6;12259:4;12251:6;12247:17;12200:78;:::i;:::-;12191:87;;12007:277;11946:338;;;;:::o;12290:1509::-;12444:6;12452;12460;12468;12476;12525:3;12513:9;12504:7;12500:23;12496:33;12493:120;;;12532:79;;:::i;:::-;12493:120;12652:1;12677:53;12722:7;12713:6;12702:9;12698:22;12677:53;:::i;:::-;12667:63;;12623:117;12779:2;12805:53;12850:7;12841:6;12830:9;12826:22;12805:53;:::i;:::-;12795:63;;12750:118;12935:2;12924:9;12920:18;12907:32;12966:18;12958:6;12955:30;12952:117;;;12988:79;;:::i;:::-;12952:117;13093:78;13163:7;13154:6;13143:9;13139:22;13093:78;:::i;:::-;13083:88;;12878:303;13248:2;13237:9;13233:18;13220:32;13279:18;13271:6;13268:30;13265:117;;;13301:79;;:::i;:::-;13265:117;13406:78;13476:7;13467:6;13456:9;13452:22;13406:78;:::i;:::-;13396:88;;13191:303;13561:3;13550:9;13546:19;13533:33;13593:18;13585:6;13582:30;13579:117;;;13615:79;;:::i;:::-;13579:117;13720:62;13774:7;13765:6;13754:9;13750:22;13720:62;:::i;:::-;13710:72;;13504:288;12290:1509;;;;;;;;:::o;13805:77::-;13842:7;13871:5;13860:16;;13805:77;;;:::o;13888:118::-;13975:24;13993:5;13975:24;:::i;:::-;13970:3;13963:37;13888:118;;:::o;14012:222::-;14105:4;14143:2;14132:9;14128:18;14120:26;;14156:71;14224:1;14213:9;14209:17;14200:6;14156:71;:::i;:::-;14012:222;;;;:::o;14240:894::-;14358:6;14366;14415:2;14403:9;14394:7;14390:23;14386:32;14383:119;;;14421:79;;:::i;:::-;14383:119;14569:1;14558:9;14554:17;14541:31;14599:18;14591:6;14588:30;14585:117;;;14621:79;;:::i;:::-;14585:117;14726:78;14796:7;14787:6;14776:9;14772:22;14726:78;:::i;:::-;14716:88;;14512:302;14881:2;14870:9;14866:18;14853:32;14912:18;14904:6;14901:30;14898:117;;;14934:79;;:::i;:::-;14898:117;15039:78;15109:7;15100:6;15089:9;15085:22;15039:78;:::i;:::-;15029:88;;14824:303;14240:894;;;;;:::o;15140:311::-;15217:4;15307:18;15299:6;15296:30;15293:56;;;15329:18;;:::i;:::-;15293:56;15379:4;15371:6;15367:17;15359:25;;15439:4;15433;15429:15;15421:23;;15140:311;;;:::o;15474:710::-;15570:5;15595:81;15611:64;15668:6;15611:64;:::i;:::-;15595:81;:::i;:::-;15586:90;;15696:5;15725:6;15718:5;15711:21;15759:4;15752:5;15748:16;15741:23;;15812:4;15804:6;15800:17;15792:6;15788:30;15841:3;15833:6;15830:15;15827:122;;;15860:79;;:::i;:::-;15827:122;15975:6;15958:220;15992:6;15987:3;15984:15;15958:220;;;16067:3;16096:37;16129:3;16117:10;16096:37;:::i;:::-;16091:3;16084:50;16163:4;16158:3;16154:14;16147:21;;16034:144;16018:4;16013:3;16009:14;16002:21;;15958:220;;;15962:21;15576:608;;15474:710;;;;;:::o;16207:370::-;16278:5;16327:3;16320:4;16312:6;16308:17;16304:27;16294:122;;16335:79;;:::i;:::-;16294:122;16452:6;16439:20;16477:94;16567:3;16559:6;16552:4;16544:6;16540:17;16477:94;:::i;:::-;16468:103;;16284:293;16207:370;;;;:::o;16583:894::-;16701:6;16709;16758:2;16746:9;16737:7;16733:23;16729:32;16726:119;;;16764:79;;:::i;:::-;16726:119;16912:1;16901:9;16897:17;16884:31;16942:18;16934:6;16931:30;16928:117;;;16964:79;;:::i;:::-;16928:117;17069:78;17139:7;17130:6;17119:9;17115:22;17069:78;:::i;:::-;17059:88;;16855:302;17224:2;17213:9;17209:18;17196:32;17255:18;17247:6;17244:30;17241:117;;;17277:79;;:::i;:::-;17241:117;17382:78;17452:7;17443:6;17432:9;17428:22;17382:78;:::i;:::-;17372:88;;17167:303;16583:894;;;;;:::o;17483:114::-;17550:6;17584:5;17578:12;17568:22;;17483:114;;;:::o;17603:184::-;17702:11;17736:6;17731:3;17724:19;17776:4;17771:3;17767:14;17752:29;;17603:184;;;;:::o;17793:132::-;17860:4;17883:3;17875:11;;17913:4;17908:3;17904:14;17896:22;;17793:132;;;:::o;17931:108::-;18008:24;18026:5;18008:24;:::i;:::-;18003:3;17996:37;17931:108;;:::o;18045:179::-;18114:10;18135:46;18177:3;18169:6;18135:46;:::i;:::-;18213:4;18208:3;18204:14;18190:28;;18045:179;;;;:::o;18230:113::-;18300:4;18332;18327:3;18323:14;18315:22;;18230:113;;;:::o;18379:732::-;18498:3;18527:54;18575:5;18527:54;:::i;:::-;18597:86;18676:6;18671:3;18597:86;:::i;:::-;18590:93;;18707:56;18757:5;18707:56;:::i;:::-;18786:7;18817:1;18802:284;18827:6;18824:1;18821:13;18802:284;;;18903:6;18897:13;18930:63;18989:3;18974:13;18930:63;:::i;:::-;18923:70;;19016:60;19069:6;19016:60;:::i;:::-;19006:70;;18862:224;18849:1;18846;18842:9;18837:14;;18802:284;;;18806:14;19102:3;19095:10;;18503:608;;;18379:732;;;;:::o;19117:373::-;19260:4;19298:2;19287:9;19283:18;19275:26;;19347:9;19341:4;19337:20;19333:1;19322:9;19318:17;19311:47;19375:108;19478:4;19469:6;19375:108;:::i;:::-;19367:116;;19117:373;;;;:::o;19496:122::-;19569:24;19587:5;19569:24;:::i;:::-;19562:5;19559:35;19549:63;;19608:1;19605;19598:12;19549:63;19496:122;:::o;19624:139::-;19670:5;19708:6;19695:20;19686:29;;19724:33;19751:5;19724:33;:::i;:::-;19624:139;;;;:::o;19769:329::-;19828:6;19877:2;19865:9;19856:7;19852:23;19848:32;19845:119;;;19883:79;;:::i;:::-;19845:119;20003:1;20028:53;20073:7;20064:6;20053:9;20049:22;20028:53;:::i;:::-;20018:63;;19974:117;19769:329;;;;:::o;20104:308::-;20166:4;20256:18;20248:6;20245:30;20242:56;;;20278:18;;:::i;:::-;20242:56;20316:29;20338:6;20316:29;:::i;:::-;20308:37;;20400:4;20394;20390:15;20382:23;;20104:308;;;:::o;20418:425::-;20496:5;20521:66;20537:49;20579:6;20537:49;:::i;:::-;20521:66;:::i;:::-;20512:75;;20610:6;20603:5;20596:21;20648:4;20641:5;20637:16;20686:3;20677:6;20672:3;20668:16;20665:25;20662:112;;;20693:79;;:::i;:::-;20662:112;20783:54;20830:6;20825:3;20820;20783:54;:::i;:::-;20502:341;20418:425;;;;;:::o;20863:340::-;20919:5;20968:3;20961:4;20953:6;20949:17;20945:27;20935:122;;20976:79;;:::i;:::-;20935:122;21093:6;21080:20;21118:79;21193:3;21185:6;21178:4;21170:6;21166:17;21118:79;:::i;:::-;21109:88;;20925:278;20863:340;;;;:::o;21209:509::-;21278:6;21327:2;21315:9;21306:7;21302:23;21298:32;21295:119;;;21333:79;;:::i;:::-;21295:119;21481:1;21470:9;21466:17;21453:31;21511:18;21503:6;21500:30;21497:117;;;21533:79;;:::i;:::-;21497:117;21638:63;21693:7;21684:6;21673:9;21669:22;21638:63;:::i;:::-;21628:73;;21424:287;21209:509;;;;:::o;21724:222::-;21817:4;21855:2;21844:9;21840:18;21832:26;;21868:71;21936:1;21925:9;21921:17;21912:6;21868:71;:::i;:::-;21724:222;;;;:::o;21952:418::-;22089:4;22127:2;22116:9;22112:18;22104:26;;22140:71;22208:1;22197:9;22193:17;22184:6;22140:71;:::i;:::-;22221:66;22283:2;22272:9;22268:18;22259:6;22221:66;:::i;:::-;22297;22359:2;22348:9;22344:18;22335:6;22297:66;:::i;:::-;21952:418;;;;;;:::o;22376:60::-;22404:3;22425:5;22418:12;;22376:60;;;:::o;22442:142::-;22492:9;22525:53;22543:34;22552:24;22570:5;22552:24;:::i;:::-;22543:34;:::i;:::-;22525:53;:::i;:::-;22512:66;;22442:142;;;:::o;22590:126::-;22640:9;22673:37;22704:5;22673:37;:::i;:::-;22660:50;;22590:126;;;:::o;22722:142::-;22788:9;22821:37;22852:5;22821:37;:::i;:::-;22808:50;;22722:142;;;:::o;22870:163::-;22973:53;23020:5;22973:53;:::i;:::-;22968:3;22961:66;22870:163;;:::o;23039:254::-;23148:4;23186:2;23175:9;23171:18;23163:26;;23199:87;23283:1;23272:9;23268:17;23259:6;23199:87;:::i;:::-;23039:254;;;;:::o;23299:468::-;23364:6;23372;23421:2;23409:9;23400:7;23396:23;23392:32;23389:119;;;23427:79;;:::i;:::-;23389:119;23547:1;23572:53;23617:7;23608:6;23597:9;23593:22;23572:53;:::i;:::-;23562:63;;23518:117;23674:2;23700:50;23742:7;23733:6;23722:9;23718:22;23700:50;:::i;:::-;23690:60;;23645:115;23299:468;;;;;:::o;23773:829::-;23875:6;23883;23891;23940:2;23928:9;23919:7;23915:23;23911:32;23908:119;;;23946:79;;:::i;:::-;23908:119;24094:1;24083:9;24079:17;24066:31;24124:18;24116:6;24113:30;24110:117;;;24146:79;;:::i;:::-;24110:117;24251:78;24321:7;24312:6;24301:9;24297:22;24251:78;:::i;:::-;24241:88;;24037:302;24378:2;24404:53;24449:7;24440:6;24429:9;24425:22;24404:53;:::i;:::-;24394:63;;24349:118;24506:2;24532:53;24577:7;24568:6;24557:9;24553:22;24532:53;:::i;:::-;24522:63;;24477:118;23773:829;;;;;:::o;24608:323::-;24664:6;24713:2;24701:9;24692:7;24688:23;24684:32;24681:119;;;24719:79;;:::i;:::-;24681:119;24839:1;24864:50;24906:7;24897:6;24886:9;24882:22;24864:50;:::i;:::-;24854:60;;24810:114;24608:323;;;;:::o;24937:117::-;25046:1;25043;25036:12;25077:568;25150:8;25160:6;25210:3;25203:4;25195:6;25191:17;25187:27;25177:122;;25218:79;;:::i;:::-;25177:122;25331:6;25318:20;25308:30;;25361:18;25353:6;25350:30;25347:117;;;25383:79;;:::i;:::-;25347:117;25497:4;25489:6;25485:17;25473:29;;25551:3;25543:4;25535:6;25531:17;25521:8;25517:32;25514:41;25511:128;;;25558:79;;:::i;:::-;25511:128;25077:568;;;;;:::o;25651:849::-;25755:6;25763;25771;25779;25828:2;25816:9;25807:7;25803:23;25799:32;25796:119;;;25834:79;;:::i;:::-;25796:119;25954:1;25979:53;26024:7;26015:6;26004:9;26000:22;25979:53;:::i;:::-;25969:63;;25925:117;26081:2;26107:53;26152:7;26143:6;26132:9;26128:22;26107:53;:::i;:::-;26097:63;;26052:118;26237:2;26226:9;26222:18;26209:32;26268:18;26260:6;26257:30;26254:117;;;26290:79;;:::i;:::-;26254:117;26403:80;26475:7;26466:6;26455:9;26451:22;26403:80;:::i;:::-;26385:98;;;;26180:313;25651:849;;;;;;;:::o;26506:474::-;26574:6;26582;26631:2;26619:9;26610:7;26606:23;26602:32;26599:119;;;26637:79;;:::i;:::-;26599:119;26757:1;26782:53;26827:7;26818:6;26807:9;26803:22;26782:53;:::i;:::-;26772:63;;26728:117;26884:2;26910:53;26955:7;26946:6;26935:9;26931:22;26910:53;:::i;:::-;26900:63;;26855:118;26506:474;;;;;:::o;26986:1089::-;27090:6;27098;27106;27114;27122;27171:3;27159:9;27150:7;27146:23;27142:33;27139:120;;;27178:79;;:::i;:::-;27139:120;27298:1;27323:53;27368:7;27359:6;27348:9;27344:22;27323:53;:::i;:::-;27313:63;;27269:117;27425:2;27451:53;27496:7;27487:6;27476:9;27472:22;27451:53;:::i;:::-;27441:63;;27396:118;27553:2;27579:53;27624:7;27615:6;27604:9;27600:22;27579:53;:::i;:::-;27569:63;;27524:118;27681:2;27707:53;27752:7;27743:6;27732:9;27728:22;27707:53;:::i;:::-;27697:63;;27652:118;27837:3;27826:9;27822:19;27809:33;27869:18;27861:6;27858:30;27855:117;;;27891:79;;:::i;:::-;27855:117;27996:62;28050:7;28041:6;28030:9;28026:22;27996:62;:::i;:::-;27986:72;;27780:288;26986:1089;;;;;;;;:::o;28081:329::-;28140:6;28189:2;28177:9;28168:7;28164:23;28160:32;28157:119;;;28195:79;;:::i;:::-;28157:119;28315:1;28340:53;28385:7;28376:6;28365:9;28361:22;28340:53;:::i;:::-;28330:63;;28286:117;28081:329;;;;:::o;28416:229::-;28556:34;28552:1;28544:6;28540:14;28533:58;28625:12;28620:2;28612:6;28608:15;28601:37;28416:229;:::o;28651:366::-;28793:3;28814:67;28878:2;28873:3;28814:67;:::i;:::-;28807:74;;28890:93;28979:3;28890:93;:::i;:::-;29008:2;29003:3;28999:12;28992:19;;28651:366;;;:::o;29023:419::-;29189:4;29227:2;29216:9;29212:18;29204:26;;29276:9;29270:4;29266:20;29262:1;29251:9;29247:17;29240:47;29304:131;29430:4;29304:131;:::i;:::-;29296:139;;29023:419;;;:::o;29448:180::-;29496:77;29493:1;29486:88;29593:4;29590:1;29583:15;29617:4;29614:1;29607:15;29634:180;29682:77;29679:1;29672:88;29779:4;29776:1;29769:15;29803:4;29800:1;29793:15;29820:233;29859:3;29882:24;29900:5;29882:24;:::i;:::-;29873:33;;29928:66;29921:5;29918:77;29915:103;;29998:18;;:::i;:::-;29915:103;30045:1;30038:5;30034:13;30027:20;;29820:233;;;:::o;30059:180::-;30107:77;30104:1;30097:88;30204:4;30201:1;30194:15;30228:4;30225:1;30218:15;30245:320;30289:6;30326:1;30320:4;30316:12;30306:22;;30373:1;30367:4;30363:12;30394:18;30384:81;;30450:4;30442:6;30438:17;30428:27;;30384:81;30512:2;30504:6;30501:14;30481:18;30478:38;30475:84;;30531:18;;:::i;:::-;30475:84;30296:269;30245:320;;;:::o;30571:148::-;30673:11;30710:3;30695:18;;30571:148;;;;:::o;30725:141::-;30774:4;30797:3;30789:11;;30820:3;30817:1;30810:14;30854:4;30851:1;30841:18;30833:26;;30725:141;;;:::o;30896:874::-;30999:3;31036:5;31030:12;31065:36;31091:9;31065:36;:::i;:::-;31117:89;31199:6;31194:3;31117:89;:::i;:::-;31110:96;;31237:1;31226:9;31222:17;31253:1;31248:166;;;;31428:1;31423:341;;;;31215:549;;31248:166;31332:4;31328:9;31317;31313:25;31308:3;31301:38;31394:6;31387:14;31380:22;31372:6;31368:35;31363:3;31359:45;31352:52;;31248:166;;31423:341;31490:38;31522:5;31490:38;:::i;:::-;31550:1;31564:154;31578:6;31575:1;31572:13;31564:154;;;31652:7;31646:14;31642:1;31637:3;31633:11;31626:35;31702:1;31693:7;31689:15;31678:26;;31600:4;31597:1;31593:12;31588:17;;31564:154;;;31747:6;31742:3;31738:16;31731:23;;31430:334;;31215:549;;31003:767;;30896:874;;;;:::o;31776:390::-;31882:3;31910:39;31943:5;31910:39;:::i;:::-;31965:89;32047:6;32042:3;31965:89;:::i;:::-;31958:96;;32063:65;32121:6;32116:3;32109:4;32102:5;32098:16;32063:65;:::i;:::-;32153:6;32148:3;32144:16;32137:23;;31886:280;31776:390;;;;:::o;32172:583::-;32394:3;32416:92;32504:3;32495:6;32416:92;:::i;:::-;32409:99;;32525:95;32616:3;32607:6;32525:95;:::i;:::-;32518:102;;32637:92;32725:3;32716:6;32637:92;:::i;:::-;32630:99;;32746:3;32739:10;;32172:583;;;;;;:::o;32761:410::-;32801:7;32824:20;32842:1;32824:20;:::i;:::-;32819:25;;32858:20;32876:1;32858:20;:::i;:::-;32853:25;;32913:1;32910;32906:9;32935:30;32953:11;32935:30;:::i;:::-;32924:41;;33114:1;33105:7;33101:15;33098:1;33095:22;33075:1;33068:9;33048:83;33025:139;;33144:18;;:::i;:::-;33025:139;32809:362;32761:410;;;;:::o;33177:180::-;33225:77;33222:1;33215:88;33322:4;33319:1;33312:15;33346:4;33343:1;33336:15;33363:185;33403:1;33420:20;33438:1;33420:20;:::i;:::-;33415:25;;33454:20;33472:1;33454:20;:::i;:::-;33449:25;;33493:1;33483:35;;33498:18;;:::i;:::-;33483:35;33540:1;33537;33533:9;33528:14;;33363:185;;;;:::o;33554:442::-;33703:4;33741:2;33730:9;33726:18;33718:26;;33754:71;33822:1;33811:9;33807:17;33798:6;33754:71;:::i;:::-;33835:72;33903:2;33892:9;33888:18;33879:6;33835:72;:::i;:::-;33917;33985:2;33974:9;33970:18;33961:6;33917:72;:::i;:::-;33554:442;;;;;;:::o;34002:147::-;34103:11;34140:3;34125:18;;34002:147;;;;:::o;34155:114::-;;:::o;34275:398::-;34434:3;34455:83;34536:1;34531:3;34455:83;:::i;:::-;34448:90;;34547:93;34636:3;34547:93;:::i;:::-;34665:1;34660:3;34656:11;34649:18;;34275:398;;;:::o;34679:379::-;34863:3;34885:147;35028:3;34885:147;:::i;:::-;34878:154;;35049:3;35042:10;;34679:379;;;:::o;35064:228::-;35204:34;35200:1;35192:6;35188:14;35181:58;35273:11;35268:2;35260:6;35256:15;35249:36;35064:228;:::o;35298:366::-;35440:3;35461:67;35525:2;35520:3;35461:67;:::i;:::-;35454:74;;35537:93;35626:3;35537:93;:::i;:::-;35655:2;35650:3;35646:12;35639:19;;35298:366;;;:::o;35670:419::-;35836:4;35874:2;35863:9;35859:18;35851:26;;35923:9;35917:4;35913:20;35909:1;35898:9;35894:17;35887:47;35951:131;36077:4;35951:131;:::i;:::-;35943:139;;35670:419;;;:::o;36095:93::-;36132:6;36179:2;36174;36167:5;36163:14;36159:23;36149:33;;36095:93;;;:::o;36194:107::-;36238:8;36288:5;36282:4;36278:16;36257:37;;36194:107;;;;:::o;36307:393::-;36376:6;36426:1;36414:10;36410:18;36449:97;36479:66;36468:9;36449:97;:::i;:::-;36567:39;36597:8;36586:9;36567:39;:::i;:::-;36555:51;;36639:4;36635:9;36628:5;36624:21;36615:30;;36688:4;36678:8;36674:19;36667:5;36664:30;36654:40;;36383:317;;36307:393;;;;;:::o;36706:142::-;36756:9;36789:53;36807:34;36816:24;36834:5;36816:24;:::i;:::-;36807:34;:::i;:::-;36789:53;:::i;:::-;36776:66;;36706:142;;;:::o;36854:75::-;36897:3;36918:5;36911:12;;36854:75;;;:::o;36935:269::-;37045:39;37076:7;37045:39;:::i;:::-;37106:91;37155:41;37179:16;37155:41;:::i;:::-;37147:6;37140:4;37134:11;37106:91;:::i;:::-;37100:4;37093:105;37011:193;36935:269;;;:::o;37210:73::-;37255:3;37210:73;:::o;37289:189::-;37366:32;;:::i;:::-;37407:65;37465:6;37457;37451:4;37407:65;:::i;:::-;37342:136;37289:189;;:::o;37484:186::-;37544:120;37561:3;37554:5;37551:14;37544:120;;;37615:39;37652:1;37645:5;37615:39;:::i;:::-;37588:1;37581:5;37577:13;37568:22;;37544:120;;;37484:186;;:::o;37676:543::-;37777:2;37772:3;37769:11;37766:446;;;37811:38;37843:5;37811:38;:::i;:::-;37895:29;37913:10;37895:29;:::i;:::-;37885:8;37881:44;38078:2;38066:10;38063:18;38060:49;;;38099:8;38084:23;;38060:49;38122:80;38178:22;38196:3;38178:22;:::i;:::-;38168:8;38164:37;38151:11;38122:80;:::i;:::-;37781:431;;37766:446;37676:543;;;:::o;38225:117::-;38279:8;38329:5;38323:4;38319:16;38298:37;;38225:117;;;;:::o;38348:169::-;38392:6;38425:51;38473:1;38469:6;38461:5;38458:1;38454:13;38425:51;:::i;:::-;38421:56;38506:4;38500;38496:15;38486:25;;38399:118;38348:169;;;;:::o;38522:295::-;38598:4;38744:29;38769:3;38763:4;38744:29;:::i;:::-;38736:37;;38806:3;38803:1;38799:11;38793:4;38790:21;38782:29;;38522:295;;;;:::o;38822:1395::-;38939:37;38972:3;38939:37;:::i;:::-;39041:18;39033:6;39030:30;39027:56;;;39063:18;;:::i;:::-;39027:56;39107:38;39139:4;39133:11;39107:38;:::i;:::-;39192:67;39252:6;39244;39238:4;39192:67;:::i;:::-;39286:1;39310:4;39297:17;;39342:2;39334:6;39331:14;39359:1;39354:618;;;;40016:1;40033:6;40030:77;;;40082:9;40077:3;40073:19;40067:26;40058:35;;40030:77;40133:67;40193:6;40186:5;40133:67;:::i;:::-;40127:4;40120:81;39989:222;39324:887;;39354:618;39406:4;39402:9;39394:6;39390:22;39440:37;39472:4;39440:37;:::i;:::-;39499:1;39513:208;39527:7;39524:1;39521:14;39513:208;;;39606:9;39601:3;39597:19;39591:26;39583:6;39576:42;39657:1;39649:6;39645:14;39635:24;;39704:2;39693:9;39689:18;39676:31;;39550:4;39547:1;39543:12;39538:17;;39513:208;;;39749:6;39740:7;39737:19;39734:179;;;39807:9;39802:3;39798:19;39792:26;39850:48;39892:4;39884:6;39880:17;39869:9;39850:48;:::i;:::-;39842:6;39835:64;39757:156;39734:179;39959:1;39955;39947:6;39943:14;39939:22;39933:4;39926:36;39361:611;;;39324:887;;38914:1303;;;38822:1395;;:::o;40223:94::-;40256:8;40304:5;40300:2;40296:14;40275:35;;40223:94;;;:::o;40323:::-;40362:7;40391:20;40405:5;40391:20;:::i;:::-;40380:31;;40323:94;;;:::o;40423:100::-;40462:7;40491:26;40511:5;40491:26;:::i;:::-;40480:37;;40423:100;;;:::o;40529:157::-;40634:45;40654:24;40672:5;40654:24;:::i;:::-;40634:45;:::i;:::-;40629:3;40622:58;40529:157;;:::o;40692:149::-;40728:7;40768:66;40761:5;40757:78;40746:89;;40692:149;;;:::o;40847:78::-;40885:7;40914:5;40903:16;;40847:78;;;:::o;40931:153::-;41034:43;41053:23;41070:5;41053:23;:::i;:::-;41034:43;:::i;:::-;41029:3;41022:56;40931:153;;:::o;41090:392::-;41228:3;41243:75;41314:3;41305:6;41243:75;:::i;:::-;41343:2;41338:3;41334:12;41327:19;;41356:73;41425:3;41416:6;41356:73;:::i;:::-;41454:1;41449:3;41445:11;41438:18;;41473:3;41466:10;;41090:392;;;;;:::o;41488:191::-;41528:3;41547:20;41565:1;41547:20;:::i;:::-;41542:25;;41581:20;41599:1;41581:20;:::i;:::-;41576:25;;41624:1;41621;41617:9;41610:16;;41645:3;41642:1;41639:10;41636:36;;;41652:18;;:::i;:::-;41636:36;41488:191;;;;:::o;41685:225::-;41825:34;41821:1;41813:6;41809:14;41802:58;41894:8;41889:2;41881:6;41877:15;41870:33;41685:225;:::o;41916:366::-;42058:3;42079:67;42143:2;42138:3;42079:67;:::i;:::-;42072:74;;42155:93;42244:3;42155:93;:::i;:::-;42273:2;42268:3;42264:12;42257:19;;41916:366;;;:::o;42288:419::-;42454:4;42492:2;42481:9;42477:18;42469:26;;42541:9;42535:4;42531:20;42527:1;42516:9;42512:17;42505:47;42569:131;42695:4;42569:131;:::i;:::-;42561:139;;42288:419;;;:::o;42713:182::-;42853:34;42849:1;42841:6;42837:14;42830:58;42713:182;:::o;42901:366::-;43043:3;43064:67;43128:2;43123:3;43064:67;:::i;:::-;43057:74;;43140:93;43229:3;43140:93;:::i;:::-;43258:2;43253:3;43249:12;43242:19;;42901:366;;;:::o;43273:419::-;43439:4;43477:2;43466:9;43462:18;43454:26;;43526:9;43520:4;43516:20;43512:1;43501:9;43497:17;43490:47;43554:131;43680:4;43554:131;:::i;:::-;43546:139;;43273:419;;;:::o;43698:229::-;43838:34;43834:1;43826:6;43822:14;43815:58;43907:12;43902:2;43894:6;43890:15;43883:37;43698:229;:::o;43933:366::-;44075:3;44096:67;44160:2;44155:3;44096:67;:::i;:::-;44089:74;;44172:93;44261:3;44172:93;:::i;:::-;44290:2;44285:3;44281:12;44274:19;;43933:366;;;:::o;44305:419::-;44471:4;44509:2;44498:9;44494:18;44486:26;;44558:9;44552:4;44548:20;44544:1;44533:9;44529:17;44522:47;44586:131;44712:4;44586:131;:::i;:::-;44578:139;;44305:419;;;:::o;44730:175::-;44870:27;44866:1;44858:6;44854:14;44847:51;44730:175;:::o;44911:366::-;45053:3;45074:67;45138:2;45133:3;45074:67;:::i;:::-;45067:74;;45150:93;45239:3;45150:93;:::i;:::-;45268:2;45263:3;45259:12;45252:19;;44911:366;;;:::o;45283:419::-;45449:4;45487:2;45476:9;45472:18;45464:26;;45536:9;45530:4;45526:20;45522:1;45511:9;45507:17;45500:47;45564:131;45690:4;45564:131;:::i;:::-;45556:139;;45283:419;;;:::o;45708:220::-;45848:34;45844:1;45836:6;45832:14;45825:58;45917:3;45912:2;45904:6;45900:15;45893:28;45708:220;:::o;45934:366::-;46076:3;46097:67;46161:2;46156:3;46097:67;:::i;:::-;46090:74;;46173:93;46262:3;46173:93;:::i;:::-;46291:2;46286:3;46282:12;46275:19;;45934:366;;;:::o;46306:419::-;46472:4;46510:2;46499:9;46495:18;46487:26;;46559:9;46553:4;46549:20;46545:1;46534:9;46530:17;46523:47;46587:131;46713:4;46587:131;:::i;:::-;46579:139;;46306:419;;;:::o;46731:332::-;46852:4;46890:2;46879:9;46875:18;46867:26;;46903:71;46971:1;46960:9;46956:17;46947:6;46903:71;:::i;:::-;46984:72;47052:2;47041:9;47037:18;47028:6;46984:72;:::i;:::-;46731:332;;;;;:::o;47069:233::-;47209:34;47205:1;47197:6;47193:14;47186:58;47278:16;47273:2;47265:6;47261:15;47254:41;47069:233;:::o;47308:366::-;47450:3;47471:67;47535:2;47530:3;47471:67;:::i;:::-;47464:74;;47547:93;47636:3;47547:93;:::i;:::-;47665:2;47660:3;47656:12;47649:19;;47308:366;;;:::o;47680:419::-;47846:4;47884:2;47873:9;47869:18;47861:26;;47933:9;47927:4;47923:20;47919:1;47908:9;47904:17;47897:47;47961:131;48087:4;47961:131;:::i;:::-;47953:139;;47680:419;;;:::o;48105:181::-;48245:33;48241:1;48233:6;48229:14;48222:57;48105:181;:::o;48292:366::-;48434:3;48455:67;48519:2;48514:3;48455:67;:::i;:::-;48448:74;;48531:93;48620:3;48531:93;:::i;:::-;48649:2;48644:3;48640:12;48633:19;;48292:366;;;:::o;48664:419::-;48830:4;48868:2;48857:9;48853:18;48845:26;;48917:9;48911:4;48907:20;48903:1;48892:9;48888:17;48881:47;48945:131;49071:4;48945:131;:::i;:::-;48937:139;;48664:419;;;:::o;49089:222::-;49229:34;49225:1;49217:6;49213:14;49206:58;49298:5;49293:2;49285:6;49281:15;49274:30;49089:222;:::o;49317:366::-;49459:3;49480:67;49544:2;49539:3;49480:67;:::i;:::-;49473:74;;49556:93;49645:3;49556:93;:::i;:::-;49674:2;49669:3;49665:12;49658:19;;49317:366;;;:::o;49689:419::-;49855:4;49893:2;49882:9;49878:18;49870:26;;49942:9;49936:4;49932:20;49928:1;49917:9;49913:17;49906:47;49970:131;50096:4;49970:131;:::i;:::-;49962:139;;49689:419;;;:::o;50114:223::-;50254:34;50250:1;50242:6;50238:14;50231:58;50323:6;50318:2;50310:6;50306:15;50299:31;50114:223;:::o;50343:366::-;50485:3;50506:67;50570:2;50565:3;50506:67;:::i;:::-;50499:74;;50582:93;50671:3;50582:93;:::i;:::-;50700:2;50695:3;50691:12;50684:19;;50343:366;;;:::o;50715:419::-;50881:4;50919:2;50908:9;50904:18;50896:26;;50968:9;50962:4;50958:20;50954:1;50943:9;50939:17;50932:47;50996:131;51122:4;50996:131;:::i;:::-;50988:139;;50715:419;;;:::o;51140:98::-;51191:6;51225:5;51219:12;51209:22;;51140:98;;;:::o;51244:168::-;51327:11;51361:6;51356:3;51349:19;51401:4;51396:3;51392:14;51377:29;;51244:168;;;;:::o;51418:373::-;51504:3;51532:38;51564:5;51532:38;:::i;:::-;51586:70;51649:6;51644:3;51586:70;:::i;:::-;51579:77;;51665:65;51723:6;51718:3;51711:4;51704:5;51700:16;51665:65;:::i;:::-;51755:29;51777:6;51755:29;:::i;:::-;51750:3;51746:39;51739:46;;51508:283;51418:373;;;;:::o;51797:751::-;52020:4;52058:3;52047:9;52043:19;52035:27;;52072:71;52140:1;52129:9;52125:17;52116:6;52072:71;:::i;:::-;52153:72;52221:2;52210:9;52206:18;52197:6;52153:72;:::i;:::-;52235;52303:2;52292:9;52288:18;52279:6;52235:72;:::i;:::-;52317;52385:2;52374:9;52370:18;52361:6;52317:72;:::i;:::-;52437:9;52431:4;52427:20;52421:3;52410:9;52406:19;52399:49;52465:76;52536:4;52527:6;52465:76;:::i;:::-;52457:84;;51797:751;;;;;;;;:::o;52554:141::-;52610:5;52641:6;52635:13;52626:22;;52657:32;52683:5;52657:32;:::i;:::-;52554:141;;;;:::o;52701:349::-;52770:6;52819:2;52807:9;52798:7;52794:23;52790:32;52787:119;;;52825:79;;:::i;:::-;52787:119;52945:1;52970:63;53025:7;53016:6;53005:9;53001:22;52970:63;:::i;:::-;52960:73;;52916:127;52701:349;;;;:::o;53056:106::-;53100:8;53149:5;53144:3;53140:15;53119:36;;53056:106;;;:::o;53168:183::-;53203:3;53241:1;53223:16;53220:23;53217:128;;;53279:1;53276;53273;53258:23;53301:34;53332:1;53326:8;53301:34;:::i;:::-;53294:41;;53217:128;53168:183;:::o;53357:711::-;53396:3;53434:4;53416:16;53413:26;53442:5;53410:39;53471:20;;:::i;:::-;53546:1;53528:16;53524:24;53521:1;53515:4;53500:49;53579:4;53573:11;53678:16;53671:4;53663:6;53659:17;53656:39;53623:18;53615:6;53612:30;53596:113;53593:146;;;53724:5;;;;53593:146;53770:6;53764:4;53760:17;53806:3;53800:10;53833:18;53825:6;53822:30;53819:43;;;53855:5;;;;;;53819:43;53903:6;53896:4;53891:3;53887:14;53883:27;53962:1;53944:16;53940:24;53934:4;53930:35;53925:3;53922:44;53919:57;;;53969:5;;;;;;;53919:57;53986;54034:6;54028:4;54024:17;54016:6;54012:30;54006:4;53986:57;:::i;:::-;54059:3;54052:10;;53400:668;;;;;53357:711;;:::o;54074:239::-;54214:34;54210:1;54202:6;54198:14;54191:58;54283:22;54278:2;54270:6;54266:15;54259:47;54074:239;:::o;54319:366::-;54461:3;54482:67;54546:2;54541:3;54482:67;:::i;:::-;54475:74;;54558:93;54647:3;54558:93;:::i;:::-;54676:2;54671:3;54667:12;54660:19;;54319:366;;;:::o;54691:419::-;54857:4;54895:2;54884:9;54880:18;54872:26;;54944:9;54938:4;54934:20;54930:1;54919:9;54915:17;54908:47;54972:131;55098:4;54972:131;:::i;:::-;54964:139;;54691:419;;;:::o;55116:227::-;55256:34;55252:1;55244:6;55240:14;55233:58;55325:10;55320:2;55312:6;55308:15;55301:35;55116:227;:::o;55349:366::-;55491:3;55512:67;55576:2;55571:3;55512:67;:::i;:::-;55505:74;;55588:93;55677:3;55588:93;:::i;:::-;55706:2;55701:3;55697:12;55690:19;;55349:366;;;:::o;55721:419::-;55887:4;55925:2;55914:9;55910:18;55902:26;;55974:9;55968:4;55964:20;55960:1;55949:9;55945:17;55938:47;56002:131;56128:4;56002:131;:::i;:::-;55994:139;;55721:419;;;:::o;56146:227::-;56286:34;56282:1;56274:6;56270:14;56263:58;56355:10;56350:2;56342:6;56338:15;56331:35;56146:227;:::o;56379:366::-;56521:3;56542:67;56606:2;56601:3;56542:67;:::i;:::-;56535:74;;56618:93;56707:3;56618:93;:::i;:::-;56736:2;56731:3;56727:12;56720:19;;56379:366;;;:::o;56751:419::-;56917:4;56955:2;56944:9;56940:18;56932:26;;57004:9;56998:4;56994:20;56990:1;56979:9;56975:17;56968:47;57032:131;57158:4;57032:131;:::i;:::-;57024:139;;56751:419;;;:::o;57176:224::-;57316:34;57312:1;57304:6;57300:14;57293:58;57385:7;57380:2;57372:6;57368:15;57361:32;57176:224;:::o;57406:366::-;57548:3;57569:67;57633:2;57628:3;57569:67;:::i;:::-;57562:74;;57645:93;57734:3;57645:93;:::i;:::-;57763:2;57758:3;57754:12;57747:19;;57406:366;;;:::o;57778:419::-;57944:4;57982:2;57971:9;57967:18;57959:26;;58031:9;58025:4;58021:20;58017:1;58006:9;58002:17;57995:47;58059:131;58185:4;58059:131;:::i;:::-;58051:139;;57778:419;;;:::o;58203:229::-;58343:34;58339:1;58331:6;58327:14;58320:58;58412:12;58407:2;58399:6;58395:15;58388:37;58203:229;:::o;58438:366::-;58580:3;58601:67;58665:2;58660:3;58601:67;:::i;:::-;58594:74;;58677:93;58766:3;58677:93;:::i;:::-;58795:2;58790:3;58786:12;58779:19;;58438:366;;;:::o;58810:419::-;58976:4;59014:2;59003:9;58999:18;58991:26;;59063:9;59057:4;59053:20;59049:1;59038:9;59034:17;59027:47;59091:131;59217:4;59091:131;:::i;:::-;59083:139;;58810:419;;;:::o;59235:634::-;59456:4;59494:2;59483:9;59479:18;59471:26;;59543:9;59537:4;59533:20;59529:1;59518:9;59514:17;59507:47;59571:108;59674:4;59665:6;59571:108;:::i;:::-;59563:116;;59726:9;59720:4;59716:20;59711:2;59700:9;59696:18;59689:48;59754:108;59857:4;59848:6;59754:108;:::i;:::-;59746:116;;59235:634;;;;;:::o;59875:228::-;60015:34;60011:1;60003:6;59999:14;59992:58;60084:11;60079:2;60071:6;60067:15;60060:36;59875:228;:::o;60109:366::-;60251:3;60272:67;60336:2;60331:3;60272:67;:::i;:::-;60265:74;;60348:93;60437:3;60348:93;:::i;:::-;60466:2;60461:3;60457:12;60450:19;;60109:366;;;:::o;60481:419::-;60647:4;60685:2;60674:9;60670:18;60662:26;;60734:9;60728:4;60724:20;60720:1;60709:9;60705:17;60698:47;60762:131;60888:4;60762:131;:::i;:::-;60754:139;;60481:419;;;:::o;60906:1053::-;61229:4;61267:3;61256:9;61252:19;61244:27;;61281:71;61349:1;61338:9;61334:17;61325:6;61281:71;:::i;:::-;61362:72;61430:2;61419:9;61415:18;61406:6;61362:72;:::i;:::-;61481:9;61475:4;61471:20;61466:2;61455:9;61451:18;61444:48;61509:108;61612:4;61603:6;61509:108;:::i;:::-;61501:116;;61664:9;61658:4;61654:20;61649:2;61638:9;61634:18;61627:48;61692:108;61795:4;61786:6;61692:108;:::i;:::-;61684:116;;61848:9;61842:4;61838:20;61832:3;61821:9;61817:19;61810:49;61876:76;61947:4;61938:6;61876:76;:::i;:::-;61868:84;;60906:1053;;;;;;;;:::o

Swarm Source

ipfs://c662ebfbaed5b0affef273e0dc817a819a88c8ef27bb5add9afa81f8aaa106d0
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.