PageSourceSearch

https://confirming-factoring.santander.com.co/factoring/common/js/jquery.js

js santander.com.co collected 2026-10-05 02:59:47 UTC 287,566 bytes, 10,871 lines download raw bytes

vendor: 5,154 bytes, lines 1-193
1/*!
2 * https://jquery.com/
3 *
4 * Includes Sizzle.js
5 * https://sizzlejs.com/
6 *
7 * Copyright JS Foundation and other contributors
8 * Released under the MIT license
9 * https://jquery.org/license
10 *
11 * Date: 2020-05-04T22:49Z
12 */
13( function( global, factory ) {
14
15	"use strict";
16
17	if ( typeof module === "object" && typeof module.exports === "object" ) {
18
19		// For CommonJS and CommonJS-like environments where a proper `window`
20		// is present, execute the factory and get jQuery.
21		// For environments that do not have a `window` with a `document`
22		// (such as Node.js), expose a factory as module.exports.
23		// This accentuates the need for the creation of a real `window`.
24		// e.g. var jQuery = require("jquery")(window);
25		// See ticket #14549 for more info.
26		module.exports = global.document ?
27			factory( global, true ) :
28			function( w ) {
29				if ( !w.document ) {
30					throw new Error( "jQuery requires a window with a document" );
31				}
32				return factory( w );
33			};
34	} else {
35		factory( global );
36	}
37
38// Pass this if window is not defined yet
39} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
40
41// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
42// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
43// arguments.callee.caller (trac-13335). , strict mode should be common
44// enough that all such attempts are guarded in a try block.
45"use strict";
46
47var arr = [];
48
49var getProto = Object.getPrototypeOf;
50
51var slice = arr.slice;
52
53var flat = arr.flat ? function( array ) {
54	return arr.flat.call( array );
55} : function( array ) {
56	return arr.concat.apply( [], array );
57};
58
59
60var push = arr.push;
61
62var indexOf = arr.indexOf;
63
64var class2type = {};
65
66var toString = class2type.toString;
67
68var hasOwn = class2type.hasOwnProperty;
69
70var fnToString = hasOwn.toString;
71
72var ObjectFunctionString = fnToString.call( Object );
73
74var support = {};
75
76var isFunction = function isFunction( obj ) {
77
78      // Support: Chrome <=57, Firefox <=52
79      // In some browsers, typeof returns "function" for HTML <object> elements
80      // (i.e., `typeof document.createElement( "object" ) === "function"`).
81      // We don't want to classify *any* DOM node as a function.
82      return typeof obj === "function" && typeof obj.nodeType !== "number";
83  };
84
85
86var isWindow = function isWindow( obj ) {
87		return obj != null && obj === obj.window;
88	};
89
90
91var document = window.document;
92
93
94
95	var preservedScriptAttributes = {
96		type: true,
97		src: true,
98		nonce: true,
99		noModule: true
100	};
101
102	function DOMEval( code, node, doc ) {
103		doc = doc || document;
104
105		var i, val,
106			script = doc.createElement( "script" );
107
108		script.text = code;
109		if ( node ) {
110			for ( i in preservedScriptAttributes ) {
111
112				// Support: Firefox 64+, Edge 18+
113				// Some browsers don't support the "nonce" property on scripts.
114				// On the other hand, just using `getAttribute` is not enough as
115				// the `nonce` attribute is reset to an empty string whenever it
116				// becomes browsing-context connected.
117				// See https://github.com/whatwg/html/issues/2369
118				// See https://html.spec.whatwg.org/#nonce-attributes
119				// The `node.getAttribute` check was added for the sake of
120				// `jQuery.globalEval` so that it can fake a nonce-containing node
121				// via an object.
122				val = node[ i ] || node.getAttribute && node.getAttribute( i );
123				if ( val ) {
124					script.setAttribute( i, val );
125				}
126			}
127		}
128		doc.head.appendChild( script ).parentNode.removeChild( script );
129	}
130
131
132function toType( obj ) {
133	if ( obj == null ) {
134		return obj + "";
135	}
136
137	// Support: Android <=2.3 only (functionish RegExp)
138	return typeof obj === "object" || typeof obj === "function" ?
139		class2type[ toString.call( obj ) ] || "object" :
140		typeof obj;
141}
142/* global Symbol */
143// Defining this global in .eslintrc.json would create a danger of using the global
144// unguarded in another place, it seems safer to define global only for this module
145
146
147
148var
149	version = "3.5.1",
150
151	// Define a local copy of jQuery
152	jQuery = function( selector, context ) {
153
154		// The jQuery object is actually just the init constructor 'enhanced'
155		// Need init if jQuery is called (just allow error to be thrown if not included)
156		return new jQuery.fn.init( selector, context );
157	};
158
159jQuery.fn = jQuery.prototype = {
160
161	// The current version of jQuery being used
162	jquery: version,
163
164	constructor: jQuery,
165
166	// The default length of a jQuery object is 0
167	length: 0,
168
169	toArray: function() {
170		return slice.call( this );
171	},
172
173	// Get the Nth element in the matched element set OR
174	// Get the whole matched element set as a clean array
175	get: function( num ) {
176
177		// Return all the elements in a clean array
178		if ( num == null ) {
179			return slice.call( this );
180		}
181
182		// Return just the one element from the set
183		return num < 0 ? this[ num + this.length ] : this[ num ];
184	},
185
186	// Take an array of elements and push it onto the stack
187	// (returning the new matched element set)
188	pushStack: function( elems ) {
189
190		// Build a new jQuery matched element set
191		var ret = jQuery.merge( this.constructor(), elems );
192
193		// Add the old object onto the stack (as a reference)
vendor: 6,004 bytes, lines 194-464
194		ret.prevObject = this;
195
196		// Return the newly-formed element set
197		return ret;
198	},
199
200	// Execute a callback for every element in the matched set.
201	each: function( callback ) {
202		return jQuery.each( this, callback );
203	},
204
205	map: function( callback ) {
206		return this.pushStack( jQuery.map( this, function( elem, i ) {
207			return callback.call( elem, i, elem );
208		} ) );
209	},
210
211	slice: function() {
212		return this.pushStack( slice.apply( this, arguments ) );
213	},
214
215	first: function() {
216		return this.eq( 0 );
217	},
218
219	last: function() {
220		return this.eq( -1 );
221	},
222
223	even: function() {
224		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
225			return ( i + 1 ) % 2;
226		} ) );
227	},
228
229	odd: function() {
230		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
231			return i % 2;
232		} ) );
233	},
234
235	eq: function( i ) {
236		var len = this.length,
237			j = +i + ( i < 0 ? len : 0 );
238		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
239	},
240
241	end: function() {
242		return this.prevObject || this.constructor();
243	},
244
245	// For internal use only.
246	// Behaves like an Array's method, not like a jQuery method.
247	push: push,
248	sort: arr.sort,
249	splice: arr.splice
250};
251
252jQuery.extend = jQuery.fn.extend = function() {
253	var options, name, src, copy, copyIsArray, clone,
254		target = arguments[ 0 ] || {},
255		i = 1,
256		length = arguments.length,
257		deep = false;
258
259	// Handle a deep copy situation
260	if ( typeof target === "boolean" ) {
261		deep = target;
262
263		// Skip the boolean and the target
264		target = arguments[ i ] || {};
265		i++;
266	}
267
268	// Handle case when target is a string or something (possible in deep copy)
269	if ( typeof target !== "object" && !isFunction( target ) ) {
270		target = {};
271	}
272
273	// Extend jQuery itself if only one argument is passed
274	if ( i === length ) {
275		target = this;
276		i--;
277	}
278
279	for ( ; i < length; i++ ) {
280
281		// Only deal with non-null/undefined values
282		if ( ( options = arguments[ i ] ) != null ) {
283
284			// Extend the base object
285			for ( name in options ) {
286				copy = options[ name ];
287
288				// Prevent Object.prototype pollution
289				// Prevent never-ending loop
290				if ( name === "__proto__" || target === copy ) {
291					continue;
292				}
293
294				// Recurse if we're merging plain objects or arrays
295				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
296					( copyIsArray = Array.isArray( copy ) ) ) ) {
297					src = target[ name ];
298
299					// Ensure proper type for the source value
300					if ( copyIsArray && !Array.isArray( src ) ) {
301						clone = [];
302					} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
303						clone = {};
304					} else {
305						clone = src;
306					}
307					copyIsArray = false;
308
309					// Never move original objects, clone them
310					target[ name ] = jQuery.extend( deep, clone, copy );
311
312				// Don't bring in undefined values
313				} else if ( copy !== undefined ) {
314					target[ name ] = copy;
315				}
316			}
317		}
318	}
319
320	// Return the modified object
321	return target;
322};
323
324jQuery.extend( {
325
326	// Unique for each copy of jQuery on the page
327	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
328
329	// Assume jQuery is ready without the ready module
330	isReady: true,
331
332	error: function( msg ) {
333		throw new Error( msg );
334	},
335
336	noop: function() {},
337
338	isPlainObject: function( obj ) {
339		var proto, Ctor;
340
341		// Detect obvious negatives
342		// Use toString instead of jQuery.type to catch host objects
343		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
344			return false;
345		}
346
347		proto = getProto( obj );
348
349		// Objects with no prototype (e.g., `Object.create( null )`) are plain
350		if ( !proto ) {
351			return true;
352		}
353
354		// Objects with prototype are plain iff they were constructed by a global Object function
355		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
356		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
357	},
358
359	isEmptyObject: function( obj ) {
360		var name;
361
362		for ( name in obj ) {
363			return false;
364		}
365		return true;
366	},
367
368	// Evaluates a script in a provided context; falls back to the global one
369	// if not specified.
370	globalEval: function( code, options, doc ) {
371		DOMEval( code, { nonce: options && options.nonce }, doc );
372	},
373
374	each: function( obj, callback ) {
375		var length, i = 0;
376
377		if ( isArrayLike( obj ) ) {
378			length = obj.length;
379			for ( ; i < length; i++ ) {
380				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
381					break;
382				}
383			}
384		} else {
385			for ( i in obj ) {
386				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
387					break;
388				}
389			}
390		}
391
392		return obj;
393	},
394
395	// results is for internal usage only
396	makeArray: function( arr, results ) {
397		var ret = results || [];
398
399		if ( arr != null ) {
400			if ( isArrayLike( Object( arr ) ) ) {
401				jQuery.merge( ret,
402					typeof arr === "string" ?
403					[ arr ] : arr
404				);
405			} else {
406				push.call( ret, arr );
407			}
408		}
409
410		return ret;
411	},
412
413	inArray: function( elem, arr, i ) {
414		return arr == null ? -1 : indexOf.call( arr, elem, i );
415	},
416
417	// Support: Android <=4.0 only, PhantomJS 1 only
418	// push.apply(_, arraylike) throws on ancient WebKit
419	merge: function( first, second ) {
420		var len = +second.length,
421			j = 0,
422			i = first.length;
423
424		for ( ; j < len; j++ ) {
425			first[ i++ ] = second[ j ];
426		}
427
428		first.length = i;
429
430		return first;
431	},
432
433	grep: function( elems, callback, invert ) {
434		var callbackInverse,
435			matches = [],
436			i = 0,
437			length = elems.length,
438			callbackExpect = !invert;
439
440		// Go through the array, only saving the items
441		// that pass the validator function
442		for ( ; i < length; i++ ) {
443			callbackInverse = !callback( elems[ i ], i );
444			if ( callbackInverse !== callbackExpect ) {
445				matches.push( elems[ i ] );
446			}
447		}
448
449		return matches;
450	},
451
452	// arg is for internal usage only
453	map: function( elems, callback, arg ) {
454		var length, value,
455			i = 0,
456			ret = [];
457
458		// Go through the array, translating each of the items to their new values
459		if ( isArrayLike( elems ) ) {
460			length = elems.length;
461			for ( ; i < length; i++ ) {
462				value = callback( elems[ i ], i, arg );
463
464				if ( value != null ) {
vendor: 1,491 bytes, lines 465-527
465					ret.push( value );
466				}
467			}
468
469		// Go through every key on the object,
470		} else {
471			for ( i in elems ) {
472				value = callback( elems[ i ], i, arg );
473
474				if ( value != null ) {
475					ret.push( value );
476				}
477			}
478		}
479
480		// Flatten any nested arrays
481		return flat( ret );
482	},
483
484	// A global GUID counter for objects
485	guid: 1,
486
487	// jQuery.support is not used in Core but other projects attach their
488	// properties to it so it needs to exist.
489	support: support
490} );
491
492if ( typeof Symbol === "function" ) {
493	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
494}
495
496// Populate the class2type map
497jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
498function( _i, name ) {
499	class2type[ "[object " + name + "]" ] = name.toLowerCase();
500} );
501
502function isArrayLike( obj ) {
503
504	// Support: real iOS 8.2 only (not reproducible in simulator)
505	// `in` check used to prevent JIT error (gh-2145)
506	// hasOwn isn't used here due to false negatives
507	// regarding Nodelist length in IE
508	var length = !!obj && "length" in obj && obj.length,
509		type = toType( obj );
510
511	if ( isFunction( obj ) || isWindow( obj ) ) {
512		return false;
513	}
514
515	return type === "array" || length === 0 ||
516		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
517}
518var Sizzle =
519/*!
520 * Sizzle CSS Selector Engine v2.3.5
521 * https://sizzlejs.com/
522 *
523 * Copyright JS Foundation and other contributors
524 * Released under the MIT license
525 * https://js.foundation/
526 *
527 * Date: 2020-03-14
vendor: 16,386 bytes, lines 527-1110
527
528 */
529( function( window ) {
530var i,
531	support,
532	Expr,
533	getText,
534	isXML,
535	tokenize,
536	compile,
537	select,
538	outermostContext,
539	sortInput,
540	hasDuplicate,
541
542	// Local document vars
543	setDocument,
544	document,
545	docElem,
546	documentIsHTML,
547	rbuggyQSA,
548	rbuggyMatches,
549	matches,
550	contains,
551
552	// Instance-specific data
553	expando = "sizzle" + 1 * new Date(),
554	preferredDoc = window.document,
555	dirruns = 0,
556	done = 0,
557	classCache = createCache(),
558	tokenCache = createCache(),
559	compilerCache = createCache(),
560	nonnativeSelectorCache = createCache(),
561	sortOrder = function( a, b ) {
562		if ( a === b ) {
563			hasDuplicate = true;
564		}
565		return 0;
566	},
567
568	// Instance methods
569	hasOwn = ( {} ).hasOwnProperty,
570	arr = [],
571	pop = arr.pop,
572	pushNative = arr.push,
573	push = arr.push,
574	slice = arr.slice,
575
576	// Use a stripped-down indexOf as it's faster than native
577	// https://jsperf.com/thor-indexof-vs-for/5
578	indexOf = function( list, elem ) {
579		var i = 0,
580			len = list.length;
581		for ( ; i < len; i++ ) {
582			if ( list[ i ] === elem ) {
583				return i;
584			}
585		}
586		return -1;
587	},
588
589	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
590		"ismap|loop|multiple|open|readonly|required|scoped",
591
592	// Regular expressions
593
594	// http://www.w3.org/TR/css3-selectors/#whitespace
595	whitespace = "[\\x20\\t\\r\\n\\f]",
596
597	// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
598	identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
599		"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
600
601	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
602	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
603
604		// Operator (capture 2)
605		"*([*^$|!~]?=)" + whitespace +
606
607		// "Attribute values must be CSS identifiers [capture 5]
608		// or strings [capture 3 or capture 4]"
609		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
610		whitespace + "*\\]",
611
612	pseudos = ":(" + identifier + ")(?:\\((" +
613
614		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
615		// 1. quoted (capture 3; capture 4 or capture 5)
616		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
617
618		// 2. simple (capture 6)
619		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
620
621		// 3. anything else (capture 2)
622		".*" +
623		")\\)|)",
624
625	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
626	rwhitespace = new RegExp( whitespace + "+", "g" ),
627	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
628		whitespace + "+$", "g" ),
629
630	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
631	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
632		"*" ),
633	rdescend = new RegExp( whitespace + "|>" ),
634
635	rpseudo = new RegExp( pseudos ),
636	ridentifier = new RegExp( "^" + identifier + "$" ),
637
638	matchExpr = {
639		"ID": new RegExp( "^#(" + identifier + ")" ),
640		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
641		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
642		"ATTR": new RegExp( "^" + attributes ),
643		"PSEUDO": new RegExp( "^" + pseudos ),
644		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
645			whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
646			whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
647		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
648
649		// For use in libraries implementing .is()
650		// We use this for POS matching in `select`
651		"needsContext": new RegExp( "^" + whitespace +
652			"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
653			"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
654	},
655
656	rhtml = /HTML$/i,
657	rinputs = /^(?:input|select|textarea|button)$/i,
658	rheader = /^h\d$/i,
659
660	rnative = /^[^{]+\{\s*\[native \w/,
661
662	// Easily-parseable/retrievable ID or TAG or CLASS selectors
663	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
664
665	rsibling = /[+~]/,
666
667	// CSS escapes
668	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
669	runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
670	funescape = function( escape, nonHex ) {
671		var high = "0x" + escape.slice( 1 ) - 0x10000;
672
673		return nonHex ?
674
675			// Strip the backslash prefix from a non-hex escape sequence
676			nonHex :
677
678			// Replace a hexadecimal escape sequence with the encoded Unicode code point
679			// Support: IE <=11+
680			// For values outside the Basic Multilingual Plane (BMP), manually construct a
681			// surrogate pair
682			high < 0 ?
683				String.fromCharCode( high + 0x10000 ) :
684				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
685	},
686
687	// CSS string/identifier serialization
688	// https://drafts.csswg.org/cssom/#common-serializing-idioms
689	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
690	fcssescape = function( ch, asCodePoint ) {
691		if ( asCodePoint ) {
692
693			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
694			if ( ch === "\0" ) {
695				return "\uFFFD";
696			}
697
698			// Control characters and (dependent upon position) numbers get escaped as code points
699			return ch.slice( 0, -1 ) + "\\" +
700				ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
701		}
702
703		// Other potentially-special ASCII characters get backslash-escaped
704		return "\\" + ch;
705	},
706
707	// Used for iframes
708	// See setDocument()
709	// Removing the function wrapper causes a "Permission Denied"
710	// error in IE
711	unloadHandler = function() {
712		setDocument();
713	},
714
715	inDisabledFieldset = addCombinator(
716		function( elem ) {
717			return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
718		},
719		{ dir: "parentNode", next: "legend" }
720	);
721
722// Optimize for push.apply( _, NodeList )
723try {
724	push.apply(
725		( arr = slice.call( preferredDoc.childNodes ) ),
726		preferredDoc.childNodes
727	);
728
729	// Support: Android<4.0
730	// Detect silently failing push.apply
731	// eslint-disable-next-line no-unused-expressions
732	arr[ preferredDoc.childNodes.length ].nodeType;
733} catch ( e ) {
734	push = { apply: arr.length ?
735
736		// Leverage slice if possible
737		function( target, els ) {
738			pushNative.apply( target, slice.call( els ) );
739		} :
740
741		// Support: IE<9
742		// Otherwise append directly
743		function( target, els ) {
744			var j = target.length,
745				i = 0;
746
747			// Can't trust NodeList.length
748			while ( ( target[ j++ ] = els[ i++ ] ) ) {}
749			target.length = j - 1;
750		}
751	};
752}
753
754function Sizzle( selector, context, results, seed ) {
755	var m, i, elem, nid, match, groups, newSelector,
756		newContext = context && context.ownerDocument,
757
758		// nodeType defaults to 9, since context defaults to document
759		nodeType = context ? context.nodeType : 9;
760
761	results = results || [];
762
763	// Return early from calls with invalid selector or context
764	if ( typeof selector !== "string" || !selector ||
765		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
766
767		return results;
768	}
769
770	// Try to shortcut find operations (as opposed to filters) in HTML documents
771	if ( !seed ) {
772		setDocument( context );
773		context = context || document;
774
775		if ( documentIsHTML ) {
776
777			// If the selector is sufficiently simple, try using a "get*By*" DOM method
778			// (excepting DocumentFragment context, where the methods don't exist)
779			if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
780
781				// ID selector
782				if ( ( m = match[ 1 ] ) ) {
783
784					// Document context
785					if ( nodeType === 9 ) {
786						if ( ( elem = context.getElementById( m ) ) ) {
787
788							// Support: IE, Opera, Webkit
789							// TODO: identify versions
790							// getElementById can match elements by name instead of ID
791							if ( elem.id === m ) {
792								results.push( elem );
793								return results;
794							}
795						} else {
796							return results;
797						}
798
799					// Element context
800					} else {
801
802						// Support: IE, Opera, Webkit
803						// TODO: identify versions
804						// getElementById can match elements by name instead of ID
805						if ( newContext && ( elem = newContext.getElementById( m ) ) &&
806							contains( context, elem ) &&
807							elem.id === m ) {
808
809							results.push( elem );
810							return results;
811						}
812					}
813
814				// Type selector
815				} else if ( match[ 2 ] ) {
816					push.apply( results, context.getElementsByTagName( selector ) );
817					return results;
818
819				// Class selector
820				} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
821					context.getElementsByClassName ) {
822
823					push.apply( results, context.getElementsByClassName( m ) );
824					return results;
825				}
826			}
827
828			// Take advantage of querySelectorAll
829			if ( support.qsa &&
830				!nonnativeSelectorCache[ selector + " " ] &&
831				( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
832
833				// Support: IE 8 only
834				// Exclude object elements
835				( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
836
837				newSelector = selector;
838				newContext = context;
839
840				// qSA considers elements outside a scoping root when evaluating child or
841				// descendant combinators, which is not what we want.
842				// In such cases, we work around the behavior by prefixing every selector in the
843				// list with an ID selector referencing the scope context.
844				// The technique has to be used as well when a leading combinator is used
845				// as such selectors are not recognized by querySelectorAll.
846				// Thanks to Andrew Dupont for this technique.
847				if ( nodeType === 1 &&
848					( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
849
850					// Expand context for sibling selectors
851					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
852						context;
853
854					// We can use :scope instead of the ID hack if the browser
855					// supports it & if we're not changing the context.
856					if ( newContext !== context || !support.scope ) {
857
858						// Capture the context ID, setting it first if necessary
859						if ( ( nid = context.getAttribute( "id" ) ) ) {
860							nid = nid.replace( rcssescape, fcssescape );
861						} else {
862							context.setAttribute( "id", ( nid = expando ) );
863						}
864					}
865
866					// Prefix every selector in the list
867					groups = tokenize( selector );
868					i = groups.length;
869					while ( i-- ) {
870						groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
871							toSelector( groups[ i ] );
872					}
873					newSelector = groups.join( "," );
874				}
875
876				try {
877					push.apply( results,
878						newContext.querySelectorAll( newSelector )
879					);
880					return results;
881				} catch ( qsaError ) {
882					nonnativeSelectorCache( selector, true );
883				} finally {
884					if ( nid === expando ) {
885						context.removeAttribute( "id" );
886					}
887				}
888			}
889		}
890	}
891
892	// All others
893	return select( selector.replace( rtrim, "$1" ), context, results, seed );
894}
895
896/**
897 * Create key-value caches of limited size
898 * @returns {function(string, object)} Returns the Object data after storing it on itself with
899 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
900 *	deleting the oldest entry
901 */
902function createCache() {
903	var keys = [];
904
905	function cache( key, value ) {
906
907		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
908		if ( keys.push( key + " " ) > Expr.cacheLength ) {
909
910			// Only keep the most recent entries
911			delete cache[ keys.shift() ];
912		}
913		return ( cache[ key + " " ] = value );
914	}
915	return cache;
916}
917
918/**
919 * Mark a function for special use by Sizzle
920 * @param {Function} fn The function to mark
921 */
922function markFunction( fn ) {
923	fn[ expando ] = true;
924	return fn;
925}
926
927/**
928 * Support testing using an element
929 * @param {Function} fn Passed the created element and returns a boolean result
930 */
931function assert( fn ) {
932	var el = document.createElement( "fieldset" );
933
934	try {
935		return !!fn( el );
936	} catch ( e ) {
937		return false;
938	} finally {
939
940		// Remove from its parent by default
941		if ( el.parentNode ) {
942			el.parentNode.removeChild( el );
943		}
944
945		// release memory in IE
946		el = null;
947	}
948}
949
950/**
951 * Adds the same handler for all of the specified attrs
952 * @param {String} attrs Pipe-separated list of attributes
953 * @param {Function} handler The method that will be applied
954 */
955function addHandle( attrs, handler ) {
956	var arr = attrs.split( "|" ),
957		i = arr.length;
958
959	while ( i-- ) {
960		Expr.attrHandle[ arr[ i ] ] = handler;
961	}
962}
963
964/**
965 * Checks document order of two siblings
966 * @param {Element} a
967 * @param {Element} b
968 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
969 */
970function siblingCheck( a, b ) {
971	var cur = b && a,
972		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
973			a.sourceIndex - b.sourceIndex;
974
975	// Use IE sourceIndex if available on both nodes
976	if ( diff ) {
977		return diff;
978	}
979
980	// Check if b follows a
981	if ( cur ) {
982		while ( ( cur = cur.nextSibling ) ) {
983			if ( cur === b ) {
984				return -1;
985			}
986		}
987	}
988
989	return a ? 1 : -1;
990}
991
992/**
993 * Returns a function to use in pseudos for input types
994 * @param {String} type
995 */
996function createInputPseudo( type ) {
997	return function( elem ) {
998		var name = elem.nodeName.toLowerCase();
999		return name === "input" && elem.type === type;
1000	};
1001}
1002
1003/**
1004 * Returns a function to use in pseudos for buttons
1005 * @param {String} type
1006 */
1007function createButtonPseudo( type ) {
1008	return function( elem ) {
1009		var name = elem.nodeName.toLowerCase();
1010		return ( name === "input" || name === "button" ) && elem.type === type;
1011	};
1012}
1013
1014/**
1015 * Returns a function to use in pseudos for :enabled/:disabled
1016 * @param {Boolean} disabled true for :disabled; false for :enabled
1017 */
1018function createDisabledPseudo( disabled ) {
1019
1020	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
1021	return function( elem ) {
1022
1023		// Only certain elements can match :enabled or :disabled
1024		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
1025		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
1026		if ( "form" in elem ) {
1027
1028			// Check for inherited disabledness on relevant non-disabled elements:
1029			// * listed form-associated elements in a disabled fieldset
1030			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
1031			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
1032			// * option elements in a disabled optgroup
1033			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
1034			// All such elements have a "form" property.
1035			if ( elem.parentNode && elem.disabled === false ) {
1036
1037				// Option elements defer to a parent optgroup if present
1038				if ( "label" in elem ) {
1039					if ( "label" in elem.parentNode ) {
1040						return elem.parentNode.disabled === disabled;
1041					} else {
1042						return elem.disabled === disabled;
1043					}
1044				}
1045
1046				// Support: IE 6 - 11
1047				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
1048				return elem.isDisabled === disabled ||
1049
1050					// Where there is no isDisabled, check manually
1051					/* jshint -W018 */
1052					elem.isDisabled !== !disabled &&
1053					inDisabledFieldset( elem ) === disabled;
1054			}
1055
1056			return elem.disabled === disabled;
1057
1058		// Try to winnow out elements that can't be disabled before trusting the disabled property.
1059		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
1060		// even exist on them, let alone have a boolean value.
1061		} else if ( "label" in elem ) {
1062			return elem.disabled === disabled;
1063		}
1064
1065		// Remaining elements are neither :enabled nor :disabled
1066		return false;
1067	};
1068}
1069
1070/**
1071 * Returns a function to use in pseudos for positionals
1072 * @param {Function} fn
1073 */
1074function createPositionalPseudo( fn ) {
1075	return markFunction( function( argument ) {
1076		argument = +argument;
1077		return markFunction( function( seed, matches ) {
1078			var j,
1079				matchIndexes = fn( [], seed.length, argument ),
1080				i = matchIndexes.length;
1081
1082			// Match elements found at the specified indexes
1083			while ( i-- ) {
1084				if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
1085					seed[ j ] = !( matches[ j ] = seed[ j ] );
1086				}
1087			}
1088		} );
1089	} );
1090}
1091
1092/**
1093 * Checks a node for validity as a Sizzle context
1094 * @param {Element|Object=} context
1095 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1096 */
1097function testContext( context ) {
1098	return context && typeof context.getElementsByTagName !== "undefined" && context;
1099}
1100
1101// Expose support vars for convenience
1102support = Sizzle.support = {};
1103
1104/**
1105 * Detects XML nodes
1106 * @param {Element|Object} elem An element or a document
1107 * @returns {Boolean} True iff elem is a non-HTML XML node
1108 */
1109isXML = Sizzle.isXML = function( elem ) {
1110	var namespace = elem
1110.namespaceURI,
1111		docElem =
vendor: 54,357 bytes, lines 1111-3025
1111 ( elem.ownerDocument || elem ).documentElement;
1112
1113	// Support: IE <=8
1114	// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
1115	// https://bugs.jquery.com/ticket/4833
1116	return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
1117};
1118
1119/**
1120 * Sets document-related variables once based on the current document
1121 * @param {Element|Object} [doc] An element or document object to use to set the document
1122 * @returns {Object} Returns the current document
1123 */
1124setDocument = Sizzle.setDocument = function( node ) {
1125	var hasCompare, subWindow,
1126		doc = node ? node.ownerDocument || node : preferredDoc;
1127
1128	// Return early if doc is invalid or already selected
1129	// Support: IE 11+, Edge 17 - 18+
1130	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1131	// two documents; shallow comparisons work.
1132	// eslint-disable-next-line eqeqeq
1133	if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
1134		return document;
1135	}
1136
1137	// Update global variables
1138	document = doc;
1139	docElem = document.documentElement;
1140	documentIsHTML = !isXML( document );
1141
1142	// Support: IE 9 - 11+, Edge 12 - 18+
1143	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1144	// Support: IE 11+, Edge 17 - 18+
1145	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1146	// two documents; shallow comparisons work.
1147	// eslint-disable-next-line eqeqeq
1148	if ( preferredDoc != document &&
1149		( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
1150
1151		// Support: IE 11, Edge
1152		if ( subWindow.addEventListener ) {
1153			subWindow.addEventListener( "unload", unloadHandler, false );
1154
1155		// Support: IE 9 - 10 only
1156		} else if ( subWindow.attachEvent ) {
1157			subWindow.attachEvent( "onunload", unloadHandler );
1158		}
1159	}
1160
1161	// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
1162	// Safari 4 - 5 only, Opera <=11.6 - 12.x only
1163	// IE/Edge & older browsers don't support the :scope pseudo-class.
1164	// Support: Safari 6.0 only
1165	// Safari 6.0 supports :scope but it's an alias of :root there.
1166	support.scope = assert( function( el ) {
1167		docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
1168		return typeof el.querySelectorAll !== "undefined" &&
1169			!el.querySelectorAll( ":scope fieldset div" ).length;
1170	} );
1171
1172	/* Attributes
1173	---------------------------------------------------------------------- */
1174
1175	// Support: IE<8
1176	// Verify that getAttribute really returns attributes and not properties
1177	// (excepting IE8 booleans)
1178	support.attributes = assert( function( el ) {
1179		el.className = "i";
1180		return !el.getAttribute( "className" );
1181	} );
1182
1183	/* getElement(s)By*
1184	---------------------------------------------------------------------- */
1185
1186	// Check if getElementsByTagName("*") returns only elements
1187	support.getElementsByTagName = assert( function( el ) {
1188		el.appendChild( document.createComment( "" ) );
1189		return !el.getElementsByTagName( "*" ).length;
1190	} );
1191
1192	// Support: IE<9
1193	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
1194
1195	// Support: IE<10
1196	// Check if getElementById returns elements by name
1197	// The broken getElementById methods don't pick up programmatically-set names,
1198	// so use a roundabout getElementsByName test
1199	support.getById = assert( function( el ) {
1200		docElem.appendChild( el ).id = expando;
1201		return !document.getElementsByName || !document.getElementsByName( expando ).length;
1202	} );
1203
1204	// ID filter and find
1205	if ( support.getById ) {
1206		Expr.filter[ "ID" ] = function( id ) {
1207			var attrId = id.replace( runescape, funescape );
1208			return function( elem ) {
1209				return elem.getAttribute( "id" ) === attrId;
1210			};
1211		};
1212		Expr.find[ "ID" ] = function( id, context ) {
1213			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1214				var elem = context.getElementById( id );
1215				return elem ? [ elem ] : [];
1216			}
1217		};
1218	} else {
1219		Expr.filter[ "ID" ] =  function( id ) {
1220			var attrId = id.replace( runescape, funescape );
1221			return function( elem ) {
1222				var node = typeof elem.getAttributeNode !== "undefined" &&
1223					elem.getAttributeNode( "id" );
1224				return node && node.value === attrId;
1225			};
1226		};
1227
1228		// Support: IE 6 - 7 only
1229		// getElementById is not reliable as a find shortcut
1230		Expr.find[ "ID" ] = function( id, context ) {
1231			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1232				var node, i, elems,
1233					elem = context.getElementById( id );
1234
1235				if ( elem ) {
1236
1237					// Verify the id attribute
1238					node = elem.getAttributeNode( "id" );
1239					if ( node && node.value === id ) {
1240						return [ elem ];
1241					}
1242
1243					// Fall back on getElementsByName
1244					elems = context.getElementsByName( id );
1245					i = 0;
1246					while ( ( elem = elems[ i++ ] ) ) {
1247						node = elem.getAttributeNode( "id" );
1248						if ( node && node.value === id ) {
1249							return [ elem ];
1250						}
1251					}
1252				}
1253
1254				return [];
1255			}
1256		};
1257	}
1258
1259	// Tag
1260	Expr.find[ "TAG" ] = support.getElementsByTagName ?
1261		function( tag, context ) {
1262			if ( typeof context.getElementsByTagName !== "undefined" ) {
1263				return context.getElementsByTagName( tag );
1264
1265			// DocumentFragment nodes don't have gEBTN
1266			} else if ( support.qsa ) {
1267				return context.querySelectorAll( tag );
1268			}
1269		} :
1270
1271		function( tag, context ) {
1272			var elem,
1273				tmp = [],
1274				i = 0,
1275
1276				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1277				results = context.getElementsByTagName( tag );
1278
1279			// Filter out possible comments
1280			if ( tag === "*" ) {
1281				while ( ( elem = results[ i++ ] ) ) {
1282					if ( elem.nodeType === 1 ) {
1283						tmp.push( elem );
1284					}
1285				}
1286
1287				return tmp;
1288			}
1289			return results;
1290		};
1291
1292	// Class
1293	Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
1294		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1295			return context.getElementsByClassName( className );
1296		}
1297	};
1298
1299	/* QSA/matchesSelector
1300	---------------------------------------------------------------------- */
1301
1302	// QSA and matchesSelector support
1303
1304	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1305	rbuggyMatches = [];
1306
1307	// qSa(:focus) reports false when true (Chrome 21)
1308	// We allow this because of a bug in IE8/9 that throws an error
1309	// whenever `document.activeElement` is accessed on an iframe
1310	// So, we allow :focus to pass through QSA all the time to avoid the IE error
1311	// See https://bugs.jquery.com/ticket/13378
1312	rbuggyQSA = [];
1313
1314	if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
1315
1316		// Build QSA regex
1317		// Regex strategy adopted from Diego Perini
1318		assert( function( el ) {
1319
1320			var input;
1321
1322			// Select is set to empty string on purpose
1323			// This is to test IE's treatment of not explicitly
1324			// setting a boolean content attribute,
1325			// since its presence should be enough
1326			// https://bugs.jquery.com/ticket/12359
1327			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
1328				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
1329				"<option selected=''></option></select>";
1330
1331			// Support: IE8, Opera 11-12.16
1332			// Nothing should be selected when empty strings follow ^= or $= or *=
1333			// The test attribute must be unknown in Opera but "safe" for WinRT
1334			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1335			if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
1336				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1337			}
1338
1339			// Support: IE8
1340			// Boolean attributes and "value" are not treated correctly
1341			if ( !el.querySelectorAll( "[selected]" ).length ) {
1342				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1343			}
1344
1345			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1346			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1347				rbuggyQSA.push( "~=" );
1348			}
1349
1350			// Support: IE 11+, Edge 15 - 18+
1351			// IE 11/Edge don't find elements on a `[name='']` query in some cases.
1352			// Adding a temporary attribute to the document before the selection works
1353			// around the issue.
1354			// Interestingly, IE 10 & older don't seem to have the issue.
1355			input = document.createElement( "input" );
1356			input.setAttribute( "name", "" );
1357			el.appendChild( input );
1358			if ( !el.querySelectorAll( "[name='']" ).length ) {
1359				rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
1360					whitespace + "*(?:''|\"\")" );
1361			}
1362
1363			// Webkit/Opera - :checked should return selected option elements
1364			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1365			// IE8 throws error here and will not see later tests
1366			if ( !el.querySelectorAll( ":checked" ).length ) {
1367				rbuggyQSA.push( ":checked" );
1368			}
1369
1370			// Support: Safari 8+, iOS 8+
1371			// https://bugs.webkit.org/show_bug.cgi?id=136851
1372			// In-page `selector#id sibling-combinator selector` fails
1373			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1374				rbuggyQSA.push( ".#.+[+~]" );
1375			}
1376
1377			// Support: Firefox <=3.6 - 5 only
1378			// Old Firefox doesn't throw on a badly-escaped identifier.
1379			el.querySelectorAll( "\\\f" );
1380			rbuggyQSA.push( "[\\r\\n\\f]" );
1381		} );
1382
1383		assert( function( el ) {
1384			el.innerHTML = "<a href='' disabled='disabled'></a>" +
1385				"<select disabled='disabled'><option/></select>";
1386
1387			// Support: Windows 8 Native Apps
1388			// The type and name attributes are restricted during .innerHTML assignment
1389			var input = document.createElement( "input" );
1390			input.setAttribute( "type", "hidden" );
1391			el.appendChild( input ).setAttribute( "name", "D" );
1392
1393			// Support: IE8
1394			// Enforce case-sensitivity of name attribute
1395			if ( el.querySelectorAll( "[name=d]" ).length ) {
1396				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1397			}
1398
1399			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1400			// IE8 throws error here and will not see later tests
1401			if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
1402				rbuggyQSA.push( ":enabled", ":disabled" );
1403			}
1404
1405			// Support: IE9-11+
1406			// IE's :disabled selector does not pick up the children of disabled fieldsets
1407			docElem.appendChild( el ).disabled = true;
1408			if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
1409				rbuggyQSA.push( ":enabled", ":disabled" );
1410			}
1411
1412			// Support: Opera 10 - 11 only
1413			// Opera 10-11 does not throw on post-comma invalid pseudos
1414			el.querySelectorAll( "*,:x" );
1415			rbuggyQSA.push( ",.*:" );
1416		} );
1417	}
1418
1419	if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
1420		docElem.webkitMatchesSelector ||
1421		docElem.mozMatchesSelector ||
1422		docElem.oMatchesSelector ||
1423		docElem.msMatchesSelector ) ) ) ) {
1424
1425		assert( function( el ) {
1426
1427			// Check to see if it's possible to do matchesSelector
1428			// on a disconnected node (IE 9)
1429			support.disconnectedMatch = matches.call( el, "*" );
1430
1431			// This should fail with an exception
1432			// Gecko does not error, returns false instead
1433			matches.call( el, "[s!='']:x" );
1434			rbuggyMatches.push( "!=", pseudos );
1435		} );
1436	}
1437
1438	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
1439	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
1440
1441	/* Contains
1442	---------------------------------------------------------------------- */
1443	hasCompare = rnative.test( docElem.compareDocumentPosition );
1444
1445	// Element contains another
1446	// Purposefully self-exclusive
1447	// As in, an element does not contain itself
1448	contains = hasCompare || rnative.test( docElem.contains ) ?
1449		function( a, b ) {
1450			var adown = a.nodeType === 9 ? a.documentElement : a,
1451				bup = b && b.parentNode;
1452			return a === bup || !!( bup && bup.nodeType === 1 && (
1453				adown.contains ?
1454					adown.contains( bup ) :
1455					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1456			) );
1457		} :
1458		function( a, b ) {
1459			if ( b ) {
1460				while ( ( b = b.parentNode ) ) {
1461					if ( b === a ) {
1462						return true;
1463					}
1464				}
1465			}
1466			return false;
1467		};
1468
1469	/* Sorting
1470	---------------------------------------------------------------------- */
1471
1472	// Document order sorting
1473	sortOrder = hasCompare ?
1474	function( a, b ) {
1475
1476		// Flag for duplicate removal
1477		if ( a === b ) {
1478			hasDuplicate = true;
1479			return 0;
1480		}
1481
1482		// Sort on method existence if only one input has compareDocumentPosition
1483		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1484		if ( compare ) {
1485			return compare;
1486		}
1487
1488		// Calculate position if both inputs belong to the same document
1489		// Support: IE 11+, Edge 17 - 18+
1490		// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1491		// two documents; shallow comparisons work.
1492		// eslint-disable-next-line eqeqeq
1493		compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
1494			a.compareDocumentPosition( b ) :
1495
1496			// Otherwise we know they are disconnected
1497			1;
1498
1499		// Disconnected nodes
1500		if ( compare & 1 ||
1501			( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
1502
1503			// Choose the first element that is related to our preferred document
1504			// Support: IE 11+, Edge 17 - 18+
1505			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1506			// two documents; shallow comparisons work.
1507			// eslint-disable-next-line eqeqeq
1508			if ( a == document || a.ownerDocument == preferredDoc &&
1509				contains( preferredDoc, a ) ) {
1510				return -1;
1511			}
1512
1513			// Support: IE 11+, Edge 17 - 18+
1514			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1515			// two documents; shallow comparisons work.
1516			// eslint-disable-next-line eqeqeq
1517			if ( b == document || b.ownerDocument == preferredDoc &&
1518				contains( preferredDoc, b ) ) {
1519				return 1;
1520			}
1521
1522			// Maintain original order
1523			return sortInput ?
1524				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1525				0;
1526		}
1527
1528		return compare & 4 ? -1 : 1;
1529	} :
1530	function( a, b ) {
1531
1532		// Exit early if the nodes are identical
1533		if ( a === b ) {
1534			hasDuplicate = true;
1535			return 0;
1536		}
1537
1538		var cur,
1539			i = 0,
1540			aup = a.parentNode,
1541			bup = b.parentNode,
1542			ap = [ a ],
1543			bp = [ b ];
1544
1545		// Parentless nodes are either documents or disconnected
1546		if ( !aup || !bup ) {
1547
1548			// Support: IE 11+, Edge 17 - 18+
1549			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1550			// two documents; shallow comparisons work.
1551			/* eslint-disable eqeqeq */
1552			return a == document ? -1 :
1553				b == document ? 1 :
1554				/* eslint-enable eqeqeq */
1555				aup ? -1 :
1556				bup ? 1 :
1557				sortInput ?
1558				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1559				0;
1560
1561		// If the nodes are siblings, we can do a quick check
1562		} else if ( aup === bup ) {
1563			return siblingCheck( a, b );
1564		}
1565
1566		// Otherwise we need full lists of their ancestors for comparison
1567		cur = a;
1568		while ( ( cur = cur.parentNode ) ) {
1569			ap.unshift( cur );
1570		}
1571		cur = b;
1572		while ( ( cur = cur.parentNode ) ) {
1573			bp.unshift( cur );
1574		}
1575
1576		// Walk down the tree looking for a discrepancy
1577		while ( ap[ i ] === bp[ i ] ) {
1578			i++;
1579		}
1580
1581		return i ?
1582
1583			// Do a sibling check if the nodes have a common ancestor
1584			siblingCheck( ap[ i ], bp[ i ] ) :
1585
1586			// Otherwise nodes in our document sort first
1587			// Support: IE 11+, Edge 17 - 18+
1588			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1589			// two documents; shallow comparisons work.
1590			/* eslint-disable eqeqeq */
1591			ap[ i ] == preferredDoc ? -1 :
1592			bp[ i ] == preferredDoc ? 1 :
1593			/* eslint-enable eqeqeq */
1594			0;
1595	};
1596
1597	return document;
1598};
1599
1600Sizzle.matches = function( expr, elements ) {
1601	return Sizzle( expr, null, null, elements );
1602};
1603
1604Sizzle.matchesSelector = function( elem, expr ) {
1605	setDocument( elem );
1606
1607	if ( support.matchesSelector && documentIsHTML &&
1608		!nonnativeSelectorCache[ expr + " " ] &&
1609		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1610		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
1611
1612		try {
1613			var ret = matches.call( elem, expr );
1614
1615			// IE 9's matchesSelector returns false on disconnected nodes
1616			if ( ret || support.disconnectedMatch ||
1617
1618				// As well, disconnected nodes are said to be in a document
1619				// fragment in IE 9
1620				elem.document && elem.document.nodeType !== 11 ) {
1621				return ret;
1622			}
1623		} catch ( e ) {
1624			nonnativeSelectorCache( expr, true );
1625		}
1626	}
1627
1628	return Sizzle( expr, document, null, [ elem ] ).length > 0;
1629};
1630
1631Sizzle.contains = function( context, elem ) {
1632
1633	// Set document vars if needed
1634	// Support: IE 11+, Edge 17 - 18+
1635	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1636	// two documents; shallow comparisons work.
1637	// eslint-disable-next-line eqeqeq
1638	if ( ( context.ownerDocument || context ) != document ) {
1639		setDocument( context );
1640	}
1641	return contains( context, elem );
1642};
1643
1644Sizzle.attr = function( elem, name ) {
1645
1646	// Set document vars if needed
1647	// Support: IE 11+, Edge 17 - 18+
1648	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1649	// two documents; shallow comparisons work.
1650	// eslint-disable-next-line eqeqeq
1651	if ( ( elem.ownerDocument || elem ) != document ) {
1652		setDocument( elem );
1653	}
1654
1655	var fn = Expr.attrHandle[ name.toLowerCase() ],
1656
1657		// Don't get fooled by Object.prototype properties (jQuery #13807)
1658		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1659			fn( elem, name, !documentIsHTML ) :
1660			undefined;
1661
1662	return val !== undefined ?
1663		val :
1664		support.attributes || !documentIsHTML ?
1665			elem.getAttribute( name ) :
1666			( val = elem.getAttributeNode( name ) ) && val.specified ?
1667				val.value :
1668				null;
1669};
1670
1671Sizzle.escape = function( sel ) {
1672	return ( sel + "" ).replace( rcssescape, fcssescape );
1673};
1674
1675Sizzle.error = function( msg ) {
1676	throw new Error( "Syntax error, unrecognized expression: " + msg );
1677};
1678
1679/**
1680 * Document sorting and removing duplicates
1681 * @param {ArrayLike} results
1682 */
1683Sizzle.uniqueSort = function( results ) {
1684	var elem,
1685		duplicates = [],
1686		j = 0,
1687		i = 0;
1688
1689	// Unless we *know* we can detect duplicates, assume their presence
1690	hasDuplicate = !support.detectDuplicates;
1691	sortInput = !support.sortStable && results.slice( 0 );
1692	results.sort( sortOrder );
1693
1694	if ( hasDuplicate ) {
1695		while ( ( elem = results[ i++ ] ) ) {
1696			if ( elem === results[ i ] ) {
1697				j = duplicates.push( i );
1698			}
1699		}
1700		while ( j-- ) {
1701			results.splice( duplicates[ j ], 1 );
1702		}
1703	}
1704
1705	// Clear input after sorting to release objects
1706	// See https://github.com/jquery/sizzle/pull/225
1707	sortInput = null;
1708
1709	return results;
1710};
1711
1712/**
1713 * Utility function for retrieving the text value of an array of DOM nodes
1714 * @param {Array|Element} elem
1715 */
1716getText = Sizzle.getText = function( elem ) {
1717	var node,
1718		ret = "",
1719		i = 0,
1720		nodeType = elem.nodeType;
1721
1722	if ( !nodeType ) {
1723
1724		// If no nodeType, this is expected to be an array
1725		while ( ( node = elem[ i++ ] ) ) {
1726
1727			// Do not traverse comment nodes
1728			ret += getText( node );
1729		}
1730	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1731
1732		// Use textContent for elements
1733		// innerText usage removed for consistency of new lines (jQuery #11153)
1734		if ( typeof elem.textContent === "string" ) {
1735			return elem.textContent;
1736		} else {
1737
1738			// Traverse its children
1739			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1740				ret += getText( elem );
1741			}
1742		}
1743	} else if ( nodeType === 3 || nodeType === 4 ) {
1744		return elem.nodeValue;
1745	}
1746
1747	// Do not include comment or processing instruction nodes
1748
1749	return ret;
1750};
1751
1752Expr = Sizzle.selectors = {
1753
1754	// Can be adjusted by the user
1755	cacheLength: 50,
1756
1757	createPseudo: markFunction,
1758
1759	match: matchExpr,
1760
1761	attrHandle: {},
1762
1763	find: {},
1764
1765	relative: {
1766		">": { dir: "parentNode", first: true },
1767		" ": { dir: "parentNode" },
1768		"+": { dir: "previousSibling", first: true },
1769		"~": { dir: "previousSibling" }
1770	},
1771
1772	preFilter: {
1773		"ATTR": function( match ) {
1774			match[ 1 ] = match[ 1 ].replace( runescape, funescape );
1775
1776			// Move the given value to match[3] whether quoted or unquoted
1777			match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
1778				match[ 5 ] || "" ).replace( runescape, funescape );
1779
1780			if ( match[ 2 ] === "~=" ) {
1781				match[ 3 ] = " " + match[ 3 ] + " ";
1782			}
1783
1784			return match.slice( 0, 4 );
1785		},
1786
1787		"CHILD": function( match ) {
1788
1789			/* matches from matchExpr["CHILD"]
1790				1 type (only|nth|...)
1791				2 what (child|of-type)
1792				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1793				4 xn-component of xn+y argument ([+-]?\d*n|)
1794				5 sign of xn-component
1795				6 x of xn-component
1796				7 sign of y-component
1797				8 y of y-component
1798			*/
1799			match[ 1 ] = match[ 1 ].toLowerCase();
1800
1801			if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
1802
1803				// nth-* requires argument
1804				if ( !match[ 3 ] ) {
1805					Sizzle.error( match[ 0 ] );
1806				}
1807
1808				// numeric x and y parameters for Expr.filter.CHILD
1809				// remember that false/true cast respectively to 0/1
1810				match[ 4 ] = +( match[ 4 ] ?
1811					match[ 5 ] + ( match[ 6 ] || 1 ) :
1812					2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
1813				match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
1814
1815				// other types prohibit arguments
1816			} else if ( match[ 3 ] ) {
1817				Sizzle.error( match[ 0 ] );
1818			}
1819
1820			return match;
1821		},
1822
1823		"PSEUDO": function( match ) {
1824			var excess,
1825				unquoted = !match[ 6 ] && match[ 2 ];
1826
1827			if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
1828				return null;
1829			}
1830
1831			// Accept quoted arguments as-is
1832			if ( match[ 3 ] ) {
1833				match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
1834
1835			// Strip excess characters from unquoted arguments
1836			} else if ( unquoted && rpseudo.test( unquoted ) &&
1837
1838				// Get excess from tokenize (recursively)
1839				( excess = tokenize( unquoted, true ) ) &&
1840
1841				// advance to the next closing parenthesis
1842				( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
1843
1844				// excess is a negative index
1845				match[ 0 ] = match[ 0 ].slice( 0, excess );
1846				match[ 2 ] = unquoted.slice( 0, excess );
1847			}
1848
1849			// Return only captures needed by the pseudo filter method (type and argument)
1850			return match.slice( 0, 3 );
1851		}
1852	},
1853
1854	filter: {
1855
1856		"TAG": function( nodeNameSelector ) {
1857			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1858			return nodeNameSelector === "*" ?
1859				function() {
1860					return true;
1861				} :
1862				function( elem ) {
1863					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1864				};
1865		},
1866
1867		"CLASS": function( className ) {
1868			var pattern = classCache[ className + " " ];
1869
1870			return pattern ||
1871				( pattern = new RegExp( "(^|" + whitespace +
1872					")" + className + "(" + whitespace + "|$)" ) ) && classCache(
1873						className, function( elem ) {
1874							return pattern.test(
1875								typeof elem.className === "string" && elem.className ||
1876								typeof elem.getAttribute !== "undefined" &&
1877									elem.getAttribute( "class" ) ||
1878								""
1879							);
1880				} );
1881		},
1882
1883		"ATTR": function( name, operator, check ) {
1884			return function( elem ) {
1885				var result = Sizzle.attr( elem, name );
1886
1887				if ( result == null ) {
1888					return operator === "!=";
1889				}
1890				if ( !operator ) {
1891					return true;
1892				}
1893
1894				result += "";
1895
1896				/* eslint-disable max-len */
1897
1898				return operator === "=" ? result === check :
1899					operator === "!=" ? result !== check :
1900					operator === "^=" ? check && result.indexOf( check ) === 0 :
1901					operator === "*=" ? check && result.indexOf( check ) > -1 :
1902					operator === "$=" ? check && result.slice( -check.length ) === check :
1903					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1904					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1905					false;
1906				/* eslint-enable max-len */
1907
1908			};
1909		},
1910
1911		"CHILD": function( type, what, _argument, first, last ) {
1912			var simple = type.slice( 0, 3 ) !== "nth",
1913				forward = type.slice( -4 ) !== "last",
1914				ofType = what === "of-type";
1915
1916			return first === 1 && last === 0 ?
1917
1918				// Shortcut for :nth-*(n)
1919				function( elem ) {
1920					return !!elem.parentNode;
1921				} :
1922
1923				function( elem, _context, xml ) {
1924					var cache, uniqueCache, outerCache, node, nodeIndex, start,
1925						dir = simple !== forward ? "nextSibling" : "previousSibling",
1926						parent = elem.parentNode,
1927						name = ofType && elem.nodeName.toLowerCase(),
1928						useCache = !xml && !ofType,
1929						diff = false;
1930
1931					if ( parent ) {
1932
1933						// :(first|last|only)-(child|of-type)
1934						if ( simple ) {
1935							while ( dir ) {
1936								node = elem;
1937								while ( ( node = node[ dir ] ) ) {
1938									if ( ofType ?
1939										node.nodeName.toLowerCase() === name :
1940										node.nodeType === 1 ) {
1941
1942										return false;
1943									}
1944								}
1945
1946								// Reverse direction for :only-* (if we haven't yet done so)
1947								start = dir = type === "only" && !start && "nextSibling";
1948							}
1949							return true;
1950						}
1951
1952						start = [ forward ? parent.firstChild : parent.lastChild ];
1953
1954						// non-xml :nth-child(...) stores cache data on `parent`
1955						if ( forward && useCache ) {
1956
1957							// Seek `elem` from a previously-cached index
1958
1959							// ...in a gzip-friendly way
1960							node = parent;
1961							outerCache = node[ expando ] || ( node[ expando ] = {} );
1962
1963							// Support: IE <9 only
1964							// Defend against cloned attroperties (jQuery gh-1709)
1965							uniqueCache = outerCache[ node.uniqueID ] ||
1966								( outerCache[ node.uniqueID ] = {} );
1967
1968							cache = uniqueCache[ type ] || [];
1969							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1970							diff = nodeIndex && cache[ 2 ];
1971							node = nodeIndex && parent.childNodes[ nodeIndex ];
1972
1973							while ( ( node = ++nodeIndex && node && node[ dir ] ||
1974
1975								// Fallback to seeking `elem` from the start
1976								( diff = nodeIndex = 0 ) || start.pop() ) ) {
1977
1978								// When found, cache indexes on `parent` and break
1979								if ( node.nodeType === 1 && ++diff && node === elem ) {
1980									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
1981									break;
1982								}
1983							}
1984
1985						} else {
1986
1987							// Use previously-cached element index if available
1988							if ( useCache ) {
1989
1990								// ...in a gzip-friendly way
1991								node = elem;
1992								outerCache = node[ expando ] || ( node[ expando ] = {} );
1993
1994								// Support: IE <9 only
1995								// Defend against cloned attroperties (jQuery gh-1709)
1996								uniqueCache = outerCache[ node.uniqueID ] ||
1997									( outerCache[ node.uniqueID ] = {} );
1998
1999								cache = uniqueCache[ type ] || [];
2000								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
2001								diff = nodeIndex;
2002							}
2003
2004							// xml :nth-child(...)
2005							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
2006							if ( diff === false ) {
2007
2008								// Use the same loop as above to seek `elem` from the start
2009								while ( ( node = ++nodeIndex && node && node[ dir ] ||
2010									( diff = nodeIndex = 0 ) || start.pop() ) ) {
2011
2012									if ( ( ofType ?
2013										node.nodeName.toLowerCase() === name :
2014										node.nodeType === 1 ) &&
2015										++diff ) {
2016
2017										// Cache the index of each encountered element
2018										if ( useCache ) {
2019											outerCache = node[ expando ] ||
2020												( node[ expando ] = {} );
2021
2022											// Support: IE <9 only
2023											// Defend against cloned attroperties (jQuery gh-1709)
2024											uniqueCache = outerCache[ node.uniqueID ] ||
2025												( outerCache[ node.uniqueID ] = {} );
2026
2027											uniqueCache[ type ] = [ dirruns, diff ];
2028										}
2029
2030										if ( node === elem ) {
2031											break;
2032										}
2033									}
2034								}
2035							}
2036						}
2037
2038						// Incorporate the offset, then check against cycle size
2039						diff -= last;
2040						return diff === first || ( diff % first === 0 && diff / first >= 0 );
2041					}
2042				};
2043		},
2044
2045		"PSEUDO": function( pseudo, argument ) {
2046
2047			// pseudo-class names are case-insensitive
2048			// http://www.w3.org/TR/selectors/#pseudo-classes
2049			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
2050			// Remember that setFilters inherits from pseudos
2051			var args,
2052				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
2053					Sizzle.error( "unsupported pseudo: " + pseudo );
2054
2055			// The user may use createPseudo to indicate that
2056			// arguments are needed to create the filter function
2057			// just as Sizzle does
2058			if ( fn[ expando ] ) {
2059				return fn( argument );
2060			}
2061
2062			// But maintain support for old signatures
2063			if ( fn.length > 1 ) {
2064				args = [ pseudo, pseudo, "", argument ];
2065				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
2066					markFunction( function( seed, matches ) {
2067						var idx,
2068							matched = fn( seed, argument ),
2069							i = matched.length;
2070						while ( i-- ) {
2071							idx = indexOf( seed, matched[ i ] );
2072							seed[ idx ] = !( matches[ idx ] = matched[ i ] );
2073						}
2074					} ) :
2075					function( elem ) {
2076						return fn( elem, 0, args );
2077					};
2078			}
2079
2080			return fn;
2081		}
2082	},
2083
2084	pseudos: {
2085
2086		// Potentially complex pseudos
2087		"not": markFunction( function( selector ) {
2088
2089			// Trim the selector passed to compile
2090			// to avoid treating leading and trailing
2091			// spaces as combinators
2092			var input = [],
2093				results = [],
2094				matcher = compile( selector.replace( rtrim, "$1" ) );
2095
2096			return matcher[ expando ] ?
2097				markFunction( function( seed, matches, _context, xml ) {
2098					var elem,
2099						unmatched = matcher( seed, null, xml, [] ),
2100						i = seed.length;
2101
2102					// Match elements unmatched by `matcher`
2103					while ( i-- ) {
2104						if ( ( elem = unmatched[ i ] ) ) {
2105							seed[ i ] = !( matches[ i ] = elem );
2106						}
2107					}
2108				} ) :
2109				function( elem, _context, xml ) {
2110					input[ 0 ] = elem;
2111					matcher( input, null, xml, results );
2112
2113					// Don't keep the element (issue #299)
2114					input[ 0 ] = null;
2115					return !results.pop();
2116				};
2117		} ),
2118
2119		"has": markFunction( function( selector ) {
2120			return function( elem ) {
2121				return Sizzle( selector, elem ).length > 0;
2122			};
2123		} ),
2124
2125		"contains": markFunction( function( text ) {
2126			text = text.replace( runescape, funescape );
2127			return function( elem ) {
2128				return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
2129			};
2130		} ),
2131
2132		// "Whether an element is represented by a :lang() selector
2133		// is based solely on the element's language value
2134		// being equal to the identifier C,
2135		// or beginning with the identifier C immediately followed by "-".
2136		// The matching of C against the element's language value is performed case-insensitively.
2137		// The identifier C does not have to be a valid language name."
2138		// http://www.w3.org/TR/selectors/#lang-pseudo
2139		"lang": markFunction( function( lang ) {
2140
2141			// lang value must be a valid identifier
2142			if ( !ridentifier.test( lang || "" ) ) {
2143				Sizzle.error( "unsupported lang: " + lang );
2144			}
2145			lang = lang.replace( runescape, funescape ).toLowerCase();
2146			return function( elem ) {
2147				var elemLang;
2148				do {
2149					if ( ( elemLang = documentIsHTML ?
2150						elem.lang :
2151						elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
2152
2153						elemLang = elemLang.toLowerCase();
2154						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
2155					}
2156				} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
2157				return false;
2158			};
2159		} ),
2160
2161		// Miscellaneous
2162		"target": function( elem ) {
2163			var hash = window.location && window.location.hash;
2164			return hash && hash.slice( 1 ) === elem.id;
2165		},
2166
2167		"root": function( elem ) {
2168			return elem === docElem;
2169		},
2170
2171		"focus": function( elem ) {
2172			return elem === document.activeElement &&
2173				( !document.hasFocus || document.hasFocus() ) &&
2174				!!( elem.type || elem.href || ~elem.tabIndex );
2175		},
2176
2177		// Boolean properties
2178		"enabled": createDisabledPseudo( false ),
2179		"disabled": createDisabledPseudo( true ),
2180
2181		"checked": function( elem ) {
2182
2183			// In CSS3, :checked should return both checked and selected elements
2184			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2185			var nodeName = elem.nodeName.toLowerCase();
2186			return ( nodeName === "input" && !!elem.checked ) ||
2187				( nodeName === "option" && !!elem.selected );
2188		},
2189
2190		"selected": function( elem ) {
2191
2192			// Accessing this property makes selected-by-default
2193			// options in Safari work properly
2194			if ( elem.parentNode ) {
2195				// eslint-disable-next-line no-unused-expressions
2196				elem.parentNode.selectedIndex;
2197			}
2198
2199			return elem.selected === true;
2200		},
2201
2202		// Contents
2203		"empty": function( elem ) {
2204
2205			// http://www.w3.org/TR/selectors/#empty-pseudo
2206			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
2207			//   but not by others (comment: 8; processing instruction: 7; etc.)
2208			// nodeType < 6 works because attributes (2) do not appear as children
2209			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
2210				if ( elem.nodeType < 6 ) {
2211					return false;
2212				}
2213			}
2214			return true;
2215		},
2216
2217		"parent": function( elem ) {
2218			return !Expr.pseudos[ "empty" ]( elem );
2219		},
2220
2221		// Element/input types
2222		"header": function( elem ) {
2223			return rheader.test( elem.nodeName );
2224		},
2225
2226		"input": function( elem ) {
2227			return rinputs.test( elem.nodeName );
2228		},
2229
2230		"button": function( elem ) {
2231			var name = elem.nodeName.toLowerCase();
2232			return name === "input" && elem.type === "button" || name === "button";
2233		},
2234
2235		"text": function( elem ) {
2236			var attr;
2237			return elem.nodeName.toLowerCase() === "input" &&
2238				elem.type === "text" &&
2239
2240				// Support: IE<8
2241				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2242				( ( attr = elem.getAttribute( "type" ) ) == null ||
2243					attr.toLowerCase() === "text" );
2244		},
2245
2246		// Position-in-collection
2247		"first": createPositionalPseudo( function() {
2248			return [ 0 ];
2249		} ),
2250
2251		"last": createPositionalPseudo( function( _matchIndexes, length ) {
2252			return [ length - 1 ];
2253		} ),
2254
2255		"eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
2256			return [ argument < 0 ? argument + length : argument ];
2257		} ),
2258
2259		"even": createPositionalPseudo( function( matchIndexes, length ) {
2260			var i = 0;
2261			for ( ; i < length; i += 2 ) {
2262				matchIndexes.push( i );
2263			}
2264			return matchIndexes;
2265		} ),
2266
2267		"odd": createPositionalPseudo( function( matchIndexes, length ) {
2268			var i = 1;
2269			for ( ; i < length; i += 2 ) {
2270				matchIndexes.push( i );
2271			}
2272			return matchIndexes;
2273		} ),
2274
2275		"lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
2276			var i = argument < 0 ?
2277				argument + length :
2278				argument > length ?
2279					length :
2280					argument;
2281			for ( ; --i >= 0; ) {
2282				matchIndexes.push( i );
2283			}
2284			return matchIndexes;
2285		} ),
2286
2287		"gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
2288			var i = argument < 0 ? argument + length : argument;
2289			for ( ; ++i < length; ) {
2290				matchIndexes.push( i );
2291			}
2292			return matchIndexes;
2293		} )
2294	}
2295};
2296
2297Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
2298
2299// Add button/input type pseudos
2300for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2301	Expr.pseudos[ i ] = createInputPseudo( i );
2302}
2303for ( i in { submit: true, reset: true } ) {
2304	Expr.pseudos[ i ] = createButtonPseudo( i );
2305}
2306
2307// Easy API for creating new setFilters
2308function setFilters() {}
2309setFilters.prototype = Expr.filters = Expr.pseudos;
2310Expr.setFilters = new setFilters();
2311
2312tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2313	var matched, match, tokens, type,
2314		soFar, groups, preFilters,
2315		cached = tokenCache[ selector + " " ];
2316
2317	if ( cached ) {
2318		return parseOnly ? 0 : cached.slice( 0 );
2319	}
2320
2321	soFar = selector;
2322	groups = [];
2323	preFilters = Expr.preFilter;
2324
2325	while ( soFar ) {
2326
2327		// Comma and first run
2328		if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
2329			if ( match ) {
2330
2331				// Don't consume trailing commas as valid
2332				soFar = soFar.slice( match[ 0 ].length ) || soFar;
2333			}
2334			groups.push( ( tokens = [] ) );
2335		}
2336
2337		matched = false;
2338
2339		// Combinators
2340		if ( ( match = rcombinators.exec( soFar ) ) ) {
2341			matched = match.shift();
2342			tokens.push( {
2343				value: matched,
2344
2345				// Cast descendant combinators to space
2346				type: match[ 0 ].replace( rtrim, " " )
2347			} );
2348			soFar = soFar.slice( matched.length );
2349		}
2350
2351		// Filters
2352		for ( type in Expr.filter ) {
2353			if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
2354				( match = preFilters[ type ]( match ) ) ) ) {
2355				matched = match.shift();
2356				tokens.push( {
2357					value: matched,
2358					type: type,
2359					matches: match
2360				} );
2361				soFar = soFar.slice( matched.length );
2362			}
2363		}
2364
2365		if ( !matched ) {
2366			break;
2367		}
2368	}
2369
2370	// Return the length of the invalid excess
2371	// if we're just parsing
2372	// Otherwise, throw an error or return tokens
2373	return parseOnly ?
2374		soFar.length :
2375		soFar ?
2376			Sizzle.error( selector ) :
2377
2378			// Cache the tokens
2379			tokenCache( selector, groups ).slice( 0 );
2380};
2381
2382function toSelector( tokens ) {
2383	var i = 0,
2384		len = tokens.length,
2385		selector = "";
2386	for ( ; i < len; i++ ) {
2387		selector += tokens[ i ].value;
2388	}
2389	return selector;
2390}
2391
2392function addCombinator( matcher, combinator, base ) {
2393	var dir = combinator.dir,
2394		skip = combinator.next,
2395		key = skip || dir,
2396		checkNonElements = base && key === "parentNode",
2397		doneName = done++;
2398
2399	return combinator.first ?
2400
2401		// Check against closest ancestor/preceding element
2402		function( elem, context, xml ) {
2403			while ( ( elem = elem[ dir ] ) ) {
2404				if ( elem.nodeType === 1 || checkNonElements ) {
2405					return matcher( elem, context, xml );
2406				}
2407			}
2408			return false;
2409		} :
2410
2411		// Check against all ancestor/preceding elements
2412		function( elem, context, xml ) {
2413			var oldCache, uniqueCache, outerCache,
2414				newCache = [ dirruns, doneName ];
2415
2416			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2417			if ( xml ) {
2418				while ( ( elem = elem[ dir ] ) ) {
2419					if ( elem.nodeType === 1 || checkNonElements ) {
2420						if ( matcher( elem, context, xml ) ) {
2421							return true;
2422						}
2423					}
2424				}
2425			} else {
2426				while ( ( elem = elem[ dir ] ) ) {
2427					if ( elem.nodeType === 1 || checkNonElements ) {
2428						outerCache = elem[ expando ] || ( elem[ expando ] = {} );
2429
2430						// Support: IE <9 only
2431						// Defend against cloned attroperties (jQuery gh-1709)
2432						uniqueCache = outerCache[ elem.uniqueID ] ||
2433							( outerCache[ elem.uniqueID ] = {} );
2434
2435						if ( skip && skip === elem.nodeName.toLowerCase() ) {
2436							elem = elem[ dir ] || elem;
2437						} else if ( ( oldCache = uniqueCache[ key ] ) &&
2438							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2439
2440							// Assign to newCache so results back-propagate to previous elements
2441							return ( newCache[ 2 ] = oldCache[ 2 ] );
2442						} else {
2443
2444							// Reuse newcache so results back-propagate to previous elements
2445							uniqueCache[ key ] = newCache;
2446
2447							// A match means we're done; a fail means we have to keep checking
2448							if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
2449								return true;
2450							}
2451						}
2452					}
2453				}
2454			}
2455			return false;
2456		};
2457}
2458
2459function elementMatcher( matchers ) {
2460	return matchers.length > 1 ?
2461		function( elem, context, xml ) {
2462			var i = matchers.length;
2463			while ( i-- ) {
2464				if ( !matchers[ i ]( elem, context, xml ) ) {
2465					return false;
2466				}
2467			}
2468			return true;
2469		} :
2470		matchers[ 0 ];
2471}
2472
2473function multipleContexts( selector, contexts, results ) {
2474	var i = 0,
2475		len = contexts.length;
2476	for ( ; i < len; i++ ) {
2477		Sizzle( selector, contexts[ i ], results );
2478	}
2479	return results;
2480}
2481
2482function condense( unmatched, map, filter, context, xml ) {
2483	var elem,
2484		newUnmatched = [],
2485		i = 0,
2486		len = unmatched.length,
2487		mapped = map != null;
2488
2489	for ( ; i < len; i++ ) {
2490		if ( ( elem = unmatched[ i ] ) ) {
2491			if ( !filter || filter( elem, context, xml ) ) {
2492				newUnmatched.push( elem );
2493				if ( mapped ) {
2494					map.push( i );
2495				}
2496			}
2497		}
2498	}
2499
2500	return newUnmatched;
2501}
2502
2503function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2504	if ( postFilter && !postFilter[ expando ] ) {
2505		postFilter = setMatcher( postFilter );
2506	}
2507	if ( postFinder && !postFinder[ expando ] ) {
2508		postFinder = setMatcher( postFinder, postSelector );
2509	}
2510	return markFunction( function( seed, results, context, xml ) {
2511		var temp, i, elem,
2512			preMap = [],
2513			postMap = [],
2514			preexisting = results.length,
2515
2516			// Get initial elements from seed or context
2517			elems = seed || multipleContexts(
2518				selector || "*",
2519				context.nodeType ? [ context ] : context,
2520				[]
2521			),
2522
2523			// Prefilter to get matcher input, preserving a map for seed-results synchronization
2524			matcherIn = preFilter && ( seed || !selector ) ?
2525				condense( elems, preMap, preFilter, context, xml ) :
2526				elems,
2527
2528			matcherOut = matcher ?
2529
2530				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2531				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2532
2533					// ...intermediate processing is necessary
2534					[] :
2535
2536					// ...otherwise use results directly
2537					results :
2538				matcherIn;
2539
2540		// Find primary matches
2541		if ( matcher ) {
2542			matcher( matcherIn, matcherOut, context, xml );
2543		}
2544
2545		// Apply postFilter
2546		if ( postFilter ) {
2547			temp = condense( matcherOut, postMap );
2548			postFilter( temp, [], context, xml );
2549
2550			// Un-match failing elements by moving them back to matcherIn
2551			i = temp.length;
2552			while ( i-- ) {
2553				if ( ( elem = temp[ i ] ) ) {
2554					matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
2555				}
2556			}
2557		}
2558
2559		if ( seed ) {
2560			if ( postFinder || preFilter ) {
2561				if ( postFinder ) {
2562
2563					// Get the final matcherOut by condensing this intermediate into postFinder contexts
2564					temp = [];
2565					i = matcherOut.length;
2566					while ( i-- ) {
2567						if ( ( elem = matcherOut[ i ] ) ) {
2568
2569							// Restore matcherIn since elem is not yet a final match
2570							temp.push( ( matcherIn[ i ] = elem ) );
2571						}
2572					}
2573					postFinder( null, ( matcherOut = [] ), temp, xml );
2574				}
2575
2576				// Move matched elements from seed to results to keep them synchronized
2577				i = matcherOut.length;
2578				while ( i-- ) {
2579					if ( ( elem = matcherOut[ i ] ) &&
2580						( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
2581
2582						seed[ temp ] = !( results[ temp ] = elem );
2583					}
2584				}
2585			}
2586
2587		// Add elements to results, through postFinder if defined
2588		} else {
2589			matcherOut = condense(
2590				matcherOut === results ?
2591					matcherOut.splice( preexisting, matcherOut.length ) :
2592					matcherOut
2593			);
2594			if ( postFinder ) {
2595				postFinder( null, results, matcherOut, xml );
2596			} else {
2597				push.apply( results, matcherOut );
2598			}
2599		}
2600	} );
2601}
2602
2603function matcherFromTokens( tokens ) {
2604	var checkContext, matcher, j,
2605		len = tokens.length,
2606		leadingRelative = Expr.relative[ tokens[ 0 ].type ],
2607		implicitRelative = leadingRelative || Expr.relative[ " " ],
2608		i = leadingRelative ? 1 : 0,
2609
2610		// The foundational matcher ensures that elements are reachable from top-level context(s)
2611		matchContext = addCombinator( function( elem ) {
2612			return elem === checkContext;
2613		}, implicitRelative, true ),
2614		matchAnyContext = addCombinator( function( elem ) {
2615			return indexOf( checkContext, elem ) > -1;
2616		}, implicitRelative, true ),
2617		matchers = [ function( elem, context, xml ) {
2618			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2619				( checkContext = context ).nodeType ?
2620					matchContext( elem, context, xml ) :
2621					matchAnyContext( elem, context, xml ) );
2622
2623			// Avoid hanging onto element (issue #299)
2624			checkContext = null;
2625			return ret;
2626		} ];
2627
2628	for ( ; i < len; i++ ) {
2629		if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
2630			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
2631		} else {
2632			matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
2633
2634			// Return special upon seeing a positional matcher
2635			if ( matcher[ expando ] ) {
2636
2637				// Find the next relative operator (if any) for proper handling
2638				j = ++i;
2639				for ( ; j < len; j++ ) {
2640					if ( Expr.relative[ tokens[ j ].type ] ) {
2641						break;
2642					}
2643				}
2644				return setMatcher(
2645					i > 1 && elementMatcher( matchers ),
2646					i > 1 && toSelector(
2647
2648					// If the preceding token was a descendant combinator, insert an implicit any-element `*`
2649					tokens
2650						.slice( 0, i - 1 )
2651						.concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
2652					).replace( rtrim, "$1" ),
2653					matcher,
2654					i < j && matcherFromTokens( tokens.slice( i, j ) ),
2655					j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
2656					j < len && toSelector( tokens )
2657				);
2658			}
2659			matchers.push( matcher );
2660		}
2661	}
2662
2663	return elementMatcher( matchers );
2664}
2665
2666function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2667	var bySet = setMatchers.length > 0,
2668		byElement = elementMatchers.length > 0,
2669		superMatcher = function( seed, context, xml, results, outermost ) {
2670			var elem, j, matcher,
2671				matchedCount = 0,
2672				i = "0",
2673				unmatched = seed && [],
2674				setMatched = [],
2675				contextBackup = outermostContext,
2676
2677				// We must always have either seed elements or outermost context
2678				elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
2679
2680				// Use integer dirruns iff this is the outermost matcher
2681				dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
2682				len = elems.length;
2683
2684			if ( outermost ) {
2685
2686				// Support: IE 11+, Edge 17 - 18+
2687				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2688				// two documents; shallow comparisons work.
2689				// eslint-disable-next-line eqeqeq
2690				outermostContext = context == document || context || outermost;
2691			}
2692
2693			// Add elements passing elementMatchers directly to results
2694			// Support: IE<9, Safari
2695			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2696			for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
2697				if ( byElement && elem ) {
2698					j = 0;
2699
2700					// Support: IE 11+, Edge 17 - 18+
2701					// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2702					// two documents; shallow comparisons work.
2703					// eslint-disable-next-line eqeqeq
2704					if ( !context && elem.ownerDocument != document ) {
2705						setDocument( elem );
2706						xml = !documentIsHTML;
2707					}
2708					while ( ( matcher = elementMatchers[ j++ ] ) ) {
2709						if ( matcher( elem, context || document, xml ) ) {
2710							results.push( elem );
2711							break;
2712						}
2713					}
2714					if ( outermost ) {
2715						dirruns = dirrunsUnique;
2716					}
2717				}
2718
2719				// Track unmatched elements for set filters
2720				if ( bySet ) {
2721
2722					// They will have gone through all possible matchers
2723					if ( ( elem = !matcher && elem ) ) {
2724						matchedCount--;
2725					}
2726
2727					// Lengthen the array for every element, matched or not
2728					if ( seed ) {
2729						unmatched.push( elem );
2730					}
2731				}
2732			}
2733
2734			// `i` is now the count of elements visited above, and adding it to `matchedCount`
2735			// makes the latter nonnegative.
2736			matchedCount += i;
2737
2738			// Apply set filters to unmatched elements
2739			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
2740			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
2741			// no element matchers and no seed.
2742			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
2743			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
2744			// numerically zero.
2745			if ( bySet && i !== matchedCount ) {
2746				j = 0;
2747				while ( ( matcher = setMatchers[ j++ ] ) ) {
2748					matcher( unmatched, setMatched, context, xml );
2749				}
2750
2751				if ( seed ) {
2752
2753					// Reintegrate element matches to eliminate the need for sorting
2754					if ( matchedCount > 0 ) {
2755						while ( i-- ) {
2756							if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
2757								setMatched[ i ] = pop.call( results );
2758							}
2759						}
2760					}
2761
2762					// Discard index placeholder values to get only actual matches
2763					setMatched = condense( setMatched );
2764				}
2765
2766				// Add matches to results
2767				push.apply( results, setMatched );
2768
2769				// Seedless set matches succeeding multiple successful matchers stipulate sorting
2770				if ( outermost && !seed && setMatched.length > 0 &&
2771					( matchedCount + setMatchers.length ) > 1 ) {
2772
2773					Sizzle.uniqueSort( results );
2774				}
2775			}
2776
2777			// Override manipulation of globals by nested matchers
2778			if ( outermost ) {
2779				dirruns = dirrunsUnique;
2780				outermostContext = contextBackup;
2781			}
2782
2783			return unmatched;
2784		};
2785
2786	return bySet ?
2787		markFunction( superMatcher ) :
2788		superMatcher;
2789}
2790
2791compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2792	var i,
2793		setMatchers = [],
2794		elementMatchers = [],
2795		cached = compilerCache[ selector + " " ];
2796
2797	if ( !cached ) {
2798
2799		// Generate a function of recursive functions that can be used to check each element
2800		if ( !match ) {
2801			match = tokenize( selector );
2802		}
2803		i = match.length;
2804		while ( i-- ) {
2805			cached = matcherFromTokens( match[ i ] );
2806			if ( cached[ expando ] ) {
2807				setMatchers.push( cached );
2808			} else {
2809				elementMatchers.push( cached );
2810			}
2811		}
2812
2813		// Cache the compiled function
2814		cached = compilerCache(
2815			selector,
2816			matcherFromGroupMatchers( elementMatchers, setMatchers )
2817		);
2818
2819		// Save selector and tokenization
2820		cached.selector = selector;
2821	}
2822	return cached;
2823};
2824
2825/**
2826 * A low-level selection function that works with Sizzle's compiled
2827 *  selector functions
2828 * @param {String|Function} selector A selector or a pre-compiled
2829 *  selector function built with Sizzle.compile
2830 * @param {Element} context
2831 * @param {Array} [results]
2832 * @param {Array} [seed] A set of elements to match against
2833 */
2834select = Sizzle.select = function( selector, context, results, seed ) {
2835	var i, tokens, token, type, find,
2836		compiled = typeof selector === "function" && selector,
2837		match = !seed && tokenize( ( selector = compiled.selector || selector ) );
2838
2839	results = results || [];
2840
2841	// Try to minimize operations if there is only one selector in the list and no seed
2842	// (the latter of which guarantees us context)
2843	if ( match.length === 1 ) {
2844
2845		// Reduce context if the leading compound selector is an ID
2846		tokens = match[ 0 ] = match[ 0 ].slice( 0 );
2847		if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
2848			context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
2849
2850			context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
2851				.replace( runescape, funescape ), context ) || [] )[ 0 ];
2852			if ( !context ) {
2853				return results;
2854
2855			// Precompiled matchers will still verify ancestry, so step up a level
2856			} else if ( compiled ) {
2857				context = context.parentNode;
2858			}
2859
2860			selector = selector.slice( tokens.shift().value.length );
2861		}
2862
2863		// Fetch a seed set for right-to-left matching
2864		i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
2865		while ( i-- ) {
2866			token = tokens[ i ];
2867
2868			// Abort if we hit a combinator
2869			if ( Expr.relative[ ( type = token.type ) ] ) {
2870				break;
2871			}
2872			if ( ( find = Expr.find[ type ] ) ) {
2873
2874				// Search, expanding context for leading sibling combinators
2875				if ( ( seed = find(
2876					token.matches[ 0 ].replace( runescape, funescape ),
2877					rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
2878						context
2879				) ) ) {
2880
2881					// If seed is empty or no tokens remain, we can return early
2882					tokens.splice( i, 1 );
2883					selector = seed.length && toSelector( tokens );
2884					if ( !selector ) {
2885						push.apply( results, seed );
2886						return results;
2887					}
2888
2889					break;
2890				}
2891			}
2892		}
2893	}
2894
2895	// Compile and execute a filtering function if one is not provided
2896	// Provide `match` to avoid retokenization if we modified the selector above
2897	( compiled || compile( selector, match ) )(
2898		seed,
2899		context,
2900		!documentIsHTML,
2901		results,
2902		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2903	);
2904	return results;
2905};
2906
2907// One-time assignments
2908
2909// Sort stability
2910support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
2911
2912// Support: Chrome 14-35+
2913// Always assume duplicates if they aren't passed to the comparison function
2914support.detectDuplicates = !!hasDuplicate;
2915
2916// Initialize against the default document
2917setDocument();
2918
2919// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2920// Detached nodes confoundingly follow *each other*
2921support.sortDetached = assert( function( el ) {
2922
2923	// Should return 1, but returns 4 (following)
2924	return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
2925} );
2926
2927// Support: IE<8
2928// Prevent attribute/property "interpolation"
2929// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2930if ( !assert( function( el ) {
2931	el.innerHTML = "<a href='#'></a>";
2932	return el.firstChild.getAttribute( "href" ) === "#";
2933} ) ) {
2934	addHandle( "type|href|height|width", function( elem, name, isXML ) {
2935		if ( !isXML ) {
2936			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2937		}
2938	} );
2939}
2940
2941// Support: IE<9
2942// Use defaultValue in place of getAttribute("value")
2943if ( !support.attributes || !assert( function( el ) {
2944	el.innerHTML = "<input/>";
2945	el.firstChild.setAttribute( "value", "" );
2946	return el.firstChild.getAttribute( "value" ) === "";
2947} ) ) {
2948	addHandle( "value", function( elem, _name, isXML ) {
2949		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2950			return elem.defaultValue;
2951		}
2952	} );
2953}
2954
2955// Support: IE<9
2956// Use getAttributeNode to fetch booleans when getAttribute lies
2957if ( !assert( function( el ) {
2958	return el.getAttribute( "disabled" ) == null;
2959} ) ) {
2960	addHandle( booleans, function( elem, name, isXML ) {
2961		var val;
2962		if ( !isXML ) {
2963			return elem[ name ] === true ? name.toLowerCase() :
2964				( val = elem.getAttributeNode( name ) ) && val.specified ?
2965					val.value :
2966					null;
2967		}
2968	} );
2969}
2970
2971return Sizzle;
2972
2973} )( window );
2974
2975
2976
2977jQuery.find = Sizzle;
2978jQuery.expr = Sizzle.selectors;
2979
2980// Deprecated
2981jQuery.expr[ ":" ] = jQuery.expr.pseudos;
2982jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
2983jQuery.text = Sizzle.getText;
2984jQuery.isXMLDoc = Sizzle.isXML;
2985jQuery.contains = Sizzle.contains;
2986jQuery.escapeSelector = Sizzle.escape;
2987
2988
2989
2990
2991var dir = function( elem, dir, until ) {
2992	var matched = [],
2993		truncate = until !== undefined;
2994
2995	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
2996		if ( elem.nodeType === 1 ) {
2997			if ( truncate && jQuery( elem ).is( until ) ) {
2998				break;
2999			}
3000			matched.push( elem );
3001		}
3002	}
3003	return matched;
3004};
3005
3006
3007var siblings = function( n, elem ) {
3008	var matched = [];
3009
3010	for ( ; n; n = n.nextSibling ) {
3011		if ( n.nodeType === 1 && n !== elem ) {
3012			matched.push( n );
3013		}
3014	}
3015
3016	return matched;
3017};
3018
3019
3020var rneedsContext = jQuery.expr.match.needsContext;
3021
3022
3023
3024function nodeName( elem, name ) {
3025
3026  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
3027
3028};
vendor: 21,546 bytes, lines 3028-3853
3028
3029var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
3030
3031
3032
3033// Implement the identical functionality for filter and not
3034function winnow( elements, qualifier, not ) {
3035	if ( isFunction( qualifier ) ) {
3036		return jQuery.grep( elements, function( elem, i ) {
3037			return !!qualifier.call( elem, i, elem ) !== not;
3038		} );
3039	}
3040
3041	// Single element
3042	if ( qualifier.nodeType ) {
3043		return jQuery.grep( elements, function( elem ) {
3044			return ( elem === qualifier ) !== not;
3045		} );
3046	}
3047
3048	// Arraylike of elements (jQuery, arguments, Array)
3049	if ( typeof qualifier !== "string" ) {
3050		return jQuery.grep( elements, function( elem ) {
3051			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
3052		} );
3053	}
3054
3055	// Filtered directly for both simple and complex selectors
3056	return jQuery.filter( qualifier, elements, not );
3057}
3058
3059jQuery.filter = function( expr, elems, not ) {
3060	var elem = elems[ 0 ];
3061
3062	if ( not ) {
3063		expr = ":not(" + expr + ")";
3064	}
3065
3066	if ( elems.length === 1 && elem.nodeType === 1 ) {
3067		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
3068	}
3069
3070	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
3071		return elem.nodeType === 1;
3072	} ) );
3073};
3074
3075jQuery.fn.extend( {
3076	find: function( selector ) {
3077		var i, ret,
3078			len = this.length,
3079			self = this;
3080
3081		if ( typeof selector !== "string" ) {
3082			return this.pushStack( jQuery( selector ).filter( function() {
3083				for ( i = 0; i < len; i++ ) {
3084					if ( jQuery.contains( self[ i ], this ) ) {
3085						return true;
3086					}
3087				}
3088			} ) );
3089		}
3090
3091		ret = this.pushStack( [] );
3092
3093		for ( i = 0; i < len; i++ ) {
3094			jQuery.find( selector, self[ i ], ret );
3095		}
3096
3097		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
3098	},
3099	filter: function( selector ) {
3100		return this.pushStack( winnow( this, selector || [], false ) );
3101	},
3102	not: function( selector ) {
3103		return this.pushStack( winnow( this, selector || [], true ) );
3104	},
3105	is: function( selector ) {
3106		return !!winnow(
3107			this,
3108
3109			// If this is a positional/relative selector, check membership in the returned set
3110			// so $("p:first").is("p:last") won't return true for a doc with two "p".
3111			typeof selector === "string" && rneedsContext.test( selector ) ?
3112				jQuery( selector ) :
3113				selector || [],
3114			false
3115		).length;
3116	}
3117} );
3118
3119
3120// Initialize a jQuery object
3121
3122
3123// A central reference to the root jQuery(document)
3124var rootjQuery,
3125
3126	// A simple way to check for HTML strings
3127	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
3128	// Strict HTML recognition (#11290: must start with <)
3129	// Shortcut simple #id case for speed
3130	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
3131
3132	init = jQuery.fn.init = function( selector, context, root ) {
3133		var match, elem;
3134
3135		// HANDLE: $(""), $(null), $(undefined), $(false)
3136		if ( !selector ) {
3137			return this;
3138		}
3139
3140		// Method init() accepts an alternate rootjQuery
3141		// so migrate can support jQuery.sub (gh-2101)
3142		root = root || rootjQuery;
3143
3144		// Handle HTML strings
3145		if ( typeof selector === "string" ) {
3146			if ( selector[ 0 ] === "<" &&
3147				selector[ selector.length - 1 ] === ">" &&
3148				selector.length >= 3 ) {
3149
3150				// Assume that strings that start and end with <> are HTML and skip the regex check
3151				match = [ null, selector, null ];
3152
3153			} else {
3154				match = rquickExpr.exec( selector );
3155			}
3156
3157			// Match html or make sure no context is specified for #id
3158			if ( match && ( match[ 1 ] || !context ) ) {
3159
3160				// HANDLE: $(html) -> $(array)
3161				if ( match[ 1 ] ) {
3162					context = context instanceof jQuery ? context[ 0 ] : context;
3163
3164					// Option to run scripts is true for back-compat
3165					// Intentionally let the error be thrown if parseHTML is not present
3166					jQuery.merge( this, jQuery.parseHTML(
3167						match[ 1 ],
3168						context && context.nodeType ? context.ownerDocument || context : document,
3169						true
3170					) );
3171
3172					// HANDLE: $(html, props)
3173					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
3174						for ( match in context ) {
3175
3176							// Properties of context are called as methods if possible
3177							if ( isFunction( this[ match ] ) ) {
3178								this[ match ]( context[ match ] );
3179
3180							// ...and otherwise set as attributes
3181							} else {
3182								this.attr( match, context[ match ] );
3183							}
3184						}
3185					}
3186
3187					return this;
3188
3189				// HANDLE: $(#id)
3190				} else {
3191					elem = document.getElementById( match[ 2 ] );
3192
3193					if ( elem ) {
3194
3195						// Inject the element directly into the jQuery object
3196						this[ 0 ] = elem;
3197						this.length = 1;
3198					}
3199					return this;
3200				}
3201
3202			// HANDLE: $(expr, $(...))
3203			} else if ( !context || context.jquery ) {
3204				return ( context || root ).find( selector );
3205
3206			// HANDLE: $(expr, context)
3207			// (which is just equivalent to: $(context).find(expr)
3208			} else {
3209				return this.constructor( context ).find( selector );
3210			}
3211
3212		// HANDLE: $(DOMElement)
3213		} else if ( selector.nodeType ) {
3214			this[ 0 ] = selector;
3215			this.length = 1;
3216			return this;
3217
3218		// HANDLE: $(function)
3219		// Shortcut for document ready
3220		} else if ( isFunction( selector ) ) {
3221			return root.ready !== undefined ?
3222				root.ready( selector ) :
3223
3224				// Execute immediately if ready is not present
3225				selector( jQuery );
3226		}
3227
3228		return jQuery.makeArray( selector, this );
3229	};
3230
3231// Give the init function the jQuery prototype for later instantiation
3232init.prototype = jQuery.fn;
3233
3234// Initialize central reference
3235rootjQuery = jQuery( document );
3236
3237
3238var rparentsprev = /^(?:parents|prev(?:Until|All))/,
3239
3240	// Methods guaranteed to produce a unique set when starting from a unique set
3241	guaranteedUnique = {
3242		children: true,
3243		contents: true,
3244		next: true,
3245		prev: true
3246	};
3247
3248jQuery.fn.extend( {
3249	has: function( target ) {
3250		var targets = jQuery( target, this ),
3251			l = targets.length;
3252
3253		return this.filter( function() {
3254			var i = 0;
3255			for ( ; i < l; i++ ) {
3256				if ( jQuery.contains( this, targets[ i ] ) ) {
3257					return true;
3258				}
3259			}
3260		} );
3261	},
3262
3263	closest: function( selectors, context ) {
3264		var cur,
3265			i = 0,
3266			l = this.length,
3267			matched = [],
3268			targets = typeof selectors !== "string" && jQuery( selectors );
3269
3270		// Positional selectors never match, since there's no _selection_ context
3271		if ( !rneedsContext.test( selectors ) ) {
3272			for ( ; i < l; i++ ) {
3273				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
3274
3275					// Always skip document fragments
3276					if ( cur.nodeType < 11 && ( targets ?
3277						targets.index( cur ) > -1 :
3278
3279						// Don't pass non-elements to Sizzle
3280						cur.nodeType === 1 &&
3281							jQuery.find.matchesSelector( cur, selectors ) ) ) {
3282
3283						matched.push( cur );
3284						break;
3285					}
3286				}
3287			}
3288		}
3289
3290		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
3291	},
3292
3293	// Determine the position of an element within the set
3294	index: function( elem ) {
3295
3296		// No argument, return index in parent
3297		if ( !elem ) {
3298			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
3299		}
3300
3301		// Index in selector
3302		if ( typeof elem === "string" ) {
3303			return indexOf.call( jQuery( elem ), this[ 0 ] );
3304		}
3305
3306		// Locate the position of the desired element
3307		return indexOf.call( this,
3308
3309			// If it receives a jQuery object, the first element is used
3310			elem.jquery ? elem[ 0 ] : elem
3311		);
3312	},
3313
3314	add: function( selector, context ) {
3315		return this.pushStack(
3316			jQuery.uniqueSort(
3317				jQuery.merge( this.get(), jQuery( selector, context ) )
3318			)
3319		);
3320	},
3321
3322	addBack: function( selector ) {
3323		return this.add( selector == null ?
3324			this.prevObject : this.prevObject.filter( selector )
3325		);
3326	}
3327} );
3328
3329function sibling( cur, dir ) {
3330	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
3331	return cur;
3332}
3333
3334jQuery.each( {
3335	parent: function( elem ) {
3336		var parent = elem.parentNode;
3337		return parent && parent.nodeType !== 11 ? parent : null;
3338	},
3339	parents: function( elem ) {
3340		return dir( elem, "parentNode" );
3341	},
3342	parentsUntil: function( elem, _i, until ) {
3343		return dir( elem, "parentNode", until );
3344	},
3345	next: function( elem ) {
3346		return sibling( elem, "nextSibling" );
3347	},
3348	prev: function( elem ) {
3349		return sibling( elem, "previousSibling" );
3350	},
3351	nextAll: function( elem ) {
3352		return dir( elem, "nextSibling" );
3353	},
3354	prevAll: function( elem ) {
3355		return dir( elem, "previousSibling" );
3356	},
3357	nextUntil: function( elem, _i, until ) {
3358		return dir( elem, "nextSibling", until );
3359	},
3360	prevUntil: function( elem, _i, until ) {
3361		return dir( elem, "previousSibling", until );
3362	},
3363	siblings: function( elem ) {
3364		return siblings( ( elem.parentNode || {} ).firstChild, elem );
3365	},
3366	children: function( elem ) {
3367		return siblings( elem.firstChild );
3368	},
3369	contents: function( elem ) {
3370		if ( elem.contentDocument != null &&
3371
3372			// Support: IE 11+
3373			// <object> elements with no `data` attribute has an object
3374			// `contentDocument` with a `null` prototype.
3375			getProto( elem.contentDocument ) ) {
3376
3377			return elem.contentDocument;
3378		}
3379
3380		// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3381		// Treat the template element as a regular one in browsers that
3382		// don't support it.
3383		if ( nodeName( elem, "template" ) ) {
3384			elem = elem.content || elem;
3385		}
3386
3387		return jQuery.merge( [], elem.childNodes );
3388	}
3389}, function( name, fn ) {
3390	jQuery.fn[ name ] = function( until, selector ) {
3391		var matched = jQuery.map( this, fn, until );
3392
3393		if ( name.slice( -5 ) !== "Until" ) {
3394			selector = until;
3395		}
3396
3397		if ( selector && typeof selector === "string" ) {
3398			matched = jQuery.filter( selector, matched );
3399		}
3400
3401		if ( this.length > 1 ) {
3402
3403			// Remove duplicates
3404			if ( !guaranteedUnique[ name ] ) {
3405				jQuery.uniqueSort( matched );
3406			}
3407
3408			// Reverse order for parents* and prev-derivatives
3409			if ( rparentsprev.test( name ) ) {
3410				matched.reverse();
3411			}
3412		}
3413
3414		return this.pushStack( matched );
3415	};
3416} );
3417var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
3418
3419
3420
3421// Convert String-formatted options into Object-formatted ones
3422function createOptions( options ) {
3423	var object = {};
3424	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
3425		object[ flag ] = true;
3426	} );
3427	return object;
3428}
3429
3430/*
3431 * Create a callback list using the following parameters:
3432 *
3433 *	options: an optional list of space-separated options that will change how
3434 *			the callback list behaves or a more traditional option object
3435 *
3436 * By default a callback list will act like an event callback list and can be
3437 * "fired" multiple times.
3438 *
3439 * Possible options:
3440 *
3441 *	once:			will ensure the callback list can only be fired once (like a Deferred)
3442 *
3443 *	memory:			will keep track of previous values and will call any callback added
3444 *					after the list has been fired right away with the latest "memorized"
3445 *					values (like a Deferred)
3446 *
3447 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
3448 *
3449 *	stopOnFalse:	interrupt callings when a callback returns false
3450 *
3451 */
3452jQuery.Callbacks = function( options ) {
3453
3454	// Convert options from String-formatted to Object-formatted if needed
3455	// (we check in cache first)
3456	options = typeof options === "string" ?
3457		createOptions( options ) :
3458		jQuery.extend( {}, options );
3459
3460	var // Flag to know if list is currently firing
3461		firing,
3462
3463		// Last fire value for non-forgettable lists
3464		memory,
3465
3466		// Flag to know if list was already fired
3467		fired,
3468
3469		// Flag to prevent firing
3470		locked,
3471
3472		// Actual callback list
3473		list = [],
3474
3475		// Queue of execution data for repeatable lists
3476		queue = [],
3477
3478		// Index of currently firing callback (modified by add/remove as needed)
3479		firingIndex = -1,
3480
3481		// Fire callbacks
3482		fire = function() {
3483
3484			// Enforce single-firing
3485			locked = locked || options.once;
3486
3487			// Execute callbacks for all pending executions,
3488			// respecting firingIndex overrides and runtime changes
3489			fired = firing = true;
3490			for ( ; queue.length; firingIndex = -1 ) {
3491				memory = queue.shift();
3492				while ( ++firingIndex < list.length ) {
3493
3494					// Run callback and check for early termination
3495					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
3496						options.stopOnFalse ) {
3497
3498						// Jump to end and forget the data so .add doesn't re-fire
3499						firingIndex = list.length;
3500						memory = false;
3501					}
3502				}
3503			}
3504
3505			// Forget the data if we're done with it
3506			if ( !options.memory ) {
3507				memory = false;
3508			}
3509
3510			firing = false;
3511
3512			// Clean up if we're done firing for good
3513			if ( locked ) {
3514
3515				// Keep an empty list if we have data for future add calls
3516				if ( memory ) {
3517					list = [];
3518
3519				// Otherwise, this object is spent
3520				} else {
3521					list = "";
3522				}
3523			}
3524		},
3525
3526		// Actual Callbacks object
3527		self = {
3528
3529			// Add a callback or a collection of callbacks to the list
3530			add: function() {
3531				if ( list ) {
3532
3533					// If we have memory from a past run, we should fire after adding
3534					if ( memory && !firing ) {
3535						firingIndex = list.length - 1;
3536						queue.push( memory );
3537					}
3538
3539					( function add( args ) {
3540						jQuery.each( args, function( _, arg ) {
3541							if ( isFunction( arg ) ) {
3542								if ( !options.unique || !self.has( arg ) ) {
3543									list.push( arg );
3544								}
3545							} else if ( arg && arg.length && toType( arg ) !== "string" ) {
3546
3547								// Inspect recursively
3548								add( arg );
3549							}
3550						} );
3551					} )( arguments );
3552
3553					if ( memory && !firing ) {
3554						fire();
3555					}
3556				}
3557				return this;
3558			},
3559
3560			// Remove a callback from the list
3561			remove: function() {
3562				jQuery.each( arguments, function( _, arg ) {
3563					var index;
3564					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
3565						list.splice( index, 1 );
3566
3567						// Handle firing indexes
3568						if ( index <= firingIndex ) {
3569							firingIndex--;
3570						}
3571					}
3572				} );
3573				return this;
3574			},
3575
3576			// Check if a given callback is in the list.
3577			// If no argument is given, return whether or not list has callbacks attached.
3578			has: function( fn ) {
3579				return fn ?
3580					jQuery.inArray( fn, list ) > -1 :
3581					list.length > 0;
3582			},
3583
3584			// Remove all callbacks from the list
3585			empty: function() {
3586				if ( list ) {
3587					list = [];
3588				}
3589				return this;
3590			},
3591
3592			// Disable .fire and .add
3593			// Abort any current/pending executions
3594			// Clear all callbacks and values
3595			disable: function() {
3596				locked = queue = [];
3597				list = memory = "";
3598				return this;
3599			},
3600			disabled: function() {
3601				return !list;
3602			},
3603
3604			// Disable .fire
3605			// Also disable .add unless we have memory (since it would have no effect)
3606			// Abort any pending executions
3607			lock: function() {
3608				locked = queue = [];
3609				if ( !memory && !firing ) {
3610					list = memory = "";
3611				}
3612				return this;
3613			},
3614			locked: function() {
3615				return !!locked;
3616			},
3617
3618			// Call all callbacks with the given context and arguments
3619			fireWith: function( context, args ) {
3620				if ( !locked ) {
3621					args = args || [];
3622					args = [ context, args.slice ? args.slice() : args ];
3623					queue.push( args );
3624					if ( !firing ) {
3625						fire();
3626					}
3627				}
3628				return this;
3629			},
3630
3631			// Call all the callbacks with the given arguments
3632			fire: function() {
3633				self.fireWith( this, arguments );
3634				return this;
3635			},
3636
3637			// To know if the callbacks have already been called at least once
3638			fired: function() {
3639				return !!fired;
3640			}
3641		};
3642
3643	return self;
3644};
3645
3646
3647function Identity( v ) {
3648	return v;
3649}
3650function Thrower( ex ) {
3651	throw ex;
3652}
3653
3654function adoptValue( value, resolve, reject, noValue ) {
3655	var method;
3656
3657	try {
3658
3659		// Check for promise aspect first to privilege synchronous behavior
3660		if ( value && isFunction( ( method = value.promise ) ) ) {
3661			method.call( value ).done( resolve ).fail( reject );
3662
3663		// Other thenables
3664		} else if ( value && isFunction( ( method = value.then ) ) ) {
3665			method.call( value, resolve, reject );
3666
3667		// Other non-thenables
3668		} else {
3669
3670			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
3671			// * false: [ value ].slice( 0 ) => resolve( value )
3672			// * true: [ value ].slice( 1 ) => resolve()
3673			resolve.apply( undefined, [ value ].slice( noValue ) );
3674		}
3675
3676	// For Promises/A+, convert exceptions into rejections
3677	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
3678	// Deferred#then to conditionally suppress rejection.
3679	} catch ( value ) {
3680
3681		// Support: Android 4.0 only
3682		// Strict mode functions invoked without .call/.apply get global-object context
3683		reject.apply( undefined, [ value ] );
3684	}
3685}
3686
3687jQuery.extend( {
3688
3689	Deferred: function( func ) {
3690		var tuples = [
3691
3692				// action, add listener, callbacks,
3693				// ... .then handlers, argument index, [final state]
3694				[ "notify", "progress", jQuery.Callbacks( "memory" ),
3695					jQuery.Callbacks( "memory" ), 2 ],
3696				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
3697					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
3698				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
3699					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
3700			],
3701			state = "pending",
3702			promise = {
3703				state: function() {
3704					return state;
3705				},
3706				always: function() {
3707					deferred.done( arguments ).fail( arguments );
3708					return this;
3709				},
3710				"catch": function( fn ) {
3711					return promise.then( null, fn );
3712				},
3713
3714				// Keep pipe for back-compat
3715				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
3716					var fns = arguments;
3717
3718					return jQuery.Deferred( function( newDefer ) {
3719						jQuery.each( tuples, function( _i, tuple ) {
3720
3721							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
3722							var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
3723
3724							// deferred.progress(function() { bind to newDefer or newDefer.notify })
3725							// deferred.done(function() { bind to newDefer or newDefer.resolve })
3726							// deferred.fail(function() { bind to newDefer or newDefer.reject })
3727							deferred[ tuple[ 1 ] ]( function() {
3728								var returned = fn && fn.apply( this, arguments );
3729								if ( returned && isFunction( returned.promise ) ) {
3730									returned.promise()
3731										.progress( newDefer.notify )
3732										.done( newDefer.resolve )
3733										.fail( newDefer.reject );
3734								} else {
3735									newDefer[ tuple[ 0 ] + "With" ](
3736										this,
3737										fn ? [ returned ] : arguments
3738									);
3739								}
3740							} );
3741						} );
3742						fns = null;
3743					} ).promise();
3744				},
3745				then: function( onFulfilled, onRejected, onProgress ) {
3746					var maxDepth = 0;
3747					function resolve( depth, deferred, handler, special ) {
3748						return function() {
3749							var that = this,
3750								args = arguments,
3751								mightThrow = function() {
3752									var returned, then;
3753
3754									// Support: Promises/A+ section 2.3.3.3.3
3755									// https://promisesaplus.com/#point-59
3756									// Ignore double-resolution attempts
3757									if ( depth < maxDepth ) {
3758										return;
3759									}
3760
3761									returned = handler.apply( that, args );
3762
3763									// Support: Promises/A+ section 2.3.1
3764									// https://promisesaplus.com/#point-48
3765									if ( returned === deferred.promise() ) {
3766										throw new TypeError( "Thenable self-resolution" );
3767									}
3768
3769									// Support: Promises/A+ sections 2.3.3.1, 3.5
3770									// https://promisesaplus.com/#point-54
3771									// https://promisesaplus.com/#point-75
3772									// Retrieve `then` only once
3773									then = returned &&
3774
3775										// Support: Promises/A+ section 2.3.4
3776										// https://promisesaplus.com/#point-64
3777										// Only check objects and functions for thenability
3778										( typeof returned === "object" ||
3779											typeof returned === "function" ) &&
3780										returned.then;
3781
3782									// Handle a returned thenable
3783									if ( isFunction( then ) ) {
3784
3785										// Special processors (notify) just wait for resolution
3786										if ( special ) {
3787											then.call(
3788												returned,
3789												resolve( maxDepth, deferred, Identity, special ),
3790												resolve( maxDepth, deferred, Thrower, special )
3791											);
3792
3793										// Normal processors (resolve) also hook into progress
3794										} else {
3795
3796											// ...and disregard older resolution values
3797											maxDepth++;
3798
3799											then.call(
3800												returned,
3801												resolve( maxDepth, deferred, Identity, special ),
3802												resolve( maxDepth, deferred, Thrower, special ),
3803												resolve( maxDepth, deferred, Identity,
3804													deferred.notifyWith )
3805											);
3806										}
3807
3808									// Handle all other returned values
3809									} else {
3810
3811										// Only substitute handlers pass on context
3812										// and multiple values (non-spec behavior)
3813										if ( handler !== Identity ) {
3814											that = undefined;
3815											args = [ returned ];
3816										}
3817
3818										// Process the value(s)
3819										// Default process is resolve
3820										( special || deferred.resolveWith )( that, args );
3821									}
3822								},
3823
3824								// Only normal processors (resolve) catch and reject exceptions
3825								process = special ?
3826									mightThrow :
3827									function() {
3828										try {
3829											mightThrow();
3830										} catch ( e ) {
3831
3832											if ( jQuery.Deferred.exceptionHook ) {
3833												jQuery.Deferred.exceptionHook( e,
3834													process.stackTrace );
3835											}
3836
3837											// Support: Promises/A+ section 2.3.3.3.4.1
3838											// https://promisesaplus.com/#point-61
3839											// Ignore post-resolution exceptions
3840											if ( depth + 1 >= maxDepth ) {
3841
3842												// Only substitute handlers pass on context
3843												// and multiple values (non-spec behavior)
3844												if ( handler !== Thrower ) {
3845													that = undefined;
3846													args = [ e ];
3847												}
3848
3849												deferred.rejectWith( that, args );
3850											}
3851										}
3852									};
3853
vendor: 7,865 bytes, lines 3854-4172
3854							// Support: Promises/A+ section 2.3.3.3.1
3855							// https://promisesaplus.com/#point-57
3856							// Re-resolve promises immediately to dodge false rejection from
3857							// subsequent errors
3858							if ( depth ) {
3859								process();
3860							} else {
3861
3862								// Call an optional hook to record the stack, in case of exception
3863								// since it's otherwise lost when execution goes async
3864								if ( jQuery.Deferred.getStackHook ) {
3865									process.stackTrace = jQuery.Deferred.getStackHook();
3866								}
3867								window.setTimeout( process );
3868							}
3869						};
3870					}
3871
3872					return jQuery.Deferred( function( newDefer ) {
3873
3874						// progress_handlers.add( ... )
3875						tuples[ 0 ][ 3 ].add(
3876							resolve(
3877								0,
3878								newDefer,
3879								isFunction( onProgress ) ?
3880									onProgress :
3881									Identity,
3882								newDefer.notifyWith
3883							)
3884						);
3885
3886						// fulfilled_handlers.add( ... )
3887						tuples[ 1 ][ 3 ].add(
3888							resolve(
3889								0,
3890								newDefer,
3891								isFunction( onFulfilled ) ?
3892									onFulfilled :
3893									Identity
3894							)
3895						);
3896
3897						// rejected_handlers.add( ... )
3898						tuples[ 2 ][ 3 ].add(
3899							resolve(
3900								0,
3901								newDefer,
3902								isFunction( onRejected ) ?
3903									onRejected :
3904									Thrower
3905							)
3906						);
3907					} ).promise();
3908				},
3909
3910				// Get a promise for this deferred
3911				// If obj is provided, the promise aspect is added to the object
3912				promise: function( obj ) {
3913					return obj != null ? jQuery.extend( obj, promise ) : promise;
3914				}
3915			},
3916			deferred = {};
3917
3918		// Add list-specific methods
3919		jQuery.each( tuples, function( i, tuple ) {
3920			var list = tuple[ 2 ],
3921				stateString = tuple[ 5 ];
3922
3923			// promise.progress = list.add
3924			// promise.done = list.add
3925			// promise.fail = list.add
3926			promise[ tuple[ 1 ] ] = list.add;
3927
3928			// Handle state
3929			if ( stateString ) {
3930				list.add(
3931					function() {
3932
3933						// state = "resolved" (i.e., fulfilled)
3934						// state = "rejected"
3935						state = stateString;
3936					},
3937
3938					// rejected_callbacks.disable
3939					// fulfilled_callbacks.disable
3940					tuples[ 3 - i ][ 2 ].disable,
3941
3942					// rejected_handlers.disable
3943					// fulfilled_handlers.disable
3944					tuples[ 3 - i ][ 3 ].disable,
3945
3946					// progress_callbacks.lock
3947					tuples[ 0 ][ 2 ].lock,
3948
3949					// progress_handlers.lock
3950					tuples[ 0 ][ 3 ].lock
3951				);
3952			}
3953
3954			// progress_handlers.fire
3955			// fulfilled_handlers.fire
3956			// rejected_handlers.fire
3957			list.add( tuple[ 3 ].fire );
3958
3959			// deferred.notify = function() { deferred.notifyWith(...) }
3960			// deferred.resolve = function() { deferred.resolveWith(...) }
3961			// deferred.reject = function() { deferred.rejectWith(...) }
3962			deferred[ tuple[ 0 ] ] = function() {
3963				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
3964				return this;
3965			};
3966
3967			// deferred.notifyWith = list.fireWith
3968			// deferred.resolveWith = list.fireWith
3969			// deferred.rejectWith = list.fireWith
3970			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
3971		} );
3972
3973		// Make the deferred a promise
3974		promise.promise( deferred );
3975
3976		// Call given func if any
3977		if ( func ) {
3978			func.call( deferred, deferred );
3979		}
3980
3981		// All done!
3982		return deferred;
3983	},
3984
3985	// Deferred helper
3986	when: function( singleValue ) {
3987		var
3988
3989			// count of uncompleted subordinates
3990			remaining = arguments.length,
3991
3992			// count of unprocessed arguments
3993			i = remaining,
3994
3995			// subordinate fulfillment data
3996			resolveContexts = Array( i ),
3997			resolveValues = slice.call( arguments ),
3998
3999			// the master Deferred
4000			master = jQuery.Deferred(),
4001
4002			// subordinate callback factory
4003			updateFunc = function( i ) {
4004				return function( value ) {
4005					resolveContexts[ i ] = this;
4006					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
4007					if ( !( --remaining ) ) {
4008						master.resolveWith( resolveContexts, resolveValues );
4009					}
4010				};
4011			};
4012
4013		// Single- and empty arguments are adopted like Promise.resolve
4014		if ( remaining <= 1 ) {
4015			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
4016				!remaining );
4017
4018			// Use .then() to unwrap secondary thenables (cf. gh-3000)
4019			if ( master.state() === "pending" ||
4020				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
4021
4022				return master.then();
4023			}
4024		}
4025
4026		// Multiple arguments are aggregated like Promise.all array elements
4027		while ( i-- ) {
4028			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
4029		}
4030
4031		return master.promise();
4032	}
4033} );
4034
4035
4036// These usually indicate a programmer mistake during development,
4037// warn about them ASAP rather than swallowing them by default.
4038var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
4039
4040jQuery.Deferred.exceptionHook = function( error, stack ) {
4041
4042	// Support: IE 8 - 9 only
4043	// Console exists when dev tools are open, which can happen at any time
4044	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
4045		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
4046	}
4047};
4048
4049
4050
4051
4052jQuery.readyException = function( error ) {
4053	window.setTimeout( function() {
4054		throw error;
4055	} );
4056};
4057
4058
4059
4060
4061// The deferred used on DOM ready
4062var readyList = jQuery.Deferred();
4063
4064jQuery.fn.ready = function( fn ) {
4065
4066	readyList
4067		.then( fn )
4068
4069		// Wrap jQuery.readyException in a function so that the lookup
4070		// happens at the time of error handling instead of callback
4071		// registration.
4072		.catch( function( error ) {
4073			jQuery.readyException( error );
4074		} );
4075
4076	return this;
4077};
4078
4079jQuery.extend( {
4080
4081	// Is the DOM ready to be used? Set to true once it occurs.
4082	isReady: false,
4083
4084	// A counter to track how many items to wait for before
4085	// the ready event fires. See #6781
4086	readyWait: 1,
4087
4088	// Handle when the DOM is ready
4089	ready: function( wait ) {
4090
4091		// Abort if there are pending holds or we're already ready
4092		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
4093			return;
4094		}
4095
4096		// Remember that the DOM is ready
4097		jQuery.isReady = true;
4098
4099		// If a normal DOM Ready event fired, decrement, and wait if need be
4100		if ( wait !== true && --jQuery.readyWait > 0 ) {
4101			return;
4102		}
4103
4104		// If there are functions bound, to execute
4105		readyList.resolveWith( document, [ jQuery ] );
4106	}
4107} );
4108
4109jQuery.ready.then = readyList.then;
4110
4111// The ready event handler and self cleanup method
4112function completed() {
4113	document.removeEventListener( "DOMContentLoaded", completed );
4114	window.removeEventListener( "load", completed );
4115	jQuery.ready();
4116}
4117
4118// Catch cases where $(document).ready() is called
4119// after the browser event has already occurred.
4120// Support: IE <=9 - 10 only
4121// Older IE sometimes signals "interactive" too soon
4122if ( document.readyState === "complete" ||
4123	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
4124
4125	// Handle it asynchronously to allow scripts the opportunity to delay ready
4126	window.setTimeout( jQuery.ready );
4127
4128} else {
4129
4130	// Use the handy event callback
4131	document.addEventListener( "DOMContentLoaded", completed );
4132
4133	// A fallback to window.onload, that will always work
4134	window.addEventListener( "load", completed );
4135}
4136
4137
4138
4139
4140// Multifunctional method to get and set values of a collection
4141// The value/s can optionally be executed if it's a function
4142var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
4143	var i = 0,
4144		len = elems.length,
4145		bulk = key == null;
4146
4147	// Sets many values
4148	if ( toType( key ) === "object" ) {
4149		chainable = true;
4150		for ( i in key ) {
4151			access( elems, fn, i, key[ i ], true, emptyGet, raw );
4152		}
4153
4154	// Sets one value
4155	} else if ( value !== undefined ) {
4156		chainable = true;
4157
4158		if ( !isFunction( value ) ) {
4159			raw = true;
4160		}
4161
4162		if ( bulk ) {
4163
4164			// Bulk operations run against the entire set
4165			if ( raw ) {
4166				fn.call( elems, value );
4167				fn = null;
4168
4169			// ...except when executing function values
4170			} else {
4171				bulk = fn;
4172				fn = function( elem, 
4172_key, value ) {
4173					return bulk.call( jQuery( elem ), value );
4174				};
4175			}
4176		}
4177
4178		if ( fn ) {
4179			for ( ; i < len; i++ ) {
4180				fn(
4181					elems[ i ], key, raw ?
4182					value :
vendor: 22,305 bytes, lines 4183-5091
4183					value.call( elems[ i ], i, fn( elems[ i ], key ) )
4184				);
4185			}
4186		}
4187	}
4188
4189	if ( chainable ) {
4190		return elems;
4191	}
4192
4193	// Gets
4194	if ( bulk ) {
4195		return fn.call( elems );
4196	}
4197
4198	return len ? fn( elems[ 0 ], key ) : emptyGet;
4199};
4200
4201
4202// Matches dashed string for camelizing
4203var rmsPrefix = /^-ms-/,
4204	rdashAlpha = /-([a-z])/g;
4205
4206// Used by camelCase as callback to replace()
4207function fcamelCase( _all, letter ) {
4208	return letter.toUpperCase();
4209}
4210
4211// Convert dashed to camelCase; used by the css and data modules
4212// Support: IE <=9 - 11, Edge 12 - 15
4213// Microsoft forgot to hump their vendor prefix (#9572)
4214function camelCase( string ) {
4215	return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
4216}
4217var acceptData = function( owner ) {
4218
4219	// Accepts only:
4220	//  - Node
4221	//    - Node.ELEMENT_NODE
4222	//    - Node.DOCUMENT_NODE
4223	//  - Object
4224	//    - Any
4225	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
4226};
4227
4228
4229
4230
4231function Data() {
4232	this.expando = jQuery.expando + Data.uid++;
4233}
4234
4235Data.uid = 1;
4236
4237Data.prototype = {
4238
4239	cache: function( owner ) {
4240
4241		// Check if the owner object already has a cache
4242		var value = owner[ this.expando ];
4243
4244		// If not, create one
4245		if ( !value ) {
4246			value = {};
4247
4248			// We can accept data for non-element nodes in modern browsers,
4249			// but we should not, see #8335.
4250			// Always return an empty object.
4251			if ( acceptData( owner ) ) {
4252
4253				// If it is a node unlikely to be stringify-ed or looped over
4254				// use plain assignment
4255				if ( owner.nodeType ) {
4256					owner[ this.expando ] = value;
4257
4258				// Otherwise secure it in a non-enumerable property
4259				// configurable must be true to allow the property to be
4260				// deleted when data is removed
4261				} else {
4262					Object.defineProperty( owner, this.expando, {
4263						value: value,
4264						configurable: true
4265					} );
4266				}
4267			}
4268		}
4269
4270		return value;
4271	},
4272	set: function( owner, data, value ) {
4273		var prop,
4274			cache = this.cache( owner );
4275
4276		// Handle: [ owner, key, value ] args
4277		// Always use camelCase key (gh-2257)
4278		if ( typeof data === "string" ) {
4279			cache[ camelCase( data ) ] = value;
4280
4281		// Handle: [ owner, { properties } ] args
4282		} else {
4283
4284			// Copy the properties one-by-one to the cache object
4285			for ( prop in data ) {
4286				cache[ camelCase( prop ) ] = data[ prop ];
4287			}
4288		}
4289		return cache;
4290	},
4291	get: function( owner, key ) {
4292		return key === undefined ?
4293			this.cache( owner ) :
4294
4295			// Always use camelCase key (gh-2257)
4296			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
4297	},
4298	access: function( owner, key, value ) {
4299
4300		// In cases where either:
4301		//
4302		//   1. No key was specified
4303		//   2. A string key was specified, but no value provided
4304		//
4305		// Take the "read" path and allow the get method to determine
4306		// which value to return, respectively either:
4307		//
4308		//   1. The entire cache object
4309		//   2. The data stored at the key
4310		//
4311		if ( key === undefined ||
4312				( ( key && typeof key === "string" ) && value === undefined ) ) {
4313
4314			return this.get( owner, key );
4315		}
4316
4317		// When the key is not a string, or both a key and value
4318		// are specified, set or extend (existing objects) with either:
4319		//
4320		//   1. An object of properties
4321		//   2. A key and value
4322		//
4323		this.set( owner, key, value );
4324
4325		// Since the "set" path can have two possible entry points
4326		// return the expected data based on which path was taken[*]
4327		return value !== undefined ? value : key;
4328	},
4329	remove: function( owner, key ) {
4330		var i,
4331			cache = owner[ this.expando ];
4332
4333		if ( cache === undefined ) {
4334			return;
4335		}
4336
4337		if ( key !== undefined ) {
4338
4339			// Support array or space separated string of keys
4340			if ( Array.isArray( key ) ) {
4341
4342				// If key is an array of keys...
4343				// We always set camelCase keys, so remove that.
4344				key = key.map( camelCase );
4345			} else {
4346				key = camelCase( key );
4347
4348				// If a key with the spaces exists, use it.
4349				// Otherwise, create an array by matching non-whitespace
4350				key = key in cache ?
4351					[ key ] :
4352					( key.match( rnothtmlwhite ) || [] );
4353			}
4354
4355			i = key.length;
4356
4357			while ( i-- ) {
4358				delete cache[ key[ i ] ];
4359			}
4360		}
4361
4362		// Remove the expando if there's no more data
4363		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
4364
4365			// Support: Chrome <=35 - 45
4366			// Webkit & Blink performance suffers when deleting properties
4367			// from DOM nodes, so set to undefined instead
4368			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
4369			if ( owner.nodeType ) {
4370				owner[ this.expando ] = undefined;
4371			} else {
4372				delete owner[ this.expando ];
4373			}
4374		}
4375	},
4376	hasData: function( owner ) {
4377		var cache = owner[ this.expando ];
4378		return cache !== undefined && !jQuery.isEmptyObject( cache );
4379	}
4380};
4381var dataPriv = new Data();
4382
4383var dataUser = new Data();
4384
4385
4386
4387//	Implementation Summary
4388//
4389//	1. Enforce API surface and semantic compatibility with 1.9.x branch
4390//	2. Improve the module's maintainability by reducing the storage
4391//		paths to a single mechanism.
4392//	3. Use the same single mechanism to support "private" and "user" data.
4393//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
4394//	5. Avoid exposing implementation details on user objects (eg. expando properties)
4395//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
4396
4397var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
4398	rmultiDash = /[A-Z]/g;
4399
4400function getData( data ) {
4401	if ( data === "true" ) {
4402		return true;
4403	}
4404
4405	if ( data === "false" ) {
4406		return false;
4407	}
4408
4409	if ( data === "null" ) {
4410		return null;
4411	}
4412
4413	// Only convert to a number if it doesn't change the string
4414	if ( data === +data + "" ) {
4415		return +data;
4416	}
4417
4418	if ( rbrace.test( data ) ) {
4419		return JSON.parse( data );
4420	}
4421
4422	return data;
4423}
4424
4425function dataAttr( elem, key, data ) {
4426	var name;
4427
4428	// If nothing was found internally, try to fetch any
4429	// data from the HTML5 data-* attribute
4430	if ( data === undefined && elem.nodeType === 1 ) {
4431		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
4432		data = elem.getAttribute( name );
4433
4434		if ( typeof data === "string" ) {
4435			try {
4436				data = getData( data );
4437			} catch ( e ) {}
4438
4439			// Make sure we set the data so it isn't changed later
4440			dataUser.set( elem, key, data );
4441		} else {
4442			data = undefined;
4443		}
4444	}
4445	return data;
4446}
4447
4448jQuery.extend( {
4449	hasData: function( elem ) {
4450		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
4451	},
4452
4453	data: function( elem, name, data ) {
4454		return dataUser.access( elem, name, data );
4455	},
4456
4457	removeData: function( elem, name ) {
4458		dataUser.remove( elem, name );
4459	},
4460
4461	// TODO: Now that all calls to _data and _removeData have been replaced
4462	// with direct calls to dataPriv methods, these can be deprecated.
4463	_data: function( elem, name, data ) {
4464		return dataPriv.access( elem, name, data );
4465	},
4466
4467	_removeData: function( elem, name ) {
4468		dataPriv.remove( elem, name );
4469	}
4470} );
4471
4472jQuery.fn.extend( {
4473	data: function( key, value ) {
4474		var i, name, data,
4475			elem = this[ 0 ],
4476			attrs = elem && elem.attributes;
4477
4478		// Gets all values
4479		if ( key === undefined ) {
4480			if ( this.length ) {
4481				data = dataUser.get( elem );
4482
4483				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
4484					i = attrs.length;
4485					while ( i-- ) {
4486
4487						// Support: IE 11 only
4488						// The attrs elements can be null (#14894)
4489						if ( attrs[ i ] ) {
4490							name = attrs[ i ].name;
4491							if ( name.indexOf( "data-" ) === 0 ) {
4492								name = camelCase( name.slice( 5 ) );
4493								dataAttr( elem, name, data[ name ] );
4494							}
4495						}
4496					}
4497					dataPriv.set( elem, "hasDataAttrs", true );
4498				}
4499			}
4500
4501			return data;
4502		}
4503
4504		// Sets multiple values
4505		if ( typeof key === "object" ) {
4506			return this.each( function() {
4507				dataUser.set( this, key );
4508			} );
4509		}
4510
4511		return access( this, function( value ) {
4512			var data;
4513
4514			// The calling jQuery object (element matches) is not empty
4515			// (and therefore has an element appears at this[ 0 ]) and the
4516			// `value` parameter was not undefined. An empty jQuery object
4517			// will result in `undefined` for elem = this[ 0 ] which will
4518			// throw an exception if an attempt to read a data cache is made.
4519			if ( elem && value === undefined ) {
4520
4521				// Attempt to get data from the cache
4522				// The key will always be camelCased in Data
4523				data = dataUser.get( elem, key );
4524				if ( data !== undefined ) {
4525					return data;
4526				}
4527
4528				// Attempt to "discover" the data in
4529				// HTML5 custom data-* attrs
4530				data = dataAttr( elem, key );
4531				if ( data !== undefined ) {
4532					return data;
4533				}
4534
4535				// We tried really hard, but the data doesn't exist.
4536				return;
4537			}
4538
4539			// Set the data...
4540			this.each( function() {
4541
4542				// We always store the camelCased key
4543				dataUser.set( this, key, value );
4544			} );
4545		}, null, value, arguments.length > 1, null, true );
4546	},
4547
4548	removeData: function( key ) {
4549		return this.each( function() {
4550			dataUser.remove( this, key );
4551		} );
4552	}
4553} );
4554
4555
4556jQuery.extend( {
4557	queue: function( elem, type, data ) {
4558		var queue;
4559
4560		if ( elem ) {
4561			type = ( type || "fx" ) + "queue";
4562			queue = dataPriv.get( elem, type );
4563
4564			// Speed up dequeue by getting out quickly if this is just a lookup
4565			if ( data ) {
4566				if ( !queue || Array.isArray( data ) ) {
4567					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
4568				} else {
4569					queue.push( data );
4570				}
4571			}
4572			return queue || [];
4573		}
4574	},
4575
4576	dequeue: function( elem, type ) {
4577		type = type || "fx";
4578
4579		var queue = jQuery.queue( elem, type ),
4580			startLength = queue.length,
4581			fn = queue.shift(),
4582			hooks = jQuery._queueHooks( elem, type ),
4583			next = function() {
4584				jQuery.dequeue( elem, type );
4585			};
4586
4587		// If the fx queue is dequeued, always remove the progress sentinel
4588		if ( fn === "inprogress" ) {
4589			fn = queue.shift();
4590			startLength--;
4591		}
4592
4593		if ( fn ) {
4594
4595			// Add a progress sentinel to prevent the fx queue from being
4596			// automatically dequeued
4597			if ( type === "fx" ) {
4598				queue.unshift( "inprogress" );
4599			}
4600
4601			// Clear up the last queue stop function
4602			delete hooks.stop;
4603			fn.call( elem, next, hooks );
4604		}
4605
4606		if ( !startLength && hooks ) {
4607			hooks.empty.fire();
4608		}
4609	},
4610
4611	// Not public - generate a queueHooks object, or return the current one
4612	_queueHooks: function( elem, type ) {
4613		var key = type + "queueHooks";
4614		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
4615			empty: jQuery.Callbacks( "once memory" ).add( function() {
4616				dataPriv.remove( elem, [ type + "queue", key ] );
4617			} )
4618		} );
4619	}
4620} );
4621
4622jQuery.fn.extend( {
4623	queue: function( type, data ) {
4624		var setter = 2;
4625
4626		if ( typeof type !== "string" ) {
4627			data = type;
4628			type = "fx";
4629			setter--;
4630		}
4631
4632		if ( arguments.length < setter ) {
4633			return jQuery.queue( this[ 0 ], type );
4634		}
4635
4636		return data === undefined ?
4637			this :
4638			this.each( function() {
4639				var queue = jQuery.queue( this, type, data );
4640
4641				// Ensure a hooks for this queue
4642				jQuery._queueHooks( this, type );
4643
4644				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
4645					jQuery.dequeue( this, type );
4646				}
4647			} );
4648	},
4649	dequeue: function( type ) {
4650		return this.each( function() {
4651			jQuery.dequeue( this, type );
4652		} );
4653	},
4654	clearQueue: function( type ) {
4655		return this.queue( type || "fx", [] );
4656	},
4657
4658	// Get a promise resolved when queues of a certain type
4659	// are emptied (fx is the type by default)
4660	promise: function( type, obj ) {
4661		var tmp,
4662			count = 1,
4663			defer = jQuery.Deferred(),
4664			elements = this,
4665			i = this.length,
4666			resolve = function() {
4667				if ( !( --count ) ) {
4668					defer.resolveWith( elements, [ elements ] );
4669				}
4670			};
4671
4672		if ( typeof type !== "string" ) {
4673			obj = type;
4674			type = undefined;
4675		}
4676		type = type || "fx";
4677
4678		while ( i-- ) {
4679			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
4680			if ( tmp && tmp.empty ) {
4681				count++;
4682				tmp.empty.add( resolve );
4683			}
4684		}
4685		resolve();
4686		return defer.promise( obj );
4687	}
4688} );
4689var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
4690
4691var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
4692
4693
4694var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4695
4696var documentElement = document.documentElement;
4697
4698
4699
4700	var isAttached = function( elem ) {
4701			return jQuery.contains( elem.ownerDocument, elem );
4702		},
4703		composed = { composed: true };
4704
4705	// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
4706	// Check attachment across shadow DOM boundaries when possible (gh-3504)
4707	// Support: iOS 10.0-10.2 only
4708	// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
4709	// leading to errors. We need to check for `getRootNode`.
4710	if ( documentElement.getRootNode ) {
4711		isAttached = function( elem ) {
4712			return jQuery.contains( elem.ownerDocument, elem ) ||
4713				elem.getRootNode( composed ) === elem.ownerDocument;
4714		};
4715	}
4716var isHiddenWithinTree = function( elem, el ) {
4717
4718		// isHiddenWithinTree might be called from jQuery#filter function;
4719		// in that case, element will be second argument
4720		elem = el || elem;
4721
4722		// Inline style trumps all
4723		return elem.style.display === "none" ||
4724			elem.style.display === "" &&
4725
4726			// Otherwise, check computed style
4727			// Support: Firefox <=43 - 45
4728			// Disconnected elements can have computed display: none, so first confirm that elem is
4729			// in the document.
4730			isAttached( elem ) &&
4731
4732			jQuery.css( elem, "display" ) === "none";
4733	};
4734
4735
4736
4737function adjustCSS( elem, prop, valueParts, tween ) {
4738	var adjusted, scale,
4739		maxIterations = 20,
4740		currentValue = tween ?
4741			function() {
4742				return tween.cur();
4743			} :
4744			function() {
4745				return jQuery.css( elem, prop, "" );
4746			},
4747		initial = currentValue(),
4748		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4749
4750		// Starting value computation is required for potential unit mismatches
4751		initialInUnit = elem.nodeType &&
4752			( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4753			rcssNum.exec( jQuery.css( elem, prop ) );
4754
4755	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
4756
4757		// Support: Firefox <=54
4758		// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
4759		initial = initial / 2;
4760
4761		// Trust units reported by jQuery.css
4762		unit = unit || initialInUnit[ 3 ];
4763
4764		// Iteratively approximate from a nonzero starting point
4765		initialInUnit = +initial || 1;
4766
4767		while ( maxIterations-- ) {
4768
4769			// Evaluate and update our best guess (doubling guesses that zero out).
4770			// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
4771			jQuery.style( elem, prop, initialInUnit + unit );
4772			if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
4773				maxIterations = 0;
4774			}
4775			initialInUnit = initialInUnit / scale;
4776
4777		}
4778
4779		initialInUnit = initialInUnit * 2;
4780		jQuery.style( elem, prop, initialInUnit + unit );
4781
4782		// Make sure we update the tween properties later on
4783		valueParts = valueParts || [];
4784	}
4785
4786	if ( valueParts ) {
4787		initialInUnit = +initialInUnit || +initial || 0;
4788
4789		// Apply relative offset (+=/-=) if specified
4790		adjusted = valueParts[ 1 ] ?
4791			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
4792			+valueParts[ 2 ];
4793		if ( tween ) {
4794			tween.unit = unit;
4795			tween.start = initialInUnit;
4796			tween.end = adjusted;
4797		}
4798	}
4799	return adjusted;
4800}
4801
4802
4803var defaultDisplayMap = {};
4804
4805function getDefaultDisplay( elem ) {
4806	var temp,
4807		doc = elem.ownerDocument,
4808		nodeName = elem.nodeName,
4809		display = defaultDisplayMap[ nodeName ];
4810
4811	if ( display ) {
4812		return display;
4813	}
4814
4815	temp = doc.body.appendChild( doc.createElement( nodeName ) );
4816	display = jQuery.css( temp, "display" );
4817
4818	temp.parentNode.removeChild( temp );
4819
4820	if ( display === "none" ) {
4821		display = "block";
4822	}
4823	defaultDisplayMap[ nodeName ] = display;
4824
4825	return display;
4826}
4827
4828function showHide( elements, show ) {
4829	var display, elem,
4830		values = [],
4831		index = 0,
4832		length = elements.length;
4833
4834	// Determine new display value for elements that need to change
4835	for ( ; index < length; index++ ) {
4836		elem = elements[ index ];
4837		if ( !elem.style ) {
4838			continue;
4839		}
4840
4841		display = elem.style.display;
4842		if ( show ) {
4843
4844			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
4845			// check is required in this first loop unless we have a nonempty display value (either
4846			// inline or about-to-be-restored)
4847			if ( display === "none" ) {
4848				values[ index ] = dataPriv.get( elem, "display" ) || null;
4849				if ( !values[ index ] ) {
4850					elem.style.display = "";
4851				}
4852			}
4853			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
4854				values[ index ] = getDefaultDisplay( elem );
4855			}
4856		} else {
4857			if ( display !== "none" ) {
4858				values[ index ] = "none";
4859
4860				// Remember what we're overwriting
4861				dataPriv.set( elem, "display", display );
4862			}
4863		}
4864	}
4865
4866	// Set the display of the elements in a second loop to avoid constant reflow
4867	for ( index = 0; index < length; index++ ) {
4868		if ( values[ index ] != null ) {
4869			elements[ index ].style.display = values[ index ];
4870		}
4871	}
4872
4873	return elements;
4874}
4875
4876jQuery.fn.extend( {
4877	show: function() {
4878		return showHide( this, true );
4879	},
4880	hide: function() {
4881		return showHide( this );
4882	},
4883	toggle: function( state ) {
4884		if ( typeof state === "boolean" ) {
4885			return state ? this.show() : this.hide();
4886		}
4887
4888		return this.each( function() {
4889			if ( isHiddenWithinTree( this ) ) {
4890				jQuery( this ).show();
4891			} else {
4892				jQuery( this ).hide();
4893			}
4894		} );
4895	}
4896} );
4897var rcheckableType = ( /^(?:checkbox|radio)$/i );
4898
4899var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
4900
4901var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
4902
4903
4904
4905( function() {
4906	var fragment = document.createDocumentFragment(),
4907		div = fragment.appendChild( document.createElement( "div" ) ),
4908		input = document.createElement( "input" );
4909
4910	// Support: Android 4.0 - 4.3 only
4911	// Check state lost if the name is set (#11217)
4912	// Support: Windows Web Apps (WWA)
4913	// `name` and `type` must use .setAttribute for WWA (#14901)
4914	input.setAttribute( "type", "radio" );
4915	input.setAttribute( "checked", "checked" );
4916	input.setAttribute( "name", "t" );
4917
4918	div.appendChild( input );
4919
4920	// Support: Android <=4.1 only
4921	// Older WebKit doesn't clone checked state correctly in fragments
4922	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4923
4924	// Support: IE <=11 only
4925	// Make sure textarea (and checkbox) defaultValue is properly cloned
4926	div.innerHTML = "<textarea>x</textarea>";
4927	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4928
4929	// Support: IE <=9 only
4930	// IE <=9 replaces <option> tags with their contents when inserted outside of
4931	// the select element.
4932	div.innerHTML = "<option></option>";
4933	support.option = !!div.lastChild;
4934} )();
4935
4936
4937// We have to close these tags to support XHTML (#13200)
4938var wrapMap = {
4939
4940	// XHTML parsers do not magically insert elements in the
4941	// same way that tag soup parsers do. So we cannot shorten
4942	// this by omitting <tbody> or other required elements.
4943	thead: [ 1, "<table>", "</table>" ],
4944	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
4945	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4946	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4947
4948	_default: [ 0, "", "" ]
4949};
4950
4951wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4952wrapMap.th = wrapMap.td;
4953
4954// Support: IE <=9 only
4955if ( !support.option ) {
4956	wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
4957}
4958
4959
4960function getAll( context, tag ) {
4961
4962	// Support: IE <=9 - 11 only
4963	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
4964	var ret;
4965
4966	if ( typeof context.getElementsByTagName !== "undefined" ) {
4967		ret = context.getElementsByTagName( tag || "*" );
4968
4969	} else if ( typeof context.querySelectorAll !== "undefined" ) {
4970		ret = context.querySelectorAll( tag || "*" );
4971
4972	} else {
4973		ret = [];
4974	}
4975
4976	if ( tag === undefined || tag && nodeName( context, tag ) ) {
4977		return jQuery.merge( [ context ], ret );
4978	}
4979
4980	return ret;
4981}
4982
4983
4984// Mark scripts as having already been evaluated
4985function setGlobalEval( elems, refElements ) {
4986	var i = 0,
4987		l = elems.length;
4988
4989	for ( ; i < l; i++ ) {
4990		dataPriv.set(
4991			elems[ i ],
4992			"globalEval",
4993			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
4994		);
4995	}
4996}
4997
4998
4999var rhtml = /<|&#?\w+;/;
5000
5001function buildFragment( elems, context, scripts, selection, ignored ) {
5002	var elem, tmp, tag, wrap, attached, j,
5003		fragment = context.createDocumentFragment(),
5004		nodes = [],
5005		i = 0,
5006		l = elems.length;
5007
5008	for ( ; i < l; i++ ) {
5009		elem = elems[ i ];
5010
5011		if ( elem || elem === 0 ) {
5012
5013			// Add nodes directly
5014			if ( toType( elem ) === "object" ) {
5015
5016				// Support: Android <=4.0 only, PhantomJS 1 only
5017				// push.apply(_, arraylike) throws on ancient WebKit
5018				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
5019
5020			// Convert non-html into a text node
5021			} else if ( !rhtml.test( elem ) ) {
5022				nodes.push( context.createTextNode( elem ) );
5023
5024			// Convert html into DOM nodes
5025			} else {
5026				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
5027
5028				// Deserialize a standard representation
5029				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
5030				wrap = wrapMap[ tag ] || wrapMap._default;
5031				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
5032
5033				// Descend through wrappers to the right content
5034				j = wrap[ 0 ];
5035				while ( j-- ) {
5036					tmp = tmp.lastChild;
5037				}
5038
5039				// Support: Android <=4.0 only, PhantomJS 1 only
5040				// push.apply(_, arraylike) throws on ancient WebKit
5041				jQuery.merge( nodes, tmp.childNodes );
5042
5043				// Remember the top-level container
5044				tmp = fragment.firstChild;
5045
5046				// Ensure the created nodes are orphaned (#12392)
5047				tmp.textContent = "";
5048			}
5049		}
5050	}
5051
5052	// Remove wrapper from fragment
5053	fragment.textContent = "";
5054
5055	i = 0;
5056	while ( ( elem = nodes[ i++ ] ) ) {
5057
5058		// Skip elements already in the context collection (trac-4087)
5059		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
5060			if ( ignored ) {
5061				ignored.push( elem );
5062			}
5063			continue;
5064		}
5065
5066		attached = isAttached( elem );
5067
5068		// Append to fragment
5069		tmp = getAll( fragment.appendChild( elem ), "script" );
5070
5071		// Preserve script evaluation history
5072		if ( attached ) {
5073			setGlobalEval( tmp );
5074		}
5075
5076		// Capture executables
5077		if ( scripts ) {
5078			j = 0;
5079			while ( ( elem = tmp[ j++ ] ) ) {
5080				if ( rscriptType.test( elem.type || "" ) ) {
5081					scripts.push( elem );
5082				}
5083			}
5084		}
5085	}
5086
5087	return fragment;
5088}
5089
5090
5091var
5091
vendor: 6,183 bytes, lines 5092-5317
5092	rkeyEvent = /^key/,
5093	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
5094	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
5095
5096function returnTrue() {
5097	return true;
5098}
5099
5100function returnFalse() {
5101	return false;
5102}
5103
5104// Support: IE <=9 - 11+
5105// focus() and blur() are asynchronous, except when they are no-op.
5106// So expect focus to be synchronous when the element is already active,
5107// and blur to be synchronous when the element is not already active.
5108// (focus and blur are always synchronous in other supported browsers,
5109// this just defines when we can count on it).
5110function expectSync( elem, type ) {
5111	return ( elem === safeActiveElement() ) === ( type === "focus" );
5112}
5113
5114// Support: IE <=9 only
5115// Accessing document.activeElement can throw unexpectedly
5116// https://bugs.jquery.com/ticket/13393
5117function safeActiveElement() {
5118	try {
5119		return document.activeElement;
5120	} catch ( err ) { }
5121}
5122
5123function on( elem, types, selector, data, fn, one ) {
5124	var origFn, type;
5125
5126	// Types can be a map of types/handlers
5127	if ( typeof types === "object" ) {
5128
5129		// ( types-Object, selector, data )
5130		if ( typeof selector !== "string" ) {
5131
5132			// ( types-Object, data )
5133			data = data || selector;
5134			selector = undefined;
5135		}
5136		for ( type in types ) {
5137			on( elem, type, selector, data, types[ type ], one );
5138		}
5139		return elem;
5140	}
5141
5142	if ( data == null && fn == null ) {
5143
5144		// ( types, fn )
5145		fn = selector;
5146		data = selector = undefined;
5147	} else if ( fn == null ) {
5148		if ( typeof selector === "string" ) {
5149
5150			// ( types, selector, fn )
5151			fn = data;
5152			data = undefined;
5153		} else {
5154
5155			// ( types, data, fn )
5156			fn = data;
5157			data = selector;
5158			selector = undefined;
5159		}
5160	}
5161	if ( fn === false ) {
5162		fn = returnFalse;
5163	} else if ( !fn ) {
5164		return elem;
5165	}
5166
5167	if ( one === 1 ) {
5168		origFn = fn;
5169		fn = function( event ) {
5170
5171			// Can use an empty set, since event contains the info
5172			jQuery().off( event );
5173			return origFn.apply( this, arguments );
5174		};
5175
5176		// Use same guid so caller can remove using origFn
5177		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
5178	}
5179	return elem.each( function() {
5180		jQuery.event.add( this, types, fn, data, selector );
5181	} );
5182}
5183
5184/*
5185 * Helper functions for managing events -- not part of the public interface.
5186 * Props to Dean Edwards' addEvent library for many of the ideas.
5187 */
5188jQuery.event = {
5189
5190	global: {},
5191
5192	add: function( elem, types, handler, data, selector ) {
5193
5194		var handleObjIn, eventHandle, tmp,
5195			events, t, handleObj,
5196			special, handlers, type, namespaces, origType,
5197			elemData = dataPriv.get( elem );
5198
5199		// Only attach events to objects that accept data
5200		if ( !acceptData( elem ) ) {
5201			return;
5202		}
5203
5204		// Caller can pass in an object of custom data in lieu of the handler
5205		if ( handler.handler ) {
5206			handleObjIn = handler;
5207			handler = handleObjIn.handler;
5208			selector = handleObjIn.selector;
5209		}
5210
5211		// Ensure that invalid selectors throw exceptions at attach time
5212		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
5213		if ( selector ) {
5214			jQuery.find.matchesSelector( documentElement, selector );
5215		}
5216
5217		// Make sure that the handler has a unique ID, used to find/remove it later
5218		if ( !handler.guid ) {
5219			handler.guid = jQuery.guid++;
5220		}
5221
5222		// Init the element's event structure and main handler, if this is the first
5223		if ( !( events = elemData.events ) ) {
5224			events = elemData.events = Object.create( null );
5225		}
5226		if ( !( eventHandle = elemData.handle ) ) {
5227			eventHandle = elemData.handle = function( e ) {
5228
5229				// Discard the second event of a jQuery.event.trigger() and
5230				// when an event is called after a page has unloaded
5231				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
5232					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
5233			};
5234		}
5235
5236		// Handle multiple events separated by a space
5237		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5238		t = types.length;
5239		while ( t-- ) {
5240			tmp = rtypenamespace.exec( types[ t ] ) || [];
5241			type = origType = tmp[ 1 ];
5242			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5243
5244			// There *must* be a type, no attaching namespace-only handlers
5245			if ( !type ) {
5246				continue;
5247			}
5248
5249			// If event changes its type, use the special event handlers for the changed type
5250			special = jQuery.event.special[ type ] || {};
5251
5252			// If selector defined, determine special event api type, otherwise given type
5253			type = ( selector ? special.delegateType : special.bindType ) || type;
5254
5255			// Update special based on newly reset type
5256			special = jQuery.event.special[ type ] || {};
5257
5258			// handleObj is passed to all event handlers
5259			handleObj = jQuery.extend( {
5260				type: type,
5261				origType: origType,
5262				data: data,
5263				handler: handler,
5264				guid: handler.guid,
5265				selector: selector,
5266				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
5267				namespace: namespaces.join( "." )
5268			}, handleObjIn );
5269
5270			// Init the event handler queue if we're the first
5271			if ( !( handlers = events[ type ] ) ) {
5272				handlers = events[ type ] = [];
5273				handlers.delegateCount = 0;
5274
5275				// Only use addEventListener if the special events handler returns false
5276				if ( !special.setup ||
5277					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
5278
5279					if ( elem.addEventListener ) {
5280						elem.addEventListener( type, eventHandle );
5281					}
5282				}
5283			}
5284
5285			if ( special.add ) {
5286				special.add.call( elem, handleObj );
5287
5288				if ( !handleObj.handler.guid ) {
5289					handleObj.handler.guid = handler.guid;
5290				}
5291			}
5292
5293			// Add to the element's handler list, delegates in front
5294			if ( selector ) {
5295				handlers.splice( handlers.delegateCount++, 0, handleObj );
5296			} else {
5297				handlers.push( handleObj );
5298			}
5299
5300			// Keep track of which events have ever been used, for event optimization
5301			jQuery.event.global[ type ] = true;
5302		}
5303
5304	},
5305
5306	// Detach an event or set of events from an element
5307	remove: function( elem, types, handler, selector, mappedTypes ) {
5308
5309		var j, origCount, tmp,
5310			events, t, handleObj,
5311			special, handlers, type, namespaces, origType,
5312			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
5313
5314		if ( !elemData || !( events = elemData.events ) ) {
5315			return;
5316		}
5317
vendor: 4,199 bytes, lines 5318-5456
5318		// Once for each type.namespace in types; type may be omitted
5319		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5320		t = types.length;
5321		while ( t-- ) {
5322			tmp = rtypenamespace.exec( types[ t ] ) || [];
5323			type = origType = tmp[ 1 ];
5324			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5325
5326			// Unbind all events (on this namespace, if provided) for the element
5327			if ( !type ) {
5328				for ( type in events ) {
5329					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
5330				}
5331				continue;
5332			}
5333
5334			special = jQuery.event.special[ type ] || {};
5335			type = ( selector ? special.delegateType : special.bindType ) || type;
5336			handlers = events[ type ] || [];
5337			tmp = tmp[ 2 ] &&
5338				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
5339
5340			// Remove matching events
5341			origCount = j = handlers.length;
5342			while ( j-- ) {
5343				handleObj = handlers[ j ];
5344
5345				if ( ( mappedTypes || origType === handleObj.origType ) &&
5346					( !handler || handler.guid === handleObj.guid ) &&
5347					( !tmp || tmp.test( handleObj.namespace ) ) &&
5348					( !selector || selector === handleObj.selector ||
5349						selector === "**" && handleObj.selector ) ) {
5350					handlers.splice( j, 1 );
5351
5352					if ( handleObj.selector ) {
5353						handlers.delegateCount--;
5354					}
5355					if ( special.remove ) {
5356						special.remove.call( elem, handleObj );
5357					}
5358				}
5359			}
5360
5361			// Remove generic event handler if we removed something and no more handlers exist
5362			// (avoids potential for endless recursion during removal of special event handlers)
5363			if ( origCount && !handlers.length ) {
5364				if ( !special.teardown ||
5365					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
5366
5367					jQuery.removeEvent( elem, type, elemData.handle );
5368				}
5369
5370				delete events[ type ];
5371			}
5372		}
5373
5374		// Remove data and the expando if it's no longer used
5375		if ( jQuery.isEmptyObject( events ) ) {
5376			dataPriv.remove( elem, "handle events" );
5377		}
5378	},
5379
5380	dispatch: function( nativeEvent ) {
5381
5382		var i, j, ret, matched, handleObj, handlerQueue,
5383			args = new Array( arguments.length ),
5384
5385			// Make a writable jQuery.Event from the native event object
5386			event = jQuery.event.fix( nativeEvent ),
5387
5388			handlers = (
5389					dataPriv.get( this, "events" ) || Object.create( null )
5390				)[ event.type ] || [],
5391			special = jQuery.event.special[ event.type ] || {};
5392
5393		// Use the fix-ed jQuery.Event rather than the (read-only) native event
5394		args[ 0 ] = event;
5395
5396		for ( i = 1; i < arguments.length; i++ ) {
5397			args[ i ] = arguments[ i ];
5398		}
5399
5400		event.delegateTarget = this;
5401
5402		// Call the preDispatch hook for the mapped type, and let it bail if desired
5403		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
5404			return;
5405		}
5406
5407		// Determine handlers
5408		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
5409
5410		// Run delegates first; they may want to stop propagation beneath us
5411		i = 0;
5412		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
5413			event.currentTarget = matched.elem;
5414
5415			j = 0;
5416			while ( ( handleObj = matched.handlers[ j++ ] ) &&
5417				!event.isImmediatePropagationStopped() ) {
5418
5419				// If the event is namespaced, then each handler is only invoked if it is
5420				// specially universal or its namespaces are a superset of the event's.
5421				if ( !event.rnamespace || handleObj.namespace === false ||
5422					event.rnamespace.test( handleObj.namespace ) ) {
5423
5424					event.handleObj = handleObj;
5425					event.data = handleObj.data;
5426
5427					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
5428						handleObj.handler ).apply( matched.elem, args );
5429
5430					if ( ret !== undefined ) {
5431						if ( ( event.result = ret ) === false ) {
5432							event.preventDefault();
5433							event.stopPropagation();
5434						}
5435					}
5436				}
5437			}
5438		}
5439
5440		// Call the postDispatch hook for the mapped type
5441		if ( special.postDispatch ) {
5442			special.postDispatch.call( this, event );
5443		}
5444
5445		return event.result;
5446	},
5447
5448	handlers: function( event, handlers ) {
5449		var i, handleObj, sel, matchedHandlers, matchedSelectors,
5450			handlerQueue = [],
5451			delegateCount = handlers.delegateCount,
5452			cur = event.target;
5453
5454		// Find delegate handlers
5455		if ( delegateCount &&
5456
vendor: 11,312 bytes, lines 5457-5865
5457			// Support: IE <=9
5458			// Black-hole SVG <use> instance trees (trac-13180)
5459			cur.nodeType &&
5460
5461			// Support: Firefox <=42
5462			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
5463			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
5464			// Support: IE 11 only
5465			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
5466			!( event.type === "click" && event.button >= 1 ) ) {
5467
5468			for ( ; cur !== this; cur = cur.parentNode || this ) {
5469
5470				// Don't check non-elements (#13208)
5471				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5472				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
5473					matchedHandlers = [];
5474					matchedSelectors = {};
5475					for ( i = 0; i < delegateCount; i++ ) {
5476						handleObj = handlers[ i ];
5477
5478						// Don't conflict with Object.prototype properties (#13203)
5479						sel = handleObj.selector + " ";
5480
5481						if ( matchedSelectors[ sel ] === undefined ) {
5482							matchedSelectors[ sel ] = handleObj.needsContext ?
5483								jQuery( sel, this ).index( cur ) > -1 :
5484								jQuery.find( sel, this, null, [ cur ] ).length;
5485						}
5486						if ( matchedSelectors[ sel ] ) {
5487							matchedHandlers.push( handleObj );
5488						}
5489					}
5490					if ( matchedHandlers.length ) {
5491						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
5492					}
5493				}
5494			}
5495		}
5496
5497		// Add the remaining (directly-bound) handlers
5498		cur = this;
5499		if ( delegateCount < handlers.length ) {
5500			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
5501		}
5502
5503		return handlerQueue;
5504	},
5505
5506	addProp: function( name, hook ) {
5507		Object.defineProperty( jQuery.Event.prototype, name, {
5508			enumerable: true,
5509			configurable: true,
5510
5511			get: isFunction( hook ) ?
5512				function() {
5513					if ( this.originalEvent ) {
5514							return hook( this.originalEvent );
5515					}
5516				} :
5517				function() {
5518					if ( this.originalEvent ) {
5519							return this.originalEvent[ name ];
5520					}
5521				},
5522
5523			set: function( value ) {
5524				Object.defineProperty( this, name, {
5525					enumerable: true,
5526					configurable: true,
5527					writable: true,
5528					value: value
5529				} );
5530			}
5531		} );
5532	},
5533
5534	fix: function( originalEvent ) {
5535		return originalEvent[ jQuery.expando ] ?
5536			originalEvent :
5537			new jQuery.Event( originalEvent );
5538	},
5539
5540	special: {
5541		load: {
5542
5543			// Prevent triggered image.load events from bubbling to window.load
5544			noBubble: true
5545		},
5546		click: {
5547
5548			// Utilize native event to ensure correct state for checkable inputs
5549			setup: function( data ) {
5550
5551				// For mutual compressibility with _default, replace `this` access with a local var.
5552				// `|| data` is dead code meant only to preserve the variable through minification.
5553				var el = this || data;
5554
5555				// Claim the first handler
5556				if ( rcheckableType.test( el.type ) &&
5557					el.click && nodeName( el, "input" ) ) {
5558
5559					// dataPriv.set( el, "click", ... )
5560					leverageNative( el, "click", returnTrue );
5561				}
5562
5563				// Return false to allow normal processing in the caller
5564				return false;
5565			},
5566			trigger: function( data ) {
5567
5568				// For mutual compressibility with _default, replace `this` access with a local var.
5569				// `|| data` is dead code meant only to preserve the variable through minification.
5570				var el = this || data;
5571
5572				// Force setup before triggering a click
5573				if ( rcheckableType.test( el.type ) &&
5574					el.click && nodeName( el, "input" ) ) {
5575
5576					leverageNative( el, "click" );
5577				}
5578
5579				// Return non-false to allow normal event-path propagation
5580				return true;
5581			},
5582
5583			// For cross-browser consistency, suppress native .click() on links
5584			// Also prevent it if we're currently inside a leveraged native-event stack
5585			_default: function( event ) {
5586				var target = event.target;
5587				return rcheckableType.test( target.type ) &&
5588					target.click && nodeName( target, "input" ) &&
5589					dataPriv.get( target, "click" ) ||
5590					nodeName( target, "a" );
5591			}
5592		},
5593
5594		beforeunload: {
5595			postDispatch: function( event ) {
5596
5597				// Support: Firefox 20+
5598				// Firefox doesn't alert if the returnValue field is not set.
5599				if ( event.result !== undefined && event.originalEvent ) {
5600					event.originalEvent.returnValue = event.result;
5601				}
5602			}
5603		}
5604	}
5605};
5606
5607// Ensure the presence of an event listener that handles manually-triggered
5608// synthetic events by interrupting progress until reinvoked in response to
5609// *native* events that it fires directly, ensuring that state changes have
5610// already occurred before other listeners are invoked.
5611function leverageNative( el, type, expectSync ) {
5612
5613	// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
5614	if ( !expectSync ) {
5615		if ( dataPriv.get( el, type ) === undefined ) {
5616			jQuery.event.add( el, type, returnTrue );
5617		}
5618		return;
5619	}
5620
5621	// Register the controller as a special universal handler for all event namespaces
5622	dataPriv.set( el, type, false );
5623	jQuery.event.add( el, type, {
5624		namespace: false,
5625		handler: function( event ) {
5626			var notAsync, result,
5627				saved = dataPriv.get( this, type );
5628
5629			if ( ( event.isTrigger & 1 ) && this[ type ] ) {
5630
5631				// Interrupt processing of the outer synthetic .trigger()ed event
5632				// Saved data should be false in such cases, but might be a leftover capture object
5633				// from an async native handler (gh-4350)
5634				if ( !saved.length ) {
5635
5636					// Store arguments for use when handling the inner native event
5637					// There will always be at least one argument (an event object), so this array
5638					// will not be confused with a leftover capture object.
5639					saved = slice.call( arguments );
5640					dataPriv.set( this, type, saved );
5641
5642					// Trigger the native event and capture its result
5643					// Support: IE <=9 - 11+
5644					// focus() and blur() are asynchronous
5645					notAsync = expectSync( this, type );
5646					this[ type ]();
5647					result = dataPriv.get( this, type );
5648					if ( saved !== result || notAsync ) {
5649						dataPriv.set( this, type, false );
5650					} else {
5651						result = {};
5652					}
5653					if ( saved !== result ) {
5654
5655						// Cancel the outer synthetic event
5656						event.stopImmediatePropagation();
5657						event.preventDefault();
5658						return result.value;
5659					}
5660
5661				// If this is an inner synthetic event for an event with a bubbling surrogate
5662				// (focus or blur), assume that the surrogate already propagated from triggering the
5663				// native event and prevent that from happening again here.
5664				// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
5665				// bubbling surrogate propagates *after* the non-bubbling base), but that seems
5666				// less bad than duplication.
5667				} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
5668					event.stopPropagation();
5669				}
5670
5671			// If this is a native event triggered above, everything is now in order
5672			// Fire an inner synthetic event with the original arguments
5673			} else if ( saved.length ) {
5674
5675				// ...and capture the result
5676				dataPriv.set( this, type, {
5677					value: jQuery.event.trigger(
5678
5679						// Support: IE <=9 - 11+
5680						// Extend with the prototype to reset the above stopImmediatePropagation()
5681						jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
5682						saved.slice( 1 ),
5683						this
5684					)
5685				} );
5686
5687				// Abort handling of the native event
5688				event.stopImmediatePropagation();
5689			}
5690		}
5691	} );
5692}
5693
5694jQuery.removeEvent = function( elem, type, handle ) {
5695
5696	// This "if" is needed for plain objects
5697	if ( elem.removeEventListener ) {
5698		elem.removeEventListener( type, handle );
5699	}
5700};
5701
5702jQuery.Event = function( src, props ) {
5703
5704	// Allow instantiation without the 'new' keyword
5705	if ( !( this instanceof jQuery.Event ) ) {
5706		return new jQuery.Event( src, props );
5707	}
5708
5709	// Event object
5710	if ( src && src.type ) {
5711		this.originalEvent = src;
5712		this.type = src.type;
5713
5714		// Events bubbling up the document may have been marked as prevented
5715		// by a handler lower down the tree; reflect the correct value.
5716		this.isDefaultPrevented = src.defaultPrevented ||
5717				src.defaultPrevented === undefined &&
5718
5719				// Support: Android <=2.3 only
5720				src.returnValue === false ?
5721			returnTrue :
5722			returnFalse;
5723
5724		// Create target properties
5725		// Support: Safari <=6 - 7 only
5726		// Target should not be a text node (#504, #13143)
5727		this.target = ( src.target && src.target.nodeType === 3 ) ?
5728			src.target.parentNode :
5729			src.target;
5730
5731		this.currentTarget = src.currentTarget;
5732		this.relatedTarget = src.relatedTarget;
5733
5734	// Event type
5735	} else {
5736		this.type = src;
5737	}
5738
5739	// Put explicitly provided properties onto the event object
5740	if ( props ) {
5741		jQuery.extend( this, props );
5742	}
5743
5744	// Create a timestamp if incoming event doesn't have one
5745	this.timeStamp = src && src.timeStamp || Date.now();
5746
5747	// Mark it as fixed
5748	this[ jQuery.expando ] = true;
5749};
5750
5751// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
5752// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5753jQuery.Event.prototype = {
5754	constructor: jQuery.Event,
5755	isDefaultPrevented: returnFalse,
5756	isPropagationStopped: returnFalse,
5757	isImmediatePropagationStopped: returnFalse,
5758	isSimulated: false,
5759
5760	preventDefault: function() {
5761		var e = this.originalEvent;
5762
5763		this.isDefaultPrevented = returnTrue;
5764
5765		if ( e && !this.isSimulated ) {
5766			e.preventDefault();
5767		}
5768	},
5769	stopPropagation: function() {
5770		var e = this.originalEvent;
5771
5772		this.isPropagationStopped = returnTrue;
5773
5774		if ( e && !this.isSimulated ) {
5775			e.stopPropagation();
5776		}
5777	},
5778	stopImmediatePropagation: function() {
5779		var e = this.originalEvent;
5780
5781		this.isImmediatePropagationStopped = returnTrue;
5782
5783		if ( e && !this.isSimulated ) {
5784			e.stopImmediatePropagation();
5785		}
5786
5787		this.stopPropagation();
5788	}
5789};
5790
5791// Includes all common event props including KeyEvent and MouseEvent specific props
5792jQuery.each( {
5793	altKey: true,
5794	bubbles: true,
5795	cancelable: true,
5796	changedTouches: true,
5797	ctrlKey: true,
5798	detail: true,
5799	eventPhase: true,
5800	metaKey: true,
5801	pageX: true,
5802	pageY: true,
5803	shiftKey: true,
5804	view: true,
5805	"char": true,
5806	code: true,
5807	charCode: true,
5808	key: true,
5809	keyCode: true,
5810	button: true,
5811	buttons: true,
5812	clientX: true,
5813	clientY: true,
5814	offsetX: true,
5815	offsetY: true,
5816	pointerId: true,
5817	pointerType: true,
5818	screenX: true,
5819	screenY: true,
5820	targetTouches: true,
5821	toElement: true,
5822	touches: true,
5823
5824	which: function( event ) {
5825		var button = event.button;
5826
5827		// Add which for key events
5828		if ( event.which == null && rkeyEvent.test( event.type ) ) {
5829			return event.charCode != null ? event.charCode : event.keyCode;
5830		}
5831
5832		// Add which for click: 1 === left; 2 === middle; 3 === right
5833		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
5834			if ( button & 1 ) {
5835				return 1;
5836			}
5837
5838			if ( button & 2 ) {
5839				return 3;
5840			}
5841
5842			if ( button & 4 ) {
5843				return 2;
5844			}
5845
5846			return 0;
5847		}
5848
5849		return event.which;
5850	}
5851}, jQuery.event.addProp );
5852
5853jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5854	jQuery.event.special[ type ] = {
5855
5856		// Utilize native event if possible so blur/focus sequence is correct
5857		setup: function() {
5858
5859			// Claim the first handler
5860			// dataPriv.set( this, "focus", ... )
5861			// dataPriv.set( this, "blur", ... )
5862			leverageNative( this, type, expectSync );
5863
5864			// Return false to allow normal processing in the caller
5865			return false;
5866		},
5867		trigger: function() {
5868
5869			// Force setup before trigger
5870			leverageNative( this, type );
5871
5872			// Return non-false to allow normal event-path propagation
vendor: 17,941 bytes, lines 5872-6543
5872
5873			return true;
5874		},
5875
5876		delegateType: delegateType
5877	};
5878} );
5879
5880// Create mouseenter/leave events using mouseover/out and event-time checks
5881// so that event delegation works in jQuery.
5882// Do the same for pointerenter/pointerleave and pointerover/pointerout
5883//
5884// Support: Safari 7 only
5885// Safari sends mouseenter too often; see:
5886// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
5887// for the description of the bug (it existed in older Chrome versions as well).
5888jQuery.each( {
5889	mouseenter: "mouseover",
5890	mouseleave: "mouseout",
5891	pointerenter: "pointerover",
5892	pointerleave: "pointerout"
5893}, function( orig, fix ) {
5894	jQuery.event.special[ orig ] = {
5895		delegateType: fix,
5896		bindType: fix,
5897
5898		handle: function( event ) {
5899			var ret,
5900				target = this,
5901				related = event.relatedTarget,
5902				handleObj = event.handleObj;
5903
5904			// For mouseenter/leave call the handler if related is outside the target.
5905			// NB: No relatedTarget if the mouse left/entered the browser window
5906			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
5907				event.type = handleObj.origType;
5908				ret = handleObj.handler.apply( this, arguments );
5909				event.type = fix;
5910			}
5911			return ret;
5912		}
5913	};
5914} );
5915
5916jQuery.fn.extend( {
5917
5918	on: function( types, selector, data, fn ) {
5919		return on( this, types, selector, data, fn );
5920	},
5921	one: function( types, selector, data, fn ) {
5922		return on( this, types, selector, data, fn, 1 );
5923	},
5924	off: function( types, selector, fn ) {
5925		var handleObj, type;
5926		if ( types && types.preventDefault && types.handleObj ) {
5927
5928			// ( event )  dispatched jQuery.Event
5929			handleObj = types.handleObj;
5930			jQuery( types.delegateTarget ).off(
5931				handleObj.namespace ?
5932					handleObj.origType + "." + handleObj.namespace :
5933					handleObj.origType,
5934				handleObj.selector,
5935				handleObj.handler
5936			);
5937			return this;
5938		}
5939		if ( typeof types === "object" ) {
5940
5941			// ( types-object [, selector] )
5942			for ( type in types ) {
5943				this.off( type, selector, types[ type ] );
5944			}
5945			return this;
5946		}
5947		if ( selector === false || typeof selector === "function" ) {
5948
5949			// ( types [, fn] )
5950			fn = selector;
5951			selector = undefined;
5952		}
5953		if ( fn === false ) {
5954			fn = returnFalse;
5955		}
5956		return this.each( function() {
5957			jQuery.event.remove( this, types, fn, selector );
5958		} );
5959	}
5960} );
5961
5962
5963var
5964
5965	// Support: IE <=10 - 11, Edge 12 - 13 only
5966	// In IE/Edge using regex groups here causes severe slowdowns.
5967	// See https://connect.microsoft.com/IE/feedback/details/1736512/
5968	rnoInnerhtml = /<script|<style|<link/i,
5969
5970	// checked="checked" or checked
5971	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5972	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
5973
5974// Prefer a tbody over its parent table for containing new rows
5975function manipulationTarget( elem, content ) {
5976	if ( nodeName( elem, "table" ) &&
5977		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
5978
5979		return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
5980	}
5981
5982	return elem;
5983}
5984
5985// Replace/restore the type attribute of script elements for safe DOM manipulation
5986function disableScript( elem ) {
5987	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
5988	return elem;
5989}
5990function restoreScript( elem ) {
5991	if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
5992		elem.type = elem.type.slice( 5 );
5993	} else {
5994		elem.removeAttribute( "type" );
5995	}
5996
5997	return elem;
5998}
5999
6000function cloneCopyEvent( src, dest ) {
6001	var i, l, type, pdataOld, udataOld, udataCur, events;
6002
6003	if ( dest.nodeType !== 1 ) {
6004		return;
6005	}
6006
6007	// 1. Copy private data: events, handlers, etc.
6008	if ( dataPriv.hasData( src ) ) {
6009		pdataOld = dataPriv.get( src );
6010		events = pdataOld.events;
6011
6012		if ( events ) {
6013			dataPriv.remove( dest, "handle events" );
6014
6015			for ( type in events ) {
6016				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
6017					jQuery.event.add( dest, type, events[ type ][ i ] );
6018				}
6019			}
6020		}
6021	}
6022
6023	// 2. Copy user data
6024	if ( dataUser.hasData( src ) ) {
6025		udataOld = dataUser.access( src );
6026		udataCur = jQuery.extend( {}, udataOld );
6027
6028		dataUser.set( dest, udataCur );
6029	}
6030}
6031
6032// Fix IE bugs, see support tests
6033function fixInput( src, dest ) {
6034	var nodeName = dest.nodeName.toLowerCase();
6035
6036	// Fails to persist the checked state of a cloned checkbox or radio button.
6037	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
6038		dest.checked = src.checked;
6039
6040	// Fails to return the selected option to the default selected state when cloning options
6041	} else if ( nodeName === "input" || nodeName === "textarea" ) {
6042		dest.defaultValue = src.defaultValue;
6043	}
6044}
6045
6046function domManip( collection, args, callback, ignored ) {
6047
6048	// Flatten any nested arrays
6049	args = flat( args );
6050
6051	var fragment, first, scripts, hasScripts, node, doc,
6052		i = 0,
6053		l = collection.length,
6054		iNoClone = l - 1,
6055		value = args[ 0 ],
6056		valueIsFunction = isFunction( value );
6057
6058	// We can't cloneNode fragments that contain checked, in WebKit
6059	if ( valueIsFunction ||
6060			( l > 1 && typeof value === "string" &&
6061				!support.checkClone && rchecked.test( value ) ) ) {
6062		return collection.each( function( index ) {
6063			var self = collection.eq( index );
6064			if ( valueIsFunction ) {
6065				args[ 0 ] = value.call( this, index, self.html() );
6066			}
6067			domManip( self, args, callback, ignored );
6068		} );
6069	}
6070
6071	if ( l ) {
6072		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
6073		first = fragment.firstChild;
6074
6075		if ( fragment.childNodes.length === 1 ) {
6076			fragment = first;
6077		}
6078
6079		// Require either new content or an interest in ignored elements to invoke the callback
6080		if ( first || ignored ) {
6081			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
6082			hasScripts = scripts.length;
6083
6084			// Use the original fragment for the last item
6085			// instead of the first because it can end up
6086			// being emptied incorrectly in certain situations (#8070).
6087			for ( ; i < l; i++ ) {
6088				node = fragment;
6089
6090				if ( i !== iNoClone ) {
6091					node = jQuery.clone( node, true, true );
6092
6093					// Keep references to cloned scripts for later restoration
6094					if ( hasScripts ) {
6095
6096						// Support: Android <=4.0 only, PhantomJS 1 only
6097						// push.apply(_, arraylike) throws on ancient WebKit
6098						jQuery.merge( scripts, getAll( node, "script" ) );
6099					}
6100				}
6101
6102				callback.call( collection[ i ], node, i );
6103			}
6104
6105			if ( hasScripts ) {
6106				doc = scripts[ scripts.length - 1 ].ownerDocument;
6107
6108				// Reenable scripts
6109				jQuery.map( scripts, restoreScript );
6110
6111				// Evaluate executable scripts on first document insertion
6112				for ( i = 0; i < hasScripts; i++ ) {
6113					node = scripts[ i ];
6114					if ( rscriptType.test( node.type || "" ) &&
6115						!dataPriv.access( node, "globalEval" ) &&
6116						jQuery.contains( doc, node ) ) {
6117
6118						if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
6119
6120							// Optional AJAX dependency, but won't run scripts if not present
6121							if ( jQuery._evalUrl && !node.noModule ) {
6122								jQuery._evalUrl( node.src, {
6123									nonce: node.nonce || node.getAttribute( "nonce" )
6124								}, doc );
6125							}
6126						} else {
6127							DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
6128						}
6129					}
6130				}
6131			}
6132		}
6133	}
6134
6135	return collection;
6136}
6137
6138function remove( elem, selector, keepData ) {
6139	var node,
6140		nodes = selector ? jQuery.filter( selector, elem ) : elem,
6141		i = 0;
6142
6143	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
6144		if ( !keepData && node.nodeType === 1 ) {
6145			jQuery.cleanData( getAll( node ) );
6146		}
6147
6148		if ( node.parentNode ) {
6149			if ( keepData && isAttached( node ) ) {
6150				setGlobalEval( getAll( node, "script" ) );
6151			}
6152			node.parentNode.removeChild( node );
6153		}
6154	}
6155
6156	return elem;
6157}
6158
6159jQuery.extend( {
6160	htmlPrefilter: function( html ) {
6161		return html;
6162	},
6163
6164	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6165		var i, l, srcElements, destElements,
6166			clone = elem.cloneNode( true ),
6167			inPage = isAttached( elem );
6168
6169		// Fix IE cloning issues
6170		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
6171				!jQuery.isXMLDoc( elem ) ) {
6172
6173			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
6174			destElements = getAll( clone );
6175			srcElements = getAll( elem );
6176
6177			for ( i = 0, l = srcElements.length; i < l; i++ ) {
6178				fixInput( srcElements[ i ], destElements[ i ] );
6179			}
6180		}
6181
6182		// Copy the events from the original to the clone
6183		if ( dataAndEvents ) {
6184			if ( deepDataAndEvents ) {
6185				srcElements = srcElements || getAll( elem );
6186				destElements = destElements || getAll( clone );
6187
6188				for ( i = 0, l = srcElements.length; i < l; i++ ) {
6189					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
6190				}
6191			} else {
6192				cloneCopyEvent( elem, clone );
6193			}
6194		}
6195
6196		// Preserve script evaluation history
6197		destElements = getAll( clone, "script" );
6198		if ( destElements.length > 0 ) {
6199			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
6200		}
6201
6202		// Return the cloned set
6203		return clone;
6204	},
6205
6206	cleanData: function( elems ) {
6207		var data, elem, type,
6208			special = jQuery.event.special,
6209			i = 0;
6210
6211		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
6212			if ( acceptData( elem ) ) {
6213				if ( ( data = elem[ dataPriv.expando ] ) ) {
6214					if ( data.events ) {
6215						for ( type in data.events ) {
6216							if ( special[ type ] ) {
6217								jQuery.event.remove( elem, type );
6218
6219							// This is a shortcut to avoid jQuery.event.remove's overhead
6220							} else {
6221								jQuery.removeEvent( elem, type, data.handle );
6222							}
6223						}
6224					}
6225
6226					// Support: Chrome <=35 - 45+
6227					// Assign undefined instead of using delete, see Data#remove
6228					elem[ dataPriv.expando ] = undefined;
6229				}
6230				if ( elem[ dataUser.expando ] ) {
6231
6232					// Support: Chrome <=35 - 45+
6233					// Assign undefined instead of using delete, see Data#remove
6234					elem[ dataUser.expando ] = undefined;
6235				}
6236			}
6237		}
6238	}
6239} );
6240
6241jQuery.fn.extend( {
6242	detach: function( selector ) {
6243		return remove( this, selector, true );
6244	},
6245
6246	remove: function( selector ) {
6247		return remove( this, selector );
6248	},
6249
6250	text: function( value ) {
6251		return access( this, function( value ) {
6252			return value === undefined ?
6253				jQuery.text( this ) :
6254				this.empty().each( function() {
6255					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6256						this.textContent = value;
6257					}
6258				} );
6259		}, null, value, arguments.length );
6260	},
6261
6262	append: function() {
6263		return domManip( this, arguments, function( elem ) {
6264			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6265				var target = manipulationTarget( this, elem );
6266				target.appendChild( elem );
6267			}
6268		} );
6269	},
6270
6271	prepend: function() {
6272		return domManip( this, arguments, function( elem ) {
6273			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6274				var target = manipulationTarget( this, elem );
6275				target.insertBefore( elem, target.firstChild );
6276			}
6277		} );
6278	},
6279
6280	before: function() {
6281		return domManip( this, arguments, function( elem ) {
6282			if ( this.parentNode ) {
6283				this.parentNode.insertBefore( elem, this );
6284			}
6285		} );
6286	},
6287
6288	after: function() {
6289		return domManip( this, arguments, function( elem ) {
6290			if ( this.parentNode ) {
6291				this.parentNode.insertBefore( elem, this.nextSibling );
6292			}
6293		} );
6294	},
6295
6296	empty: function() {
6297		var elem,
6298			i = 0;
6299
6300		for ( ; ( elem = this[ i ] ) != null; i++ ) {
6301			if ( elem.nodeType === 1 ) {
6302
6303				// Prevent memory leaks
6304				jQuery.cleanData( getAll( elem, false ) );
6305
6306				// Remove any remaining nodes
6307				elem.textContent = "";
6308			}
6309		}
6310
6311		return this;
6312	},
6313
6314	clone: function( dataAndEvents, deepDataAndEvents ) {
6315		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6316		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6317
6318		return this.map( function() {
6319			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
6320		} );
6321	},
6322
6323	html: function( value ) {
6324		return access( this, function( value ) {
6325			var elem = this[ 0 ] || {},
6326				i = 0,
6327				l = this.length;
6328
6329			if ( value === undefined && elem.nodeType === 1 ) {
6330				return elem.innerHTML;
6331			}
6332
6333			// See if we can take a shortcut and just use innerHTML
6334			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
6335				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
6336
6337				value = jQuery.htmlPrefilter( value );
6338
6339				try {
6340					for ( ; i < l; i++ ) {
6341						elem = this[ i ] || {};
6342
6343						// Remove element nodes and prevent memory leaks
6344						if ( elem.nodeType === 1 ) {
6345							jQuery.cleanData( getAll( elem, false ) );
6346							elem.innerHTML = value;
6347						}
6348					}
6349
6350					elem = 0;
6351
6352				// If using innerHTML throws an exception, use the fallback method
6353				} catch ( e ) {}
6354			}
6355
6356			if ( elem ) {
6357				this.empty().append( value );
6358			}
6359		}, null, value, arguments.length );
6360	},
6361
6362	replaceWith: function() {
6363		var ignored = [];
6364
6365		// Make the changes, replacing each non-ignored context element with the new content
6366		return domManip( this, arguments, function( elem ) {
6367			var parent = this.parentNode;
6368
6369			if ( jQuery.inArray( this, ignored ) < 0 ) {
6370				jQuery.cleanData( getAll( this ) );
6371				if ( parent ) {
6372					parent.replaceChild( elem, this );
6373				}
6374			}
6375
6376		// Force callback invocation
6377		}, ignored );
6378	}
6379} );
6380
6381jQuery.each( {
6382	appendTo: "append",
6383	prependTo: "prepend",
6384	insertBefore: "before",
6385	insertAfter: "after",
6386	replaceAll: "replaceWith"
6387}, function( name, original ) {
6388	jQuery.fn[ name ] = function( selector ) {
6389		var elems,
6390			ret = [],
6391			insert = jQuery( selector ),
6392			last = insert.length - 1,
6393			i = 0;
6394
6395		for ( ; i <= last; i++ ) {
6396			elems = i === last ? this : this.clone( true );
6397			jQuery( insert[ i ] )[ original ]( elems );
6398
6399			// Support: Android <=4.0 only, PhantomJS 1 only
6400			// .get() because push.apply(_, arraylike) throws on ancient WebKit
6401			push.apply( ret, elems.get() );
6402		}
6403
6404		return this.pushStack( ret );
6405	};
6406} );
6407var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6408
6409var getStyles = function( elem ) {
6410
6411		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
6412		// IE throws on elements created in popups
6413		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6414		var view = elem.ownerDocument.defaultView;
6415
6416		if ( !view || !view.opener ) {
6417			view = window;
6418		}
6419
6420		return view.getComputedStyle( elem );
6421	};
6422
6423var swap = function( elem, options, callback ) {
6424	var ret, name,
6425		old = {};
6426
6427	// Remember the old values, and insert the new ones
6428	for ( name in options ) {
6429		old[ name ] = elem.style[ name ];
6430		elem.style[ name ] = options[ name ];
6431	}
6432
6433	ret = callback.call( elem );
6434
6435	// Revert the old values
6436	for ( name in options ) {
6437		elem.style[ name ] = old[ name ];
6438	}
6439
6440	return ret;
6441};
6442
6443
6444var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6445
6446
6447
6448( function() {
6449
6450	// Executing both pixelPosition & boxSizingReliable tests require only one layout
6451	// so they're executed at the same time to save the second computation.
6452	function computeStyleTests() {
6453
6454		// This is a singleton, we need to execute it only once
6455		if ( !div ) {
6456			return;
6457		}
6458
6459		container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
6460			"margin-top:1px;padding:0;border:0";
6461		div.style.cssText =
6462			"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
6463			"margin:auto;border:1px;padding:1px;" +
6464			"width:60%;top:1%";
6465		documentElement.appendChild( container ).appendChild( div );
6466
6467		var divStyle = window.getComputedStyle( div );
6468		pixelPositionVal = divStyle.top !== "1%";
6469
6470		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
6471		reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
6472
6473		// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
6474		// Some styles come back with percentage values, even though they shouldn't
6475		div.style.right = "60%";
6476		pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
6477
6478		// Support: IE 9 - 11 only
6479		// Detect misreporting of content dimensions for box-sizing:border-box elements
6480		boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
6481
6482		// Support: IE 9 only
6483		// Detect overflow:scroll screwiness (gh-3699)
6484		// Support: Chrome <=64
6485		// Don't get tricked when zoom affects offsetWidth (gh-4029)
6486		div.style.position = "absolute";
6487		scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
6488
6489		documentElement.removeChild( container );
6490
6491		// Nullify the div so it wouldn't be stored in the memory and
6492		// it will also be a sign that checks already performed
6493		div = null;
6494	}
6495
6496	function roundPixelMeasures( measure ) {
6497		return Math.round( parseFloat( measure ) );
6498	}
6499
6500	var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
6501		reliableTrDimensionsVal, reliableMarginLeftVal,
6502		container = document.createElement( "div" ),
6503		div = document.createElement( "div" );
6504
6505	// Finish early in limited (non-browser) environments
6506	if ( !div.style ) {
6507		return;
6508	}
6509
6510	// Support: IE <=9 - 11 only
6511	// Style of cloned element affects source element cloned (#8908)
6512	div.style.backgroundClip = "content-box";
6513	div.cloneNode( true ).style.backgroundClip = "";
6514	support.clearCloneStyle = div.style.backgroundClip === "content-box";
6515
6516	jQuery.extend( support, {
6517		boxSizingReliable: function() {
6518			computeStyleTests();
6519			return boxSizingReliableVal;
6520		},
6521		pixelBoxStyles: function() {
6522			computeStyleTests();
6523			return pixelBoxStylesVal;
6524		},
6525		pixelPosition: function() {
6526			computeStyleTests();
6527			return pixelPositionVal;
6528		},
6529		reliableMarginLeft: function() {
6530			computeStyleTests();
6531			return reliableMarginLeftVal;
6532		},
6533		scrollboxSize: function() {
6534			computeStyleTests();
6535			return scrollboxSizeVal;
6536		},
6537
6538		// Support: IE 9 - 11+, Edge 15 - 18+
6539		// IE/Edge misreport `getComputedStyle` of table rows with width/height
6540		// set in CSS while `offset*` properties report correct values.
6541		// Behavior in IE 9 is more subtle than in newer versions & it passes
6542		// some versions of this test; make sure not to make it pass there!
6543		
6543reliableTrDimensions: function() {
6544			var table, tr, trChild, trStyle;
6545			if ( reliableTrDimensionsVal == null ) {
6546				table = document.createElement( "table" );
6547				tr = document.createElement( "tr" );
6548				trChild = document.createElement( "div" );
6549
6550				table.style.cssText = "position:absolute;left:-11111px";
6551				tr.style.height = "1px";
6552				trChild.style.height = "9px";
6553
6554				documentElement
6555					.appendChild( table )
6556					.appendChild( tr )
6557					.appendChild( trChild );
6558
6559				trStyle = window.getComputedStyle( tr );
6560				reliableTrDimensionsVal = parseInt( trStyle.height ) > 3
vendor: 13,297 bytes, lines 6560-7024
6560;
6561
6562				documentElement.removeChild( table );
6563			}
6564			return reliableTrDimensionsVal;
6565		}
6566	} );
6567} )();
6568
6569
6570function curCSS( elem, name, computed ) {
6571	var width, minWidth, maxWidth, ret,
6572
6573		// Support: Firefox 51+
6574		// Retrieving style before computed somehow
6575		// fixes an issue with getting wrong values
6576		// on detached elements
6577		style = elem.style;
6578
6579	computed = computed || getStyles( elem );
6580
6581	// getPropertyValue is needed for:
6582	//   .css('filter') (IE 9 only, #12537)
6583	//   .css('--customProperty) (#3144)
6584	if ( computed ) {
6585		ret = computed.getPropertyValue( name ) || computed[ name ];
6586
6587		if ( ret === "" && !isAttached( elem ) ) {
6588			ret = jQuery.style( elem, name );
6589		}
6590
6591		// A tribute to the "awesome hack by Dean Edwards"
6592		// Android Browser returns percentage for some values,
6593		// but width seems to be reliably pixels.
6594		// This is against the CSSOM draft spec:
6595		// https://drafts.csswg.org/cssom/#resolved-values
6596		if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
6597
6598			// Remember the original values
6599			width = style.width;
6600			minWidth = style.minWidth;
6601			maxWidth = style.maxWidth;
6602
6603			// Put in the new values to get a computed value out
6604			style.minWidth = style.maxWidth = style.width = ret;
6605			ret = computed.width;
6606
6607			// Revert the changed values
6608			style.width = width;
6609			style.minWidth = minWidth;
6610			style.maxWidth = maxWidth;
6611		}
6612	}
6613
6614	return ret !== undefined ?
6615
6616		// Support: IE <=9 - 11 only
6617		// IE returns zIndex value as an integer.
6618		ret + "" :
6619		ret;
6620}
6621
6622
6623function addGetHookIf( conditionFn, hookFn ) {
6624
6625	// Define the hook, we'll check on the first run if it's really needed.
6626	return {
6627		get: function() {
6628			if ( conditionFn() ) {
6629
6630				// Hook not needed (or it's not possible to use it due
6631				// to missing dependency), remove it.
6632				delete this.get;
6633				return;
6634			}
6635
6636			// Hook needed; redefine it so that the support test is not executed again.
6637			return ( this.get = hookFn ).apply( this, arguments );
6638		}
6639	};
6640}
6641
6642
6643var cssPrefixes = [ "Webkit", "Moz", "ms" ],
6644	emptyStyle = document.createElement( "div" ).style,
6645	vendorProps = {};
6646
6647// Return a vendor-prefixed property or undefined
6648function vendorPropName( name ) {
6649
6650	// Check for vendor prefixed names
6651	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
6652		i = cssPrefixes.length;
6653
6654	while ( i-- ) {
6655		name = cssPrefixes[ i ] + capName;
6656		if ( name in emptyStyle ) {
6657			return name;
6658		}
6659	}
6660}
6661
6662// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
6663function finalPropName( name ) {
6664	var final = jQuery.cssProps[ name ] || vendorProps[ name ];
6665
6666	if ( final ) {
6667		return final;
6668	}
6669	if ( name in emptyStyle ) {
6670		return name;
6671	}
6672	return vendorProps[ name ] = vendorPropName( name ) || name;
6673}
6674
6675
6676var
6677
6678	// Swappable if display is none or starts with table
6679	// except "table", "table-cell", or "table-caption"
6680	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6681	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6682	rcustomProp = /^--/,
6683	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6684	cssNormalTransform = {
6685		letterSpacing: "0",
6686		fontWeight: "400"
6687	};
6688
6689function setPositiveNumber( _elem, value, subtract ) {
6690
6691	// Any relative (+/-) values have already been
6692	// normalized at this point
6693	var matches = rcssNum.exec( value );
6694	return matches ?
6695
6696		// Guard against undefined "subtract", e.g., when used as in cssHooks
6697		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
6698		value;
6699}
6700
6701function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
6702	var i = dimension === "width" ? 1 : 0,
6703		extra = 0,
6704		delta = 0;
6705
6706	// Adjustment may not be necessary
6707	if ( box === ( isBorderBox ? "border" : "content" ) ) {
6708		return 0;
6709	}
6710
6711	for ( ; i < 4; i += 2 ) {
6712
6713		// Both box models exclude margin
6714		if ( box === "margin" ) {
6715			delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6716		}
6717
6718		// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
6719		if ( !isBorderBox ) {
6720
6721			// Add padding
6722			delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6723
6724			// For "border" or "margin", add border
6725			if ( box !== "padding" ) {
6726				delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6727
6728			// But still keep track of it otherwise
6729			} else {
6730				extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6731			}
6732
6733		// If we get here with a border-box (content + padding + border), we're seeking "content" or
6734		// "padding" or "margin"
6735		} else {
6736
6737			// For "content", subtract padding
6738			if ( box === "content" ) {
6739				delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6740			}
6741
6742			// For "content" or "padding", subtract border
6743			if ( box !== "margin" ) {
6744				delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6745			}
6746		}
6747	}
6748
6749	// Account for positive content-box scroll gutter when requested by providing computedVal
6750	if ( !isBorderBox && computedVal >= 0 ) {
6751
6752		// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
6753		// Assuming integer scroll gutter, subtract the rest and round down
6754		delta += Math.max( 0, Math.ceil(
6755			elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6756			computedVal -
6757			delta -
6758			extra -
6759			0.5
6760
6761		// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
6762		// Use an explicit zero to avoid NaN (gh-3964)
6763		) ) || 0;
6764	}
6765
6766	return delta;
6767}
6768
6769function getWidthOrHeight( elem, dimension, extra ) {
6770
6771	// Start with computed style
6772	var styles = getStyles( elem ),
6773
6774		// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
6775		// Fake content-box until we know it's needed to know the true value.
6776		boxSizingNeeded = !support.boxSizingReliable() || extra,
6777		isBorderBox = boxSizingNeeded &&
6778			jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6779		valueIsBorderBox = isBorderBox,
6780
6781		val = curCSS( elem, dimension, styles ),
6782		offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
6783
6784	// Support: Firefox <=54
6785	// Return a confounding non-pixel value or feign ignorance, as appropriate.
6786	if ( rnumnonpx.test( val ) ) {
6787		if ( !extra ) {
6788			return val;
6789		}
6790		val = "auto";
6791	}
6792
6793
6794	// Support: IE 9 - 11 only
6795	// Use offsetWidth/offsetHeight for when box sizing is unreliable.
6796	// In those cases, the computed value can be trusted to be border-box.
6797	if ( ( !support.boxSizingReliable() && isBorderBox ||
6798
6799		// Support: IE 10 - 11+, Edge 15 - 18+
6800		// IE/Edge misreport `getComputedStyle` of table rows with width/height
6801		// set in CSS while `offset*` properties report correct values.
6802		// Interestingly, in some cases IE 9 doesn't suffer from this issue.
6803		!support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
6804
6805		// Fall back to offsetWidth/offsetHeight when value is "auto"
6806		// This happens for inline elements with no explicit setting (gh-3571)
6807		val === "auto" ||
6808
6809		// Support: Android <=4.1 - 4.3 only
6810		// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6811		!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
6812
6813		// Make sure the element is visible & connected
6814		elem.getClientRects().length ) {
6815
6816		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6817
6818		// Where available, offsetWidth/offsetHeight approximate border box dimensions.
6819		// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
6820		// retrieved value as a content box dimension.
6821		valueIsBorderBox = offsetProp in elem;
6822		if ( valueIsBorderBox ) {
6823			val = elem[ offsetProp ];
6824		}
6825	}
6826
6827	// Normalize "" and auto
6828	val = parseFloat( val ) || 0;
6829
6830	// Adjust for the element's box model
6831	return ( val +
6832		boxModelAdjustment(
6833			elem,
6834			dimension,
6835			extra || ( isBorderBox ? "border" : "content" ),
6836			valueIsBorderBox,
6837			styles,
6838
6839			// Provide the current computed size to request scroll gutter calculation (gh-3589)
6840			val
6841		)
6842	) + "px";
6843}
6844
6845jQuery.extend( {
6846
6847	// Add in style property hooks for overriding the default
6848	// behavior of getting and setting a style property
6849	cssHooks: {
6850		opacity: {
6851			get: function( elem, computed ) {
6852				if ( computed ) {
6853
6854					// We should always get a number back from opacity
6855					var ret = curCSS( elem, "opacity" );
6856					return ret === "" ? "1" : ret;
6857				}
6858			}
6859		}
6860	},
6861
6862	// Don't automatically add "px" to these possibly-unitless properties
6863	cssNumber: {
6864		"animationIterationCount": true,
6865		"columnCount": true,
6866		"fillOpacity": true,
6867		"flexGrow": true,
6868		"flexShrink": true,
6869		"fontWeight": true,
6870		"gridArea": true,
6871		"gridColumn": true,
6872		"gridColumnEnd": true,
6873		"gridColumnStart": true,
6874		"gridRow": true,
6875		"gridRowEnd": true,
6876		"gridRowStart": true,
6877		"lineHeight": true,
6878		"opacity": true,
6879		"order": true,
6880		"orphans": true,
6881		"widows": true,
6882		"zIndex": true,
6883		"zoom": true
6884	},
6885
6886	// Add in properties whose names you wish to fix before
6887	// setting or getting the value
6888	cssProps: {},
6889
6890	// Get and set the style property on a DOM Node
6891	style: function( elem, name, value, extra ) {
6892
6893		// Don't set styles on text and comment nodes
6894		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6895			return;
6896		}
6897
6898		// Make sure that we're working with the right name
6899		var ret, type, hooks,
6900			origName = camelCase( name ),
6901			isCustomProp = rcustomProp.test( name ),
6902			style = elem.style;
6903
6904		// Make sure that we're working with the right name. We don't
6905		// want to query the value if it is a CSS custom property
6906		// since they are user-defined.
6907		if ( !isCustomProp ) {
6908			name = finalPropName( origName );
6909		}
6910
6911		// Gets hook for the prefixed version, then unprefixed version
6912		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6913
6914		// Check if we're setting a value
6915		if ( value !== undefined ) {
6916			type = typeof value;
6917
6918			// Convert "+=" or "-=" to relative numbers (#7345)
6919			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
6920				value = adjustCSS( elem, name, ret );
6921
6922				// Fixes bug #9237
6923				type = "number";
6924			}
6925
6926			// Make sure that null and NaN values aren't set (#7116)
6927			if ( value == null || value !== value ) {
6928				return;
6929			}
6930
6931			// If a number was passed in, add the unit (except for certain CSS properties)
6932			// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
6933			// "px" to a few hardcoded values.
6934			if ( type === "number" && !isCustomProp ) {
6935				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
6936			}
6937
6938			// background-* props affect original clone's values
6939			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
6940				style[ name ] = "inherit";
6941			}
6942
6943			// If a hook was provided, use that value, otherwise just set the specified value
6944			if ( !hooks || !( "set" in hooks ) ||
6945				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
6946
6947				if ( isCustomProp ) {
6948					style.setProperty( name, value );
6949				} else {
6950					style[ name ] = value;
6951				}
6952			}
6953
6954		} else {
6955
6956			// If a hook was provided get the non-computed value from there
6957			if ( hooks && "get" in hooks &&
6958				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
6959
6960				return ret;
6961			}
6962
6963			// Otherwise just get the value from the style object
6964			return style[ name ];
6965		}
6966	},
6967
6968	css: function( elem, name, extra, styles ) {
6969		var val, num, hooks,
6970			origName = camelCase( name ),
6971			isCustomProp = rcustomProp.test( name );
6972
6973		// Make sure that we're working with the right name. We don't
6974		// want to modify the value if it is a CSS custom property
6975		// since they are user-defined.
6976		if ( !isCustomProp ) {
6977			name = finalPropName( origName );
6978		}
6979
6980		// Try prefixed name followed by the unprefixed name
6981		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6982
6983		// If a hook was provided get the computed value from there
6984		if ( hooks && "get" in hooks ) {
6985			val = hooks.get( elem, true, extra );
6986		}
6987
6988		// Otherwise, if a way to get the computed value exists, use that
6989		if ( val === undefined ) {
6990			val = curCSS( elem, name, styles );
6991		}
6992
6993		// Convert "normal" to computed value
6994		if ( val === "normal" && name in cssNormalTransform ) {
6995			val = cssNormalTransform[ name ];
6996		}
6997
6998		// Make numeric if forced or a qualifier was provided and val looks numeric
6999		if ( extra === "" || extra ) {
7000			num = parseFloat( val );
7001			return extra === true || isFinite( num ) ? num || 0 : val;
7002		}
7003
7004		return val;
7005	}
7006} );
7007
7008jQuery.each( [ "height", "width" ], function( _i, dimension ) {
7009	jQuery.cssHooks[ dimension ] = {
7010		get: function( elem, computed, extra ) {
7011			if ( computed ) {
7012
7013				// Certain elements can have dimension info if we invisibly show them
7014				// but it must have a current display style that would benefit
7015				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
7016
7017					// Support: Safari 8+
7018					// Table columns in Safari have non-zero offsetWidth & zero
7019					// getBoundingClientRect().width unless display is changed.
7020					// Support: IE <=11 only
7021					// Running getBoundingClientRect on a disconnected node
7022					// in IE throws an error.
7023					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
7024					
vendor: 5,577 bytes, lines 7024-7226
7024	swap( elem, cssShow, function() {
7025							return getWidthOrHeight( elem, dimension, extra );
7026						} ) :
7027						getWidthOrHeight( elem, dimension, extra );
7028			}
7029		},
7030
7031		set: function( elem, value, extra ) {
7032			var matches,
7033				styles = getStyles( elem ),
7034
7035				// Only read styles.position if the test has a chance to fail
7036				// to avoid forcing a reflow.
7037				scrollboxSizeBuggy = !support.scrollboxSize() &&
7038					styles.position === "absolute",
7039
7040				// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
7041				boxSizingNeeded = scrollboxSizeBuggy || extra,
7042				isBorderBox = boxSizingNeeded &&
7043					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
7044				subtract = extra ?
7045					boxModelAdjustment(
7046						elem,
7047						dimension,
7048						extra,
7049						isBorderBox,
7050						styles
7051					) :
7052					0;
7053
7054			// Account for unreliable border-box dimensions by comparing offset* to computed and
7055			// faking a content-box to get border and padding (gh-3699)
7056			if ( isBorderBox && scrollboxSizeBuggy ) {
7057				subtract -= Math.ceil(
7058					elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
7059					parseFloat( styles[ dimension ] ) -
7060					boxModelAdjustment( elem, dimension, "border", false, styles ) -
7061					0.5
7062				);
7063			}
7064
7065			// Convert to pixels if value adjustment is needed
7066			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
7067				( matches[ 3 ] || "px" ) !== "px" ) {
7068
7069				elem.style[ dimension ] = value;
7070				value = jQuery.css( elem, dimension );
7071			}
7072
7073			return setPositiveNumber( elem, value, subtract );
7074		}
7075	};
7076} );
7077
7078jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
7079	function( elem, computed ) {
7080		if ( computed ) {
7081			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
7082				elem.getBoundingClientRect().left -
7083					swap( elem, { marginLeft: 0 }, function() {
7084						return elem.getBoundingClientRect().left;
7085					} )
7086				) + "px";
7087		}
7088	}
7089);
7090
7091// These hooks are used by animate to expand properties
7092jQuery.each( {
7093	margin: "",
7094	padding: "",
7095	border: "Width"
7096}, function( prefix, suffix ) {
7097	jQuery.cssHooks[ prefix + suffix ] = {
7098		expand: function( value ) {
7099			var i = 0,
7100				expanded = {},
7101
7102				// Assumes a single number if not a string
7103				parts = typeof value === "string" ? value.split( " " ) : [ value ];
7104
7105			for ( ; i < 4; i++ ) {
7106				expanded[ prefix + cssExpand[ i ] + suffix ] =
7107					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
7108			}
7109
7110			return expanded;
7111		}
7112	};
7113
7114	if ( prefix !== "margin" ) {
7115		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
7116	}
7117} );
7118
7119jQuery.fn.extend( {
7120	css: function( name, value ) {
7121		return access( this, function( elem, name, value ) {
7122			var styles, len,
7123				map = {},
7124				i = 0;
7125
7126			if ( Array.isArray( name ) ) {
7127				styles = getStyles( elem );
7128				len = name.length;
7129
7130				for ( ; i < len; i++ ) {
7131					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
7132				}
7133
7134				return map;
7135			}
7136
7137			return value !== undefined ?
7138				jQuery.style( elem, name, value ) :
7139				jQuery.css( elem, name );
7140		}, name, value, arguments.length > 1 );
7141	}
7142} );
7143
7144
7145function Tween( elem, options, prop, end, easing ) {
7146	return new Tween.prototype.init( elem, options, prop, end, easing );
7147}
7148jQuery.Tween = Tween;
7149
7150Tween.prototype = {
7151	constructor: Tween,
7152	init: function( elem, options, prop, end, easing, unit ) {
7153		this.elem = elem;
7154		this.prop = prop;
7155		this.easing = easing || jQuery.easing._default;
7156		this.options = options;
7157		this.start = this.now = this.cur();
7158		this.end = end;
7159		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
7160	},
7161	cur: function() {
7162		var hooks = Tween.propHooks[ this.prop ];
7163
7164		return hooks && hooks.get ?
7165			hooks.get( this ) :
7166			Tween.propHooks._default.get( this );
7167	},
7168	run: function( percent ) {
7169		var eased,
7170			hooks = Tween.propHooks[ this.prop ];
7171
7172		if ( this.options.duration ) {
7173			this.pos = eased = jQuery.easing[ this.easing ](
7174				percent, this.options.duration * percent, 0, 1, this.options.duration
7175			);
7176		} else {
7177			this.pos = eased = percent;
7178		}
7179		this.now = ( this.end - this.start ) * eased + this.start;
7180
7181		if ( this.options.step ) {
7182			this.options.step.call( this.elem, this.now, this );
7183		}
7184
7185		if ( hooks && hooks.set ) {
7186			hooks.set( this );
7187		} else {
7188			Tween.propHooks._default.set( this );
7189		}
7190		return this;
7191	}
7192};
7193
7194Tween.prototype.init.prototype = Tween.prototype;
7195
7196Tween.propHooks = {
7197	_default: {
7198		get: function( tween ) {
7199			var result;
7200
7201			// Use a property on the element directly when it is not a DOM element,
7202			// or when there is no matching style property that exists.
7203			if ( tween.elem.nodeType !== 1 ||
7204				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
7205				return tween.elem[ tween.prop ];
7206			}
7207
7208			// Passing an empty string as a 3rd parameter to .css will automatically
7209			// attempt a parseFloat and fallback to a string if the parse fails.
7210			// Simple values such as "10px" are parsed to Float;
7211			// complex values such as "rotate(1rad)" are returned as-is.
7212			result = jQuery.css( tween.elem, tween.prop, "" );
7213
7214			// Empty strings, null, undefined and "auto" are converted to 0.
7215			return !result || result === "auto" ? 0 : result;
7216		},
7217		set: function( tween ) {
7218
7219			// Use step hook for back compat.
7220			// Use cssHook if its there.
7221			// Use .style if available and use plain properties where available.
7222			if ( jQuery.fx.step[ tween.prop ] ) {
7223				jQuery.fx.step[ tween.prop ]( tween );
7224			} else if ( tween.elem.nodeType === 1 && (
7225					jQuery.cssHooks[ tween.prop ] ||
7226					tween.elem.style[ finalPropName( tween.prop ) ] != null
vendor: 14,002 bytes, lines 7226-7781
7226 ) ) {
7227				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
7228			} else {
7229				tween.elem[ tween.prop ] = tween.now;
7230			}
7231		}
7232	}
7233};
7234
7235// Support: IE <=9 only
7236// Panic based approach to setting things on disconnected nodes
7237Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
7238	set: function( tween ) {
7239		if ( tween.elem.nodeType && tween.elem.parentNode ) {
7240			tween.elem[ tween.prop ] = tween.now;
7241		}
7242	}
7243};
7244
7245jQuery.easing = {
7246	linear: function( p ) {
7247		return p;
7248	},
7249	swing: function( p ) {
7250		return 0.5 - Math.cos( p * Math.PI ) / 2;
7251	},
7252	_default: "swing"
7253};
7254
7255jQuery.fx = Tween.prototype.init;
7256
7257// Back compat <1.8 extension point
7258jQuery.fx.step = {};
7259
7260
7261
7262
7263var
7264	fxNow, inProgress,
7265	rfxtypes = /^(?:toggle|show|hide)$/,
7266	rrun = /queueHooks$/;
7267
7268function schedule() {
7269	if ( inProgress ) {
7270		if ( document.hidden === false && window.requestAnimationFrame ) {
7271			window.requestAnimationFrame( schedule );
7272		} else {
7273			window.setTimeout( schedule, jQuery.fx.interval );
7274		}
7275
7276		jQuery.fx.tick();
7277	}
7278}
7279
7280// Animations created synchronously will run synchronously
7281function createFxNow() {
7282	window.setTimeout( function() {
7283		fxNow = undefined;
7284	} );
7285	return ( fxNow = Date.now() );
7286}
7287
7288// Generate parameters to create a standard animation
7289function genFx( type, includeWidth ) {
7290	var which,
7291		i = 0,
7292		attrs = { height: type };
7293
7294	// If we include width, step value is 1 to do all cssExpand values,
7295	// otherwise step value is 2 to skip over Left and Right
7296	includeWidth = includeWidth ? 1 : 0;
7297	for ( ; i < 4; i += 2 - includeWidth ) {
7298		which = cssExpand[ i ];
7299		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
7300	}
7301
7302	if ( includeWidth ) {
7303		attrs.opacity = attrs.width = type;
7304	}
7305
7306	return attrs;
7307}
7308
7309function createTween( value, prop, animation ) {
7310	var tween,
7311		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
7312		index = 0,
7313		length = collection.length;
7314	for ( ; index < length; index++ ) {
7315		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
7316
7317			// We're done with this property
7318			return tween;
7319		}
7320	}
7321}
7322
7323function defaultPrefilter( elem, props, opts ) {
7324	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
7325		isBox = "width" in props || "height" in props,
7326		anim = this,
7327		orig = {},
7328		style = elem.style,
7329		hidden = elem.nodeType && isHiddenWithinTree( elem ),
7330		dataShow = dataPriv.get( elem, "fxshow" );
7331
7332	// Queue-skipping animations hijack the fx hooks
7333	if ( !opts.queue ) {
7334		hooks = jQuery._queueHooks( elem, "fx" );
7335		if ( hooks.unqueued == null ) {
7336			hooks.unqueued = 0;
7337			oldfire = hooks.empty.fire;
7338			hooks.empty.fire = function() {
7339				if ( !hooks.unqueued ) {
7340					oldfire();
7341				}
7342			};
7343		}
7344		hooks.unqueued++;
7345
7346		anim.always( function() {
7347
7348			// Ensure the complete handler is called before this completes
7349			anim.always( function() {
7350				hooks.unqueued--;
7351				if ( !jQuery.queue( elem, "fx" ).length ) {
7352					hooks.empty.fire();
7353				}
7354			} );
7355		} );
7356	}
7357
7358	// Detect show/hide animations
7359	for ( prop in props ) {
7360		value = props[ prop ];
7361		if ( rfxtypes.test( value ) ) {
7362			delete props[ prop ];
7363			toggle = toggle || value === "toggle";
7364			if ( value === ( hidden ? "hide" : "show" ) ) {
7365
7366				// Pretend to be hidden if this is a "show" and
7367				// there is still data from a stopped show/hide
7368				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
7369					hidden = true;
7370
7371				// Ignore all other no-op show/hide data
7372				} else {
7373					continue;
7374				}
7375			}
7376			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
7377		}
7378	}
7379
7380	// Bail out if this is a no-op like .hide().hide()
7381	propTween = !jQuery.isEmptyObject( props );
7382	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
7383		return;
7384	}
7385
7386	// Restrict "overflow" and "display" styles during box animations
7387	if ( isBox && elem.nodeType === 1 ) {
7388
7389		// Support: IE <=9 - 11, Edge 12 - 15
7390		// Record all 3 overflow attributes because IE does not infer the shorthand
7391		// from identically-valued overflowX and overflowY and Edge just mirrors
7392		// the overflowX value there.
7393		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
7394
7395		// Identify a display type, preferring old show/hide data over the CSS cascade
7396		restoreDisplay = dataShow && dataShow.display;
7397		if ( restoreDisplay == null ) {
7398			restoreDisplay = dataPriv.get( elem, "display" );
7399		}
7400		display = jQuery.css( elem, "display" );
7401		if ( display === "none" ) {
7402			if ( restoreDisplay ) {
7403				display = restoreDisplay;
7404			} else {
7405
7406				// Get nonempty value(s) by temporarily forcing visibility
7407				showHide( [ elem ], true );
7408				restoreDisplay = elem.style.display || restoreDisplay;
7409				display = jQuery.css( elem, "display" );
7410				showHide( [ elem ] );
7411			}
7412		}
7413
7414		// Animate inline elements as inline-block
7415		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
7416			if ( jQuery.css( elem, "float" ) === "none" ) {
7417
7418				// Restore the original display value at the end of pure show/hide animations
7419				if ( !propTween ) {
7420					anim.done( function() {
7421						style.display = restoreDisplay;
7422					} );
7423					if ( restoreDisplay == null ) {
7424						display = style.display;
7425						restoreDisplay = display === "none" ? "" : display;
7426					}
7427				}
7428				style.display = "inline-block";
7429			}
7430		}
7431	}
7432
7433	if ( opts.overflow ) {
7434		style.overflow = "hidden";
7435		anim.always( function() {
7436			style.overflow = opts.overflow[ 0 ];
7437			style.overflowX = opts.overflow[ 1 ];
7438			style.overflowY = opts.overflow[ 2 ];
7439		} );
7440	}
7441
7442	// Implement show/hide animations
7443	propTween = false;
7444	for ( prop in orig ) {
7445
7446		// General show/hide setup for this element animation
7447		if ( !propTween ) {
7448			if ( dataShow ) {
7449				if ( "hidden" in dataShow ) {
7450					hidden = dataShow.hidden;
7451				}
7452			} else {
7453				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
7454			}
7455
7456			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
7457			if ( toggle ) {
7458				dataShow.hidden = !hidden;
7459			}
7460
7461			// Show elements before animating them
7462			if ( hidden ) {
7463				showHide( [ elem ], true );
7464			}
7465
7466			/* eslint-disable no-loop-func */
7467
7468			anim.done( function() {
7469
7470			/* eslint-enable no-loop-func */
7471
7472				// The final step of a "hide" animation is actually hiding the element
7473				if ( !hidden ) {
7474					showHide( [ elem ] );
7475				}
7476				dataPriv.remove( elem, "fxshow" );
7477				for ( prop in orig ) {
7478					jQuery.style( elem, prop, orig[ prop ] );
7479				}
7480			} );
7481		}
7482
7483		// Per-property setup
7484		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
7485		if ( !( prop in dataShow ) ) {
7486			dataShow[ prop ] = propTween.start;
7487			if ( hidden ) {
7488				propTween.end = propTween.start;
7489				propTween.start = 0;
7490			}
7491		}
7492	}
7493}
7494
7495function propFilter( props, specialEasing ) {
7496	var index, name, easing, value, hooks;
7497
7498	// camelCase, specialEasing and expand cssHook pass
7499	for ( index in props ) {
7500		name = camelCase( index );
7501		easing = specialEasing[ name ];
7502		value = props[ index ];
7503		if ( Array.isArray( value ) ) {
7504			easing = value[ 1 ];
7505			value = props[ index ] = value[ 0 ];
7506		}
7507
7508		if ( index !== name ) {
7509			props[ name ] = value;
7510			delete props[ index ];
7511		}
7512
7513		hooks = jQuery.cssHooks[ name ];
7514		if ( hooks && "expand" in hooks ) {
7515			value = hooks.expand( value );
7516			delete props[ name ];
7517
7518			// Not quite $.extend, this won't overwrite existing keys.
7519			// Reusing 'index' because we have the correct "name"
7520			for ( index in value ) {
7521				if ( !( index in props ) ) {
7522					props[ index ] = value[ index ];
7523					specialEasing[ index ] = easing;
7524				}
7525			}
7526		} else {
7527			specialEasing[ name ] = easing;
7528		}
7529	}
7530}
7531
7532function Animation( elem, properties, options ) {
7533	var result,
7534		stopped,
7535		index = 0,
7536		length = Animation.prefilters.length,
7537		deferred = jQuery.Deferred().always( function() {
7538
7539			// Don't match elem in the :animated selector
7540			delete tick.elem;
7541		} ),
7542		tick = function() {
7543			if ( stopped ) {
7544				return false;
7545			}
7546			var currentTime = fxNow || createFxNow(),
7547				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7548
7549				// Support: Android 2.3 only
7550				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
7551				temp = remaining / animation.duration || 0,
7552				percent = 1 - temp,
7553				index = 0,
7554				length = animation.tweens.length;
7555
7556			for ( ; index < length; index++ ) {
7557				animation.tweens[ index ].run( percent );
7558			}
7559
7560			deferred.notifyWith( elem, [ animation, percent, remaining ] );
7561
7562			// If there's more to do, yield
7563			if ( percent < 1 && length ) {
7564				return remaining;
7565			}
7566
7567			// If this was an empty animation, synthesize a final progress notification
7568			if ( !length ) {
7569				deferred.notifyWith( elem, [ animation, 1, 0 ] );
7570			}
7571
7572			// Resolve the animation and report its conclusion
7573			deferred.resolveWith( elem, [ animation ] );
7574			return false;
7575		},
7576		animation = deferred.promise( {
7577			elem: elem,
7578			props: jQuery.extend( {}, properties ),
7579			opts: jQuery.extend( true, {
7580				specialEasing: {},
7581				easing: jQuery.easing._default
7582			}, options ),
7583			originalProperties: properties,
7584			originalOptions: options,
7585			startTime: fxNow || createFxNow(),
7586			duration: options.duration,
7587			tweens: [],
7588			createTween: function( prop, end ) {
7589				var tween = jQuery.Tween( elem, animation.opts, prop, end,
7590						animation.opts.specialEasing[ prop ] || animation.opts.easing );
7591				animation.tweens.push( tween );
7592				return tween;
7593			},
7594			stop: function( gotoEnd ) {
7595				var index = 0,
7596
7597					// If we are going to the end, we want to run all the tweens
7598					// otherwise we skip this part
7599					length = gotoEnd ? animation.tweens.length : 0;
7600				if ( stopped ) {
7601					return this;
7602				}
7603				stopped = true;
7604				for ( ; index < length; index++ ) {
7605					animation.tweens[ index ].run( 1 );
7606				}
7607
7608				// Resolve when we played the last frame; otherwise, reject
7609				if ( gotoEnd ) {
7610					deferred.notifyWith( elem, [ animation, 1, 0 ] );
7611					deferred.resolveWith( elem, [ animation, gotoEnd ] );
7612				} else {
7613					deferred.rejectWith( elem, [ animation, gotoEnd ] );
7614				}
7615				return this;
7616			}
7617		} ),
7618		props = animation.props;
7619
7620	propFilter( props, animation.opts.specialEasing );
7621
7622	for ( ; index < length; index++ ) {
7623		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
7624		if ( result ) {
7625			if ( isFunction( result.stop ) ) {
7626				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
7627					result.stop.bind( result );
7628			}
7629			return result;
7630		}
7631	}
7632
7633	jQuery.map( props, createTween, animation );
7634
7635	if ( isFunction( animation.opts.start ) ) {
7636		animation.opts.start.call( elem, animation );
7637	}
7638
7639	// Attach callbacks from options
7640	animation
7641		.progress( animation.opts.progress )
7642		.done( animation.opts.done, animation.opts.complete )
7643		.fail( animation.opts.fail )
7644		.always( animation.opts.always );
7645
7646	jQuery.fx.timer(
7647		jQuery.extend( tick, {
7648			elem: elem,
7649			anim: animation,
7650			queue: animation.opts.queue
7651		} )
7652	);
7653
7654	return animation;
7655}
7656
7657jQuery.Animation = jQuery.extend( Animation, {
7658
7659	tweeners: {
7660		"*": [ function( prop, value ) {
7661			var tween = this.createTween( prop, value );
7662			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
7663			return tween;
7664		} ]
7665	},
7666
7667	tweener: function( props, callback ) {
7668		if ( isFunction( props ) ) {
7669			callback = props;
7670			props = [ "*" ];
7671		} else {
7672			props = props.match( rnothtmlwhite );
7673		}
7674
7675		var prop,
7676			index = 0,
7677			length = props.length;
7678
7679		for ( ; index < length; index++ ) {
7680			prop = props[ index ];
7681			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
7682			Animation.tweeners[ prop ].unshift( callback );
7683		}
7684	},
7685
7686	prefilters: [ defaultPrefilter ],
7687
7688	prefilter: function( callback, prepend ) {
7689		if ( prepend ) {
7690			Animation.prefilters.unshift( callback );
7691		} else {
7692			Animation.prefilters.push( callback );
7693		}
7694	}
7695} );
7696
7697jQuery.speed = function( speed, easing, fn ) {
7698	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7699		complete: fn || !fn && easing ||
7700			isFunction( speed ) && speed,
7701		duration: speed,
7702		easing: fn && easing || easing && !isFunction( easing ) && easing
7703	};
7704
7705	// Go to the end state if fx are off
7706	if ( jQuery.fx.off ) {
7707		opt.duration = 0;
7708
7709	} else {
7710		if ( typeof opt.duration !== "number" ) {
7711			if ( opt.duration in jQuery.fx.speeds ) {
7712				opt.duration = jQuery.fx.speeds[ opt.duration ];
7713
7714			} else {
7715				opt.duration = jQuery.fx.speeds._default;
7716			}
7717		}
7718	}
7719
7720	// Normalize opt.queue - true/undefined/null -> "fx"
7721	if ( opt.queue == null || opt.queue === true ) {
7722		opt.queue = "fx";
7723	}
7724
7725	// Queueing
7726	opt.old = opt.complete;
7727
7728	opt.complete = function() {
7729		if ( isFunction( opt.old ) ) {
7730			opt.old.call( this );
7731		}
7732
7733		if ( opt.queue ) {
7734			jQuery.dequeue( this, opt.queue );
7735		}
7736	};
7737
7738	return opt;
7739};
7740
7741jQuery.fn.extend( {
7742	fadeTo: function( speed, to, easing, callback ) {
7743
7744		// Show any hidden elements after setting opacity to 0
7745		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
7746
7747			// Animate to the value specified
7748			.end().animate( { opacity: to }, speed, easing, callback );
7749	},
7750	animate: function( prop, speed, easing, callback ) {
7751		var empty = jQuery.isEmptyObject( prop ),
7752			optall = jQuery.speed( speed, easing, callback ),
7753			doAnimation = function() {
7754
7755				// Operate on a copy of prop so per-property easing won't be lost
7756				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
7757
7758				// Empty animations, or finishing resolves immediately
7759				if ( empty || dataPriv.get( this, "finish" ) ) {
7760					anim.stop( true );
7761				}
7762			};
7763			doAnimation.finish = doAnimation;
7764
7765		return empty || optall.queue === false ?
7766			this.each( doAnimation ) :
7767			this.queue( optall.queue, doAnimation );
7768	},
7769	stop: function( type, clearQueue, gotoEnd ) {
7770		var stopQueue = function( hooks ) {
7771			var stop = hooks.stop;
7772			delete hooks.stop;
7773			stop( gotoEnd );
7774		};
7775
7776		if ( typeof type !== "string" ) {
7777			gotoEnd = clearQueue;
7778			clearQueue = type;
7779			type = undefined;
7780		}
7781		if ( clearQueue 
vendor: 3,719 bytes, lines 7781-7939
7781) {
7782			this.queue( type || "fx", [] );
7783		}
7784
7785		return this.each( function() {
7786			var dequeue = true,
7787				index = type != null && type + "queueHooks",
7788				timers = jQuery.timers,
7789				data = dataPriv.get( this );
7790
7791			if ( index ) {
7792				if ( data[ index ] && data[ index ].stop ) {
7793					stopQueue( data[ index ] );
7794				}
7795			} else {
7796				for ( index in data ) {
7797					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
7798						stopQueue( data[ index ] );
7799					}
7800				}
7801			}
7802
7803			for ( index = timers.length; index--; ) {
7804				if ( timers[ index ].elem === this &&
7805					( type == null || timers[ index ].queue === type ) ) {
7806
7807					timers[ index ].anim.stop( gotoEnd );
7808					dequeue = false;
7809					timers.splice( index, 1 );
7810				}
7811			}
7812
7813			// Start the next in the queue if the last step wasn't forced.
7814			// Timers currently will call their complete callbacks, which
7815			// will dequeue but only if they were gotoEnd.
7816			if ( dequeue || !gotoEnd ) {
7817				jQuery.dequeue( this, type );
7818			}
7819		} );
7820	},
7821	finish: function( type ) {
7822		if ( type !== false ) {
7823			type = type || "fx";
7824		}
7825		return this.each( function() {
7826			var index,
7827				data = dataPriv.get( this ),
7828				queue = data[ type + "queue" ],
7829				hooks = data[ type + "queueHooks" ],
7830				timers = jQuery.timers,
7831				length = queue ? queue.length : 0;
7832
7833			// Enable finishing flag on private data
7834			data.finish = true;
7835
7836			// Empty the queue first
7837			jQuery.queue( this, type, [] );
7838
7839			if ( hooks && hooks.stop ) {
7840				hooks.stop.call( this, true );
7841			}
7842
7843			// Look for any active animations, and finish them
7844			for ( index = timers.length; index--; ) {
7845				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
7846					timers[ index ].anim.stop( true );
7847					timers.splice( index, 1 );
7848				}
7849			}
7850
7851			// Look for any animations in the old queue and finish them
7852			for ( index = 0; index < length; index++ ) {
7853				if ( queue[ index ] && queue[ index ].finish ) {
7854					queue[ index ].finish.call( this );
7855				}
7856			}
7857
7858			// Turn off finishing flag
7859			delete data.finish;
7860		} );
7861	}
7862} );
7863
7864jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
7865	var cssFn = jQuery.fn[ name ];
7866	jQuery.fn[ name ] = function( speed, easing, callback ) {
7867		return speed == null || typeof speed === "boolean" ?
7868			cssFn.apply( this, arguments ) :
7869			this.animate( genFx( name, true ), speed, easing, callback );
7870	};
7871} );
7872
7873// Generate shortcuts for custom animations
7874jQuery.each( {
7875	slideDown: genFx( "show" ),
7876	slideUp: genFx( "hide" ),
7877	slideToggle: genFx( "toggle" ),
7878	fadeIn: { opacity: "show" },
7879	fadeOut: { opacity: "hide" },
7880	fadeToggle: { opacity: "toggle" }
7881}, function( name, props ) {
7882	jQuery.fn[ name ] = function( speed, easing, callback ) {
7883		return this.animate( props, speed, easing, callback );
7884	};
7885} );
7886
7887jQuery.timers = [];
7888jQuery.fx.tick = function() {
7889	var timer,
7890		i = 0,
7891		timers = jQuery.timers;
7892
7893	fxNow = Date.now();
7894
7895	for ( ; i < timers.length; i++ ) {
7896		timer = timers[ i ];
7897
7898		// Run the timer and safely remove it when done (allowing for external removal)
7899		if ( !timer() && timers[ i ] === timer ) {
7900			timers.splice( i--, 1 );
7901		}
7902	}
7903
7904	if ( !timers.length ) {
7905		jQuery.fx.stop();
7906	}
7907	fxNow = undefined;
7908};
7909
7910jQuery.fx.timer = function( timer ) {
7911	jQuery.timers.push( timer );
7912	jQuery.fx.start();
7913};
7914
7915jQuery.fx.interval = 13;
7916jQuery.fx.start = function() {
7917	if ( inProgress ) {
7918		return;
7919	}
7920
7921	inProgress = true;
7922	schedule();
7923};
7924
7925jQuery.fx.stop = function() {
7926	inProgress = null;
7927};
7928
7929jQuery.fx.speeds = {
7930	slow: 600,
7931	fast: 200,
7932
7933	// Default speed
7934	_default: 400
7935};
7936
7937
7938// Based off of the plugin by Clint Helfers, with permission.
7939// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
vendor: 5,177 bytes, lines 7940-8160
7940jQuery.fn.delay = function( time, type ) {
7941	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7942	type = type || "fx";
7943
7944	return this.queue( type, function( next, hooks ) {
7945		var timeout = window.setTimeout( next, time );
7946		hooks.stop = function() {
7947			window.clearTimeout( timeout );
7948		};
7949	} );
7950};
7951
7952
7953( function() {
7954	var input = document.createElement( "input" ),
7955		select = document.createElement( "select" ),
7956		opt = select.appendChild( document.createElement( "option" ) );
7957
7958	input.type = "checkbox";
7959
7960	// Support: Android <=4.3 only
7961	// Default value for a checkbox should be "on"
7962	support.checkOn = input.value !== "";
7963
7964	// Support: IE <=11 only
7965	// Must access selectedIndex to make default options select
7966	support.optSelected = opt.selected;
7967
7968	// Support: IE <=11 only
7969	// An input loses its value after becoming a radio
7970	input = document.createElement( "input" );
7971	input.value = "t";
7972	input.type = "radio";
7973	support.radioValue = input.value === "t";
7974} )();
7975
7976
7977var boolHook,
7978	attrHandle = jQuery.expr.attrHandle;
7979
7980jQuery.fn.extend( {
7981	attr: function( name, value ) {
7982		return access( this, jQuery.attr, name, value, arguments.length > 1 );
7983	},
7984
7985	removeAttr: function( name ) {
7986		return this.each( function() {
7987			jQuery.removeAttr( this, name );
7988		} );
7989	}
7990} );
7991
7992jQuery.extend( {
7993	attr: function( elem, name, value ) {
7994		var ret, hooks,
7995			nType = elem.nodeType;
7996
7997		// Don't get/set attributes on text, comment and attribute nodes
7998		if ( nType === 3 || nType === 8 || nType === 2 ) {
7999			return;
8000		}
8001
8002		// Fallback to prop when attributes are not supported
8003		if ( typeof elem.getAttribute === "undefined" ) {
8004			return jQuery.prop( elem, name, value );
8005		}
8006
8007		// Attribute hooks are determined by the lowercase version
8008		// Grab necessary hook if one is defined
8009		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
8010			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
8011				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
8012		}
8013
8014		if ( value !== undefined ) {
8015			if ( value === null ) {
8016				jQuery.removeAttr( elem, name );
8017				return;
8018			}
8019
8020			if ( hooks && "set" in hooks &&
8021				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
8022				return ret;
8023			}
8024
8025			elem.setAttribute( name, value + "" );
8026			return value;
8027		}
8028
8029		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
8030			return ret;
8031		}
8032
8033		ret = jQuery.find.attr( elem, name );
8034
8035		// Non-existent attributes return null, we normalize to undefined
8036		return ret == null ? undefined : ret;
8037	},
8038
8039	attrHooks: {
8040		type: {
8041			set: function( elem, value ) {
8042				if ( !support.radioValue && value === "radio" &&
8043					nodeName( elem, "input" ) ) {
8044					var val = elem.value;
8045					elem.setAttribute( "type", value );
8046					if ( val ) {
8047						elem.value = val;
8048					}
8049					return value;
8050				}
8051			}
8052		}
8053	},
8054
8055	removeAttr: function( elem, value ) {
8056		var name,
8057			i = 0,
8058
8059			// Attribute names can contain non-HTML whitespace characters
8060			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
8061			attrNames = value && value.match( rnothtmlwhite );
8062
8063		if ( attrNames && elem.nodeType === 1 ) {
8064			while ( ( name = attrNames[ i++ ] ) ) {
8065				elem.removeAttribute( name );
8066			}
8067		}
8068	}
8069} );
8070
8071// Hooks for boolean attributes
8072boolHook = {
8073	set: function( elem, value, name ) {
8074		if ( value === false ) {
8075
8076			// Remove boolean attributes when set to false
8077			jQuery.removeAttr( elem, name );
8078		} else {
8079			elem.setAttribute( name, name );
8080		}
8081		return name;
8082	}
8083};
8084
8085jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
8086	var getter = attrHandle[ name ] || jQuery.find.attr;
8087
8088	attrHandle[ name ] = function( elem, name, isXML ) {
8089		var ret, handle,
8090			lowercaseName = name.toLowerCase();
8091
8092		if ( !isXML ) {
8093
8094			// Avoid an infinite loop by temporarily removing this function from the getter
8095			handle = attrHandle[ lowercaseName ];
8096			attrHandle[ lowercaseName ] = ret;
8097			ret = getter( elem, name, isXML ) != null ?
8098				lowercaseName :
8099				null;
8100			attrHandle[ lowercaseName ] = handle;
8101		}
8102		return ret;
8103	};
8104} );
8105
8106
8107
8108
8109var rfocusable = /^(?:input|select|textarea|button)$/i,
8110	rclickable = /^(?:a|area)$/i;
8111
8112jQuery.fn.extend( {
8113	prop: function( name, value ) {
8114		return access( this, jQuery.prop, name, value, arguments.length > 1 );
8115	},
8116
8117	removeProp: function( name ) {
8118		return this.each( function() {
8119			delete this[ jQuery.propFix[ name ] || name ];
8120		} );
8121	}
8122} );
8123
8124jQuery.extend( {
8125	prop: function( elem, name, value ) {
8126		var ret, hooks,
8127			nType = elem.nodeType;
8128
8129		// Don't get/set properties on text, comment and attribute nodes
8130		if ( nType === 3 || nType === 8 || nType === 2 ) {
8131			return;
8132		}
8133
8134		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
8135
8136			// Fix name and attach hooks
8137			name = jQuery.propFix[ name ] || name;
8138			hooks = jQuery.propHooks[ name ];
8139		}
8140
8141		if ( value !== undefined ) {
8142			if ( hooks && "set" in hooks &&
8143				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
8144				return ret;
8145			}
8146
8147			return ( elem[ name ] = value );
8148		}
8149
8150		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
8151			return ret;
8152		}
8153
8154		return elem[ name ];
8155	},
8156
8157	propHooks: {
8158		tabIndex: {
8159			get: function( elem ) {
8160
vendor: 6,193 bytes, lines 8161-8423
8161				// Support: IE <=9 - 11 only
8162				// elem.tabIndex doesn't always return the
8163				// correct value when it hasn't been explicitly set
8164				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
8165				// Use proper attribute retrieval(#12072)
8166				var tabindex = jQuery.find.attr( elem, "tabindex" );
8167
8168				if ( tabindex ) {
8169					return parseInt( tabindex, 10 );
8170				}
8171
8172				if (
8173					rfocusable.test( elem.nodeName ) ||
8174					rclickable.test( elem.nodeName ) &&
8175					elem.href
8176				) {
8177					return 0;
8178				}
8179
8180				return -1;
8181			}
8182		}
8183	},
8184
8185	propFix: {
8186		"for": "htmlFor",
8187		"class": "className"
8188	}
8189} );
8190
8191// Support: IE <=11 only
8192// Accessing the selectedIndex property
8193// forces the browser to respect setting selected
8194// on the option
8195// The getter ensures a default option is selected
8196// when in an optgroup
8197// eslint rule "no-unused-expressions" is disabled for this code
8198// since it considers such accessions noop
8199if ( !support.optSelected ) {
8200	jQuery.propHooks.selected = {
8201		get: function( elem ) {
8202
8203			/* eslint no-unused-expressions: "off" */
8204
8205			var parent = elem.parentNode;
8206			if ( parent && parent.parentNode ) {
8207				parent.parentNode.selectedIndex;
8208			}
8209			return null;
8210		},
8211		set: function( elem ) {
8212
8213			/* eslint no-unused-expressions: "off" */
8214
8215			var parent = elem.parentNode;
8216			if ( parent ) {
8217				parent.selectedIndex;
8218
8219				if ( parent.parentNode ) {
8220					parent.parentNode.selectedIndex;
8221				}
8222			}
8223		}
8224	};
8225}
8226
8227jQuery.each( [
8228	"tabIndex",
8229	"readOnly",
8230	"maxLength",
8231	"cellSpacing",
8232	"cellPadding",
8233	"rowSpan",
8234	"colSpan",
8235	"useMap",
8236	"frameBorder",
8237	"contentEditable"
8238], function() {
8239	jQuery.propFix[ this.toLowerCase() ] = this;
8240} );
8241
8242
8243
8244
8245	// Strip and collapse whitespace according to HTML spec
8246	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
8247	function stripAndCollapse( value ) {
8248		var tokens = value.match( rnothtmlwhite ) || [];
8249		return tokens.join( " " );
8250	}
8251
8252
8253function getClass( elem ) {
8254	return elem.getAttribute && elem.getAttribute( "class" ) || "";
8255}
8256
8257function classesToArray( value ) {
8258	if ( Array.isArray( value ) ) {
8259		return value;
8260	}
8261	if ( typeof value === "string" ) {
8262		return value.match( rnothtmlwhite ) || [];
8263	}
8264	return [];
8265}
8266
8267jQuery.fn.extend( {
8268	addClass: function( value ) {
8269		var classes, elem, cur, curValue, clazz, j, finalValue,
8270			i = 0;
8271
8272		if ( isFunction( value ) ) {
8273			return this.each( function( j ) {
8274				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
8275			} );
8276		}
8277
8278		classes = classesToArray( value );
8279
8280		if ( classes.length ) {
8281			while ( ( elem = this[ i++ ] ) ) {
8282				curValue = getClass( elem );
8283				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8284
8285				if ( cur ) {
8286					j = 0;
8287					while ( ( clazz = classes[ j++ ] ) ) {
8288						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
8289							cur += clazz + " ";
8290						}
8291					}
8292
8293					// Only assign if different to avoid unneeded rendering.
8294					finalValue = stripAndCollapse( cur );
8295					if ( curValue !== finalValue ) {
8296						elem.setAttribute( "class", finalValue );
8297					}
8298				}
8299			}
8300		}
8301
8302		return this;
8303	},
8304
8305	removeClass: function( value ) {
8306		var classes, elem, cur, curValue, clazz, j, finalValue,
8307			i = 0;
8308
8309		if ( isFunction( value ) ) {
8310			return this.each( function( j ) {
8311				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
8312			} );
8313		}
8314
8315		if ( !arguments.length ) {
8316			return this.attr( "class", "" );
8317		}
8318
8319		classes = classesToArray( value );
8320
8321		if ( classes.length ) {
8322			while ( ( elem = this[ i++ ] ) ) {
8323				curValue = getClass( elem );
8324
8325				// This expression is here for better compressibility (see addClass)
8326				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8327
8328				if ( cur ) {
8329					j = 0;
8330					while ( ( clazz = classes[ j++ ] ) ) {
8331
8332						// Remove *all* instances
8333						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
8334							cur = cur.replace( " " + clazz + " ", " " );
8335						}
8336					}
8337
8338					// Only assign if different to avoid unneeded rendering.
8339					finalValue = stripAndCollapse( cur );
8340					if ( curValue !== finalValue ) {
8341						elem.setAttribute( "class", finalValue );
8342					}
8343				}
8344			}
8345		}
8346
8347		return this;
8348	},
8349
8350	toggleClass: function( value, stateVal ) {
8351		var type = typeof value,
8352			isValidValue = type === "string" || Array.isArray( value );
8353
8354		if ( typeof stateVal === "boolean" && isValidValue ) {
8355			return stateVal ? this.addClass( value ) : this.removeClass( value );
8356		}
8357
8358		if ( isFunction( value ) ) {
8359			return this.each( function( i ) {
8360				jQuery( this ).toggleClass(
8361					value.call( this, i, getClass( this ), stateVal ),
8362					stateVal
8363				);
8364			} );
8365		}
8366
8367		return this.each( function() {
8368			var className, i, self, classNames;
8369
8370			if ( isValidValue ) {
8371
8372				// Toggle individual class names
8373				i = 0;
8374				self = jQuery( this );
8375				classNames = classesToArray( value );
8376
8377				while ( ( className = classNames[ i++ ] ) ) {
8378
8379					// Check each className given, space separated list
8380					if ( self.hasClass( className ) ) {
8381						self.removeClass( className );
8382					} else {
8383						self.addClass( className );
8384					}
8385				}
8386
8387			// Toggle whole class name
8388			} else if ( value === undefined || type === "boolean" ) {
8389				className = getClass( this );
8390				if ( className ) {
8391
8392					// Store className if set
8393					dataPriv.set( this, "__className__", className );
8394				}
8395
8396				// If the element has a class name or if we're passed `false`,
8397				// then remove the whole classname (if there was one, the above saved it).
8398				// Otherwise bring back whatever was previously saved (if anything),
8399				// falling back to the empty string if nothing was stored.
8400				if ( this.setAttribute ) {
8401					this.setAttribute( "class",
8402						className || value === false ?
8403						"" :
8404						dataPriv.get( this, "__className__" ) || ""
8405					);
8406				}
8407			}
8408		} );
8409	},
8410
8411	hasClass: function( selector ) {
8412		var className, elem,
8413			i = 0;
8414
8415		className = " " + selector + " ";
8416		while ( ( elem = this[ i++ ] ) ) {
8417			if ( elem.nodeType === 1 &&
8418				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
8419					return true;
8420			}
8421		}
8422
8423		return false;
vendor: 7,091 bytes, lines 8424-8709
8424	}
8425} );
8426
8427
8428
8429
8430var rreturn = /\r/g;
8431
8432jQuery.fn.extend( {
8433	val: function( value ) {
8434		var hooks, ret, valueIsFunction,
8435			elem = this[ 0 ];
8436
8437		if ( !arguments.length ) {
8438			if ( elem ) {
8439				hooks = jQuery.valHooks[ elem.type ] ||
8440					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
8441
8442				if ( hooks &&
8443					"get" in hooks &&
8444					( ret = hooks.get( elem, "value" ) ) !== undefined
8445				) {
8446					return ret;
8447				}
8448
8449				ret = elem.value;
8450
8451				// Handle most common string cases
8452				if ( typeof ret === "string" ) {
8453					return ret.replace( rreturn, "" );
8454				}
8455
8456				// Handle cases where value is null/undef or number
8457				return ret == null ? "" : ret;
8458			}
8459
8460			return;
8461		}
8462
8463		valueIsFunction = isFunction( value );
8464
8465		return this.each( function( i ) {
8466			var val;
8467
8468			if ( this.nodeType !== 1 ) {
8469				return;
8470			}
8471
8472			if ( valueIsFunction ) {
8473				val = value.call( this, i, jQuery( this ).val() );
8474			} else {
8475				val = value;
8476			}
8477
8478			// Treat null/undefined as ""; convert numbers to string
8479			if ( val == null ) {
8480				val = "";
8481
8482			} else if ( typeof val === "number" ) {
8483				val += "";
8484
8485			} else if ( Array.isArray( val ) ) {
8486				val = jQuery.map( val, function( value ) {
8487					return value == null ? "" : value + "";
8488				} );
8489			}
8490
8491			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
8492
8493			// If set returns undefined, fall back to normal setting
8494			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
8495				this.value = val;
8496			}
8497		} );
8498	}
8499} );
8500
8501jQuery.extend( {
8502	valHooks: {
8503		option: {
8504			get: function( elem ) {
8505
8506				var val = jQuery.find.attr( elem, "value" );
8507				return val != null ?
8508					val :
8509
8510					// Support: IE <=10 - 11 only
8511					// option.text throws exceptions (#14686, #14858)
8512					// Strip and collapse whitespace
8513					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8514					stripAndCollapse( jQuery.text( elem ) );
8515			}
8516		},
8517		select: {
8518			get: function( elem ) {
8519				var value, option, i,
8520					options = elem.options,
8521					index = elem.selectedIndex,
8522					one = elem.type === "select-one",
8523					values = one ? null : [],
8524					max = one ? index + 1 : options.length;
8525
8526				if ( index < 0 ) {
8527					i = max;
8528
8529				} else {
8530					i = one ? index : 0;
8531				}
8532
8533				// Loop through all the selected options
8534				for ( ; i < max; i++ ) {
8535					option = options[ i ];
8536
8537					// Support: IE <=9 only
8538					// IE8-9 doesn't update selected after form reset (#2551)
8539					if ( ( option.selected || i === index ) &&
8540
8541							// Don't return options that are disabled or in a disabled optgroup
8542							!option.disabled &&
8543							( !option.parentNode.disabled ||
8544								!nodeName( option.parentNode, "optgroup" ) ) ) {
8545
8546						// Get the specific value for the option
8547						value = jQuery( option ).val();
8548
8549						// We don't need an array for one selects
8550						if ( one ) {
8551							return value;
8552						}
8553
8554						// Multi-Selects return an array
8555						values.push( value );
8556					}
8557				}
8558
8559				return values;
8560			},
8561
8562			set: function( elem, value ) {
8563				var optionSet, option,
8564					options = elem.options,
8565					values = jQuery.makeArray( value ),
8566					i = options.length;
8567
8568				while ( i-- ) {
8569					option = options[ i ];
8570
8571					/* eslint-disable no-cond-assign */
8572
8573					if ( option.selected =
8574						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
8575					) {
8576						optionSet = true;
8577					}
8578
8579					/* eslint-enable no-cond-assign */
8580				}
8581
8582				// Force browsers to behave consistently when non-matching value is set
8583				if ( !optionSet ) {
8584					elem.selectedIndex = -1;
8585				}
8586				return values;
8587			}
8588		}
8589	}
8590} );
8591
8592// Radios and checkboxes getter/setter
8593jQuery.each( [ "radio", "checkbox" ], function() {
8594	jQuery.valHooks[ this ] = {
8595		set: function( elem, value ) {
8596			if ( Array.isArray( value ) ) {
8597				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
8598			}
8599		}
8600	};
8601	if ( !support.checkOn ) {
8602		jQuery.valHooks[ this ].get = function( elem ) {
8603			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
8604		};
8605	}
8606} );
8607
8608
8609
8610
8611// Return jQuery for attributes-only inclusion
8612
8613
8614support.focusin = "onfocusin" in window;
8615
8616
8617var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
8618	stopPropagationCallback = function( e ) {
8619		e.stopPropagation();
8620	};
8621
8622jQuery.extend( jQuery.event, {
8623
8624	trigger: function( event, data, elem, onlyHandlers ) {
8625
8626		var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
8627			eventPath = [ elem || document ],
8628			type = hasOwn.call( event, "type" ) ? event.type : event,
8629			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
8630
8631		cur = lastElement = tmp = elem = elem || document;
8632
8633		// Don't do events on text and comment nodes
8634		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
8635			return;
8636		}
8637
8638		// focus/blur morphs to focusin/out; ensure we're not firing them right now
8639		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
8640			return;
8641		}
8642
8643		if ( type.indexOf( "." ) > -1 ) {
8644
8645			// Namespaced trigger; create a regexp to match event type in handle()
8646			namespaces = type.split( "." );
8647			type = namespaces.shift();
8648			namespaces.sort();
8649		}
8650		ontype = type.indexOf( ":" ) < 0 && "on" + type;
8651
8652		// Caller can pass in a jQuery.Event object, Object, or just an event type string
8653		event = event[ jQuery.expando ] ?
8654			event :
8655			new jQuery.Event( type, typeof event === "object" && event );
8656
8657		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
8658		event.isTrigger = onlyHandlers ? 2 : 3;
8659		event.namespace = namespaces.join( "." );
8660		event.rnamespace = event.namespace ?
8661			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
8662			null;
8663
8664		// Clean up the event in case it is being reused
8665		event.result = undefined;
8666		if ( !event.target ) {
8667			event.target = elem;
8668		}
8669
8670		// Clone any incoming data and prepend the event, creating the handler arg list
8671		data = data == null ?
8672			[ event ] :
8673			jQuery.makeArray( data, [ event ] );
8674
8675		// Allow special events to draw outside the lines
8676		special = jQuery.event.special[ type ] || {};
8677		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
8678			return;
8679		}
8680
8681		// Determine event propagation path in advance, per W3C events spec (#9951)
8682		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
8683		if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
8684
8685			bubbleType = special.delegateType || type;
8686			if ( !rfocusMorph.test( bubbleType + type ) ) {
8687				cur = cur.parentNode;
8688			}
8689			for ( ; cur; cur = cur.parentNode ) {
8690				eventPath.push( cur );
8691				tmp = cur;
8692			}
8693
8694			// Only add window if we got to document (e.g., not plain obj or detached DOM)
8695			if ( tmp === ( elem.ownerDocument || document ) ) {
8696				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
8697			}
8698		}
8699
8700		// Fire handlers on the event path
8701		i = 0;
8702		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
8703			lastElement = cur;
8704			event.type = i > 1 ?
8705				bubbleType :
8706				special.bindType || type;
8707
8708			// jQuery handler
8709			handle = (
vendor: 2,548 bytes, lines 8709-8810
8709
8710					dataPriv.get( cur, "events" ) || Object.create( null )
8711				)[ event.type ] &&
8712				dataPriv.get( cur, "handle" );
8713			if ( handle ) {
8714				handle.apply( cur, data );
8715			}
8716
8717			// Native handler
8718			handle = ontype && cur[ ontype ];
8719			if ( handle && handle.apply && acceptData( cur ) ) {
8720				event.result = handle.apply( cur, data );
8721				if ( event.result === false ) {
8722					event.preventDefault();
8723				}
8724			}
8725		}
8726		event.type = type;
8727
8728		// If nobody prevented the default action, do it now
8729		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
8730
8731			if ( ( !special._default ||
8732				special._default.apply( eventPath.pop(), data ) === false ) &&
8733				acceptData( elem ) ) {
8734
8735				// Call a native DOM method on the target with the same name as the event.
8736				// Don't do default actions on window, that's where global variables be (#6170)
8737				if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
8738
8739					// Don't re-trigger an onFOO event when we call its FOO() method
8740					tmp = elem[ ontype ];
8741
8742					if ( tmp ) {
8743						elem[ ontype ] = null;
8744					}
8745
8746					// Prevent re-triggering of the same event, since we already bubbled it above
8747					jQuery.event.triggered = type;
8748
8749					if ( event.isPropagationStopped() ) {
8750						lastElement.addEventListener( type, stopPropagationCallback );
8751					}
8752
8753					elem[ type ]();
8754
8755					if ( event.isPropagationStopped() ) {
8756						lastElement.removeEventListener( type, stopPropagationCallback );
8757					}
8758
8759					jQuery.event.triggered = undefined;
8760
8761					if ( tmp ) {
8762						elem[ ontype ] = tmp;
8763					}
8764				}
8765			}
8766		}
8767
8768		return event.result;
8769	},
8770
8771	// Piggyback on a donor event to simulate a different one
8772	// Used only for `focus(in | out)` events
8773	simulate: function( type, elem, event ) {
8774		var e = jQuery.extend(
8775			new jQuery.Event(),
8776			event,
8777			{
8778				type: type,
8779				isSimulated: true
8780			}
8781		);
8782
8783		jQuery.event.trigger( e, null, elem );
8784	}
8785
8786} );
8787
8788jQuery.fn.extend( {
8789
8790	trigger: function( type, data ) {
8791		return this.each( function() {
8792			jQuery.event.trigger( type, data, this );
8793		} );
8794	},
8795	triggerHandler: function( type, data ) {
8796		var elem = this[ 0 ];
8797		if ( elem ) {
8798			return jQuery.event.trigger( type, data, elem, true );
8799		}
8800	}
8801} );
8802
8803
8804// Support: Firefox <=44
8805// Firefox doesn't have focus(in | out) events
8806// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
8807//
8808// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
8809// focus(in | out) events fire after focus & blur events,
8810// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
vendor: 4,078 bytes, lines 8811-8976
8811// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
8812if ( !support.focusin ) {
8813	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
8814
8815		// Attach a single capturing handler on the document while someone wants focusin/focusout
8816		var handler = function( event ) {
8817			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
8818		};
8819
8820		jQuery.event.special[ fix ] = {
8821			setup: function() {
8822
8823				// Handle: regular nodes (via `this.ownerDocument`), window
8824				// (via `this.document`) & document (via `this`).
8825				var doc = this.ownerDocument || this.document || this,
8826					attaches = dataPriv.access( doc, fix );
8827
8828				if ( !attaches ) {
8829					doc.addEventListener( orig, handler, true );
8830				}
8831				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
8832			},
8833			teardown: function() {
8834				var doc = this.ownerDocument || this.document || this,
8835					attaches = dataPriv.access( doc, fix ) - 1;
8836
8837				if ( !attaches ) {
8838					doc.removeEventListener( orig, handler, true );
8839					dataPriv.remove( doc, fix );
8840
8841				} else {
8842					dataPriv.access( doc, fix, attaches );
8843				}
8844			}
8845		};
8846	} );
8847}
8848var location = window.location;
8849
8850var nonce = { guid: Date.now() };
8851
8852var rquery = ( /\?/ );
8853
8854
8855
8856// Cross-browser xml parsing
8857jQuery.parseXML = function( data ) {
8858	var xml;
8859	if ( !data || typeof data !== "string" ) {
8860		return null;
8861	}
8862
8863	// Support: IE 9 - 11 only
8864	// IE throws on parseFromString with invalid input.
8865	try {
8866		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8867	} catch ( e ) {
8868		xml = undefined;
8869	}
8870
8871	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
8872		jQuery.error( "Invalid XML: " + data );
8873	}
8874	return xml;
8875};
8876
8877
8878var
8879	rbracket = /\[\]$/,
8880	rCRLF = /\r?\n/g,
8881	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
8882	rsubmittable = /^(?:input|select|textarea|keygen)/i;
8883
8884function buildParams( prefix, obj, traditional, add ) {
8885	var name;
8886
8887	if ( Array.isArray( obj ) ) {
8888
8889		// Serialize array item.
8890		jQuery.each( obj, function( i, v ) {
8891			if ( traditional || rbracket.test( prefix ) ) {
8892
8893				// Treat each array item as a scalar.
8894				add( prefix, v );
8895
8896			} else {
8897
8898				// Item is non-scalar (array or object), encode its numeric index.
8899				buildParams(
8900					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
8901					v,
8902					traditional,
8903					add
8904				);
8905			}
8906		} );
8907
8908	} else if ( !traditional && toType( obj ) === "object" ) {
8909
8910		// Serialize object item.
8911		for ( name in obj ) {
8912			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
8913		}
8914
8915	} else {
8916
8917		// Serialize scalar item.
8918		add( prefix, obj );
8919	}
8920}
8921
8922// Serialize an array of form elements or a set of
8923// key/values into a query string
8924jQuery.param = function( a, traditional ) {
8925	var prefix,
8926		s = [],
8927		add = function( key, valueOrFunction ) {
8928
8929			// If value is a function, invoke it and use its return value
8930			var value = isFunction( valueOrFunction ) ?
8931				valueOrFunction() :
8932				valueOrFunction;
8933
8934			s[ s.length ] = encodeURIComponent( key ) + "=" +
8935				encodeURIComponent( value == null ? "" : value );
8936		};
8937
8938	if ( a == null ) {
8939		return "";
8940	}
8941
8942	// If an array was passed in, assume that it is an array of form elements.
8943	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8944
8945		// Serialize the form elements
8946		jQuery.each( a, function() {
8947			add( this.name, this.value );
8948		} );
8949
8950	} else {
8951
8952		// If traditional, encode the "old" way (the way 1.3.2 or older
8953		// did it), otherwise encode params recursively.
8954		for ( prefix in a ) {
8955			buildParams( prefix, a[ prefix ], traditional, add );
8956		}
8957	}
8958
8959	// Return the resulting serialization
8960	return s.join( "&" );
8961};
8962
8963jQuery.fn.extend( {
8964	serialize: function() {
8965		return jQuery.param( this.serializeArray() );
8966	},
8967	serializeArray: function() {
8968		return this.map( function() {
8969
8970			// Can add propHook for "elements" to filter or add form elements
8971			var elements = jQuery.prop( this, "elements" );
8972			return elements ? jQuery.makeArray( elements ) : this;
8973		} )
8974		.filter( function() {
8975			var type = this.type;
8976
vendor: 4,933 bytes, lines 8977-9149
8977			// Use .is( ":disabled" ) so that fieldset[disabled] works
8978			return this.name && !jQuery( this ).is( ":disabled" ) &&
8979				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8980				( this.checked || !rcheckableType.test( type ) );
8981		} )
8982		.map( function( _i, elem ) {
8983			var val = jQuery( this ).val();
8984
8985			if ( val == null ) {
8986				return null;
8987			}
8988
8989			if ( Array.isArray( val ) ) {
8990				return jQuery.map( val, function( val ) {
8991					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8992				} );
8993			}
8994
8995			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8996		} ).get();
8997	}
8998} );
8999
9000
9001var
9002	r20 = /%20/g,
9003	rhash = /#.*$/,
9004	rantiCache = /([?&])_=[^&]*/,
9005	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
9006
9007	// #7653, #8125, #8152: local protocol detection
9008	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
9009	rnoContent = /^(?:GET|HEAD)$/,
9010	rprotocol = /^\/\//,
9011
9012	/* Prefilters
9013	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
9014	 * 2) These are called:
9015	 *    - BEFORE asking for a transport
9016	 *    - AFTER param serialization (s.data is a string if s.processData is true)
9017	 * 3) key is the dataType
9018	 * 4) the catchall symbol "*" can be used
9019	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
9020	 */
9021	prefilters = {},
9022
9023	/* Transports bindings
9024	 * 1) key is the dataType
9025	 * 2) the catchall symbol "*" can be used
9026	 * 3) selection will start with transport dataType and THEN go to "*" if needed
9027	 */
9028	transports = {},
9029
9030	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
9031	allTypes = "*/".concat( "*" ),
9032
9033	// Anchor tag for parsing the document origin
9034	originAnchor = document.createElement( "a" );
9035	originAnchor.href = location.href;
9036
9037// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
9038function addToPrefiltersOrTransports( structure ) {
9039
9040	// dataTypeExpression is optional and defaults to "*"
9041	return function( dataTypeExpression, func ) {
9042
9043		if ( typeof dataTypeExpression !== "string" ) {
9044			func = dataTypeExpression;
9045			dataTypeExpression = "*";
9046		}
9047
9048		var dataType,
9049			i = 0,
9050			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
9051
9052		if ( isFunction( func ) ) {
9053
9054			// For each dataType in the dataTypeExpression
9055			while ( ( dataType = dataTypes[ i++ ] ) ) {
9056
9057				// Prepend if requested
9058				if ( dataType[ 0 ] === "+" ) {
9059					dataType = dataType.slice( 1 ) || "*";
9060					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
9061
9062				// Otherwise append
9063				} else {
9064					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
9065				}
9066			}
9067		}
9068	};
9069}
9070
9071// Base inspection function for prefilters and transports
9072function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
9073
9074	var inspected = {},
9075		seekingTransport = ( structure === transports );
9076
9077	function inspect( dataType ) {
9078		var selected;
9079		inspected[ dataType ] = true;
9080		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
9081			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
9082			if ( typeof dataTypeOrTransport === "string" &&
9083				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
9084
9085				options.dataTypes.unshift( dataTypeOrTransport );
9086				inspect( dataTypeOrTransport );
9087				return false;
9088			} else if ( seekingTransport ) {
9089				return !( selected = dataTypeOrTransport );
9090			}
9091		} );
9092		return selected;
9093	}
9094
9095	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
9096}
9097
9098// A special extend for ajax options
9099// that takes "flat" options (not to be deep extended)
9100// Fixes #9887
9101function ajaxExtend( target, src ) {
9102	var key, deep,
9103		flatOptions = jQuery.ajaxSettings.flatOptions || {};
9104
9105	for ( key in src ) {
9106		if ( src[ key ] !== undefined ) {
9107			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
9108		}
9109	}
9110	if ( deep ) {
9111		jQuery.extend( true, target, deep );
9112	}
9113
9114	return target;
9115}
9116
9117/* Handles responses to an ajax request:
9118 * - finds the right dataType (mediates between content-type and expected dataType)
9119 * - returns the corresponding response
9120 */
9121function ajaxHandleResponses( s, jqXHR, responses ) {
9122
9123	var ct, type, finalDataType, firstDataType,
9124		contents = s.contents,
9125		dataTypes = s.dataTypes;
9126
9127	// Remove auto dataType and get content-type in the process
9128	while ( dataTypes[ 0 ] === "*" ) {
9129		dataTypes.shift();
9130		if ( ct === undefined ) {
9131			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
9132		}
9133	}
9134
9135	// Check if we're dealing with a known content-type
9136	if ( ct ) {
9137		for ( type in contents ) {
9138			if ( contents[ type ] && contents[ type ].test( ct ) ) {
9139				dataTypes.unshift( type );
9140				break;
9141			}
9142		}
9143	}
9144
9145	// Check to see if we have a response for the expected dataType
9146	if ( dataTypes[ 0 ] in responses ) {
9147		finalDataType = dataTypes[ 0 ];
9148	} else {
9149
vendor: 6,163 bytes, lines 9150-9417
9150		// Try convertible dataTypes
9151		for ( type in responses ) {
9152			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
9153				finalDataType = type;
9154				break;
9155			}
9156			if ( !firstDataType ) {
9157				firstDataType = type;
9158			}
9159		}
9160
9161		// Or just use first one
9162		finalDataType = finalDataType || firstDataType;
9163	}
9164
9165	// If we found a dataType
9166	// We add the dataType to the list if needed
9167	// and return the corresponding response
9168	if ( finalDataType ) {
9169		if ( finalDataType !== dataTypes[ 0 ] ) {
9170			dataTypes.unshift( finalDataType );
9171		}
9172		return responses[ finalDataType ];
9173	}
9174}
9175
9176/* Chain conversions given the request and the original response
9177 * Also sets the responseXXX fields on the jqXHR instance
9178 */
9179function ajaxConvert( s, response, jqXHR, isSuccess ) {
9180	var conv2, current, conv, tmp, prev,
9181		converters = {},
9182
9183		// Work with a copy of dataTypes in case we need to modify it for conversion
9184		dataTypes = s.dataTypes.slice();
9185
9186	// Create converters map with lowercased keys
9187	if ( dataTypes[ 1 ] ) {
9188		for ( conv in s.converters ) {
9189			converters[ conv.toLowerCase() ] = s.converters[ conv ];
9190		}
9191	}
9192
9193	current = dataTypes.shift();
9194
9195	// Convert to each sequential dataType
9196	while ( current ) {
9197
9198		if ( s.responseFields[ current ] ) {
9199			jqXHR[ s.responseFields[ current ] ] = response;
9200		}
9201
9202		// Apply the dataFilter if provided
9203		if ( !prev && isSuccess && s.dataFilter ) {
9204			response = s.dataFilter( response, s.dataType );
9205		}
9206
9207		prev = current;
9208		current = dataTypes.shift();
9209
9210		if ( current ) {
9211
9212			// There's only work to do if current dataType is non-auto
9213			if ( current === "*" ) {
9214
9215				current = prev;
9216
9217			// Convert response if prev dataType is non-auto and differs from current
9218			} else if ( prev !== "*" && prev !== current ) {
9219
9220				// Seek a direct converter
9221				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
9222
9223				// If none found, seek a pair
9224				if ( !conv ) {
9225					for ( conv2 in converters ) {
9226
9227						// If conv2 outputs current
9228						tmp = conv2.split( " " );
9229						if ( tmp[ 1 ] === current ) {
9230
9231							// If prev can be converted to accepted input
9232							conv = converters[ prev + " " + tmp[ 0 ] ] ||
9233								converters[ "* " + tmp[ 0 ] ];
9234							if ( conv ) {
9235
9236								// Condense equivalence converters
9237								if ( conv === true ) {
9238									conv = converters[ conv2 ];
9239
9240								// Otherwise, insert the intermediate dataType
9241								} else if ( converters[ conv2 ] !== true ) {
9242									current = tmp[ 0 ];
9243									dataTypes.unshift( tmp[ 1 ] );
9244								}
9245								break;
9246							}
9247						}
9248					}
9249				}
9250
9251				// Apply converter (if not an equivalence)
9252				if ( conv !== true ) {
9253
9254					// Unless errors are allowed to bubble, catch and return them
9255					if ( conv && s.throws ) {
9256						response = conv( response );
9257					} else {
9258						try {
9259							response = conv( response );
9260						} catch ( e ) {
9261							return {
9262								state: "parsererror",
9263								error: conv ? e : "No conversion from " + prev + " to " + current
9264							};
9265						}
9266					}
9267				}
9268			}
9269		}
9270	}
9271
9272	return { state: "success", data: response };
9273}
9274
9275jQuery.extend( {
9276
9277	// Counter for holding the number of active queries
9278	active: 0,
9279
9280	// Last-Modified header cache for next request
9281	lastModified: {},
9282	etag: {},
9283
9284	ajaxSettings: {
9285		url: location.href,
9286		type: "GET",
9287		isLocal: rlocalProtocol.test( location.protocol ),
9288		global: true,
9289		processData: true,
9290		async: true,
9291		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
9292
9293		/*
9294		timeout: 0,
9295		data: null,
9296		dataType: null,
9297		username: null,
9298		password: null,
9299		cache: null,
9300		throws: false,
9301		traditional: false,
9302		headers: {},
9303		*/
9304
9305		accepts: {
9306			"*": allTypes,
9307			text: "text/plain",
9308			html: "text/html",
9309			xml: "application/xml, text/xml",
9310			json: "application/json, text/javascript"
9311		},
9312
9313		contents: {
9314			xml: /\bxml\b/,
9315			html: /\bhtml/,
9316			json: /\bjson\b/
9317		},
9318
9319		responseFields: {
9320			xml: "responseXML",
9321			text: "responseText",
9322			json: "responseJSON"
9323		},
9324
9325		// Data converters
9326		// Keys separate source (or catchall "*") and destination types with a single space
9327		converters: {
9328
9329			// Convert anything to text
9330			"* text": String,
9331
9332			// Text to html (true = no transformation)
9333			"text html": true,
9334
9335			// Evaluate text as a json expression
9336			"text json": JSON.parse,
9337
9338			// Parse text as xml
9339			"text xml": jQuery.parseXML
9340		},
9341
9342		// For options that shouldn't be deep extended:
9343		// you can add your own custom options here if
9344		// and when you create one that shouldn't be
9345		// deep extended (see ajaxExtend)
9346		flatOptions: {
9347			url: true,
9348			context: true
9349		}
9350	},
9351
9352	// Creates a full fledged settings object into target
9353	// with both ajaxSettings and settings fields.
9354	// If target is omitted, writes into ajaxSettings.
9355	ajaxSetup: function( target, settings ) {
9356		return settings ?
9357
9358			// Building a settings object
9359			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
9360
9361			// Extending ajaxSettings
9362			ajaxExtend( jQuery.ajaxSettings, target );
9363	},
9364
9365	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
9366	ajaxTransport: addToPrefiltersOrTransports( transports ),
9367
9368	// Main method
9369	ajax: function( url, options ) {
9370
9371		// If url is an object, simulate pre-1.5 signature
9372		if ( typeof url === "object" ) {
9373			options = url;
9374			url = undefined;
9375		}
9376
9377		// Force options to be an object
9378		options = options || {};
9379
9380		var transport,
9381
9382			// URL without anti-cache param
9383			cacheURL,
9384
9385			// Response headers
9386			responseHeadersString,
9387			responseHeaders,
9388
9389			// timeout handle
9390			timeoutTimer,
9391
9392			// Url cleanup var
9393			urlAnchor,
9394
9395			// Request state (becomes false upon send and true upon completion)
9396			completed,
9397
9398			// To know if global events are to be dispatched
9399			fireGlobals,
9400
9401			// Loop variable
9402			i,
9403
9404			// uncached part of the url
9405			uncached,
9406
9407			// Create the final options object
9408			s = jQuery.ajaxSetup( {}, options ),
9409
9410			// Callbacks context
9411			callbackContext = s.context || s,
9412
9413			// Context for global events is callbackContext if it is a DOM node or jQuery collection
9414			globalEventContext = s.context &&
9415				( callbackContext.nodeType || callbackContext.jquery ) ?
9416					jQuery( callbackContext ) :
9417	
vendor: 8,850 bytes, lines 9417-9729
9417				jQuery.event,
9418
9419			// Deferreds
9420			deferred = jQuery.Deferred(),
9421			completeDeferred = jQuery.Callbacks( "once memory" ),
9422
9423			// Status-dependent callbacks
9424			statusCode = s.statusCode || {},
9425
9426			// Headers (they are sent all at once)
9427			requestHeaders = {},
9428			requestHeadersNames = {},
9429
9430			// Default abort message
9431			strAbort = "canceled",
9432
9433			// Fake xhr
9434			jqXHR = {
9435				readyState: 0,
9436
9437				// Builds headers hashtable if needed
9438				getResponseHeader: function( key ) {
9439					var match;
9440					if ( completed ) {
9441						if ( !responseHeaders ) {
9442							responseHeaders = {};
9443							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
9444								responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
9445									( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
9446										.concat( match[ 2 ] );
9447							}
9448						}
9449						match = responseHeaders[ key.toLowerCase() + " " ];
9450					}
9451					return match == null ? null : match.join( ", " );
9452				},
9453
9454				// Raw string
9455				getAllResponseHeaders: function() {
9456					return completed ? responseHeadersString : null;
9457				},
9458
9459				// Caches the header
9460				setRequestHeader: function( name, value ) {
9461					if ( completed == null ) {
9462						name = requestHeadersNames[ name.toLowerCase() ] =
9463							requestHeadersNames[ name.toLowerCase() ] || name;
9464						requestHeaders[ name ] = value;
9465					}
9466					return this;
9467				},
9468
9469				// Overrides response content-type header
9470				overrideMimeType: function( type ) {
9471					if ( completed == null ) {
9472						s.mimeType = type;
9473					}
9474					return this;
9475				},
9476
9477				// Status-dependent callbacks
9478				statusCode: function( map ) {
9479					var code;
9480					if ( map ) {
9481						if ( completed ) {
9482
9483							// Execute the appropriate callbacks
9484							jqXHR.always( map[ jqXHR.status ] );
9485						} else {
9486
9487							// Lazy-add the new callbacks in a way that preserves old ones
9488							for ( code in map ) {
9489								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
9490							}
9491						}
9492					}
9493					return this;
9494				},
9495
9496				// Cancel the request
9497				abort: function( statusText ) {
9498					var finalText = statusText || strAbort;
9499					if ( transport ) {
9500						transport.abort( finalText );
9501					}
9502					done( 0, finalText );
9503					return this;
9504				}
9505			};
9506
9507		// Attach deferreds
9508		deferred.promise( jqXHR );
9509
9510		// Add protocol if not provided (prefilters might expect it)
9511		// Handle falsy url in the settings object (#10093: consistency with old signature)
9512		// We also use the url parameter if available
9513		s.url = ( ( url || s.url || location.href ) + "" )
9514			.replace( rprotocol, location.protocol + "//" );
9515
9516		// Alias method option to type as per ticket #12004
9517		s.type = options.method || options.type || s.method || s.type;
9518
9519		// Extract dataTypes list
9520		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
9521
9522		// A cross-domain request is in order when the origin doesn't match the current origin.
9523		if ( s.crossDomain == null ) {
9524			urlAnchor = document.createElement( "a" );
9525
9526			// Support: IE <=8 - 11, Edge 12 - 15
9527			// IE throws exception on accessing the href property if url is malformed,
9528			// e.g. http://example.com:80x/
9529			try {
9530				urlAnchor.href = s.url;
9531
9532				// Support: IE <=8 - 11 only
9533				// Anchor's host property isn't correctly set when s.url is relative
9534				urlAnchor.href = urlAnchor.href;
9535				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
9536					urlAnchor.protocol + "//" + urlAnchor.host;
9537			} catch ( e ) {
9538
9539				// If there is an error parsing the URL, assume it is crossDomain,
9540				// it can be rejected by the transport if it is invalid
9541				s.crossDomain = true;
9542			}
9543		}
9544
9545		// Convert data if not already a string
9546		if ( s.data && s.processData && typeof s.data !== "string" ) {
9547			s.data = jQuery.param( s.data, s.traditional );
9548		}
9549
9550		// Apply prefilters
9551		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
9552
9553		// If request was aborted inside a prefilter, stop there
9554		if ( completed ) {
9555			return jqXHR;
9556		}
9557
9558		// We can fire global events as of now if asked to
9559		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9560		fireGlobals = jQuery.event && s.global;
9561
9562		// Watch for a new set of requests
9563		if ( fireGlobals && jQuery.active++ === 0 ) {
9564			jQuery.event.trigger( "ajaxStart" );
9565		}
9566
9567		// Uppercase the type
9568		s.type = s.type.toUpperCase();
9569
9570		// Determine if request has content
9571		s.hasContent = !rnoContent.test( s.type );
9572
9573		// Save the URL in case we're toying with the If-Modified-Since
9574		// and/or If-None-Match header later on
9575		// Remove hash to simplify url manipulation
9576		cacheURL = s.url.replace( rhash, "" );
9577
9578		// More options handling for requests with no content
9579		if ( !s.hasContent ) {
9580
9581			// Remember the hash so we can put it back
9582			uncached = s.url.slice( cacheURL.length );
9583
9584			// If data is available and should be processed, append data to url
9585			if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
9586				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9587
9588				// #9682: remove data so that it's not used in an eventual retry
9589				delete s.data;
9590			}
9591
9592			// Add or update anti-cache param if needed
9593			if ( s.cache === false ) {
9594				cacheURL = cacheURL.replace( rantiCache, "$1" );
9595				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
9596					uncached;
9597			}
9598
9599			// Put hash and anti-cache on the URL that will be requested (gh-1732)
9600			s.url = cacheURL + uncached;
9601
9602		// Change '%20' to '+' if this is encoded form body content (gh-2658)
9603		} else if ( s.data && s.processData &&
9604			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
9605			s.data = s.data.replace( r20, "+" );
9606		}
9607
9608		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9609		if ( s.ifModified ) {
9610			if ( jQuery.lastModified[ cacheURL ] ) {
9611				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
9612			}
9613			if ( jQuery.etag[ cacheURL ] ) {
9614				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
9615			}
9616		}
9617
9618		// Set the correct header, if data is being sent
9619		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
9620			jqXHR.setRequestHeader( "Content-Type", s.contentType );
9621		}
9622
9623		// Set the Accepts header for the server, depending on the dataType
9624		jqXHR.setRequestHeader(
9625			"Accept",
9626			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
9627				s.accepts[ s.dataTypes[ 0 ] ] +
9628					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
9629				s.accepts[ "*" ]
9630		);
9631
9632		// Check for headers option
9633		for ( i in s.headers ) {
9634			jqXHR.setRequestHeader( i, s.headers[ i ] );
9635		}
9636
9637		// Allow custom headers/mimetypes and early abort
9638		if ( s.beforeSend &&
9639			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
9640
9641			// Abort if not done already and return
9642			return jqXHR.abort();
9643		}
9644
9645		// Aborting is no longer a cancellation
9646		strAbort = "abort";
9647
9648		// Install callbacks on deferreds
9649		completeDeferred.add( s.complete );
9650		jqXHR.done( s.success );
9651		jqXHR.fail( s.error );
9652
9653		// Get transport
9654		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
9655
9656		// If no transport, we auto-abort
9657		if ( !transport ) {
9658			done( -1, "No Transport" );
9659		} else {
9660			jqXHR.readyState = 1;
9661
9662			// Send global event
9663			if ( fireGlobals ) {
9664				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
9665			}
9666
9667			// If request was aborted inside ajaxSend, stop there
9668			if ( completed ) {
9669				return jqXHR;
9670			}
9671
9672			// Timeout
9673			if ( s.async && s.timeout > 0 ) {
9674				timeoutTimer = window.setTimeout( function() {
9675					jqXHR.abort( "timeout" );
9676				}, s.timeout );
9677			}
9678
9679			try {
9680				completed = false;
9681				transport.send( requestHeaders, done );
9682			} catch ( e ) {
9683
9684				// Rethrow post-completion exceptions
9685				if ( completed ) {
9686					throw e;
9687				}
9688
9689				// Propagate others as results
9690				done( -1, e );
9691			}
9692		}
9693
9694		// Callback for when everything is done
9695		function done( status, nativeStatusText, responses, headers ) {
9696			var isSuccess, success, error, response, modified,
9697				statusText = nativeStatusText;
9698
9699			// Ignore repeat invocations
9700			if ( completed ) {
9701				return;
9702			}
9703
9704			completed = true;
9705
9706			// Clear timeout if it exists
9707			if ( timeoutTimer ) {
9708				window.clearTimeout( timeoutTimer );
9709			}
9710
9711			// Dereference transport for early garbage collection
9712			// (no matter how long the jqXHR object will be used)
9713			transport = undefined;
9714
9715			// Cache response headers
9716			responseHeadersString = headers || "";
9717
9718			// Set readyState
9719			jqXHR.readyState = status > 0 ? 4 : 0;
9720
9721			// Determine if successful
9722			isSuccess = status >= 200 && status < 300 || status === 304;
9723
9724			// Get response data
9725			if ( responses ) {
9726				response = ajaxHandleResponses( s, jqXHR, responses );
9727			}
9728
9729			// Use a noop converter for missing script
9729
9730			if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1
vendor: 18,647 bytes, lines 9730-10468
9730 ) {
9731				s.converters[ "text script" ] = function() {};
9732			}
9733
9734			// Convert no matter what (that way responseXXX fields are always set)
9735			response = ajaxConvert( s, response, jqXHR, isSuccess );
9736
9737			// If successful, handle type chaining
9738			if ( isSuccess ) {
9739
9740				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9741				if ( s.ifModified ) {
9742					modified = jqXHR.getResponseHeader( "Last-Modified" );
9743					if ( modified ) {
9744						jQuery.lastModified[ cacheURL ] = modified;
9745					}
9746					modified = jqXHR.getResponseHeader( "etag" );
9747					if ( modified ) {
9748						jQuery.etag[ cacheURL ] = modified;
9749					}
9750				}
9751
9752				// if no content
9753				if ( status === 204 || s.type === "HEAD" ) {
9754					statusText = "nocontent";
9755
9756				// if not modified
9757				} else if ( status === 304 ) {
9758					statusText = "notmodified";
9759
9760				// If we have data, let's convert it
9761				} else {
9762					statusText = response.state;
9763					success = response.data;
9764					error = response.error;
9765					isSuccess = !error;
9766				}
9767			} else {
9768
9769				// Extract error from statusText and normalize for non-aborts
9770				error = statusText;
9771				if ( status || !statusText ) {
9772					statusText = "error";
9773					if ( status < 0 ) {
9774						status = 0;
9775					}
9776				}
9777			}
9778
9779			// Set data for the fake xhr object
9780			jqXHR.status = status;
9781			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
9782
9783			// Success/Error
9784			if ( isSuccess ) {
9785				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
9786			} else {
9787				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
9788			}
9789
9790			// Status-dependent callbacks
9791			jqXHR.statusCode( statusCode );
9792			statusCode = undefined;
9793
9794			if ( fireGlobals ) {
9795				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
9796					[ jqXHR, s, isSuccess ? success : error ] );
9797			}
9798
9799			// Complete
9800			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
9801
9802			if ( fireGlobals ) {
9803				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
9804
9805				// Handle the global AJAX counter
9806				if ( !( --jQuery.active ) ) {
9807					jQuery.event.trigger( "ajaxStop" );
9808				}
9809			}
9810		}
9811
9812		return jqXHR;
9813	},
9814
9815	getJSON: function( url, data, callback ) {
9816		return jQuery.get( url, data, callback, "json" );
9817	},
9818
9819	getScript: function( url, callback ) {
9820		return jQuery.get( url, undefined, callback, "script" );
9821	}
9822} );
9823
9824jQuery.each( [ "get", "post" ], function( _i, method ) {
9825	jQuery[ method ] = function( url, data, callback, type ) {
9826
9827		// Shift arguments if data argument was omitted
9828		if ( isFunction( data ) ) {
9829			type = type || callback;
9830			callback = data;
9831			data = undefined;
9832		}
9833
9834		// The url can be an options object (which then must have .url)
9835		return jQuery.ajax( jQuery.extend( {
9836			url: url,
9837			type: method,
9838			dataType: type,
9839			data: data,
9840			success: callback
9841		}, jQuery.isPlainObject( url ) && url ) );
9842	};
9843} );
9844
9845jQuery.ajaxPrefilter( function( s ) {
9846	var i;
9847	for ( i in s.headers ) {
9848		if ( i.toLowerCase() === "content-type" ) {
9849			s.contentType = s.headers[ i ] || "";
9850		}
9851	}
9852} );
9853
9854
9855jQuery._evalUrl = function( url, options, doc ) {
9856	return jQuery.ajax( {
9857		url: url,
9858
9859		// Make this explicit, since user can override this through ajaxSetup (#11264)
9860		type: "GET",
9861		dataType: "script",
9862		cache: true,
9863		async: false,
9864		global: false,
9865
9866		// Only evaluate the response if it is successful (gh-4126)
9867		// dataFilter is not invoked for failure responses, so using it instead
9868		// of the default converter is kludgy but it works.
9869		converters: {
9870			"text script": function() {}
9871		},
9872		dataFilter: function( response ) {
9873			jQuery.globalEval( response, options, doc );
9874		}
9875	} );
9876};
9877
9878
9879jQuery.fn.extend( {
9880	wrapAll: function( html ) {
9881		var wrap;
9882
9883		if ( this[ 0 ] ) {
9884			if ( isFunction( html ) ) {
9885				html = html.call( this[ 0 ] );
9886			}
9887
9888			// The elements to wrap the target around
9889			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
9890
9891			if ( this[ 0 ].parentNode ) {
9892				wrap.insertBefore( this[ 0 ] );
9893			}
9894
9895			wrap.map( function() {
9896				var elem = this;
9897
9898				while ( elem.firstElementChild ) {
9899					elem = elem.firstElementChild;
9900				}
9901
9902				return elem;
9903			} ).append( this );
9904		}
9905
9906		return this;
9907	},
9908
9909	wrapInner: function( html ) {
9910		if ( isFunction( html ) ) {
9911			return this.each( function( i ) {
9912				jQuery( this ).wrapInner( html.call( this, i ) );
9913			} );
9914		}
9915
9916		return this.each( function() {
9917			var self = jQuery( this ),
9918				contents = self.contents();
9919
9920			if ( contents.length ) {
9921				contents.wrapAll( html );
9922
9923			} else {
9924				self.append( html );
9925			}
9926		} );
9927	},
9928
9929	wrap: function( html ) {
9930		var htmlIsFunction = isFunction( html );
9931
9932		return this.each( function( i ) {
9933			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
9934		} );
9935	},
9936
9937	unwrap: function( selector ) {
9938		this.parent( selector ).not( "body" ).each( function() {
9939			jQuery( this ).replaceWith( this.childNodes );
9940		} );
9941		return this;
9942	}
9943} );
9944
9945
9946jQuery.expr.pseudos.hidden = function( elem ) {
9947	return !jQuery.expr.pseudos.visible( elem );
9948};
9949jQuery.expr.pseudos.visible = function( elem ) {
9950	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
9951};
9952
9953
9954
9955
9956jQuery.ajaxSettings.xhr = function() {
9957	try {
9958		return new window.XMLHttpRequest();
9959	} catch ( e ) {}
9960};
9961
9962var xhrSuccessStatus = {
9963
9964		// File protocol always yields status code 0, assume 200
9965		0: 200,
9966
9967		// Support: IE <=9 only
9968		// #1450: sometimes IE returns 1223 when it should be 204
9969		1223: 204
9970	},
9971	xhrSupported = jQuery.ajaxSettings.xhr();
9972
9973support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
9974support.ajax = xhrSupported = !!xhrSupported;
9975
9976jQuery.ajaxTransport( function( options ) {
9977	var callback, errorCallback;
9978
9979	// Cross domain only allowed if supported through XMLHttpRequest
9980	if ( support.cors || xhrSupported && !options.crossDomain ) {
9981		return {
9982			send: function( headers, complete ) {
9983				var i,
9984					xhr = options.xhr();
9985
9986				xhr.open(
9987					options.type,
9988					options.url,
9989					options.async,
9990					options.username,
9991					options.password
9992				);
9993
9994				// Apply custom fields if provided
9995				if ( options.xhrFields ) {
9996					for ( i in options.xhrFields ) {
9997						xhr[ i ] = options.xhrFields[ i ];
9998					}
9999				}
10000
10001				// Override mime type if needed
10002				if ( options.mimeType && xhr.overrideMimeType ) {
10003					xhr.overrideMimeType( options.mimeType );
10004				}
10005
10006				// X-Requested-With header
10007				// For cross-domain requests, seeing as conditions for a preflight are
10008				// akin to a jigsaw puzzle, we simply never set it to be sure.
10009				// (it can always be set on a per-request basis or even using ajaxSetup)
10010				// For same-domain requests, won't change header if already provided.
10011				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
10012					headers[ "X-Requested-With" ] = "XMLHttpRequest";
10013				}
10014
10015				// Set headers
10016				for ( i in headers ) {
10017					xhr.setRequestHeader( i, headers[ i ] );
10018				}
10019
10020				// Callback
10021				callback = function( type ) {
10022					return function() {
10023						if ( callback ) {
10024							callback = errorCallback = xhr.onload =
10025								xhr.onerror = xhr.onabort = xhr.ontimeout =
10026									xhr.onreadystatechange = null;
10027
10028							if ( type === "abort" ) {
10029								xhr.abort();
10030							} else if ( type === "error" ) {
10031
10032								// Support: IE <=9 only
10033								// On a manual native abort, IE9 throws
10034								// errors on any property access that is not readyState
10035								if ( typeof xhr.status !== "number" ) {
10036									complete( 0, "error" );
10037								} else {
10038									complete(
10039
10040										// File: protocol always yields status 0; see #8605, #14207
10041										xhr.status,
10042										xhr.statusText
10043									);
10044								}
10045							} else {
10046								complete(
10047									xhrSuccessStatus[ xhr.status ] || xhr.status,
10048									xhr.statusText,
10049
10050									// Support: IE <=9 only
10051									// IE9 has no XHR2 but throws on binary (trac-11426)
10052									// For XHR2 non-text, let the caller handle it (gh-2498)
10053									( xhr.responseType || "text" ) !== "text"  ||
10054									typeof xhr.responseText !== "string" ?
10055										{ binary: xhr.response } :
10056										{ text: xhr.responseText },
10057									xhr.getAllResponseHeaders()
10058								);
10059							}
10060						}
10061					};
10062				};
10063
10064				// Listen to events
10065				xhr.onload = callback();
10066				errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
10067
10068				// Support: IE 9 only
10069				// Use onreadystatechange to replace onabort
10070				// to handle uncaught aborts
10071				if ( xhr.onabort !== undefined ) {
10072					xhr.onabort = errorCallback;
10073				} else {
10074					xhr.onreadystatechange = function() {
10075
10076						// Check readyState before timeout as it changes
10077						if ( xhr.readyState === 4 ) {
10078
10079							// Allow onerror to be called first,
10080							// but that will not handle a native abort
10081							// Also, save errorCallback to a variable
10082							// as xhr.onerror cannot be accessed
10083							window.setTimeout( function() {
10084								if ( callback ) {
10085									errorCallback();
10086								}
10087							} );
10088						}
10089					};
10090				}
10091
10092				// Create the abort callback
10093				callback = callback( "abort" );
10094
10095				try {
10096
10097					// Do send the request (this may raise an exception)
10098					xhr.send( options.hasContent && options.data || null );
10099				} catch ( e ) {
10100
10101					// #14683: Only rethrow if this hasn't been notified as an error yet
10102					if ( callback ) {
10103						throw e;
10104					}
10105				}
10106			},
10107
10108			abort: function() {
10109				if ( callback ) {
10110					callback();
10111				}
10112			}
10113		};
10114	}
10115} );
10116
10117
10118
10119
10120// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
10121jQuery.ajaxPrefilter( function( s ) {
10122	if ( s.crossDomain ) {
10123		s.contents.script = false;
10124	}
10125} );
10126
10127// Install script dataType
10128jQuery.ajaxSetup( {
10129	accepts: {
10130		script: "text/javascript, application/javascript, " +
10131			"application/ecmascript, application/x-ecmascript"
10132	},
10133	contents: {
10134		script: /\b(?:java|ecma)script\b/
10135	},
10136	converters: {
10137		"text script": function( text ) {
10138			jQuery.globalEval( text );
10139			return text;
10140		}
10141	}
10142} );
10143
10144// Handle cache's special case and crossDomain
10145jQuery.ajaxPrefilter( "script", function( s ) {
10146	if ( s.cache === undefined ) {
10147		s.cache = false;
10148	}
10149	if ( s.crossDomain ) {
10150		s.type = "GET";
10151	}
10152} );
10153
10154// Bind script tag hack transport
10155jQuery.ajaxTransport( "script", function( s ) {
10156
10157	// This transport only deals with cross domain or forced-by-attrs requests
10158	if ( s.crossDomain || s.scriptAttrs ) {
10159		var script, callback;
10160		return {
10161			send: function( _, complete ) {
10162				script = jQuery( "<script>" )
10163					.attr( s.scriptAttrs || {} )
10164					.prop( { charset: s.scriptCharset, src: s.url } )
10165					.on( "load error", callback = function( evt ) {
10166						script.remove();
10167						callback = null;
10168						if ( evt ) {
10169							complete( evt.type === "error" ? 404 : 200, evt.type );
10170						}
10171					} );
10172
10173				// Use native DOM manipulation to avoid our domManip AJAX trickery
10174				document.head.appendChild( script[ 0 ] );
10175			},
10176			abort: function() {
10177				if ( callback ) {
10178					callback();
10179				}
10180			}
10181		};
10182	}
10183} );
10184
10185
10186
10187
10188var oldCallbacks = [],
10189	rjsonp = /(=)\?(?=&|$)|\?\?/;
10190
10191// Default jsonp settings
10192jQuery.ajaxSetup( {
10193	jsonp: "callback",
10194	jsonpCallback: function() {
10195		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
10196		this[ callback ] = true;
10197		return callback;
10198	}
10199} );
10200
10201// Detect, normalize options and install callbacks for jsonp requests
10202jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
10203
10204	var callbackName, overwritten, responseContainer,
10205		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
10206			"url" :
10207			typeof s.data === "string" &&
10208				( s.contentType || "" )
10209					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
10210				rjsonp.test( s.data ) && "data"
10211		);
10212
10213	// Handle iff the expected data type is "jsonp" or we have a parameter to set
10214	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
10215
10216		// Get callback name, remembering preexisting value associated with it
10217		callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
10218			s.jsonpCallback() :
10219			s.jsonpCallback;
10220
10221		// Insert callback into url or form data
10222		if ( jsonProp ) {
10223			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
10224		} else if ( s.jsonp !== false ) {
10225			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
10226		}
10227
10228		// Use data converter to retrieve json after script execution
10229		s.converters[ "script json" ] = function() {
10230			if ( !responseContainer ) {
10231				jQuery.error( callbackName + " was not called" );
10232			}
10233			return responseContainer[ 0 ];
10234		};
10235
10236		// Force json dataType
10237		s.dataTypes[ 0 ] = "json";
10238
10239		// Install callback
10240		overwritten = window[ callbackName ];
10241		window[ callbackName ] = function() {
10242			responseContainer = arguments;
10243		};
10244
10245		// Clean-up function (fires after converters)
10246		jqXHR.always( function() {
10247
10248			// If previous value didn't exist - remove it
10249			if ( overwritten === undefined ) {
10250				jQuery( window ).removeProp( callbackName );
10251
10252			// Otherwise restore preexisting value
10253			} else {
10254				window[ callbackName ] = overwritten;
10255			}
10256
10257			// Save back as free
10258			if ( s[ callbackName ] ) {
10259
10260				// Make sure that re-using the options doesn't screw things around
10261				s.jsonpCallback = originalSettings.jsonpCallback;
10262
10263				// Save the callback name for future use
10264				oldCallbacks.push( callbackName );
10265			}
10266
10267			// Call if it was a function and we have a response
10268			if ( responseContainer && isFunction( overwritten ) ) {
10269				overwritten( responseContainer[ 0 ] );
10270			}
10271
10272			responseContainer = overwritten = undefined;
10273		} );
10274
10275		// Delegate to script
10276		return "script";
10277	}
10278} );
10279
10280
10281
10282
10283// Support: Safari 8 only
10284// In Safari 8 documents created via document.implementation.createHTMLDocument
10285// collapse sibling forms: the second one becomes a child of the first one.
10286// Because of that, this security measure has to be disabled in Safari 8.
10287// https://bugs.webkit.org/show_bug.cgi?id=137337
10288support.createHTMLDocument = ( function() {
10289	var body = document.implementation.createHTMLDocument( "" ).body;
10290	body.innerHTML = "<form></form><form></form>";
10291	return body.childNodes.length === 2;
10292} )();
10293
10294
10295// Argument "data" should be string of html
10296// context (optional): If specified, the fragment will be created in this context,
10297// defaults to document
10298// keepScripts (optional): If true, will include scripts passed in the html string
10299jQuery.parseHTML = function( data, context, keepScripts ) {
10300	if ( typeof data !== "string" ) {
10301		return [];
10302	}
10303	if ( typeof context === "boolean" ) {
10304		keepScripts = context;
10305		context = false;
10306	}
10307
10308	var base, parsed, scripts;
10309
10310	if ( !context ) {
10311
10312		// Stop scripts or inline event handlers from being executed immediately
10313		// by using document.implementation
10314		if ( support.createHTMLDocument ) {
10315			context = document.implementation.createHTMLDocument( "" );
10316
10317			// Set the base href for the created document
10318			// so any parsed elements with URLs
10319			// are based on the document's URL (gh-2965)
10320			base = context.createElement( "base" );
10321			base.href = document.location.href;
10322			context.head.appendChild( base );
10323		} else {
10324			context = document;
10325		}
10326	}
10327
10328	parsed = rsingleTag.exec( data );
10329	scripts = !keepScripts && [];
10330
10331	// Single tag
10332	if ( parsed ) {
10333		return [ context.createElement( parsed[ 1 ] ) ];
10334	}
10335
10336	parsed = buildFragment( [ data ], context, scripts );
10337
10338	if ( scripts && scripts.length ) {
10339		jQuery( scripts ).remove();
10340	}
10341
10342	return jQuery.merge( [], parsed.childNodes );
10343};
10344
10345
10346/**
10347 * Load a url into a page
10348 */
10349jQuery.fn.load = function( url, params, callback ) {
10350	var selector, type, response,
10351		self = this,
10352		off = url.indexOf( " " );
10353
10354	if ( off > -1 ) {
10355		selector = stripAndCollapse( url.slice( off ) );
10356		url = url.slice( 0, off );
10357	}
10358
10359	// If it's a function
10360	if ( isFunction( params ) ) {
10361
10362		// We assume that it's the callback
10363		callback = params;
10364		params = undefined;
10365
10366	// Otherwise, build a param string
10367	} else if ( params && typeof params === "object" ) {
10368		type = "POST";
10369	}
10370
10371	// If we have elements to modify, make the request
10372	if ( self.length > 0 ) {
10373		jQuery.ajax( {
10374			url: url,
10375
10376			// If "type" variable is undefined, then "GET" method will be used.
10377			// Make value of this field explicit since
10378			// user can override it through ajaxSetup method
10379			type: type || "GET",
10380			dataType: "html",
10381			data: params
10382		} ).done( function( responseText ) {
10383
10384			// Save response for use in complete callback
10385			response = arguments;
10386
10387			self.html( selector ?
10388
10389				// If a selector was specified, locate the right elements in a dummy div
10390				// Exclude scripts to avoid IE 'Permission Denied' errors
10391				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
10392
10393				// Otherwise use the full result
10394				responseText );
10395
10396		// If the request succeeds, this function gets "data", "status", "jqXHR"
10397		// but they are ignored because response was set above.
10398		// If it fails, this function gets "jqXHR", "status", "error"
10399		} ).always( callback && function( jqXHR, status ) {
10400			self.each( function() {
10401				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
10402			} );
10403		} );
10404	}
10405
10406	return this;
10407};
10408
10409
10410
10411
10412jQuery.expr.pseudos.animated = function( elem ) {
10413	return jQuery.grep( jQuery.timers, function( fn ) {
10414		return elem === fn.elem;
10415	} ).length;
10416};
10417
10418
10419
10420
10421jQuery.offset = {
10422	setOffset: function( elem, options, i ) {
10423		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
10424			position = jQuery.css( elem, "position" ),
10425			curElem = jQuery( elem ),
10426			props = {};
10427
10428		// Set position first, in-case top/left are set even on static elem
10429		if ( position === "static" ) {
10430			elem.style.position = "relative";
10431		}
10432
10433		curOffset = curElem.offset();
10434		curCSSTop = jQuery.css( elem, "top" );
10435		curCSSLeft = jQuery.css( elem, "left" );
10436		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
10437			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
10438
10439		// Need to be able to calculate position if either
10440		// top or left is auto and position is either absolute or fixed
10441		if ( calculatePosition ) {
10442			curPosition = curElem.position();
10443			curTop = curPosition.top;
10444			curLeft = curPosition.left;
10445
10446		} else {
10447			curTop = parseFloat( curCSSTop ) || 0;
10448			curLeft = parseFloat( curCSSLeft ) || 0;
10449		}
10450
10451		if ( isFunction( options ) ) {
10452
10453			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
10454			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
10455		}
10456
10457		if ( options.top != null ) {
10458			props.top = ( options.top - curOffset.top ) + curTop;
10459		}
10460		if ( options.left != null ) {
10461			props.left = ( options.left - curOffset.left ) + curLeft;
10462		}
10463
10464		if ( "using" in options ) {
10465			options.using.call( elem, props );
10466
10467		} else {
10468			
vendor: 2,160 bytes, lines 10468-10546
10468if ( typeof props.top === "number" ) {
10469				props.top += "px";
10470			}
10471			if ( typeof props.left === "number" ) {
10472				props.left += "px";
10473			}
10474			curElem.css( props );
10475		}
10476	}
10477};
10478
10479jQuery.fn.extend( {
10480
10481	// offset() relates an element's border box to the document origin
10482	offset: function( options ) {
10483
10484		// Preserve chaining for setter
10485		if ( arguments.length ) {
10486			return options === undefined ?
10487				this :
10488				this.each( function( i ) {
10489					jQuery.offset.setOffset( this, options, i );
10490				} );
10491		}
10492
10493		var rect, win,
10494			elem = this[ 0 ];
10495
10496		if ( !elem ) {
10497			return;
10498		}
10499
10500		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
10501		// Support: IE <=11 only
10502		// Running getBoundingClientRect on a
10503		// disconnected node in IE throws an error
10504		if ( !elem.getClientRects().length ) {
10505			return { top: 0, left: 0 };
10506		}
10507
10508		// Get document-relative position by adding viewport scroll to viewport-relative gBCR
10509		rect = elem.getBoundingClientRect();
10510		win = elem.ownerDocument.defaultView;
10511		return {
10512			top: rect.top + win.pageYOffset,
10513			left: rect.left + win.pageXOffset
10514		};
10515	},
10516
10517	// position() relates an element's margin box to its offset parent's padding box
10518	// This corresponds to the behavior of CSS absolute positioning
10519	position: function() {
10520		if ( !this[ 0 ] ) {
10521			return;
10522		}
10523
10524		var offsetParent, offset, doc,
10525			elem = this[ 0 ],
10526			parentOffset = { top: 0, left: 0 };
10527
10528		// position:fixed elements are offset from the viewport, which itself always has zero offset
10529		if ( jQuery.css( elem, "position" ) === "fixed" ) {
10530
10531			// Assume position:fixed implies availability of getBoundingClientRect
10532			offset = elem.getBoundingClientRect();
10533
10534		} else {
10535			offset = this.offset();
10536
10537			// Account for the *real* offset parent, which can be the document or its root element
10538			// when a statically positioned element is identified
10539			doc = elem.ownerDocument;
10540			offsetParent = elem.offsetParent || doc.documentElement;
10541			while ( offsetParent &&
10542				( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
10543				jQuery.css( offsetParent, "position" ) === "static" ) {
10544
10545				offsetParent = offsetParent.parentNode;
10546			}
vendor: 7,719 bytes, lines 10547-10812
10547			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
10548
10549				// Incorporate borders into its offset, since they are outside its content origin
10550				parentOffset = jQuery( offsetParent ).offset();
10551				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
10552				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
10553			}
10554		}
10555
10556		// Subtract parent offsets and element margins
10557		return {
10558			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
10559			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
10560		};
10561	},
10562
10563	// This method will return documentElement in the following cases:
10564	// 1) For the element inside the iframe without offsetParent, this method will return
10565	//    documentElement of the parent window
10566	// 2) For the hidden or detached element
10567	// 3) For body or html element, i.e. in case of the html node - it will return itself
10568	//
10569	// but those exceptions were never presented as a real life use-cases
10570	// and might be considered as more preferable results.
10571	//
10572	// This logic, however, is not guaranteed and can change at any point in the future
10573	offsetParent: function() {
10574		return this.map( function() {
10575			var offsetParent = this.offsetParent;
10576
10577			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
10578				offsetParent = offsetParent.offsetParent;
10579			}
10580
10581			return offsetParent || documentElement;
10582		} );
10583	}
10584} );
10585
10586// Create scrollLeft and scrollTop methods
10587jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
10588	var top = "pageYOffset" === prop;
10589
10590	jQuery.fn[ method ] = function( val ) {
10591		return access( this, function( elem, method, val ) {
10592
10593			// Coalesce documents and windows
10594			var win;
10595			if ( isWindow( elem ) ) {
10596				win = elem;
10597			} else if ( elem.nodeType === 9 ) {
10598				win = elem.defaultView;
10599			}
10600
10601			if ( val === undefined ) {
10602				return win ? win[ prop ] : elem[ method ];
10603			}
10604
10605			if ( win ) {
10606				win.scrollTo(
10607					!top ? val : win.pageXOffset,
10608					top ? val : win.pageYOffset
10609				);
10610
10611			} else {
10612				elem[ method ] = val;
10613			}
10614		}, method, val, arguments.length );
10615	};
10616} );
10617
10618// Support: Safari <=7 - 9.1, Chrome <=37 - 49
10619// Add the top/left cssHooks using jQuery.fn.position
10620// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10621// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
10622// getComputedStyle returns percent when specified for top/left/bottom/right;
10623// rather than make the css module depend on the offset module, just check for it here
10624jQuery.each( [ "top", "left" ], function( _i, prop ) {
10625	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10626		function( elem, computed ) {
10627			if ( computed ) {
10628				computed = curCSS( elem, prop );
10629
10630				// If curCSS returns percentage, fallback to offset
10631				return rnumnonpx.test( computed ) ?
10632					jQuery( elem ).position()[ prop ] + "px" :
10633					computed;
10634			}
10635		}
10636	);
10637} );
10638
10639
10640// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10641jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10642	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
10643		function( defaultExtra, funcName ) {
10644
10645		// Margin is only for outerHeight, outerWidth
10646		jQuery.fn[ funcName ] = function( margin, value ) {
10647			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
10648				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
10649
10650			return access( this, function( elem, type, value ) {
10651				var doc;
10652
10653				if ( isWindow( elem ) ) {
10654
10655					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
10656					return funcName.indexOf( "outer" ) === 0 ?
10657						elem[ "inner" + name ] :
10658						elem.document.documentElement[ "client" + name ];
10659				}
10660
10661				// Get document width or height
10662				if ( elem.nodeType === 9 ) {
10663					doc = elem.documentElement;
10664
10665					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
10666					// whichever is greatest
10667					return Math.max(
10668						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
10669						elem.body[ "offset" + name ], doc[ "offset" + name ],
10670						doc[ "client" + name ]
10671					);
10672				}
10673
10674				return value === undefined ?
10675
10676					// Get width or height on the element, requesting but not forcing parseFloat
10677					jQuery.css( elem, type, extra ) :
10678
10679					// Set width or height on the element
10680					jQuery.style( elem, type, value, extra );
10681			}, type, chainable ? margin : undefined, chainable );
10682		};
10683	} );
10684} );
10685
10686
10687jQuery.each( [
10688	"ajaxStart",
10689	"ajaxStop",
10690	"ajaxComplete",
10691	"ajaxError",
10692	"ajaxSuccess",
10693	"ajaxSend"
10694], function( _i, type ) {
10695	jQuery.fn[ type ] = function( fn ) {
10696		return this.on( type, fn );
10697	};
10698} );
10699
10700
10701
10702
10703jQuery.fn.extend( {
10704
10705	bind: function( types, data, fn ) {
10706		return this.on( types, null, data, fn );
10707	},
10708	unbind: function( types, fn ) {
10709		return this.off( types, null, fn );
10710	},
10711
10712	delegate: function( selector, types, data, fn ) {
10713		return this.on( types, selector, data, fn );
10714	},
10715	undelegate: function( selector, types, fn ) {
10716
10717		// ( namespace ) or ( selector, types [, fn] )
10718		return arguments.length === 1 ?
10719			this.off( selector, "**" ) :
10720			this.off( types, selector || "**", fn );
10721	},
10722
10723	hover: function( fnOver, fnOut ) {
10724		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
10725	}
10726} );
10727
10728jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
10729	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10730	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
10731	function( _i, name ) {
10732
10733		// Handle event binding
10734		jQuery.fn[ name ] = function( data, fn ) {
10735			return arguments.length > 0 ?
10736				this.on( name, null, data, fn ) :
10737				this.trigger( name );
10738		};
10739	} );
10740
10741
10742
10743
10744// Support: Android <=4.0 only
10745// Make sure we trim BOM and NBSP
10746var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
10747
10748// Bind a function to a context, optionally partially applying any
10749// arguments.
10750// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
10751// However, it is not slated for removal any time soon
10752jQuery.proxy = function( fn, context ) {
10753	var tmp, args, proxy;
10754
10755	if ( typeof context === "string" ) {
10756		tmp = fn[ context ];
10757		context = fn;
10758		fn = tmp;
10759	}
10760
10761	// Quick check to determine if target is callable, in the spec
10762	// this throws a TypeError, but we will just return undefined.
10763	if ( !isFunction( fn ) ) {
10764		return undefined;
10765	}
10766
10767	// Simulated bind
10768	args = slice.call( arguments, 2 );
10769	proxy = function() {
10770		return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
10771	};
10772
10773	// Set the guid of unique handler to the same of original handler, so it can be removed
10774	proxy.guid = fn.guid = fn.guid || jQuery.guid++;
10775
10776	return proxy;
10777};
10778
10779jQuery.holdReady = function( hold ) {
10780	if ( hold ) {
10781		jQuery.readyWait++;
10782	} else {
10783		jQuery.ready( true );
10784	}
10785};
10786jQuery.isArray = Array.isArray;
10787jQuery.parseJSON = JSON.parse;
10788jQuery.nodeName = nodeName;
10789jQuery.isFunction = isFunction;
10790jQuery.isWindow = isWindow;
10791jQuery.camelCase = camelCase;
10792jQuery.type = toType;
10793
10794jQuery.now = Date.now;
10795
10796jQuery.isNumeric = function( obj ) {
10797
10798	// As of jQuery 3.0, isNumeric is limited to
10799	// strings and numbers (primitives or objects)
10800	// that can be coerced to finite numbers (gh-2662)
10801	var type = jQuery.type( obj );
10802	return ( type === "number" || type === "string" ) &&
10803
10804		// parseFloat NaNs numeric-cast false positives ("")
10805		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
10806		// subtraction forces infinities to NaN
10807		!isNaN( obj - parseFloat( obj ) );
10808};
10809
10810jQuery.trim = function( text ) {
10811	return text == null ?
10812		"" :
10813		( text + "" ).replace( rtrim, "" );
10814};
10815
10816
10817
10818// Register as a named AMD module, since jQuery can be concatenated with other
10819// files that may use define, but not via a proper concatenation script that
10820// understands anonymous AMD modules. A named AMD is safest and most robust
10821// way to register. Lowercase jquery is used because AMD module names are
10822// derived from file names, and jQuery is normally delivered in a lowercase
10823// file name. Do this after creating the global so that if an AMD module wants
10824// to call noConflict to hide this version of jQuery, it will work.
10825
10826// Note that for maximum portability, libraries that are not jQuery should
10827// declare themselves as anonymous modules, and avoid setting a global if an
10828// AMD loader is present. jQuery is a special case. For more information, see
10829// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10830
10831if ( typeof define === "function" && define.amd ) {
10832	define( "jquery", [], function() {
10833		return jQuery;
10834	} );
10835}
10836
10837
10838
10839
10840var
10841
10842	// Map over jQuery in case of overwrite
10843	_jQuery = window.jQuery,
10844
10845	// Map over the $ in case of overwrite
10846	_$ = window.$;
10847
10848jQuery.noConflict = function( deep ) {
10849	if ( window.$ === jQuery ) {
10850		window.$ = _$;
10851	}
10852
10853	if ( deep && window.jQuery === jQuery ) {
10854		window.jQuery = _jQuery;
10855	}
10856
10857	return jQuery;
10858};
10859
10860// Expose jQuery and $ identifiers, even in AMD
10861// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10862// and CommonJS for browser emulators (#13566)
10863if ( typeof noGlobal === "undefined" ) {
10864	window.jQuery = window.$ = jQuery;
10865}
10866
10867
10868
10869
10870return jQuery;
10871} );

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.