| define( [ | 
 | 	"./core", | 
 | 	"./core/access", | 
 | 	"./var/documentElement", | 
 | 	"./var/isFunction", | 
 | 	"./css/var/rnumnonpx", | 
 | 	"./css/curCSS", | 
 | 	"./css/addGetHookIf", | 
 | 	"./css/support", | 
 | 	"./var/isWindow", | 
 | 	"./core/init", | 
 | 	"./css", | 
 | 	"./selector" // contains | 
 | ], function( jQuery, access, documentElement, isFunction, rnumnonpx, | 
 | 	curCSS, addGetHookIf, support, isWindow ) { | 
 |  | 
 | "use strict"; | 
 |  | 
 | jQuery.offset = { | 
 | 	setOffset: function( elem, options, i ) { | 
 | 		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, | 
 | 			position = jQuery.css( elem, "position" ), | 
 | 			curElem = jQuery( elem ), | 
 | 			props = {}; | 
 |  | 
 | 		// Set position first, in-case top/left are set even on static elem | 
 | 		if ( position === "static" ) { | 
 | 			elem.style.position = "relative"; | 
 | 		} | 
 |  | 
 | 		curOffset = curElem.offset(); | 
 | 		curCSSTop = jQuery.css( elem, "top" ); | 
 | 		curCSSLeft = jQuery.css( elem, "left" ); | 
 | 		calculatePosition = ( position === "absolute" || position === "fixed" ) && | 
 | 			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; | 
 |  | 
 | 		// Need to be able to calculate position if either | 
 | 		// top or left is auto and position is either absolute or fixed | 
 | 		if ( calculatePosition ) { | 
 | 			curPosition = curElem.position(); | 
 | 			curTop = curPosition.top; | 
 | 			curLeft = curPosition.left; | 
 |  | 
 | 		} else { | 
 | 			curTop = parseFloat( curCSSTop ) || 0; | 
 | 			curLeft = parseFloat( curCSSLeft ) || 0; | 
 | 		} | 
 |  | 
 | 		if ( isFunction( options ) ) { | 
 |  | 
 | 			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848) | 
 | 			options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); | 
 | 		} | 
 |  | 
 | 		if ( options.top != null ) { | 
 | 			props.top = ( options.top - curOffset.top ) + curTop; | 
 | 		} | 
 | 		if ( options.left != null ) { | 
 | 			props.left = ( options.left - curOffset.left ) + curLeft; | 
 | 		} | 
 |  | 
 | 		if ( "using" in options ) { | 
 | 			options.using.call( elem, props ); | 
 |  | 
 | 		} else { | 
 | 			curElem.css( props ); | 
 | 		} | 
 | 	} | 
 | }; | 
 |  | 
 | jQuery.fn.extend( { | 
 |  | 
 | 	// offset() relates an element's border box to the document origin | 
 | 	offset: function( options ) { | 
 |  | 
 | 		// Preserve chaining for setter | 
 | 		if ( arguments.length ) { | 
 | 			return options === undefined ? | 
 | 				this : | 
 | 				this.each( function( i ) { | 
 | 					jQuery.offset.setOffset( this, options, i ); | 
 | 				} ); | 
 | 		} | 
 |  | 
 | 		var rect, win, | 
 | 			elem = this[ 0 ]; | 
 |  | 
 | 		if ( !elem ) { | 
 | 			return; | 
 | 		} | 
 |  | 
 | 		// Return zeros for disconnected and hidden (display: none) elements (gh-2310) | 
 | 		// Support: IE <=11 only | 
 | 		// Running getBoundingClientRect on a | 
 | 		// disconnected node in IE throws an error | 
 | 		if ( !elem.getClientRects().length ) { | 
 | 			return { top: 0, left: 0 }; | 
 | 		} | 
 |  | 
 | 		// Get document-relative position by adding viewport scroll to viewport-relative gBCR | 
 | 		rect = elem.getBoundingClientRect(); | 
 | 		win = elem.ownerDocument.defaultView; | 
 | 		return { | 
 | 			top: rect.top + win.pageYOffset, | 
 | 			left: rect.left + win.pageXOffset | 
 | 		}; | 
 | 	}, | 
 |  | 
 | 	// position() relates an element's margin box to its offset parent's padding box | 
 | 	// This corresponds to the behavior of CSS absolute positioning | 
 | 	position: function() { | 
 | 		if ( !this[ 0 ] ) { | 
 | 			return; | 
 | 		} | 
 |  | 
 | 		var offsetParent, offset, doc, | 
 | 			elem = this[ 0 ], | 
 | 			parentOffset = { top: 0, left: 0 }; | 
 |  | 
 | 		// position:fixed elements are offset from the viewport, which itself always has zero offset | 
 | 		if ( jQuery.css( elem, "position" ) === "fixed" ) { | 
 |  | 
 | 			// Assume position:fixed implies availability of getBoundingClientRect | 
 | 			offset = elem.getBoundingClientRect(); | 
 |  | 
 | 		} else { | 
 | 			offset = this.offset(); | 
 |  | 
 | 			// Account for the *real* offset parent, which can be the document or its root element | 
 | 			// when a statically positioned element is identified | 
 | 			doc = elem.ownerDocument; | 
 | 			offsetParent = elem.offsetParent || doc.documentElement; | 
 | 			while ( offsetParent && | 
 | 				( offsetParent === doc.body || offsetParent === doc.documentElement ) && | 
 | 				jQuery.css( offsetParent, "position" ) === "static" ) { | 
 |  | 
 | 				offsetParent = offsetParent.parentNode; | 
 | 			} | 
 | 			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { | 
 |  | 
 | 				// Incorporate borders into its offset, since they are outside its content origin | 
 | 				parentOffset = jQuery( offsetParent ).offset(); | 
 | 				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true ); | 
 | 				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true ); | 
 | 			} | 
 | 		} | 
 |  | 
 | 		// Subtract parent offsets and element margins | 
 | 		return { | 
 | 			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), | 
 | 			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) | 
 | 		}; | 
 | 	}, | 
 |  | 
 | 	// This method will return documentElement in the following cases: | 
 | 	// 1) For the element inside the iframe without offsetParent, this method will return | 
 | 	//    documentElement of the parent window | 
 | 	// 2) For the hidden or detached element | 
 | 	// 3) For body or html element, i.e. in case of the html node - it will return itself | 
 | 	// | 
 | 	// but those exceptions were never presented as a real life use-cases | 
 | 	// and might be considered as more preferable results. | 
 | 	// | 
 | 	// This logic, however, is not guaranteed and can change at any point in the future | 
 | 	offsetParent: function() { | 
 | 		return this.map( function() { | 
 | 			var offsetParent = this.offsetParent; | 
 |  | 
 | 			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { | 
 | 				offsetParent = offsetParent.offsetParent; | 
 | 			} | 
 |  | 
 | 			return offsetParent || documentElement; | 
 | 		} ); | 
 | 	} | 
 | } ); | 
 |  | 
 | // Create scrollLeft and scrollTop methods | 
 | jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { | 
 | 	var top = "pageYOffset" === prop; | 
 |  | 
 | 	jQuery.fn[ method ] = function( val ) { | 
 | 		return access( this, function( elem, method, val ) { | 
 |  | 
 | 			// Coalesce documents and windows | 
 | 			var win; | 
 | 			if ( isWindow( elem ) ) { | 
 | 				win = elem; | 
 | 			} else if ( elem.nodeType === 9 ) { | 
 | 				win = elem.defaultView; | 
 | 			} | 
 |  | 
 | 			if ( val === undefined ) { | 
 | 				return win ? win[ prop ] : elem[ method ]; | 
 | 			} | 
 |  | 
 | 			if ( win ) { | 
 | 				win.scrollTo( | 
 | 					!top ? val : win.pageXOffset, | 
 | 					top ? val : win.pageYOffset | 
 | 				); | 
 |  | 
 | 			} else { | 
 | 				elem[ method ] = val; | 
 | 			} | 
 | 		}, method, val, arguments.length ); | 
 | 	}; | 
 | } ); | 
 |  | 
 | // Support: Safari <=7 - 9.1, Chrome <=37 - 49 | 
 | // Add the top/left cssHooks using jQuery.fn.position | 
 | // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 | 
 | // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 | 
 | // getComputedStyle returns percent when specified for top/left/bottom/right; | 
 | // rather than make the css module depend on the offset module, just check for it here | 
 | jQuery.each( [ "top", "left" ], function( _i, prop ) { | 
 | 	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, | 
 | 		function( elem, computed ) { | 
 | 			if ( computed ) { | 
 | 				computed = curCSS( elem, prop ); | 
 |  | 
 | 				// If curCSS returns percentage, fallback to offset | 
 | 				return rnumnonpx.test( computed ) ? | 
 | 					jQuery( elem ).position()[ prop ] + "px" : | 
 | 					computed; | 
 | 			} | 
 | 		} | 
 | 	); | 
 | } ); | 
 |  | 
 | return jQuery; | 
 | } ); |