ETH Price: $2,955.96 (-3.56%)
Gas: 2 Gwei

Token

StackSpaceships (STK)
 

Overview

Max Total Supply

4,242 STK

Holders

401

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 STK
0x8f551927fA11B538440cc384203F4a36d24C8fA2
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:
StackSpaceships

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-10
*/

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


// 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 rebuild 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 for 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) {
            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 rebuild 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 for 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) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.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 `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);
    }
}

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


// 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
     * ====
     *
     * [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://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

            // Prepare result pointer, jump over length
            let resultPtr := add(result, 32)

            // Run over the input, 3 bytes at a time
            for {
                let dataPtr := data
                let endPtr := add(data, mload(data))
            } lt(dataPtr, endPtr) {

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _owners[tokenId] = to;

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

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

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

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

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

        // Clear approvals
        delete _tokenApprovals[tokenId];

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId, 1);

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

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

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

        emit Transfer(from, to, tokenId);

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: StackSpaceships.sol

/*
 /   _____//  |______    ____ |  | __
 \_____  \\   __\__  \ _/ ___\|  |/ /
 /        \|  |  / __ \\  \___|    < 
/_______  /|__| (____  /\___  >__|_ \
        \/           \/     \/     \/
  _________                                .__    .__              
 /   _____/__________    ____  ____   _____|  |__ |__|_____  ______
 \_____  \\____ \__  \ _/ ___\/ __ \ /  ___/  |  \|  \____ \/  ___/
 /        \  |_> > __ \\  \__\  ___/ \___ \|   Y  \  |  |_> >___ \ 
/_______  /   __(____  /\___  >___  >____  >___|  /__|   __/____  >
        \/|__|       \/     \/    \/     \/     \/   |__|       \/ 
*/


pragma solidity ^0.8.14;






contract StackSpaceships is ERC721, Ownable {
    using Strings for uint;
    using Counters for Counters.Counter;

    enum SaleStatus { PAUSED, LIVE }
    enum SaleStage { WHITELIST, PUBLIC, PRIVATE, FREE_MINT }

    Counters.Counter private _tokenIds;

    uint256 public startingIndex;
    uint256 public startingIndexBlock;

    string public contractURI;

    uint public collectionSize = 4242;
    uint public reservedAmount = 100;
    
    uint public tokensPerPersonPrivateLimit = 5;
    uint public tokensPerPersonWhitelistLimit = 5;
    uint public tokensPerPersonPublicLimit = 5;
    uint public tokensPerPersonFreeMintLimit = 1;

    uint public whitelistMintPrice = 0.0777 ether;
    uint public privateMintPrice = 0.0777 ether;
    uint public publicMintPrice = 0.0999 ether;

    address public crossmintAddress = 0xdAb1a1854214684acE522439684a145E62505233;

    string public preRevealURL = "https://stackbrowser.com/api/nft/placeholder.json";
    string public baseURL;

    bytes32 public whitelistMerkleRoot;
    bytes32 public privateMerkleRoot;
    bytes32 public freeMintMerkleRoot;

    SaleStatus public privateSaleStatus = SaleStatus.PAUSED;
    SaleStatus public whitelistSaleStatus = SaleStatus.PAUSED;
    SaleStatus public publicSaleStatus = SaleStatus.PAUSED;
    SaleStatus public freeMintSaleStatus = SaleStatus.PAUSED;

    event Minted(address to, uint count, SaleStage stage);

    mapping(address => uint) private _privateMintedCount;
    mapping(address => uint) private _whitelistMintedCount;
    mapping(address => uint) private _publicMintedCount;
    mapping(address => uint) private _freeMintedCount;

    constructor() ERC721("StackSpaceships", "STK"){}
    
    /// @notice Update Contract-level metadata
    function setContractURI(string memory _contractURI) external onlyOwner {
        contractURI = string(abi.encodePacked(
            "data:application/json;base64,",
            Base64.encode(
                bytes(
                    _contractURI
                )
            )
        ));
    }
    
    /// @notice Update the whitelist merkle tree root
    function setWhitelistMerkleRoot(bytes32 root) external onlyOwner {
        whitelistMerkleRoot = root;
    }
    
    /// @notice Update the private merkle tree root
    function setPrivateMerkleRoot(bytes32 root) external onlyOwner {
        privateMerkleRoot = root;
    }
    
    /// @notice Update the free mint merkle tree root
    function setFreeMintMerkleRoot(bytes32 root) external onlyOwner {
        freeMintMerkleRoot = root;
    }
    
    /// @notice Update base url
    function setBaseUrl(string calldata url) external onlyOwner {
        require(startingIndex == 0, "Collection has been already revealed");
        baseURL = url;
    }

    /// @notice Set Pre Reveal URL
    function setPreRevealUrl(string calldata url) external onlyOwner {
        preRevealURL = url;
    }

    function totalSupply() external view returns (uint) {
        return _tokenIds.current();
    }

    /// @notice Update private sale stage
    function setPrivateSaleStatus(SaleStatus status) external onlyOwner {
        privateSaleStatus = status;
    }
    
    /// @notice Update whitelist sale stage
    function setWhitelistSaleStatus(SaleStatus status) external onlyOwner {
        whitelistSaleStatus = status;
    }
    
    /// @notice Update public sale stage
    function setPublicSaleStatus(SaleStatus status) external onlyOwner {
        publicSaleStatus = status;
    }
    
    /// @notice Update free mint sale stage
    function setFreeMintSaleStatus(SaleStatus status) external onlyOwner {
        freeMintSaleStatus = status;
    }

    /// @notice Update collection size
    function setCollectionSize(uint size) external onlyOwner {
        require(startingIndex == 0, "Collection has been already revealed");
        collectionSize = size;
    }

    /// @notice Update token limit per address
    function setTokensPerPersonPublicLimit(uint limit) external onlyOwner {
        tokensPerPersonPublicLimit = limit;
    }

    /// @notice Update token limit per whitelisted address
    function setTokensPerPersonWhitelistLimit(uint limit) external onlyOwner {
        tokensPerPersonWhitelistLimit = limit;
    }

    /// @notice Update token limit per private address
    function setTokensPerPersonPrivateLimit(uint limit) external onlyOwner {
        tokensPerPersonPrivateLimit = limit;
    }

    /// @notice Update token limit per free mint address
    function setTokensPerPersonFreeMintLimit(uint limit) external onlyOwner {
        tokensPerPersonFreeMintLimit = limit;
    }

    /// @notice Update reserved amount
    function setReservedAmount(uint amount) external onlyOwner {
        reservedAmount = amount;
    }

    /// @notice Update whitelist mint price
    function setWhitelistMintPrice(uint price) external onlyOwner {
        whitelistMintPrice = price;
    }
    
    /// @notice Update private mint price
    function setPrivateMintPrice(uint price) external onlyOwner {
        privateMintPrice = price;
    }

    /// @notice Update public mint price
    function setPublicMintPrice(uint price) external onlyOwner {
        publicMintPrice = price;
    }

    /// @notice Update crossmint address
    function setCrossmintAddress(address addr) external onlyOwner {
        crossmintAddress = addr;
    }

    /// @notice Reveal metadata for all the tokens
    function reveal() external onlyOwner {
        require(startingIndex == 0, "Collection has been already revealed");
        require(startingIndexBlock != 0, "Starting index block must be set");
        
        startingIndex = uint(blockhash(startingIndexBlock)) % collectionSize;
        
        // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes)
        if (block.number - startingIndexBlock > 255) {
            startingIndex = uint(blockhash(block.number - 1)) % collectionSize;
        }

        // Prevent default sequence
        if (startingIndex == 0) {
            startingIndex = startingIndex + 1;
        }
    }

    function emergencySetStartingIndexBlock() public onlyOwner {
        require(startingIndex == 0, "Collection has been already revealed");
        startingIndexBlock = block.number;
    }

    /// @notice Withdraw contract balance
    function withdraw() external onlyOwner {
        uint balance = address(this).balance;
        require(balance > 0, "No balance");
        payable(owner()).transfer(balance);
    }

    /// @notice Allows owner to mint tokens to a specified address
    function airdrop(address to, uint count) external onlyOwner {
        require(_tokenIds.current() + count <= collectionSize, "Request exceeds collection size");
        _mintTokens(to, count);
    }

    /// @notice Get token URI. In case of delayed reveal we give user the json of the placeholer metadata.
    /// @param tokenId token ID
    function tokenURI(uint tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory sequenceId;

        if (startingIndex > 0) {
            sequenceId = ( 1 + (tokenId + startingIndex) % collectionSize ).toString();
            return string(abi.encodePacked(baseURL, sequenceId, '.json'));
        } else {
            return preRevealURL;
        }
    }
    
    function publicMint(uint count) external payable {
        _publicMint(count, msg.sender);
    }

    function crossmint(address _to, uint count) external payable {
        require(msg.sender == crossmintAddress, "This function is for Crossmint only.");
        _publicMint(count, _to);
    }

    function _publicMint(uint count, address _to) internal {
        require(startingIndex == 0, "Collection has been already revealed");
        require(publicSaleStatus == SaleStatus.LIVE, "Public Sales are off");
        require(_tokenIds.current() + count <= collectionSize - reservedAmount, "Number of requested tokens will exceed collection size");
        require(msg.value >= count * publicMintPrice, "Ether value sent is not sufficient");
        
        require(_publicMintedCount[_to] + count <= tokensPerPersonPublicLimit, "Number of requested tokens exceeds allowance");

        _publicMintedCount[_to] += count;

        _mintTokens(_to, count);
        
        emit Minted(_to, count, SaleStage.PUBLIC);
    }

    function whitelistMint(bytes32[] calldata merkleProof, uint count) external payable {
        require(startingIndex == 0, "Collection has been already revealed");
        require(whitelistSaleStatus == SaleStatus.LIVE, "Whitelist sales are closed");
        require(_tokenIds.current() + count <= collectionSize - reservedAmount, "Number of requested tokens will exceed collection size");
        
        require(msg.value >= count * whitelistMintPrice, "Ether value sent is not sufficient");
        require(_whitelistMintedCount[msg.sender] + count <= tokensPerPersonWhitelistLimit, "Number of requested tokens exceeds allowance");
        
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(merkleProof, whitelistMerkleRoot, leaf), "You are not whitelisted");
        
        _whitelistMintedCount[msg.sender] += count;

        _mintTokens(msg.sender, count);
        
        emit Minted(msg.sender, count, SaleStage.WHITELIST);
    }

    function privateMint(bytes32[] calldata merkleProof, uint count) external payable {
        require(startingIndex == 0, "Collection has been already revealed");
        require(privateSaleStatus == SaleStatus.LIVE, "Private sales are closed");
        require(_tokenIds.current() + count <= collectionSize, "Number of requested tokens will exceed collection size");
        
        require(msg.value >= count * privateMintPrice, "Ether value sent is not sufficient");
        require(_privateMintedCount[msg.sender] + count <= tokensPerPersonPrivateLimit, "Number of requested tokens exceeds allowance");
        
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(merkleProof, privateMerkleRoot, leaf), "You are not whitelisted");
        
        _privateMintedCount[msg.sender] += count;

        _mintTokens(msg.sender, count);
        
        emit Minted(msg.sender, count, SaleStage.PRIVATE);
    }

    function freeMint(bytes32[] calldata merkleProof, uint count) public {
        require(startingIndex == 0, "Collection has been already revealed");
        require(freeMintSaleStatus == SaleStatus.LIVE, "Free mint sales are closed");
        require(_tokenIds.current() + count <= collectionSize - reservedAmount, "Number of requested tokens will exceed collection size");
        require(_freeMintedCount[msg.sender] + count <= tokensPerPersonFreeMintLimit, "Number of requested tokens exceeds allowance");
        
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(merkleProof, freeMintMerkleRoot, leaf), "You are not allowed to mint for free");
        
        _freeMintedCount[msg.sender] += count;

        _mintTokens(msg.sender, count);
        
        emit Minted(msg.sender, count, SaleStage.FREE_MINT);
    }
    
    /// @dev Perform actual minting of the tokens
    function _mintTokens(address to, uint count) internal {
        for(uint index = 0; index < count; index++) {

            _tokenIds.increment();
            uint newItemId = _tokenIds.current();

            _safeMint(to, newItemId);
        }

        // if Minting is done, set startingIndexBlock
        if (startingIndexBlock == 0 && (_tokenIds.current() == collectionSize)) {
            startingIndexBlock = block.number;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"enum StackSpaceships.SaleStage","name":"stage","type":"uint8"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"crossmint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"crossmintAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintSaleStatus","outputs":[{"internalType":"enum StackSpaceships.SaleStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preRevealURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"privateMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"privateMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSaleStatus","outputs":[{"internalType":"enum StackSpaceships.SaleStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStatus","outputs":[{"internalType":"enum StackSpaceships.SaleStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"setBaseUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"size","type":"uint256"}],"name":"setCollectionSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setCrossmintAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setFreeMintMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum StackSpaceships.SaleStatus","name":"status","type":"uint8"}],"name":"setFreeMintSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"setPreRevealUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setPrivateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrivateMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum StackSpaceships.SaleStatus","name":"status","type":"uint8"}],"name":"setPrivateSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPublicMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum StackSpaceships.SaleStatus","name":"status","type":"uint8"}],"name":"setPublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setReservedAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setTokensPerPersonFreeMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setTokensPerPersonPrivateLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setTokensPerPersonPublicLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setTokensPerPersonWhitelistLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setWhitelistMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum StackSpaceships.SaleStatus","name":"status","type":"uint8"}],"name":"setWhitelistSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensPerPersonFreeMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensPerPersonPrivateLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensPerPersonPublicLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensPerPersonWhitelistLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSaleStatus","outputs":[{"internalType":"enum StackSpaceships.SaleStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052611092600b556064600c556005600d556005600e556005600f5560016010556701140bbd030c40006011556701140bbd030c4000601255670162ea854d0fc00060135573dab1a1854214684ace522439684a145e62505233601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806060016040528060318152602001620062876031913960159080519060200190620000cd92919062000328565b506000601a60006101000a81548160ff02191690836001811115620000f757620000f6620003d8565b5b02179055506000601a60016101000a81548160ff02191690836001811115620001255762000124620003d8565b5b02179055506000601a60026101000a81548160ff02191690836001811115620001535762000152620003d8565b5b02179055506000601a60036101000a81548160ff02191690836001811115620001815762000180620003d8565b5b02179055503480156200019357600080fd5b506040518060400160405280600f81526020017f537461636b5370616365736869707300000000000000000000000000000000008152506040518060400160405280600381526020017f53544b000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200021892919062000328565b5080600190805190602001906200023192919062000328565b50505062000254620002486200025a60201b60201c565b6200026260201b60201c565b6200046b565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003369062000436565b90600052602060002090601f0160209004810192826200035a5760008555620003a6565b82601f106200037557805160ff1916838001178555620003a6565b82800160010185558215620003a6579182015b82811115620003a557825182559160200191906001019062000388565b5b509050620003b59190620003b9565b5090565b5b80821115620003d4576000816000905550600101620003ba565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200044f57607f821691505b60208210810362000465576200046462000407565b5b50919050565b615e0c806200047b6000396000f3fe6080604052600436106103ed5760003560e01c806363da982411610208578063aca8ffe711610118578063d9925ba4116100ab578063e5e99daa1161007a578063e5e99daa14610e1f578063e8a3d48514610e4a578063e985e9c514610e75578063f2fde38b14610eb2578063f92c45b714610edb576103ed565b8063d9925ba414610d77578063dc53fd9214610da0578063dde44b8914610dcb578063e36d649814610df4576103ed565b8063bd32fb66116100e7578063bd32fb6614610cbd578063c7c3268b14610ce6578063c87b56dd14610d0f578063cb774d4714610d4c576103ed565b8063aca8ffe714610c15578063b6c693e514610c3e578063b88d4fde14610c69578063bc1ac5c114610c92576103ed565b80638da5cb5b1161019b578063a1fb81731161016a578063a1fb817314610b56578063a22cb46514610b81578063a475b5dd14610baa578063a611708e14610bc1578063aa98e0c614610bea576103ed565b80638da5cb5b14610aae578063938e3d7b14610ad957806395d89b4114610b025780639975562414610b2d576103ed565b8063715018a6116101d7578063715018a614610a2e578063765555bf14610a455780637d17fcbe14610a6e5780638ba4cc3c14610a85576103ed565b806363da98241461097457806365bfaa681461099d57806368963df0146109c657806370a08231146109f1576103ed565b80632c4671a41161030357806345c0f533116102965780635b2a55e4116102655780635b2a55e41461088f5780635b34553b146108ba5780635d82cf6e146108e557806360e1666a1461090e5780636352211e14610937576103ed565b806345c0f533146107f45780634a3ed1421461081f5780634db2f55e1461084857806358891a3714610873576103ed565b8063376d441c116102d2578063376d441c1461075e5780633ccfd60b1461078957806340c84b0e146107a057806342842e0e146107cb576103ed565b80632c4671a4146106c35780632db11544146106ee57806335c6aaf81461070a5780633615ab4514610735576103ed565b806318160ddd1161038657806323b872dd1161035557806323b872dd1461060e57806328818b96146106375780632904e6d91461065357806329e6a3351461066f5780632bbde22e14610698576103ed565b806318160ddd146105685780631970d1fb14610593578063200147f3146105bc5780632056acb3146105e5576103ed565b806306fdde03116103c257806306fdde03146104ae578063081812fc146104d9578063095ea7b314610516578063170e17361461053f576103ed565b806204348e146103f25780620cbb211461041d57806301ffc9a71461044657806303a3731314610483575b600080fd5b3480156103fe57600080fd5b50610407610f06565b604051610414919061402b565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f91906140bf565b610f0c565b005b34801561045257600080fd5b5061046d60048036038101906104689190614164565b610f2a565b60405161047a91906141ac565b60405180910390f35b34801561048f57600080fd5b5061049861100c565b6040516104a59190614260565b60405180910390f35b3480156104ba57600080fd5b506104c361109a565b6040516104d09190614260565b60405180910390f35b3480156104e557600080fd5b5061050060048036038101906104fb91906142ae565b61112c565b60405161050d919061431c565b60405180910390f35b34801561052257600080fd5b5061053d60048036038101906105389190614363565b611172565b005b34801561054b57600080fd5b50610566600480360381019061056191906142ae565b611289565b005b34801561057457600080fd5b5061057d61129b565b60405161058a919061402b565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b591906142ae565b6112ac565b005b3480156105c857600080fd5b506105e360048036038101906105de91906143c8565b6112be565b005b3480156105f157600080fd5b5061060c600480360381019061060791906143c8565b6112f3565b005b34801561061a57600080fd5b50610635600480360381019061063091906143f5565b611328565b005b610651600480360381019061064c919061449e565b611388565b005b61066d6004803603810190610668919061449e565b6116d4565b005b34801561067b57600080fd5b50610696600480360381019061069191906143c8565b611a2d565b005b3480156106a457600080fd5b506106ad611a62565b6040516106ba9190614517565b60405180910390f35b3480156106cf57600080fd5b506106d8611a68565b6040516106e5919061402b565b60405180910390f35b610708600480360381019061070391906142ae565b611a6e565b005b34801561071657600080fd5b5061071f611a7b565b60405161072c919061402b565b60405180910390f35b34801561074157600080fd5b5061075c6004803603810190610757919061449e565b611a81565b005b34801561076a57600080fd5b50610773611d8a565b60405161078091906145a9565b60405180910390f35b34801561079557600080fd5b5061079e611d9d565b005b3480156107ac57600080fd5b506107b5611e3e565b6040516107c29190614260565b60405180910390f35b3480156107d757600080fd5b506107f260048036038101906107ed91906143f5565b611ecc565b005b34801561080057600080fd5b50610809611eec565b604051610816919061402b565b60405180910390f35b34801561082b57600080fd5b50610846600480360381019061084191906142ae565b611ef2565b005b34801561085457600080fd5b5061085d611f04565b60405161086a919061402b565b60405180910390f35b61088d60048036038101906108889190614363565b611f0a565b005b34801561089b57600080fd5b506108a4611fa8565b6040516108b1919061431c565b60405180910390f35b3480156108c657600080fd5b506108cf611fce565b6040516108dc919061402b565b60405180910390f35b3480156108f157600080fd5b5061090c600480360381019061090791906142ae565b611fd4565b005b34801561091a57600080fd5b50610935600480360381019061093091906142ae565b611fe6565b005b34801561094357600080fd5b5061095e600480360381019061095991906142ae565b611ff8565b60405161096b919061431c565b60405180910390f35b34801561098057600080fd5b5061099b600480360381019061099691906142ae565b61207e565b005b3480156109a957600080fd5b506109c460048036038101906109bf91906145f0565b612090565b005b3480156109d257600080fd5b506109db6120a2565b6040516109e89190614517565b60405180910390f35b3480156109fd57600080fd5b50610a186004803603810190610a13919061461d565b6120a8565b604051610a25919061402b565b60405180910390f35b348015610a3a57600080fd5b50610a4361215f565b005b348015610a5157600080fd5b50610a6c6004803603810190610a6791906143c8565b612173565b005b348015610a7a57600080fd5b50610a836121a8565b005b348015610a9157600080fd5b50610aac6004803603810190610aa79190614363565b6121fe565b005b348015610aba57600080fd5b50610ac361226d565b604051610ad0919061431c565b60405180910390f35b348015610ae557600080fd5b50610b006004803603810190610afb919061477a565b612297565b005b348015610b0e57600080fd5b50610b176122e0565b604051610b249190614260565b60405180910390f35b348015610b3957600080fd5b50610b546004803603810190610b4f919061461d565b612372565b005b348015610b6257600080fd5b50610b6b6123be565b604051610b7891906145a9565b60405180910390f35b348015610b8d57600080fd5b50610ba86004803603810190610ba391906147ef565b6123d1565b005b348015610bb657600080fd5b50610bbf6123e7565b005b348015610bcd57600080fd5b50610be86004803603810190610be391906142ae565b6124f0565b005b348015610bf657600080fd5b50610bff612502565b604051610c0c9190614517565b60405180910390f35b348015610c2157600080fd5b50610c3c6004803603810190610c3791906142ae565b612508565b005b348015610c4a57600080fd5b50610c5361255f565b604051610c6091906145a9565b60405180910390f35b348015610c7557600080fd5b50610c906004803603810190610c8b91906148d0565b612572565b005b348015610c9e57600080fd5b50610ca76125d4565b604051610cb491906145a9565b60405180910390f35b348015610cc957600080fd5b50610ce46004803603810190610cdf91906145f0565b6125e7565b005b348015610cf257600080fd5b50610d0d6004803603810190610d0891906140bf565b6125f9565b005b348015610d1b57600080fd5b50610d366004803603810190610d3191906142ae565b61265c565b604051610d439190614260565b60405180910390f35b348015610d5857600080fd5b50610d616127a3565b604051610d6e919061402b565b60405180910390f35b348015610d8357600080fd5b50610d9e6004803603810190610d9991906142ae565b6127a9565b005b348015610dac57600080fd5b50610db56127bb565b604051610dc2919061402b565b60405180910390f35b348015610dd757600080fd5b50610df26004803603810190610ded91906145f0565b6127c1565b005b348015610e0057600080fd5b50610e096127d3565b604051610e16919061402b565b60405180910390f35b348015610e2b57600080fd5b50610e346127d9565b604051610e41919061402b565b60405180910390f35b348015610e5657600080fd5b50610e5f6127df565b604051610e6c9190614260565b60405180910390f35b348015610e8157600080fd5b50610e9c6004803603810190610e979190614953565b61286d565b604051610ea991906141ac565b60405180910390f35b348015610ebe57600080fd5b50610ed96004803603810190610ed4919061461d565b612901565b005b348015610ee757600080fd5b50610ef0612984565b604051610efd919061402b565b60405180910390f35b60125481565b610f1461298a565b818160159190610f25929190613ee9565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ff557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611005575061100482612a08565b5b9050919050565b60158054611019906149c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611045906149c2565b80156110925780601f1061106757610100808354040283529160200191611092565b820191906000526020600020905b81548152906001019060200180831161107557829003601f168201915b505050505081565b6060600080546110a9906149c2565b80601f01602080910402602001604051908101604052809291908181526020018280546110d5906149c2565b80156111225780601f106110f757610100808354040283529160200191611122565b820191906000526020600020905b81548152906001019060200180831161110557829003601f168201915b5050505050905090565b600061113782612a72565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061117d82611ff8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e490614a65565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661120c612abd565b73ffffffffffffffffffffffffffffffffffffffff16148061123b575061123a81611235612abd565b61286d565b5b61127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127190614af7565b60405180910390fd5b6112848383612ac5565b505050565b61129161298a565b80600c8190555050565b60006112a76007612b7e565b905090565b6112b461298a565b8060128190555050565b6112c661298a565b80601a60006101000a81548160ff021916908360018111156112eb576112ea614532565b5b021790555050565b6112fb61298a565b80601a60016101000a81548160ff021916908360018111156113205761131f614532565b5b021790555050565b611339611333612abd565b82612b8c565b611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136f90614b89565b60405180910390fd5b611383838383612c21565b505050565b6000600854146113cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c490614c1b565b60405180910390fd5b6001808111156113e0576113df614532565b5b601a60009054906101000a900460ff16600181111561140257611401614532565b5b14611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990614c87565b60405180910390fd5b600b54816114506007612b7e565b61145a9190614cd6565b111561149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290614d9e565b60405180910390fd5b601254816114a99190614dbe565b3410156114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e290614e8a565b60405180910390fd5b600d5481601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115399190614cd6565b111561157a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157190614f1c565b60405180910390fd5b60003360405160200161158d9190614f84565b6040516020818303038152906040528051906020012090506115f3848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060185483612f1a565b611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162990614feb565b60405180910390fd5b81601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116819190614cd6565b925050819055506116923383612f31565b7fdcb23284f3935b5557998e99dcc286e29744c5000723d99eecd5d6f5694f6e11338360026040516116c693929190615053565b60405180910390a150505050565b600060085414611719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171090614c1b565b60405180910390fd5b60018081111561172c5761172b614532565b5b601a60019054906101000a900460ff16600181111561174e5761174d614532565b5b1461178e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611785906150d6565b60405180910390fd5b600c54600b5461179e91906150f6565b816117a96007612b7e565b6117b39190614cd6565b11156117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb90614d9e565b60405180910390fd5b601154816118029190614dbe565b341015611844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183b90614e8a565b60405180910390fd5b600e5481601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118929190614cd6565b11156118d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ca90614f1c565b60405180910390fd5b6000336040516020016118e69190614f84565b60405160208183030381529060405280519060200120905061194c848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060175483612f1a565b61198b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198290614feb565b60405180910390fd5b81601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119da9190614cd6565b925050819055506119eb3383612f31565b7fdcb23284f3935b5557998e99dcc286e29744c5000723d99eecd5d6f5694f6e1133836000604051611a1f93929190615053565b60405180910390a150505050565b611a3561298a565b80601a60026101000a81548160ff02191690836001811115611a5a57611a59614532565b5b021790555050565b60185481565b600e5481565b611a788133612fa0565b50565b60115481565b600060085414611ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abd90614c1b565b60405180910390fd5b600180811115611ad957611ad8614532565b5b601a60039054906101000a900460ff166001811115611afb57611afa614532565b5b14611b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3290615176565b60405180910390fd5b600c54600b54611b4b91906150f6565b81611b566007612b7e565b611b609190614cd6565b1115611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9890614d9e565b60405180910390fd5b60105481601e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bef9190614cd6565b1115611c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2790614f1c565b60405180910390fd5b600033604051602001611c439190614f84565b604051602081830303815290604052805190602001209050611ca9848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060195483612f1a565b611ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdf90615208565b60405180910390fd5b81601e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d379190614cd6565b92505081905550611d483383612f31565b7fdcb23284f3935b5557998e99dcc286e29744c5000723d99eecd5d6f5694f6e1133836003604051611d7c93929190615053565b60405180910390a150505050565b601a60009054906101000a900460ff1681565b611da561298a565b600047905060008111611ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de490615274565b60405180910390fd5b611df561226d565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611e3a573d6000803e3d6000fd5b5050565b60168054611e4b906149c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e77906149c2565b8015611ec45780601f10611e9957610100808354040283529160200191611ec4565b820191906000526020600020905b815481529060010190602001808311611ea757829003601f168201915b505050505081565b611ee783838360405180602001604052806000815250612572565b505050565b600b5481565b611efa61298a565b80600f8190555050565b600d5481565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9190615306565b60405180910390fd5b611fa48183612fa0565b5050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b611fdc61298a565b8060138190555050565b611fee61298a565b80600d8190555050565b6000806120048361323f565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206c90615372565b60405180910390fd5b80915050919050565b61208661298a565b80600e8190555050565b61209861298a565b8060188190555050565b60195481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210f90615404565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61216761298a565b612171600061327c565b565b61217b61298a565b80601a60036101000a81548160ff021916908360018111156121a05761219f614532565b5b021790555050565b6121b061298a565b6000600854146121f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ec90614c1b565b60405180910390fd5b43600981905550565b61220661298a565b600b54816122146007612b7e565b61221e9190614cd6565b111561225f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225690615470565b60405180910390fd5b6122698282612f31565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61229f61298a565b6122a881613342565b6040516020016122b89190615518565b604051602081830303815290604052600a90805190602001906122dc929190613f6f565b5050565b6060600180546122ef906149c2565b80601f016020809104026020016040519081016040528092919081815260200182805461231b906149c2565b80156123685780601f1061233d57610100808354040283529160200191612368565b820191906000526020600020905b81548152906001019060200180831161234b57829003601f168201915b5050505050905090565b61237a61298a565b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601a60039054906101000a900460ff1681565b6123e36123dc612abd565b83836134a5565b5050565b6123ef61298a565b600060085414612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242b90614c1b565b60405180910390fd5b600060095403612479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247090615586565b60405180910390fd5b600b546009544060001c61248d91906155d5565b60088190555060ff600954436124a391906150f6565b11156124ce57600b546001436124b991906150f6565b4060001c6124c791906155d5565b6008819055505b6000600854036124ee5760016008546124e79190614cd6565b6008819055505b565b6124f861298a565b8060118190555050565b60175481565b61251061298a565b600060085414612555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254c90614c1b565b60405180910390fd5b80600b8190555050565b601a60029054906101000a900460ff1681565b61258361257d612abd565b83612b8c565b6125c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b990614b89565b60405180910390fd5b6125ce84848484613611565b50505050565b601a60019054906101000a900460ff1681565b6125ef61298a565b8060178190555050565b61260161298a565b600060085414612646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263d90614c1b565b60405180910390fd5b818160169190612657929190613ee9565b505050565b60606126678261366d565b6126a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269d90615678565b60405180910390fd5b60606000600854111561270f576126e2600b54600854856126c79190614cd6565b6126d191906155d5565b60016126dd9190614cd6565b6136ae565b90506016816040516020016126f8929190615778565b60405160208183030381529060405291505061279e565b6015805461271c906149c2565b80601f0160208091040260200160405190810160405280929190818152602001828054612748906149c2565b80156127955780601f1061276a57610100808354040283529160200191612795565b820191906000526020600020905b81548152906001019060200180831161277857829003601f168201915b50505050509150505b919050565b60085481565b6127b161298a565b8060108190555050565b60135481565b6127c961298a565b8060198190555050565b60095481565b60105481565b600a80546127ec906149c2565b80601f0160208091040260200160405190810160405280929190818152602001828054612818906149c2565b80156128655780601f1061283a57610100808354040283529160200191612865565b820191906000526020600020905b81548152906001019060200180831161284857829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61290961298a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296f90615819565b60405180910390fd5b6129818161327c565b50565b600c5481565b612992612abd565b73ffffffffffffffffffffffffffffffffffffffff166129b061226d565b73ffffffffffffffffffffffffffffffffffffffff1614612a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fd90615885565b60405180910390fd5b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a7b8161366d565b612aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab190615372565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b3883611ff8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600080612b9883611ff8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612bda5750612bd9818561286d565b5b80612c1857508373ffffffffffffffffffffffffffffffffffffffff16612c008461112c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612c4182611ff8565b73ffffffffffffffffffffffffffffffffffffffff1614612c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8e90615917565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfd906159a9565b60405180910390fd5b612d13838383600161377c565b8273ffffffffffffffffffffffffffffffffffffffff16612d3382611ff8565b73ffffffffffffffffffffffffffffffffffffffff1614612d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8090615917565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f1583838360016138a2565b505050565b600082612f2785846138a8565b1490509392505050565b60005b81811015612f7257612f4660076138fe565b6000612f526007612b7e565b9050612f5e8482613914565b508080612f6a906159c9565b915050612f34565b506000600954148015612f8f5750600b54612f8d6007612b7e565b145b15612f9c57436009819055505b5050565b600060085414612fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fdc90614c1b565b60405180910390fd5b600180811115612ff857612ff7614532565b5b601a60029054906101000a900460ff16600181111561301a57613019614532565b5b1461305a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305190615a5d565b60405180910390fd5b600c54600b5461306a91906150f6565b826130756007612b7e565b61307f9190614cd6565b11156130c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b790614d9e565b60405180910390fd5b601354826130ce9190614dbe565b341015613110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310790614e8a565b60405180910390fd5b600f5482601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461315e9190614cd6565b111561319f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319690614f1c565b60405180910390fd5b81601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131ee9190614cd6565b925050819055506131ff8183612f31565b7fdcb23284f3935b5557998e99dcc286e29744c5000723d99eecd5d6f5694f6e118183600160405161323393929190615053565b60405180910390a15050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000825103613364576040518060200160405280600081525090506134a0565b6000604051806060016040528060408152602001615d9760409139905060006003600285516133939190614cd6565b61339d9190615a7d565b60046133a99190614dbe565b67ffffffffffffffff8111156133c2576133c161464f565b5b6040519080825280601f01601f1916602001820160405280156133f45781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015613460576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050613405565b505060038651066001811461347c576002811461348f57613497565b603d6001830353603d6002830353613497565b603d60018303535b50505080925050505b919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350a90615afa565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161360491906141ac565b60405180910390a3505050565b61361c848484612c21565b61362884848484613932565b613667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365e90615b8c565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661368f8361323f565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600060016136bd84613ab9565b01905060008167ffffffffffffffff8111156136dc576136db61464f565b5b6040519080825280601f01601f19166020018201604052801561370e5781602001600182028036833780820191505090505b509050600082602001820190505b600115613771578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581613765576137646155a6565b5b0494506000850361371c575b819350505050919050565b600181111561389c57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146138105780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461380891906150f6565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461389b5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138939190614cd6565b925050819055505b5b50505050565b50505050565b60008082905060005b84518110156138f3576138de828683815181106138d1576138d0615bac565b5b6020026020010151613c0c565b915080806138eb906159c9565b9150506138b1565b508091505092915050565b6001816000016000828254019250508190555050565b61392e828260405180602001604052806000815250613c37565b5050565b60006139538473ffffffffffffffffffffffffffffffffffffffff16613c92565b15613aac578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261397c612abd565b8786866040518563ffffffff1660e01b815260040161399e9493929190615c30565b6020604051808303816000875af19250505080156139da57506040513d601f19601f820116820180604052508101906139d79190615c91565b60015b613a5c573d8060008114613a0a576040519150601f19603f3d011682016040523d82523d6000602084013e613a0f565b606091505b506000815103613a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a4b90615b8c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613ab1565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613b17577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613b0d57613b0c6155a6565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613b54576d04ee2d6d415b85acef81000000008381613b4a57613b496155a6565b5b0492506020810190505b662386f26fc100008310613b8357662386f26fc100008381613b7957613b786155a6565b5b0492506010810190505b6305f5e1008310613bac576305f5e1008381613ba257613ba16155a6565b5b0492506008810190505b6127108310613bd1576127108381613bc757613bc66155a6565b5b0492506004810190505b60648310613bf45760648381613bea57613be96155a6565b5b0492506002810190505b600a8310613c03576001810190505b80915050919050565b6000818310613c2457613c1f8284613cb5565b613c2f565b613c2e8383613cb5565b5b905092915050565b613c418383613ccc565b613c4e6000848484613932565b613c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c8490615b8c565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d3290615d0a565b60405180910390fd5b613d448161366d565b15613d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d7b90615d76565b60405180910390fd5b613d9260008383600161377c565b613d9b8161366d565b15613ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd290615d76565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613ee56000838360016138a2565b5050565b828054613ef5906149c2565b90600052602060002090601f016020900481019282613f175760008555613f5e565b82601f10613f3057803560ff1916838001178555613f5e565b82800160010185558215613f5e579182015b82811115613f5d578235825591602001919060010190613f42565b5b509050613f6b9190613ff5565b5090565b828054613f7b906149c2565b90600052602060002090601f016020900481019282613f9d5760008555613fe4565b82601f10613fb657805160ff1916838001178555613fe4565b82800160010185558215613fe4579182015b82811115613fe3578251825591602001919060010190613fc8565b5b509050613ff19190613ff5565b5090565b5b8082111561400e576000816000905550600101613ff6565b5090565b6000819050919050565b61402581614012565b82525050565b6000602082019050614040600083018461401c565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261407f5761407e61405a565b5b8235905067ffffffffffffffff81111561409c5761409b61405f565b5b6020830191508360018202830111156140b8576140b7614064565b5b9250929050565b600080602083850312156140d6576140d5614050565b5b600083013567ffffffffffffffff8111156140f4576140f3614055565b5b61410085828601614069565b92509250509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141418161410c565b811461414c57600080fd5b50565b60008135905061415e81614138565b92915050565b60006020828403121561417a57614179614050565b5b60006141888482850161414f565b91505092915050565b60008115159050919050565b6141a681614191565b82525050565b60006020820190506141c1600083018461419d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156142015780820151818401526020810190506141e6565b83811115614210576000848401525b50505050565b6000601f19601f8301169050919050565b6000614232826141c7565b61423c81856141d2565b935061424c8185602086016141e3565b61425581614216565b840191505092915050565b6000602082019050818103600083015261427a8184614227565b905092915050565b61428b81614012565b811461429657600080fd5b50565b6000813590506142a881614282565b92915050565b6000602082840312156142c4576142c3614050565b5b60006142d284828501614299565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614306826142db565b9050919050565b614316816142fb565b82525050565b6000602082019050614331600083018461430d565b92915050565b614340816142fb565b811461434b57600080fd5b50565b60008135905061435d81614337565b92915050565b6000806040838503121561437a57614379614050565b5b60006143888582860161434e565b925050602061439985828601614299565b9150509250929050565b600281106143b057600080fd5b50565b6000813590506143c2816143a3565b92915050565b6000602082840312156143de576143dd614050565b5b60006143ec848285016143b3565b91505092915050565b60008060006060848603121561440e5761440d614050565b5b600061441c8682870161434e565b935050602061442d8682870161434e565b925050604061443e86828701614299565b9150509250925092565b60008083601f84011261445e5761445d61405a565b5b8235905067ffffffffffffffff81111561447b5761447a61405f565b5b60208301915083602082028301111561449757614496614064565b5b9250929050565b6000806000604084860312156144b7576144b6614050565b5b600084013567ffffffffffffffff8111156144d5576144d4614055565b5b6144e186828701614448565b935093505060206144f486828701614299565b9150509250925092565b6000819050919050565b614511816144fe565b82525050565b600060208201905061452c6000830184614508565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6002811061457257614571614532565b5b50565b600081905061458382614561565b919050565b600061459382614575565b9050919050565b6145a381614588565b82525050565b60006020820190506145be600083018461459a565b92915050565b6145cd816144fe565b81146145d857600080fd5b50565b6000813590506145ea816145c4565b92915050565b60006020828403121561460657614605614050565b5b6000614614848285016145db565b91505092915050565b60006020828403121561463357614632614050565b5b60006146418482850161434e565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61468782614216565b810181811067ffffffffffffffff821117156146a6576146a561464f565b5b80604052505050565b60006146b9614046565b90506146c5828261467e565b919050565b600067ffffffffffffffff8211156146e5576146e461464f565b5b6146ee82614216565b9050602081019050919050565b82818337600083830152505050565b600061471d614718846146ca565b6146af565b9050828152602081018484840111156147395761473861464a565b5b6147448482856146fb565b509392505050565b600082601f8301126147615761476061405a565b5b813561477184826020860161470a565b91505092915050565b6000602082840312156147905761478f614050565b5b600082013567ffffffffffffffff8111156147ae576147ad614055565b5b6147ba8482850161474c565b91505092915050565b6147cc81614191565b81146147d757600080fd5b50565b6000813590506147e9816147c3565b92915050565b6000806040838503121561480657614805614050565b5b60006148148582860161434e565b9250506020614825858286016147da565b9150509250929050565b600067ffffffffffffffff82111561484a5761484961464f565b5b61485382614216565b9050602081019050919050565b600061487361486e8461482f565b6146af565b90508281526020810184848401111561488f5761488e61464a565b5b61489a8482856146fb565b509392505050565b600082601f8301126148b7576148b661405a565b5b81356148c7848260208601614860565b91505092915050565b600080600080608085870312156148ea576148e9614050565b5b60006148f88782880161434e565b94505060206149098782880161434e565b935050604061491a87828801614299565b925050606085013567ffffffffffffffff81111561493b5761493a614055565b5b614947878288016148a2565b91505092959194509250565b6000806040838503121561496a57614969614050565b5b60006149788582860161434e565b92505060206149898582860161434e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806149da57607f821691505b6020821081036149ed576149ec614993565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a4f6021836141d2565b9150614a5a826149f3565b604082019050919050565b60006020820190508181036000830152614a7e81614a42565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614ae1603d836141d2565b9150614aec82614a85565b604082019050919050565b60006020820190508181036000830152614b1081614ad4565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614b73602d836141d2565b9150614b7e82614b17565b604082019050919050565b60006020820190508181036000830152614ba281614b66565b9050919050565b7f436f6c6c656374696f6e20686173206265656e20616c7265616479207265766560008201527f616c656400000000000000000000000000000000000000000000000000000000602082015250565b6000614c056024836141d2565b9150614c1082614ba9565b604082019050919050565b60006020820190508181036000830152614c3481614bf8565b9050919050565b7f507269766174652073616c65732061726520636c6f7365640000000000000000600082015250565b6000614c716018836141d2565b9150614c7c82614c3b565b602082019050919050565b60006020820190508181036000830152614ca081614c64565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614ce182614012565b9150614cec83614012565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d2157614d20614ca7565b5b828201905092915050565b7f4e756d626572206f662072657175657374656420746f6b656e732077696c6c2060008201527f65786365656420636f6c6c656374696f6e2073697a6500000000000000000000602082015250565b6000614d886036836141d2565b9150614d9382614d2c565b604082019050919050565b60006020820190508181036000830152614db781614d7b565b9050919050565b6000614dc982614012565b9150614dd483614012565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e0d57614e0c614ca7565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420737566666963696560008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b6000614e746022836141d2565b9150614e7f82614e18565b604082019050919050565b60006020820190508181036000830152614ea381614e67565b9050919050565b7f4e756d626572206f662072657175657374656420746f6b656e7320657863656560008201527f647320616c6c6f77616e63650000000000000000000000000000000000000000602082015250565b6000614f06602c836141d2565b9150614f1182614eaa565b604082019050919050565b60006020820190508181036000830152614f3581614ef9565b9050919050565b60008160601b9050919050565b6000614f5482614f3c565b9050919050565b6000614f6682614f49565b9050919050565b614f7e614f79826142fb565b614f5b565b82525050565b6000614f908284614f6d565b60148201915081905092915050565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b6000614fd56017836141d2565b9150614fe082614f9f565b602082019050919050565b6000602082019050818103600083015261500481614fc8565b9050919050565b6004811061501c5761501b614532565b5b50565b600081905061502d8261500b565b919050565b600061503d8261501f565b9050919050565b61504d81615032565b82525050565b6000606082019050615068600083018661430d565b615075602083018561401c565b6150826040830184615044565b949350505050565b7f57686974656c6973742073616c65732061726520636c6f736564000000000000600082015250565b60006150c0601a836141d2565b91506150cb8261508a565b602082019050919050565b600060208201905081810360008301526150ef816150b3565b9050919050565b600061510182614012565b915061510c83614012565b92508282101561511f5761511e614ca7565b5b828203905092915050565b7f46726565206d696e742073616c65732061726520636c6f736564000000000000600082015250565b6000615160601a836141d2565b915061516b8261512a565b602082019050919050565b6000602082019050818103600083015261518f81615153565b9050919050565b7f596f7520617265206e6f7420616c6c6f77656420746f206d696e7420666f722060008201527f6672656500000000000000000000000000000000000000000000000000000000602082015250565b60006151f26024836141d2565b91506151fd82615196565b604082019050919050565b60006020820190508181036000830152615221816151e5565b9050919050565b7f4e6f2062616c616e636500000000000000000000000000000000000000000000600082015250565b600061525e600a836141d2565b915061526982615228565b602082019050919050565b6000602082019050818103600083015261528d81615251565b9050919050565b7f546869732066756e6374696f6e20697320666f722043726f73736d696e74206f60008201527f6e6c792e00000000000000000000000000000000000000000000000000000000602082015250565b60006152f06024836141d2565b91506152fb82615294565b604082019050919050565b6000602082019050818103600083015261531f816152e3565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061535c6018836141d2565b915061536782615326565b602082019050919050565b6000602082019050818103600083015261538b8161534f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006153ee6029836141d2565b91506153f982615392565b604082019050919050565b6000602082019050818103600083015261541d816153e1565b9050919050565b7f52657175657374206578636565647320636f6c6c656374696f6e2073697a6500600082015250565b600061545a601f836141d2565b915061546582615424565b602082019050919050565b600060208201905081810360008301526154898161544d565b9050919050565b600081905092915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b60006154d1601d83615490565b91506154dc8261549b565b601d82019050919050565b60006154f2826141c7565b6154fc8185615490565b935061550c8185602086016141e3565b80840191505092915050565b6000615523826154c4565b915061552f82846154e7565b915081905092915050565b7f5374617274696e6720696e64657820626c6f636b206d75737420626520736574600082015250565b60006155706020836141d2565b915061557b8261553a565b602082019050919050565b6000602082019050818103600083015261559f81615563565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006155e082614012565b91506155eb83614012565b9250826155fb576155fa6155a6565b5b828206905092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615662602f836141d2565b915061566d82615606565b604082019050919050565b6000602082019050818103600083015261569181615655565b9050919050565b60008190508160005260206000209050919050565b600081546156ba816149c2565b6156c48186615490565b945060018216600081146156df57600181146156f057615723565b60ff19831686528186019350615723565b6156f985615698565b60005b8381101561571b578154818901526001820191506020810190506156fc565b838801955050505b50505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000615762600583615490565b915061576d8261572c565b600582019050919050565b600061578482856156ad565b915061579082846154e7565b915061579b82615755565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006158036026836141d2565b915061580e826157a7565b604082019050919050565b60006020820190508181036000830152615832816157f6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061586f6020836141d2565b915061587a82615839565b602082019050919050565b6000602082019050818103600083015261589e81615862565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006159016025836141d2565b915061590c826158a5565b604082019050919050565b60006020820190508181036000830152615930816158f4565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006159936024836141d2565b915061599e82615937565b604082019050919050565b600060208201905081810360008301526159c281615986565b9050919050565b60006159d482614012565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a0657615a05614ca7565b5b600182019050919050565b7f5075626c69632053616c657320617265206f6666000000000000000000000000600082015250565b6000615a476014836141d2565b9150615a5282615a11565b602082019050919050565b60006020820190508181036000830152615a7681615a3a565b9050919050565b6000615a8882614012565b9150615a9383614012565b925082615aa357615aa26155a6565b5b828204905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615ae46019836141d2565b9150615aef82615aae565b602082019050919050565b60006020820190508181036000830152615b1381615ad7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615b766032836141d2565b9150615b8182615b1a565b604082019050919050565b60006020820190508181036000830152615ba581615b69565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000615c0282615bdb565b615c0c8185615be6565b9350615c1c8185602086016141e3565b615c2581614216565b840191505092915050565b6000608082019050615c45600083018761430d565b615c52602083018661430d565b615c5f604083018561401c565b8181036060830152615c718184615bf7565b905095945050505050565b600081519050615c8b81614138565b92915050565b600060208284031215615ca757615ca6614050565b5b6000615cb584828501615c7c565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615cf46020836141d2565b9150615cff82615cbe565b602082019050919050565b60006020820190508181036000830152615d2381615ce7565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615d60601c836141d2565b9150615d6b82615d2a565b602082019050919050565b60006020820190508181036000830152615d8f81615d53565b905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212202d19c8b5baefba4a8b60eecb85fc79932474e4d31951e2dd3bde98b3f43dd37064736f6c634300080e003368747470733a2f2f737461636b62726f777365722e636f6d2f6170692f6e66742f706c616365686f6c6465722e6a736f6e

Deployed Bytecode

0x6080604052600436106103ed5760003560e01c806363da982411610208578063aca8ffe711610118578063d9925ba4116100ab578063e5e99daa1161007a578063e5e99daa14610e1f578063e8a3d48514610e4a578063e985e9c514610e75578063f2fde38b14610eb2578063f92c45b714610edb576103ed565b8063d9925ba414610d77578063dc53fd9214610da0578063dde44b8914610dcb578063e36d649814610df4576103ed565b8063bd32fb66116100e7578063bd32fb6614610cbd578063c7c3268b14610ce6578063c87b56dd14610d0f578063cb774d4714610d4c576103ed565b8063aca8ffe714610c15578063b6c693e514610c3e578063b88d4fde14610c69578063bc1ac5c114610c92576103ed565b80638da5cb5b1161019b578063a1fb81731161016a578063a1fb817314610b56578063a22cb46514610b81578063a475b5dd14610baa578063a611708e14610bc1578063aa98e0c614610bea576103ed565b80638da5cb5b14610aae578063938e3d7b14610ad957806395d89b4114610b025780639975562414610b2d576103ed565b8063715018a6116101d7578063715018a614610a2e578063765555bf14610a455780637d17fcbe14610a6e5780638ba4cc3c14610a85576103ed565b806363da98241461097457806365bfaa681461099d57806368963df0146109c657806370a08231146109f1576103ed565b80632c4671a41161030357806345c0f533116102965780635b2a55e4116102655780635b2a55e41461088f5780635b34553b146108ba5780635d82cf6e146108e557806360e1666a1461090e5780636352211e14610937576103ed565b806345c0f533146107f45780634a3ed1421461081f5780634db2f55e1461084857806358891a3714610873576103ed565b8063376d441c116102d2578063376d441c1461075e5780633ccfd60b1461078957806340c84b0e146107a057806342842e0e146107cb576103ed565b80632c4671a4146106c35780632db11544146106ee57806335c6aaf81461070a5780633615ab4514610735576103ed565b806318160ddd1161038657806323b872dd1161035557806323b872dd1461060e57806328818b96146106375780632904e6d91461065357806329e6a3351461066f5780632bbde22e14610698576103ed565b806318160ddd146105685780631970d1fb14610593578063200147f3146105bc5780632056acb3146105e5576103ed565b806306fdde03116103c257806306fdde03146104ae578063081812fc146104d9578063095ea7b314610516578063170e17361461053f576103ed565b806204348e146103f25780620cbb211461041d57806301ffc9a71461044657806303a3731314610483575b600080fd5b3480156103fe57600080fd5b50610407610f06565b604051610414919061402b565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f91906140bf565b610f0c565b005b34801561045257600080fd5b5061046d60048036038101906104689190614164565b610f2a565b60405161047a91906141ac565b60405180910390f35b34801561048f57600080fd5b5061049861100c565b6040516104a59190614260565b60405180910390f35b3480156104ba57600080fd5b506104c361109a565b6040516104d09190614260565b60405180910390f35b3480156104e557600080fd5b5061050060048036038101906104fb91906142ae565b61112c565b60405161050d919061431c565b60405180910390f35b34801561052257600080fd5b5061053d60048036038101906105389190614363565b611172565b005b34801561054b57600080fd5b50610566600480360381019061056191906142ae565b611289565b005b34801561057457600080fd5b5061057d61129b565b60405161058a919061402b565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b591906142ae565b6112ac565b005b3480156105c857600080fd5b506105e360048036038101906105de91906143c8565b6112be565b005b3480156105f157600080fd5b5061060c600480360381019061060791906143c8565b6112f3565b005b34801561061a57600080fd5b50610635600480360381019061063091906143f5565b611328565b005b610651600480360381019061064c919061449e565b611388565b005b61066d6004803603810190610668919061449e565b6116d4565b005b34801561067b57600080fd5b50610696600480360381019061069191906143c8565b611a2d565b005b3480156106a457600080fd5b506106ad611a62565b6040516106ba9190614517565b60405180910390f35b3480156106cf57600080fd5b506106d8611a68565b6040516106e5919061402b565b60405180910390f35b610708600480360381019061070391906142ae565b611a6e565b005b34801561071657600080fd5b5061071f611a7b565b60405161072c919061402b565b60405180910390f35b34801561074157600080fd5b5061075c6004803603810190610757919061449e565b611a81565b005b34801561076a57600080fd5b50610773611d8a565b60405161078091906145a9565b60405180910390f35b34801561079557600080fd5b5061079e611d9d565b005b3480156107ac57600080fd5b506107b5611e3e565b6040516107c29190614260565b60405180910390f35b3480156107d757600080fd5b506107f260048036038101906107ed91906143f5565b611ecc565b005b34801561080057600080fd5b50610809611eec565b604051610816919061402b565b60405180910390f35b34801561082b57600080fd5b50610846600480360381019061084191906142ae565b611ef2565b005b34801561085457600080fd5b5061085d611f04565b60405161086a919061402b565b60405180910390f35b61088d60048036038101906108889190614363565b611f0a565b005b34801561089b57600080fd5b506108a4611fa8565b6040516108b1919061431c565b60405180910390f35b3480156108c657600080fd5b506108cf611fce565b6040516108dc919061402b565b60405180910390f35b3480156108f157600080fd5b5061090c600480360381019061090791906142ae565b611fd4565b005b34801561091a57600080fd5b50610935600480360381019061093091906142ae565b611fe6565b005b34801561094357600080fd5b5061095e600480360381019061095991906142ae565b611ff8565b60405161096b919061431c565b60405180910390f35b34801561098057600080fd5b5061099b600480360381019061099691906142ae565b61207e565b005b3480156109a957600080fd5b506109c460048036038101906109bf91906145f0565b612090565b005b3480156109d257600080fd5b506109db6120a2565b6040516109e89190614517565b60405180910390f35b3480156109fd57600080fd5b50610a186004803603810190610a13919061461d565b6120a8565b604051610a25919061402b565b60405180910390f35b348015610a3a57600080fd5b50610a4361215f565b005b348015610a5157600080fd5b50610a6c6004803603810190610a6791906143c8565b612173565b005b348015610a7a57600080fd5b50610a836121a8565b005b348015610a9157600080fd5b50610aac6004803603810190610aa79190614363565b6121fe565b005b348015610aba57600080fd5b50610ac361226d565b604051610ad0919061431c565b60405180910390f35b348015610ae557600080fd5b50610b006004803603810190610afb919061477a565b612297565b005b348015610b0e57600080fd5b50610b176122e0565b604051610b249190614260565b60405180910390f35b348015610b3957600080fd5b50610b546004803603810190610b4f919061461d565b612372565b005b348015610b6257600080fd5b50610b6b6123be565b604051610b7891906145a9565b60405180910390f35b348015610b8d57600080fd5b50610ba86004803603810190610ba391906147ef565b6123d1565b005b348015610bb657600080fd5b50610bbf6123e7565b005b348015610bcd57600080fd5b50610be86004803603810190610be391906142ae565b6124f0565b005b348015610bf657600080fd5b50610bff612502565b604051610c0c9190614517565b60405180910390f35b348015610c2157600080fd5b50610c3c6004803603810190610c3791906142ae565b612508565b005b348015610c4a57600080fd5b50610c5361255f565b604051610c6091906145a9565b60405180910390f35b348015610c7557600080fd5b50610c906004803603810190610c8b91906148d0565b612572565b005b348015610c9e57600080fd5b50610ca76125d4565b604051610cb491906145a9565b60405180910390f35b348015610cc957600080fd5b50610ce46004803603810190610cdf91906145f0565b6125e7565b005b348015610cf257600080fd5b50610d0d6004803603810190610d0891906140bf565b6125f9565b005b348015610d1b57600080fd5b50610d366004803603810190610d3191906142ae565b61265c565b604051610d439190614260565b60405180910390f35b348015610d5857600080fd5b50610d616127a3565b604051610d6e919061402b565b60405180910390f35b348015610d8357600080fd5b50610d9e6004803603810190610d9991906142ae565b6127a9565b005b348015610dac57600080fd5b50610db56127bb565b604051610dc2919061402b565b60405180910390f35b348015610dd757600080fd5b50610df26004803603810190610ded91906145f0565b6127c1565b005b348015610e0057600080fd5b50610e096127d3565b604051610e16919061402b565b60405180910390f35b348015610e2b57600080fd5b50610e346127d9565b604051610e41919061402b565b60405180910390f35b348015610e5657600080fd5b50610e5f6127df565b604051610e6c9190614260565b60405180910390f35b348015610e8157600080fd5b50610e9c6004803603810190610e979190614953565b61286d565b604051610ea991906141ac565b60405180910390f35b348015610ebe57600080fd5b50610ed96004803603810190610ed4919061461d565b612901565b005b348015610ee757600080fd5b50610ef0612984565b604051610efd919061402b565b60405180910390f35b60125481565b610f1461298a565b818160159190610f25929190613ee9565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ff557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611005575061100482612a08565b5b9050919050565b60158054611019906149c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611045906149c2565b80156110925780601f1061106757610100808354040283529160200191611092565b820191906000526020600020905b81548152906001019060200180831161107557829003601f168201915b505050505081565b6060600080546110a9906149c2565b80601f01602080910402602001604051908101604052809291908181526020018280546110d5906149c2565b80156111225780601f106110f757610100808354040283529160200191611122565b820191906000526020600020905b81548152906001019060200180831161110557829003601f168201915b5050505050905090565b600061113782612a72565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061117d82611ff8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e490614a65565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661120c612abd565b73ffffffffffffffffffffffffffffffffffffffff16148061123b575061123a81611235612abd565b61286d565b5b61127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127190614af7565b60405180910390fd5b6112848383612ac5565b505050565b61129161298a565b80600c8190555050565b60006112a76007612b7e565b905090565b6112b461298a565b8060128190555050565b6112c661298a565b80601a60006101000a81548160ff021916908360018111156112eb576112ea614532565b5b021790555050565b6112fb61298a565b80601a60016101000a81548160ff021916908360018111156113205761131f614532565b5b021790555050565b611339611333612abd565b82612b8c565b611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136f90614b89565b60405180910390fd5b611383838383612c21565b505050565b6000600854146113cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c490614c1b565b60405180910390fd5b6001808111156113e0576113df614532565b5b601a60009054906101000a900460ff16600181111561140257611401614532565b5b14611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990614c87565b60405180910390fd5b600b54816114506007612b7e565b61145a9190614cd6565b111561149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290614d9e565b60405180910390fd5b601254816114a99190614dbe565b3410156114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e290614e8a565b60405180910390fd5b600d5481601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115399190614cd6565b111561157a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157190614f1c565b60405180910390fd5b60003360405160200161158d9190614f84565b6040516020818303038152906040528051906020012090506115f3848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060185483612f1a565b611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162990614feb565b60405180910390fd5b81601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116819190614cd6565b925050819055506116923383612f31565b7fdcb23284f3935b5557998e99dcc286e29744c5000723d99eecd5d6f5694f6e11338360026040516116c693929190615053565b60405180910390a150505050565b600060085414611719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171090614c1b565b60405180910390fd5b60018081111561172c5761172b614532565b5b601a60019054906101000a900460ff16600181111561174e5761174d614532565b5b1461178e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611785906150d6565b60405180910390fd5b600c54600b5461179e91906150f6565b816117a96007612b7e565b6117b39190614cd6565b11156117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb90614d9e565b60405180910390fd5b601154816118029190614dbe565b341015611844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183b90614e8a565b60405180910390fd5b600e5481601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118929190614cd6565b11156118d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ca90614f1c565b60405180910390fd5b6000336040516020016118e69190614f84565b60405160208183030381529060405280519060200120905061194c848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060175483612f1a565b61198b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198290614feb565b60405180910390fd5b81601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119da9190614cd6565b925050819055506119eb3383612f31565b7fdcb23284f3935b5557998e99dcc286e29744c5000723d99eecd5d6f5694f6e1133836000604051611a1f93929190615053565b60405180910390a150505050565b611a3561298a565b80601a60026101000a81548160ff02191690836001811115611a5a57611a59614532565b5b021790555050565b60185481565b600e5481565b611a788133612fa0565b50565b60115481565b600060085414611ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abd90614c1b565b60405180910390fd5b600180811115611ad957611ad8614532565b5b601a60039054906101000a900460ff166001811115611afb57611afa614532565b5b14611b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3290615176565b60405180910390fd5b600c54600b54611b4b91906150f6565b81611b566007612b7e565b611b609190614cd6565b1115611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9890614d9e565b60405180910390fd5b60105481601e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bef9190614cd6565b1115611c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2790614f1c565b60405180910390fd5b600033604051602001611c439190614f84565b604051602081830303815290604052805190602001209050611ca9848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060195483612f1a565b611ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdf90615208565b60405180910390fd5b81601e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d379190614cd6565b92505081905550611d483383612f31565b7fdcb23284f3935b5557998e99dcc286e29744c5000723d99eecd5d6f5694f6e1133836003604051611d7c93929190615053565b60405180910390a150505050565b601a60009054906101000a900460ff1681565b611da561298a565b600047905060008111611ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de490615274565b60405180910390fd5b611df561226d565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611e3a573d6000803e3d6000fd5b5050565b60168054611e4b906149c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e77906149c2565b8015611ec45780601f10611e9957610100808354040283529160200191611ec4565b820191906000526020600020905b815481529060010190602001808311611ea757829003601f168201915b505050505081565b611ee783838360405180602001604052806000815250612572565b505050565b600b5481565b611efa61298a565b80600f8190555050565b600d5481565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9190615306565b60405180910390fd5b611fa48183612fa0565b5050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b611fdc61298a565b8060138190555050565b611fee61298a565b80600d8190555050565b6000806120048361323f565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206c90615372565b60405180910390fd5b80915050919050565b61208661298a565b80600e8190555050565b61209861298a565b8060188190555050565b60195481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210f90615404565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61216761298a565b612171600061327c565b565b61217b61298a565b80601a60036101000a81548160ff021916908360018111156121a05761219f614532565b5b021790555050565b6121b061298a565b6000600854146121f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ec90614c1b565b60405180910390fd5b43600981905550565b61220661298a565b600b54816122146007612b7e565b61221e9190614cd6565b111561225f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225690615470565b60405180910390fd5b6122698282612f31565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61229f61298a565b6122a881613342565b6040516020016122b89190615518565b604051602081830303815290604052600a90805190602001906122dc929190613f6f565b5050565b6060600180546122ef906149c2565b80601f016020809104026020016040519081016040528092919081815260200182805461231b906149c2565b80156123685780601f1061233d57610100808354040283529160200191612368565b820191906000526020600020905b81548152906001019060200180831161234b57829003601f168201915b5050505050905090565b61237a61298a565b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601a60039054906101000a900460ff1681565b6123e36123dc612abd565b83836134a5565b5050565b6123ef61298a565b600060085414612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242b90614c1b565b60405180910390fd5b600060095403612479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247090615586565b60405180910390fd5b600b546009544060001c61248d91906155d5565b60088190555060ff600954436124a391906150f6565b11156124ce57600b546001436124b991906150f6565b4060001c6124c791906155d5565b6008819055505b6000600854036124ee5760016008546124e79190614cd6565b6008819055505b565b6124f861298a565b8060118190555050565b60175481565b61251061298a565b600060085414612555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254c90614c1b565b60405180910390fd5b80600b8190555050565b601a60029054906101000a900460ff1681565b61258361257d612abd565b83612b8c565b6125c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b990614b89565b60405180910390fd5b6125ce84848484613611565b50505050565b601a60019054906101000a900460ff1681565b6125ef61298a565b8060178190555050565b61260161298a565b600060085414612646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263d90614c1b565b60405180910390fd5b818160169190612657929190613ee9565b505050565b60606126678261366d565b6126a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269d90615678565b60405180910390fd5b60606000600854111561270f576126e2600b54600854856126c79190614cd6565b6126d191906155d5565b60016126dd9190614cd6565b6136ae565b90506016816040516020016126f8929190615778565b60405160208183030381529060405291505061279e565b6015805461271c906149c2565b80601f0160208091040260200160405190810160405280929190818152602001828054612748906149c2565b80156127955780601f1061276a57610100808354040283529160200191612795565b820191906000526020600020905b81548152906001019060200180831161277857829003601f168201915b50505050509150505b919050565b60085481565b6127b161298a565b8060108190555050565b60135481565b6127c961298a565b8060198190555050565b60095481565b60105481565b600a80546127ec906149c2565b80601f0160208091040260200160405190810160405280929190818152602001828054612818906149c2565b80156128655780601f1061283a57610100808354040283529160200191612865565b820191906000526020600020905b81548152906001019060200180831161284857829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61290961298a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296f90615819565b60405180910390fd5b6129818161327c565b50565b600c5481565b612992612abd565b73ffffffffffffffffffffffffffffffffffffffff166129b061226d565b73ffffffffffffffffffffffffffffffffffffffff1614612a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fd90615885565b60405180910390fd5b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a7b8161366d565b612aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab190615372565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b3883611ff8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600080612b9883611ff8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612bda5750612bd9818561286d565b5b80612c1857508373ffffffffffffffffffffffffffffffffffffffff16612c008461112c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612c4182611ff8565b73ffffffffffffffffffffffffffffffffffffffff1614612c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8e90615917565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfd906159a9565b60405180910390fd5b612d13838383600161377c565b8273ffffffffffffffffffffffffffffffffffffffff16612d3382611ff8565b73ffffffffffffffffffffffffffffffffffffffff1614612d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8090615917565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f1583838360016138a2565b505050565b600082612f2785846138a8565b1490509392505050565b60005b81811015612f7257612f4660076138fe565b6000612f526007612b7e565b9050612f5e8482613914565b508080612f6a906159c9565b915050612f34565b506000600954148015612f8f5750600b54612f8d6007612b7e565b145b15612f9c57436009819055505b5050565b600060085414612fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fdc90614c1b565b60405180910390fd5b600180811115612ff857612ff7614532565b5b601a60029054906101000a900460ff16600181111561301a57613019614532565b5b1461305a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305190615a5d565b60405180910390fd5b600c54600b5461306a91906150f6565b826130756007612b7e565b61307f9190614cd6565b11156130c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b790614d9e565b60405180910390fd5b601354826130ce9190614dbe565b341015613110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310790614e8a565b60405180910390fd5b600f5482601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461315e9190614cd6565b111561319f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319690614f1c565b60405180910390fd5b81601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131ee9190614cd6565b925050819055506131ff8183612f31565b7fdcb23284f3935b5557998e99dcc286e29744c5000723d99eecd5d6f5694f6e118183600160405161323393929190615053565b60405180910390a15050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000825103613364576040518060200160405280600081525090506134a0565b6000604051806060016040528060408152602001615d9760409139905060006003600285516133939190614cd6565b61339d9190615a7d565b60046133a99190614dbe565b67ffffffffffffffff8111156133c2576133c161464f565b5b6040519080825280601f01601f1916602001820160405280156133f45781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015613460576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050613405565b505060038651066001811461347c576002811461348f57613497565b603d6001830353603d6002830353613497565b603d60018303535b50505080925050505b919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350a90615afa565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161360491906141ac565b60405180910390a3505050565b61361c848484612c21565b61362884848484613932565b613667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365e90615b8c565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661368f8361323f565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600060016136bd84613ab9565b01905060008167ffffffffffffffff8111156136dc576136db61464f565b5b6040519080825280601f01601f19166020018201604052801561370e5781602001600182028036833780820191505090505b509050600082602001820190505b600115613771578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581613765576137646155a6565b5b0494506000850361371c575b819350505050919050565b600181111561389c57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146138105780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461380891906150f6565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461389b5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138939190614cd6565b925050819055505b5b50505050565b50505050565b60008082905060005b84518110156138f3576138de828683815181106138d1576138d0615bac565b5b6020026020010151613c0c565b915080806138eb906159c9565b9150506138b1565b508091505092915050565b6001816000016000828254019250508190555050565b61392e828260405180602001604052806000815250613c37565b5050565b60006139538473ffffffffffffffffffffffffffffffffffffffff16613c92565b15613aac578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261397c612abd565b8786866040518563ffffffff1660e01b815260040161399e9493929190615c30565b6020604051808303816000875af19250505080156139da57506040513d601f19601f820116820180604052508101906139d79190615c91565b60015b613a5c573d8060008114613a0a576040519150601f19603f3d011682016040523d82523d6000602084013e613a0f565b606091505b506000815103613a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a4b90615b8c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613ab1565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613b17577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613b0d57613b0c6155a6565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613b54576d04ee2d6d415b85acef81000000008381613b4a57613b496155a6565b5b0492506020810190505b662386f26fc100008310613b8357662386f26fc100008381613b7957613b786155a6565b5b0492506010810190505b6305f5e1008310613bac576305f5e1008381613ba257613ba16155a6565b5b0492506008810190505b6127108310613bd1576127108381613bc757613bc66155a6565b5b0492506004810190505b60648310613bf45760648381613bea57613be96155a6565b5b0492506002810190505b600a8310613c03576001810190505b80915050919050565b6000818310613c2457613c1f8284613cb5565b613c2f565b613c2e8383613cb5565b5b905092915050565b613c418383613ccc565b613c4e6000848484613932565b613c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c8490615b8c565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d3290615d0a565b60405180910390fd5b613d448161366d565b15613d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d7b90615d76565b60405180910390fd5b613d9260008383600161377c565b613d9b8161366d565b15613ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd290615d76565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613ee56000838360016138a2565b5050565b828054613ef5906149c2565b90600052602060002090601f016020900481019282613f175760008555613f5e565b82601f10613f3057803560ff1916838001178555613f5e565b82800160010185558215613f5e579182015b82811115613f5d578235825591602001919060010190613f42565b5b509050613f6b9190613ff5565b5090565b828054613f7b906149c2565b90600052602060002090601f016020900481019282613f9d5760008555613fe4565b82601f10613fb657805160ff1916838001178555613fe4565b82800160010185558215613fe4579182015b82811115613fe3578251825591602001919060010190613fc8565b5b509050613ff19190613ff5565b5090565b5b8082111561400e576000816000905550600101613ff6565b5090565b6000819050919050565b61402581614012565b82525050565b6000602082019050614040600083018461401c565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261407f5761407e61405a565b5b8235905067ffffffffffffffff81111561409c5761409b61405f565b5b6020830191508360018202830111156140b8576140b7614064565b5b9250929050565b600080602083850312156140d6576140d5614050565b5b600083013567ffffffffffffffff8111156140f4576140f3614055565b5b61410085828601614069565b92509250509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141418161410c565b811461414c57600080fd5b50565b60008135905061415e81614138565b92915050565b60006020828403121561417a57614179614050565b5b60006141888482850161414f565b91505092915050565b60008115159050919050565b6141a681614191565b82525050565b60006020820190506141c1600083018461419d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156142015780820151818401526020810190506141e6565b83811115614210576000848401525b50505050565b6000601f19601f8301169050919050565b6000614232826141c7565b61423c81856141d2565b935061424c8185602086016141e3565b61425581614216565b840191505092915050565b6000602082019050818103600083015261427a8184614227565b905092915050565b61428b81614012565b811461429657600080fd5b50565b6000813590506142a881614282565b92915050565b6000602082840312156142c4576142c3614050565b5b60006142d284828501614299565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614306826142db565b9050919050565b614316816142fb565b82525050565b6000602082019050614331600083018461430d565b92915050565b614340816142fb565b811461434b57600080fd5b50565b60008135905061435d81614337565b92915050565b6000806040838503121561437a57614379614050565b5b60006143888582860161434e565b925050602061439985828601614299565b9150509250929050565b600281106143b057600080fd5b50565b6000813590506143c2816143a3565b92915050565b6000602082840312156143de576143dd614050565b5b60006143ec848285016143b3565b91505092915050565b60008060006060848603121561440e5761440d614050565b5b600061441c8682870161434e565b935050602061442d8682870161434e565b925050604061443e86828701614299565b9150509250925092565b60008083601f84011261445e5761445d61405a565b5b8235905067ffffffffffffffff81111561447b5761447a61405f565b5b60208301915083602082028301111561449757614496614064565b5b9250929050565b6000806000604084860312156144b7576144b6614050565b5b600084013567ffffffffffffffff8111156144d5576144d4614055565b5b6144e186828701614448565b935093505060206144f486828701614299565b9150509250925092565b6000819050919050565b614511816144fe565b82525050565b600060208201905061452c6000830184614508565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6002811061457257614571614532565b5b50565b600081905061458382614561565b919050565b600061459382614575565b9050919050565b6145a381614588565b82525050565b60006020820190506145be600083018461459a565b92915050565b6145cd816144fe565b81146145d857600080fd5b50565b6000813590506145ea816145c4565b92915050565b60006020828403121561460657614605614050565b5b6000614614848285016145db565b91505092915050565b60006020828403121561463357614632614050565b5b60006146418482850161434e565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61468782614216565b810181811067ffffffffffffffff821117156146a6576146a561464f565b5b80604052505050565b60006146b9614046565b90506146c5828261467e565b919050565b600067ffffffffffffffff8211156146e5576146e461464f565b5b6146ee82614216565b9050602081019050919050565b82818337600083830152505050565b600061471d614718846146ca565b6146af565b9050828152602081018484840111156147395761473861464a565b5b6147448482856146fb565b509392505050565b600082601f8301126147615761476061405a565b5b813561477184826020860161470a565b91505092915050565b6000602082840312156147905761478f614050565b5b600082013567ffffffffffffffff8111156147ae576147ad614055565b5b6147ba8482850161474c565b91505092915050565b6147cc81614191565b81146147d757600080fd5b50565b6000813590506147e9816147c3565b92915050565b6000806040838503121561480657614805614050565b5b60006148148582860161434e565b9250506020614825858286016147da565b9150509250929050565b600067ffffffffffffffff82111561484a5761484961464f565b5b61485382614216565b9050602081019050919050565b600061487361486e8461482f565b6146af565b90508281526020810184848401111561488f5761488e61464a565b5b61489a8482856146fb565b509392505050565b600082601f8301126148b7576148b661405a565b5b81356148c7848260208601614860565b91505092915050565b600080600080608085870312156148ea576148e9614050565b5b60006148f88782880161434e565b94505060206149098782880161434e565b935050604061491a87828801614299565b925050606085013567ffffffffffffffff81111561493b5761493a614055565b5b614947878288016148a2565b91505092959194509250565b6000806040838503121561496a57614969614050565b5b60006149788582860161434e565b92505060206149898582860161434e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806149da57607f821691505b6020821081036149ed576149ec614993565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a4f6021836141d2565b9150614a5a826149f3565b604082019050919050565b60006020820190508181036000830152614a7e81614a42565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614ae1603d836141d2565b9150614aec82614a85565b604082019050919050565b60006020820190508181036000830152614b1081614ad4565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614b73602d836141d2565b9150614b7e82614b17565b604082019050919050565b60006020820190508181036000830152614ba281614b66565b9050919050565b7f436f6c6c656374696f6e20686173206265656e20616c7265616479207265766560008201527f616c656400000000000000000000000000000000000000000000000000000000602082015250565b6000614c056024836141d2565b9150614c1082614ba9565b604082019050919050565b60006020820190508181036000830152614c3481614bf8565b9050919050565b7f507269766174652073616c65732061726520636c6f7365640000000000000000600082015250565b6000614c716018836141d2565b9150614c7c82614c3b565b602082019050919050565b60006020820190508181036000830152614ca081614c64565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614ce182614012565b9150614cec83614012565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d2157614d20614ca7565b5b828201905092915050565b7f4e756d626572206f662072657175657374656420746f6b656e732077696c6c2060008201527f65786365656420636f6c6c656374696f6e2073697a6500000000000000000000602082015250565b6000614d886036836141d2565b9150614d9382614d2c565b604082019050919050565b60006020820190508181036000830152614db781614d7b565b9050919050565b6000614dc982614012565b9150614dd483614012565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e0d57614e0c614ca7565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420737566666963696560008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b6000614e746022836141d2565b9150614e7f82614e18565b604082019050919050565b60006020820190508181036000830152614ea381614e67565b9050919050565b7f4e756d626572206f662072657175657374656420746f6b656e7320657863656560008201527f647320616c6c6f77616e63650000000000000000000000000000000000000000602082015250565b6000614f06602c836141d2565b9150614f1182614eaa565b604082019050919050565b60006020820190508181036000830152614f3581614ef9565b9050919050565b60008160601b9050919050565b6000614f5482614f3c565b9050919050565b6000614f6682614f49565b9050919050565b614f7e614f79826142fb565b614f5b565b82525050565b6000614f908284614f6d565b60148201915081905092915050565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b6000614fd56017836141d2565b9150614fe082614f9f565b602082019050919050565b6000602082019050818103600083015261500481614fc8565b9050919050565b6004811061501c5761501b614532565b5b50565b600081905061502d8261500b565b919050565b600061503d8261501f565b9050919050565b61504d81615032565b82525050565b6000606082019050615068600083018661430d565b615075602083018561401c565b6150826040830184615044565b949350505050565b7f57686974656c6973742073616c65732061726520636c6f736564000000000000600082015250565b60006150c0601a836141d2565b91506150cb8261508a565b602082019050919050565b600060208201905081810360008301526150ef816150b3565b9050919050565b600061510182614012565b915061510c83614012565b92508282101561511f5761511e614ca7565b5b828203905092915050565b7f46726565206d696e742073616c65732061726520636c6f736564000000000000600082015250565b6000615160601a836141d2565b915061516b8261512a565b602082019050919050565b6000602082019050818103600083015261518f81615153565b9050919050565b7f596f7520617265206e6f7420616c6c6f77656420746f206d696e7420666f722060008201527f6672656500000000000000000000000000000000000000000000000000000000602082015250565b60006151f26024836141d2565b91506151fd82615196565b604082019050919050565b60006020820190508181036000830152615221816151e5565b9050919050565b7f4e6f2062616c616e636500000000000000000000000000000000000000000000600082015250565b600061525e600a836141d2565b915061526982615228565b602082019050919050565b6000602082019050818103600083015261528d81615251565b9050919050565b7f546869732066756e6374696f6e20697320666f722043726f73736d696e74206f60008201527f6e6c792e00000000000000000000000000000000000000000000000000000000602082015250565b60006152f06024836141d2565b91506152fb82615294565b604082019050919050565b6000602082019050818103600083015261531f816152e3565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061535c6018836141d2565b915061536782615326565b602082019050919050565b6000602082019050818103600083015261538b8161534f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006153ee6029836141d2565b91506153f982615392565b604082019050919050565b6000602082019050818103600083015261541d816153e1565b9050919050565b7f52657175657374206578636565647320636f6c6c656374696f6e2073697a6500600082015250565b600061545a601f836141d2565b915061546582615424565b602082019050919050565b600060208201905081810360008301526154898161544d565b9050919050565b600081905092915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b60006154d1601d83615490565b91506154dc8261549b565b601d82019050919050565b60006154f2826141c7565b6154fc8185615490565b935061550c8185602086016141e3565b80840191505092915050565b6000615523826154c4565b915061552f82846154e7565b915081905092915050565b7f5374617274696e6720696e64657820626c6f636b206d75737420626520736574600082015250565b60006155706020836141d2565b915061557b8261553a565b602082019050919050565b6000602082019050818103600083015261559f81615563565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006155e082614012565b91506155eb83614012565b9250826155fb576155fa6155a6565b5b828206905092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615662602f836141d2565b915061566d82615606565b604082019050919050565b6000602082019050818103600083015261569181615655565b9050919050565b60008190508160005260206000209050919050565b600081546156ba816149c2565b6156c48186615490565b945060018216600081146156df57600181146156f057615723565b60ff19831686528186019350615723565b6156f985615698565b60005b8381101561571b578154818901526001820191506020810190506156fc565b838801955050505b50505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000615762600583615490565b915061576d8261572c565b600582019050919050565b600061578482856156ad565b915061579082846154e7565b915061579b82615755565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006158036026836141d2565b915061580e826157a7565b604082019050919050565b60006020820190508181036000830152615832816157f6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061586f6020836141d2565b915061587a82615839565b602082019050919050565b6000602082019050818103600083015261589e81615862565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006159016025836141d2565b915061590c826158a5565b604082019050919050565b60006020820190508181036000830152615930816158f4565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006159936024836141d2565b915061599e82615937565b604082019050919050565b600060208201905081810360008301526159c281615986565b9050919050565b60006159d482614012565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a0657615a05614ca7565b5b600182019050919050565b7f5075626c69632053616c657320617265206f6666000000000000000000000000600082015250565b6000615a476014836141d2565b9150615a5282615a11565b602082019050919050565b60006020820190508181036000830152615a7681615a3a565b9050919050565b6000615a8882614012565b9150615a9383614012565b925082615aa357615aa26155a6565b5b828204905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615ae46019836141d2565b9150615aef82615aae565b602082019050919050565b60006020820190508181036000830152615b1381615ad7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615b766032836141d2565b9150615b8182615b1a565b604082019050919050565b60006020820190508181036000830152615ba581615b69565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000615c0282615bdb565b615c0c8185615be6565b9350615c1c8185602086016141e3565b615c2581614216565b840191505092915050565b6000608082019050615c45600083018761430d565b615c52602083018661430d565b615c5f604083018561401c565b8181036060830152615c718184615bf7565b905095945050505050565b600081519050615c8b81614138565b92915050565b600060208284031215615ca757615ca6614050565b5b6000615cb584828501615c7c565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615cf46020836141d2565b9150615cff82615cbe565b602082019050919050565b60006020820190508181036000830152615d2381615ce7565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615d60601c836141d2565b9150615d6b82615d2a565b602082019050919050565b60006020820190508181036000830152615d8f81615d53565b905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212202d19c8b5baefba4a8b60eecb85fc79932474e4d31951e2dd3bde98b3f43dd37064736f6c634300080e0033

Deployed Bytecode Sourcemap

69751:12081:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70472:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72643:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49055:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70658:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49983:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51495:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51013:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74554:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72753:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74870:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72901:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73071:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52195:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79448:970;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78435:1005;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73242:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70816:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70266:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77384:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70420:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80426:883;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70897:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76289:184;;;;;;;;;;;;;:::i;:::-;;70745:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52601:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70131:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73804:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70216:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77490:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70573:76;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70318:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75023:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74188:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49693:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73995:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72103:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70855:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49424:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66778:103;;;;;;;;;;;;;:::i;:::-;;73410:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76049:189;;;;;;;;;;;;;:::i;:::-;;76549:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66130:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71555:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50152:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71084:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51738:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75338:703;;;;;;;;;;;;;:::i;:::-;;74708:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70775:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73573:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71023:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52857:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70959:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71928:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72429:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76899:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70020:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74379:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70522:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72276:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70055:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70367:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70097:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51964:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67036:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70171:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70472:43;;;;:::o;72643:102::-;66016:13;:11;:13::i;:::-;72734:3:::1;;72719:12;:18;;;;;;;:::i;:::-;;72643:102:::0;;:::o;49055:305::-;49157:4;49209:25;49194:40;;;:11;:40;;;;:105;;;;49266:33;49251:48;;;:11;:48;;;;49194:105;:158;;;;49316:36;49340:11;49316:23;:36::i;:::-;49194:158;49174:178;;49055:305;;;:::o;70658:80::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49983:100::-;50037:13;50070:5;50063:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49983:100;:::o;51495:171::-;51571:7;51591:23;51606:7;51591:14;:23::i;:::-;51634:15;:24;51650:7;51634:24;;;;;;;;;;;;;;;;;;;;;51627:31;;51495:171;;;:::o;51013:416::-;51094:13;51110:23;51125:7;51110:14;:23::i;:::-;51094:39;;51158:5;51152:11;;:2;:11;;;51144:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;51252:5;51236:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;51261:37;51278:5;51285:12;:10;:12::i;:::-;51261:16;:37::i;:::-;51236:62;51214:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;51400:21;51409:2;51413:7;51400:8;:21::i;:::-;51083:346;51013:416;;:::o;74554:101::-;66016:13;:11;:13::i;:::-;74641:6:::1;74624:14;:23;;;;74554:101:::0;:::o;72753:97::-;72799:4;72823:19;:9;:17;:19::i;:::-;72816:26;;72753:97;:::o;74870:103::-;66016:13;:11;:13::i;:::-;74960:5:::1;74941:16;:24;;;;74870:103:::0;:::o;72901:113::-;66016:13;:11;:13::i;:::-;73000:6:::1;72980:17;;:26;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;72901:113:::0;:::o;73071:117::-;66016:13;:11;:13::i;:::-;73174:6:::1;73152:19;;:28;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;73071:117:::0;:::o;52195:335::-;52390:41;52409:12;:10;:12::i;:::-;52423:7;52390:18;:41::i;:::-;52382:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;52494:28;52504:4;52510:2;52514:7;52494:9;:28::i;:::-;52195:335;;;:::o;79448:970::-;79566:1;79549:13;;:18;79541:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;79648:15;79627:36;;;;;;;;:::i;:::-;;:17;;;;;;;;;;;:36;;;;;;;;:::i;:::-;;;79619:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;79742:14;;79733:5;79711:19;:9;:17;:19::i;:::-;:27;;;;:::i;:::-;:45;;79703:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;79865:16;;79857:5;:24;;;;:::i;:::-;79844:9;:37;;79836:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;79982:27;;79973:5;79939:19;:31;79959:10;79939:31;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:70;;79931:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;80079:12;80121:10;80104:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;80094:39;;;;;;80079:54;;80152:56;80171:11;;80152:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80184:17;;80203:4;80152:18;:56::i;:::-;80144:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;80292:5;80257:19;:31;80277:10;80257:31;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;80310:30;80322:10;80334:5;80310:11;:30::i;:::-;80366:44;80373:10;80385:5;80392:17;80366:44;;;;;;;;:::i;:::-;;;;;;;;79530:888;79448:970;;;:::o;78435:1005::-;78555:1;78538:13;;:18;78530:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;78639:15;78616:38;;;;;;;;:::i;:::-;;:19;;;;;;;;;;;:38;;;;;;;;:::i;:::-;;;78608:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;78752:14;;78735;;:31;;;;:::i;:::-;78726:5;78704:19;:9;:17;:19::i;:::-;:27;;;;:::i;:::-;:62;;78696:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;78875:18;;78867:5;:26;;;;:::i;:::-;78854:9;:39;;78846:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;78996:29;;78987:5;78951:21;:33;78973:10;78951:33;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;:74;;78943:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;79095:12;79137:10;79120:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;79110:39;;;;;;79095:54;;79168:58;79187:11;;79168:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79200:19;;79221:4;79168:18;:58::i;:::-;79160:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;79312:5;79275:21;:33;79297:10;79275:33;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;79330:30;79342:10;79354:5;79330:11;:30::i;:::-;79386:46;79393:10;79405:5;79412:19;79386:46;;;;;;;;:::i;:::-;;;;;;;;78519:921;78435:1005;;;:::o;73242:111::-;66016:13;:11;:13::i;:::-;73339:6:::1;73320:16;;:25;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;73242:111:::0;:::o;70816:32::-;;;;:::o;70266:45::-;;;;:::o;77384:98::-;77444:30;77456:5;77463:10;77444:11;:30::i;:::-;77384:98;:::o;70420:45::-;;;;:::o;80426:883::-;80531:1;80514:13;;:18;80506:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;80614:15;80592:37;;;;;;;;:::i;:::-;;:18;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;80584:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;80727:14;;80710;;:31;;;;:::i;:::-;80701:5;80679:19;:9;:17;:19::i;:::-;:27;;;;:::i;:::-;:62;;80671:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;80859:28;;80850:5;80819:16;:28;80836:10;80819:28;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:68;;80811:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;80957:12;80999:10;80982:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;80972:39;;;;;;80957:54;;81030:57;81049:11;;81030:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81062:18;;81082:4;81030:18;:57::i;:::-;81022:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;81181:5;81149:16;:28;81166:10;81149:28;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;81199:30;81211:10;81223:5;81199:11;:30::i;:::-;81255:46;81262:10;81274:5;81281:19;81255:46;;;;;;;;:::i;:::-;;;;;;;;80495:814;80426:883;;;:::o;70897:55::-;;;;;;;;;;;;;:::o;76289:184::-;66016:13;:11;:13::i;:::-;76339:12:::1;76354:21;76339:36;;76404:1;76394:7;:11;76386:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;76439:7;:5;:7::i;:::-;76431:25;;:34;76457:7;76431:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;76328:145;76289:184::o:0;70745:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52601:185::-;52739:39;52756:4;52762:2;52766:7;52739:39;;;;;;;;;;;;:16;:39::i;:::-;52601:185;;;:::o;70131:33::-;;;;:::o;73804:123::-;66016:13;:11;:13::i;:::-;73914:5:::1;73885:26;:34;;;;73804:123:::0;:::o;70216:43::-;;;;:::o;77490:193::-;77584:16;;;;;;;;;;;77570:30;;:10;:30;;;77562:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;77652:23;77664:5;77671:3;77652:11;:23::i;:::-;77490:193;;:::o;70573:76::-;;;;;;;;;;;;;:::o;70318:42::-;;;;:::o;75023:101::-;66016:13;:11;:13::i;:::-;75111:5:::1;75093:15;:23;;;;75023:101:::0;:::o;74188:125::-;66016:13;:11;:13::i;:::-;74300:5:::1;74270:27;:35;;;;74188:125:::0;:::o;49693:223::-;49765:7;49785:13;49801:17;49810:7;49801:8;:17::i;:::-;49785:33;;49854:1;49837:19;;:5;:19;;;49829:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;49903:5;49896:12;;;49693:223;;;:::o;73995:129::-;66016:13;:11;:13::i;:::-;74111:5:::1;74079:29;:37;;;;73995:129:::0;:::o;72103:106::-;66016:13;:11;:13::i;:::-;72197:4:::1;72177:17;:24;;;;72103:106:::0;:::o;70855:33::-;;;;:::o;49424:207::-;49496:7;49541:1;49524:19;;:5;:19;;;49516:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49607:9;:16;49617:5;49607:16;;;;;;;;;;;;;;;;49600:23;;49424:207;;;:::o;66778:103::-;66016:13;:11;:13::i;:::-;66843:30:::1;66870:1;66843:18;:30::i;:::-;66778:103::o:0;73410:115::-;66016:13;:11;:13::i;:::-;73511:6:::1;73490:18;;:27;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;73410:115:::0;:::o;76049:189::-;66016:13;:11;:13::i;:::-;76144:1:::1;76127:13;;:18;76119:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;76218:12;76197:18;:33;;;;76049:189::o:0;76549:201::-;66016:13;:11;:13::i;:::-;76659:14:::1;;76650:5;76628:19;:9;:17;:19::i;:::-;:27;;;;:::i;:::-;:45;;76620:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;76720:22;76732:2;76736:5;76720:11;:22::i;:::-;76549:201:::0;;:::o;66130:87::-;66176:7;66203:6;;;;;;;;;;;66196:13;;66130:87;:::o;71555:306::-;66016:13;:11;:13::i;:::-;71735:106:::1;71795:12;71735:13;:106::i;:::-;71658:194;;;;;;;;:::i;:::-;;;;;;;;;;;;;71637:11;:216;;;;;;;;;;;;:::i;:::-;;71555:306:::0;:::o;50152:104::-;50208:13;50241:7;50234:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50152:104;:::o;75174:::-;66016:13;:11;:13::i;:::-;75266:4:::1;75247:16;;:23;;;;;;;;;;;;;;;;;;75174:104:::0;:::o;71084:56::-;;;;;;;;;;;;;:::o;51738:155::-;51833:52;51852:12;:10;:12::i;:::-;51866:8;51876;51833:18;:52::i;:::-;51738:155;;:::o;75338:703::-;66016:13;:11;:13::i;:::-;75411:1:::1;75394:13;;:18;75386:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;75494:1;75472:18;;:23:::0;75464:68:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;75607:14;;75584:18;;75574:29;75569:35;;:52;;;;:::i;:::-;75553:13;:68;;;;75803:3;75782:18;;75767:12;:33;;;;:::i;:::-;:39;75763:138;;;75875:14;;75869:1;75854:12;:16;;;;:::i;:::-;75844:27;75839:33;;:50;;;;:::i;:::-;75823:13;:66;;;;75763:138;75971:1;75954:13;;:18:::0;75950:84:::1;;76021:1;76005:13;;:17;;;;:::i;:::-;75989:13;:33;;;;75950:84;75338:703::o:0;74708:107::-;66016:13;:11;:13::i;:::-;74802:5:::1;74781:18;:26;;;;74708:107:::0;:::o;70775:34::-;;;;:::o;73573:175::-;66016:13;:11;:13::i;:::-;73666:1:::1;73649:13;;:18;73641:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;73736:4;73719:14;:21;;;;73573:175:::0;:::o;71023:54::-;;;;;;;;;;;;;:::o;52857:322::-;53031:41;53050:12;:10;:12::i;:::-;53064:7;53031:18;:41::i;:::-;53023:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;53133:38;53147:4;53153:2;53157:7;53166:4;53133:13;:38::i;:::-;52857:322;;;;:::o;70959:57::-;;;;;;;;;;;;;:::o;71928:110::-;66016:13;:11;:13::i;:::-;72026:4:::1;72004:19;:26;;;;71928:110:::0;:::o;72429:170::-;66016:13;:11;:13::i;:::-;72525:1:::1;72508:13;;:18;72500:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;72588:3;;72578:7;:13;;;;;;;:::i;:::-;;72429:170:::0;;:::o;76899:473::-;76961:13;76995:16;77003:7;76995;:16::i;:::-;76987:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;77076:24;77133:1;77117:13;;:17;77113:252;;;77164:61;77198:14;;77181:13;;77171:7;:23;;;;:::i;:::-;77170:42;;;;:::i;:::-;77166:1;:46;;;;:::i;:::-;77164:59;:61::i;:::-;77151:74;;77271:7;77280:10;77254:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77240:61;;;;;77113:252;77341:12;77334:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76899:473;;;;:::o;70020:28::-;;;;:::o;74379:127::-;66016:13;:11;:13::i;:::-;74493:5:::1;74462:28;:36;;;;74379:127:::0;:::o;70522:42::-;;;;:::o;72276:108::-;66016:13;:11;:13::i;:::-;72372:4:::1;72351:18;:25;;;;72276:108:::0;:::o;70055:33::-;;;;:::o;70367:44::-;;;;:::o;70097:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51964:164::-;52061:4;52085:18;:25;52104:5;52085:25;;;;;;;;;;;;;;;:35;52111:8;52085:35;;;;;;;;;;;;;;;;;;;;;;;;;52078:42;;51964:164;;;;:::o;67036:201::-;66016:13;:11;:13::i;:::-;67145:1:::1;67125:22;;:8;:22;;::::0;67117:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;67201:28;67220:8;67201:18;:28::i;:::-;67036:201:::0;:::o;70171:32::-;;;;:::o;66295:132::-;66370:12;:10;:12::i;:::-;66359:23;;:7;:5;:7::i;:::-;:23;;;66351:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66295:132::o;37024:157::-;37109:4;37148:25;37133:40;;;:11;:40;;;;37126:47;;37024:157;;;:::o;61314:135::-;61396:16;61404:7;61396;:16::i;:::-;61388:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;61314:135;:::o;47434:98::-;47487:7;47514:10;47507:17;;47434:98;:::o;60593:174::-;60695:2;60668:15;:24;60684:7;60668:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;60751:7;60747:2;60713:46;;60722:23;60737:7;60722:14;:23::i;:::-;60713:46;;;;;;;;;;;;60593:174;;:::o;68467:114::-;68532:7;68559;:14;;;68552:21;;68467:114;;;:::o;55212:264::-;55305:4;55322:13;55338:23;55353:7;55338:14;:23::i;:::-;55322:39;;55391:5;55380:16;;:7;:16;;;:52;;;;55400:32;55417:5;55424:7;55400:16;:32::i;:::-;55380:52;:87;;;;55460:7;55436:31;;:20;55448:7;55436:11;:20::i;:::-;:31;;;55380:87;55372:96;;;55212:264;;;;:::o;59211:1263::-;59370:4;59343:31;;:23;59358:7;59343:14;:23::i;:::-;:31;;;59335:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;59449:1;59435:16;;:2;:16;;;59427:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;59505:42;59526:4;59532:2;59536:7;59545:1;59505:20;:42::i;:::-;59677:4;59650:31;;:23;59665:7;59650:14;:23::i;:::-;:31;;;59642:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;59795:15;:24;59811:7;59795:24;;;;;;;;;;;;59788:31;;;;;;;;;;;60290:1;60271:9;:15;60281:4;60271:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;60323:1;60306:9;:13;60316:2;60306:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;60365:2;60346:7;:16;60354:7;60346:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;60404:7;60400:2;60385:27;;60394:4;60385:27;;;;;;;;;;;;60425:41;60445:4;60451:2;60455:7;60464:1;60425:19;:41::i;:::-;59211:1263;;;:::o;1222:190::-;1347:4;1400;1371:25;1384:5;1391:4;1371:12;:25::i;:::-;:33;1364:40;;1222:190;;;;;:::o;81372:457::-;81441:10;81437:186;81465:5;81457;:13;81437:186;;;81498:21;:9;:19;:21::i;:::-;81534:14;81551:19;:9;:17;:19::i;:::-;81534:36;;81587:24;81597:2;81601:9;81587;:24::i;:::-;81481:142;81472:7;;;;;:::i;:::-;;;;81437:186;;;;81716:1;81694:18;;:23;:66;;;;;81745:14;;81722:19;:9;:17;:19::i;:::-;:37;81694:66;81690:132;;;81798:12;81777:18;:33;;;;81690:132;81372:457;;:::o;77691:736::-;77782:1;77765:13;;:18;77757:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;77863:15;77843:35;;;;;;;;:::i;:::-;;:16;;;;;;;;;;;:35;;;;;;;;:::i;:::-;;;77835:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77970:14;;77953;;:31;;;;:::i;:::-;77944:5;77922:19;:9;:17;:19::i;:::-;:27;;;;:::i;:::-;:62;;77914:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;78083:15;;78075:5;:23;;;;:::i;:::-;78062:9;:36;;78054:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;78201:26;;78192:5;78166:18;:23;78185:3;78166:23;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;:61;;78158:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;78316:5;78289:18;:23;78308:3;78289:23;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;78334:23;78346:3;78351:5;78334:11;:23::i;:::-;78383:36;78390:3;78395:5;78402:16;78383:36;;;;;;;;:::i;:::-;;;;;;;;77691:736;;:::o;54487:117::-;54553:7;54580;:16;54588:7;54580:16;;;;;;;;;;;;;;;;;;;;;54573:23;;54487:117;;;:::o;67397:191::-;67471:16;67490:6;;;;;;;;;;;67471:25;;67516:8;67507:6;;:17;;;;;;;;;;;;;;;;;;67571:8;67540:40;;67561:8;67540:40;;;;;;;;;;;;67460:128;67397:191;:::o;43651:3097::-;43709:13;43961:1;43946:4;:11;:16;43942:31;;43964:9;;;;;;;;;;;;;;;;43942:31;44026:19;44048:6;;;;;;;;;;;;;;;;;44026:28;;44465:20;44524:1;44519;44505:4;:11;:15;;;;:::i;:::-;44504:21;;;;:::i;:::-;44499:1;:27;;;;:::i;:::-;44488:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44465:62;;44707:1;44700:5;44696:13;44811:2;44803:6;44799:15;44922:4;44974;44968:11;44962:4;44958:22;44884:1432;45008:6;44999:7;44996:19;44884:1432;;;45114:1;45105:7;45101:15;45090:26;;45153:7;45147:14;45806:4;45798:5;45794:2;45790:14;45786:25;45776:8;45772:40;45766:47;45755:9;45747:67;45860:1;45849:9;45845:17;45832:30;;45952:4;45944:5;45940:2;45936:14;45932:25;45922:8;45918:40;45912:47;45901:9;45893:67;46006:1;45995:9;45991:17;45978:30;;46097:4;46089:5;46086:1;46082:13;46078:24;46068:8;46064:39;46058:46;46047:9;46039:66;46151:1;46140:9;46136:17;46123:30;;46234:4;46227:5;46223:16;46213:8;46209:31;46203:38;46192:9;46184:58;46288:1;46277:9;46273:17;46260:30;;45035:1281;44884:1432;;;44888:107;;46478:1;46471:4;46465:11;46461:19;46499:1;46494:123;;;;46636:1;46631:73;;;;46454:250;;46494:123;46547:4;46543:1;46532:9;46528:17;46520:32;46597:4;46593:1;46582:9;46578:17;46570:32;46494:123;;46631:73;46684:4;46680:1;46669:9;46665:17;46657:32;46454:250;;44593:2122;;46734:6;46727:13;;;;43651:3097;;;;:::o;60910:315::-;61065:8;61056:17;;:5;:17;;;61048:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;61152:8;61114:18;:25;61133:5;61114:25;;;;;;;;;;;;;;;:35;61140:8;61114:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;61198:8;61176:41;;61191:5;61176:41;;;61208:8;61176:41;;;;;;:::i;:::-;;;;;;;;60910:315;;;:::o;54060:313::-;54216:28;54226:4;54232:2;54236:7;54216:9;:28::i;:::-;54263:47;54286:4;54292:2;54296:7;54305:4;54263:22;:47::i;:::-;54255:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;54060:313;;;;:::o;54917:128::-;54982:4;55035:1;55006:31;;:17;55015:7;55006:8;:17::i;:::-;:31;;;;54999:38;;54917:128;;;:::o;22866:716::-;22922:13;22973:14;23010:1;22990:17;23001:5;22990:10;:17::i;:::-;:21;22973:38;;23026:20;23060:6;23049:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23026:41;;23082:11;23211:6;23207:2;23203:15;23195:6;23191:28;23184:35;;23248:288;23255:4;23248:288;;;23280:5;;;;;;;;23422:8;23417:2;23410:5;23406:14;23401:30;23396:3;23388:44;23478:2;23469:11;;;;;;:::i;:::-;;;;;23512:1;23503:5;:10;23248:288;23499:21;23248:288;23557:6;23550:13;;;;;22866:716;;;:::o;63598:410::-;63788:1;63776:9;:13;63772:229;;;63826:1;63810:18;;:4;:18;;;63806:87;;63868:9;63849;:15;63859:4;63849:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;63806:87;63925:1;63911:16;;:2;:16;;;63907:83;;63965:9;63948;:13;63958:2;63948:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;63907:83;63772:229;63598:410;;;;:::o;64730:158::-;;;;;:::o;2089:296::-;2172:7;2192:20;2215:4;2192:27;;2235:9;2230:118;2254:5;:12;2250:1;:16;2230:118;;;2303:33;2313:12;2327:5;2333:1;2327:8;;;;;;;;:::i;:::-;;;;;;;;2303:9;:33::i;:::-;2288:48;;2268:3;;;;;:::i;:::-;;;;2230:118;;;;2365:12;2358:19;;;2089:296;;;;:::o;68589:127::-;68696:1;68678:7;:14;;;:19;;;;;;;;;;;68589:127;:::o;55818:110::-;55894:26;55904:2;55908:7;55894:26;;;;;;;;;;;;:9;:26::i;:::-;55818:110;;:::o;62013:853::-;62167:4;62188:15;:2;:13;;;:15::i;:::-;62184:675;;;62240:2;62224:36;;;62261:12;:10;:12::i;:::-;62275:4;62281:7;62290:4;62224:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;62220:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62482:1;62465:6;:13;:18;62461:328;;62508:60;;;;;;;;;;:::i;:::-;;;;;;;;62461:328;62739:6;62733:13;62724:6;62720:2;62716:15;62709:38;62220:584;62356:41;;;62346:51;;;:6;:51;;;;62339:58;;;;;62184:675;62843:4;62836:11;;62013:853;;;;;;;:::o;19732:922::-;19785:7;19805:14;19822:1;19805:18;;19872:6;19863:5;:15;19859:102;;19908:6;19899:15;;;;;;:::i;:::-;;;;;19943:2;19933:12;;;;19859:102;19988:6;19979:5;:15;19975:102;;20024:6;20015:15;;;;;;:::i;:::-;;;;;20059:2;20049:12;;;;19975:102;20104:6;20095:5;:15;20091:102;;20140:6;20131:15;;;;;;:::i;:::-;;;;;20175:2;20165:12;;;;20091:102;20220:5;20211;:14;20207:99;;20255:5;20246:14;;;;;;:::i;:::-;;;;;20289:1;20279:11;;;;20207:99;20333:5;20324;:14;20320:99;;20368:5;20359:14;;;;;;:::i;:::-;;;;;20402:1;20392:11;;;;20320:99;20446:5;20437;:14;20433:99;;20481:5;20472:14;;;;;;:::i;:::-;;;;;20515:1;20505:11;;;;20433:99;20559:5;20550;:14;20546:66;;20595:1;20585:11;;;;20546:66;20640:6;20633:13;;;19732:922;;;:::o;9129:149::-;9192:7;9223:1;9219;:5;:51;;9250:20;9265:1;9268;9250:14;:20::i;:::-;9219:51;;;9227:20;9242:1;9245;9227:14;:20::i;:::-;9219:51;9212:58;;9129:149;;;;:::o;56155:319::-;56284:18;56290:2;56294:7;56284:5;:18::i;:::-;56335:53;56366:1;56370:2;56374:7;56383:4;56335:22;:53::i;:::-;56313:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;56155:319;;;:::o;25993:326::-;26053:4;26310:1;26288:7;:19;;;:23;26281:30;;25993:326;;;:::o;9286:268::-;9354:13;9461:1;9455:4;9448:15;9490:1;9484:4;9477:15;9531:4;9525;9515:21;9506:30;;9286:268;;;;:::o;56810:942::-;56904:1;56890:16;;:2;:16;;;56882:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;56963:16;56971:7;56963;:16::i;:::-;56962:17;56954:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57025:48;57054:1;57058:2;57062:7;57071:1;57025:20;:48::i;:::-;57172:16;57180:7;57172;:16::i;:::-;57171:17;57163:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57587:1;57570:9;:13;57580:2;57570:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;57631:2;57612:7;:16;57620:7;57612:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;57676:7;57672:2;57651:33;;57668:1;57651:33;;;;;;;;;;;;57697:47;57725:1;57729:2;57733:7;57742:1;57697:19;:47::i;:::-;56810:942;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:117;878:1;875;868:12;892:117;1001:1;998;991:12;1015:117;1124:1;1121;1114:12;1152:553;1210:8;1220:6;1270:3;1263:4;1255:6;1251:17;1247:27;1237:122;;1278:79;;:::i;:::-;1237:122;1391:6;1378:20;1368:30;;1421:18;1413:6;1410:30;1407:117;;;1443:79;;:::i;:::-;1407:117;1557:4;1549:6;1545:17;1533:29;;1611:3;1603:4;1595:6;1591:17;1581:8;1577:32;1574:41;1571:128;;;1618:79;;:::i;:::-;1571:128;1152:553;;;;;:::o;1711:529::-;1782:6;1790;1839:2;1827:9;1818:7;1814:23;1810:32;1807:119;;;1845:79;;:::i;:::-;1807:119;1993:1;1982:9;1978:17;1965:31;2023:18;2015:6;2012:30;2009:117;;;2045:79;;:::i;:::-;2009:117;2158:65;2215:7;2206:6;2195:9;2191:22;2158:65;:::i;:::-;2140:83;;;;1936:297;1711:529;;;;;:::o;2246:149::-;2282:7;2322:66;2315:5;2311:78;2300:89;;2246:149;;;:::o;2401:120::-;2473:23;2490:5;2473:23;:::i;:::-;2466:5;2463:34;2453:62;;2511:1;2508;2501:12;2453:62;2401:120;:::o;2527:137::-;2572:5;2610:6;2597:20;2588:29;;2626:32;2652:5;2626:32;:::i;:::-;2527:137;;;;:::o;2670:327::-;2728:6;2777:2;2765:9;2756:7;2752:23;2748:32;2745:119;;;2783:79;;:::i;:::-;2745:119;2903:1;2928:52;2972:7;2963:6;2952:9;2948:22;2928:52;:::i;:::-;2918:62;;2874:116;2670:327;;;;:::o;3003:90::-;3037:7;3080:5;3073:13;3066:21;3055:32;;3003:90;;;:::o;3099:109::-;3180:21;3195:5;3180:21;:::i;:::-;3175:3;3168:34;3099:109;;:::o;3214:210::-;3301:4;3339:2;3328:9;3324:18;3316:26;;3352:65;3414:1;3403:9;3399:17;3390:6;3352:65;:::i;:::-;3214:210;;;;:::o;3430:99::-;3482:6;3516:5;3510:12;3500:22;;3430:99;;;:::o;3535:169::-;3619:11;3653:6;3648:3;3641:19;3693:4;3688:3;3684:14;3669:29;;3535:169;;;;:::o;3710:307::-;3778:1;3788:113;3802:6;3799:1;3796:13;3788:113;;;3887:1;3882:3;3878:11;3872:18;3868:1;3863:3;3859:11;3852:39;3824:2;3821:1;3817:10;3812:15;;3788:113;;;3919:6;3916:1;3913:13;3910:101;;;3999:1;3990:6;3985:3;3981:16;3974:27;3910:101;3759:258;3710:307;;;:::o;4023:102::-;4064:6;4115:2;4111:7;4106:2;4099:5;4095:14;4091:28;4081:38;;4023:102;;;:::o;4131:364::-;4219:3;4247:39;4280:5;4247:39;:::i;:::-;4302:71;4366:6;4361:3;4302:71;:::i;:::-;4295:78;;4382:52;4427:6;4422:3;4415:4;4408:5;4404:16;4382:52;:::i;:::-;4459:29;4481:6;4459:29;:::i;:::-;4454:3;4450:39;4443:46;;4223:272;4131:364;;;;:::o;4501:313::-;4614:4;4652:2;4641:9;4637:18;4629:26;;4701:9;4695:4;4691:20;4687:1;4676:9;4672:17;4665:47;4729:78;4802:4;4793:6;4729:78;:::i;:::-;4721:86;;4501:313;;;;:::o;4820:122::-;4893:24;4911:5;4893:24;:::i;:::-;4886:5;4883:35;4873:63;;4932:1;4929;4922:12;4873:63;4820:122;:::o;4948:139::-;4994:5;5032:6;5019:20;5010:29;;5048:33;5075:5;5048:33;:::i;:::-;4948:139;;;;:::o;5093:329::-;5152:6;5201:2;5189:9;5180:7;5176:23;5172:32;5169:119;;;5207:79;;:::i;:::-;5169:119;5327:1;5352:53;5397:7;5388:6;5377:9;5373:22;5352:53;:::i;:::-;5342:63;;5298:117;5093:329;;;;:::o;5428:126::-;5465:7;5505:42;5498:5;5494:54;5483:65;;5428:126;;;:::o;5560:96::-;5597:7;5626:24;5644:5;5626:24;:::i;:::-;5615:35;;5560:96;;;:::o;5662:118::-;5749:24;5767:5;5749:24;:::i;:::-;5744:3;5737:37;5662:118;;:::o;5786:222::-;5879:4;5917:2;5906:9;5902:18;5894:26;;5930:71;5998:1;5987:9;5983:17;5974:6;5930:71;:::i;:::-;5786:222;;;;:::o;6014:122::-;6087:24;6105:5;6087:24;:::i;:::-;6080:5;6077:35;6067:63;;6126:1;6123;6116:12;6067:63;6014:122;:::o;6142:139::-;6188:5;6226:6;6213:20;6204:29;;6242:33;6269:5;6242:33;:::i;:::-;6142:139;;;;:::o;6287:474::-;6355:6;6363;6412:2;6400:9;6391:7;6387:23;6383:32;6380:119;;;6418:79;;:::i;:::-;6380:119;6538:1;6563:53;6608:7;6599:6;6588:9;6584:22;6563:53;:::i;:::-;6553:63;;6509:117;6665:2;6691:53;6736:7;6727:6;6716:9;6712:22;6691:53;:::i;:::-;6681:63;;6636:118;6287:474;;;;;:::o;6767:114::-;6855:1;6848:5;6845:12;6835:40;;6871:1;6868;6861:12;6835:40;6767:114;:::o;6887:169::-;6948:5;6986:6;6973:20;6964:29;;7002:48;7044:5;7002:48;:::i;:::-;6887:169;;;;:::o;7062:359::-;7136:6;7185:2;7173:9;7164:7;7160:23;7156:32;7153:119;;;7191:79;;:::i;:::-;7153:119;7311:1;7336:68;7396:7;7387:6;7376:9;7372:22;7336:68;:::i;:::-;7326:78;;7282:132;7062:359;;;;:::o;7427:619::-;7504:6;7512;7520;7569:2;7557:9;7548:7;7544:23;7540:32;7537:119;;;7575:79;;:::i;:::-;7537:119;7695:1;7720:53;7765:7;7756:6;7745:9;7741:22;7720:53;:::i;:::-;7710:63;;7666:117;7822:2;7848:53;7893:7;7884:6;7873:9;7869:22;7848:53;:::i;:::-;7838:63;;7793:118;7950:2;7976:53;8021:7;8012:6;8001:9;7997:22;7976:53;:::i;:::-;7966:63;;7921:118;7427:619;;;;;:::o;8069:568::-;8142:8;8152:6;8202:3;8195:4;8187:6;8183:17;8179:27;8169:122;;8210:79;;:::i;:::-;8169:122;8323:6;8310:20;8300:30;;8353:18;8345:6;8342:30;8339:117;;;8375:79;;:::i;:::-;8339:117;8489:4;8481:6;8477:17;8465:29;;8543:3;8535:4;8527:6;8523:17;8513:8;8509:32;8506:41;8503:128;;;8550:79;;:::i;:::-;8503:128;8069:568;;;;;:::o;8643:704::-;8738:6;8746;8754;8803:2;8791:9;8782:7;8778:23;8774:32;8771:119;;;8809:79;;:::i;:::-;8771:119;8957:1;8946:9;8942:17;8929:31;8987:18;8979:6;8976:30;8973:117;;;9009:79;;:::i;:::-;8973:117;9122:80;9194:7;9185:6;9174:9;9170:22;9122:80;:::i;:::-;9104:98;;;;8900:312;9251:2;9277:53;9322:7;9313:6;9302:9;9298:22;9277:53;:::i;:::-;9267:63;;9222:118;8643:704;;;;;:::o;9353:77::-;9390:7;9419:5;9408:16;;9353:77;;;:::o;9436:118::-;9523:24;9541:5;9523:24;:::i;:::-;9518:3;9511:37;9436:118;;:::o;9560:222::-;9653:4;9691:2;9680:9;9676:18;9668:26;;9704:71;9772:1;9761:9;9757:17;9748:6;9704:71;:::i;:::-;9560:222;;;;:::o;9788:180::-;9836:77;9833:1;9826:88;9933:4;9930:1;9923:15;9957:4;9954:1;9947:15;9974:120;10062:1;10055:5;10052:12;10042:46;;10068:18;;:::i;:::-;10042:46;9974:120;:::o;10100:141::-;10152:7;10181:5;10170:16;;10187:48;10229:5;10187:48;:::i;:::-;10100:141;;;:::o;10247:::-;10310:9;10343:39;10376:5;10343:39;:::i;:::-;10330:52;;10247:141;;;:::o;10394:157::-;10494:50;10538:5;10494:50;:::i;:::-;10489:3;10482:63;10394:157;;:::o;10557:248::-;10663:4;10701:2;10690:9;10686:18;10678:26;;10714:84;10795:1;10784:9;10780:17;10771:6;10714:84;:::i;:::-;10557:248;;;;:::o;10811:122::-;10884:24;10902:5;10884:24;:::i;:::-;10877:5;10874:35;10864:63;;10923:1;10920;10913:12;10864:63;10811:122;:::o;10939:139::-;10985:5;11023:6;11010:20;11001:29;;11039:33;11066:5;11039:33;:::i;:::-;10939:139;;;;:::o;11084:329::-;11143:6;11192:2;11180:9;11171:7;11167:23;11163:32;11160:119;;;11198:79;;:::i;:::-;11160:119;11318:1;11343:53;11388:7;11379:6;11368:9;11364:22;11343:53;:::i;:::-;11333:63;;11289:117;11084:329;;;;:::o;11419:::-;11478:6;11527:2;11515:9;11506:7;11502:23;11498:32;11495:119;;;11533:79;;:::i;:::-;11495:119;11653:1;11678:53;11723:7;11714:6;11703:9;11699:22;11678:53;:::i;:::-;11668:63;;11624:117;11419:329;;;;:::o;11754:117::-;11863:1;11860;11853:12;11877:180;11925:77;11922:1;11915:88;12022:4;12019:1;12012:15;12046:4;12043:1;12036:15;12063:281;12146:27;12168:4;12146:27;:::i;:::-;12138:6;12134:40;12276:6;12264:10;12261:22;12240:18;12228:10;12225:34;12222:62;12219:88;;;12287:18;;:::i;:::-;12219:88;12327:10;12323:2;12316:22;12106:238;12063:281;;:::o;12350:129::-;12384:6;12411:20;;:::i;:::-;12401:30;;12440:33;12468:4;12460:6;12440:33;:::i;:::-;12350:129;;;:::o;12485:308::-;12547:4;12637:18;12629:6;12626:30;12623:56;;;12659:18;;:::i;:::-;12623:56;12697:29;12719:6;12697:29;:::i;:::-;12689:37;;12781:4;12775;12771:15;12763:23;;12485:308;;;:::o;12799:154::-;12883:6;12878:3;12873;12860:30;12945:1;12936:6;12931:3;12927:16;12920:27;12799:154;;;:::o;12959:412::-;13037:5;13062:66;13078:49;13120:6;13078:49;:::i;:::-;13062:66;:::i;:::-;13053:75;;13151:6;13144:5;13137:21;13189:4;13182:5;13178:16;13227:3;13218:6;13213:3;13209:16;13206:25;13203:112;;;13234:79;;:::i;:::-;13203:112;13324:41;13358:6;13353:3;13348;13324:41;:::i;:::-;13043:328;12959:412;;;;;:::o;13391:340::-;13447:5;13496:3;13489:4;13481:6;13477:17;13473:27;13463:122;;13504:79;;:::i;:::-;13463:122;13621:6;13608:20;13646:79;13721:3;13713:6;13706:4;13698:6;13694:17;13646:79;:::i;:::-;13637:88;;13453:278;13391:340;;;;:::o;13737:509::-;13806:6;13855:2;13843:9;13834:7;13830:23;13826:32;13823:119;;;13861:79;;:::i;:::-;13823:119;14009:1;13998:9;13994:17;13981:31;14039:18;14031:6;14028:30;14025:117;;;14061:79;;:::i;:::-;14025:117;14166:63;14221:7;14212:6;14201:9;14197:22;14166:63;:::i;:::-;14156:73;;13952:287;13737:509;;;;:::o;14252:116::-;14322:21;14337:5;14322:21;:::i;:::-;14315:5;14312:32;14302:60;;14358:1;14355;14348:12;14302:60;14252:116;:::o;14374:133::-;14417:5;14455:6;14442:20;14433:29;;14471:30;14495:5;14471:30;:::i;:::-;14374:133;;;;:::o;14513:468::-;14578:6;14586;14635:2;14623:9;14614:7;14610:23;14606:32;14603:119;;;14641:79;;:::i;:::-;14603:119;14761:1;14786:53;14831:7;14822:6;14811:9;14807:22;14786:53;:::i;:::-;14776:63;;14732:117;14888:2;14914:50;14956:7;14947:6;14936:9;14932:22;14914:50;:::i;:::-;14904:60;;14859:115;14513:468;;;;;:::o;14987:307::-;15048:4;15138:18;15130:6;15127:30;15124:56;;;15160:18;;:::i;:::-;15124:56;15198:29;15220:6;15198:29;:::i;:::-;15190:37;;15282:4;15276;15272:15;15264:23;;14987:307;;;:::o;15300:410::-;15377:5;15402:65;15418:48;15459:6;15418:48;:::i;:::-;15402:65;:::i;:::-;15393:74;;15490:6;15483:5;15476:21;15528:4;15521:5;15517:16;15566:3;15557:6;15552:3;15548:16;15545:25;15542:112;;;15573:79;;:::i;:::-;15542:112;15663:41;15697:6;15692:3;15687;15663:41;:::i;:::-;15383:327;15300:410;;;;;:::o;15729:338::-;15784:5;15833:3;15826:4;15818:6;15814:17;15810:27;15800:122;;15841:79;;:::i;:::-;15800:122;15958:6;15945:20;15983:78;16057:3;16049:6;16042:4;16034:6;16030:17;15983:78;:::i;:::-;15974:87;;15790:277;15729:338;;;;:::o;16073:943::-;16168:6;16176;16184;16192;16241:3;16229:9;16220:7;16216:23;16212:33;16209:120;;;16248:79;;:::i;:::-;16209:120;16368:1;16393:53;16438:7;16429:6;16418:9;16414:22;16393:53;:::i;:::-;16383:63;;16339:117;16495:2;16521:53;16566:7;16557:6;16546:9;16542:22;16521:53;:::i;:::-;16511:63;;16466:118;16623:2;16649:53;16694:7;16685:6;16674:9;16670:22;16649:53;:::i;:::-;16639:63;;16594:118;16779:2;16768:9;16764:18;16751:32;16810:18;16802:6;16799:30;16796:117;;;16832:79;;:::i;:::-;16796:117;16937:62;16991:7;16982:6;16971:9;16967:22;16937:62;:::i;:::-;16927:72;;16722:287;16073:943;;;;;;;:::o;17022:474::-;17090:6;17098;17147:2;17135:9;17126:7;17122:23;17118:32;17115:119;;;17153:79;;:::i;:::-;17115:119;17273:1;17298:53;17343:7;17334:6;17323:9;17319:22;17298:53;:::i;:::-;17288:63;;17244:117;17400:2;17426:53;17471:7;17462:6;17451:9;17447:22;17426:53;:::i;:::-;17416:63;;17371:118;17022:474;;;;;:::o;17502:180::-;17550:77;17547:1;17540:88;17647:4;17644:1;17637:15;17671:4;17668:1;17661:15;17688:320;17732:6;17769:1;17763:4;17759:12;17749:22;;17816:1;17810:4;17806:12;17837:18;17827:81;;17893:4;17885:6;17881:17;17871:27;;17827:81;17955:2;17947:6;17944:14;17924:18;17921:38;17918:84;;17974:18;;:::i;:::-;17918:84;17739:269;17688:320;;;:::o;18014:220::-;18154:34;18150:1;18142:6;18138:14;18131:58;18223:3;18218:2;18210:6;18206:15;18199:28;18014:220;:::o;18240:366::-;18382:3;18403:67;18467:2;18462:3;18403:67;:::i;:::-;18396:74;;18479:93;18568:3;18479:93;:::i;:::-;18597:2;18592:3;18588:12;18581:19;;18240:366;;;:::o;18612:419::-;18778:4;18816:2;18805:9;18801:18;18793:26;;18865:9;18859:4;18855:20;18851:1;18840:9;18836:17;18829:47;18893:131;19019:4;18893:131;:::i;:::-;18885:139;;18612:419;;;:::o;19037:248::-;19177:34;19173:1;19165:6;19161:14;19154:58;19246:31;19241:2;19233:6;19229:15;19222:56;19037:248;:::o;19291:366::-;19433:3;19454:67;19518:2;19513:3;19454:67;:::i;:::-;19447:74;;19530:93;19619:3;19530:93;:::i;:::-;19648:2;19643:3;19639:12;19632:19;;19291:366;;;:::o;19663:419::-;19829:4;19867:2;19856:9;19852:18;19844:26;;19916:9;19910:4;19906:20;19902:1;19891:9;19887:17;19880:47;19944:131;20070:4;19944:131;:::i;:::-;19936:139;;19663:419;;;:::o;20088:232::-;20228:34;20224:1;20216:6;20212:14;20205:58;20297:15;20292:2;20284:6;20280:15;20273:40;20088:232;:::o;20326:366::-;20468:3;20489:67;20553:2;20548:3;20489:67;:::i;:::-;20482:74;;20565:93;20654:3;20565:93;:::i;:::-;20683:2;20678:3;20674:12;20667:19;;20326:366;;;:::o;20698:419::-;20864:4;20902:2;20891:9;20887:18;20879:26;;20951:9;20945:4;20941:20;20937:1;20926:9;20922:17;20915:47;20979:131;21105:4;20979:131;:::i;:::-;20971:139;;20698:419;;;:::o;21123:223::-;21263:34;21259:1;21251:6;21247:14;21240:58;21332:6;21327:2;21319:6;21315:15;21308:31;21123:223;:::o;21352:366::-;21494:3;21515:67;21579:2;21574:3;21515:67;:::i;:::-;21508:74;;21591:93;21680:3;21591:93;:::i;:::-;21709:2;21704:3;21700:12;21693:19;;21352:366;;;:::o;21724:419::-;21890:4;21928:2;21917:9;21913:18;21905:26;;21977:9;21971:4;21967:20;21963:1;21952:9;21948:17;21941:47;22005:131;22131:4;22005:131;:::i;:::-;21997:139;;21724:419;;;:::o;22149:174::-;22289:26;22285:1;22277:6;22273:14;22266:50;22149:174;:::o;22329:366::-;22471:3;22492:67;22556:2;22551:3;22492:67;:::i;:::-;22485:74;;22568:93;22657:3;22568:93;:::i;:::-;22686:2;22681:3;22677:12;22670:19;;22329:366;;;:::o;22701:419::-;22867:4;22905:2;22894:9;22890:18;22882:26;;22954:9;22948:4;22944:20;22940:1;22929:9;22925:17;22918:47;22982:131;23108:4;22982:131;:::i;:::-;22974:139;;22701:419;;;:::o;23126:180::-;23174:77;23171:1;23164:88;23271:4;23268:1;23261:15;23295:4;23292:1;23285:15;23312:305;23352:3;23371:20;23389:1;23371:20;:::i;:::-;23366:25;;23405:20;23423:1;23405:20;:::i;:::-;23400:25;;23559:1;23491:66;23487:74;23484:1;23481:81;23478:107;;;23565:18;;:::i;:::-;23478:107;23609:1;23606;23602:9;23595:16;;23312:305;;;;:::o;23623:241::-;23763:34;23759:1;23751:6;23747:14;23740:58;23832:24;23827:2;23819:6;23815:15;23808:49;23623:241;:::o;23870:366::-;24012:3;24033:67;24097:2;24092:3;24033:67;:::i;:::-;24026:74;;24109:93;24198:3;24109:93;:::i;:::-;24227:2;24222:3;24218:12;24211:19;;23870:366;;;:::o;24242:419::-;24408:4;24446:2;24435:9;24431:18;24423:26;;24495:9;24489:4;24485:20;24481:1;24470:9;24466:17;24459:47;24523:131;24649:4;24523:131;:::i;:::-;24515:139;;24242:419;;;:::o;24667:348::-;24707:7;24730:20;24748:1;24730:20;:::i;:::-;24725:25;;24764:20;24782:1;24764:20;:::i;:::-;24759:25;;24952:1;24884:66;24880:74;24877:1;24874:81;24869:1;24862:9;24855:17;24851:105;24848:131;;;24959:18;;:::i;:::-;24848:131;25007:1;25004;25000:9;24989:20;;24667:348;;;;:::o;25021:221::-;25161:34;25157:1;25149:6;25145:14;25138:58;25230:4;25225:2;25217:6;25213:15;25206:29;25021:221;:::o;25248:366::-;25390:3;25411:67;25475:2;25470:3;25411:67;:::i;:::-;25404:74;;25487:93;25576:3;25487:93;:::i;:::-;25605:2;25600:3;25596:12;25589:19;;25248:366;;;:::o;25620:419::-;25786:4;25824:2;25813:9;25809:18;25801:26;;25873:9;25867:4;25863:20;25859:1;25848:9;25844:17;25837:47;25901:131;26027:4;25901:131;:::i;:::-;25893:139;;25620:419;;;:::o;26045:231::-;26185:34;26181:1;26173:6;26169:14;26162:58;26254:14;26249:2;26241:6;26237:15;26230:39;26045:231;:::o;26282:366::-;26424:3;26445:67;26509:2;26504:3;26445:67;:::i;:::-;26438:74;;26521:93;26610:3;26521:93;:::i;:::-;26639:2;26634:3;26630:12;26623:19;;26282:366;;;:::o;26654:419::-;26820:4;26858:2;26847:9;26843:18;26835:26;;26907:9;26901:4;26897:20;26893:1;26882:9;26878:17;26871:47;26935:131;27061:4;26935:131;:::i;:::-;26927:139;;26654:419;;;:::o;27079:94::-;27112:8;27160:5;27156:2;27152:14;27131:35;;27079:94;;;:::o;27179:::-;27218:7;27247:20;27261:5;27247:20;:::i;:::-;27236:31;;27179:94;;;:::o;27279:100::-;27318:7;27347:26;27367:5;27347:26;:::i;:::-;27336:37;;27279:100;;;:::o;27385:157::-;27490:45;27510:24;27528:5;27510:24;:::i;:::-;27490:45;:::i;:::-;27485:3;27478:58;27385:157;;:::o;27548:256::-;27660:3;27675:75;27746:3;27737:6;27675:75;:::i;:::-;27775:2;27770:3;27766:12;27759:19;;27795:3;27788:10;;27548:256;;;;:::o;27810:173::-;27950:25;27946:1;27938:6;27934:14;27927:49;27810:173;:::o;27989:366::-;28131:3;28152:67;28216:2;28211:3;28152:67;:::i;:::-;28145:74;;28228:93;28317:3;28228:93;:::i;:::-;28346:2;28341:3;28337:12;28330:19;;27989:366;;;:::o;28361:419::-;28527:4;28565:2;28554:9;28550:18;28542:26;;28614:9;28608:4;28604:20;28600:1;28589:9;28585:17;28578:47;28642:131;28768:4;28642:131;:::i;:::-;28634:139;;28361:419;;;:::o;28786:119::-;28873:1;28866:5;28863:12;28853:46;;28879:18;;:::i;:::-;28853:46;28786:119;:::o;28911:139::-;28962:7;28991:5;28980:16;;28997:47;29038:5;28997:47;:::i;:::-;28911:139;;;:::o;29056:::-;29118:9;29151:38;29183:5;29151:38;:::i;:::-;29138:51;;29056:139;;;:::o;29201:155::-;29300:49;29343:5;29300:49;:::i;:::-;29295:3;29288:62;29201:155;;:::o;29362:466::-;29523:4;29561:2;29550:9;29546:18;29538:26;;29574:71;29642:1;29631:9;29627:17;29618:6;29574:71;:::i;:::-;29655:72;29723:2;29712:9;29708:18;29699:6;29655:72;:::i;:::-;29737:84;29817:2;29806:9;29802:18;29793:6;29737:84;:::i;:::-;29362:466;;;;;;:::o;29834:176::-;29974:28;29970:1;29962:6;29958:14;29951:52;29834:176;:::o;30016:366::-;30158:3;30179:67;30243:2;30238:3;30179:67;:::i;:::-;30172:74;;30255:93;30344:3;30255:93;:::i;:::-;30373:2;30368:3;30364:12;30357:19;;30016:366;;;:::o;30388:419::-;30554:4;30592:2;30581:9;30577:18;30569:26;;30641:9;30635:4;30631:20;30627:1;30616:9;30612:17;30605:47;30669:131;30795:4;30669:131;:::i;:::-;30661:139;;30388:419;;;:::o;30813:191::-;30853:4;30873:20;30891:1;30873:20;:::i;:::-;30868:25;;30907:20;30925:1;30907:20;:::i;:::-;30902:25;;30946:1;30943;30940:8;30937:34;;;30951:18;;:::i;:::-;30937:34;30996:1;30993;30989:9;30981:17;;30813:191;;;;:::o;31010:176::-;31150:28;31146:1;31138:6;31134:14;31127:52;31010:176;:::o;31192:366::-;31334:3;31355:67;31419:2;31414:3;31355:67;:::i;:::-;31348:74;;31431:93;31520:3;31431:93;:::i;:::-;31549:2;31544:3;31540:12;31533:19;;31192:366;;;:::o;31564:419::-;31730:4;31768:2;31757:9;31753:18;31745:26;;31817:9;31811:4;31807:20;31803:1;31792:9;31788:17;31781:47;31845:131;31971:4;31845:131;:::i;:::-;31837:139;;31564:419;;;:::o;31989:223::-;32129:34;32125:1;32117:6;32113:14;32106:58;32198:6;32193:2;32185:6;32181:15;32174:31;31989:223;:::o;32218:366::-;32360:3;32381:67;32445:2;32440:3;32381:67;:::i;:::-;32374:74;;32457:93;32546:3;32457:93;:::i;:::-;32575:2;32570:3;32566:12;32559:19;;32218:366;;;:::o;32590:419::-;32756:4;32794:2;32783:9;32779:18;32771:26;;32843:9;32837:4;32833:20;32829:1;32818:9;32814:17;32807:47;32871:131;32997:4;32871:131;:::i;:::-;32863:139;;32590:419;;;:::o;33015:160::-;33155:12;33151:1;33143:6;33139:14;33132:36;33015:160;:::o;33181:366::-;33323:3;33344:67;33408:2;33403:3;33344:67;:::i;:::-;33337:74;;33420:93;33509:3;33420:93;:::i;:::-;33538:2;33533:3;33529:12;33522:19;;33181:366;;;:::o;33553:419::-;33719:4;33757:2;33746:9;33742:18;33734:26;;33806:9;33800:4;33796:20;33792:1;33781:9;33777:17;33770:47;33834:131;33960:4;33834:131;:::i;:::-;33826:139;;33553:419;;;:::o;33978:223::-;34118:34;34114:1;34106:6;34102:14;34095:58;34187:6;34182:2;34174:6;34170:15;34163:31;33978:223;:::o;34207:366::-;34349:3;34370:67;34434:2;34429:3;34370:67;:::i;:::-;34363:74;;34446:93;34535:3;34446:93;:::i;:::-;34564:2;34559:3;34555:12;34548:19;;34207:366;;;:::o;34579:419::-;34745:4;34783:2;34772:9;34768:18;34760:26;;34832:9;34826:4;34822:20;34818:1;34807:9;34803:17;34796:47;34860:131;34986:4;34860:131;:::i;:::-;34852:139;;34579:419;;;:::o;35004:174::-;35144:26;35140:1;35132:6;35128:14;35121:50;35004:174;:::o;35184:366::-;35326:3;35347:67;35411:2;35406:3;35347:67;:::i;:::-;35340:74;;35423:93;35512:3;35423:93;:::i;:::-;35541:2;35536:3;35532:12;35525:19;;35184:366;;;:::o;35556:419::-;35722:4;35760:2;35749:9;35745:18;35737:26;;35809:9;35803:4;35799:20;35795:1;35784:9;35780:17;35773:47;35837:131;35963:4;35837:131;:::i;:::-;35829:139;;35556:419;;;:::o;35981:228::-;36121:34;36117:1;36109:6;36105:14;36098:58;36190:11;36185:2;36177:6;36173:15;36166:36;35981:228;:::o;36215:366::-;36357:3;36378:67;36442:2;36437:3;36378:67;:::i;:::-;36371:74;;36454:93;36543:3;36454:93;:::i;:::-;36572:2;36567:3;36563:12;36556:19;;36215:366;;;:::o;36587:419::-;36753:4;36791:2;36780:9;36776:18;36768:26;;36840:9;36834:4;36830:20;36826:1;36815:9;36811:17;36804:47;36868:131;36994:4;36868:131;:::i;:::-;36860:139;;36587:419;;;:::o;37012:181::-;37152:33;37148:1;37140:6;37136:14;37129:57;37012:181;:::o;37199:366::-;37341:3;37362:67;37426:2;37421:3;37362:67;:::i;:::-;37355:74;;37438:93;37527:3;37438:93;:::i;:::-;37556:2;37551:3;37547:12;37540:19;;37199:366;;;:::o;37571:419::-;37737:4;37775:2;37764:9;37760:18;37752:26;;37824:9;37818:4;37814:20;37810:1;37799:9;37795:17;37788:47;37852:131;37978:4;37852:131;:::i;:::-;37844:139;;37571:419;;;:::o;37996:148::-;38098:11;38135:3;38120:18;;37996:148;;;;:::o;38150:179::-;38290:31;38286:1;38278:6;38274:14;38267:55;38150:179;:::o;38335:402::-;38495:3;38516:85;38598:2;38593:3;38516:85;:::i;:::-;38509:92;;38610:93;38699:3;38610:93;:::i;:::-;38728:2;38723:3;38719:12;38712:19;;38335:402;;;:::o;38743:377::-;38849:3;38877:39;38910:5;38877:39;:::i;:::-;38932:89;39014:6;39009:3;38932:89;:::i;:::-;38925:96;;39030:52;39075:6;39070:3;39063:4;39056:5;39052:16;39030:52;:::i;:::-;39107:6;39102:3;39098:16;39091:23;;38853:267;38743:377;;;;:::o;39126:541::-;39359:3;39381:148;39525:3;39381:148;:::i;:::-;39374:155;;39546:95;39637:3;39628:6;39546:95;:::i;:::-;39539:102;;39658:3;39651:10;;39126:541;;;;:::o;39673:182::-;39813:34;39809:1;39801:6;39797:14;39790:58;39673:182;:::o;39861:366::-;40003:3;40024:67;40088:2;40083:3;40024:67;:::i;:::-;40017:74;;40100:93;40189:3;40100:93;:::i;:::-;40218:2;40213:3;40209:12;40202:19;;39861:366;;;:::o;40233:419::-;40399:4;40437:2;40426:9;40422:18;40414:26;;40486:9;40480:4;40476:20;40472:1;40461:9;40457:17;40450:47;40514:131;40640:4;40514:131;:::i;:::-;40506:139;;40233:419;;;:::o;40658:180::-;40706:77;40703:1;40696:88;40803:4;40800:1;40793:15;40827:4;40824:1;40817:15;40844:176;40876:1;40893:20;40911:1;40893:20;:::i;:::-;40888:25;;40927:20;40945:1;40927:20;:::i;:::-;40922:25;;40966:1;40956:35;;40971:18;;:::i;:::-;40956:35;41012:1;41009;41005:9;41000:14;;40844:176;;;;:::o;41026:234::-;41166:34;41162:1;41154:6;41150:14;41143:58;41235:17;41230:2;41222:6;41218:15;41211:42;41026:234;:::o;41266:366::-;41408:3;41429:67;41493:2;41488:3;41429:67;:::i;:::-;41422:74;;41505:93;41594:3;41505:93;:::i;:::-;41623:2;41618:3;41614:12;41607:19;;41266:366;;;:::o;41638:419::-;41804:4;41842:2;41831:9;41827:18;41819:26;;41891:9;41885:4;41881:20;41877:1;41866:9;41862:17;41855:47;41919:131;42045:4;41919:131;:::i;:::-;41911:139;;41638:419;;;:::o;42063:141::-;42112:4;42135:3;42127:11;;42158:3;42155:1;42148:14;42192:4;42189:1;42179:18;42171:26;;42063:141;;;:::o;42234:845::-;42337:3;42374:5;42368:12;42403:36;42429:9;42403:36;:::i;:::-;42455:89;42537:6;42532:3;42455:89;:::i;:::-;42448:96;;42575:1;42564:9;42560:17;42591:1;42586:137;;;;42737:1;42732:341;;;;42553:520;;42586:137;42670:4;42666:9;42655;42651:25;42646:3;42639:38;42706:6;42701:3;42697:16;42690:23;;42586:137;;42732:341;42799:38;42831:5;42799:38;:::i;:::-;42859:1;42873:154;42887:6;42884:1;42881:13;42873:154;;;42961:7;42955:14;42951:1;42946:3;42942:11;42935:35;43011:1;43002:7;42998:15;42987:26;;42909:4;42906:1;42902:12;42897:17;;42873:154;;;43056:6;43051:3;43047:16;43040:23;;42739:334;;42553:520;;42341:738;;42234:845;;;;:::o;43085:155::-;43225:7;43221:1;43213:6;43209:14;43202:31;43085:155;:::o;43246:400::-;43406:3;43427:84;43509:1;43504:3;43427:84;:::i;:::-;43420:91;;43520:93;43609:3;43520:93;:::i;:::-;43638:1;43633:3;43629:11;43622:18;;43246:400;;;:::o;43652:695::-;43930:3;43952:92;44040:3;44031:6;43952:92;:::i;:::-;43945:99;;44061:95;44152:3;44143:6;44061:95;:::i;:::-;44054:102;;44173:148;44317:3;44173:148;:::i;:::-;44166:155;;44338:3;44331:10;;43652:695;;;;;:::o;44353:225::-;44493:34;44489:1;44481:6;44477:14;44470:58;44562:8;44557:2;44549:6;44545:15;44538:33;44353:225;:::o;44584:366::-;44726:3;44747:67;44811:2;44806:3;44747:67;:::i;:::-;44740:74;;44823:93;44912:3;44823:93;:::i;:::-;44941:2;44936:3;44932:12;44925:19;;44584:366;;;:::o;44956:419::-;45122:4;45160:2;45149:9;45145:18;45137:26;;45209:9;45203:4;45199:20;45195:1;45184:9;45180:17;45173:47;45237:131;45363:4;45237:131;:::i;:::-;45229:139;;44956:419;;;:::o;45381:182::-;45521:34;45517:1;45509:6;45505:14;45498:58;45381:182;:::o;45569:366::-;45711:3;45732:67;45796:2;45791:3;45732:67;:::i;:::-;45725:74;;45808:93;45897:3;45808:93;:::i;:::-;45926:2;45921:3;45917:12;45910:19;;45569:366;;;:::o;45941:419::-;46107:4;46145:2;46134:9;46130:18;46122:26;;46194:9;46188:4;46184:20;46180:1;46169:9;46165:17;46158:47;46222:131;46348:4;46222:131;:::i;:::-;46214:139;;45941:419;;;:::o;46366:224::-;46506:34;46502:1;46494:6;46490:14;46483:58;46575:7;46570:2;46562:6;46558:15;46551:32;46366:224;:::o;46596:366::-;46738:3;46759:67;46823:2;46818:3;46759:67;:::i;:::-;46752:74;;46835:93;46924:3;46835:93;:::i;:::-;46953:2;46948:3;46944:12;46937:19;;46596:366;;;:::o;46968:419::-;47134:4;47172:2;47161:9;47157:18;47149:26;;47221:9;47215:4;47211:20;47207:1;47196:9;47192:17;47185:47;47249:131;47375:4;47249:131;:::i;:::-;47241:139;;46968:419;;;:::o;47393:223::-;47533:34;47529:1;47521:6;47517:14;47510:58;47602:6;47597:2;47589:6;47585:15;47578:31;47393:223;:::o;47622:366::-;47764:3;47785:67;47849:2;47844:3;47785:67;:::i;:::-;47778:74;;47861:93;47950:3;47861:93;:::i;:::-;47979:2;47974:3;47970:12;47963:19;;47622:366;;;:::o;47994:419::-;48160:4;48198:2;48187:9;48183:18;48175:26;;48247:9;48241:4;48237:20;48233:1;48222:9;48218:17;48211:47;48275:131;48401:4;48275:131;:::i;:::-;48267:139;;47994:419;;;:::o;48419:233::-;48458:3;48481:24;48499:5;48481:24;:::i;:::-;48472:33;;48527:66;48520:5;48517:77;48514:103;;48597:18;;:::i;:::-;48514:103;48644:1;48637:5;48633:13;48626:20;;48419:233;;;:::o;48658:170::-;48798:22;48794:1;48786:6;48782:14;48775:46;48658:170;:::o;48834:366::-;48976:3;48997:67;49061:2;49056:3;48997:67;:::i;:::-;48990:74;;49073:93;49162:3;49073:93;:::i;:::-;49191:2;49186:3;49182:12;49175:19;;48834:366;;;:::o;49206:419::-;49372:4;49410:2;49399:9;49395:18;49387:26;;49459:9;49453:4;49449:20;49445:1;49434:9;49430:17;49423:47;49487:131;49613:4;49487:131;:::i;:::-;49479:139;;49206:419;;;:::o;49631:185::-;49671:1;49688:20;49706:1;49688:20;:::i;:::-;49683:25;;49722:20;49740:1;49722:20;:::i;:::-;49717:25;;49761:1;49751:35;;49766:18;;:::i;:::-;49751:35;49808:1;49805;49801:9;49796:14;;49631:185;;;;:::o;49822:175::-;49962:27;49958:1;49950:6;49946:14;49939:51;49822:175;:::o;50003:366::-;50145:3;50166:67;50230:2;50225:3;50166:67;:::i;:::-;50159:74;;50242:93;50331:3;50242:93;:::i;:::-;50360:2;50355:3;50351:12;50344:19;;50003:366;;;:::o;50375:419::-;50541:4;50579:2;50568:9;50564:18;50556:26;;50628:9;50622:4;50618:20;50614:1;50603:9;50599:17;50592:47;50656:131;50782:4;50656:131;:::i;:::-;50648:139;;50375:419;;;:::o;50800:237::-;50940:34;50936:1;50928:6;50924:14;50917:58;51009:20;51004:2;50996:6;50992:15;50985:45;50800:237;:::o;51043:366::-;51185:3;51206:67;51270:2;51265:3;51206:67;:::i;:::-;51199:74;;51282:93;51371:3;51282:93;:::i;:::-;51400:2;51395:3;51391:12;51384:19;;51043:366;;;:::o;51415:419::-;51581:4;51619:2;51608:9;51604:18;51596:26;;51668:9;51662:4;51658:20;51654:1;51643:9;51639:17;51632:47;51696:131;51822:4;51696:131;:::i;:::-;51688:139;;51415:419;;;:::o;51840:180::-;51888:77;51885:1;51878:88;51985:4;51982:1;51975:15;52009:4;52006:1;51999:15;52026:98;52077:6;52111:5;52105:12;52095:22;;52026:98;;;:::o;52130:168::-;52213:11;52247:6;52242:3;52235:19;52287:4;52282:3;52278:14;52263:29;;52130:168;;;;:::o;52304:360::-;52390:3;52418:38;52450:5;52418:38;:::i;:::-;52472:70;52535:6;52530:3;52472:70;:::i;:::-;52465:77;;52551:52;52596:6;52591:3;52584:4;52577:5;52573:16;52551:52;:::i;:::-;52628:29;52650:6;52628:29;:::i;:::-;52623:3;52619:39;52612:46;;52394:270;52304:360;;;;:::o;52670:640::-;52865:4;52903:3;52892:9;52888:19;52880:27;;52917:71;52985:1;52974:9;52970:17;52961:6;52917:71;:::i;:::-;52998:72;53066:2;53055:9;53051:18;53042:6;52998:72;:::i;:::-;53080;53148:2;53137:9;53133:18;53124:6;53080:72;:::i;:::-;53199:9;53193:4;53189:20;53184:2;53173:9;53169:18;53162:48;53227:76;53298:4;53289:6;53227:76;:::i;:::-;53219:84;;52670:640;;;;;;;:::o;53316:141::-;53372:5;53403:6;53397:13;53388:22;;53419:32;53445:5;53419:32;:::i;:::-;53316:141;;;;:::o;53463:349::-;53532:6;53581:2;53569:9;53560:7;53556:23;53552:32;53549:119;;;53587:79;;:::i;:::-;53549:119;53707:1;53732:63;53787:7;53778:6;53767:9;53763:22;53732:63;:::i;:::-;53722:73;;53678:127;53463:349;;;;:::o;53818:182::-;53958:34;53954:1;53946:6;53942:14;53935:58;53818:182;:::o;54006:366::-;54148:3;54169:67;54233:2;54228:3;54169:67;:::i;:::-;54162:74;;54245:93;54334:3;54245:93;:::i;:::-;54363:2;54358:3;54354:12;54347:19;;54006:366;;;:::o;54378:419::-;54544:4;54582:2;54571:9;54567:18;54559:26;;54631:9;54625:4;54621:20;54617:1;54606:9;54602:17;54595:47;54659:131;54785:4;54659:131;:::i;:::-;54651:139;;54378:419;;;:::o;54803:178::-;54943:30;54939:1;54931:6;54927:14;54920:54;54803:178;:::o;54987:366::-;55129:3;55150:67;55214:2;55209:3;55150:67;:::i;:::-;55143:74;;55226:93;55315:3;55226:93;:::i;:::-;55344:2;55339:3;55335:12;55328:19;;54987:366;;;:::o;55359:419::-;55525:4;55563:2;55552:9;55548:18;55540:26;;55612:9;55606:4;55602:20;55598:1;55587:9;55583:17;55576:47;55640:131;55766:4;55640:131;:::i;:::-;55632:139;;55359:419;;;:::o

Swarm Source

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