tuiHoneyPot

front and back end of my TUI honeypot
Log | Files | Refs | README

jquery.js (285314B)


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