ETH Price: $3,353.27 (-0.64%)
Gas: 10 Gwei

Token

BlockStar Team Bears (BSTB)
 

Overview

Max Total Supply

75 BSTB

Holders

8

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
40 BSTB
0x71195aC7A1dAA8e66d7B38C16860F69B7a20e797
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:
BlockStarNFTDrop

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-20
*/

// SPDX-License-Identifier: MIT

pragma solidity =0.8.15;

library EnumerableSet {
    
    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

   
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

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

contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

    modifier onlyAllowedOperator() virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}

contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

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

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

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

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

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

library Address {
    
    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;
    }

    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");
    }

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

interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

abstract contract ERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

interface IERC721 is IERC165 {
    
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    function balanceOf(address owner) external view returns (uint256 balance);
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    function approve(address to, uint256 tokenId) external;
    function setApprovalForAll(address operator, bool _approved) external;
    function getApproved(uint256 tokenId) external view returns (address operator);
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

interface IERC721Metadata is IERC721 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

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

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

    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 {}
}

interface BlockstarPayable {
    function pay(string memory serviceName) external payable;
}

abstract contract BlockstarService {
    constructor (address payable feeReceiver, string memory serviceName) payable {
        BlockstarPayable(feeReceiver).pay{value: msg.value}(serviceName);
    }
}

interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(
        uint256 tokenId,
        uint256 salePrice
    ) external view returns (address receiver, uint256 royaltyAmount);
}

abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

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

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

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

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

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

        return (royalty.receiver, royaltyAmount);
    }

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

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

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

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

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

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

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

contract BlockStarNFTDrop is ERC721, Ownable, DefaultOperatorFilterer,ERC2981,BlockstarService {

    using Strings for uint256;
    using EnumerableSet for EnumerableSet.AddressSet;
    
    uint private supply;

    string public uriPrefix = "";
    string public uriSuffix = "";

    uint256 public publicCost;
    uint256 public whitelistCost;

    uint256 public whitelistStartTime;
    uint256 public whitelistEndTime;

    uint256 public publicStartTime;
    uint256 public publicEndTime;

    bool public paused;
    bool public useWhitelisting;
    
    EnumerableSet.AddressSet private whitelistedUsers;
    mapping(address => bool) private isWhitelisted;
    mapping(address => uint256) private walletPublicMint;
    mapping(address => uint256) private walletWhitelistMint;

    uint256 public maxSupply;
    uint256 public maxPublicMint;  
    uint256 public maxWhitelistMint;  

     constructor(
                string memory _name,
                string memory _symbol,
                bool _isWhitelist,
                uint256[2] memory _cost,
                uint256[4] memory _time,
                address payable feeReceiver,
                uint96 _royaltyFeesInBips,
                uint256[3] memory _max,
                string memory _uriPrefix

            )
            BlockstarService(feeReceiver, "NFT")
            ERC721 (_name, _symbol) payable  {
            require(_time[2] > block.timestamp && _time[2] > 0 && _time[3] > 0 && _time[2] < _time[3] , "public sale start time and end time must be greater then current time and start time must be greater then end time");
            if(_isWhitelist){
                require(_time[0] > block.timestamp && _time[0] > 0 && _time[1] > 0 && _time[0] < _time[1] , "whitelist start time and end time must be greater then current time and start time must be greater then end time");
                require(_time[0] < _time[2] &&  _time[0] < _time[3] && _time[1] <= _time[2] && _time[1] < _time[3], "public sale start time and end time must be greater then whitelist time.");
            }
            require(_max[0] > 0 , "Supply must be greater then zero.");
            
            setRoyaltyInfo(owner(), _royaltyFeesInBips);
            useWhitelisting = _isWhitelist;
            
            publicCost = _cost[0];
            whitelistCost = _cost[1];

            whitelistStartTime = _time[0];
            whitelistEndTime = _time[1];

            publicStartTime = _time[2];
            publicEndTime = _time[3];

            maxSupply = _max[0];
            maxWhitelistMint = _max[1];
            maxPublicMint = _max[2];
            
            uriPrefix = _uriPrefix;
        }

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

    modifier priceCompliance(uint256 _mintAmount) {
        if( useWhitelisting && block.timestamp >=  whitelistStartTime &&  block.timestamp <=  whitelistEndTime){
            require(isWhitelisted[msg.sender], "address is not whitelisted ,wait for public sale start.");
            require(msg.value >= whitelistCost * _mintAmount, "Insufficient funds!");
            require(maxWhitelistMint >= walletWhitelistMint[msg.sender] + _mintAmount , "you have already reached maximum amount.");
            walletWhitelistMint[msg.sender] += _mintAmount;
        }
        else if(block.timestamp >=  publicStartTime &&  block.timestamp <=  publicEndTime){
            require(maxPublicMint >= walletPublicMint[msg.sender] + _mintAmount , "you have already reached maximum amount.");
            require(msg.value >= publicCost * _mintAmount, "Insufficient funds!");
            walletPublicMint[msg.sender] += _mintAmount;
        }
        else{
            revert("mint period is not start yet or over.");
        }
       
        _;
    }

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

    
    function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) priceCompliance(_mintAmount) {
        require(!paused,"Mint Paused!!");
        require(tx.origin == msg.sender,"Error: Invalid Caller!");
        (bool os,) = payable(address(owner())).call{value: msg.value}("");
        require(os , "fund not transfer!!");
        mint(msg.sender, _mintAmount);
    }

    function safeMint(address _adr, uint256 _mintAmount) public mintCompliance(_mintAmount) onlyOwner {
        mint(_adr, _mintAmount);
    }

    function mint(address _user, uint _unit) internal {
        for (uint256 i = 0; i < _unit; i++) {
            supply = supply + 1;
            _safeMint(_user, supply);
        }
    }

    
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
        _exists(tokenId),
        "ERC721Metadata: URI query for nonexistent token"
        );
        string memory currentBaseURI = _baseURI();
        if(bytes(uriSuffix).length > 0){
            return bytes(currentBaseURI).length > 0
                ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), uriSuffix))
                : "";
        }
        else{
            return bytes(currentBaseURI).length > 0
                ? string(abi.encodePacked(currentBaseURI))
                : "";
        }
    }

    function addWhitelistedUsers(address[] memory users) external {
        for (uint256 i = 0; i < users.length; i++) {
            setWhitelist(users[i], true);
        }
    }

    function addWhitelistedUser(address user) external {
        setWhitelist(user, true);
    }

    function removeWhitelistedUsers(address[] memory users) external {
        for (uint256 i = 0; i < users.length; i++) {
            setWhitelist(users[i], false);
        }
    }

    function removeWhitelistedUser(address user) external {
        setWhitelist(user, false);
    }

    function isUserWhitelisted(address user) public view returns (bool) {
        if (useWhitelisting) {
            return isWhitelisted[user];
        }
        return true;
    }

    function setWhitelist(address user, bool whitelisted) internal onlyOwner {
        require(useWhitelisting, "Pool does not use whitelisting option");
        if (whitelisted) {
            if (!whitelistedUsers.contains(user)) {
                whitelistedUsers.add(user);
                isWhitelisted[user] = true;
            }
        } else {
            if (whitelistedUsers.contains(user)) {
                whitelistedUsers.remove(user);
                isWhitelisted[user] = false;
            }
        }
    }

    function getNumberOfWhitelistedUsers() public view returns (uint256) {
        return whitelistedUsers.length();
    }

    function getWhitelistedUsers(uint256 startIndex, uint256 endIndex) public view returns (address[] memory) {
        if (endIndex >= whitelistedUsers.length()) {
            endIndex = whitelistedUsers.length() - 1;
        }
        uint256 len = endIndex - startIndex + 1;
        address[] memory whitelistedParticipantsPart = new address[](len);

        uint256 counter = 0;
        for (uint256 i = startIndex; i <= endIndex; i++) {
            whitelistedParticipantsPart[counter] = whitelistedUsers.at(i);
            counter++;
        }
        return whitelistedParticipantsPart;
    }

    function enableDisableMint(bool _status) public onlyOwner {
        paused = _status;
    }

    function setPublicCost(uint256 _newcost) public onlyOwner {
        publicCost = _newcost;
    }

    function setWhitelistCost(uint256 _newcost) public onlyOwner {
        whitelistCost = _newcost;
    }

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

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

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

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

    // -------------------------  Opensea Royality Filter  -----------------------

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

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

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

    function totalSupply() public view returns (uint) {
        return supply;
    }

    function setRoyaltyInfo(address _receiver, uint96 _royaltyFeesInBips) public onlyOwner {
        _setDefaultRoyalty(_receiver, _royaltyFeesInBips);
    }

    function setMaxPublicMint(uint256 _max) public onlyOwner{
        maxPublicMint = _max;
    }

    function setMaxWhitelistMint(uint256 _max) public onlyOwner{
        maxWhitelistMint = _max;
    }

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

    function setWhitelistTime(uint256 _startTime , uint256 _endTime) public onlyOwner{
        whitelistStartTime = _startTime;
        whitelistEndTime = _endTime;
    }

    function setPublicTime(uint256 _startTime , uint256 _endTime) public onlyOwner{
        publicStartTime = _startTime;
        publicEndTime = _endTime;
    }

    function setWhitelisting(bool _whitelist) public onlyOwner{
        useWhitelisting = _whitelist;
    }


    function rescueFunds() external onlyOwner {
        (bool os,) = payable(msg.sender).call{value: address(this).balance}("");
        require(os);
    }

    receive() external payable {}

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bool","name":"_isWhitelist","type":"bool"},{"internalType":"uint256[2]","name":"_cost","type":"uint256[2]"},{"internalType":"uint256[4]","name":"_time","type":"uint256[4]"},{"internalType":"address payable","name":"feeReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"},{"internalType":"uint256[3]","name":"_max","type":"uint256[3]"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"addWhitelistedUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"addWhitelistedUsers","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":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"enableDisableMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfWhitelistedUsers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"endIndex","type":"uint256"}],"name":"getWhitelistedUsers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isUserWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWhitelistMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"removeWhitelistedUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"removeWhitelistedUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_adr","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"safeMint","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":"uint256","name":"_max","type":"uint256"}],"name":"setMaxPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newcost","type":"uint256"}],"name":"setPublicCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"setPublicTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newcost","type":"uint256"}],"name":"setWhitelistCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"setWhitelistTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_whitelist","type":"bool"}],"name":"setWhitelisting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useWhitelisting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260405180602001604052806000815250600a908162000024919062000e5d565b5060405180602001604052806000815250600b908162000045919062000e5d565b50604051620076b5380380620076b583398181016040528101906200006b91906200141f565b836040518060400160405280600381526020017f4e46540000000000000000000000000000000000000000000000000000000000815250733cc6cdda760b79bafa08df41ecfa224f810dceb660018c8c8160009081620000cc919062000e5d565b508060019081620000de919062000e5d565b50505062000101620000f56200088760201b60201c565b6200088f60201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620002f6578015620001bc576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200018292919062001583565b600060405180830381600087803b1580156200019d57600080fd5b505af1158015620001b2573d6000803e3d6000fd5b50505050620002f5565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000276576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200023c92919062001583565b600060405180830381600087803b1580156200025757600080fd5b505af11580156200026c573d6000803e3d6000fd5b50505050620002f4565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002bf9190620015b0565b600060405180830381600087803b158015620002da57600080fd5b505af1158015620002ef573d6000803e3d6000fd5b505050505b5b5b50508173ffffffffffffffffffffffffffffffffffffffff16632b66d72e34836040518363ffffffff1660e01b81526004016200033491906200161f565b6000604051808303818588803b1580156200034e57600080fd5b505af115801562000363573d6000803e3d6000fd5b50505050505050428560026004811062000382576200038162001643565b5b6020020151118015620003b05750600085600260048110620003a957620003a862001643565b5b6020020151115b8015620003d85750600085600360048110620003d157620003d062001643565b5b6020020151115b80156200041a575084600360048110620003f757620003f662001643565b5b60200201518560026004811062000413576200041262001643565b5b6020020151105b6200045c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004539062001734565b60405180910390fd5b8615620006985742856000600481106200047b576200047a62001643565b5b6020020151118015620004a95750600085600060048110620004a257620004a162001643565b5b6020020151115b8015620004d15750600085600160048110620004ca57620004c962001643565b5b6020020151115b801562000513575084600160048110620004f057620004ef62001643565b5b6020020151856000600481106200050c576200050b62001643565b5b6020020151105b62000555576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200054c9062001818565b60405180910390fd5b846002600481106200056c576200056b62001643565b5b60200201518560006004811062000588576200058762001643565b5b6020020151108015620005d0575084600360048110620005ad57620005ac62001643565b5b602002015185600060048110620005c957620005c862001643565b5b6020020151105b801562000613575084600260048110620005ef57620005ee62001643565b5b6020020151856001600481106200060b576200060a62001643565b5b602002015111155b80156200065557508460036004811062000632576200063162001643565b5b6020020151856001600481106200064e576200064d62001643565b5b6020020151105b62000697576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200068e90620018d6565b60405180910390fd5b5b600082600060038110620006b157620006b062001643565b5b602002015111620006f9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006f0906200196e565b60405180910390fd5b6200071a6200070d6200095560201b60201c565b846200097f60201b60201c565b86601260016101000a81548160ff021916908315150217905550856000600281106200074b576200074a62001643565b5b6020020151600c81905550856001600281106200076d576200076c62001643565b5b6020020151600d81905550846000600481106200078f576200078e62001643565b5b6020020151600e8190555084600160048110620007b157620007b062001643565b5b6020020151600f8190555084600260048110620007d357620007d262001643565b5b602002015160108190555084600360048110620007f557620007f462001643565b5b60200201516011819055508160006003811062000817576200081662001643565b5b60200201516018819055508160016003811062000839576200083862001643565b5b6020020151601a81905550816002600381106200085b576200085a62001643565b5b602002015160198190555080600a908162000877919062000e5d565b5050505050505050505062001b0c565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200098f620009a560201b60201c565b620009a1828262000a3660201b60201c565b5050565b620009b56200088760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620009db6200095560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000a34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a2b90620019e0565b60405180910390fd5b565b62000a4662000bd960201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000aa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a9e9062001a78565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000b19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b109062001aea565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600760008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c6557607f821691505b60208210810362000c7b5762000c7a62000c1d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000ce57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000ca6565b62000cf1868362000ca6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d3e62000d3862000d328462000d09565b62000d13565b62000d09565b9050919050565b6000819050919050565b62000d5a8362000d1d565b62000d7262000d698262000d45565b84845462000cb3565b825550505050565b600090565b62000d8962000d7a565b62000d9681848462000d4f565b505050565b5b8181101562000dbe5762000db260008262000d7f565b60018101905062000d9c565b5050565b601f82111562000e0d5762000dd78162000c81565b62000de28462000c96565b8101602085101562000df2578190505b62000e0a62000e018562000c96565b83018262000d9b565b50505b505050565b600082821c905092915050565b600062000e326000198460080262000e12565b1980831691505092915050565b600062000e4d838362000e1f565b9150826002028217905092915050565b62000e688262000be3565b67ffffffffffffffff81111562000e845762000e8362000bee565b5b62000e90825462000c4c565b62000e9d82828562000dc2565b600060209050601f83116001811462000ed5576000841562000ec0578287015190505b62000ecc858262000e3f565b86555062000f3c565b601f19841662000ee58662000c81565b60005b8281101562000f0f5784890151825560018201915060208501945060208101905062000ee8565b8683101562000f2f578489015162000f2b601f89168262000e1f565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000f7e8262000f62565b810181811067ffffffffffffffff8211171562000fa05762000f9f62000bee565b5b80604052505050565b600062000fb562000f44565b905062000fc3828262000f73565b919050565b600067ffffffffffffffff82111562000fe65762000fe562000bee565b5b62000ff18262000f62565b9050602081019050919050565b60005b838110156200101e57808201518184015260208101905062001001565b838111156200102e576000848401525b50505050565b60006200104b620010458462000fc8565b62000fa9565b9050828152602081018484840111156200106a576200106962000f5d565b5b6200107784828562000ffe565b509392505050565b600082601f83011262001097576200109662000f58565b5b8151620010a984826020860162001034565b91505092915050565b60008115159050919050565b620010c981620010b2565b8114620010d557600080fd5b50565b600081519050620010e981620010be565b92915050565b600067ffffffffffffffff8211156200110d576200110c62000bee565b5b602082029050919050565b600080fd5b620011288162000d09565b81146200113457600080fd5b50565b60008151905062001148816200111d565b92915050565b6000620011656200115f84620010ef565b62000fa9565b9050806020840283018581111562001182576200118162001118565b5b835b81811015620011af57806200119a888262001137565b84526020840193505060208101905062001184565b5050509392505050565b600082601f830112620011d157620011d062000f58565b5b6002620011e08482856200114e565b91505092915050565b600067ffffffffffffffff82111562001207576200120662000bee565b5b602082029050919050565b6000620012296200122384620011e9565b62000fa9565b9050806020840283018581111562001246576200124562001118565b5b835b818110156200127357806200125e888262001137565b84526020840193505060208101905062001248565b5050509392505050565b600082601f83011262001295576200129462000f58565b5b6004620012a484828562001212565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620012da82620012ad565b9050919050565b620012ec81620012cd565b8114620012f857600080fd5b50565b6000815190506200130c81620012e1565b92915050565b60006bffffffffffffffffffffffff82169050919050565b620013358162001312565b81146200134157600080fd5b50565b60008151905062001355816200132a565b92915050565b600067ffffffffffffffff82111562001379576200137862000bee565b5b602082029050919050565b60006200139b62001395846200135b565b62000fa9565b90508060208402830185811115620013b857620013b762001118565b5b835b81811015620013e55780620013d0888262001137565b845260208401935050602081019050620013ba565b5050509392505050565b600082601f83011262001407576200140662000f58565b5b60036200141684828562001384565b91505092915050565b60008060008060008060008060006101e08a8c03121562001445576200144462000f4e565b5b60008a015167ffffffffffffffff81111562001466576200146562000f53565b5b620014748c828d016200107f565b99505060208a015167ffffffffffffffff81111562001498576200149762000f53565b5b620014a68c828d016200107f565b9850506040620014b98c828d01620010d8565b9750506060620014cc8c828d01620011b9565b96505060a0620014df8c828d016200127d565b955050610120620014f38c828d01620012fb565b945050610140620015078c828d0162001344565b9350506101606200151b8c828d01620013ef565b9250506101c08a015167ffffffffffffffff81111562001540576200153f62000f53565b5b6200154e8c828d016200107f565b9150509295985092959850929598565b60006200156b82620012ad565b9050919050565b6200157d816200155e565b82525050565b60006040820190506200159a600083018562001572565b620015a9602083018462001572565b9392505050565b6000602082019050620015c7600083018462001572565b92915050565b600082825260208201905092915050565b6000620015eb8262000be3565b620015f78185620015cd565b93506200160981856020860162000ffe565b620016148162000f62565b840191505092915050565b600060208201905081810360008301526200163b8184620015de565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f7075626c69632073616c652073746172742074696d6520616e6420656e64207460008201527f696d65206d7573742062652067726561746572207468656e2063757272656e7460208201527f2074696d6520616e642073746172742074696d65206d7573742062652067726560408201527f61746572207468656e20656e642074696d650000000000000000000000000000606082015250565b60006200171c607283620015cd565b9150620017298262001672565b608082019050919050565b600060208201905081810360008301526200174f816200170d565b9050919050565b7f77686974656c6973742073746172742074696d6520616e6420656e642074696d60008201527f65206d7573742062652067726561746572207468656e2063757272656e74207460208201527f696d6520616e642073746172742074696d65206d75737420626520677265617460408201527f6572207468656e20656e642074696d6500000000000000000000000000000000606082015250565b600062001800607083620015cd565b91506200180d8262001756565b608082019050919050565b600060208201905081810360008301526200183381620017f1565b9050919050565b7f7075626c69632073616c652073746172742074696d6520616e6420656e64207460008201527f696d65206d7573742062652067726561746572207468656e2077686974656c6960208201527f73742074696d652e000000000000000000000000000000000000000000000000604082015250565b6000620018be604883620015cd565b9150620018cb826200183a565b606082019050919050565b60006020820190508181036000830152620018f181620018af565b9050919050565b7f537570706c79206d7573742062652067726561746572207468656e207a65726f60008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b600062001956602183620015cd565b91506200196382620018f8565b604082019050919050565b60006020820190508181036000830152620019898162001947565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620019c8602083620015cd565b9150620019d58262001990565b602082019050919050565b60006020820190508181036000830152620019fb81620019b9565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062001a60602a83620015cd565b915062001a6d8262001a02565b604082019050919050565b6000602082019050818103600083015262001a938162001a51565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062001ad2601983620015cd565b915062001adf8262001a9a565b602082019050919050565b6000602082019050818103600083015262001b058162001ac3565b9050919050565b615b998062001b1c6000396000f3fe6080604052600436106103395760003560e01c80637ec4a659116101ab578063b88d4fde116100f7578063e7b99ec711610095578063eff42f2e1161006f578063eff42f2e14610bb5578063f0bc347414610bde578063f2fde38b14610c1b578063fb237eb214610c4457610340565b8063e7b99ec714610b22578063e985e9c514610b4d578063ebdfd72214610b8a57610340565b8063d49479eb116100d1578063d49479eb14610a8c578063d5abeb0114610ab5578063d9128c8514610ae0578063e6b2603b14610b0b57610340565b8063b88d4fde146109fb578063c87b56dd14610a24578063cabadaa014610a6157610340565b806395d89b4111610164578063a22cb4651161013e578063a22cb46514610955578063b231e25d1461097e578063b36f7001146109a7578063b7b1b8e9146109d257610340565b806395d89b41146108e5578063a0712d6814610910578063a14481941461092c57610340565b80637ec4a659146107e9578063811d24371461081257806383c5c3891461083b5780638693da20146108645780638da5cb5b1461088f5780639292caaf146108ba57610340565b80633ccfd60b1161028557806362b99ad4116102235780636f8b44b0116101fd5780636f8b44b01461074357806370a082311461076c578063715018a6146107a957806371978011146107c057610340565b806362b99ad4146106b25780636352211e146106dd5780636496d3fc1461071a57610340565b80635503a0e81161025f5780635503a0e8146106085780635af5f7ba146106335780635c975abb1461065c5780635fd1bbc41461068757610340565b80633ccfd60b1461059f57806342842e0e146105b6578063430ed75d146105df57610340565b806318160ddd116102f25780632a55205a116102cc5780632a55205a146104e25780632c27e581146105205780633005a7901461054b578063309a36861461057457610340565b806318160ddd1461046557806323b872dd14610490578063270ab52c146104b957610340565b806301ffc9a71461034557806302fa7c471461038257806306fdde03146103ab578063081812fc146103d6578063095ea7b31461041357806316ba10e01461043c57610340565b3661034057005b600080fd5b34801561035157600080fd5b5061036c60048036038101906103679190613d53565b610c81565b6040516103799190613d9b565b60405180910390f35b34801561038e57600080fd5b506103a960048036038101906103a49190613e58565b610c93565b005b3480156103b757600080fd5b506103c0610ca9565b6040516103cd9190613f31565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f89190613f89565b610d3b565b60405161040a9190613fc5565b60405180910390f35b34801561041f57600080fd5b5061043a60048036038101906104359190613fe0565b610d81565b005b34801561044857600080fd5b50610463600480360381019061045e9190614155565b610e98565b005b34801561047157600080fd5b5061047a610eb3565b60405161048791906141ad565b60405180910390f35b34801561049c57600080fd5b506104b760048036038101906104b291906141c8565b610ebd565b005b3480156104c557600080fd5b506104e060048036038101906104db9190613f89565b610fc9565b005b3480156104ee57600080fd5b506105096004803603810190610504919061421b565b610fdb565b60405161051792919061425b565b60405180910390f35b34801561052c57600080fd5b506105356111c5565b60405161054291906141ad565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d91906142b0565b6111cb565b005b34801561058057600080fd5b506105896111f0565b60405161059691906141ad565b60405180910390f35b3480156105ab57600080fd5b506105b46111f6565b005b3480156105c257600080fd5b506105dd60048036038101906105d891906141c8565b61127e565b005b3480156105eb57600080fd5b506106066004803603810190610601919061421b565b61138a565b005b34801561061457600080fd5b5061061d6113a4565b60405161062a9190613f31565b60405180910390f35b34801561063f57600080fd5b5061065a600480360381019061065591906142b0565b611432565b005b34801561066857600080fd5b50610671611457565b60405161067e9190613d9b565b60405180910390f35b34801561069357600080fd5b5061069c61146a565b6040516106a991906141ad565b60405180910390f35b3480156106be57600080fd5b506106c7611470565b6040516106d49190613f31565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff9190613f89565b6114fe565b6040516107119190613fc5565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c91906143a5565b611584565b005b34801561074f57600080fd5b5061076a60048036038101906107659190613f89565b6115cc565b005b34801561077857600080fd5b50610793600480360381019061078e91906143ee565b6115de565b6040516107a091906141ad565b60405180910390f35b3480156107b557600080fd5b506107be611695565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190613f89565b6116a9565b005b3480156107f557600080fd5b50610810600480360381019061080b9190614155565b6116bb565b005b34801561081e57600080fd5b5061083960048036038101906108349190613f89565b6116d6565b005b34801561084757600080fd5b50610862600480360381019061085d919061421b565b6116e8565b005b34801561087057600080fd5b50610879611702565b60405161088691906141ad565b60405180910390f35b34801561089b57600080fd5b506108a4611708565b6040516108b19190613fc5565b60405180910390f35b3480156108c657600080fd5b506108cf611732565b6040516108dc91906141ad565b60405180910390f35b3480156108f157600080fd5b506108fa611738565b6040516109079190613f31565b60405180910390f35b61092a60048036038101906109259190613f89565b6117ca565b005b34801561093857600080fd5b50610953600480360381019061094e9190613fe0565b611d2a565b005b34801561096157600080fd5b5061097c6004803603810190610977919061441b565b611d99565b005b34801561098a57600080fd5b506109a560048036038101906109a091906143ee565b611daf565b005b3480156109b357600080fd5b506109bc611dbd565b6040516109c99190613d9b565b60405180910390f35b3480156109de57600080fd5b506109f960048036038101906109f491906143ee565b611dd0565b005b348015610a0757600080fd5b50610a226004803603810190610a1d91906144fc565b611dde565b005b348015610a3057600080fd5b50610a4b6004803603810190610a469190613f89565b611eec565b604051610a589190613f31565b60405180910390f35b348015610a6d57600080fd5b50610a76611ff5565b604051610a8391906141ad565b60405180910390f35b348015610a9857600080fd5b50610ab36004803603810190610aae9190613f89565b611ffb565b005b348015610ac157600080fd5b50610aca61200d565b604051610ad791906141ad565b60405180910390f35b348015610aec57600080fd5b50610af5612013565b604051610b0291906141ad565b60405180910390f35b348015610b1757600080fd5b50610b20612024565b005b348015610b2e57600080fd5b50610b376120a5565b604051610b4491906141ad565b60405180910390f35b348015610b5957600080fd5b50610b746004803603810190610b6f919061457f565b6120ab565b604051610b819190613d9b565b60405180910390f35b348015610b9657600080fd5b50610b9f61213f565b604051610bac91906141ad565b60405180910390f35b348015610bc157600080fd5b50610bdc6004803603810190610bd791906143a5565b612145565b005b348015610bea57600080fd5b50610c056004803603810190610c00919061421b565b61218d565b604051610c12919061467d565b60405180910390f35b348015610c2757600080fd5b50610c426004803603810190610c3d91906143ee565b6122be565b005b348015610c5057600080fd5b50610c6b6004803603810190610c6691906143ee565b612341565b604051610c789190613d9b565b60405180910390f35b6000610c8c826123b6565b9050919050565b610c9b612430565b610ca582826124ae565b5050565b606060008054610cb8906146ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce4906146ce565b8015610d315780601f10610d0657610100808354040283529160200191610d31565b820191906000526020600020905b815481529060010190602001808311610d1457829003601f168201915b5050505050905090565b6000610d4682612643565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d8c826114fe565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390614771565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e1b61268e565b73ffffffffffffffffffffffffffffffffffffffff161480610e4a5750610e4981610e4461268e565b6120ab565b5b610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8090614803565b60405180910390fd5b610e938383612696565b505050565b610ea0612430565b80600b9081610eaf91906149cf565b5050565b6000600954905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fb9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f34929190614aa1565b6020604051808303816000875af1158015610f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f779190614adf565b610fb857336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610faf9190613fc5565b60405180910390fd5b5b610fc483838361274f565b505050565b610fd1612430565b8060198190555050565b6000806000600860008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036111705760076040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b600061117a6127af565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866111a69190614b3b565b6111b09190614bc4565b90508160000151819350935050509250929050565b60115481565b6111d3612430565b80601260006101000a81548160ff02191690831515021790555050565b601a5481565b6111fe612430565b6000611208611708565b73ffffffffffffffffffffffffffffffffffffffff164760405161122b90614c26565b60006040518083038185875af1925050503d8060008114611268576040519150601f19603f3d011682016040523d82523d6000602084013e61126d565b606091505b505090508061127b57600080fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561137a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016112f5929190614aa1565b6020604051808303816000875af1158015611314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113389190614adf565b61137957336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016113709190613fc5565b60405180910390fd5b5b6113858383836127b9565b505050565b611392612430565b81600e8190555080600f819055505050565b600b80546113b1906146ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113dd906146ce565b801561142a5780601f106113ff5761010080835404028352916020019161142a565b820191906000526020600020905b81548152906001019060200180831161140d57829003601f168201915b505050505081565b61143a612430565b80601260016101000a81548160ff02191690831515021790555050565b601260009054906101000a900460ff1681565b60105481565b600a805461147d906146ce565b80601f01602080910402602001604051908101604052809291908181526020018280546114a9906146ce565b80156114f65780601f106114cb576101008083540402835291602001916114f6565b820191906000526020600020905b8154815290600101906020018083116114d957829003601f168201915b505050505081565b60008061150a836127d9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361157b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157290614c87565b60405180910390fd5b80915050919050565b60005b81518110156115c8576115b58282815181106115a6576115a5614ca7565b5b60200260200101516001612816565b80806115c090614cd6565b915050611587565b5050565b6115d4612430565b8060188190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361164e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164590614d90565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61169d612430565b6116a7600061298a565b565b6116b1612430565b80601a8190555050565b6116c3612430565b80600a90816116d291906149cf565b5050565b6116de612430565b80600c8190555050565b6116f0612430565b81601081905550806011819055505050565b600c5481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b606060018054611747906146ce565b80601f0160208091040260200160405190810160405280929190818152602001828054611773906146ce565b80156117c05780601f10611795576101008083540402835291602001916117c0565b820191906000526020600020905b8154815290600101906020018083116117a357829003601f168201915b5050505050905090565b80601854816117d7610eb3565b6117e19190614db0565b1115611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614e52565b60405180910390fd5b81601260019054906101000a900460ff1680156118415750600e544210155b801561184f5750600f544211155b15611a1a57601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790614ee4565b60405180910390fd5b80600d546118ee9190614b3b565b341015611930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192790614f50565b60405180910390fd5b80601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461197b9190614db0565b601a5410156119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690614fe2565b60405180910390fd5b80601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a0e9190614db0565b92505081905550611ba9565b6010544210158015611a2e57506011544211155b15611b6d5780601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a7e9190614db0565b6019541015611ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab990614fe2565b60405180910390fd5b80600c54611ad09190614b3b565b341015611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0990614f50565b60405180910390fd5b80601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b619190614db0565b92505081905550611ba8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9f90615074565b60405180910390fd5b5b601260009054906101000a900460ff1615611bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf0906150e0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e9061514c565b60405180910390fd5b6000611c71611708565b73ffffffffffffffffffffffffffffffffffffffff1634604051611c9490614c26565b60006040518083038185875af1925050503d8060008114611cd1576040519150601f19603f3d011682016040523d82523d6000602084013e611cd6565b606091505b5050905080611d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d11906151b8565b60405180910390fd5b611d243385612a50565b50505050565b8060185481611d37610eb3565b611d419190614db0565b1115611d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7990614e52565b60405180910390fd5b611d8a612430565b611d948383612a50565b505050565b611dab611da461268e565b8383612a94565b5050565b611dba816001612816565b50565b601260019054906101000a900460ff1681565b611ddb816000612816565b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611eda576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611e55929190614aa1565b6020604051808303816000875af1158015611e74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e989190614adf565b611ed957336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ed09190613fc5565b60405180910390fd5b5b611ee684848484612c00565b50505050565b6060611ef782612c62565b611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d9061524a565b60405180910390fd5b6000611f40612ca3565b90506000600b8054611f51906146ce565b90501115611fad576000815111611f775760405180602001604052806000815250611fa5565b80611f8184612d35565b600b604051602001611f9593929190615329565b6040516020818303038152906040525b915050611ff0565b6000815111611fcb5760405180602001604052806000815250611fec565b80604051602001611fdc919061535a565b6040516020818303038152906040525b9150505b919050565b60195481565b612003612430565b80600d8190555050565b60185481565b600061201f6013612e03565b905090565b61202c612430565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161205290614c26565b60006040518083038185875af1925050503d806000811461208f576040519150601f19603f3d011682016040523d82523d6000602084013e612094565b606091505b50509050806120a257600080fd5b50565b600d5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f5481565b60005b81518110156121895761217682828151811061216757612166614ca7565b5b60200260200101516000612816565b808061218190614cd6565b915050612148565b5050565b60606121996013612e03565b82106121b85760016121ab6013612e03565b6121b59190615371565b91505b6000600184846121c89190615371565b6121d29190614db0565b905060008167ffffffffffffffff8111156121f0576121ef61402a565b5b60405190808252806020026020018201604052801561221e5781602001602082028036833780820191505090505b5090506000808690505b8581116122b157612243816013612e1890919063ffffffff16565b83838151811061225657612255614ca7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050818061229b90614cd6565b92505080806122a990614cd6565b915050612228565b5081935050505092915050565b6122c6612430565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232c90615417565b60405180910390fd5b61233e8161298a565b50565b6000601260019054906101000a900460ff16156123ac57601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506123b1565b600190505b919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612429575061242882612e32565b5b9050919050565b61243861268e565b73ffffffffffffffffffffffffffffffffffffffff16612456611708565b73ffffffffffffffffffffffffffffffffffffffff16146124ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a390615483565b60405180910390fd5b565b6124b66127af565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250b90615515565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257a90615581565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600760008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b61264c81612c62565b61268b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268290614c87565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612709836114fe565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61276061275a61268e565b82612f14565b61279f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279690615613565b60405180910390fd5b6127aa838383612fa9565b505050565b6000612710905090565b6127d483838360405180602001604052806000815250611dde565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61281e612430565b601260019054906101000a900460ff1661286d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612864906156a5565b60405180910390fd5b80156128fe576128878260136132a290919063ffffffff16565b6128f95761289f8260136132d290919063ffffffff16565b506001601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b612986565b6129128260136132a290919063ffffffff16565b156129855761292b82601361330290919063ffffffff16565b506000601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b81811015612a8f576001600954612a6a9190614db0565b600981905550612a7c83600954613332565b8080612a8790614cd6565b915050612a53565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af990615711565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612bf39190613d9b565b60405180910390a3505050565b612c11612c0b61268e565b83612f14565b612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4790615613565b60405180910390fd5b612c5c84848484613350565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612c84836127d9565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600a8054612cb2906146ce565b80601f0160208091040260200160405190810160405280929190818152602001828054612cde906146ce565b8015612d2b5780601f10612d0057610100808354040283529160200191612d2b565b820191906000526020600020905b815481529060010190602001808311612d0e57829003601f168201915b5050505050905090565b606060006001612d44846133ac565b01905060008167ffffffffffffffff811115612d6357612d6261402a565b5b6040519080825280601f01601f191660200182016040528015612d955781602001600182028036833780820191505090505b509050600082602001820190505b600115612df8578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612dec57612deb614b95565b5b04945060008503612da3575b819350505050919050565b6000612e11826000016134ff565b9050919050565b6000612e278360000183613510565b60001c905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612efd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f0d5750612f0c82613584565b5b9050919050565b600080612f20836114fe565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f625750612f6181856120ab565b5b80612fa057508373ffffffffffffffffffffffffffffffffffffffff16612f8884610d3b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612fc9826114fe565b73ffffffffffffffffffffffffffffffffffffffff161461301f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613016906157a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361308e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308590615835565b60405180910390fd5b61309b83838360016135ee565b8273ffffffffffffffffffffffffffffffffffffffff166130bb826114fe565b73ffffffffffffffffffffffffffffffffffffffff1614613111576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613108906157a3565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461329d8383836001613714565b505050565b60006132ca836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61371a565b905092915050565b60006132fa836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61373d565b905092915050565b600061332a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6137ad565b905092915050565b61334c8282604051806020016040528060008152506138c5565b5050565b61335b848484612fa9565b61336784848484613920565b6133a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339d906158c7565b60405180910390fd5b50505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061340a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613400576133ff614b95565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613447576d04ee2d6d415b85acef8100000000838161343d5761343c614b95565b5b0492506020810190505b662386f26fc10000831061347657662386f26fc10000838161346c5761346b614b95565b5b0492506010810190505b6305f5e100831061349f576305f5e100838161349557613494614b95565b5b0492506008810190505b61271083106134c45761271083816134ba576134b9614b95565b5b0492506004810190505b606483106134e757606483816134dd576134dc614b95565b5b0492506002810190505b600a83106134f6576001810190505b80915050919050565b600081600001805490509050919050565b60008183600001805490501161355b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355290615959565b60405180910390fd5b82600001828154811061357157613570614ca7565b5b9060005260206000200154905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600181111561370e57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146136825780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461367a9190615371565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461370d5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137059190614db0565b925050819055505b5b50505050565b50505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000613749838361371a565b6137a25782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506137a7565b600090505b92915050565b600080836001016000848152602001908152602001600020549050600081146138b95760006001826137df9190615371565b90506000600186600001805490506137f79190615371565b9050600086600001828154811061381157613810614ca7565b5b906000526020600020015490508087600001848154811061383557613834614ca7565b5b90600052602060002001819055506001836138509190614db0565b876001016000838152602001908152602001600020819055508660000180548061387d5761387c615979565b5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506138bf565b60009150505b92915050565b6138cf8383613aa7565b6138dc6000848484613920565b61391b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613912906158c7565b60405180910390fd5b505050565b60006139418473ffffffffffffffffffffffffffffffffffffffff16613cc4565b15613a9a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261396a61268e565b8786866040518563ffffffff1660e01b815260040161398c94939291906159fd565b6020604051808303816000875af19250505080156139c857506040513d601f19601f820116820180604052508101906139c59190615a5e565b60015b613a4a573d80600081146139f8576040519150601f19603f3d011682016040523d82523d6000602084013e6139fd565b606091505b506000815103613a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a39906158c7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a9f565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0d90615ad7565b60405180910390fd5b613b1f81612c62565b15613b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b5690615b43565b60405180910390fd5b613b6d6000838360016135ee565b613b7681612c62565b15613bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bad90615b43565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613cc0600083836001613714565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613d3081613cfb565b8114613d3b57600080fd5b50565b600081359050613d4d81613d27565b92915050565b600060208284031215613d6957613d68613cf1565b5b6000613d7784828501613d3e565b91505092915050565b60008115159050919050565b613d9581613d80565b82525050565b6000602082019050613db06000830184613d8c565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613de182613db6565b9050919050565b613df181613dd6565b8114613dfc57600080fd5b50565b600081359050613e0e81613de8565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613e3581613e14565b8114613e4057600080fd5b50565b600081359050613e5281613e2c565b92915050565b60008060408385031215613e6f57613e6e613cf1565b5b6000613e7d85828601613dff565b9250506020613e8e85828601613e43565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ed2578082015181840152602081019050613eb7565b83811115613ee1576000848401525b50505050565b6000601f19601f8301169050919050565b6000613f0382613e98565b613f0d8185613ea3565b9350613f1d818560208601613eb4565b613f2681613ee7565b840191505092915050565b60006020820190508181036000830152613f4b8184613ef8565b905092915050565b6000819050919050565b613f6681613f53565b8114613f7157600080fd5b50565b600081359050613f8381613f5d565b92915050565b600060208284031215613f9f57613f9e613cf1565b5b6000613fad84828501613f74565b91505092915050565b613fbf81613dd6565b82525050565b6000602082019050613fda6000830184613fb6565b92915050565b60008060408385031215613ff757613ff6613cf1565b5b600061400585828601613dff565b925050602061401685828601613f74565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61406282613ee7565b810181811067ffffffffffffffff821117156140815761408061402a565b5b80604052505050565b6000614094613ce7565b90506140a08282614059565b919050565b600067ffffffffffffffff8211156140c0576140bf61402a565b5b6140c982613ee7565b9050602081019050919050565b82818337600083830152505050565b60006140f86140f3846140a5565b61408a565b90508281526020810184848401111561411457614113614025565b5b61411f8482856140d6565b509392505050565b600082601f83011261413c5761413b614020565b5b813561414c8482602086016140e5565b91505092915050565b60006020828403121561416b5761416a613cf1565b5b600082013567ffffffffffffffff81111561418957614188613cf6565b5b61419584828501614127565b91505092915050565b6141a781613f53565b82525050565b60006020820190506141c2600083018461419e565b92915050565b6000806000606084860312156141e1576141e0613cf1565b5b60006141ef86828701613dff565b935050602061420086828701613dff565b925050604061421186828701613f74565b9150509250925092565b6000806040838503121561423257614231613cf1565b5b600061424085828601613f74565b925050602061425185828601613f74565b9150509250929050565b60006040820190506142706000830185613fb6565b61427d602083018461419e565b9392505050565b61428d81613d80565b811461429857600080fd5b50565b6000813590506142aa81614284565b92915050565b6000602082840312156142c6576142c5613cf1565b5b60006142d48482850161429b565b91505092915050565b600067ffffffffffffffff8211156142f8576142f761402a565b5b602082029050602081019050919050565b600080fd5b600061432161431c846142dd565b61408a565b9050808382526020820190506020840283018581111561434457614343614309565b5b835b8181101561436d57806143598882613dff565b845260208401935050602081019050614346565b5050509392505050565b600082601f83011261438c5761438b614020565b5b813561439c84826020860161430e565b91505092915050565b6000602082840312156143bb576143ba613cf1565b5b600082013567ffffffffffffffff8111156143d9576143d8613cf6565b5b6143e584828501614377565b91505092915050565b60006020828403121561440457614403613cf1565b5b600061441284828501613dff565b91505092915050565b6000806040838503121561443257614431613cf1565b5b600061444085828601613dff565b92505060206144518582860161429b565b9150509250929050565b600067ffffffffffffffff8211156144765761447561402a565b5b61447f82613ee7565b9050602081019050919050565b600061449f61449a8461445b565b61408a565b9050828152602081018484840111156144bb576144ba614025565b5b6144c68482856140d6565b509392505050565b600082601f8301126144e3576144e2614020565b5b81356144f384826020860161448c565b91505092915050565b6000806000806080858703121561451657614515613cf1565b5b600061452487828801613dff565b945050602061453587828801613dff565b935050604061454687828801613f74565b925050606085013567ffffffffffffffff81111561456757614566613cf6565b5b614573878288016144ce565b91505092959194509250565b6000806040838503121561459657614595613cf1565b5b60006145a485828601613dff565b92505060206145b585828601613dff565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6145f481613dd6565b82525050565b600061460683836145eb565b60208301905092915050565b6000602082019050919050565b600061462a826145bf565b61463481856145ca565b935061463f836145db565b8060005b8381101561467057815161465788826145fa565b975061466283614612565b925050600181019050614643565b5085935050505092915050565b60006020820190508181036000830152614697818461461f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806146e657607f821691505b6020821081036146f9576146f861469f565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061475b602183613ea3565b9150614766826146ff565b604082019050919050565b6000602082019050818103600083015261478a8161474e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006147ed603d83613ea3565b91506147f882614791565b604082019050919050565b6000602082019050818103600083015261481c816147e0565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026148857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614848565b61488f8683614848565b95508019841693508086168417925050509392505050565b6000819050919050565b60006148cc6148c76148c284613f53565b6148a7565b613f53565b9050919050565b6000819050919050565b6148e6836148b1565b6148fa6148f2826148d3565b848454614855565b825550505050565b600090565b61490f614902565b61491a8184846148dd565b505050565b5b8181101561493e57614933600082614907565b600181019050614920565b5050565b601f8211156149835761495481614823565b61495d84614838565b8101602085101561496c578190505b61498061497885614838565b83018261491f565b50505b505050565b600082821c905092915050565b60006149a660001984600802614988565b1980831691505092915050565b60006149bf8383614995565b9150826002028217905092915050565b6149d882613e98565b67ffffffffffffffff8111156149f1576149f061402a565b5b6149fb82546146ce565b614a06828285614942565b600060209050601f831160018114614a395760008415614a27578287015190505b614a3185826149b3565b865550614a99565b601f198416614a4786614823565b60005b82811015614a6f57848901518255600182019150602085019450602081019050614a4a565b86831015614a8c5784890151614a88601f891682614995565b8355505b6001600288020188555050505b505050505050565b6000604082019050614ab66000830185613fb6565b614ac36020830184613fb6565b9392505050565b600081519050614ad981614284565b92915050565b600060208284031215614af557614af4613cf1565b5b6000614b0384828501614aca565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b4682613f53565b9150614b5183613f53565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b8a57614b89614b0c565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614bcf82613f53565b9150614bda83613f53565b925082614bea57614be9614b95565b5b828204905092915050565b600081905092915050565b50565b6000614c10600083614bf5565b9150614c1b82614c00565b600082019050919050565b6000614c3182614c03565b9150819050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614c71601883613ea3565b9150614c7c82614c3b565b602082019050919050565b60006020820190508181036000830152614ca081614c64565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614ce182613f53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614d1357614d12614b0c565b5b600182019050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614d7a602983613ea3565b9150614d8582614d1e565b604082019050919050565b60006020820190508181036000830152614da981614d6d565b9050919050565b6000614dbb82613f53565b9150614dc683613f53565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614dfb57614dfa614b0c565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000614e3c601483613ea3565b9150614e4782614e06565b602082019050919050565b60006020820190508181036000830152614e6b81614e2f565b9050919050565b7f61646472657373206973206e6f742077686974656c6973746564202c7761697460008201527f20666f72207075626c69632073616c652073746172742e000000000000000000602082015250565b6000614ece603783613ea3565b9150614ed982614e72565b604082019050919050565b60006020820190508181036000830152614efd81614ec1565b9050919050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614f3a601383613ea3565b9150614f4582614f04565b602082019050919050565b60006020820190508181036000830152614f6981614f2d565b9050919050565b7f796f75206861766520616c72656164792072656163686564206d6178696d756d60008201527f20616d6f756e742e000000000000000000000000000000000000000000000000602082015250565b6000614fcc602883613ea3565b9150614fd782614f70565b604082019050919050565b60006020820190508181036000830152614ffb81614fbf565b9050919050565b7f6d696e7420706572696f64206973206e6f7420737461727420796574206f722060008201527f6f7665722e000000000000000000000000000000000000000000000000000000602082015250565b600061505e602583613ea3565b915061506982615002565b604082019050919050565b6000602082019050818103600083015261508d81615051565b9050919050565b7f4d696e7420506175736564212100000000000000000000000000000000000000600082015250565b60006150ca600d83613ea3565b91506150d582615094565b602082019050919050565b600060208201905081810360008301526150f9816150bd565b9050919050565b7f4572726f723a20496e76616c69642043616c6c65722100000000000000000000600082015250565b6000615136601683613ea3565b915061514182615100565b602082019050919050565b6000602082019050818103600083015261516581615129565b9050919050565b7f66756e64206e6f74207472616e73666572212100000000000000000000000000600082015250565b60006151a2601383613ea3565b91506151ad8261516c565b602082019050919050565b600060208201905081810360008301526151d181615195565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615234602f83613ea3565b915061523f826151d8565b604082019050919050565b6000602082019050818103600083015261526381615227565b9050919050565b600081905092915050565b600061528082613e98565b61528a818561526a565b935061529a818560208601613eb4565b80840191505092915050565b600081546152b3816146ce565b6152bd818661526a565b945060018216600081146152d857600181146152ed57615320565b60ff1983168652811515820286019350615320565b6152f685614823565b60005b83811015615318578154818901526001820191506020810190506152f9565b838801955050505b50505092915050565b60006153358286615275565b91506153418285615275565b915061534d82846152a6565b9150819050949350505050565b60006153668284615275565b915081905092915050565b600061537c82613f53565b915061538783613f53565b92508282101561539a57615399614b0c565b5b828203905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615401602683613ea3565b915061540c826153a5565b604082019050919050565b60006020820190508181036000830152615430816153f4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061546d602083613ea3565b915061547882615437565b602082019050919050565b6000602082019050818103600083015261549c81615460565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006154ff602a83613ea3565b915061550a826154a3565b604082019050919050565b6000602082019050818103600083015261552e816154f2565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600061556b601983613ea3565b915061557682615535565b602082019050919050565b6000602082019050818103600083015261559a8161555e565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006155fd602d83613ea3565b9150615608826155a1565b604082019050919050565b6000602082019050818103600083015261562c816155f0565b9050919050565b7f506f6f6c20646f6573206e6f74207573652077686974656c697374696e67206f60008201527f7074696f6e000000000000000000000000000000000000000000000000000000602082015250565b600061568f602583613ea3565b915061569a82615633565b604082019050919050565b600060208201905081810360008301526156be81615682565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006156fb601983613ea3565b9150615706826156c5565b602082019050919050565b6000602082019050818103600083015261572a816156ee565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061578d602583613ea3565b915061579882615731565b604082019050919050565b600060208201905081810360008301526157bc81615780565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061581f602483613ea3565b915061582a826157c3565b604082019050919050565b6000602082019050818103600083015261584e81615812565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006158b1603283613ea3565b91506158bc82615855565b604082019050919050565b600060208201905081810360008301526158e0816158a4565b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000615943602283613ea3565b915061594e826158e7565b604082019050919050565b6000602082019050818103600083015261597281615936565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006159cf826159a8565b6159d981856159b3565b93506159e9818560208601613eb4565b6159f281613ee7565b840191505092915050565b6000608082019050615a126000830187613fb6565b615a1f6020830186613fb6565b615a2c604083018561419e565b8181036060830152615a3e81846159c4565b905095945050505050565b600081519050615a5881613d27565b92915050565b600060208284031215615a7457615a73613cf1565b5b6000615a8284828501615a49565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615ac1602083613ea3565b9150615acc82615a8b565b602082019050919050565b60006020820190508181036000830152615af081615ab4565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615b2d601c83613ea3565b9150615b3882615af7565b602082019050919050565b60006020820190508181036000830152615b5c81615b20565b905091905056fea26469706673582212207e0dece74ff49e7d9adeffbf0248fc4733f6513285013ee331656c1e6340e2ec64736f6c634300080f003300000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064173f9000000000000000000000000000000000000000000000000000000000644199c0000000000000000000000000a4c1306d03c917097a8446baf67fa0f9353c08bb000000000000000000000000000000000000000000000000000000000000012c00000000000000000000000000000000000000000000000000000000000007080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000014426c6f636b53746172205465616d204265617273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000442535442000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5a61787a366537666e7044644143527452726574454b455657795267446a726538504b4d7362506d5870674b0000000000000000000000

Deployed Bytecode

0x6080604052600436106103395760003560e01c80637ec4a659116101ab578063b88d4fde116100f7578063e7b99ec711610095578063eff42f2e1161006f578063eff42f2e14610bb5578063f0bc347414610bde578063f2fde38b14610c1b578063fb237eb214610c4457610340565b8063e7b99ec714610b22578063e985e9c514610b4d578063ebdfd72214610b8a57610340565b8063d49479eb116100d1578063d49479eb14610a8c578063d5abeb0114610ab5578063d9128c8514610ae0578063e6b2603b14610b0b57610340565b8063b88d4fde146109fb578063c87b56dd14610a24578063cabadaa014610a6157610340565b806395d89b4111610164578063a22cb4651161013e578063a22cb46514610955578063b231e25d1461097e578063b36f7001146109a7578063b7b1b8e9146109d257610340565b806395d89b41146108e5578063a0712d6814610910578063a14481941461092c57610340565b80637ec4a659146107e9578063811d24371461081257806383c5c3891461083b5780638693da20146108645780638da5cb5b1461088f5780639292caaf146108ba57610340565b80633ccfd60b1161028557806362b99ad4116102235780636f8b44b0116101fd5780636f8b44b01461074357806370a082311461076c578063715018a6146107a957806371978011146107c057610340565b806362b99ad4146106b25780636352211e146106dd5780636496d3fc1461071a57610340565b80635503a0e81161025f5780635503a0e8146106085780635af5f7ba146106335780635c975abb1461065c5780635fd1bbc41461068757610340565b80633ccfd60b1461059f57806342842e0e146105b6578063430ed75d146105df57610340565b806318160ddd116102f25780632a55205a116102cc5780632a55205a146104e25780632c27e581146105205780633005a7901461054b578063309a36861461057457610340565b806318160ddd1461046557806323b872dd14610490578063270ab52c146104b957610340565b806301ffc9a71461034557806302fa7c471461038257806306fdde03146103ab578063081812fc146103d6578063095ea7b31461041357806316ba10e01461043c57610340565b3661034057005b600080fd5b34801561035157600080fd5b5061036c60048036038101906103679190613d53565b610c81565b6040516103799190613d9b565b60405180910390f35b34801561038e57600080fd5b506103a960048036038101906103a49190613e58565b610c93565b005b3480156103b757600080fd5b506103c0610ca9565b6040516103cd9190613f31565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f89190613f89565b610d3b565b60405161040a9190613fc5565b60405180910390f35b34801561041f57600080fd5b5061043a60048036038101906104359190613fe0565b610d81565b005b34801561044857600080fd5b50610463600480360381019061045e9190614155565b610e98565b005b34801561047157600080fd5b5061047a610eb3565b60405161048791906141ad565b60405180910390f35b34801561049c57600080fd5b506104b760048036038101906104b291906141c8565b610ebd565b005b3480156104c557600080fd5b506104e060048036038101906104db9190613f89565b610fc9565b005b3480156104ee57600080fd5b506105096004803603810190610504919061421b565b610fdb565b60405161051792919061425b565b60405180910390f35b34801561052c57600080fd5b506105356111c5565b60405161054291906141ad565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d91906142b0565b6111cb565b005b34801561058057600080fd5b506105896111f0565b60405161059691906141ad565b60405180910390f35b3480156105ab57600080fd5b506105b46111f6565b005b3480156105c257600080fd5b506105dd60048036038101906105d891906141c8565b61127e565b005b3480156105eb57600080fd5b506106066004803603810190610601919061421b565b61138a565b005b34801561061457600080fd5b5061061d6113a4565b60405161062a9190613f31565b60405180910390f35b34801561063f57600080fd5b5061065a600480360381019061065591906142b0565b611432565b005b34801561066857600080fd5b50610671611457565b60405161067e9190613d9b565b60405180910390f35b34801561069357600080fd5b5061069c61146a565b6040516106a991906141ad565b60405180910390f35b3480156106be57600080fd5b506106c7611470565b6040516106d49190613f31565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff9190613f89565b6114fe565b6040516107119190613fc5565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c91906143a5565b611584565b005b34801561074f57600080fd5b5061076a60048036038101906107659190613f89565b6115cc565b005b34801561077857600080fd5b50610793600480360381019061078e91906143ee565b6115de565b6040516107a091906141ad565b60405180910390f35b3480156107b557600080fd5b506107be611695565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190613f89565b6116a9565b005b3480156107f557600080fd5b50610810600480360381019061080b9190614155565b6116bb565b005b34801561081e57600080fd5b5061083960048036038101906108349190613f89565b6116d6565b005b34801561084757600080fd5b50610862600480360381019061085d919061421b565b6116e8565b005b34801561087057600080fd5b50610879611702565b60405161088691906141ad565b60405180910390f35b34801561089b57600080fd5b506108a4611708565b6040516108b19190613fc5565b60405180910390f35b3480156108c657600080fd5b506108cf611732565b6040516108dc91906141ad565b60405180910390f35b3480156108f157600080fd5b506108fa611738565b6040516109079190613f31565b60405180910390f35b61092a60048036038101906109259190613f89565b6117ca565b005b34801561093857600080fd5b50610953600480360381019061094e9190613fe0565b611d2a565b005b34801561096157600080fd5b5061097c6004803603810190610977919061441b565b611d99565b005b34801561098a57600080fd5b506109a560048036038101906109a091906143ee565b611daf565b005b3480156109b357600080fd5b506109bc611dbd565b6040516109c99190613d9b565b60405180910390f35b3480156109de57600080fd5b506109f960048036038101906109f491906143ee565b611dd0565b005b348015610a0757600080fd5b50610a226004803603810190610a1d91906144fc565b611dde565b005b348015610a3057600080fd5b50610a4b6004803603810190610a469190613f89565b611eec565b604051610a589190613f31565b60405180910390f35b348015610a6d57600080fd5b50610a76611ff5565b604051610a8391906141ad565b60405180910390f35b348015610a9857600080fd5b50610ab36004803603810190610aae9190613f89565b611ffb565b005b348015610ac157600080fd5b50610aca61200d565b604051610ad791906141ad565b60405180910390f35b348015610aec57600080fd5b50610af5612013565b604051610b0291906141ad565b60405180910390f35b348015610b1757600080fd5b50610b20612024565b005b348015610b2e57600080fd5b50610b376120a5565b604051610b4491906141ad565b60405180910390f35b348015610b5957600080fd5b50610b746004803603810190610b6f919061457f565b6120ab565b604051610b819190613d9b565b60405180910390f35b348015610b9657600080fd5b50610b9f61213f565b604051610bac91906141ad565b60405180910390f35b348015610bc157600080fd5b50610bdc6004803603810190610bd791906143a5565b612145565b005b348015610bea57600080fd5b50610c056004803603810190610c00919061421b565b61218d565b604051610c12919061467d565b60405180910390f35b348015610c2757600080fd5b50610c426004803603810190610c3d91906143ee565b6122be565b005b348015610c5057600080fd5b50610c6b6004803603810190610c6691906143ee565b612341565b604051610c789190613d9b565b60405180910390f35b6000610c8c826123b6565b9050919050565b610c9b612430565b610ca582826124ae565b5050565b606060008054610cb8906146ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce4906146ce565b8015610d315780601f10610d0657610100808354040283529160200191610d31565b820191906000526020600020905b815481529060010190602001808311610d1457829003601f168201915b5050505050905090565b6000610d4682612643565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d8c826114fe565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390614771565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e1b61268e565b73ffffffffffffffffffffffffffffffffffffffff161480610e4a5750610e4981610e4461268e565b6120ab565b5b610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8090614803565b60405180910390fd5b610e938383612696565b505050565b610ea0612430565b80600b9081610eaf91906149cf565b5050565b6000600954905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fb9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f34929190614aa1565b6020604051808303816000875af1158015610f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f779190614adf565b610fb857336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610faf9190613fc5565b60405180910390fd5b5b610fc483838361274f565b505050565b610fd1612430565b8060198190555050565b6000806000600860008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036111705760076040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b600061117a6127af565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866111a69190614b3b565b6111b09190614bc4565b90508160000151819350935050509250929050565b60115481565b6111d3612430565b80601260006101000a81548160ff02191690831515021790555050565b601a5481565b6111fe612430565b6000611208611708565b73ffffffffffffffffffffffffffffffffffffffff164760405161122b90614c26565b60006040518083038185875af1925050503d8060008114611268576040519150601f19603f3d011682016040523d82523d6000602084013e61126d565b606091505b505090508061127b57600080fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561137a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016112f5929190614aa1565b6020604051808303816000875af1158015611314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113389190614adf565b61137957336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016113709190613fc5565b60405180910390fd5b5b6113858383836127b9565b505050565b611392612430565b81600e8190555080600f819055505050565b600b80546113b1906146ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113dd906146ce565b801561142a5780601f106113ff5761010080835404028352916020019161142a565b820191906000526020600020905b81548152906001019060200180831161140d57829003601f168201915b505050505081565b61143a612430565b80601260016101000a81548160ff02191690831515021790555050565b601260009054906101000a900460ff1681565b60105481565b600a805461147d906146ce565b80601f01602080910402602001604051908101604052809291908181526020018280546114a9906146ce565b80156114f65780601f106114cb576101008083540402835291602001916114f6565b820191906000526020600020905b8154815290600101906020018083116114d957829003601f168201915b505050505081565b60008061150a836127d9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361157b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157290614c87565b60405180910390fd5b80915050919050565b60005b81518110156115c8576115b58282815181106115a6576115a5614ca7565b5b60200260200101516001612816565b80806115c090614cd6565b915050611587565b5050565b6115d4612430565b8060188190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361164e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164590614d90565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61169d612430565b6116a7600061298a565b565b6116b1612430565b80601a8190555050565b6116c3612430565b80600a90816116d291906149cf565b5050565b6116de612430565b80600c8190555050565b6116f0612430565b81601081905550806011819055505050565b600c5481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b606060018054611747906146ce565b80601f0160208091040260200160405190810160405280929190818152602001828054611773906146ce565b80156117c05780601f10611795576101008083540402835291602001916117c0565b820191906000526020600020905b8154815290600101906020018083116117a357829003601f168201915b5050505050905090565b80601854816117d7610eb3565b6117e19190614db0565b1115611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614e52565b60405180910390fd5b81601260019054906101000a900460ff1680156118415750600e544210155b801561184f5750600f544211155b15611a1a57601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790614ee4565b60405180910390fd5b80600d546118ee9190614b3b565b341015611930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192790614f50565b60405180910390fd5b80601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461197b9190614db0565b601a5410156119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690614fe2565b60405180910390fd5b80601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a0e9190614db0565b92505081905550611ba9565b6010544210158015611a2e57506011544211155b15611b6d5780601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a7e9190614db0565b6019541015611ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab990614fe2565b60405180910390fd5b80600c54611ad09190614b3b565b341015611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0990614f50565b60405180910390fd5b80601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b619190614db0565b92505081905550611ba8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9f90615074565b60405180910390fd5b5b601260009054906101000a900460ff1615611bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf0906150e0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e9061514c565b60405180910390fd5b6000611c71611708565b73ffffffffffffffffffffffffffffffffffffffff1634604051611c9490614c26565b60006040518083038185875af1925050503d8060008114611cd1576040519150601f19603f3d011682016040523d82523d6000602084013e611cd6565b606091505b5050905080611d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d11906151b8565b60405180910390fd5b611d243385612a50565b50505050565b8060185481611d37610eb3565b611d419190614db0565b1115611d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7990614e52565b60405180910390fd5b611d8a612430565b611d948383612a50565b505050565b611dab611da461268e565b8383612a94565b5050565b611dba816001612816565b50565b601260019054906101000a900460ff1681565b611ddb816000612816565b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611eda576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611e55929190614aa1565b6020604051808303816000875af1158015611e74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e989190614adf565b611ed957336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ed09190613fc5565b60405180910390fd5b5b611ee684848484612c00565b50505050565b6060611ef782612c62565b611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d9061524a565b60405180910390fd5b6000611f40612ca3565b90506000600b8054611f51906146ce565b90501115611fad576000815111611f775760405180602001604052806000815250611fa5565b80611f8184612d35565b600b604051602001611f9593929190615329565b6040516020818303038152906040525b915050611ff0565b6000815111611fcb5760405180602001604052806000815250611fec565b80604051602001611fdc919061535a565b6040516020818303038152906040525b9150505b919050565b60195481565b612003612430565b80600d8190555050565b60185481565b600061201f6013612e03565b905090565b61202c612430565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161205290614c26565b60006040518083038185875af1925050503d806000811461208f576040519150601f19603f3d011682016040523d82523d6000602084013e612094565b606091505b50509050806120a257600080fd5b50565b600d5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f5481565b60005b81518110156121895761217682828151811061216757612166614ca7565b5b60200260200101516000612816565b808061218190614cd6565b915050612148565b5050565b60606121996013612e03565b82106121b85760016121ab6013612e03565b6121b59190615371565b91505b6000600184846121c89190615371565b6121d29190614db0565b905060008167ffffffffffffffff8111156121f0576121ef61402a565b5b60405190808252806020026020018201604052801561221e5781602001602082028036833780820191505090505b5090506000808690505b8581116122b157612243816013612e1890919063ffffffff16565b83838151811061225657612255614ca7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050818061229b90614cd6565b92505080806122a990614cd6565b915050612228565b5081935050505092915050565b6122c6612430565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232c90615417565b60405180910390fd5b61233e8161298a565b50565b6000601260019054906101000a900460ff16156123ac57601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506123b1565b600190505b919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612429575061242882612e32565b5b9050919050565b61243861268e565b73ffffffffffffffffffffffffffffffffffffffff16612456611708565b73ffffffffffffffffffffffffffffffffffffffff16146124ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a390615483565b60405180910390fd5b565b6124b66127af565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250b90615515565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257a90615581565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600760008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b61264c81612c62565b61268b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268290614c87565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612709836114fe565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61276061275a61268e565b82612f14565b61279f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279690615613565b60405180910390fd5b6127aa838383612fa9565b505050565b6000612710905090565b6127d483838360405180602001604052806000815250611dde565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61281e612430565b601260019054906101000a900460ff1661286d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612864906156a5565b60405180910390fd5b80156128fe576128878260136132a290919063ffffffff16565b6128f95761289f8260136132d290919063ffffffff16565b506001601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b612986565b6129128260136132a290919063ffffffff16565b156129855761292b82601361330290919063ffffffff16565b506000601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b81811015612a8f576001600954612a6a9190614db0565b600981905550612a7c83600954613332565b8080612a8790614cd6565b915050612a53565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af990615711565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612bf39190613d9b565b60405180910390a3505050565b612c11612c0b61268e565b83612f14565b612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4790615613565b60405180910390fd5b612c5c84848484613350565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612c84836127d9565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600a8054612cb2906146ce565b80601f0160208091040260200160405190810160405280929190818152602001828054612cde906146ce565b8015612d2b5780601f10612d0057610100808354040283529160200191612d2b565b820191906000526020600020905b815481529060010190602001808311612d0e57829003601f168201915b5050505050905090565b606060006001612d44846133ac565b01905060008167ffffffffffffffff811115612d6357612d6261402a565b5b6040519080825280601f01601f191660200182016040528015612d955781602001600182028036833780820191505090505b509050600082602001820190505b600115612df8578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612dec57612deb614b95565b5b04945060008503612da3575b819350505050919050565b6000612e11826000016134ff565b9050919050565b6000612e278360000183613510565b60001c905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612efd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f0d5750612f0c82613584565b5b9050919050565b600080612f20836114fe565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f625750612f6181856120ab565b5b80612fa057508373ffffffffffffffffffffffffffffffffffffffff16612f8884610d3b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612fc9826114fe565b73ffffffffffffffffffffffffffffffffffffffff161461301f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613016906157a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361308e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308590615835565b60405180910390fd5b61309b83838360016135ee565b8273ffffffffffffffffffffffffffffffffffffffff166130bb826114fe565b73ffffffffffffffffffffffffffffffffffffffff1614613111576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613108906157a3565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461329d8383836001613714565b505050565b60006132ca836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61371a565b905092915050565b60006132fa836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61373d565b905092915050565b600061332a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6137ad565b905092915050565b61334c8282604051806020016040528060008152506138c5565b5050565b61335b848484612fa9565b61336784848484613920565b6133a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339d906158c7565b60405180910390fd5b50505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061340a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613400576133ff614b95565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613447576d04ee2d6d415b85acef8100000000838161343d5761343c614b95565b5b0492506020810190505b662386f26fc10000831061347657662386f26fc10000838161346c5761346b614b95565b5b0492506010810190505b6305f5e100831061349f576305f5e100838161349557613494614b95565b5b0492506008810190505b61271083106134c45761271083816134ba576134b9614b95565b5b0492506004810190505b606483106134e757606483816134dd576134dc614b95565b5b0492506002810190505b600a83106134f6576001810190505b80915050919050565b600081600001805490509050919050565b60008183600001805490501161355b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355290615959565b60405180910390fd5b82600001828154811061357157613570614ca7565b5b9060005260206000200154905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600181111561370e57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146136825780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461367a9190615371565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461370d5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137059190614db0565b925050819055505b5b50505050565b50505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000613749838361371a565b6137a25782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506137a7565b600090505b92915050565b600080836001016000848152602001908152602001600020549050600081146138b95760006001826137df9190615371565b90506000600186600001805490506137f79190615371565b9050600086600001828154811061381157613810614ca7565b5b906000526020600020015490508087600001848154811061383557613834614ca7565b5b90600052602060002001819055506001836138509190614db0565b876001016000838152602001908152602001600020819055508660000180548061387d5761387c615979565b5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506138bf565b60009150505b92915050565b6138cf8383613aa7565b6138dc6000848484613920565b61391b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613912906158c7565b60405180910390fd5b505050565b60006139418473ffffffffffffffffffffffffffffffffffffffff16613cc4565b15613a9a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261396a61268e565b8786866040518563ffffffff1660e01b815260040161398c94939291906159fd565b6020604051808303816000875af19250505080156139c857506040513d601f19601f820116820180604052508101906139c59190615a5e565b60015b613a4a573d80600081146139f8576040519150601f19603f3d011682016040523d82523d6000602084013e6139fd565b606091505b506000815103613a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a39906158c7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a9f565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0d90615ad7565b60405180910390fd5b613b1f81612c62565b15613b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b5690615b43565b60405180910390fd5b613b6d6000838360016135ee565b613b7681612c62565b15613bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bad90615b43565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613cc0600083836001613714565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613d3081613cfb565b8114613d3b57600080fd5b50565b600081359050613d4d81613d27565b92915050565b600060208284031215613d6957613d68613cf1565b5b6000613d7784828501613d3e565b91505092915050565b60008115159050919050565b613d9581613d80565b82525050565b6000602082019050613db06000830184613d8c565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613de182613db6565b9050919050565b613df181613dd6565b8114613dfc57600080fd5b50565b600081359050613e0e81613de8565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613e3581613e14565b8114613e4057600080fd5b50565b600081359050613e5281613e2c565b92915050565b60008060408385031215613e6f57613e6e613cf1565b5b6000613e7d85828601613dff565b9250506020613e8e85828601613e43565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ed2578082015181840152602081019050613eb7565b83811115613ee1576000848401525b50505050565b6000601f19601f8301169050919050565b6000613f0382613e98565b613f0d8185613ea3565b9350613f1d818560208601613eb4565b613f2681613ee7565b840191505092915050565b60006020820190508181036000830152613f4b8184613ef8565b905092915050565b6000819050919050565b613f6681613f53565b8114613f7157600080fd5b50565b600081359050613f8381613f5d565b92915050565b600060208284031215613f9f57613f9e613cf1565b5b6000613fad84828501613f74565b91505092915050565b613fbf81613dd6565b82525050565b6000602082019050613fda6000830184613fb6565b92915050565b60008060408385031215613ff757613ff6613cf1565b5b600061400585828601613dff565b925050602061401685828601613f74565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61406282613ee7565b810181811067ffffffffffffffff821117156140815761408061402a565b5b80604052505050565b6000614094613ce7565b90506140a08282614059565b919050565b600067ffffffffffffffff8211156140c0576140bf61402a565b5b6140c982613ee7565b9050602081019050919050565b82818337600083830152505050565b60006140f86140f3846140a5565b61408a565b90508281526020810184848401111561411457614113614025565b5b61411f8482856140d6565b509392505050565b600082601f83011261413c5761413b614020565b5b813561414c8482602086016140e5565b91505092915050565b60006020828403121561416b5761416a613cf1565b5b600082013567ffffffffffffffff81111561418957614188613cf6565b5b61419584828501614127565b91505092915050565b6141a781613f53565b82525050565b60006020820190506141c2600083018461419e565b92915050565b6000806000606084860312156141e1576141e0613cf1565b5b60006141ef86828701613dff565b935050602061420086828701613dff565b925050604061421186828701613f74565b9150509250925092565b6000806040838503121561423257614231613cf1565b5b600061424085828601613f74565b925050602061425185828601613f74565b9150509250929050565b60006040820190506142706000830185613fb6565b61427d602083018461419e565b9392505050565b61428d81613d80565b811461429857600080fd5b50565b6000813590506142aa81614284565b92915050565b6000602082840312156142c6576142c5613cf1565b5b60006142d48482850161429b565b91505092915050565b600067ffffffffffffffff8211156142f8576142f761402a565b5b602082029050602081019050919050565b600080fd5b600061432161431c846142dd565b61408a565b9050808382526020820190506020840283018581111561434457614343614309565b5b835b8181101561436d57806143598882613dff565b845260208401935050602081019050614346565b5050509392505050565b600082601f83011261438c5761438b614020565b5b813561439c84826020860161430e565b91505092915050565b6000602082840312156143bb576143ba613cf1565b5b600082013567ffffffffffffffff8111156143d9576143d8613cf6565b5b6143e584828501614377565b91505092915050565b60006020828403121561440457614403613cf1565b5b600061441284828501613dff565b91505092915050565b6000806040838503121561443257614431613cf1565b5b600061444085828601613dff565b92505060206144518582860161429b565b9150509250929050565b600067ffffffffffffffff8211156144765761447561402a565b5b61447f82613ee7565b9050602081019050919050565b600061449f61449a8461445b565b61408a565b9050828152602081018484840111156144bb576144ba614025565b5b6144c68482856140d6565b509392505050565b600082601f8301126144e3576144e2614020565b5b81356144f384826020860161448c565b91505092915050565b6000806000806080858703121561451657614515613cf1565b5b600061452487828801613dff565b945050602061453587828801613dff565b935050604061454687828801613f74565b925050606085013567ffffffffffffffff81111561456757614566613cf6565b5b614573878288016144ce565b91505092959194509250565b6000806040838503121561459657614595613cf1565b5b60006145a485828601613dff565b92505060206145b585828601613dff565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6145f481613dd6565b82525050565b600061460683836145eb565b60208301905092915050565b6000602082019050919050565b600061462a826145bf565b61463481856145ca565b935061463f836145db565b8060005b8381101561467057815161465788826145fa565b975061466283614612565b925050600181019050614643565b5085935050505092915050565b60006020820190508181036000830152614697818461461f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806146e657607f821691505b6020821081036146f9576146f861469f565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061475b602183613ea3565b9150614766826146ff565b604082019050919050565b6000602082019050818103600083015261478a8161474e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006147ed603d83613ea3565b91506147f882614791565b604082019050919050565b6000602082019050818103600083015261481c816147e0565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026148857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614848565b61488f8683614848565b95508019841693508086168417925050509392505050565b6000819050919050565b60006148cc6148c76148c284613f53565b6148a7565b613f53565b9050919050565b6000819050919050565b6148e6836148b1565b6148fa6148f2826148d3565b848454614855565b825550505050565b600090565b61490f614902565b61491a8184846148dd565b505050565b5b8181101561493e57614933600082614907565b600181019050614920565b5050565b601f8211156149835761495481614823565b61495d84614838565b8101602085101561496c578190505b61498061497885614838565b83018261491f565b50505b505050565b600082821c905092915050565b60006149a660001984600802614988565b1980831691505092915050565b60006149bf8383614995565b9150826002028217905092915050565b6149d882613e98565b67ffffffffffffffff8111156149f1576149f061402a565b5b6149fb82546146ce565b614a06828285614942565b600060209050601f831160018114614a395760008415614a27578287015190505b614a3185826149b3565b865550614a99565b601f198416614a4786614823565b60005b82811015614a6f57848901518255600182019150602085019450602081019050614a4a565b86831015614a8c5784890151614a88601f891682614995565b8355505b6001600288020188555050505b505050505050565b6000604082019050614ab66000830185613fb6565b614ac36020830184613fb6565b9392505050565b600081519050614ad981614284565b92915050565b600060208284031215614af557614af4613cf1565b5b6000614b0384828501614aca565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b4682613f53565b9150614b5183613f53565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b8a57614b89614b0c565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614bcf82613f53565b9150614bda83613f53565b925082614bea57614be9614b95565b5b828204905092915050565b600081905092915050565b50565b6000614c10600083614bf5565b9150614c1b82614c00565b600082019050919050565b6000614c3182614c03565b9150819050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614c71601883613ea3565b9150614c7c82614c3b565b602082019050919050565b60006020820190508181036000830152614ca081614c64565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614ce182613f53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614d1357614d12614b0c565b5b600182019050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614d7a602983613ea3565b9150614d8582614d1e565b604082019050919050565b60006020820190508181036000830152614da981614d6d565b9050919050565b6000614dbb82613f53565b9150614dc683613f53565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614dfb57614dfa614b0c565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000614e3c601483613ea3565b9150614e4782614e06565b602082019050919050565b60006020820190508181036000830152614e6b81614e2f565b9050919050565b7f61646472657373206973206e6f742077686974656c6973746564202c7761697460008201527f20666f72207075626c69632073616c652073746172742e000000000000000000602082015250565b6000614ece603783613ea3565b9150614ed982614e72565b604082019050919050565b60006020820190508181036000830152614efd81614ec1565b9050919050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614f3a601383613ea3565b9150614f4582614f04565b602082019050919050565b60006020820190508181036000830152614f6981614f2d565b9050919050565b7f796f75206861766520616c72656164792072656163686564206d6178696d756d60008201527f20616d6f756e742e000000000000000000000000000000000000000000000000602082015250565b6000614fcc602883613ea3565b9150614fd782614f70565b604082019050919050565b60006020820190508181036000830152614ffb81614fbf565b9050919050565b7f6d696e7420706572696f64206973206e6f7420737461727420796574206f722060008201527f6f7665722e000000000000000000000000000000000000000000000000000000602082015250565b600061505e602583613ea3565b915061506982615002565b604082019050919050565b6000602082019050818103600083015261508d81615051565b9050919050565b7f4d696e7420506175736564212100000000000000000000000000000000000000600082015250565b60006150ca600d83613ea3565b91506150d582615094565b602082019050919050565b600060208201905081810360008301526150f9816150bd565b9050919050565b7f4572726f723a20496e76616c69642043616c6c65722100000000000000000000600082015250565b6000615136601683613ea3565b915061514182615100565b602082019050919050565b6000602082019050818103600083015261516581615129565b9050919050565b7f66756e64206e6f74207472616e73666572212100000000000000000000000000600082015250565b60006151a2601383613ea3565b91506151ad8261516c565b602082019050919050565b600060208201905081810360008301526151d181615195565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615234602f83613ea3565b915061523f826151d8565b604082019050919050565b6000602082019050818103600083015261526381615227565b9050919050565b600081905092915050565b600061528082613e98565b61528a818561526a565b935061529a818560208601613eb4565b80840191505092915050565b600081546152b3816146ce565b6152bd818661526a565b945060018216600081146152d857600181146152ed57615320565b60ff1983168652811515820286019350615320565b6152f685614823565b60005b83811015615318578154818901526001820191506020810190506152f9565b838801955050505b50505092915050565b60006153358286615275565b91506153418285615275565b915061534d82846152a6565b9150819050949350505050565b60006153668284615275565b915081905092915050565b600061537c82613f53565b915061538783613f53565b92508282101561539a57615399614b0c565b5b828203905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615401602683613ea3565b915061540c826153a5565b604082019050919050565b60006020820190508181036000830152615430816153f4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061546d602083613ea3565b915061547882615437565b602082019050919050565b6000602082019050818103600083015261549c81615460565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006154ff602a83613ea3565b915061550a826154a3565b604082019050919050565b6000602082019050818103600083015261552e816154f2565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600061556b601983613ea3565b915061557682615535565b602082019050919050565b6000602082019050818103600083015261559a8161555e565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006155fd602d83613ea3565b9150615608826155a1565b604082019050919050565b6000602082019050818103600083015261562c816155f0565b9050919050565b7f506f6f6c20646f6573206e6f74207573652077686974656c697374696e67206f60008201527f7074696f6e000000000000000000000000000000000000000000000000000000602082015250565b600061568f602583613ea3565b915061569a82615633565b604082019050919050565b600060208201905081810360008301526156be81615682565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006156fb601983613ea3565b9150615706826156c5565b602082019050919050565b6000602082019050818103600083015261572a816156ee565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061578d602583613ea3565b915061579882615731565b604082019050919050565b600060208201905081810360008301526157bc81615780565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061581f602483613ea3565b915061582a826157c3565b604082019050919050565b6000602082019050818103600083015261584e81615812565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006158b1603283613ea3565b91506158bc82615855565b604082019050919050565b600060208201905081810360008301526158e0816158a4565b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000615943602283613ea3565b915061594e826158e7565b604082019050919050565b6000602082019050818103600083015261597281615936565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006159cf826159a8565b6159d981856159b3565b93506159e9818560208601613eb4565b6159f281613ee7565b840191505092915050565b6000608082019050615a126000830187613fb6565b615a1f6020830186613fb6565b615a2c604083018561419e565b8181036060830152615a3e81846159c4565b905095945050505050565b600081519050615a5881613d27565b92915050565b600060208284031215615a7457615a73613cf1565b5b6000615a8284828501615a49565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615ac1602083613ea3565b9150615acc82615a8b565b602082019050919050565b60006020820190508181036000830152615af081615ab4565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615b2d601c83613ea3565b9150615b3882615af7565b602082019050919050565b60006020820190508181036000830152615b5c81615b20565b905091905056fea26469706673582212207e0dece74ff49e7d9adeffbf0248fc4733f6513285013ee331656c1e6340e2ec64736f6c634300080f0033

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

00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064173f9000000000000000000000000000000000000000000000000000000000644199c0000000000000000000000000a4c1306d03c917097a8446baf67fa0f9353c08bb000000000000000000000000000000000000000000000000000000000000012c00000000000000000000000000000000000000000000000000000000000007080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000014426c6f636b53746172205465616d204265617273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000442535442000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5a61787a366537666e7044644143527452726574454b455657795267446a726538504b4d7362506d5870674b0000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): BlockStar Team Bears
Arg [1] : _symbol (string): BSTB
Arg [2] : _isWhitelist (bool): False
Arg [3] : _cost (uint256[2]): 100000000000000000,0
Arg [4] : _time (uint256[4]): 0,0,1679245200,1682020800
Arg [5] : feeReceiver (address): 0xa4c1306d03c917097a8446baF67Fa0F9353C08Bb
Arg [6] : _royaltyFeesInBips (uint96): 300
Arg [7] : _max (uint256[3]): 1800,0,25
Arg [8] : _uriPrefix (string): ipfs://QmZaxz6e7fnpDdACRtRretEKEVWyRgDjre8PKMsbPmXpgK

-----Encoded View---------------
22 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000064173f90
Arg [8] : 00000000000000000000000000000000000000000000000000000000644199c0
Arg [9] : 000000000000000000000000a4c1306d03c917097a8446baf67fa0f9353c08bb
Arg [10] : 000000000000000000000000000000000000000000000000000000000000012c
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000708
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [16] : 426c6f636b53746172205465616d204265617273000000000000000000000000
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [18] : 4253544200000000000000000000000000000000000000000000000000000000
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [20] : 697066733a2f2f516d5a61787a366537666e7044644143527452726574454b45
Arg [21] : 5657795267446a726538504b4d7362506d5870674b0000000000000000000000


Deployed Bytecode Sourcemap

56484:10386:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60453:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65744:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38960:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40472:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39990:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64613:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65654:82;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65086:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65907:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54025:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;56967:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64180:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57369:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64727:147;;;;;;;;;;;;;:::i;:::-;;65251:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66214:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56744:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66559:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57004:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56930:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56709:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38670:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62121:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66119:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38401:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27760:103;;;;;;;;;;;;;:::i;:::-;;66010:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64499:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64281:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66391:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56781:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27112:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56850:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39129:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60670:388;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61066:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40715:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62307:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57029:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62599:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65424:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61417:696;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57332:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64387:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57301:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63436:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66674:154;;;;;;;;;;;;;:::i;:::-;;56813:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40941:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56890:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62409:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63564:608;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28018:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62705:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60453:203;60583:4;60612:36;60636:11;60612:23;:36::i;:::-;60605:43;;60453:203;;;:::o;65744:155::-;26998:13;:11;:13::i;:::-;65842:49:::1;65861:9;65872:18;65842;:49::i;:::-;65744:155:::0;;:::o;38960:100::-;39014:13;39047:5;39040:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38960:100;:::o;40472:171::-;40548:7;40568:23;40583:7;40568:14;:23::i;:::-;40611:15;:24;40627:7;40611:24;;;;;;;;;;;;;;;;;;;;;40604:31;;40472:171;;;:::o;39990:416::-;40071:13;40087:23;40102:7;40087:14;:23::i;:::-;40071:39;;40135:5;40129:11;;:2;:11;;;40121:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;40229:5;40213:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40238:37;40255:5;40262:12;:10;:12::i;:::-;40238:16;:37::i;:::-;40213:62;40191:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;40377:21;40386:2;40390:7;40377:8;:21::i;:::-;40060:346;39990:416;;:::o;64613:106::-;26998:13;:11;:13::i;:::-;64701:10:::1;64689:9;:22;;;;;;:::i;:::-;;64613:106:::0;:::o;65654:82::-;65698:4;65722:6;;65715:13;;65654:82;:::o;65086:157::-;11610:1;10436:42;11564:43;;;:47;11560:225;;;10436:42;11633:40;;;11682:4;11689:10;11633:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11628:146;;11747:10;11728:30;;;;;;;;;;;:::i;:::-;;;;;;;;11628:146;11560:225;65198:37:::1;65217:4;65223:2;65227:7;65198:18;:37::i;:::-;65086:157:::0;;;:::o;65907:95::-;26998:13;:11;:13::i;:::-;65990:4:::1;65974:13;:20;;;;65907:95:::0;:::o;54025:438::-;54120:7;54129;54149:26;54178:17;:26;54196:7;54178:26;;;;;;;;;;;54149:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54249:1;54221:30;;:7;:16;;;:30;;;54217:92;;54278:19;54268:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54217:92;54321:21;54385:17;:15;:17::i;:::-;54345:57;;54358:7;:23;;;54346:35;;:9;:35;;;;:::i;:::-;54345:57;;;;:::i;:::-;54321:81;;54423:7;:16;;;54441:13;54415:40;;;;;;54025:438;;;;;:::o;56967:28::-;;;;:::o;64180:93::-;26998:13;:11;:13::i;:::-;64258:7:::1;64249:6;;:16;;;;;;;;;;;;;;;;;;64180:93:::0;:::o;57369:31::-;;;;:::o;64727:147::-;26998:13;:11;:13::i;:::-;64776:7:::1;64797;:5;:7::i;:::-;64789:21;;64818;64789:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64775:69;;;64863:2;64855:11;;;::::0;::::1;;64764:110;64727:147::o:0;65251:165::-;11610:1;10436:42;11564:43;;;:47;11560:225;;;10436:42;11633:40;;;11682:4;11689:10;11633:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11628:146;;11747:10;11728:30;;;;;;;;;;;:::i;:::-;;;;;;;;11628:146;11560:225;65367:41:::1;65390:4;65396:2;65400:7;65367:22;:41::i;:::-;65251:165:::0;;;:::o;66214:169::-;26998:13;:11;:13::i;:::-;66327:10:::1;66306:18;:31;;;;66367:8;66348:16;:27;;;;66214:169:::0;;:::o;56744:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66559:105::-;26998:13;:11;:13::i;:::-;66646:10:::1;66628:15;;:28;;;;;;;;;;;;;;;;;;66559:105:::0;:::o;57004:18::-;;;;;;;;;;;;;:::o;56930:30::-;;;;:::o;56709:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38670:223::-;38742:7;38762:13;38778:17;38787:7;38778:8;:17::i;:::-;38762:33;;38831:1;38814:19;;:5;:19;;;38806:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;38880:5;38873:12;;;38670:223;;;:::o;62121:178::-;62199:9;62194:98;62218:5;:12;62214:1;:16;62194:98;;;62252:28;62265:5;62271:1;62265:8;;;;;;;;:::i;:::-;;;;;;;;62275:4;62252:12;:28::i;:::-;62232:3;;;;;:::i;:::-;;;;62194:98;;;;62121:178;:::o;66119:87::-;26998:13;:11;:13::i;:::-;66194:4:::1;66182:9;:16;;;;66119:87:::0;:::o;38401:207::-;38473:7;38518:1;38501:19;;:5;:19;;;38493:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38584:9;:16;38594:5;38584:16;;;;;;;;;;;;;;;;38577:23;;38401:207;;;:::o;27760:103::-;26998:13;:11;:13::i;:::-;27825:30:::1;27852:1;27825:18;:30::i;:::-;27760:103::o:0;66010:101::-;26998:13;:11;:13::i;:::-;66099:4:::1;66080:16;:23;;;;66010:101:::0;:::o;64499:106::-;26998:13;:11;:13::i;:::-;64587:10:::1;64575:9;:22;;;;;;:::i;:::-;;64499:106:::0;:::o;64281:98::-;26998:13;:11;:13::i;:::-;64363:8:::1;64350:10;:21;;;;64281:98:::0;:::o;66391:160::-;26998:13;:11;:13::i;:::-;66498:10:::1;66480:15;:28;;;;66535:8;66519:13;:24;;;;66391:160:::0;;:::o;56781:25::-;;;;:::o;27112:87::-;27158:7;27185:6;;;;;;;;;;;27178:13;;27112:87;:::o;56850:33::-;;;;:::o;39129:104::-;39185:13;39218:7;39211:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39129:104;:::o;60670:388::-;60735:11;59330:9;;59315:11;59299:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;59291:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;60764:11:::1;59453:15;;;;;;;;;;;:57;;;;;59492:18;;59472:15;:38;;59453:57;:98;;;;;59535:16;;59515:15;:36;;59453:98;59449:967;;;59575:13;:25;59589:10;59575:25;;;;;;;;;;;;;;;;;;;;;;;;;59567:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;59712:11;59696:13;;:27;;;;:::i;:::-;59683:9;:40;;59675:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;59824:11;59790:19;:31;59810:10;59790:31;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;59770:16;;:65;;59762:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;59931:11;59896:19;:31;59916:10;59896:31;;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;;;;;;;59449:967;;;59992:15;;59972;:35;;:73;;;;;60032:13;;60012:15;:33;;59972:73;59969:447;;;60117:11;60086:16;:28;60103:10;60086:28;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;60069:13;;:59;;60061:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;60223:11;60210:10;;:24;;;;:::i;:::-;60197:9;:37;;60189:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;60305:11;60273:16;:28;60290:10;60273:28;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;59969:447;;;60357:47;;;;;;;;;;:::i;:::-;;;;;;;;59969:447;59449:967;60797:6:::2;;;;;;;;;;;60796:7;60788:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;60852:10;60839:23;;:9;:23;;;60831:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;60900:7;60928;:5;:7::i;:::-;60912:30;;60950:9;60912:52;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60899:65;;;60983:2;60975:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;61021:29;61026:10;61038:11;61021:4;:29::i;:::-;60777:281;59375:1:::1;60670:388:::0;;:::o;61066:140::-;61141:11;59330:9;;59315:11;59299:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;59291:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26998:13:::1;:11;:13::i;:::-;61175:23:::2;61180:4;61186:11;61175:4;:23::i;:::-;61066:140:::0;;;:::o;40715:155::-;40810:52;40829:12;:10;:12::i;:::-;40843:8;40853;40810:18;:52::i;:::-;40715:155;;:::o;62307:94::-;62369:24;62382:4;62388;62369:12;:24::i;:::-;62307:94;:::o;57029:27::-;;;;;;;;;;;;;:::o;62599:98::-;62664:25;62677:4;62683:5;62664:12;:25::i;:::-;62599:98;:::o;65424:222::-;11610:1;10436:42;11564:43;;;:47;11560:225;;;10436:42;11633:40;;;11682:4;11689:10;11633:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11628:146;;11747:10;11728:30;;;;;;;;;;;:::i;:::-;;;;;;;;11628:146;11560:225;65591:47:::1;65614:4;65620:2;65624:7;65633:4;65591:22;:47::i;:::-;65424:222:::0;;;;:::o;61417:696::-;61535:13;61584:16;61592:7;61584;:16::i;:::-;61566:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;61682:28;61713:10;:8;:10::i;:::-;61682:41;;61763:1;61743:9;61737:23;;;;;:::i;:::-;;;:27;61734:372;;;61818:1;61793:14;61787:28;:32;:145;;;;;;;;;;;;;;;;;61863:14;61879:18;:7;:16;:18::i;:::-;61899:9;61846:63;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61787:145;61780:152;;;;;61734:372;62011:1;61986:14;61980:28;:32;:114;;;;;;;;;;;;;;;;;62056:14;62039:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;61980:114;61973:121;;;61417:696;;;;:::o;57332:28::-;;;;:::o;64387:104::-;26998:13;:11;:13::i;:::-;64475:8:::1;64459:13;:24;;;;64387:104:::0;:::o;57301:24::-;;;;:::o;63436:120::-;63496:7;63523:25;:16;:23;:25::i;:::-;63516:32;;63436:120;:::o;66674:154::-;26998:13;:11;:13::i;:::-;66728:7:::1;66748:10;66740:24;;66772:21;66740:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66727:71;;;66817:2;66809:11;;;::::0;::::1;;66716:112;66674:154::o:0;56813:28::-;;;;:::o;40941:164::-;41038:4;41062:18;:25;41081:5;41062:25;;;;;;;;;;;;;;;:35;41088:8;41062:35;;;;;;;;;;;;;;;;;;;;;;;;;41055:42;;40941:164;;;;:::o;56890:31::-;;;;:::o;62409:182::-;62490:9;62485:99;62509:5;:12;62505:1;:16;62485:99;;;62543:29;62556:5;62562:1;62556:8;;;;;;;;:::i;:::-;;;;;;;;62566:5;62543:12;:29::i;:::-;62523:3;;;;;:::i;:::-;;;;62485:99;;;;62409:182;:::o;63564:608::-;63652:16;63697:25;:16;:23;:25::i;:::-;63685:8;:37;63681:110;;63778:1;63750:25;:16;:23;:25::i;:::-;:29;;;;:::i;:::-;63739:40;;63681:110;63801:11;63839:1;63826:10;63815:8;:21;;;;:::i;:::-;:25;;;;:::i;:::-;63801:39;;63851:44;63912:3;63898:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63851:65;;63929:15;63964:9;63976:10;63964:22;;63959:161;63993:8;63988:1;:13;63959:161;;64062:22;64082:1;64062:16;:19;;:22;;;;:::i;:::-;64023:27;64051:7;64023:36;;;;;;;;:::i;:::-;;;;;;;:61;;;;;;;;;;;64099:9;;;;;:::i;:::-;;;;64003:3;;;;;:::i;:::-;;;;63959:161;;;;64137:27;64130:34;;;;;63564:608;;;;:::o;28018:201::-;26998:13;:11;:13::i;:::-;28127:1:::1;28107:22;;:8;:22;;::::0;28099:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;28183:28;28202:8;28183:18;:28::i;:::-;28018:201:::0;:::o;62705:182::-;62767:4;62788:15;;;;;;;;;;;62784:74;;;62827:13;:19;62841:4;62827:19;;;;;;;;;;;;;;;;;;;;;;;;;62820:26;;;;62784:74;62875:4;62868:11;;62705:182;;;;:::o;53755:215::-;53857:4;53896:26;53881:41;;;:11;:41;;;;:81;;;;53926:36;53950:11;53926:23;:36::i;:::-;53881:81;53874:88;;53755:215;;;:::o;27277:132::-;27352:12;:10;:12::i;:::-;27341:23;;:7;:5;:7::i;:::-;:23;;;27333:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27277:132::o;55113:332::-;55232:17;:15;:17::i;:::-;55216:33;;:12;:33;;;;55208:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;55335:1;55315:22;;:8;:22;;;55307:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;55402:35;;;;;;;;55414:8;55402:35;;;;;;55424:12;55402:35;;;;;55380:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55113:332;;:::o;49113:135::-;49195:16;49203:7;49195;:16::i;:::-;49187:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;49113:135;:::o;26328:98::-;26381:7;26408:10;26401:17;;26328:98;:::o;48392:174::-;48494:2;48467:15;:24;48483:7;48467:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;48550:7;48546:2;48512:46;;48521:23;48536:7;48521:14;:23::i;:::-;48512:46;;;;;;;;;;;;48392:174;;:::o;41172:335::-;41367:41;41386:12;:10;:12::i;:::-;41400:7;41367:18;:41::i;:::-;41359:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;41471:28;41481:4;41487:2;41491:7;41471:9;:28::i;:::-;41172:335;;;:::o;54745:97::-;54803:6;54829:5;54822:12;;54745:97;:::o;41578:185::-;41716:39;41733:4;41739:2;41743:7;41716:39;;;;;;;;;;;;:16;:39::i;:::-;41578:185;;;:::o;42591:117::-;42657:7;42684;:16;42692:7;42684:16;;;;;;;;;;;;;;;;;;;;;42677:23;;42591:117;;;:::o;62895:533::-;26998:13;:11;:13::i;:::-;62987:15:::1;;;;;;;;;;;62979:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;63059:11;63055:366;;;63092:31;63118:4;63092:16;:25;;:31;;;;:::i;:::-;63087:144;;63144:26;63165:4;63144:16;:20;;:26;;;;:::i;:::-;;63211:4;63189:13;:19;63203:4;63189:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;63087:144;63055:366;;;63267:31;63293:4;63267:16;:25;;:31;;;;:::i;:::-;63263:147;;;63319:29;63343:4;63319:16;:23;;:29;;;;:::i;:::-;;63389:5;63367:13;:19;63381:4;63367:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;63263:147;63055:366;62895:533:::0;;:::o;28379:191::-;28453:16;28472:6;;;;;;;;;;;28453:25;;28498:8;28489:6;;:17;;;;;;;;;;;;;;;;;;28553:8;28522:40;;28543:8;28522:40;;;;;;;;;;;;28442:128;28379:191;:::o;61214:189::-;61280:9;61275:121;61299:5;61295:1;:9;61275:121;;;61344:1;61335:6;;:10;;;;:::i;:::-;61326:6;:19;;;;61360:24;61370:5;61377:6;;61360:9;:24::i;:::-;61306:3;;;;;:::i;:::-;;;;61275:121;;;;61214:189;;:::o;48709:315::-;48864:8;48855:17;;:5;:17;;;48847:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;48951:8;48913:18;:25;48932:5;48913:25;;;;;;;;;;;;;;;:35;48939:8;48913:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;48997:8;48975:41;;48990:5;48975:41;;;49007:8;48975:41;;;;;;:::i;:::-;;;;;;;;48709:315;;;:::o;41834:322::-;42008:41;42027:12;:10;:12::i;:::-;42041:7;42008:18;:41::i;:::-;42000:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;42110:38;42124:4;42130:2;42134:7;42143:4;42110:13;:38::i;:::-;41834:322;;;;:::o;42716:128::-;42781:4;42834:1;42805:31;;:17;42814:7;42805:8;:17::i;:::-;:31;;;;42798:38;;42716:128;;;:::o;64882:110::-;64942:13;64975:9;64968:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64882:110;:::o;24401:716::-;24457:13;24508:14;24545:1;24525:17;24536:5;24525:10;:17::i;:::-;:21;24508:38;;24561:20;24595:6;24584:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24561:41;;24617:11;24746:6;24742:2;24738:15;24730:6;24726:28;24719:35;;24783:288;24790:4;24783:288;;;24815:5;;;;;;;;24957:8;24952:2;24945:5;24941:14;24936:30;24931:3;24923:44;25013:2;25004:11;;;;;;:::i;:::-;;;;;25047:1;25038:5;:10;24783:288;25034:21;24783:288;25092:6;25085:13;;;;;24401:716;;;:::o;5966:117::-;6029:7;6056:19;6064:3;:10;;6056:7;:19::i;:::-;6049:26;;5966:117;;;:::o;6427:158::-;6501:7;6552:22;6556:3;:10;;6568:5;6552:3;:22::i;:::-;6544:31;;6521:56;;6427:158;;;;:::o;38032:305::-;38134:4;38186:25;38171:40;;;:11;:40;;;;:105;;;;38243:33;38228:48;;;:11;:48;;;;38171:105;:158;;;;38293:36;38317:11;38293:23;:36::i;:::-;38171:158;38151:178;;38032:305;;;:::o;43011:264::-;43104:4;43121:13;43137:23;43152:7;43137:14;:23::i;:::-;43121:39;;43190:5;43179:16;;:7;:16;;;:52;;;;43199:32;43216:5;43223:7;43199:16;:32::i;:::-;43179:52;:87;;;;43259:7;43235:31;;:20;43247:7;43235:11;:20::i;:::-;:31;;;43179:87;43171:96;;;43011:264;;;;:::o;47010:1263::-;47169:4;47142:31;;:23;47157:7;47142:14;:23::i;:::-;:31;;;47134:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;47248:1;47234:16;;:2;:16;;;47226:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;47304:42;47325:4;47331:2;47335:7;47344:1;47304:20;:42::i;:::-;47476:4;47449:31;;:23;47464:7;47449:14;:23::i;:::-;:31;;;47441:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;47594:15;:24;47610:7;47594:24;;;;;;;;;;;;47587:31;;;;;;;;;;;48089:1;48070:9;:15;48080:4;48070:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;48122:1;48105:9;:13;48115:2;48105:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;48164:2;48145:7;:16;48153:7;48145:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48203:7;48199:2;48184:27;;48193:4;48184:27;;;;;;;;;;;;48224:41;48244:4;48250:2;48254:7;48263:1;48224:19;:41::i;:::-;47010:1263;;;:::o;5713:167::-;5793:4;5817:55;5827:3;:10;;5863:5;5847:23;;5839:32;;5817:9;:55::i;:::-;5810:62;;5713:167;;;;:::o;5141:152::-;5211:4;5235:50;5240:3;:10;;5276:5;5260:23;;5252:32;;5235:4;:50::i;:::-;5228:57;;5141:152;;;;:::o;5469:158::-;5542:4;5566:53;5574:3;:10;;5610:5;5594:23;;5586:32;;5566:7;:53::i;:::-;5559:60;;5469:158;;;;:::o;43617:110::-;43693:26;43703:2;43707:7;43693:26;;;;;;;;;;;;:9;:26::i;:::-;43617:110;;:::o;42164:313::-;42320:28;42330:4;42336:2;42340:7;42320:9;:28::i;:::-;42367:47;42390:4;42396:2;42400:7;42409:4;42367:22;:47::i;:::-;42359:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;42164:313;;;;:::o;21461:922::-;21514:7;21534:14;21551:1;21534:18;;21601:6;21592:5;:15;21588:102;;21637:6;21628:15;;;;;;:::i;:::-;;;;;21672:2;21662:12;;;;21588:102;21717:6;21708:5;:15;21704:102;;21753:6;21744:15;;;;;;:::i;:::-;;;;;21788:2;21778:12;;;;21704:102;21833:6;21824:5;:15;21820:102;;21869:6;21860:15;;;;;;:::i;:::-;;;;;21904:2;21894:12;;;;21820:102;21949:5;21940;:14;21936:99;;21984:5;21975:14;;;;;;:::i;:::-;;;;;22018:1;22008:11;;;;21936:99;22062:5;22053;:14;22049:99;;22097:5;22088:14;;;;;;:::i;:::-;;;;;22131:1;22121:11;;;;22049:99;22175:5;22166;:14;22162:99;;22210:5;22201:14;;;;;;:::i;:::-;;;;;22244:1;22234:11;;;;22162:99;22288:5;22279;:14;22275:66;;22324:1;22314:11;;;;22275:66;22369:6;22362:13;;;21461:922;;;:::o;2640:109::-;2696:7;2723:3;:11;;:18;;;;2716:25;;2640:109;;;:::o;3093:204::-;3160:7;3209:5;3188:3;:11;;:18;;;;:26;3180:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3271:3;:11;;3283:5;3271:18;;;;;;;;:::i;:::-;;;;;;;;;;3264:25;;3093:204;;;;:::o;35476:157::-;35561:4;35600:25;35585:40;;;:11;:40;;;;35578:47;;35476:157;;;:::o;51397:410::-;51587:1;51575:9;:13;51571:229;;;51625:1;51609:18;;:4;:18;;;51605:87;;51667:9;51648;:15;51658:4;51648:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;51605:87;51724:1;51710:16;;:2;:16;;;51706:83;;51764:9;51747;:13;51757:2;51747:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;51706:83;51571:229;51397:410;;;;:::o;52529:158::-;;;;;:::o;2425:129::-;2498:4;2545:1;2522:3;:12;;:19;2535:5;2522:19;;;;;;;;;;;;:24;;2515:31;;2425:129;;;;:::o;368:414::-;431:4;453:21;463:3;468:5;453:9;:21::i;:::-;448:327;;491:3;:11;;508:5;491:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;674:3;:11;;:18;;;;652:3;:12;;:19;665:5;652:19;;;;;;;;;;;:40;;;;714:4;707:11;;;;448:327;758:5;751:12;;368:414;;;;;:::o;795:1544::-;861:4;979:18;1000:3;:12;;:19;1013:5;1000:19;;;;;;;;;;;;979:40;;1050:1;1036:10;:15;1032:1300;;1398:21;1435:1;1422:10;:14;;;;:::i;:::-;1398:38;;1451:17;1492:1;1471:3;:11;;:18;;;;:22;;;;:::i;:::-;1451:42;;1738:17;1758:3;:11;;1770:9;1758:22;;;;;;;;:::i;:::-;;;;;;;;;;1738:42;;1904:9;1875:3;:11;;1887:13;1875:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;2023:1;2007:13;:17;;;;:::i;:::-;1981:3;:12;;:23;1994:9;1981:23;;;;;;;;;;;:43;;;;2133:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2228:3;:12;;:19;2241:5;2228:19;;;;;;;;;;;2221:26;;;2271:4;2264:11;;;;;;;;1032:1300;2315:5;2308:12;;;795:1544;;;;;:::o;43954:319::-;44083:18;44089:2;44093:7;44083:5;:18::i;:::-;44134:53;44165:1;44169:2;44173:7;44182:4;44134:22;:53::i;:::-;44112:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;43954:319;;;:::o;49812:853::-;49966:4;49987:15;:2;:13;;;:15::i;:::-;49983:675;;;50039:2;50023:36;;;50060:12;:10;:12::i;:::-;50074:4;50080:7;50089:4;50023:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50019:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50281:1;50264:6;:13;:18;50260:328;;50307:60;;;;;;;;;;:::i;:::-;;;;;;;;50260:328;50538:6;50532:13;50523:6;50519:2;50515:15;50508:38;50019:584;50155:41;;;50145:51;;;:6;:51;;;;50138:58;;;;;49983:675;50642:4;50635:11;;49812:853;;;;;;;:::o;44609:942::-;44703:1;44689:16;;:2;:16;;;44681:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;44762:16;44770:7;44762;:16::i;:::-;44761:17;44753:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44824:48;44853:1;44857:2;44861:7;44870:1;44824:20;:48::i;:::-;44971:16;44979:7;44971;:16::i;:::-;44970:17;44962:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45386:1;45369:9;:13;45379:2;45369:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;45430:2;45411:7;:16;45419:7;45411:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;45475:7;45471:2;45450:33;;45467:1;45450:33;;;;;;;;;;;;45496:47;45524:1;45528:2;45532:7;45541:1;45496:19;:47::i;:::-;44609:942;;:::o;28606:326::-;28666:4;28923:1;28901:7;:19;;;:23;28894:30;;28606:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:99::-;2939:6;2973:5;2967:12;2957:22;;2887:99;;;:::o;2992:169::-;3076:11;3110:6;3105:3;3098:19;3150:4;3145:3;3141:14;3126:29;;2992:169;;;;:::o;3167:307::-;3235:1;3245:113;3259:6;3256:1;3253:13;3245:113;;;3344:1;3339:3;3335:11;3329:18;3325:1;3320:3;3316:11;3309:39;3281:2;3278:1;3274:10;3269:15;;3245:113;;;3376:6;3373:1;3370:13;3367:101;;;3456:1;3447:6;3442:3;3438:16;3431:27;3367:101;3216:258;3167:307;;;:::o;3480:102::-;3521:6;3572:2;3568:7;3563:2;3556:5;3552:14;3548:28;3538:38;;3480:102;;;:::o;3588:364::-;3676:3;3704:39;3737:5;3704:39;:::i;:::-;3759:71;3823:6;3818:3;3759:71;:::i;:::-;3752:78;;3839:52;3884:6;3879:3;3872:4;3865:5;3861:16;3839:52;:::i;:::-;3916:29;3938:6;3916:29;:::i;:::-;3911:3;3907:39;3900:46;;3680:272;3588:364;;;;:::o;3958:313::-;4071:4;4109:2;4098:9;4094:18;4086:26;;4158:9;4152:4;4148:20;4144:1;4133:9;4129:17;4122:47;4186:78;4259:4;4250:6;4186:78;:::i;:::-;4178:86;;3958:313;;;;:::o;4277:77::-;4314:7;4343:5;4332:16;;4277:77;;;:::o;4360:122::-;4433:24;4451:5;4433:24;:::i;:::-;4426:5;4423:35;4413:63;;4472:1;4469;4462:12;4413:63;4360:122;:::o;4488:139::-;4534:5;4572:6;4559:20;4550:29;;4588:33;4615:5;4588:33;:::i;:::-;4488:139;;;;:::o;4633:329::-;4692:6;4741:2;4729:9;4720:7;4716:23;4712:32;4709:119;;;4747:79;;:::i;:::-;4709:119;4867:1;4892:53;4937:7;4928:6;4917:9;4913:22;4892:53;:::i;:::-;4882:63;;4838:117;4633:329;;;;:::o;4968:118::-;5055:24;5073:5;5055:24;:::i;:::-;5050:3;5043:37;4968:118;;:::o;5092:222::-;5185:4;5223:2;5212:9;5208:18;5200:26;;5236:71;5304:1;5293:9;5289:17;5280:6;5236:71;:::i;:::-;5092:222;;;;:::o;5320:474::-;5388:6;5396;5445:2;5433:9;5424:7;5420:23;5416:32;5413:119;;;5451:79;;:::i;:::-;5413:119;5571:1;5596:53;5641:7;5632:6;5621:9;5617:22;5596:53;:::i;:::-;5586:63;;5542:117;5698:2;5724:53;5769:7;5760:6;5749:9;5745:22;5724:53;:::i;:::-;5714:63;;5669:118;5320:474;;;;;:::o;5800:117::-;5909:1;5906;5899:12;5923:117;6032:1;6029;6022:12;6046:180;6094:77;6091:1;6084:88;6191:4;6188:1;6181:15;6215:4;6212:1;6205:15;6232:281;6315:27;6337:4;6315:27;:::i;:::-;6307:6;6303:40;6445:6;6433:10;6430:22;6409:18;6397:10;6394:34;6391:62;6388:88;;;6456:18;;:::i;:::-;6388:88;6496:10;6492:2;6485:22;6275:238;6232:281;;:::o;6519:129::-;6553:6;6580:20;;:::i;:::-;6570:30;;6609:33;6637:4;6629:6;6609:33;:::i;:::-;6519:129;;;:::o;6654:308::-;6716:4;6806:18;6798:6;6795:30;6792:56;;;6828:18;;:::i;:::-;6792:56;6866:29;6888:6;6866:29;:::i;:::-;6858:37;;6950:4;6944;6940:15;6932:23;;6654:308;;;:::o;6968:154::-;7052:6;7047:3;7042;7029:30;7114:1;7105:6;7100:3;7096:16;7089:27;6968:154;;;:::o;7128:412::-;7206:5;7231:66;7247:49;7289:6;7247:49;:::i;:::-;7231:66;:::i;:::-;7222:75;;7320:6;7313:5;7306:21;7358:4;7351:5;7347:16;7396:3;7387:6;7382:3;7378:16;7375:25;7372:112;;;7403:79;;:::i;:::-;7372:112;7493:41;7527:6;7522:3;7517;7493:41;:::i;:::-;7212:328;7128:412;;;;;:::o;7560:340::-;7616:5;7665:3;7658:4;7650:6;7646:17;7642:27;7632:122;;7673:79;;:::i;:::-;7632:122;7790:6;7777:20;7815:79;7890:3;7882:6;7875:4;7867:6;7863:17;7815:79;:::i;:::-;7806:88;;7622:278;7560:340;;;;:::o;7906:509::-;7975:6;8024:2;8012:9;8003:7;7999:23;7995:32;7992:119;;;8030:79;;:::i;:::-;7992:119;8178:1;8167:9;8163:17;8150:31;8208:18;8200:6;8197:30;8194:117;;;8230:79;;:::i;:::-;8194:117;8335:63;8390:7;8381:6;8370:9;8366:22;8335:63;:::i;:::-;8325:73;;8121:287;7906:509;;;;:::o;8421:118::-;8508:24;8526:5;8508:24;:::i;:::-;8503:3;8496:37;8421:118;;:::o;8545:222::-;8638:4;8676:2;8665:9;8661:18;8653:26;;8689:71;8757:1;8746:9;8742:17;8733:6;8689:71;:::i;:::-;8545:222;;;;:::o;8773:619::-;8850:6;8858;8866;8915:2;8903:9;8894:7;8890:23;8886:32;8883:119;;;8921:79;;:::i;:::-;8883:119;9041:1;9066:53;9111:7;9102:6;9091:9;9087:22;9066:53;:::i;:::-;9056:63;;9012:117;9168:2;9194:53;9239:7;9230:6;9219:9;9215:22;9194:53;:::i;:::-;9184:63;;9139:118;9296:2;9322:53;9367:7;9358:6;9347:9;9343:22;9322:53;:::i;:::-;9312:63;;9267:118;8773:619;;;;;:::o;9398:474::-;9466:6;9474;9523:2;9511:9;9502:7;9498:23;9494:32;9491:119;;;9529:79;;:::i;:::-;9491:119;9649:1;9674:53;9719:7;9710:6;9699:9;9695:22;9674:53;:::i;:::-;9664:63;;9620:117;9776:2;9802:53;9847:7;9838:6;9827:9;9823:22;9802:53;:::i;:::-;9792:63;;9747:118;9398:474;;;;;:::o;9878:332::-;9999:4;10037:2;10026:9;10022:18;10014:26;;10050:71;10118:1;10107:9;10103:17;10094:6;10050:71;:::i;:::-;10131:72;10199:2;10188:9;10184:18;10175:6;10131:72;:::i;:::-;9878:332;;;;;:::o;10216:116::-;10286:21;10301:5;10286:21;:::i;:::-;10279:5;10276:32;10266:60;;10322:1;10319;10312:12;10266:60;10216:116;:::o;10338:133::-;10381:5;10419:6;10406:20;10397:29;;10435:30;10459:5;10435:30;:::i;:::-;10338:133;;;;:::o;10477:323::-;10533:6;10582:2;10570:9;10561:7;10557:23;10553:32;10550:119;;;10588:79;;:::i;:::-;10550:119;10708:1;10733:50;10775:7;10766:6;10755:9;10751:22;10733:50;:::i;:::-;10723:60;;10679:114;10477:323;;;;:::o;10806:311::-;10883:4;10973:18;10965:6;10962:30;10959:56;;;10995:18;;:::i;:::-;10959:56;11045:4;11037:6;11033:17;11025:25;;11105:4;11099;11095:15;11087:23;;10806:311;;;:::o;11123:117::-;11232:1;11229;11222:12;11263:710;11359:5;11384:81;11400:64;11457:6;11400:64;:::i;:::-;11384:81;:::i;:::-;11375:90;;11485:5;11514:6;11507:5;11500:21;11548:4;11541:5;11537:16;11530:23;;11601:4;11593:6;11589:17;11581:6;11577:30;11630:3;11622:6;11619:15;11616:122;;;11649:79;;:::i;:::-;11616:122;11764:6;11747:220;11781:6;11776:3;11773:15;11747:220;;;11856:3;11885:37;11918:3;11906:10;11885:37;:::i;:::-;11880:3;11873:50;11952:4;11947:3;11943:14;11936:21;;11823:144;11807:4;11802:3;11798:14;11791:21;;11747:220;;;11751:21;11365:608;;11263:710;;;;;:::o;11996:370::-;12067:5;12116:3;12109:4;12101:6;12097:17;12093:27;12083:122;;12124:79;;:::i;:::-;12083:122;12241:6;12228:20;12266:94;12356:3;12348:6;12341:4;12333:6;12329:17;12266:94;:::i;:::-;12257:103;;12073:293;11996:370;;;;:::o;12372:539::-;12456:6;12505:2;12493:9;12484:7;12480:23;12476:32;12473:119;;;12511:79;;:::i;:::-;12473:119;12659:1;12648:9;12644:17;12631:31;12689:18;12681:6;12678:30;12675:117;;;12711:79;;:::i;:::-;12675:117;12816:78;12886:7;12877:6;12866:9;12862:22;12816:78;:::i;:::-;12806:88;;12602:302;12372:539;;;;:::o;12917:329::-;12976:6;13025:2;13013:9;13004:7;13000:23;12996:32;12993:119;;;13031:79;;:::i;:::-;12993:119;13151:1;13176:53;13221:7;13212:6;13201:9;13197:22;13176:53;:::i;:::-;13166:63;;13122:117;12917:329;;;;:::o;13252:468::-;13317:6;13325;13374:2;13362:9;13353:7;13349:23;13345:32;13342:119;;;13380:79;;:::i;:::-;13342:119;13500:1;13525:53;13570:7;13561:6;13550:9;13546:22;13525:53;:::i;:::-;13515:63;;13471:117;13627:2;13653:50;13695:7;13686:6;13675:9;13671:22;13653:50;:::i;:::-;13643:60;;13598:115;13252:468;;;;;:::o;13726:307::-;13787:4;13877:18;13869:6;13866:30;13863:56;;;13899:18;;:::i;:::-;13863:56;13937:29;13959:6;13937:29;:::i;:::-;13929:37;;14021:4;14015;14011:15;14003:23;;13726:307;;;:::o;14039:410::-;14116:5;14141:65;14157:48;14198:6;14157:48;:::i;:::-;14141:65;:::i;:::-;14132:74;;14229:6;14222:5;14215:21;14267:4;14260:5;14256:16;14305:3;14296:6;14291:3;14287:16;14284:25;14281:112;;;14312:79;;:::i;:::-;14281:112;14402:41;14436:6;14431:3;14426;14402:41;:::i;:::-;14122:327;14039:410;;;;;:::o;14468:338::-;14523:5;14572:3;14565:4;14557:6;14553:17;14549:27;14539:122;;14580:79;;:::i;:::-;14539:122;14697:6;14684:20;14722:78;14796:3;14788:6;14781:4;14773:6;14769:17;14722:78;:::i;:::-;14713:87;;14529:277;14468:338;;;;:::o;14812:943::-;14907:6;14915;14923;14931;14980:3;14968:9;14959:7;14955:23;14951:33;14948:120;;;14987:79;;:::i;:::-;14948:120;15107:1;15132:53;15177:7;15168:6;15157:9;15153:22;15132:53;:::i;:::-;15122:63;;15078:117;15234:2;15260:53;15305:7;15296:6;15285:9;15281:22;15260:53;:::i;:::-;15250:63;;15205:118;15362:2;15388:53;15433:7;15424:6;15413:9;15409:22;15388:53;:::i;:::-;15378:63;;15333:118;15518:2;15507:9;15503:18;15490:32;15549:18;15541:6;15538:30;15535:117;;;15571:79;;:::i;:::-;15535:117;15676:62;15730:7;15721:6;15710:9;15706:22;15676:62;:::i;:::-;15666:72;;15461:287;14812:943;;;;;;;:::o;15761:474::-;15829:6;15837;15886:2;15874:9;15865:7;15861:23;15857:32;15854:119;;;15892:79;;:::i;:::-;15854:119;16012:1;16037:53;16082:7;16073:6;16062:9;16058:22;16037:53;:::i;:::-;16027:63;;15983:117;16139:2;16165:53;16210:7;16201:6;16190:9;16186:22;16165:53;:::i;:::-;16155:63;;16110:118;15761:474;;;;;:::o;16241:114::-;16308:6;16342:5;16336:12;16326:22;;16241:114;;;:::o;16361:184::-;16460:11;16494:6;16489:3;16482:19;16534:4;16529:3;16525:14;16510:29;;16361:184;;;;:::o;16551:132::-;16618:4;16641:3;16633:11;;16671:4;16666:3;16662:14;16654:22;;16551:132;;;:::o;16689:108::-;16766:24;16784:5;16766:24;:::i;:::-;16761:3;16754:37;16689:108;;:::o;16803:179::-;16872:10;16893:46;16935:3;16927:6;16893:46;:::i;:::-;16971:4;16966:3;16962:14;16948:28;;16803:179;;;;:::o;16988:113::-;17058:4;17090;17085:3;17081:14;17073:22;;16988:113;;;:::o;17137:732::-;17256:3;17285:54;17333:5;17285:54;:::i;:::-;17355:86;17434:6;17429:3;17355:86;:::i;:::-;17348:93;;17465:56;17515:5;17465:56;:::i;:::-;17544:7;17575:1;17560:284;17585:6;17582:1;17579:13;17560:284;;;17661:6;17655:13;17688:63;17747:3;17732:13;17688:63;:::i;:::-;17681:70;;17774:60;17827:6;17774:60;:::i;:::-;17764:70;;17620:224;17607:1;17604;17600:9;17595:14;;17560:284;;;17564:14;17860:3;17853:10;;17261:608;;;17137:732;;;;:::o;17875:373::-;18018:4;18056:2;18045:9;18041:18;18033:26;;18105:9;18099:4;18095:20;18091:1;18080:9;18076:17;18069:47;18133:108;18236:4;18227:6;18133:108;:::i;:::-;18125:116;;17875:373;;;;:::o;18254:180::-;18302:77;18299:1;18292:88;18399:4;18396:1;18389:15;18423:4;18420:1;18413:15;18440:320;18484:6;18521:1;18515:4;18511:12;18501:22;;18568:1;18562:4;18558:12;18589:18;18579:81;;18645:4;18637:6;18633:17;18623:27;;18579:81;18707:2;18699:6;18696:14;18676:18;18673:38;18670:84;;18726:18;;:::i;:::-;18670:84;18491:269;18440:320;;;:::o;18766:220::-;18906:34;18902:1;18894:6;18890:14;18883:58;18975:3;18970:2;18962:6;18958:15;18951:28;18766:220;:::o;18992:366::-;19134:3;19155:67;19219:2;19214:3;19155:67;:::i;:::-;19148:74;;19231:93;19320:3;19231:93;:::i;:::-;19349:2;19344:3;19340:12;19333:19;;18992:366;;;:::o;19364:419::-;19530:4;19568:2;19557:9;19553:18;19545:26;;19617:9;19611:4;19607:20;19603:1;19592:9;19588:17;19581:47;19645:131;19771:4;19645:131;:::i;:::-;19637:139;;19364:419;;;:::o;19789:248::-;19929:34;19925:1;19917:6;19913:14;19906:58;19998:31;19993:2;19985:6;19981:15;19974:56;19789:248;:::o;20043:366::-;20185:3;20206:67;20270:2;20265:3;20206:67;:::i;:::-;20199:74;;20282:93;20371:3;20282:93;:::i;:::-;20400:2;20395:3;20391:12;20384:19;;20043:366;;;:::o;20415:419::-;20581:4;20619:2;20608:9;20604:18;20596:26;;20668:9;20662:4;20658:20;20654:1;20643:9;20639:17;20632:47;20696:131;20822:4;20696:131;:::i;:::-;20688:139;;20415:419;;;:::o;20840:141::-;20889:4;20912:3;20904:11;;20935:3;20932:1;20925:14;20969:4;20966:1;20956:18;20948:26;;20840:141;;;:::o;20987:93::-;21024:6;21071:2;21066;21059:5;21055:14;21051:23;21041:33;;20987:93;;;:::o;21086:107::-;21130:8;21180:5;21174:4;21170:16;21149:37;;21086:107;;;;:::o;21199:393::-;21268:6;21318:1;21306:10;21302:18;21341:97;21371:66;21360:9;21341:97;:::i;:::-;21459:39;21489:8;21478:9;21459:39;:::i;:::-;21447:51;;21531:4;21527:9;21520:5;21516:21;21507:30;;21580:4;21570:8;21566:19;21559:5;21556:30;21546:40;;21275:317;;21199:393;;;;;:::o;21598:60::-;21626:3;21647:5;21640:12;;21598:60;;;:::o;21664:142::-;21714:9;21747:53;21765:34;21774:24;21792:5;21774:24;:::i;:::-;21765:34;:::i;:::-;21747:53;:::i;:::-;21734:66;;21664:142;;;:::o;21812:75::-;21855:3;21876:5;21869:12;;21812:75;;;:::o;21893:269::-;22003:39;22034:7;22003:39;:::i;:::-;22064:91;22113:41;22137:16;22113:41;:::i;:::-;22105:6;22098:4;22092:11;22064:91;:::i;:::-;22058:4;22051:105;21969:193;21893:269;;;:::o;22168:73::-;22213:3;22168:73;:::o;22247:189::-;22324:32;;:::i;:::-;22365:65;22423:6;22415;22409:4;22365:65;:::i;:::-;22300:136;22247:189;;:::o;22442:186::-;22502:120;22519:3;22512:5;22509:14;22502:120;;;22573:39;22610:1;22603:5;22573:39;:::i;:::-;22546:1;22539:5;22535:13;22526:22;;22502:120;;;22442:186;;:::o;22634:543::-;22735:2;22730:3;22727:11;22724:446;;;22769:38;22801:5;22769:38;:::i;:::-;22853:29;22871:10;22853:29;:::i;:::-;22843:8;22839:44;23036:2;23024:10;23021:18;23018:49;;;23057:8;23042:23;;23018:49;23080:80;23136:22;23154:3;23136:22;:::i;:::-;23126:8;23122:37;23109:11;23080:80;:::i;:::-;22739:431;;22724:446;22634:543;;;:::o;23183:117::-;23237:8;23287:5;23281:4;23277:16;23256:37;;23183:117;;;;:::o;23306:169::-;23350:6;23383:51;23431:1;23427:6;23419:5;23416:1;23412:13;23383:51;:::i;:::-;23379:56;23464:4;23458;23454:15;23444:25;;23357:118;23306:169;;;;:::o;23480:295::-;23556:4;23702:29;23727:3;23721:4;23702:29;:::i;:::-;23694:37;;23764:3;23761:1;23757:11;23751:4;23748:21;23740:29;;23480:295;;;;:::o;23780:1395::-;23897:37;23930:3;23897:37;:::i;:::-;23999:18;23991:6;23988:30;23985:56;;;24021:18;;:::i;:::-;23985:56;24065:38;24097:4;24091:11;24065:38;:::i;:::-;24150:67;24210:6;24202;24196:4;24150:67;:::i;:::-;24244:1;24268:4;24255:17;;24300:2;24292:6;24289:14;24317:1;24312:618;;;;24974:1;24991:6;24988:77;;;25040:9;25035:3;25031:19;25025:26;25016:35;;24988:77;25091:67;25151:6;25144:5;25091:67;:::i;:::-;25085:4;25078:81;24947:222;24282:887;;24312:618;24364:4;24360:9;24352:6;24348:22;24398:37;24430:4;24398:37;:::i;:::-;24457:1;24471:208;24485:7;24482:1;24479:14;24471:208;;;24564:9;24559:3;24555:19;24549:26;24541:6;24534:42;24615:1;24607:6;24603:14;24593:24;;24662:2;24651:9;24647:18;24634:31;;24508:4;24505:1;24501:12;24496:17;;24471:208;;;24707:6;24698:7;24695:19;24692:179;;;24765:9;24760:3;24756:19;24750:26;24808:48;24850:4;24842:6;24838:17;24827:9;24808:48;:::i;:::-;24800:6;24793:64;24715:156;24692:179;24917:1;24913;24905:6;24901:14;24897:22;24891:4;24884:36;24319:611;;;24282:887;;23872:1303;;;23780:1395;;:::o;25181:332::-;25302:4;25340:2;25329:9;25325:18;25317:26;;25353:71;25421:1;25410:9;25406:17;25397:6;25353:71;:::i;:::-;25434:72;25502:2;25491:9;25487:18;25478:6;25434:72;:::i;:::-;25181:332;;;;;:::o;25519:137::-;25573:5;25604:6;25598:13;25589:22;;25620:30;25644:5;25620:30;:::i;:::-;25519:137;;;;:::o;25662:345::-;25729:6;25778:2;25766:9;25757:7;25753:23;25749:32;25746:119;;;25784:79;;:::i;:::-;25746:119;25904:1;25929:61;25982:7;25973:6;25962:9;25958:22;25929:61;:::i;:::-;25919:71;;25875:125;25662:345;;;;:::o;26013:180::-;26061:77;26058:1;26051:88;26158:4;26155:1;26148:15;26182:4;26179:1;26172:15;26199:348;26239:7;26262:20;26280:1;26262:20;:::i;:::-;26257:25;;26296:20;26314:1;26296:20;:::i;:::-;26291:25;;26484:1;26416:66;26412:74;26409:1;26406:81;26401:1;26394:9;26387:17;26383:105;26380:131;;;26491:18;;:::i;:::-;26380:131;26539:1;26536;26532:9;26521:20;;26199:348;;;;:::o;26553:180::-;26601:77;26598:1;26591:88;26698:4;26695:1;26688:15;26722:4;26719:1;26712:15;26739:185;26779:1;26796:20;26814:1;26796:20;:::i;:::-;26791:25;;26830:20;26848:1;26830:20;:::i;:::-;26825:25;;26869:1;26859:35;;26874:18;;:::i;:::-;26859:35;26916:1;26913;26909:9;26904:14;;26739:185;;;;:::o;26930:147::-;27031:11;27068:3;27053:18;;26930:147;;;;:::o;27083:114::-;;:::o;27203:398::-;27362:3;27383:83;27464:1;27459:3;27383:83;:::i;:::-;27376:90;;27475:93;27564:3;27475:93;:::i;:::-;27593:1;27588:3;27584:11;27577:18;;27203:398;;;:::o;27607:379::-;27791:3;27813:147;27956:3;27813:147;:::i;:::-;27806:154;;27977:3;27970:10;;27607:379;;;:::o;27992:174::-;28132:26;28128:1;28120:6;28116:14;28109:50;27992:174;:::o;28172:366::-;28314:3;28335:67;28399:2;28394:3;28335:67;:::i;:::-;28328:74;;28411:93;28500:3;28411:93;:::i;:::-;28529:2;28524:3;28520:12;28513:19;;28172:366;;;:::o;28544:419::-;28710:4;28748:2;28737:9;28733:18;28725:26;;28797:9;28791:4;28787:20;28783:1;28772:9;28768:17;28761:47;28825:131;28951:4;28825:131;:::i;:::-;28817:139;;28544:419;;;:::o;28969:180::-;29017:77;29014:1;29007:88;29114:4;29111:1;29104:15;29138:4;29135:1;29128:15;29155:233;29194:3;29217:24;29235:5;29217:24;:::i;:::-;29208:33;;29263:66;29256:5;29253:77;29250:103;;29333:18;;:::i;:::-;29250:103;29380:1;29373:5;29369:13;29362:20;;29155:233;;;:::o;29394:228::-;29534:34;29530:1;29522:6;29518:14;29511:58;29603:11;29598:2;29590:6;29586:15;29579:36;29394:228;:::o;29628:366::-;29770:3;29791:67;29855:2;29850:3;29791:67;:::i;:::-;29784:74;;29867:93;29956:3;29867:93;:::i;:::-;29985:2;29980:3;29976:12;29969:19;;29628:366;;;:::o;30000:419::-;30166:4;30204:2;30193:9;30189:18;30181:26;;30253:9;30247:4;30243:20;30239:1;30228:9;30224:17;30217:47;30281:131;30407:4;30281:131;:::i;:::-;30273:139;;30000:419;;;:::o;30425:305::-;30465:3;30484:20;30502:1;30484:20;:::i;:::-;30479:25;;30518:20;30536:1;30518:20;:::i;:::-;30513:25;;30672:1;30604:66;30600:74;30597:1;30594:81;30591:107;;;30678:18;;:::i;:::-;30591:107;30722:1;30719;30715:9;30708:16;;30425:305;;;;:::o;30736:170::-;30876:22;30872:1;30864:6;30860:14;30853:46;30736:170;:::o;30912:366::-;31054:3;31075:67;31139:2;31134:3;31075:67;:::i;:::-;31068:74;;31151:93;31240:3;31151:93;:::i;:::-;31269:2;31264:3;31260:12;31253:19;;30912:366;;;:::o;31284:419::-;31450:4;31488:2;31477:9;31473:18;31465:26;;31537:9;31531:4;31527:20;31523:1;31512:9;31508:17;31501:47;31565:131;31691:4;31565:131;:::i;:::-;31557:139;;31284:419;;;:::o;31709:242::-;31849:34;31845:1;31837:6;31833:14;31826:58;31918:25;31913:2;31905:6;31901:15;31894:50;31709:242;:::o;31957:366::-;32099:3;32120:67;32184:2;32179:3;32120:67;:::i;:::-;32113:74;;32196:93;32285:3;32196:93;:::i;:::-;32314:2;32309:3;32305:12;32298:19;;31957:366;;;:::o;32329:419::-;32495:4;32533:2;32522:9;32518:18;32510:26;;32582:9;32576:4;32572:20;32568:1;32557:9;32553:17;32546:47;32610:131;32736:4;32610:131;:::i;:::-;32602:139;;32329:419;;;:::o;32754:169::-;32894:21;32890:1;32882:6;32878:14;32871:45;32754:169;:::o;32929:366::-;33071:3;33092:67;33156:2;33151:3;33092:67;:::i;:::-;33085:74;;33168:93;33257:3;33168:93;:::i;:::-;33286:2;33281:3;33277:12;33270:19;;32929:366;;;:::o;33301:419::-;33467:4;33505:2;33494:9;33490:18;33482:26;;33554:9;33548:4;33544:20;33540:1;33529:9;33525:17;33518:47;33582:131;33708:4;33582:131;:::i;:::-;33574:139;;33301:419;;;:::o;33726:227::-;33866:34;33862:1;33854:6;33850:14;33843:58;33935:10;33930:2;33922:6;33918:15;33911:35;33726:227;:::o;33959:366::-;34101:3;34122:67;34186:2;34181:3;34122:67;:::i;:::-;34115:74;;34198:93;34287:3;34198:93;:::i;:::-;34316:2;34311:3;34307:12;34300:19;;33959:366;;;:::o;34331:419::-;34497:4;34535:2;34524:9;34520:18;34512:26;;34584:9;34578:4;34574:20;34570:1;34559:9;34555:17;34548:47;34612:131;34738:4;34612:131;:::i;:::-;34604:139;;34331:419;;;:::o;34756:224::-;34896:34;34892:1;34884:6;34880:14;34873:58;34965:7;34960:2;34952:6;34948:15;34941:32;34756:224;:::o;34986:366::-;35128:3;35149:67;35213:2;35208:3;35149:67;:::i;:::-;35142:74;;35225:93;35314:3;35225:93;:::i;:::-;35343:2;35338:3;35334:12;35327:19;;34986:366;;;:::o;35358:419::-;35524:4;35562:2;35551:9;35547:18;35539:26;;35611:9;35605:4;35601:20;35597:1;35586:9;35582:17;35575:47;35639:131;35765:4;35639:131;:::i;:::-;35631:139;;35358:419;;;:::o;35783:163::-;35923:15;35919:1;35911:6;35907:14;35900:39;35783:163;:::o;35952:366::-;36094:3;36115:67;36179:2;36174:3;36115:67;:::i;:::-;36108:74;;36191:93;36280:3;36191:93;:::i;:::-;36309:2;36304:3;36300:12;36293:19;;35952:366;;;:::o;36324:419::-;36490:4;36528:2;36517:9;36513:18;36505:26;;36577:9;36571:4;36567:20;36563:1;36552:9;36548:17;36541:47;36605:131;36731:4;36605:131;:::i;:::-;36597:139;;36324:419;;;:::o;36749:172::-;36889:24;36885:1;36877:6;36873:14;36866:48;36749:172;:::o;36927:366::-;37069:3;37090:67;37154:2;37149:3;37090:67;:::i;:::-;37083:74;;37166:93;37255:3;37166:93;:::i;:::-;37284:2;37279:3;37275:12;37268:19;;36927:366;;;:::o;37299:419::-;37465:4;37503:2;37492:9;37488:18;37480:26;;37552:9;37546:4;37542:20;37538:1;37527:9;37523:17;37516:47;37580:131;37706:4;37580:131;:::i;:::-;37572:139;;37299:419;;;:::o;37724:169::-;37864:21;37860:1;37852:6;37848:14;37841:45;37724:169;:::o;37899:366::-;38041:3;38062:67;38126:2;38121:3;38062:67;:::i;:::-;38055:74;;38138:93;38227:3;38138:93;:::i;:::-;38256:2;38251:3;38247:12;38240:19;;37899:366;;;:::o;38271:419::-;38437:4;38475:2;38464:9;38460:18;38452:26;;38524:9;38518:4;38514:20;38510:1;38499:9;38495:17;38488:47;38552:131;38678:4;38552:131;:::i;:::-;38544:139;;38271:419;;;:::o;38696:234::-;38836:34;38832:1;38824:6;38820:14;38813:58;38905:17;38900:2;38892:6;38888:15;38881:42;38696:234;:::o;38936:366::-;39078:3;39099:67;39163:2;39158:3;39099:67;:::i;:::-;39092:74;;39175:93;39264:3;39175:93;:::i;:::-;39293:2;39288:3;39284:12;39277:19;;38936:366;;;:::o;39308:419::-;39474:4;39512:2;39501:9;39497:18;39489:26;;39561:9;39555:4;39551:20;39547:1;39536:9;39532:17;39525:47;39589:131;39715:4;39589:131;:::i;:::-;39581:139;;39308:419;;;:::o;39733:148::-;39835:11;39872:3;39857:18;;39733:148;;;;:::o;39887:377::-;39993:3;40021:39;40054:5;40021:39;:::i;:::-;40076:89;40158:6;40153:3;40076:89;:::i;:::-;40069:96;;40174:52;40219:6;40214:3;40207:4;40200:5;40196:16;40174:52;:::i;:::-;40251:6;40246:3;40242:16;40235:23;;39997:267;39887:377;;;;:::o;40294:874::-;40397:3;40434:5;40428:12;40463:36;40489:9;40463:36;:::i;:::-;40515:89;40597:6;40592:3;40515:89;:::i;:::-;40508:96;;40635:1;40624:9;40620:17;40651:1;40646:166;;;;40826:1;40821:341;;;;40613:549;;40646:166;40730:4;40726:9;40715;40711:25;40706:3;40699:38;40792:6;40785:14;40778:22;40770:6;40766:35;40761:3;40757:45;40750:52;;40646:166;;40821:341;40888:38;40920:5;40888:38;:::i;:::-;40948:1;40962:154;40976:6;40973:1;40970:13;40962:154;;;41050:7;41044:14;41040:1;41035:3;41031:11;41024:35;41100:1;41091:7;41087:15;41076:26;;40998:4;40995:1;40991:12;40986:17;;40962:154;;;41145:6;41140:3;41136:16;41129:23;;40828:334;;40613:549;;40401:767;;40294:874;;;;:::o;41174:589::-;41399:3;41421:95;41512:3;41503:6;41421:95;:::i;:::-;41414:102;;41533:95;41624:3;41615:6;41533:95;:::i;:::-;41526:102;;41645:92;41733:3;41724:6;41645:92;:::i;:::-;41638:99;;41754:3;41747:10;;41174:589;;;;;;:::o;41769:275::-;41901:3;41923:95;42014:3;42005:6;41923:95;:::i;:::-;41916:102;;42035:3;42028:10;;41769:275;;;;:::o;42050:191::-;42090:4;42110:20;42128:1;42110:20;:::i;:::-;42105:25;;42144:20;42162:1;42144:20;:::i;:::-;42139:25;;42183:1;42180;42177:8;42174:34;;;42188:18;;:::i;:::-;42174:34;42233:1;42230;42226:9;42218:17;;42050:191;;;;:::o;42247:225::-;42387:34;42383:1;42375:6;42371:14;42364:58;42456:8;42451:2;42443:6;42439:15;42432:33;42247:225;:::o;42478:366::-;42620:3;42641:67;42705:2;42700:3;42641:67;:::i;:::-;42634:74;;42717:93;42806:3;42717:93;:::i;:::-;42835:2;42830:3;42826:12;42819:19;;42478:366;;;:::o;42850:419::-;43016:4;43054:2;43043:9;43039:18;43031:26;;43103:9;43097:4;43093:20;43089:1;43078:9;43074:17;43067:47;43131:131;43257:4;43131:131;:::i;:::-;43123:139;;42850:419;;;:::o;43275:182::-;43415:34;43411:1;43403:6;43399:14;43392:58;43275:182;:::o;43463:366::-;43605:3;43626:67;43690:2;43685:3;43626:67;:::i;:::-;43619:74;;43702:93;43791:3;43702:93;:::i;:::-;43820:2;43815:3;43811:12;43804:19;;43463:366;;;:::o;43835:419::-;44001:4;44039:2;44028:9;44024:18;44016:26;;44088:9;44082:4;44078:20;44074:1;44063:9;44059:17;44052:47;44116:131;44242:4;44116:131;:::i;:::-;44108:139;;43835:419;;;:::o;44260:229::-;44400:34;44396:1;44388:6;44384:14;44377:58;44469:12;44464:2;44456:6;44452:15;44445:37;44260:229;:::o;44495:366::-;44637:3;44658:67;44722:2;44717:3;44658:67;:::i;:::-;44651:74;;44734:93;44823:3;44734:93;:::i;:::-;44852:2;44847:3;44843:12;44836:19;;44495:366;;;:::o;44867:419::-;45033:4;45071:2;45060:9;45056:18;45048:26;;45120:9;45114:4;45110:20;45106:1;45095:9;45091:17;45084:47;45148:131;45274:4;45148:131;:::i;:::-;45140:139;;44867:419;;;:::o;45292:175::-;45432:27;45428:1;45420:6;45416:14;45409:51;45292:175;:::o;45473:366::-;45615:3;45636:67;45700:2;45695:3;45636:67;:::i;:::-;45629:74;;45712:93;45801:3;45712:93;:::i;:::-;45830:2;45825:3;45821:12;45814:19;;45473:366;;;:::o;45845:419::-;46011:4;46049:2;46038:9;46034:18;46026:26;;46098:9;46092:4;46088:20;46084:1;46073:9;46069:17;46062:47;46126:131;46252:4;46126:131;:::i;:::-;46118:139;;45845:419;;;:::o;46270:232::-;46410:34;46406:1;46398:6;46394:14;46387:58;46479:15;46474:2;46466:6;46462:15;46455:40;46270:232;:::o;46508:366::-;46650:3;46671:67;46735:2;46730:3;46671:67;:::i;:::-;46664:74;;46747:93;46836:3;46747:93;:::i;:::-;46865:2;46860:3;46856:12;46849:19;;46508:366;;;:::o;46880:419::-;47046:4;47084:2;47073:9;47069:18;47061:26;;47133:9;47127:4;47123:20;47119:1;47108:9;47104:17;47097:47;47161:131;47287:4;47161:131;:::i;:::-;47153:139;;46880:419;;;:::o;47305:224::-;47445:34;47441:1;47433:6;47429:14;47422:58;47514:7;47509:2;47501:6;47497:15;47490:32;47305:224;:::o;47535:366::-;47677:3;47698:67;47762:2;47757:3;47698:67;:::i;:::-;47691:74;;47774:93;47863:3;47774:93;:::i;:::-;47892:2;47887:3;47883:12;47876:19;;47535:366;;;:::o;47907:419::-;48073:4;48111:2;48100:9;48096:18;48088:26;;48160:9;48154:4;48150:20;48146:1;48135:9;48131:17;48124:47;48188:131;48314:4;48188:131;:::i;:::-;48180:139;;47907:419;;;:::o;48332:175::-;48472:27;48468:1;48460:6;48456:14;48449:51;48332:175;:::o;48513:366::-;48655:3;48676:67;48740:2;48735:3;48676:67;:::i;:::-;48669:74;;48752:93;48841:3;48752:93;:::i;:::-;48870:2;48865:3;48861:12;48854:19;;48513:366;;;:::o;48885:419::-;49051:4;49089:2;49078:9;49074:18;49066:26;;49138:9;49132:4;49128:20;49124:1;49113:9;49109:17;49102:47;49166:131;49292:4;49166:131;:::i;:::-;49158:139;;48885:419;;;:::o;49310:224::-;49450:34;49446:1;49438:6;49434:14;49427:58;49519:7;49514:2;49506:6;49502:15;49495:32;49310:224;:::o;49540:366::-;49682:3;49703:67;49767:2;49762:3;49703:67;:::i;:::-;49696:74;;49779:93;49868:3;49779:93;:::i;:::-;49897:2;49892:3;49888:12;49881:19;;49540:366;;;:::o;49912:419::-;50078:4;50116:2;50105:9;50101:18;50093:26;;50165:9;50159:4;50155:20;50151:1;50140:9;50136:17;50129:47;50193:131;50319:4;50193:131;:::i;:::-;50185:139;;49912:419;;;:::o;50337:223::-;50477:34;50473:1;50465:6;50461:14;50454:58;50546:6;50541:2;50533:6;50529:15;50522:31;50337:223;:::o;50566:366::-;50708:3;50729:67;50793:2;50788:3;50729:67;:::i;:::-;50722:74;;50805:93;50894:3;50805:93;:::i;:::-;50923:2;50918:3;50914:12;50907:19;;50566:366;;;:::o;50938:419::-;51104:4;51142:2;51131:9;51127:18;51119:26;;51191:9;51185:4;51181:20;51177:1;51166:9;51162:17;51155:47;51219:131;51345:4;51219:131;:::i;:::-;51211:139;;50938:419;;;:::o;51363:237::-;51503:34;51499:1;51491:6;51487:14;51480:58;51572:20;51567:2;51559:6;51555:15;51548:45;51363:237;:::o;51606:366::-;51748:3;51769:67;51833:2;51828:3;51769:67;:::i;:::-;51762:74;;51845:93;51934:3;51845:93;:::i;:::-;51963:2;51958:3;51954:12;51947:19;;51606:366;;;:::o;51978:419::-;52144:4;52182:2;52171:9;52167:18;52159:26;;52231:9;52225:4;52221:20;52217:1;52206:9;52202:17;52195:47;52259:131;52385:4;52259:131;:::i;:::-;52251:139;;51978:419;;;:::o;52403:221::-;52543:34;52539:1;52531:6;52527:14;52520:58;52612:4;52607:2;52599:6;52595:15;52588:29;52403:221;:::o;52630:366::-;52772:3;52793:67;52857:2;52852:3;52793:67;:::i;:::-;52786:74;;52869:93;52958:3;52869:93;:::i;:::-;52987:2;52982:3;52978:12;52971:19;;52630:366;;;:::o;53002:419::-;53168:4;53206:2;53195:9;53191:18;53183:26;;53255:9;53249:4;53245:20;53241:1;53230:9;53226:17;53219:47;53283:131;53409:4;53283:131;:::i;:::-;53275:139;;53002:419;;;:::o;53427:180::-;53475:77;53472:1;53465:88;53572:4;53569:1;53562:15;53596:4;53593:1;53586:15;53613:98;53664:6;53698:5;53692:12;53682:22;;53613:98;;;:::o;53717:168::-;53800:11;53834:6;53829:3;53822:19;53874:4;53869:3;53865:14;53850:29;;53717:168;;;;:::o;53891:360::-;53977:3;54005:38;54037:5;54005:38;:::i;:::-;54059:70;54122:6;54117:3;54059:70;:::i;:::-;54052:77;;54138:52;54183:6;54178:3;54171:4;54164:5;54160:16;54138:52;:::i;:::-;54215:29;54237:6;54215:29;:::i;:::-;54210:3;54206:39;54199:46;;53981:270;53891:360;;;;:::o;54257:640::-;54452:4;54490:3;54479:9;54475:19;54467:27;;54504:71;54572:1;54561:9;54557:17;54548:6;54504:71;:::i;:::-;54585:72;54653:2;54642:9;54638:18;54629:6;54585:72;:::i;:::-;54667;54735:2;54724:9;54720:18;54711:6;54667:72;:::i;:::-;54786:9;54780:4;54776:20;54771:2;54760:9;54756:18;54749:48;54814:76;54885:4;54876:6;54814:76;:::i;:::-;54806:84;;54257:640;;;;;;;:::o;54903:141::-;54959:5;54990:6;54984:13;54975:22;;55006:32;55032:5;55006:32;:::i;:::-;54903:141;;;;:::o;55050:349::-;55119:6;55168:2;55156:9;55147:7;55143:23;55139:32;55136:119;;;55174:79;;:::i;:::-;55136:119;55294:1;55319:63;55374:7;55365:6;55354:9;55350:22;55319:63;:::i;:::-;55309:73;;55265:127;55050:349;;;;:::o;55405:182::-;55545:34;55541:1;55533:6;55529:14;55522:58;55405:182;:::o;55593:366::-;55735:3;55756:67;55820:2;55815:3;55756:67;:::i;:::-;55749:74;;55832:93;55921:3;55832:93;:::i;:::-;55950:2;55945:3;55941:12;55934:19;;55593:366;;;:::o;55965:419::-;56131:4;56169:2;56158:9;56154:18;56146:26;;56218:9;56212:4;56208:20;56204:1;56193:9;56189:17;56182:47;56246:131;56372:4;56246:131;:::i;:::-;56238:139;;55965:419;;;:::o;56390:178::-;56530:30;56526:1;56518:6;56514:14;56507:54;56390:178;:::o;56574:366::-;56716:3;56737:67;56801:2;56796:3;56737:67;:::i;:::-;56730:74;;56813:93;56902:3;56813:93;:::i;:::-;56931:2;56926:3;56922:12;56915:19;;56574:366;;;:::o;56946:419::-;57112:4;57150:2;57139:9;57135:18;57127:26;;57199:9;57193:4;57189:20;57185:1;57174:9;57170:17;57163:47;57227:131;57353:4;57227:131;:::i;:::-;57219:139;;56946:419;;;:::o

Swarm Source

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