function inheritedNonEnumerableProperties( value, level ) { // eslint-disable-line id-length
	var props;
	var cache;
	var obj;
	var tmp;
	var N;
	var n;
	var k;
	var i;

	if ( arguments.length > 1 ) {
		if ( !isPositiveInteger( level ) ) {
			throw new TypeError( format( 'invalid argument. Second argument must be a positive integer. Value: `%s`.', level ) );
		}
		N = level;
	} else {
		N = MAX_SAFE_INTEGER;
	}
	if ( value === null || value === void 0 ) {
		return [];
	}
	// Get the value's prototype:
	obj = getPrototypeOf( value );

	// Walk the prototype chain collecting non-enumerable properties...
	props = [];
	cache = {};
	n = 1;
	while ( obj && n <= N ) {
		tmp = getOwnPropertyNames( obj );
		for ( i = 0; i < tmp.length; i++ ) {
			k = tmp[ i ];
			if (
				hasOwnProp( cache, k ) === false &&
				isNonEnumerableProperty( obj, k )
			) {
				props.push( k );
			}
			cache[ k ] = true;
		}
		tmp = getOwnPropertySymbols( obj );
		for ( i = 0; i < tmp.length; i++ ) {
			k = tmp[ i ];
			if (
				hasOwnProp( cache, k ) === false &&
				isNonEnumerableProperty( obj, k )
			) {
				props.push( k );
			}
			cache[ k ] = true;
		}
		obj = getPrototypeOf( obj );
		n += 1;
	}

	return props;
}
Returns an array of an object's inherited non-enumerable property names and symbols.

@param {*} value - input object
@param {PositiveInteger} [level] - inheritance level
@throws {TypeError} second argument must be a positive integer
@returns {Array} a list of inherited non-enumerable property names and symbols

@example
var props = inheritedNonEnumerableProperties( {} );