jquery-rails 4.3.5 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,15 +1,12 @@
1
1
  /*!
2
- * jQuery JavaScript Library v3.4.1
2
+ * jQuery JavaScript Library v3.7.0
3
3
  * https://jquery.com/
4
4
  *
5
- * Includes Sizzle.js
6
- * https://sizzlejs.com/
7
- *
8
- * Copyright JS Foundation and other contributors
5
+ * Copyright OpenJS Foundation and other contributors
9
6
  * Released under the MIT license
10
7
  * https://jquery.org/license
11
8
  *
12
- * Date: 2019-05-01T21:04Z
9
+ * Date: 2023-05-11T18:29Z
13
10
  */
14
11
  ( function( global, factory ) {
15
12
 
@@ -23,7 +20,7 @@
23
20
  // (such as Node.js), expose a factory as module.exports.
24
21
  // This accentuates the need for the creation of a real `window`.
25
22
  // e.g. var jQuery = require("jquery")(window);
26
- // See ticket #14549 for more info.
23
+ // See ticket trac-14549 for more info.
27
24
  module.exports = global.document ?
28
25
  factory( global, true ) :
29
26
  function( w ) {
@@ -47,13 +44,16 @@
47
44
 
48
45
  var arr = [];
49
46
 
50
- var document = window.document;
51
-
52
47
  var getProto = Object.getPrototypeOf;
53
48
 
54
49
  var slice = arr.slice;
55
50
 
56
- var concat = arr.concat;
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
57
 
58
58
  var push = arr.push;
59
59
 
@@ -73,12 +73,16 @@ var support = {};
73
73
 
74
74
  var isFunction = function isFunction( obj ) {
75
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
- return typeof obj === "function" && typeof obj.nodeType !== "number";
81
- };
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
+ };
82
86
 
83
87
 
84
88
  var isWindow = function isWindow( obj ) {
@@ -86,6 +90,8 @@ var isWindow = function isWindow( obj ) {
86
90
  };
87
91
 
88
92
 
93
+ var document = window.document;
94
+
89
95
 
90
96
 
91
97
  var preservedScriptAttributes = {
@@ -141,8 +147,9 @@ function toType( obj ) {
141
147
 
142
148
 
143
149
 
144
- var
145
- version = "3.4.1",
150
+ var version = "3.7.0",
151
+
152
+ rhtmlSuffix = /HTML$/i,
146
153
 
147
154
  // Define a local copy of jQuery
148
155
  jQuery = function( selector, context ) {
@@ -150,11 +157,7 @@ var
150
157
  // The jQuery object is actually just the init constructor 'enhanced'
151
158
  // Need init if jQuery is called (just allow error to be thrown if not included)
152
159
  return new jQuery.fn.init( selector, context );
153
- },
154
-
155
- // Support: Android <=4.0 only
156
- // Make sure we trim BOM and NBSP
157
- rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
160
+ };
158
161
 
159
162
  jQuery.fn = jQuery.prototype = {
160
163
 
@@ -220,6 +223,18 @@ jQuery.fn = jQuery.prototype = {
220
223
  return this.eq( -1 );
221
224
  },
222
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
+
223
238
  eq: function( i ) {
224
239
  var len = this.length,
225
240
  j = +i + ( i < 0 ? len : 0 );
@@ -353,9 +368,10 @@ jQuery.extend( {
353
368
  return true;
354
369
  },
355
370
 
356
- // Evaluates a script in a global context
357
- globalEval: function( code, options ) {
358
- DOMEval( code, { nonce: options && options.nonce } );
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 );
359
375
  },
360
376
 
361
377
  each: function( obj, callback ) {
@@ -379,11 +395,31 @@ jQuery.extend( {
379
395
  return obj;
380
396
  },
381
397
 
382
- // Support: Android <=4.0 only
383
- trim: function( text ) {
384
- return text == null ?
385
- "" :
386
- ( text + "" ).replace( rtrim, "" );
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
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
415
+ return elem.textContent;
416
+ } else if ( nodeType === 3 || nodeType === 4 ) {
417
+ return elem.nodeValue;
418
+ }
419
+
420
+ // Do not include comment or processing instruction nodes
421
+
422
+ return ret;
387
423
  },
388
424
 
389
425
  // results is for internal usage only
@@ -394,7 +430,7 @@ jQuery.extend( {
394
430
  if ( isArrayLike( Object( arr ) ) ) {
395
431
  jQuery.merge( ret,
396
432
  typeof arr === "string" ?
397
- [ arr ] : arr
433
+ [ arr ] : arr
398
434
  );
399
435
  } else {
400
436
  push.call( ret, arr );
@@ -408,6 +444,15 @@ jQuery.extend( {
408
444
  return arr == null ? -1 : indexOf.call( arr, elem, i );
409
445
  },
410
446
 
447
+ isXMLDoc: function( elem ) {
448
+ var namespace = elem && elem.namespaceURI,
449
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
450
+
451
+ // Assume HTML when documentElement doesn't yet exist, such as inside
452
+ // document fragments.
453
+ return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" );
454
+ },
455
+
411
456
  // Support: Android <=4.0 only, PhantomJS 1 only
412
457
  // push.apply(_, arraylike) throws on ancient WebKit
413
458
  merge: function( first, second ) {
@@ -472,7 +517,7 @@ jQuery.extend( {
472
517
  }
473
518
 
474
519
  // Flatten any nested arrays
475
- return concat.apply( [], ret );
520
+ return flat( ret );
476
521
  },
477
522
 
478
523
  // A global GUID counter for objects
@@ -489,9 +534,9 @@ if ( typeof Symbol === "function" ) {
489
534
 
490
535
  // Populate the class2type map
491
536
  jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
492
- function( i, name ) {
493
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
494
- } );
537
+ function( _i, name ) {
538
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
539
+ } );
495
540
 
496
541
  function isArrayLike( obj ) {
497
542
 
@@ -509,44 +554,98 @@ function isArrayLike( obj ) {
509
554
  return type === "array" || length === 0 ||
510
555
  typeof length === "number" && length > 0 && ( length - 1 ) in obj;
511
556
  }
512
- var Sizzle =
513
- /*!
514
- * Sizzle CSS Selector Engine v2.3.4
515
- * https://sizzlejs.com/
516
- *
517
- * Copyright JS Foundation and other contributors
518
- * Released under the MIT license
519
- * https://js.foundation/
520
- *
521
- * Date: 2019-04-08
522
- */
523
- (function( window ) {
557
+
558
+
559
+ function nodeName( elem, name ) {
560
+
561
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
562
+
563
+ }
564
+ var pop = arr.pop;
565
+
566
+
567
+ var sort = arr.sort;
568
+
569
+
570
+ var splice = arr.splice;
571
+
572
+
573
+ var whitespace = "[\\x20\\t\\r\\n\\f]";
574
+
575
+
576
+ var rtrimCSS = new RegExp(
577
+ "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$",
578
+ "g"
579
+ );
580
+
581
+
582
+
583
+
584
+ // Note: an element does not contain itself
585
+ jQuery.contains = function( a, b ) {
586
+ var bup = b && b.parentNode;
587
+
588
+ return a === bup || !!( bup && bup.nodeType === 1 && (
589
+
590
+ // Support: IE 9 - 11+
591
+ // IE doesn't have `contains` on SVG.
592
+ a.contains ?
593
+ a.contains( bup ) :
594
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
595
+ ) );
596
+ };
597
+
598
+
599
+
600
+
601
+ // CSS string/identifier serialization
602
+ // https://drafts.csswg.org/cssom/#common-serializing-idioms
603
+ var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
604
+
605
+ function fcssescape( ch, asCodePoint ) {
606
+ if ( asCodePoint ) {
607
+
608
+ // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
609
+ if ( ch === "\0" ) {
610
+ return "\uFFFD";
611
+ }
612
+
613
+ // Control characters and (dependent upon position) numbers get escaped as code points
614
+ return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
615
+ }
616
+
617
+ // Other potentially-special ASCII characters get backslash-escaped
618
+ return "\\" + ch;
619
+ }
620
+
621
+ jQuery.escapeSelector = function( sel ) {
622
+ return ( sel + "" ).replace( rcssescape, fcssescape );
623
+ };
624
+
625
+
626
+
627
+
628
+ var preferredDoc = document,
629
+ pushNative = push;
630
+
631
+ ( function() {
524
632
 
525
633
  var i,
526
- support,
527
634
  Expr,
528
- getText,
529
- isXML,
530
- tokenize,
531
- compile,
532
- select,
533
635
  outermostContext,
534
636
  sortInput,
535
637
  hasDuplicate,
638
+ push = pushNative,
536
639
 
537
640
  // Local document vars
538
- setDocument,
539
641
  document,
540
- docElem,
642
+ documentElement,
541
643
  documentIsHTML,
542
644
  rbuggyQSA,
543
- rbuggyMatches,
544
645
  matches,
545
- contains,
546
646
 
547
647
  // Instance-specific data
548
- expando = "sizzle" + 1 * new Date(),
549
- preferredDoc = window.document,
648
+ expando = jQuery.expando,
550
649
  dirruns = 0,
551
650
  done = 0,
552
651
  classCache = createCache(),
@@ -560,173 +659,145 @@ var i,
560
659
  return 0;
561
660
  },
562
661
 
563
- // Instance methods
564
- hasOwn = ({}).hasOwnProperty,
565
- arr = [],
566
- pop = arr.pop,
567
- push_native = arr.push,
568
- push = arr.push,
569
- slice = arr.slice,
570
- // Use a stripped-down indexOf as it's faster than native
571
- // https://jsperf.com/thor-indexof-vs-for/5
572
- indexOf = function( list, elem ) {
573
- var i = 0,
574
- len = list.length;
575
- for ( ; i < len; i++ ) {
576
- if ( list[i] === elem ) {
577
- return i;
578
- }
579
- }
580
- return -1;
581
- },
582
-
583
- booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
662
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" +
663
+ "loop|multiple|open|readonly|required|scoped",
584
664
 
585
665
  // Regular expressions
586
666
 
587
- // http://www.w3.org/TR/css3-selectors/#whitespace
588
- whitespace = "[\\x20\\t\\r\\n\\f]",
589
-
590
- // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
591
- identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
667
+ // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
668
+ identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
669
+ "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
592
670
 
593
- // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
671
+ // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors
594
672
  attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
673
+
595
674
  // Operator (capture 2)
596
675
  "*([*^$|!~]?=)" + whitespace +
676
+
597
677
  // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
598
- "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
599
- "*\\]",
678
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
679
+ whitespace + "*\\]",
600
680
 
601
681
  pseudos = ":(" + identifier + ")(?:\\((" +
682
+
602
683
  // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
603
684
  // 1. quoted (capture 3; capture 4 or capture 5)
604
685
  "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
686
+
605
687
  // 2. simple (capture 6)
606
688
  "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
689
+
607
690
  // 3. anything else (capture 2)
608
691
  ".*" +
609
692
  ")\\)|)",
610
693
 
611
694
  // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
612
695
  rwhitespace = new RegExp( whitespace + "+", "g" ),
613
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
614
696
 
615
697
  rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
616
- rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
698
+ rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" +
699
+ whitespace + "*" ),
617
700
  rdescend = new RegExp( whitespace + "|>" ),
618
701
 
619
702
  rpseudo = new RegExp( pseudos ),
620
703
  ridentifier = new RegExp( "^" + identifier + "$" ),
621
704
 
622
705
  matchExpr = {
623
- "ID": new RegExp( "^#(" + identifier + ")" ),
624
- "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
625
- "TAG": new RegExp( "^(" + identifier + "|[*])" ),
626
- "ATTR": new RegExp( "^" + attributes ),
627
- "PSEUDO": new RegExp( "^" + pseudos ),
628
- "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
629
- "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
630
- "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
631
- "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
706
+ ID: new RegExp( "^#(" + identifier + ")" ),
707
+ CLASS: new RegExp( "^\\.(" + identifier + ")" ),
708
+ TAG: new RegExp( "^(" + identifier + "|[*])" ),
709
+ ATTR: new RegExp( "^" + attributes ),
710
+ PSEUDO: new RegExp( "^" + pseudos ),
711
+ CHILD: new RegExp(
712
+ "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
713
+ whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
714
+ whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
715
+ bool: new RegExp( "^(?:" + booleans + ")$", "i" ),
716
+
632
717
  // For use in libraries implementing .is()
633
718
  // We use this for POS matching in `select`
634
- "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
635
- whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
719
+ needsContext: new RegExp( "^" + whitespace +
720
+ "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
721
+ "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
636
722
  },
637
723
 
638
- rhtml = /HTML$/i,
639
724
  rinputs = /^(?:input|select|textarea|button)$/i,
640
725
  rheader = /^h\d$/i,
641
726
 
642
- rnative = /^[^{]+\{\s*\[native \w/,
643
-
644
727
  // Easily-parseable/retrievable ID or TAG or CLASS selectors
645
728
  rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
646
729
 
647
730
  rsibling = /[+~]/,
648
731
 
649
732
  // CSS escapes
650
- // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
651
- runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
652
- funescape = function( _, escaped, escapedWhitespace ) {
653
- var high = "0x" + escaped - 0x10000;
654
- // NaN means non-codepoint
655
- // Support: Firefox<24
656
- // Workaround erroneous numeric interpretation of +"0x"
657
- return high !== high || escapedWhitespace ?
658
- escaped :
659
- high < 0 ?
660
- // BMP codepoint
661
- String.fromCharCode( high + 0x10000 ) :
662
- // Supplemental Plane codepoint (surrogate pair)
663
- String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
664
- },
733
+ // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters
734
+ runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace +
735
+ "?|\\\\([^\\r\\n\\f])", "g" ),
736
+ funescape = function( escape, nonHex ) {
737
+ var high = "0x" + escape.slice( 1 ) - 0x10000;
665
738
 
666
- // CSS string/identifier serialization
667
- // https://drafts.csswg.org/cssom/#common-serializing-idioms
668
- rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
669
- fcssescape = function( ch, asCodePoint ) {
670
- if ( asCodePoint ) {
739
+ if ( nonHex ) {
671
740
 
672
- // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
673
- if ( ch === "\0" ) {
674
- return "\uFFFD";
675
- }
676
-
677
- // Control characters and (dependent upon position) numbers get escaped as code points
678
- return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
741
+ // Strip the backslash prefix from a non-hex escape sequence
742
+ return nonHex;
679
743
  }
680
744
 
681
- // Other potentially-special ASCII characters get backslash-escaped
682
- return "\\" + ch;
745
+ // Replace a hexadecimal escape sequence with the encoded Unicode code point
746
+ // Support: IE <=11+
747
+ // For values outside the Basic Multilingual Plane (BMP), manually construct a
748
+ // surrogate pair
749
+ return high < 0 ?
750
+ String.fromCharCode( high + 0x10000 ) :
751
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
683
752
  },
684
753
 
685
- // Used for iframes
686
- // See setDocument()
754
+ // Used for iframes; see `setDocument`.
755
+ // Support: IE 9 - 11+, Edge 12 - 18+
687
756
  // Removing the function wrapper causes a "Permission Denied"
688
- // error in IE
757
+ // error in IE/Edge.
689
758
  unloadHandler = function() {
690
759
  setDocument();
691
760
  },
692
761
 
693
762
  inDisabledFieldset = addCombinator(
694
763
  function( elem ) {
695
- return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
764
+ return elem.disabled === true && nodeName( elem, "fieldset" );
696
765
  },
697
766
  { dir: "parentNode", next: "legend" }
698
767
  );
699
768
 
769
+ // Support: IE <=9 only
770
+ // Accessing document.activeElement can throw unexpectedly
771
+ // https://bugs.jquery.com/ticket/13393
772
+ function safeActiveElement() {
773
+ try {
774
+ return document.activeElement;
775
+ } catch ( err ) { }
776
+ }
777
+
700
778
  // Optimize for push.apply( _, NodeList )
701
779
  try {
702
780
  push.apply(
703
- (arr = slice.call( preferredDoc.childNodes )),
781
+ ( arr = slice.call( preferredDoc.childNodes ) ),
704
782
  preferredDoc.childNodes
705
783
  );
706
- // Support: Android<4.0
784
+
785
+ // Support: Android <=4.0
707
786
  // Detect silently failing push.apply
787
+ // eslint-disable-next-line no-unused-expressions
708
788
  arr[ preferredDoc.childNodes.length ].nodeType;
709
789
  } catch ( e ) {
710
- push = { apply: arr.length ?
711
-
712
- // Leverage slice if possible
713
- function( target, els ) {
714
- push_native.apply( target, slice.call(els) );
715
- } :
716
-
717
- // Support: IE<9
718
- // Otherwise append directly
719
- function( target, els ) {
720
- var j = target.length,
721
- i = 0;
722
- // Can't trust NodeList.length
723
- while ( (target[j++] = els[i++]) ) {}
724
- target.length = j - 1;
790
+ push = {
791
+ apply: function( target, els ) {
792
+ pushNative.apply( target, slice.call( els ) );
793
+ },
794
+ call: function( target ) {
795
+ pushNative.apply( target, slice.call( arguments, 1 ) );
725
796
  }
726
797
  };
727
798
  }
728
799
 
729
- function Sizzle( selector, context, results, seed ) {
800
+ function find( selector, context, results, seed ) {
730
801
  var m, i, elem, nid, match, groups, newSelector,
731
802
  newContext = context && context.ownerDocument,
732
803
 
@@ -744,30 +815,26 @@ function Sizzle( selector, context, results, seed ) {
744
815
 
745
816
  // Try to shortcut find operations (as opposed to filters) in HTML documents
746
817
  if ( !seed ) {
747
-
748
- if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
749
- setDocument( context );
750
- }
818
+ setDocument( context );
751
819
  context = context || document;
752
820
 
753
821
  if ( documentIsHTML ) {
754
822
 
755
823
  // If the selector is sufficiently simple, try using a "get*By*" DOM method
756
824
  // (excepting DocumentFragment context, where the methods don't exist)
757
- if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
825
+ if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
758
826
 
759
827
  // ID selector
760
- if ( (m = match[1]) ) {
828
+ if ( ( m = match[ 1 ] ) ) {
761
829
 
762
830
  // Document context
763
831
  if ( nodeType === 9 ) {
764
- if ( (elem = context.getElementById( m )) ) {
832
+ if ( ( elem = context.getElementById( m ) ) ) {
765
833
 
766
- // Support: IE, Opera, Webkit
767
- // TODO: identify versions
834
+ // Support: IE 9 only
768
835
  // getElementById can match elements by name instead of ID
769
836
  if ( elem.id === m ) {
770
- results.push( elem );
837
+ push.call( results, elem );
771
838
  return results;
772
839
  }
773
840
  } else {
@@ -777,40 +844,32 @@ function Sizzle( selector, context, results, seed ) {
777
844
  // Element context
778
845
  } else {
779
846
 
780
- // Support: IE, Opera, Webkit
781
- // TODO: identify versions
847
+ // Support: IE 9 only
782
848
  // getElementById can match elements by name instead of ID
783
- if ( newContext && (elem = newContext.getElementById( m )) &&
784
- contains( context, elem ) &&
849
+ if ( newContext && ( elem = newContext.getElementById( m ) ) &&
850
+ find.contains( context, elem ) &&
785
851
  elem.id === m ) {
786
852
 
787
- results.push( elem );
853
+ push.call( results, elem );
788
854
  return results;
789
855
  }
790
856
  }
791
857
 
792
858
  // Type selector
793
- } else if ( match[2] ) {
859
+ } else if ( match[ 2 ] ) {
794
860
  push.apply( results, context.getElementsByTagName( selector ) );
795
861
  return results;
796
862
 
797
863
  // Class selector
798
- } else if ( (m = match[3]) && support.getElementsByClassName &&
799
- context.getElementsByClassName ) {
800
-
864
+ } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) {
801
865
  push.apply( results, context.getElementsByClassName( m ) );
802
866
  return results;
803
867
  }
804
868
  }
805
869
 
806
870
  // Take advantage of querySelectorAll
807
- if ( support.qsa &&
808
- !nonnativeSelectorCache[ selector + " " ] &&
809
- (!rbuggyQSA || !rbuggyQSA.test( selector )) &&
810
-
811
- // Support: IE 8 only
812
- // Exclude object elements
813
- (nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) {
871
+ if ( !nonnativeSelectorCache[ selector + " " ] &&
872
+ ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) {
814
873
 
815
874
  newSelector = selector;
816
875
  newContext = context;
@@ -819,27 +878,40 @@ function Sizzle( selector, context, results, seed ) {
819
878
  // descendant combinators, which is not what we want.
820
879
  // In such cases, we work around the behavior by prefixing every selector in the
821
880
  // list with an ID selector referencing the scope context.
881
+ // The technique has to be used as well when a leading combinator is used
882
+ // as such selectors are not recognized by querySelectorAll.
822
883
  // Thanks to Andrew Dupont for this technique.
823
- if ( nodeType === 1 && rdescend.test( selector ) ) {
884
+ if ( nodeType === 1 &&
885
+ ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {
824
886
 
825
- // Capture the context ID, setting it first if necessary
826
- if ( (nid = context.getAttribute( "id" )) ) {
827
- nid = nid.replace( rcssescape, fcssescape );
828
- } else {
829
- context.setAttribute( "id", (nid = expando) );
887
+ // Expand context for sibling selectors
888
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
889
+ context;
890
+
891
+ // We can use :scope instead of the ID hack if the browser
892
+ // supports it & if we're not changing the context.
893
+ // Support: IE 11+, Edge 17 - 18+
894
+ // IE/Edge sometimes throw a "Permission denied" error when
895
+ // strict-comparing two documents; shallow comparisons work.
896
+ // eslint-disable-next-line eqeqeq
897
+ if ( newContext != context || !support.scope ) {
898
+
899
+ // Capture the context ID, setting it first if necessary
900
+ if ( ( nid = context.getAttribute( "id" ) ) ) {
901
+ nid = jQuery.escapeSelector( nid );
902
+ } else {
903
+ context.setAttribute( "id", ( nid = expando ) );
904
+ }
830
905
  }
831
906
 
832
907
  // Prefix every selector in the list
833
908
  groups = tokenize( selector );
834
909
  i = groups.length;
835
910
  while ( i-- ) {
836
- groups[i] = "#" + nid + " " + toSelector( groups[i] );
911
+ groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
912
+ toSelector( groups[ i ] );
837
913
  }
838
914
  newSelector = groups.join( "," );
839
-
840
- // Expand context for sibling selectors
841
- newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
842
- context;
843
915
  }
844
916
 
845
917
  try {
@@ -859,7 +931,7 @@ function Sizzle( selector, context, results, seed ) {
859
931
  }
860
932
 
861
933
  // All others
862
- return select( selector.replace( rtrim, "$1" ), context, results, seed );
934
+ return select( selector.replace( rtrimCSS, "$1" ), context, results, seed );
863
935
  }
864
936
 
865
937
  /**
@@ -872,18 +944,21 @@ function createCache() {
872
944
  var keys = [];
873
945
 
874
946
  function cache( key, value ) {
875
- // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
947
+
948
+ // Use (key + " ") to avoid collision with native prototype properties
949
+ // (see https://github.com/jquery/sizzle/issues/157)
876
950
  if ( keys.push( key + " " ) > Expr.cacheLength ) {
951
+
877
952
  // Only keep the most recent entries
878
953
  delete cache[ keys.shift() ];
879
954
  }
880
- return (cache[ key + " " ] = value);
955
+ return ( cache[ key + " " ] = value );
881
956
  }
882
957
  return cache;
883
958
  }
884
959
 
885
960
  /**
886
- * Mark a function for special use by Sizzle
961
+ * Mark a function for special use by jQuery selector module
887
962
  * @param {Function} fn The function to mark
888
963
  */
889
964
  function markFunction( fn ) {
@@ -896,72 +971,31 @@ function markFunction( fn ) {
896
971
  * @param {Function} fn Passed the created element and returns a boolean result
897
972
  */
898
973
  function assert( fn ) {
899
- var el = document.createElement("fieldset");
974
+ var el = document.createElement( "fieldset" );
900
975
 
901
976
  try {
902
977
  return !!fn( el );
903
- } catch (e) {
978
+ } catch ( e ) {
904
979
  return false;
905
980
  } finally {
981
+
906
982
  // Remove from its parent by default
907
983
  if ( el.parentNode ) {
908
984
  el.parentNode.removeChild( el );
909
985
  }
986
+
910
987
  // release memory in IE
911
988
  el = null;
912
989
  }
913
990
  }
914
991
 
915
- /**
916
- * Adds the same handler for all of the specified attrs
917
- * @param {String} attrs Pipe-separated list of attributes
918
- * @param {Function} handler The method that will be applied
919
- */
920
- function addHandle( attrs, handler ) {
921
- var arr = attrs.split("|"),
922
- i = arr.length;
923
-
924
- while ( i-- ) {
925
- Expr.attrHandle[ arr[i] ] = handler;
926
- }
927
- }
928
-
929
- /**
930
- * Checks document order of two siblings
931
- * @param {Element} a
932
- * @param {Element} b
933
- * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
934
- */
935
- function siblingCheck( a, b ) {
936
- var cur = b && a,
937
- diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
938
- a.sourceIndex - b.sourceIndex;
939
-
940
- // Use IE sourceIndex if available on both nodes
941
- if ( diff ) {
942
- return diff;
943
- }
944
-
945
- // Check if b follows a
946
- if ( cur ) {
947
- while ( (cur = cur.nextSibling) ) {
948
- if ( cur === b ) {
949
- return -1;
950
- }
951
- }
952
- }
953
-
954
- return a ? 1 : -1;
955
- }
956
-
957
992
  /**
958
993
  * Returns a function to use in pseudos for input types
959
994
  * @param {String} type
960
995
  */
961
996
  function createInputPseudo( type ) {
962
997
  return function( elem ) {
963
- var name = elem.nodeName.toLowerCase();
964
- return name === "input" && elem.type === type;
998
+ return nodeName( elem, "input" ) && elem.type === type;
965
999
  };
966
1000
  }
967
1001
 
@@ -971,8 +1005,8 @@ function createInputPseudo( type ) {
971
1005
  */
972
1006
  function createButtonPseudo( type ) {
973
1007
  return function( elem ) {
974
- var name = elem.nodeName.toLowerCase();
975
- return (name === "input" || name === "button") && elem.type === type;
1008
+ return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) &&
1009
+ elem.type === type;
976
1010
  };
977
1011
  }
978
1012
 
@@ -1008,12 +1042,11 @@ function createDisabledPseudo( disabled ) {
1008
1042
  }
1009
1043
  }
1010
1044
 
1011
- // Support: IE 6 - 11
1045
+ // Support: IE 6 - 11+
1012
1046
  // Use the isDisabled shortcut property to check for disabled fieldset ancestors
1013
1047
  return elem.isDisabled === disabled ||
1014
1048
 
1015
1049
  // Where there is no isDisabled, check manually
1016
- /* jshint -W018 */
1017
1050
  elem.isDisabled !== !disabled &&
1018
1051
  inDisabledFieldset( elem ) === disabled;
1019
1052
  }
@@ -1037,25 +1070,25 @@ function createDisabledPseudo( disabled ) {
1037
1070
  * @param {Function} fn
1038
1071
  */
1039
1072
  function createPositionalPseudo( fn ) {
1040
- return markFunction(function( argument ) {
1073
+ return markFunction( function( argument ) {
1041
1074
  argument = +argument;
1042
- return markFunction(function( seed, matches ) {
1075
+ return markFunction( function( seed, matches ) {
1043
1076
  var j,
1044
1077
  matchIndexes = fn( [], seed.length, argument ),
1045
1078
  i = matchIndexes.length;
1046
1079
 
1047
1080
  // Match elements found at the specified indexes
1048
1081
  while ( i-- ) {
1049
- if ( seed[ (j = matchIndexes[i]) ] ) {
1050
- seed[j] = !(matches[j] = seed[j]);
1082
+ if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
1083
+ seed[ j ] = !( matches[ j ] = seed[ j ] );
1051
1084
  }
1052
1085
  }
1053
- });
1054
- });
1086
+ } );
1087
+ } );
1055
1088
  }
1056
1089
 
1057
1090
  /**
1058
- * Checks a node for validity as a Sizzle context
1091
+ * Checks a node for validity as a jQuery selector context
1059
1092
  * @param {Element|Object=} context
1060
1093
  * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1061
1094
  */
@@ -1063,117 +1096,116 @@ function testContext( context ) {
1063
1096
  return context && typeof context.getElementsByTagName !== "undefined" && context;
1064
1097
  }
1065
1098
 
1066
- // Expose support vars for convenience
1067
- support = Sizzle.support = {};
1068
-
1069
- /**
1070
- * Detects XML nodes
1071
- * @param {Element|Object} elem An element or a document
1072
- * @returns {Boolean} True iff elem is a non-HTML XML node
1073
- */
1074
- isXML = Sizzle.isXML = function( elem ) {
1075
- var namespace = elem.namespaceURI,
1076
- docElem = (elem.ownerDocument || elem).documentElement;
1077
-
1078
- // Support: IE <=8
1079
- // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
1080
- // https://bugs.jquery.com/ticket/4833
1081
- return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
1082
- };
1083
-
1084
1099
  /**
1085
1100
  * Sets document-related variables once based on the current document
1086
- * @param {Element|Object} [doc] An element or document object to use to set the document
1101
+ * @param {Element|Object} [node] An element or document object to use to set the document
1087
1102
  * @returns {Object} Returns the current document
1088
1103
  */
1089
- setDocument = Sizzle.setDocument = function( node ) {
1090
- var hasCompare, subWindow,
1104
+ function setDocument( node ) {
1105
+ var subWindow,
1091
1106
  doc = node ? node.ownerDocument || node : preferredDoc;
1092
1107
 
1093
1108
  // Return early if doc is invalid or already selected
1094
- if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1109
+ // Support: IE 11+, Edge 17 - 18+
1110
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1111
+ // two documents; shallow comparisons work.
1112
+ // eslint-disable-next-line eqeqeq
1113
+ if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
1095
1114
  return document;
1096
1115
  }
1097
1116
 
1098
1117
  // Update global variables
1099
1118
  document = doc;
1100
- docElem = document.documentElement;
1101
- documentIsHTML = !isXML( document );
1119
+ documentElement = document.documentElement;
1120
+ documentIsHTML = !jQuery.isXMLDoc( document );
1102
1121
 
1103
- // Support: IE 9-11, Edge
1104
- // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1105
- if ( preferredDoc !== document &&
1106
- (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
1122
+ // Support: iOS 7 only, IE 9 - 11+
1123
+ // Older browsers didn't support unprefixed `matches`.
1124
+ matches = documentElement.matches ||
1125
+ documentElement.webkitMatchesSelector ||
1126
+ documentElement.msMatchesSelector;
1107
1127
 
1108
- // Support: IE 11, Edge
1109
- if ( subWindow.addEventListener ) {
1110
- subWindow.addEventListener( "unload", unloadHandler, false );
1128
+ // Support: IE 9 - 11+, Edge 12 - 18+
1129
+ // Accessing iframe documents after unload throws "permission denied" errors (see trac-13936)
1130
+ // Support: IE 11+, Edge 17 - 18+
1131
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1132
+ // two documents; shallow comparisons work.
1133
+ // eslint-disable-next-line eqeqeq
1134
+ if ( preferredDoc != document &&
1135
+ ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
1111
1136
 
1112
- // Support: IE 9 - 10 only
1113
- } else if ( subWindow.attachEvent ) {
1114
- subWindow.attachEvent( "onunload", unloadHandler );
1115
- }
1137
+ // Support: IE 9 - 11+, Edge 12 - 18+
1138
+ subWindow.addEventListener( "unload", unloadHandler );
1116
1139
  }
1117
1140
 
1118
- /* Attributes
1119
- ---------------------------------------------------------------------- */
1120
-
1121
- // Support: IE<8
1122
- // Verify that getAttribute really returns attributes and not properties
1123
- // (excepting IE8 booleans)
1124
- support.attributes = assert(function( el ) {
1125
- el.className = "i";
1126
- return !el.getAttribute("className");
1127
- });
1128
-
1129
- /* getElement(s)By*
1130
- ---------------------------------------------------------------------- */
1131
-
1132
- // Check if getElementsByTagName("*") returns only elements
1133
- support.getElementsByTagName = assert(function( el ) {
1134
- el.appendChild( document.createComment("") );
1135
- return !el.getElementsByTagName("*").length;
1136
- });
1137
-
1138
- // Support: IE<9
1139
- support.getElementsByClassName = rnative.test( document.getElementsByClassName );
1140
-
1141
- // Support: IE<10
1141
+ // Support: IE <10
1142
1142
  // Check if getElementById returns elements by name
1143
1143
  // The broken getElementById methods don't pick up programmatically-set names,
1144
1144
  // so use a roundabout getElementsByName test
1145
- support.getById = assert(function( el ) {
1146
- docElem.appendChild( el ).id = expando;
1147
- return !document.getElementsByName || !document.getElementsByName( expando ).length;
1148
- });
1145
+ support.getById = assert( function( el ) {
1146
+ documentElement.appendChild( el ).id = jQuery.expando;
1147
+ return !document.getElementsByName ||
1148
+ !document.getElementsByName( jQuery.expando ).length;
1149
+ } );
1150
+
1151
+ // Support: IE 9 only
1152
+ // Check to see if it's possible to do matchesSelector
1153
+ // on a disconnected node.
1154
+ support.disconnectedMatch = assert( function( el ) {
1155
+ return matches.call( el, "*" );
1156
+ } );
1157
+
1158
+ // Support: IE 9 - 11+, Edge 12 - 18+
1159
+ // IE/Edge don't support the :scope pseudo-class.
1160
+ support.scope = assert( function() {
1161
+ return document.querySelectorAll( ":scope" );
1162
+ } );
1163
+
1164
+ // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only
1165
+ // Make sure the `:has()` argument is parsed unforgivingly.
1166
+ // We include `*` in the test to detect buggy implementations that are
1167
+ // _selectively_ forgiving (specifically when the list includes at least
1168
+ // one valid selector).
1169
+ // Note that we treat complete lack of support for `:has()` as if it were
1170
+ // spec-compliant support, which is fine because use of `:has()` in such
1171
+ // environments will fail in the qSA path and fall back to jQuery traversal
1172
+ // anyway.
1173
+ support.cssHas = assert( function() {
1174
+ try {
1175
+ document.querySelector( ":has(*,:jqfake)" );
1176
+ return false;
1177
+ } catch ( e ) {
1178
+ return true;
1179
+ }
1180
+ } );
1149
1181
 
1150
1182
  // ID filter and find
1151
1183
  if ( support.getById ) {
1152
- Expr.filter["ID"] = function( id ) {
1184
+ Expr.filter.ID = function( id ) {
1153
1185
  var attrId = id.replace( runescape, funescape );
1154
1186
  return function( elem ) {
1155
- return elem.getAttribute("id") === attrId;
1187
+ return elem.getAttribute( "id" ) === attrId;
1156
1188
  };
1157
1189
  };
1158
- Expr.find["ID"] = function( id, context ) {
1190
+ Expr.find.ID = function( id, context ) {
1159
1191
  if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1160
1192
  var elem = context.getElementById( id );
1161
1193
  return elem ? [ elem ] : [];
1162
1194
  }
1163
1195
  };
1164
1196
  } else {
1165
- Expr.filter["ID"] = function( id ) {
1197
+ Expr.filter.ID = function( id ) {
1166
1198
  var attrId = id.replace( runescape, funescape );
1167
1199
  return function( elem ) {
1168
1200
  var node = typeof elem.getAttributeNode !== "undefined" &&
1169
- elem.getAttributeNode("id");
1201
+ elem.getAttributeNode( "id" );
1170
1202
  return node && node.value === attrId;
1171
1203
  };
1172
1204
  };
1173
1205
 
1174
1206
  // Support: IE 6 - 7 only
1175
1207
  // getElementById is not reliable as a find shortcut
1176
- Expr.find["ID"] = function( id, context ) {
1208
+ Expr.find.ID = function( id, context ) {
1177
1209
  if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1178
1210
  var node, i, elems,
1179
1211
  elem = context.getElementById( id );
@@ -1181,7 +1213,7 @@ setDocument = Sizzle.setDocument = function( node ) {
1181
1213
  if ( elem ) {
1182
1214
 
1183
1215
  // Verify the id attribute
1184
- node = elem.getAttributeNode("id");
1216
+ node = elem.getAttributeNode( "id" );
1185
1217
  if ( node && node.value === id ) {
1186
1218
  return [ elem ];
1187
1219
  }
@@ -1189,8 +1221,8 @@ setDocument = Sizzle.setDocument = function( node ) {
1189
1221
  // Fall back on getElementsByName
1190
1222
  elems = context.getElementsByName( id );
1191
1223
  i = 0;
1192
- while ( (elem = elems[i++]) ) {
1193
- node = elem.getAttributeNode("id");
1224
+ while ( ( elem = elems[ i++ ] ) ) {
1225
+ node = elem.getAttributeNode( "id" );
1194
1226
  if ( node && node.value === id ) {
1195
1227
  return [ elem ];
1196
1228
  }
@@ -1203,39 +1235,18 @@ setDocument = Sizzle.setDocument = function( node ) {
1203
1235
  }
1204
1236
 
1205
1237
  // Tag
1206
- Expr.find["TAG"] = support.getElementsByTagName ?
1207
- function( tag, context ) {
1208
- if ( typeof context.getElementsByTagName !== "undefined" ) {
1209
- return context.getElementsByTagName( tag );
1210
-
1211
- // DocumentFragment nodes don't have gEBTN
1212
- } else if ( support.qsa ) {
1213
- return context.querySelectorAll( tag );
1214
- }
1215
- } :
1238
+ Expr.find.TAG = function( tag, context ) {
1239
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
1240
+ return context.getElementsByTagName( tag );
1216
1241
 
1217
- function( tag, context ) {
1218
- var elem,
1219
- tmp = [],
1220
- i = 0,
1221
- // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1222
- results = context.getElementsByTagName( tag );
1223
-
1224
- // Filter out possible comments
1225
- if ( tag === "*" ) {
1226
- while ( (elem = results[i++]) ) {
1227
- if ( elem.nodeType === 1 ) {
1228
- tmp.push( elem );
1229
- }
1230
- }
1231
-
1232
- return tmp;
1233
- }
1234
- return results;
1235
- };
1242
+ // DocumentFragment nodes don't have gEBTN
1243
+ } else {
1244
+ return context.querySelectorAll( tag );
1245
+ }
1246
+ };
1236
1247
 
1237
1248
  // Class
1238
- Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1249
+ Expr.find.CLASS = function( className, context ) {
1239
1250
  if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1240
1251
  return context.getElementsByClassName( className );
1241
1252
  }
@@ -1246,153 +1257,94 @@ setDocument = Sizzle.setDocument = function( node ) {
1246
1257
 
1247
1258
  // QSA and matchesSelector support
1248
1259
 
1249
- // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1250
- rbuggyMatches = [];
1251
-
1252
- // qSa(:focus) reports false when true (Chrome 21)
1253
- // We allow this because of a bug in IE8/9 that throws an error
1254
- // whenever `document.activeElement` is accessed on an iframe
1255
- // So, we allow :focus to pass through QSA all the time to avoid the IE error
1256
- // See https://bugs.jquery.com/ticket/13378
1257
1260
  rbuggyQSA = [];
1258
1261
 
1259
- if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
1260
- // Build QSA regex
1261
- // Regex strategy adopted from Diego Perini
1262
- assert(function( el ) {
1263
- // Select is set to empty string on purpose
1264
- // This is to test IE's treatment of not explicitly
1265
- // setting a boolean content attribute,
1266
- // since its presence should be enough
1267
- // https://bugs.jquery.com/ticket/12359
1268
- docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
1269
- "<select id='" + expando + "-\r\\' msallowcapture=''>" +
1270
- "<option selected=''></option></select>";
1271
-
1272
- // Support: IE8, Opera 11-12.16
1273
- // Nothing should be selected when empty strings follow ^= or $= or *=
1274
- // The test attribute must be unknown in Opera but "safe" for WinRT
1275
- // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1276
- if ( el.querySelectorAll("[msallowcapture^='']").length ) {
1277
- rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1278
- }
1279
-
1280
- // Support: IE8
1281
- // Boolean attributes and "value" are not treated correctly
1282
- if ( !el.querySelectorAll("[selected]").length ) {
1283
- rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1284
- }
1285
-
1286
- // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1287
- if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1288
- rbuggyQSA.push("~=");
1289
- }
1290
-
1291
- // Webkit/Opera - :checked should return selected option elements
1292
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1293
- // IE8 throws error here and will not see later tests
1294
- if ( !el.querySelectorAll(":checked").length ) {
1295
- rbuggyQSA.push(":checked");
1296
- }
1297
-
1298
- // Support: Safari 8+, iOS 8+
1299
- // https://bugs.webkit.org/show_bug.cgi?id=136851
1300
- // In-page `selector#id sibling-combinator selector` fails
1301
- if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1302
- rbuggyQSA.push(".#.+[+~]");
1303
- }
1304
- });
1262
+ // Build QSA regex
1263
+ // Regex strategy adopted from Diego Perini
1264
+ assert( function( el ) {
1305
1265
 
1306
- assert(function( el ) {
1307
- el.innerHTML = "<a href='' disabled='disabled'></a>" +
1308
- "<select disabled='disabled'><option/></select>";
1266
+ var input;
1309
1267
 
1310
- // Support: Windows 8 Native Apps
1311
- // The type and name attributes are restricted during .innerHTML assignment
1312
- var input = document.createElement("input");
1313
- input.setAttribute( "type", "hidden" );
1314
- el.appendChild( input ).setAttribute( "name", "D" );
1268
+ documentElement.appendChild( el ).innerHTML =
1269
+ "<a id='" + expando + "' href='' disabled='disabled'></a>" +
1270
+ "<select id='" + expando + "-\r\\' disabled='disabled'>" +
1271
+ "<option selected=''></option></select>";
1315
1272
 
1316
- // Support: IE8
1317
- // Enforce case-sensitivity of name attribute
1318
- if ( el.querySelectorAll("[name=d]").length ) {
1319
- rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1320
- }
1273
+ // Support: iOS <=7 - 8 only
1274
+ // Boolean attributes and "value" are not treated correctly in some XML documents
1275
+ if ( !el.querySelectorAll( "[selected]" ).length ) {
1276
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1277
+ }
1321
1278
 
1322
- // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1323
- // IE8 throws error here and will not see later tests
1324
- if ( el.querySelectorAll(":enabled").length !== 2 ) {
1325
- rbuggyQSA.push( ":enabled", ":disabled" );
1326
- }
1279
+ // Support: iOS <=7 - 8 only
1280
+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1281
+ rbuggyQSA.push( "~=" );
1282
+ }
1327
1283
 
1328
- // Support: IE9-11+
1329
- // IE's :disabled selector does not pick up the children of disabled fieldsets
1330
- docElem.appendChild( el ).disabled = true;
1331
- if ( el.querySelectorAll(":disabled").length !== 2 ) {
1332
- rbuggyQSA.push( ":enabled", ":disabled" );
1333
- }
1284
+ // Support: iOS 8 only
1285
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
1286
+ // In-page `selector#id sibling-combinator selector` fails
1287
+ if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1288
+ rbuggyQSA.push( ".#.+[+~]" );
1289
+ }
1334
1290
 
1335
- // Opera 10-11 does not throw on post-comma invalid pseudos
1336
- el.querySelectorAll("*,:x");
1337
- rbuggyQSA.push(",.*:");
1338
- });
1339
- }
1291
+ // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
1292
+ // In some of the document kinds, these selectors wouldn't work natively.
1293
+ // This is probably OK but for backwards compatibility we want to maintain
1294
+ // handling them through jQuery traversal in jQuery 3.x.
1295
+ if ( !el.querySelectorAll( ":checked" ).length ) {
1296
+ rbuggyQSA.push( ":checked" );
1297
+ }
1340
1298
 
1341
- if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1342
- docElem.webkitMatchesSelector ||
1343
- docElem.mozMatchesSelector ||
1344
- docElem.oMatchesSelector ||
1345
- docElem.msMatchesSelector) )) ) {
1299
+ // Support: Windows 8 Native Apps
1300
+ // The type and name attributes are restricted during .innerHTML assignment
1301
+ input = document.createElement( "input" );
1302
+ input.setAttribute( "type", "hidden" );
1303
+ el.appendChild( input ).setAttribute( "name", "D" );
1304
+
1305
+ // Support: IE 9 - 11+
1306
+ // IE's :disabled selector does not pick up the children of disabled fieldsets
1307
+ // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
1308
+ // In some of the document kinds, these selectors wouldn't work natively.
1309
+ // This is probably OK but for backwards compatibility we want to maintain
1310
+ // handling them through jQuery traversal in jQuery 3.x.
1311
+ documentElement.appendChild( el ).disabled = true;
1312
+ if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
1313
+ rbuggyQSA.push( ":enabled", ":disabled" );
1314
+ }
1315
+
1316
+ // Support: IE 11+, Edge 15 - 18+
1317
+ // IE 11/Edge don't find elements on a `[name='']` query in some cases.
1318
+ // Adding a temporary attribute to the document before the selection works
1319
+ // around the issue.
1320
+ // Interestingly, IE 10 & older don't seem to have the issue.
1321
+ input = document.createElement( "input" );
1322
+ input.setAttribute( "name", "" );
1323
+ el.appendChild( input );
1324
+ if ( !el.querySelectorAll( "[name='']" ).length ) {
1325
+ rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
1326
+ whitespace + "*(?:''|\"\")" );
1327
+ }
1328
+ } );
1346
1329
 
1347
- assert(function( el ) {
1348
- // Check to see if it's possible to do matchesSelector
1349
- // on a disconnected node (IE 9)
1350
- support.disconnectedMatch = matches.call( el, "*" );
1330
+ if ( !support.cssHas ) {
1351
1331
 
1352
- // This should fail with an exception
1353
- // Gecko does not error, returns false instead
1354
- matches.call( el, "[s!='']:x" );
1355
- rbuggyMatches.push( "!=", pseudos );
1356
- });
1332
+ // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+
1333
+ // Our regular `try-catch` mechanism fails to detect natively-unsupported
1334
+ // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`)
1335
+ // in browsers that parse the `:has()` argument as a forgiving selector list.
1336
+ // https://drafts.csswg.org/selectors/#relational now requires the argument
1337
+ // to be parsed unforgivingly, but browsers have not yet fully adjusted.
1338
+ rbuggyQSA.push( ":has" );
1357
1339
  }
1358
1340
 
1359
- rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1360
- rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1361
-
1362
- /* Contains
1363
- ---------------------------------------------------------------------- */
1364
- hasCompare = rnative.test( docElem.compareDocumentPosition );
1365
-
1366
- // Element contains another
1367
- // Purposefully self-exclusive
1368
- // As in, an element does not contain itself
1369
- contains = hasCompare || rnative.test( docElem.contains ) ?
1370
- function( a, b ) {
1371
- var adown = a.nodeType === 9 ? a.documentElement : a,
1372
- bup = b && b.parentNode;
1373
- return a === bup || !!( bup && bup.nodeType === 1 && (
1374
- adown.contains ?
1375
- adown.contains( bup ) :
1376
- a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1377
- ));
1378
- } :
1379
- function( a, b ) {
1380
- if ( b ) {
1381
- while ( (b = b.parentNode) ) {
1382
- if ( b === a ) {
1383
- return true;
1384
- }
1385
- }
1386
- }
1387
- return false;
1388
- };
1341
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
1389
1342
 
1390
1343
  /* Sorting
1391
1344
  ---------------------------------------------------------------------- */
1392
1345
 
1393
1346
  // Document order sorting
1394
- sortOrder = hasCompare ?
1395
- function( a, b ) {
1347
+ sortOrder = function( a, b ) {
1396
1348
 
1397
1349
  // Flag for duplicate removal
1398
1350
  if ( a === b ) {
@@ -1407,7 +1359,11 @@ setDocument = Sizzle.setDocument = function( node ) {
1407
1359
  }
1408
1360
 
1409
1361
  // Calculate position if both inputs belong to the same document
1410
- compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1362
+ // Support: IE 11+, Edge 17 - 18+
1363
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1364
+ // two documents; shallow comparisons work.
1365
+ // eslint-disable-next-line eqeqeq
1366
+ compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
1411
1367
  a.compareDocumentPosition( b ) :
1412
1368
 
1413
1369
  // Otherwise we know they are disconnected
@@ -1415,148 +1371,109 @@ setDocument = Sizzle.setDocument = function( node ) {
1415
1371
 
1416
1372
  // Disconnected nodes
1417
1373
  if ( compare & 1 ||
1418
- (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1374
+ ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
1419
1375
 
1420
1376
  // Choose the first element that is related to our preferred document
1421
- if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1377
+ // Support: IE 11+, Edge 17 - 18+
1378
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1379
+ // two documents; shallow comparisons work.
1380
+ // eslint-disable-next-line eqeqeq
1381
+ if ( a === document || a.ownerDocument == preferredDoc &&
1382
+ find.contains( preferredDoc, a ) ) {
1422
1383
  return -1;
1423
1384
  }
1424
- if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1385
+
1386
+ // Support: IE 11+, Edge 17 - 18+
1387
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1388
+ // two documents; shallow comparisons work.
1389
+ // eslint-disable-next-line eqeqeq
1390
+ if ( b === document || b.ownerDocument == preferredDoc &&
1391
+ find.contains( preferredDoc, b ) ) {
1425
1392
  return 1;
1426
1393
  }
1427
1394
 
1428
1395
  // Maintain original order
1429
1396
  return sortInput ?
1430
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1397
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
1431
1398
  0;
1432
1399
  }
1433
1400
 
1434
1401
  return compare & 4 ? -1 : 1;
1435
- } :
1436
- function( a, b ) {
1437
- // Exit early if the nodes are identical
1438
- if ( a === b ) {
1439
- hasDuplicate = true;
1440
- return 0;
1441
- }
1442
-
1443
- var cur,
1444
- i = 0,
1445
- aup = a.parentNode,
1446
- bup = b.parentNode,
1447
- ap = [ a ],
1448
- bp = [ b ];
1449
-
1450
- // Parentless nodes are either documents or disconnected
1451
- if ( !aup || !bup ) {
1452
- return a === document ? -1 :
1453
- b === document ? 1 :
1454
- aup ? -1 :
1455
- bup ? 1 :
1456
- sortInput ?
1457
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1458
- 0;
1459
-
1460
- // If the nodes are siblings, we can do a quick check
1461
- } else if ( aup === bup ) {
1462
- return siblingCheck( a, b );
1463
- }
1464
-
1465
- // Otherwise we need full lists of their ancestors for comparison
1466
- cur = a;
1467
- while ( (cur = cur.parentNode) ) {
1468
- ap.unshift( cur );
1469
- }
1470
- cur = b;
1471
- while ( (cur = cur.parentNode) ) {
1472
- bp.unshift( cur );
1473
- }
1474
-
1475
- // Walk down the tree looking for a discrepancy
1476
- while ( ap[i] === bp[i] ) {
1477
- i++;
1478
- }
1479
-
1480
- return i ?
1481
- // Do a sibling check if the nodes have a common ancestor
1482
- siblingCheck( ap[i], bp[i] ) :
1483
-
1484
- // Otherwise nodes in our document sort first
1485
- ap[i] === preferredDoc ? -1 :
1486
- bp[i] === preferredDoc ? 1 :
1487
- 0;
1488
1402
  };
1489
1403
 
1490
1404
  return document;
1491
- };
1405
+ }
1492
1406
 
1493
- Sizzle.matches = function( expr, elements ) {
1494
- return Sizzle( expr, null, null, elements );
1407
+ find.matches = function( expr, elements ) {
1408
+ return find( expr, null, null, elements );
1495
1409
  };
1496
1410
 
1497
- Sizzle.matchesSelector = function( elem, expr ) {
1498
- // Set document vars if needed
1499
- if ( ( elem.ownerDocument || elem ) !== document ) {
1500
- setDocument( elem );
1501
- }
1411
+ find.matchesSelector = function( elem, expr ) {
1412
+ setDocument( elem );
1502
1413
 
1503
- if ( support.matchesSelector && documentIsHTML &&
1414
+ if ( documentIsHTML &&
1504
1415
  !nonnativeSelectorCache[ expr + " " ] &&
1505
- ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1506
- ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1416
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1507
1417
 
1508
1418
  try {
1509
1419
  var ret = matches.call( elem, expr );
1510
1420
 
1511
1421
  // IE 9's matchesSelector returns false on disconnected nodes
1512
1422
  if ( ret || support.disconnectedMatch ||
1423
+
1513
1424
  // As well, disconnected nodes are said to be in a document
1514
1425
  // fragment in IE 9
1515
1426
  elem.document && elem.document.nodeType !== 11 ) {
1516
1427
  return ret;
1517
1428
  }
1518
- } catch (e) {
1429
+ } catch ( e ) {
1519
1430
  nonnativeSelectorCache( expr, true );
1520
1431
  }
1521
1432
  }
1522
1433
 
1523
- return Sizzle( expr, document, null, [ elem ] ).length > 0;
1434
+ return find( expr, document, null, [ elem ] ).length > 0;
1524
1435
  };
1525
1436
 
1526
- Sizzle.contains = function( context, elem ) {
1437
+ find.contains = function( context, elem ) {
1438
+
1527
1439
  // Set document vars if needed
1528
- if ( ( context.ownerDocument || context ) !== document ) {
1440
+ // Support: IE 11+, Edge 17 - 18+
1441
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1442
+ // two documents; shallow comparisons work.
1443
+ // eslint-disable-next-line eqeqeq
1444
+ if ( ( context.ownerDocument || context ) != document ) {
1529
1445
  setDocument( context );
1530
1446
  }
1531
- return contains( context, elem );
1447
+ return jQuery.contains( context, elem );
1532
1448
  };
1533
1449
 
1534
- Sizzle.attr = function( elem, name ) {
1450
+
1451
+ find.attr = function( elem, name ) {
1452
+
1535
1453
  // Set document vars if needed
1536
- if ( ( elem.ownerDocument || elem ) !== document ) {
1454
+ // Support: IE 11+, Edge 17 - 18+
1455
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1456
+ // two documents; shallow comparisons work.
1457
+ // eslint-disable-next-line eqeqeq
1458
+ if ( ( elem.ownerDocument || elem ) != document ) {
1537
1459
  setDocument( elem );
1538
1460
  }
1539
1461
 
1540
1462
  var fn = Expr.attrHandle[ name.toLowerCase() ],
1541
- // Don't get fooled by Object.prototype properties (jQuery #13807)
1463
+
1464
+ // Don't get fooled by Object.prototype properties (see trac-13807)
1542
1465
  val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1543
1466
  fn( elem, name, !documentIsHTML ) :
1544
1467
  undefined;
1545
1468
 
1546
- return val !== undefined ?
1547
- val :
1548
- support.attributes || !documentIsHTML ?
1549
- elem.getAttribute( name ) :
1550
- (val = elem.getAttributeNode(name)) && val.specified ?
1551
- val.value :
1552
- null;
1553
- };
1469
+ if ( val !== undefined ) {
1470
+ return val;
1471
+ }
1554
1472
 
1555
- Sizzle.escape = function( sel ) {
1556
- return (sel + "").replace( rcssescape, fcssescape );
1473
+ return elem.getAttribute( name );
1557
1474
  };
1558
1475
 
1559
- Sizzle.error = function( msg ) {
1476
+ find.error = function( msg ) {
1560
1477
  throw new Error( "Syntax error, unrecognized expression: " + msg );
1561
1478
  };
1562
1479
 
@@ -1564,25 +1481,29 @@ Sizzle.error = function( msg ) {
1564
1481
  * Document sorting and removing duplicates
1565
1482
  * @param {ArrayLike} results
1566
1483
  */
1567
- Sizzle.uniqueSort = function( results ) {
1484
+ jQuery.uniqueSort = function( results ) {
1568
1485
  var elem,
1569
1486
  duplicates = [],
1570
1487
  j = 0,
1571
1488
  i = 0;
1572
1489
 
1573
1490
  // Unless we *know* we can detect duplicates, assume their presence
1574
- hasDuplicate = !support.detectDuplicates;
1575
- sortInput = !support.sortStable && results.slice( 0 );
1576
- results.sort( sortOrder );
1491
+ //
1492
+ // Support: Android <=4.0+
1493
+ // Testing for detecting duplicates is unpredictable so instead assume we can't
1494
+ // depend on duplicate detection in all browsers without a stable sort.
1495
+ hasDuplicate = !support.sortStable;
1496
+ sortInput = !support.sortStable && slice.call( results, 0 );
1497
+ sort.call( results, sortOrder );
1577
1498
 
1578
1499
  if ( hasDuplicate ) {
1579
- while ( (elem = results[i++]) ) {
1500
+ while ( ( elem = results[ i++ ] ) ) {
1580
1501
  if ( elem === results[ i ] ) {
1581
1502
  j = duplicates.push( i );
1582
1503
  }
1583
1504
  }
1584
1505
  while ( j-- ) {
1585
- results.splice( duplicates[ j ], 1 );
1506
+ splice.call( results, duplicates[ j ], 1 );
1586
1507
  }
1587
1508
  }
1588
1509
 
@@ -1593,42 +1514,11 @@ Sizzle.uniqueSort = function( results ) {
1593
1514
  return results;
1594
1515
  };
1595
1516
 
1596
- /**
1597
- * Utility function for retrieving the text value of an array of DOM nodes
1598
- * @param {Array|Element} elem
1599
- */
1600
- getText = Sizzle.getText = function( elem ) {
1601
- var node,
1602
- ret = "",
1603
- i = 0,
1604
- nodeType = elem.nodeType;
1605
-
1606
- if ( !nodeType ) {
1607
- // If no nodeType, this is expected to be an array
1608
- while ( (node = elem[i++]) ) {
1609
- // Do not traverse comment nodes
1610
- ret += getText( node );
1611
- }
1612
- } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1613
- // Use textContent for elements
1614
- // innerText usage removed for consistency of new lines (jQuery #11153)
1615
- if ( typeof elem.textContent === "string" ) {
1616
- return elem.textContent;
1617
- } else {
1618
- // Traverse its children
1619
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1620
- ret += getText( elem );
1621
- }
1622
- }
1623
- } else if ( nodeType === 3 || nodeType === 4 ) {
1624
- return elem.nodeValue;
1625
- }
1626
- // Do not include comment or processing instruction nodes
1627
-
1628
- return ret;
1517
+ jQuery.fn.uniqueSort = function() {
1518
+ return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );
1629
1519
  };
1630
1520
 
1631
- Expr = Sizzle.selectors = {
1521
+ Expr = jQuery.expr = {
1632
1522
 
1633
1523
  // Can be adjusted by the user
1634
1524
  cacheLength: 50,
@@ -1649,20 +1539,22 @@ Expr = Sizzle.selectors = {
1649
1539
  },
1650
1540
 
1651
1541
  preFilter: {
1652
- "ATTR": function( match ) {
1653
- match[1] = match[1].replace( runescape, funescape );
1542
+ ATTR: function( match ) {
1543
+ match[ 1 ] = match[ 1 ].replace( runescape, funescape );
1654
1544
 
1655
1545
  // Move the given value to match[3] whether quoted or unquoted
1656
- match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1546
+ match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" )
1547
+ .replace( runescape, funescape );
1657
1548
 
1658
- if ( match[2] === "~=" ) {
1659
- match[3] = " " + match[3] + " ";
1549
+ if ( match[ 2 ] === "~=" ) {
1550
+ match[ 3 ] = " " + match[ 3 ] + " ";
1660
1551
  }
1661
1552
 
1662
1553
  return match.slice( 0, 4 );
1663
1554
  },
1664
1555
 
1665
- "CHILD": function( match ) {
1556
+ CHILD: function( match ) {
1557
+
1666
1558
  /* matches from matchExpr["CHILD"]
1667
1559
  1 type (only|nth|...)
1668
1560
  2 what (child|of-type)
@@ -1673,49 +1565,55 @@ Expr = Sizzle.selectors = {
1673
1565
  7 sign of y-component
1674
1566
  8 y of y-component
1675
1567
  */
1676
- match[1] = match[1].toLowerCase();
1568
+ match[ 1 ] = match[ 1 ].toLowerCase();
1569
+
1570
+ if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
1677
1571
 
1678
- if ( match[1].slice( 0, 3 ) === "nth" ) {
1679
1572
  // nth-* requires argument
1680
- if ( !match[3] ) {
1681
- Sizzle.error( match[0] );
1573
+ if ( !match[ 3 ] ) {
1574
+ find.error( match[ 0 ] );
1682
1575
  }
1683
1576
 
1684
1577
  // numeric x and y parameters for Expr.filter.CHILD
1685
1578
  // remember that false/true cast respectively to 0/1
1686
- match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1687
- match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1579
+ match[ 4 ] = +( match[ 4 ] ?
1580
+ match[ 5 ] + ( match[ 6 ] || 1 ) :
1581
+ 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" )
1582
+ );
1583
+ match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
1688
1584
 
1689
1585
  // other types prohibit arguments
1690
- } else if ( match[3] ) {
1691
- Sizzle.error( match[0] );
1586
+ } else if ( match[ 3 ] ) {
1587
+ find.error( match[ 0 ] );
1692
1588
  }
1693
1589
 
1694
1590
  return match;
1695
1591
  },
1696
1592
 
1697
- "PSEUDO": function( match ) {
1593
+ PSEUDO: function( match ) {
1698
1594
  var excess,
1699
- unquoted = !match[6] && match[2];
1595
+ unquoted = !match[ 6 ] && match[ 2 ];
1700
1596
 
1701
- if ( matchExpr["CHILD"].test( match[0] ) ) {
1597
+ if ( matchExpr.CHILD.test( match[ 0 ] ) ) {
1702
1598
  return null;
1703
1599
  }
1704
1600
 
1705
1601
  // Accept quoted arguments as-is
1706
- if ( match[3] ) {
1707
- match[2] = match[4] || match[5] || "";
1602
+ if ( match[ 3 ] ) {
1603
+ match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
1708
1604
 
1709
1605
  // Strip excess characters from unquoted arguments
1710
1606
  } else if ( unquoted && rpseudo.test( unquoted ) &&
1607
+
1711
1608
  // Get excess from tokenize (recursively)
1712
- (excess = tokenize( unquoted, true )) &&
1609
+ ( excess = tokenize( unquoted, true ) ) &&
1610
+
1713
1611
  // advance to the next closing parenthesis
1714
- (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1612
+ ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
1715
1613
 
1716
1614
  // excess is a negative index
1717
- match[0] = match[0].slice( 0, excess );
1718
- match[2] = unquoted.slice( 0, excess );
1615
+ match[ 0 ] = match[ 0 ].slice( 0, excess );
1616
+ match[ 2 ] = unquoted.slice( 0, excess );
1719
1617
  }
1720
1618
 
1721
1619
  // Return only captures needed by the pseudo filter method (type and argument)
@@ -1725,28 +1623,36 @@ Expr = Sizzle.selectors = {
1725
1623
 
1726
1624
  filter: {
1727
1625
 
1728
- "TAG": function( nodeNameSelector ) {
1729
- var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1626
+ TAG: function( nodeNameSelector ) {
1627
+ var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1730
1628
  return nodeNameSelector === "*" ?
1731
- function() { return true; } :
1629
+ function() {
1630
+ return true;
1631
+ } :
1732
1632
  function( elem ) {
1733
- return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1633
+ return nodeName( elem, expectedNodeName );
1734
1634
  };
1735
1635
  },
1736
1636
 
1737
- "CLASS": function( className ) {
1637
+ CLASS: function( className ) {
1738
1638
  var pattern = classCache[ className + " " ];
1739
1639
 
1740
1640
  return pattern ||
1741
- (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1641
+ ( pattern = new RegExp( "(^|" + whitespace + ")" + className +
1642
+ "(" + whitespace + "|$)" ) ) &&
1742
1643
  classCache( className, function( elem ) {
1743
- return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
1744
- });
1644
+ return pattern.test(
1645
+ typeof elem.className === "string" && elem.className ||
1646
+ typeof elem.getAttribute !== "undefined" &&
1647
+ elem.getAttribute( "class" ) ||
1648
+ ""
1649
+ );
1650
+ } );
1745
1651
  },
1746
1652
 
1747
- "ATTR": function( name, operator, check ) {
1653
+ ATTR: function( name, operator, check ) {
1748
1654
  return function( elem ) {
1749
- var result = Sizzle.attr( elem, name );
1655
+ var result = find.attr( elem, name );
1750
1656
 
1751
1657
  if ( result == null ) {
1752
1658
  return operator === "!=";
@@ -1757,18 +1663,34 @@ Expr = Sizzle.selectors = {
1757
1663
 
1758
1664
  result += "";
1759
1665
 
1760
- return operator === "=" ? result === check :
1761
- operator === "!=" ? result !== check :
1762
- operator === "^=" ? check && result.indexOf( check ) === 0 :
1763
- operator === "*=" ? check && result.indexOf( check ) > -1 :
1764
- operator === "$=" ? check && result.slice( -check.length ) === check :
1765
- operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1766
- operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1767
- false;
1666
+ if ( operator === "=" ) {
1667
+ return result === check;
1668
+ }
1669
+ if ( operator === "!=" ) {
1670
+ return result !== check;
1671
+ }
1672
+ if ( operator === "^=" ) {
1673
+ return check && result.indexOf( check ) === 0;
1674
+ }
1675
+ if ( operator === "*=" ) {
1676
+ return check && result.indexOf( check ) > -1;
1677
+ }
1678
+ if ( operator === "$=" ) {
1679
+ return check && result.slice( -check.length ) === check;
1680
+ }
1681
+ if ( operator === "~=" ) {
1682
+ return ( " " + result.replace( rwhitespace, " " ) + " " )
1683
+ .indexOf( check ) > -1;
1684
+ }
1685
+ if ( operator === "|=" ) {
1686
+ return result === check || result.slice( 0, check.length + 1 ) === check + "-";
1687
+ }
1688
+
1689
+ return false;
1768
1690
  };
1769
1691
  },
1770
1692
 
1771
- "CHILD": function( type, what, argument, first, last ) {
1693
+ CHILD: function( type, what, _argument, first, last ) {
1772
1694
  var simple = type.slice( 0, 3 ) !== "nth",
1773
1695
  forward = type.slice( -4 ) !== "last",
1774
1696
  ofType = what === "of-type";
@@ -1780,8 +1702,8 @@ Expr = Sizzle.selectors = {
1780
1702
  return !!elem.parentNode;
1781
1703
  } :
1782
1704
 
1783
- function( elem, context, xml ) {
1784
- var cache, uniqueCache, outerCache, node, nodeIndex, start,
1705
+ function( elem, _context, xml ) {
1706
+ var cache, outerCache, node, nodeIndex, start,
1785
1707
  dir = simple !== forward ? "nextSibling" : "previousSibling",
1786
1708
  parent = elem.parentNode,
1787
1709
  name = ofType && elem.nodeName.toLowerCase(),
@@ -1794,14 +1716,15 @@ Expr = Sizzle.selectors = {
1794
1716
  if ( simple ) {
1795
1717
  while ( dir ) {
1796
1718
  node = elem;
1797
- while ( (node = node[ dir ]) ) {
1719
+ while ( ( node = node[ dir ] ) ) {
1798
1720
  if ( ofType ?
1799
- node.nodeName.toLowerCase() === name :
1721
+ nodeName( node, name ) :
1800
1722
  node.nodeType === 1 ) {
1801
1723
 
1802
1724
  return false;
1803
1725
  }
1804
1726
  }
1727
+
1805
1728
  // Reverse direction for :only-* (if we haven't yet done so)
1806
1729
  start = dir = type === "only" && !start && "nextSibling";
1807
1730
  }
@@ -1814,46 +1737,30 @@ Expr = Sizzle.selectors = {
1814
1737
  if ( forward && useCache ) {
1815
1738
 
1816
1739
  // Seek `elem` from a previously-cached index
1817
-
1818
- // ...in a gzip-friendly way
1819
- node = parent;
1820
- outerCache = node[ expando ] || (node[ expando ] = {});
1821
-
1822
- // Support: IE <9 only
1823
- // Defend against cloned attroperties (jQuery gh-1709)
1824
- uniqueCache = outerCache[ node.uniqueID ] ||
1825
- (outerCache[ node.uniqueID ] = {});
1826
-
1827
- cache = uniqueCache[ type ] || [];
1740
+ outerCache = parent[ expando ] || ( parent[ expando ] = {} );
1741
+ cache = outerCache[ type ] || [];
1828
1742
  nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1829
1743
  diff = nodeIndex && cache[ 2 ];
1830
1744
  node = nodeIndex && parent.childNodes[ nodeIndex ];
1831
1745
 
1832
- while ( (node = ++nodeIndex && node && node[ dir ] ||
1746
+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
1833
1747
 
1834
1748
  // Fallback to seeking `elem` from the start
1835
- (diff = nodeIndex = 0) || start.pop()) ) {
1749
+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
1836
1750
 
1837
1751
  // When found, cache indexes on `parent` and break
1838
1752
  if ( node.nodeType === 1 && ++diff && node === elem ) {
1839
- uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
1753
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
1840
1754
  break;
1841
1755
  }
1842
1756
  }
1843
1757
 
1844
1758
  } else {
1759
+
1845
1760
  // Use previously-cached element index if available
1846
1761
  if ( useCache ) {
1847
- // ...in a gzip-friendly way
1848
- node = elem;
1849
- outerCache = node[ expando ] || (node[ expando ] = {});
1850
-
1851
- // Support: IE <9 only
1852
- // Defend against cloned attroperties (jQuery gh-1709)
1853
- uniqueCache = outerCache[ node.uniqueID ] ||
1854
- (outerCache[ node.uniqueID ] = {});
1855
-
1856
- cache = uniqueCache[ type ] || [];
1762
+ outerCache = elem[ expando ] || ( elem[ expando ] = {} );
1763
+ cache = outerCache[ type ] || [];
1857
1764
  nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1858
1765
  diff = nodeIndex;
1859
1766
  }
@@ -1861,25 +1768,21 @@ Expr = Sizzle.selectors = {
1861
1768
  // xml :nth-child(...)
1862
1769
  // or :nth-last-child(...) or :nth(-last)?-of-type(...)
1863
1770
  if ( diff === false ) {
1771
+
1864
1772
  // Use the same loop as above to seek `elem` from the start
1865
- while ( (node = ++nodeIndex && node && node[ dir ] ||
1866
- (diff = nodeIndex = 0) || start.pop()) ) {
1773
+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
1774
+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
1867
1775
 
1868
1776
  if ( ( ofType ?
1869
- node.nodeName.toLowerCase() === name :
1777
+ nodeName( node, name ) :
1870
1778
  node.nodeType === 1 ) &&
1871
1779
  ++diff ) {
1872
1780
 
1873
1781
  // Cache the index of each encountered element
1874
1782
  if ( useCache ) {
1875
- outerCache = node[ expando ] || (node[ expando ] = {});
1876
-
1877
- // Support: IE <9 only
1878
- // Defend against cloned attroperties (jQuery gh-1709)
1879
- uniqueCache = outerCache[ node.uniqueID ] ||
1880
- (outerCache[ node.uniqueID ] = {});
1881
-
1882
- uniqueCache[ type ] = [ dirruns, diff ];
1783
+ outerCache = node[ expando ] ||
1784
+ ( node[ expando ] = {} );
1785
+ outerCache[ type ] = [ dirruns, diff ];
1883
1786
  }
1884
1787
 
1885
1788
  if ( node === elem ) {
@@ -1897,18 +1800,19 @@ Expr = Sizzle.selectors = {
1897
1800
  };
1898
1801
  },
1899
1802
 
1900
- "PSEUDO": function( pseudo, argument ) {
1803
+ PSEUDO: function( pseudo, argument ) {
1804
+
1901
1805
  // pseudo-class names are case-insensitive
1902
- // http://www.w3.org/TR/selectors/#pseudo-classes
1806
+ // https://www.w3.org/TR/selectors/#pseudo-classes
1903
1807
  // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1904
1808
  // Remember that setFilters inherits from pseudos
1905
1809
  var args,
1906
1810
  fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
1907
- Sizzle.error( "unsupported pseudo: " + pseudo );
1811
+ find.error( "unsupported pseudo: " + pseudo );
1908
1812
 
1909
1813
  // The user may use createPseudo to indicate that
1910
1814
  // arguments are needed to create the filter function
1911
- // just as Sizzle does
1815
+ // just as jQuery does
1912
1816
  if ( fn[ expando ] ) {
1913
1817
  return fn( argument );
1914
1818
  }
@@ -1917,15 +1821,15 @@ Expr = Sizzle.selectors = {
1917
1821
  if ( fn.length > 1 ) {
1918
1822
  args = [ pseudo, pseudo, "", argument ];
1919
1823
  return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1920
- markFunction(function( seed, matches ) {
1824
+ markFunction( function( seed, matches ) {
1921
1825
  var idx,
1922
1826
  matched = fn( seed, argument ),
1923
1827
  i = matched.length;
1924
1828
  while ( i-- ) {
1925
- idx = indexOf( seed, matched[i] );
1926
- seed[ idx ] = !( matches[ idx ] = matched[i] );
1829
+ idx = indexOf.call( seed, matched[ i ] );
1830
+ seed[ idx ] = !( matches[ idx ] = matched[ i ] );
1927
1831
  }
1928
- }) :
1832
+ } ) :
1929
1833
  function( elem ) {
1930
1834
  return fn( elem, 0, args );
1931
1835
  };
@@ -1936,49 +1840,53 @@ Expr = Sizzle.selectors = {
1936
1840
  },
1937
1841
 
1938
1842
  pseudos: {
1843
+
1939
1844
  // Potentially complex pseudos
1940
- "not": markFunction(function( selector ) {
1845
+ not: markFunction( function( selector ) {
1846
+
1941
1847
  // Trim the selector passed to compile
1942
1848
  // to avoid treating leading and trailing
1943
1849
  // spaces as combinators
1944
1850
  var input = [],
1945
1851
  results = [],
1946
- matcher = compile( selector.replace( rtrim, "$1" ) );
1852
+ matcher = compile( selector.replace( rtrimCSS, "$1" ) );
1947
1853
 
1948
1854
  return matcher[ expando ] ?
1949
- markFunction(function( seed, matches, context, xml ) {
1855
+ markFunction( function( seed, matches, _context, xml ) {
1950
1856
  var elem,
1951
1857
  unmatched = matcher( seed, null, xml, [] ),
1952
1858
  i = seed.length;
1953
1859
 
1954
1860
  // Match elements unmatched by `matcher`
1955
1861
  while ( i-- ) {
1956
- if ( (elem = unmatched[i]) ) {
1957
- seed[i] = !(matches[i] = elem);
1862
+ if ( ( elem = unmatched[ i ] ) ) {
1863
+ seed[ i ] = !( matches[ i ] = elem );
1958
1864
  }
1959
1865
  }
1960
- }) :
1961
- function( elem, context, xml ) {
1962
- input[0] = elem;
1866
+ } ) :
1867
+ function( elem, _context, xml ) {
1868
+ input[ 0 ] = elem;
1963
1869
  matcher( input, null, xml, results );
1964
- // Don't keep the element (issue #299)
1965
- input[0] = null;
1870
+
1871
+ // Don't keep the element
1872
+ // (see https://github.com/jquery/sizzle/issues/299)
1873
+ input[ 0 ] = null;
1966
1874
  return !results.pop();
1967
1875
  };
1968
- }),
1876
+ } ),
1969
1877
 
1970
- "has": markFunction(function( selector ) {
1878
+ has: markFunction( function( selector ) {
1971
1879
  return function( elem ) {
1972
- return Sizzle( selector, elem ).length > 0;
1880
+ return find( selector, elem ).length > 0;
1973
1881
  };
1974
- }),
1882
+ } ),
1975
1883
 
1976
- "contains": markFunction(function( text ) {
1884
+ contains: markFunction( function( text ) {
1977
1885
  text = text.replace( runescape, funescape );
1978
1886
  return function( elem ) {
1979
- return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
1887
+ return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1;
1980
1888
  };
1981
- }),
1889
+ } ),
1982
1890
 
1983
1891
  // "Whether an element is represented by a :lang() selector
1984
1892
  // is based solely on the element's language value
@@ -1986,57 +1894,65 @@ Expr = Sizzle.selectors = {
1986
1894
  // or beginning with the identifier C immediately followed by "-".
1987
1895
  // The matching of C against the element's language value is performed case-insensitively.
1988
1896
  // The identifier C does not have to be a valid language name."
1989
- // http://www.w3.org/TR/selectors/#lang-pseudo
1990
- "lang": markFunction( function( lang ) {
1897
+ // https://www.w3.org/TR/selectors/#lang-pseudo
1898
+ lang: markFunction( function( lang ) {
1899
+
1991
1900
  // lang value must be a valid identifier
1992
- if ( !ridentifier.test(lang || "") ) {
1993
- Sizzle.error( "unsupported lang: " + lang );
1901
+ if ( !ridentifier.test( lang || "" ) ) {
1902
+ find.error( "unsupported lang: " + lang );
1994
1903
  }
1995
1904
  lang = lang.replace( runescape, funescape ).toLowerCase();
1996
1905
  return function( elem ) {
1997
1906
  var elemLang;
1998
1907
  do {
1999
- if ( (elemLang = documentIsHTML ?
1908
+ if ( ( elemLang = documentIsHTML ?
2000
1909
  elem.lang :
2001
- elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
1910
+ elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
2002
1911
 
2003
1912
  elemLang = elemLang.toLowerCase();
2004
1913
  return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
2005
1914
  }
2006
- } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
1915
+ } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
2007
1916
  return false;
2008
1917
  };
2009
- }),
1918
+ } ),
2010
1919
 
2011
1920
  // Miscellaneous
2012
- "target": function( elem ) {
1921
+ target: function( elem ) {
2013
1922
  var hash = window.location && window.location.hash;
2014
1923
  return hash && hash.slice( 1 ) === elem.id;
2015
1924
  },
2016
1925
 
2017
- "root": function( elem ) {
2018
- return elem === docElem;
1926
+ root: function( elem ) {
1927
+ return elem === documentElement;
2019
1928
  },
2020
1929
 
2021
- "focus": function( elem ) {
2022
- return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
1930
+ focus: function( elem ) {
1931
+ return elem === safeActiveElement() &&
1932
+ document.hasFocus() &&
1933
+ !!( elem.type || elem.href || ~elem.tabIndex );
2023
1934
  },
2024
1935
 
2025
1936
  // Boolean properties
2026
- "enabled": createDisabledPseudo( false ),
2027
- "disabled": createDisabledPseudo( true ),
1937
+ enabled: createDisabledPseudo( false ),
1938
+ disabled: createDisabledPseudo( true ),
1939
+
1940
+ checked: function( elem ) {
2028
1941
 
2029
- "checked": function( elem ) {
2030
1942
  // In CSS3, :checked should return both checked and selected elements
2031
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2032
- var nodeName = elem.nodeName.toLowerCase();
2033
- return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
1943
+ // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1944
+ return ( nodeName( elem, "input" ) && !!elem.checked ) ||
1945
+ ( nodeName( elem, "option" ) && !!elem.selected );
2034
1946
  },
2035
1947
 
2036
- "selected": function( elem ) {
2037
- // Accessing this property makes selected-by-default
2038
- // options in Safari work properly
1948
+ selected: function( elem ) {
1949
+
1950
+ // Support: IE <=11+
1951
+ // Accessing the selectedIndex property
1952
+ // forces the browser to treat the default option as
1953
+ // selected when in an optgroup.
2039
1954
  if ( elem.parentNode ) {
1955
+ // eslint-disable-next-line no-unused-expressions
2040
1956
  elem.parentNode.selectedIndex;
2041
1957
  }
2042
1958
 
@@ -2044,8 +1960,9 @@ Expr = Sizzle.selectors = {
2044
1960
  },
2045
1961
 
2046
1962
  // Contents
2047
- "empty": function( elem ) {
2048
- // http://www.w3.org/TR/selectors/#empty-pseudo
1963
+ empty: function( elem ) {
1964
+
1965
+ // https://www.w3.org/TR/selectors/#empty-pseudo
2049
1966
  // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
2050
1967
  // but not by others (comment: 8; processing instruction: 7; etc.)
2051
1968
  // nodeType < 6 works because attributes (2) do not appear as children
@@ -2057,86 +1974,92 @@ Expr = Sizzle.selectors = {
2057
1974
  return true;
2058
1975
  },
2059
1976
 
2060
- "parent": function( elem ) {
2061
- return !Expr.pseudos["empty"]( elem );
1977
+ parent: function( elem ) {
1978
+ return !Expr.pseudos.empty( elem );
2062
1979
  },
2063
1980
 
2064
1981
  // Element/input types
2065
- "header": function( elem ) {
1982
+ header: function( elem ) {
2066
1983
  return rheader.test( elem.nodeName );
2067
1984
  },
2068
1985
 
2069
- "input": function( elem ) {
1986
+ input: function( elem ) {
2070
1987
  return rinputs.test( elem.nodeName );
2071
1988
  },
2072
1989
 
2073
- "button": function( elem ) {
2074
- var name = elem.nodeName.toLowerCase();
2075
- return name === "input" && elem.type === "button" || name === "button";
1990
+ button: function( elem ) {
1991
+ return nodeName( elem, "input" ) && elem.type === "button" ||
1992
+ nodeName( elem, "button" );
2076
1993
  },
2077
1994
 
2078
- "text": function( elem ) {
1995
+ text: function( elem ) {
2079
1996
  var attr;
2080
- return elem.nodeName.toLowerCase() === "input" &&
2081
- elem.type === "text" &&
1997
+ return nodeName( elem, "input" ) && elem.type === "text" &&
2082
1998
 
2083
- // Support: IE<8
2084
- // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2085
- ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
1999
+ // Support: IE <10 only
2000
+ // New HTML5 attribute values (e.g., "search") appear
2001
+ // with elem.type === "text"
2002
+ ( ( attr = elem.getAttribute( "type" ) ) == null ||
2003
+ attr.toLowerCase() === "text" );
2086
2004
  },
2087
2005
 
2088
2006
  // Position-in-collection
2089
- "first": createPositionalPseudo(function() {
2007
+ first: createPositionalPseudo( function() {
2090
2008
  return [ 0 ];
2091
- }),
2009
+ } ),
2092
2010
 
2093
- "last": createPositionalPseudo(function( matchIndexes, length ) {
2011
+ last: createPositionalPseudo( function( _matchIndexes, length ) {
2094
2012
  return [ length - 1 ];
2095
- }),
2013
+ } ),
2096
2014
 
2097
- "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
2015
+ eq: createPositionalPseudo( function( _matchIndexes, length, argument ) {
2098
2016
  return [ argument < 0 ? argument + length : argument ];
2099
- }),
2017
+ } ),
2100
2018
 
2101
- "even": createPositionalPseudo(function( matchIndexes, length ) {
2019
+ even: createPositionalPseudo( function( matchIndexes, length ) {
2102
2020
  var i = 0;
2103
2021
  for ( ; i < length; i += 2 ) {
2104
2022
  matchIndexes.push( i );
2105
2023
  }
2106
2024
  return matchIndexes;
2107
- }),
2025
+ } ),
2108
2026
 
2109
- "odd": createPositionalPseudo(function( matchIndexes, length ) {
2027
+ odd: createPositionalPseudo( function( matchIndexes, length ) {
2110
2028
  var i = 1;
2111
2029
  for ( ; i < length; i += 2 ) {
2112
2030
  matchIndexes.push( i );
2113
2031
  }
2114
2032
  return matchIndexes;
2115
- }),
2116
-
2117
- "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2118
- var i = argument < 0 ?
2119
- argument + length :
2120
- argument > length ?
2121
- length :
2122
- argument;
2033
+ } ),
2034
+
2035
+ lt: createPositionalPseudo( function( matchIndexes, length, argument ) {
2036
+ var i;
2037
+
2038
+ if ( argument < 0 ) {
2039
+ i = argument + length;
2040
+ } else if ( argument > length ) {
2041
+ i = length;
2042
+ } else {
2043
+ i = argument;
2044
+ }
2045
+
2123
2046
  for ( ; --i >= 0; ) {
2124
2047
  matchIndexes.push( i );
2125
2048
  }
2126
2049
  return matchIndexes;
2127
- }),
2050
+ } ),
2128
2051
 
2129
- "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2052
+ gt: createPositionalPseudo( function( matchIndexes, length, argument ) {
2130
2053
  var i = argument < 0 ? argument + length : argument;
2131
2054
  for ( ; ++i < length; ) {
2132
2055
  matchIndexes.push( i );
2133
2056
  }
2134
2057
  return matchIndexes;
2135
- })
2058
+ } )
2136
2059
  }
2137
2060
  };
2138
2061
 
2139
- Expr.pseudos["nth"] = Expr.pseudos["eq"];
2062
+ Expr.pseudos.nth = Expr.pseudos.eq;
2140
2063
 
2141
2064
  // Add button/input type pseudos
2142
2065
  for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
@@ -2151,7 +2074,7 @@ function setFilters() {}
2151
2074
  setFilters.prototype = Expr.filters = Expr.pseudos;
2152
2075
  Expr.setFilters = new setFilters();
2153
2076
 
2154
- tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2077
+ function tokenize( selector, parseOnly ) {
2155
2078
  var matched, match, tokens, type,
2156
2079
  soFar, groups, preFilters,
2157
2080
  cached = tokenCache[ selector + " " ];
@@ -2167,37 +2090,39 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2167
2090
  while ( soFar ) {
2168
2091
 
2169
2092
  // Comma and first run
2170
- if ( !matched || (match = rcomma.exec( soFar )) ) {
2093
+ if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
2171
2094
  if ( match ) {
2095
+
2172
2096
  // Don't consume trailing commas as valid
2173
- soFar = soFar.slice( match[0].length ) || soFar;
2097
+ soFar = soFar.slice( match[ 0 ].length ) || soFar;
2174
2098
  }
2175
- groups.push( (tokens = []) );
2099
+ groups.push( ( tokens = [] ) );
2176
2100
  }
2177
2101
 
2178
2102
  matched = false;
2179
2103
 
2180
2104
  // Combinators
2181
- if ( (match = rcombinators.exec( soFar )) ) {
2105
+ if ( ( match = rleadingCombinator.exec( soFar ) ) ) {
2182
2106
  matched = match.shift();
2183
- tokens.push({
2107
+ tokens.push( {
2184
2108
  value: matched,
2109
+
2185
2110
  // Cast descendant combinators to space
2186
- type: match[0].replace( rtrim, " " )
2187
- });
2111
+ type: match[ 0 ].replace( rtrimCSS, " " )
2112
+ } );
2188
2113
  soFar = soFar.slice( matched.length );
2189
2114
  }
2190
2115
 
2191
2116
  // Filters
2192
2117
  for ( type in Expr.filter ) {
2193
- if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2194
- (match = preFilters[ type ]( match ))) ) {
2118
+ if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
2119
+ ( match = preFilters[ type ]( match ) ) ) ) {
2195
2120
  matched = match.shift();
2196
- tokens.push({
2121
+ tokens.push( {
2197
2122
  value: matched,
2198
2123
  type: type,
2199
2124
  matches: match
2200
- });
2125
+ } );
2201
2126
  soFar = soFar.slice( matched.length );
2202
2127
  }
2203
2128
  }
@@ -2210,20 +2135,23 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2210
2135
  // Return the length of the invalid excess
2211
2136
  // if we're just parsing
2212
2137
  // Otherwise, throw an error or return tokens
2213
- return parseOnly ?
2214
- soFar.length :
2215
- soFar ?
2216
- Sizzle.error( selector ) :
2217
- // Cache the tokens
2218
- tokenCache( selector, groups ).slice( 0 );
2219
- };
2138
+ if ( parseOnly ) {
2139
+ return soFar.length;
2140
+ }
2141
+
2142
+ return soFar ?
2143
+ find.error( selector ) :
2144
+
2145
+ // Cache the tokens
2146
+ tokenCache( selector, groups ).slice( 0 );
2147
+ }
2220
2148
 
2221
2149
  function toSelector( tokens ) {
2222
2150
  var i = 0,
2223
2151
  len = tokens.length,
2224
2152
  selector = "";
2225
2153
  for ( ; i < len; i++ ) {
2226
- selector += tokens[i].value;
2154
+ selector += tokens[ i ].value;
2227
2155
  }
2228
2156
  return selector;
2229
2157
  }
@@ -2236,9 +2164,10 @@ function addCombinator( matcher, combinator, base ) {
2236
2164
  doneName = done++;
2237
2165
 
2238
2166
  return combinator.first ?
2167
+
2239
2168
  // Check against closest ancestor/preceding element
2240
2169
  function( elem, context, xml ) {
2241
- while ( (elem = elem[ dir ]) ) {
2170
+ while ( ( elem = elem[ dir ] ) ) {
2242
2171
  if ( elem.nodeType === 1 || checkNonElements ) {
2243
2172
  return matcher( elem, context, xml );
2244
2173
  }
@@ -2248,12 +2177,12 @@ function addCombinator( matcher, combinator, base ) {
2248
2177
 
2249
2178
  // Check against all ancestor/preceding elements
2250
2179
  function( elem, context, xml ) {
2251
- var oldCache, uniqueCache, outerCache,
2180
+ var oldCache, outerCache,
2252
2181
  newCache = [ dirruns, doneName ];
2253
2182
 
2254
2183
  // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2255
2184
  if ( xml ) {
2256
- while ( (elem = elem[ dir ]) ) {
2185
+ while ( ( elem = elem[ dir ] ) ) {
2257
2186
  if ( elem.nodeType === 1 || checkNonElements ) {
2258
2187
  if ( matcher( elem, context, xml ) ) {
2259
2188
  return true;
@@ -2261,27 +2190,24 @@ function addCombinator( matcher, combinator, base ) {
2261
2190
  }
2262
2191
  }
2263
2192
  } else {
2264
- while ( (elem = elem[ dir ]) ) {
2193
+ while ( ( elem = elem[ dir ] ) ) {
2265
2194
  if ( elem.nodeType === 1 || checkNonElements ) {
2266
- outerCache = elem[ expando ] || (elem[ expando ] = {});
2267
-
2268
- // Support: IE <9 only
2269
- // Defend against cloned attroperties (jQuery gh-1709)
2270
- uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
2195
+ outerCache = elem[ expando ] || ( elem[ expando ] = {} );
2271
2196
 
2272
- if ( skip && skip === elem.nodeName.toLowerCase() ) {
2197
+ if ( skip && nodeName( elem, skip ) ) {
2273
2198
  elem = elem[ dir ] || elem;
2274
- } else if ( (oldCache = uniqueCache[ key ]) &&
2199
+ } else if ( ( oldCache = outerCache[ key ] ) &&
2275
2200
  oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2276
2201
 
2277
2202
  // Assign to newCache so results back-propagate to previous elements
2278
- return (newCache[ 2 ] = oldCache[ 2 ]);
2203
+ return ( newCache[ 2 ] = oldCache[ 2 ] );
2279
2204
  } else {
2205
+
2280
2206
  // Reuse newcache so results back-propagate to previous elements
2281
- uniqueCache[ key ] = newCache;
2207
+ outerCache[ key ] = newCache;
2282
2208
 
2283
2209
  // A match means we're done; a fail means we have to keep checking
2284
- if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2210
+ if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
2285
2211
  return true;
2286
2212
  }
2287
2213
  }
@@ -2297,20 +2223,20 @@ function elementMatcher( matchers ) {
2297
2223
  function( elem, context, xml ) {
2298
2224
  var i = matchers.length;
2299
2225
  while ( i-- ) {
2300
- if ( !matchers[i]( elem, context, xml ) ) {
2226
+ if ( !matchers[ i ]( elem, context, xml ) ) {
2301
2227
  return false;
2302
2228
  }
2303
2229
  }
2304
2230
  return true;
2305
2231
  } :
2306
- matchers[0];
2232
+ matchers[ 0 ];
2307
2233
  }
2308
2234
 
2309
2235
  function multipleContexts( selector, contexts, results ) {
2310
2236
  var i = 0,
2311
2237
  len = contexts.length;
2312
2238
  for ( ; i < len; i++ ) {
2313
- Sizzle( selector, contexts[i], results );
2239
+ find( selector, contexts[ i ], results );
2314
2240
  }
2315
2241
  return results;
2316
2242
  }
@@ -2323,7 +2249,7 @@ function condense( unmatched, map, filter, context, xml ) {
2323
2249
  mapped = map != null;
2324
2250
 
2325
2251
  for ( ; i < len; i++ ) {
2326
- if ( (elem = unmatched[i]) ) {
2252
+ if ( ( elem = unmatched[ i ] ) ) {
2327
2253
  if ( !filter || filter( elem, context, xml ) ) {
2328
2254
  newUnmatched.push( elem );
2329
2255
  if ( mapped ) {
@@ -2343,34 +2269,38 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2343
2269
  if ( postFinder && !postFinder[ expando ] ) {
2344
2270
  postFinder = setMatcher( postFinder, postSelector );
2345
2271
  }
2346
- return markFunction(function( seed, results, context, xml ) {
2347
- var temp, i, elem,
2272
+ return markFunction( function( seed, results, context, xml ) {
2273
+ var temp, i, elem, matcherOut,
2348
2274
  preMap = [],
2349
2275
  postMap = [],
2350
2276
  preexisting = results.length,
2351
2277
 
2352
2278
  // Get initial elements from seed or context
2353
- elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2279
+ elems = seed ||
2280
+ multipleContexts( selector || "*",
2281
+ context.nodeType ? [ context ] : context, [] ),
2354
2282
 
2355
2283
  // Prefilter to get matcher input, preserving a map for seed-results synchronization
2356
2284
  matcherIn = preFilter && ( seed || !selector ) ?
2357
2285
  condense( elems, preMap, preFilter, context, xml ) :
2358
- elems,
2286
+ elems;
2287
+
2288
+ if ( matcher ) {
2359
2289
 
2360
- matcherOut = matcher ?
2361
- // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2362
- postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2290
+ // If we have a postFinder, or filtered seed, or non-seed postFilter
2291
+ // or preexisting results,
2292
+ matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2363
2293
 
2364
- // ...intermediate processing is necessary
2365
- [] :
2294
+ // ...intermediate processing is necessary
2295
+ [] :
2366
2296
 
2367
- // ...otherwise use results directly
2368
- results :
2369
- matcherIn;
2297
+ // ...otherwise use results directly
2298
+ results;
2370
2299
 
2371
- // Find primary matches
2372
- if ( matcher ) {
2300
+ // Find primary matches
2373
2301
  matcher( matcherIn, matcherOut, context, xml );
2302
+ } else {
2303
+ matcherOut = matcherIn;
2374
2304
  }
2375
2305
 
2376
2306
  // Apply postFilter
@@ -2381,8 +2311,8 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2381
2311
  // Un-match failing elements by moving them back to matcherIn
2382
2312
  i = temp.length;
2383
2313
  while ( i-- ) {
2384
- if ( (elem = temp[i]) ) {
2385
- matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2314
+ if ( ( elem = temp[ i ] ) ) {
2315
+ matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
2386
2316
  }
2387
2317
  }
2388
2318
  }
@@ -2390,25 +2320,27 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2390
2320
  if ( seed ) {
2391
2321
  if ( postFinder || preFilter ) {
2392
2322
  if ( postFinder ) {
2323
+
2393
2324
  // Get the final matcherOut by condensing this intermediate into postFinder contexts
2394
2325
  temp = [];
2395
2326
  i = matcherOut.length;
2396
2327
  while ( i-- ) {
2397
- if ( (elem = matcherOut[i]) ) {
2328
+ if ( ( elem = matcherOut[ i ] ) ) {
2329
+
2398
2330
  // Restore matcherIn since elem is not yet a final match
2399
- temp.push( (matcherIn[i] = elem) );
2331
+ temp.push( ( matcherIn[ i ] = elem ) );
2400
2332
  }
2401
2333
  }
2402
- postFinder( null, (matcherOut = []), temp, xml );
2334
+ postFinder( null, ( matcherOut = [] ), temp, xml );
2403
2335
  }
2404
2336
 
2405
2337
  // Move matched elements from seed to results to keep them synchronized
2406
2338
  i = matcherOut.length;
2407
2339
  while ( i-- ) {
2408
- if ( (elem = matcherOut[i]) &&
2409
- (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
2340
+ if ( ( elem = matcherOut[ i ] ) &&
2341
+ ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) {
2410
2342
 
2411
- seed[temp] = !(results[temp] = elem);
2343
+ seed[ temp ] = !( results[ temp ] = elem );
2412
2344
  }
2413
2345
  }
2414
2346
  }
@@ -2426,14 +2358,14 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2426
2358
  push.apply( results, matcherOut );
2427
2359
  }
2428
2360
  }
2429
- });
2361
+ } );
2430
2362
  }
2431
2363
 
2432
2364
  function matcherFromTokens( tokens ) {
2433
2365
  var checkContext, matcher, j,
2434
2366
  len = tokens.length,
2435
- leadingRelative = Expr.relative[ tokens[0].type ],
2436
- implicitRelative = leadingRelative || Expr.relative[" "],
2367
+ leadingRelative = Expr.relative[ tokens[ 0 ].type ],
2368
+ implicitRelative = leadingRelative || Expr.relative[ " " ],
2437
2369
  i = leadingRelative ? 1 : 0,
2438
2370
 
2439
2371
  // The foundational matcher ensures that elements are reachable from top-level context(s)
@@ -2441,42 +2373,52 @@ function matcherFromTokens( tokens ) {
2441
2373
  return elem === checkContext;
2442
2374
  }, implicitRelative, true ),
2443
2375
  matchAnyContext = addCombinator( function( elem ) {
2444
- return indexOf( checkContext, elem ) > -1;
2376
+ return indexOf.call( checkContext, elem ) > -1;
2445
2377
  }, implicitRelative, true ),
2446
2378
  matchers = [ function( elem, context, xml ) {
2447
- var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2448
- (checkContext = context).nodeType ?
2379
+
2380
+ // Support: IE 11+, Edge 17 - 18+
2381
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2382
+ // two documents; shallow comparisons work.
2383
+ // eslint-disable-next-line eqeqeq
2384
+ var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || (
2385
+ ( checkContext = context ).nodeType ?
2449
2386
  matchContext( elem, context, xml ) :
2450
2387
  matchAnyContext( elem, context, xml ) );
2451
- // Avoid hanging onto element (issue #299)
2388
+
2389
+ // Avoid hanging onto element
2390
+ // (see https://github.com/jquery/sizzle/issues/299)
2452
2391
  checkContext = null;
2453
2392
  return ret;
2454
2393
  } ];
2455
2394
 
2456
2395
  for ( ; i < len; i++ ) {
2457
- if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2458
- matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2396
+ if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
2397
+ matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
2459
2398
  } else {
2460
- matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2399
+ matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
2461
2400
 
2462
2401
  // Return special upon seeing a positional matcher
2463
2402
  if ( matcher[ expando ] ) {
2403
+
2464
2404
  // Find the next relative operator (if any) for proper handling
2465
2405
  j = ++i;
2466
2406
  for ( ; j < len; j++ ) {
2467
- if ( Expr.relative[ tokens[j].type ] ) {
2407
+ if ( Expr.relative[ tokens[ j ].type ] ) {
2468
2408
  break;
2469
2409
  }
2470
2410
  }
2471
2411
  return setMatcher(
2472
2412
  i > 1 && elementMatcher( matchers ),
2473
2413
  i > 1 && toSelector(
2414
+
2474
2415
  // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2475
- tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2476
- ).replace( rtrim, "$1" ),
2416
+ tokens.slice( 0, i - 1 )
2417
+ .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
2418
+ ).replace( rtrimCSS, "$1" ),
2477
2419
  matcher,
2478
2420
  i < j && matcherFromTokens( tokens.slice( i, j ) ),
2479
- j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2421
+ j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
2480
2422
  j < len && toSelector( tokens )
2481
2423
  );
2482
2424
  }
@@ -2497,29 +2439,42 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2497
2439
  unmatched = seed && [],
2498
2440
  setMatched = [],
2499
2441
  contextBackup = outermostContext,
2442
+
2500
2443
  // We must always have either seed elements or outermost context
2501
- elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2444
+ elems = seed || byElement && Expr.find.TAG( "*", outermost ),
2445
+
2502
2446
  // Use integer dirruns iff this is the outermost matcher
2503
- dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2447
+ dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
2504
2448
  len = elems.length;
2505
2449
 
2506
2450
  if ( outermost ) {
2507
- outermostContext = context === document || context || outermost;
2451
+
2452
+ // Support: IE 11+, Edge 17 - 18+
2453
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2454
+ // two documents; shallow comparisons work.
2455
+ // eslint-disable-next-line eqeqeq
2456
+ outermostContext = context == document || context || outermost;
2508
2457
  }
2509
2458
 
2510
2459
  // Add elements passing elementMatchers directly to results
2511
- // Support: IE<9, Safari
2512
- // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2513
- for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2460
+ // Support: iOS <=7 - 9 only
2461
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching
2462
+ // elements by id. (see trac-14142)
2463
+ for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
2514
2464
  if ( byElement && elem ) {
2515
2465
  j = 0;
2516
- if ( !context && elem.ownerDocument !== document ) {
2466
+
2467
+ // Support: IE 11+, Edge 17 - 18+
2468
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2469
+ // two documents; shallow comparisons work.
2470
+ // eslint-disable-next-line eqeqeq
2471
+ if ( !context && elem.ownerDocument != document ) {
2517
2472
  setDocument( elem );
2518
2473
  xml = !documentIsHTML;
2519
2474
  }
2520
- while ( (matcher = elementMatchers[j++]) ) {
2521
- if ( matcher( elem, context || document, xml) ) {
2522
- results.push( elem );
2475
+ while ( ( matcher = elementMatchers[ j++ ] ) ) {
2476
+ if ( matcher( elem, context || document, xml ) ) {
2477
+ push.call( results, elem );
2523
2478
  break;
2524
2479
  }
2525
2480
  }
@@ -2530,8 +2485,9 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2530
2485
 
2531
2486
  // Track unmatched elements for set filters
2532
2487
  if ( bySet ) {
2488
+
2533
2489
  // They will have gone through all possible matchers
2534
- if ( (elem = !matcher && elem) ) {
2490
+ if ( ( elem = !matcher && elem ) ) {
2535
2491
  matchedCount--;
2536
2492
  }
2537
2493
 
@@ -2555,16 +2511,17 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2555
2511
  // numerically zero.
2556
2512
  if ( bySet && i !== matchedCount ) {
2557
2513
  j = 0;
2558
- while ( (matcher = setMatchers[j++]) ) {
2514
+ while ( ( matcher = setMatchers[ j++ ] ) ) {
2559
2515
  matcher( unmatched, setMatched, context, xml );
2560
2516
  }
2561
2517
 
2562
2518
  if ( seed ) {
2519
+
2563
2520
  // Reintegrate element matches to eliminate the need for sorting
2564
2521
  if ( matchedCount > 0 ) {
2565
2522
  while ( i-- ) {
2566
- if ( !(unmatched[i] || setMatched[i]) ) {
2567
- setMatched[i] = pop.call( results );
2523
+ if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
2524
+ setMatched[ i ] = pop.call( results );
2568
2525
  }
2569
2526
  }
2570
2527
  }
@@ -2580,7 +2537,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2580
2537
  if ( outermost && !seed && setMatched.length > 0 &&
2581
2538
  ( matchedCount + setMatchers.length ) > 1 ) {
2582
2539
 
2583
- Sizzle.uniqueSort( results );
2540
+ jQuery.uniqueSort( results );
2584
2541
  }
2585
2542
  }
2586
2543
 
@@ -2598,20 +2555,21 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2598
2555
  superMatcher;
2599
2556
  }
2600
2557
 
2601
- compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2558
+ function compile( selector, match /* Internal Use Only */ ) {
2602
2559
  var i,
2603
2560
  setMatchers = [],
2604
2561
  elementMatchers = [],
2605
2562
  cached = compilerCache[ selector + " " ];
2606
2563
 
2607
2564
  if ( !cached ) {
2565
+
2608
2566
  // Generate a function of recursive functions that can be used to check each element
2609
2567
  if ( !match ) {
2610
2568
  match = tokenize( selector );
2611
2569
  }
2612
2570
  i = match.length;
2613
2571
  while ( i-- ) {
2614
- cached = matcherFromTokens( match[i] );
2572
+ cached = matcherFromTokens( match[ i ] );
2615
2573
  if ( cached[ expando ] ) {
2616
2574
  setMatchers.push( cached );
2617
2575
  } else {
@@ -2620,27 +2578,28 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2620
2578
  }
2621
2579
 
2622
2580
  // Cache the compiled function
2623
- cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2581
+ cached = compilerCache( selector,
2582
+ matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2624
2583
 
2625
2584
  // Save selector and tokenization
2626
2585
  cached.selector = selector;
2627
2586
  }
2628
2587
  return cached;
2629
- };
2588
+ }
2630
2589
 
2631
2590
  /**
2632
- * A low-level selection function that works with Sizzle's compiled
2591
+ * A low-level selection function that works with jQuery's compiled
2633
2592
  * selector functions
2634
2593
  * @param {String|Function} selector A selector or a pre-compiled
2635
- * selector function built with Sizzle.compile
2594
+ * selector function built with jQuery selector compile
2636
2595
  * @param {Element} context
2637
2596
  * @param {Array} [results]
2638
2597
  * @param {Array} [seed] A set of elements to match against
2639
2598
  */
2640
- select = Sizzle.select = function( selector, context, results, seed ) {
2599
+ function select( selector, context, results, seed ) {
2641
2600
  var i, tokens, token, type, find,
2642
2601
  compiled = typeof selector === "function" && selector,
2643
- match = !seed && tokenize( (selector = compiled.selector || selector) );
2602
+ match = !seed && tokenize( ( selector = compiled.selector || selector ) );
2644
2603
 
2645
2604
  results = results || [];
2646
2605
 
@@ -2649,11 +2608,14 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2649
2608
  if ( match.length === 1 ) {
2650
2609
 
2651
2610
  // Reduce context if the leading compound selector is an ID
2652
- tokens = match[0] = match[0].slice( 0 );
2653
- if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2654
- context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
2655
-
2656
- context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2611
+ tokens = match[ 0 ] = match[ 0 ].slice( 0 );
2612
+ if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
2613
+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
2614
+
2615
+ context = ( Expr.find.ID(
2616
+ token.matches[ 0 ].replace( runescape, funescape ),
2617
+ context
2618
+ ) || [] )[ 0 ];
2657
2619
  if ( !context ) {
2658
2620
  return results;
2659
2621
 
@@ -2666,20 +2628,22 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2666
2628
  }
2667
2629
 
2668
2630
  // Fetch a seed set for right-to-left matching
2669
- i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2631
+ i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length;
2670
2632
  while ( i-- ) {
2671
- token = tokens[i];
2633
+ token = tokens[ i ];
2672
2634
 
2673
2635
  // Abort if we hit a combinator
2674
- if ( Expr.relative[ (type = token.type) ] ) {
2636
+ if ( Expr.relative[ ( type = token.type ) ] ) {
2675
2637
  break;
2676
2638
  }
2677
- if ( (find = Expr.find[ type ]) ) {
2639
+ if ( ( find = Expr.find[ type ] ) ) {
2640
+
2678
2641
  // Search, expanding context for leading sibling combinators
2679
- if ( (seed = find(
2680
- token.matches[0].replace( runescape, funescape ),
2681
- rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2682
- )) ) {
2642
+ if ( ( seed = find(
2643
+ token.matches[ 0 ].replace( runescape, funescape ),
2644
+ rsibling.test( tokens[ 0 ].type ) &&
2645
+ testContext( context.parentNode ) || context
2646
+ ) ) ) {
2683
2647
 
2684
2648
  // If seed is empty or no tokens remain, we can return early
2685
2649
  tokens.splice( i, 1 );
@@ -2705,89 +2669,48 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2705
2669
  !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2706
2670
  );
2707
2671
  return results;
2708
- };
2672
+ }
2709
2673
 
2710
2674
  // One-time assignments
2711
2675
 
2676
+ // Support: Android <=4.0 - 4.1+
2712
2677
  // Sort stability
2713
- support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2714
-
2715
- // Support: Chrome 14-35+
2716
- // Always assume duplicates if they aren't passed to the comparison function
2717
- support.detectDuplicates = !!hasDuplicate;
2678
+ support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
2718
2679
 
2719
2680
  // Initialize against the default document
2720
2681
  setDocument();
2721
2682
 
2722
- // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2683
+ // Support: Android <=4.0 - 4.1+
2723
2684
  // Detached nodes confoundingly follow *each other*
2724
- support.sortDetached = assert(function( el ) {
2725
- // Should return 1, but returns 4 (following)
2726
- return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
2727
- });
2728
-
2729
- // Support: IE<8
2730
- // Prevent attribute/property "interpolation"
2731
- // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2732
- if ( !assert(function( el ) {
2733
- el.innerHTML = "<a href='#'></a>";
2734
- return el.firstChild.getAttribute("href") === "#" ;
2735
- }) ) {
2736
- addHandle( "type|href|height|width", function( elem, name, isXML ) {
2737
- if ( !isXML ) {
2738
- return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2739
- }
2740
- });
2741
- }
2742
-
2743
- // Support: IE<9
2744
- // Use defaultValue in place of getAttribute("value")
2745
- if ( !support.attributes || !assert(function( el ) {
2746
- el.innerHTML = "<input/>";
2747
- el.firstChild.setAttribute( "value", "" );
2748
- return el.firstChild.getAttribute( "value" ) === "";
2749
- }) ) {
2750
- addHandle( "value", function( elem, name, isXML ) {
2751
- if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2752
- return elem.defaultValue;
2753
- }
2754
- });
2755
- }
2756
-
2757
- // Support: IE<9
2758
- // Use getAttributeNode to fetch booleans when getAttribute lies
2759
- if ( !assert(function( el ) {
2760
- return el.getAttribute("disabled") == null;
2761
- }) ) {
2762
- addHandle( booleans, function( elem, name, isXML ) {
2763
- var val;
2764
- if ( !isXML ) {
2765
- return elem[ name ] === true ? name.toLowerCase() :
2766
- (val = elem.getAttributeNode( name )) && val.specified ?
2767
- val.value :
2768
- null;
2769
- }
2770
- });
2771
- }
2772
-
2773
- return Sizzle;
2774
-
2775
- })( window );
2776
-
2685
+ support.sortDetached = assert( function( el ) {
2777
2686
 
2687
+ // Should return 1, but returns 4 (following)
2688
+ return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
2689
+ } );
2778
2690
 
2779
- jQuery.find = Sizzle;
2780
- jQuery.expr = Sizzle.selectors;
2691
+ jQuery.find = find;
2781
2692
 
2782
2693
  // Deprecated
2783
2694
  jQuery.expr[ ":" ] = jQuery.expr.pseudos;
2784
- jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
2785
- jQuery.text = Sizzle.getText;
2786
- jQuery.isXMLDoc = Sizzle.isXML;
2787
- jQuery.contains = Sizzle.contains;
2788
- jQuery.escapeSelector = Sizzle.escape;
2695
+ jQuery.unique = jQuery.uniqueSort;
2696
+
2697
+ // These have always been private, but they used to be documented
2698
+ // as part of Sizzle so let's maintain them in the 3.x line
2699
+ // for backwards compatibility purposes.
2700
+ find.compile = compile;
2701
+ find.select = select;
2702
+ find.setDocument = setDocument;
2703
+
2704
+ find.escape = jQuery.escapeSelector;
2705
+ find.getText = jQuery.text;
2706
+ find.isXML = jQuery.isXMLDoc;
2707
+ find.selectors = jQuery.expr;
2708
+ find.support = jQuery.support;
2709
+ find.uniqueSort = jQuery.uniqueSort;
2789
2710
 
2711
+ /* eslint-enable */
2790
2712
 
2713
+ } )();
2791
2714
 
2792
2715
 
2793
2716
  var dir = function( elem, dir, until ) {
@@ -2821,13 +2744,6 @@ var siblings = function( n, elem ) {
2821
2744
 
2822
2745
  var rneedsContext = jQuery.expr.match.needsContext;
2823
2746
 
2824
-
2825
-
2826
- function nodeName( elem, name ) {
2827
-
2828
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
2829
-
2830
- };
2831
2747
  var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
2832
2748
 
2833
2749
 
@@ -2926,8 +2842,8 @@ jQuery.fn.extend( {
2926
2842
  var rootjQuery,
2927
2843
 
2928
2844
  // A simple way to check for HTML strings
2929
- // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
2930
- // Strict HTML recognition (#11290: must start with <)
2845
+ // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)
2846
+ // Strict HTML recognition (trac-11290: must start with <)
2931
2847
  // Shortcut simple #id case for speed
2932
2848
  rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
2933
2849
 
@@ -3078,7 +2994,7 @@ jQuery.fn.extend( {
3078
2994
  if ( cur.nodeType < 11 && ( targets ?
3079
2995
  targets.index( cur ) > -1 :
3080
2996
 
3081
- // Don't pass non-elements to Sizzle
2997
+ // Don't pass non-elements to jQuery#find
3082
2998
  cur.nodeType === 1 &&
3083
2999
  jQuery.find.matchesSelector( cur, selectors ) ) ) {
3084
3000
 
@@ -3141,7 +3057,7 @@ jQuery.each( {
3141
3057
  parents: function( elem ) {
3142
3058
  return dir( elem, "parentNode" );
3143
3059
  },
3144
- parentsUntil: function( elem, i, until ) {
3060
+ parentsUntil: function( elem, _i, until ) {
3145
3061
  return dir( elem, "parentNode", until );
3146
3062
  },
3147
3063
  next: function( elem ) {
@@ -3156,10 +3072,10 @@ jQuery.each( {
3156
3072
  prevAll: function( elem ) {
3157
3073
  return dir( elem, "previousSibling" );
3158
3074
  },
3159
- nextUntil: function( elem, i, until ) {
3075
+ nextUntil: function( elem, _i, until ) {
3160
3076
  return dir( elem, "nextSibling", until );
3161
3077
  },
3162
- prevUntil: function( elem, i, until ) {
3078
+ prevUntil: function( elem, _i, until ) {
3163
3079
  return dir( elem, "previousSibling", until );
3164
3080
  },
3165
3081
  siblings: function( elem ) {
@@ -3169,7 +3085,13 @@ jQuery.each( {
3169
3085
  return siblings( elem.firstChild );
3170
3086
  },
3171
3087
  contents: function( elem ) {
3172
- if ( typeof elem.contentDocument !== "undefined" ) {
3088
+ if ( elem.contentDocument != null &&
3089
+
3090
+ // Support: IE 11+
3091
+ // <object> elements with no `data` attribute has an object
3092
+ // `contentDocument` with a `null` prototype.
3093
+ getProto( elem.contentDocument ) ) {
3094
+
3173
3095
  return elem.contentDocument;
3174
3096
  }
3175
3097
 
@@ -3512,7 +3434,7 @@ jQuery.extend( {
3512
3434
  var fns = arguments;
3513
3435
 
3514
3436
  return jQuery.Deferred( function( newDefer ) {
3515
- jQuery.each( tuples, function( i, tuple ) {
3437
+ jQuery.each( tuples, function( _i, tuple ) {
3516
3438
 
3517
3439
  // Map tuples (progress, done, fail) to arguments (done, fail, progress)
3518
3440
  var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
@@ -3627,7 +3549,7 @@ jQuery.extend( {
3627
3549
 
3628
3550
  if ( jQuery.Deferred.exceptionHook ) {
3629
3551
  jQuery.Deferred.exceptionHook( e,
3630
- process.stackTrace );
3552
+ process.error );
3631
3553
  }
3632
3554
 
3633
3555
  // Support: Promises/A+ section 2.3.3.3.4.1
@@ -3655,10 +3577,17 @@ jQuery.extend( {
3655
3577
  process();
3656
3578
  } else {
3657
3579
 
3658
- // Call an optional hook to record the stack, in case of exception
3580
+ // Call an optional hook to record the error, in case of exception
3659
3581
  // since it's otherwise lost when execution goes async
3660
- if ( jQuery.Deferred.getStackHook ) {
3661
- process.stackTrace = jQuery.Deferred.getStackHook();
3582
+ if ( jQuery.Deferred.getErrorHook ) {
3583
+ process.error = jQuery.Deferred.getErrorHook();
3584
+
3585
+ // The deprecated alias of the above. While the name suggests
3586
+ // returning the stack, not an error instance, jQuery just passes
3587
+ // it directly to `console.warn` so both will work; an instance
3588
+ // just better cooperates with source maps.
3589
+ } else if ( jQuery.Deferred.getStackHook ) {
3590
+ process.error = jQuery.Deferred.getStackHook();
3662
3591
  }
3663
3592
  window.setTimeout( process );
3664
3593
  }
@@ -3792,8 +3721,8 @@ jQuery.extend( {
3792
3721
  resolveContexts = Array( i ),
3793
3722
  resolveValues = slice.call( arguments ),
3794
3723
 
3795
- // the master Deferred
3796
- master = jQuery.Deferred(),
3724
+ // the primary Deferred
3725
+ primary = jQuery.Deferred(),
3797
3726
 
3798
3727
  // subordinate callback factory
3799
3728
  updateFunc = function( i ) {
@@ -3801,30 +3730,30 @@ jQuery.extend( {
3801
3730
  resolveContexts[ i ] = this;
3802
3731
  resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
3803
3732
  if ( !( --remaining ) ) {
3804
- master.resolveWith( resolveContexts, resolveValues );
3733
+ primary.resolveWith( resolveContexts, resolveValues );
3805
3734
  }
3806
3735
  };
3807
3736
  };
3808
3737
 
3809
3738
  // Single- and empty arguments are adopted like Promise.resolve
3810
3739
  if ( remaining <= 1 ) {
3811
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
3740
+ adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
3812
3741
  !remaining );
3813
3742
 
3814
3743
  // Use .then() to unwrap secondary thenables (cf. gh-3000)
3815
- if ( master.state() === "pending" ||
3744
+ if ( primary.state() === "pending" ||
3816
3745
  isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
3817
3746
 
3818
- return master.then();
3747
+ return primary.then();
3819
3748
  }
3820
3749
  }
3821
3750
 
3822
3751
  // Multiple arguments are aggregated like Promise.all array elements
3823
3752
  while ( i-- ) {
3824
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
3753
+ adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
3825
3754
  }
3826
3755
 
3827
- return master.promise();
3756
+ return primary.promise();
3828
3757
  }
3829
3758
  } );
3830
3759
 
@@ -3833,12 +3762,16 @@ jQuery.extend( {
3833
3762
  // warn about them ASAP rather than swallowing them by default.
3834
3763
  var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
3835
3764
 
3836
- jQuery.Deferred.exceptionHook = function( error, stack ) {
3765
+ // If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error
3766
+ // captured before the async barrier to get the original error cause
3767
+ // which may otherwise be hidden.
3768
+ jQuery.Deferred.exceptionHook = function( error, asyncError ) {
3837
3769
 
3838
3770
  // Support: IE 8 - 9 only
3839
3771
  // Console exists when dev tools are open, which can happen at any time
3840
3772
  if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
3841
- window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
3773
+ window.console.warn( "jQuery.Deferred exception: " + error.message,
3774
+ error.stack, asyncError );
3842
3775
  }
3843
3776
  };
3844
3777
 
@@ -3878,7 +3811,7 @@ jQuery.extend( {
3878
3811
  isReady: false,
3879
3812
 
3880
3813
  // A counter to track how many items to wait for before
3881
- // the ready event fires. See #6781
3814
+ // the ready event fires. See trac-6781
3882
3815
  readyWait: 1,
3883
3816
 
3884
3817
  // Handle when the DOM is ready
@@ -3965,7 +3898,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
3965
3898
  // ...except when executing function values
3966
3899
  } else {
3967
3900
  bulk = fn;
3968
- fn = function( elem, key, value ) {
3901
+ fn = function( elem, _key, value ) {
3969
3902
  return bulk.call( jQuery( elem ), value );
3970
3903
  };
3971
3904
  }
@@ -3975,8 +3908,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
3975
3908
  for ( ; i < len; i++ ) {
3976
3909
  fn(
3977
3910
  elems[ i ], key, raw ?
3978
- value :
3979
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
3911
+ value :
3912
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
3980
3913
  );
3981
3914
  }
3982
3915
  }
@@ -4000,13 +3933,13 @@ var rmsPrefix = /^-ms-/,
4000
3933
  rdashAlpha = /-([a-z])/g;
4001
3934
 
4002
3935
  // Used by camelCase as callback to replace()
4003
- function fcamelCase( all, letter ) {
3936
+ function fcamelCase( _all, letter ) {
4004
3937
  return letter.toUpperCase();
4005
3938
  }
4006
3939
 
4007
3940
  // Convert dashed to camelCase; used by the css and data modules
4008
3941
  // Support: IE <=9 - 11, Edge 12 - 15
4009
- // Microsoft forgot to hump their vendor prefix (#9572)
3942
+ // Microsoft forgot to hump their vendor prefix (trac-9572)
4010
3943
  function camelCase( string ) {
4011
3944
  return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
4012
3945
  }
@@ -4042,7 +3975,7 @@ Data.prototype = {
4042
3975
  value = {};
4043
3976
 
4044
3977
  // We can accept data for non-element nodes in modern browsers,
4045
- // but we should not, see #8335.
3978
+ // but we should not, see trac-8335.
4046
3979
  // Always return an empty object.
4047
3980
  if ( acceptData( owner ) ) {
4048
3981
 
@@ -4281,7 +4214,7 @@ jQuery.fn.extend( {
4281
4214
  while ( i-- ) {
4282
4215
 
4283
4216
  // Support: IE 11 only
4284
- // The attrs elements can be null (#14894)
4217
+ // The attrs elements can be null (trac-14894)
4285
4218
  if ( attrs[ i ] ) {
4286
4219
  name = attrs[ i ].name;
4287
4220
  if ( name.indexOf( "data-" ) === 0 ) {
@@ -4528,27 +4461,6 @@ var isHiddenWithinTree = function( elem, el ) {
4528
4461
  jQuery.css( elem, "display" ) === "none";
4529
4462
  };
4530
4463
 
4531
- var swap = function( elem, options, callback, args ) {
4532
- var ret, name,
4533
- old = {};
4534
-
4535
- // Remember the old values, and insert the new ones
4536
- for ( name in options ) {
4537
- old[ name ] = elem.style[ name ];
4538
- elem.style[ name ] = options[ name ];
4539
- }
4540
-
4541
- ret = callback.apply( elem, args || [] );
4542
-
4543
- // Revert the old values
4544
- for ( name in options ) {
4545
- elem.style[ name ] = old[ name ];
4546
- }
4547
-
4548
- return ret;
4549
- };
4550
-
4551
-
4552
4464
 
4553
4465
 
4554
4466
  function adjustCSS( elem, prop, valueParts, tween ) {
@@ -4719,11 +4631,40 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
4719
4631
 
4720
4632
 
4721
4633
 
4722
- // We have to close these tags to support XHTML (#13200)
4723
- var wrapMap = {
4634
+ ( function() {
4635
+ var fragment = document.createDocumentFragment(),
4636
+ div = fragment.appendChild( document.createElement( "div" ) ),
4637
+ input = document.createElement( "input" );
4638
+
4639
+ // Support: Android 4.0 - 4.3 only
4640
+ // Check state lost if the name is set (trac-11217)
4641
+ // Support: Windows Web Apps (WWA)
4642
+ // `name` and `type` must use .setAttribute for WWA (trac-14901)
4643
+ input.setAttribute( "type", "radio" );
4644
+ input.setAttribute( "checked", "checked" );
4645
+ input.setAttribute( "name", "t" );
4646
+
4647
+ div.appendChild( input );
4648
+
4649
+ // Support: Android <=4.1 only
4650
+ // Older WebKit doesn't clone checked state correctly in fragments
4651
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4652
+
4653
+ // Support: IE <=11 only
4654
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
4655
+ div.innerHTML = "<textarea>x</textarea>";
4656
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4724
4657
 
4725
4658
  // Support: IE <=9 only
4726
- option: [ 1, "<select multiple='multiple'>", "</select>" ],
4659
+ // IE <=9 replaces <option> tags with their contents when inserted outside of
4660
+ // the select element.
4661
+ div.innerHTML = "<option></option>";
4662
+ support.option = !!div.lastChild;
4663
+ } )();
4664
+
4665
+
4666
+ // We have to close these tags to support XHTML (trac-13200)
4667
+ var wrapMap = {
4727
4668
 
4728
4669
  // XHTML parsers do not magically insert elements in the
4729
4670
  // same way that tag soup parsers do. So we cannot shorten
@@ -4736,17 +4677,19 @@ var wrapMap = {
4736
4677
  _default: [ 0, "", "" ]
4737
4678
  };
4738
4679
 
4739
- // Support: IE <=9 only
4740
- wrapMap.optgroup = wrapMap.option;
4741
-
4742
4680
  wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4743
4681
  wrapMap.th = wrapMap.td;
4744
4682
 
4683
+ // Support: IE <=9 only
4684
+ if ( !support.option ) {
4685
+ wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
4686
+ }
4687
+
4745
4688
 
4746
4689
  function getAll( context, tag ) {
4747
4690
 
4748
4691
  // Support: IE <=9 - 11 only
4749
- // Use typeof to avoid zero-argument method invocation on host objects (#15151)
4692
+ // Use typeof to avoid zero-argument method invocation on host objects (trac-15151)
4750
4693
  var ret;
4751
4694
 
4752
4695
  if ( typeof context.getElementsByTagName !== "undefined" ) {
@@ -4829,7 +4772,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
4829
4772
  // Remember the top-level container
4830
4773
  tmp = fragment.firstChild;
4831
4774
 
4832
- // Ensure the created nodes are orphaned (#12392)
4775
+ // Ensure the created nodes are orphaned (trac-12392)
4833
4776
  tmp.textContent = "";
4834
4777
  }
4835
4778
  }
@@ -4870,40 +4813,11 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
4870
4813
  }
4871
4814
  }
4872
4815
 
4873
- return fragment;
4874
- }
4875
-
4876
-
4877
- ( function() {
4878
- var fragment = document.createDocumentFragment(),
4879
- div = fragment.appendChild( document.createElement( "div" ) ),
4880
- input = document.createElement( "input" );
4881
-
4882
- // Support: Android 4.0 - 4.3 only
4883
- // Check state lost if the name is set (#11217)
4884
- // Support: Windows Web Apps (WWA)
4885
- // `name` and `type` must use .setAttribute for WWA (#14901)
4886
- input.setAttribute( "type", "radio" );
4887
- input.setAttribute( "checked", "checked" );
4888
- input.setAttribute( "name", "t" );
4889
-
4890
- div.appendChild( input );
4891
-
4892
- // Support: Android <=4.1 only
4893
- // Older WebKit doesn't clone checked state correctly in fragments
4894
- support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4895
-
4896
- // Support: IE <=11 only
4897
- // Make sure textarea (and checkbox) defaultValue is properly cloned
4898
- div.innerHTML = "<textarea>x</textarea>";
4899
- support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4900
- } )();
4901
-
4816
+ return fragment;
4817
+ }
4902
4818
 
4903
- var
4904
- rkeyEvent = /^key/,
4905
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
4906
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
4819
+
4820
+ var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
4907
4821
 
4908
4822
  function returnTrue() {
4909
4823
  return true;
@@ -4913,25 +4827,6 @@ function returnFalse() {
4913
4827
  return false;
4914
4828
  }
4915
4829
 
4916
- // Support: IE <=9 - 11+
4917
- // focus() and blur() are asynchronous, except when they are no-op.
4918
- // So expect focus to be synchronous when the element is already active,
4919
- // and blur to be synchronous when the element is not already active.
4920
- // (focus and blur are always synchronous in other supported browsers,
4921
- // this just defines when we can count on it).
4922
- function expectSync( elem, type ) {
4923
- return ( elem === safeActiveElement() ) === ( type === "focus" );
4924
- }
4925
-
4926
- // Support: IE <=9 only
4927
- // Accessing document.activeElement can throw unexpectedly
4928
- // https://bugs.jquery.com/ticket/13393
4929
- function safeActiveElement() {
4930
- try {
4931
- return document.activeElement;
4932
- } catch ( err ) { }
4933
- }
4934
-
4935
4830
  function on( elem, types, selector, data, fn, one ) {
4936
4831
  var origFn, type;
4937
4832
 
@@ -5008,8 +4903,8 @@ jQuery.event = {
5008
4903
  special, handlers, type, namespaces, origType,
5009
4904
  elemData = dataPriv.get( elem );
5010
4905
 
5011
- // Don't attach events to noData or text/comment nodes (but allow plain objects)
5012
- if ( !elemData ) {
4906
+ // Only attach events to objects that accept data
4907
+ if ( !acceptData( elem ) ) {
5013
4908
  return;
5014
4909
  }
5015
4910
 
@@ -5033,7 +4928,7 @@ jQuery.event = {
5033
4928
 
5034
4929
  // Init the element's event structure and main handler, if this is the first
5035
4930
  if ( !( events = elemData.events ) ) {
5036
- events = elemData.events = {};
4931
+ events = elemData.events = Object.create( null );
5037
4932
  }
5038
4933
  if ( !( eventHandle = elemData.handle ) ) {
5039
4934
  eventHandle = elemData.handle = function( e ) {
@@ -5191,12 +5086,15 @@ jQuery.event = {
5191
5086
 
5192
5087
  dispatch: function( nativeEvent ) {
5193
5088
 
5194
- // Make a writable jQuery.Event from the native event object
5195
- var event = jQuery.event.fix( nativeEvent );
5196
-
5197
5089
  var i, j, ret, matched, handleObj, handlerQueue,
5198
5090
  args = new Array( arguments.length ),
5199
- handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
5091
+
5092
+ // Make a writable jQuery.Event from the native event object
5093
+ event = jQuery.event.fix( nativeEvent ),
5094
+
5095
+ handlers = (
5096
+ dataPriv.get( this, "events" ) || Object.create( null )
5097
+ )[ event.type ] || [],
5200
5098
  special = jQuery.event.special[ event.type ] || {};
5201
5099
 
5202
5100
  // Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5276,15 +5174,15 @@ jQuery.event = {
5276
5174
 
5277
5175
  for ( ; cur !== this; cur = cur.parentNode || this ) {
5278
5176
 
5279
- // Don't check non-elements (#13208)
5280
- // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5177
+ // Don't check non-elements (trac-13208)
5178
+ // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)
5281
5179
  if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
5282
5180
  matchedHandlers = [];
5283
5181
  matchedSelectors = {};
5284
5182
  for ( i = 0; i < delegateCount; i++ ) {
5285
5183
  handleObj = handlers[ i ];
5286
5184
 
5287
- // Don't conflict with Object.prototype properties (#13203)
5185
+ // Don't conflict with Object.prototype properties (trac-13203)
5288
5186
  sel = handleObj.selector + " ";
5289
5187
 
5290
5188
  if ( matchedSelectors[ sel ] === undefined ) {
@@ -5320,12 +5218,12 @@ jQuery.event = {
5320
5218
  get: isFunction( hook ) ?
5321
5219
  function() {
5322
5220
  if ( this.originalEvent ) {
5323
- return hook( this.originalEvent );
5221
+ return hook( this.originalEvent );
5324
5222
  }
5325
5223
  } :
5326
5224
  function() {
5327
5225
  if ( this.originalEvent ) {
5328
- return this.originalEvent[ name ];
5226
+ return this.originalEvent[ name ];
5329
5227
  }
5330
5228
  },
5331
5229
 
@@ -5366,7 +5264,7 @@ jQuery.event = {
5366
5264
  el.click && nodeName( el, "input" ) ) {
5367
5265
 
5368
5266
  // dataPriv.set( el, "click", ... )
5369
- leverageNative( el, "click", returnTrue );
5267
+ leverageNative( el, "click", true );
5370
5268
  }
5371
5269
 
5372
5270
  // Return false to allow normal processing in the caller
@@ -5417,10 +5315,10 @@ jQuery.event = {
5417
5315
  // synthetic events by interrupting progress until reinvoked in response to
5418
5316
  // *native* events that it fires directly, ensuring that state changes have
5419
5317
  // already occurred before other listeners are invoked.
5420
- function leverageNative( el, type, expectSync ) {
5318
+ function leverageNative( el, type, isSetup ) {
5421
5319
 
5422
- // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
5423
- if ( !expectSync ) {
5320
+ // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add
5321
+ if ( !isSetup ) {
5424
5322
  if ( dataPriv.get( el, type ) === undefined ) {
5425
5323
  jQuery.event.add( el, type, returnTrue );
5426
5324
  }
@@ -5432,15 +5330,13 @@ function leverageNative( el, type, expectSync ) {
5432
5330
  jQuery.event.add( el, type, {
5433
5331
  namespace: false,
5434
5332
  handler: function( event ) {
5435
- var notAsync, result,
5333
+ var result,
5436
5334
  saved = dataPriv.get( this, type );
5437
5335
 
5438
5336
  if ( ( event.isTrigger & 1 ) && this[ type ] ) {
5439
5337
 
5440
5338
  // Interrupt processing of the outer synthetic .trigger()ed event
5441
- // Saved data should be false in such cases, but might be a leftover capture object
5442
- // from an async native handler (gh-4350)
5443
- if ( !saved.length ) {
5339
+ if ( !saved ) {
5444
5340
 
5445
5341
  // Store arguments for use when handling the inner native event
5446
5342
  // There will always be at least one argument (an event object), so this array
@@ -5449,27 +5345,22 @@ function leverageNative( el, type, expectSync ) {
5449
5345
  dataPriv.set( this, type, saved );
5450
5346
 
5451
5347
  // Trigger the native event and capture its result
5452
- // Support: IE <=9 - 11+
5453
- // focus() and blur() are asynchronous
5454
- notAsync = expectSync( this, type );
5455
5348
  this[ type ]();
5456
5349
  result = dataPriv.get( this, type );
5457
- if ( saved !== result || notAsync ) {
5458
- dataPriv.set( this, type, false );
5459
- } else {
5460
- result = {};
5461
- }
5350
+ dataPriv.set( this, type, false );
5351
+
5462
5352
  if ( saved !== result ) {
5463
5353
 
5464
5354
  // Cancel the outer synthetic event
5465
5355
  event.stopImmediatePropagation();
5466
5356
  event.preventDefault();
5467
- return result.value;
5357
+
5358
+ return result;
5468
5359
  }
5469
5360
 
5470
5361
  // If this is an inner synthetic event for an event with a bubbling surrogate
5471
- // (focus or blur), assume that the surrogate already propagated from triggering the
5472
- // native event and prevent that from happening again here.
5362
+ // (focus or blur), assume that the surrogate already propagated from triggering
5363
+ // the native event and prevent that from happening again here.
5473
5364
  // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
5474
5365
  // bubbling surrogate propagates *after* the non-bubbling base), but that seems
5475
5366
  // less bad than duplication.
@@ -5479,22 +5370,25 @@ function leverageNative( el, type, expectSync ) {
5479
5370
 
5480
5371
  // If this is a native event triggered above, everything is now in order
5481
5372
  // Fire an inner synthetic event with the original arguments
5482
- } else if ( saved.length ) {
5373
+ } else if ( saved ) {
5483
5374
 
5484
5375
  // ...and capture the result
5485
- dataPriv.set( this, type, {
5486
- value: jQuery.event.trigger(
5487
-
5488
- // Support: IE <=9 - 11+
5489
- // Extend with the prototype to reset the above stopImmediatePropagation()
5490
- jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
5491
- saved.slice( 1 ),
5492
- this
5493
- )
5494
- } );
5495
-
5496
- // Abort handling of the native event
5497
- event.stopImmediatePropagation();
5376
+ dataPriv.set( this, type, jQuery.event.trigger(
5377
+ saved[ 0 ],
5378
+ saved.slice( 1 ),
5379
+ this
5380
+ ) );
5381
+
5382
+ // Abort handling of the native event by all jQuery handlers while allowing
5383
+ // native handlers on the same element to run. On target, this is achieved
5384
+ // by stopping immediate propagation just on the jQuery event. However,
5385
+ // the native event is re-wrapped by a jQuery one on each level of the
5386
+ // propagation so the only way to stop it for jQuery is to stop it for
5387
+ // everyone via native `stopPropagation()`. This is not a problem for
5388
+ // focus/blur which don't bubble, but it does also stop click on checkboxes
5389
+ // and radios. We accept this limitation.
5390
+ event.stopPropagation();
5391
+ event.isImmediatePropagationStopped = returnTrue;
5498
5392
  }
5499
5393
  }
5500
5394
  } );
@@ -5532,7 +5426,7 @@ jQuery.Event = function( src, props ) {
5532
5426
 
5533
5427
  // Create target properties
5534
5428
  // Support: Safari <=6 - 7 only
5535
- // Target should not be a text node (#504, #13143)
5429
+ // Target should not be a text node (trac-504, trac-13143)
5536
5430
  this.target = ( src.target && src.target.nodeType === 3 ) ?
5537
5431
  src.target.parentNode :
5538
5432
  src.target;
@@ -5629,49 +5523,77 @@ jQuery.each( {
5629
5523
  targetTouches: true,
5630
5524
  toElement: true,
5631
5525
  touches: true,
5526
+ which: true
5527
+ }, jQuery.event.addProp );
5632
5528
 
5633
- which: function( event ) {
5634
- var button = event.button;
5529
+ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5635
5530
 
5636
- // Add which for key events
5637
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
5638
- return event.charCode != null ? event.charCode : event.keyCode;
5639
- }
5531
+ function focusMappedHandler( nativeEvent ) {
5532
+ if ( document.documentMode ) {
5640
5533
 
5641
- // Add which for click: 1 === left; 2 === middle; 3 === right
5642
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
5643
- if ( button & 1 ) {
5644
- return 1;
5645
- }
5534
+ // Support: IE 11+
5535
+ // Attach a single focusin/focusout handler on the document while someone wants
5536
+ // focus/blur. This is because the former are synchronous in IE while the latter
5537
+ // are async. In other browsers, all those handlers are invoked synchronously.
5646
5538
 
5647
- if ( button & 2 ) {
5648
- return 3;
5649
- }
5539
+ // `handle` from private data would already wrap the event, but we need
5540
+ // to change the `type` here.
5541
+ var handle = dataPriv.get( this, "handle" ),
5542
+ event = jQuery.event.fix( nativeEvent );
5543
+ event.type = nativeEvent.type === "focusin" ? "focus" : "blur";
5544
+ event.isSimulated = true;
5545
+
5546
+ // First, handle focusin/focusout
5547
+ handle( nativeEvent );
5548
+
5549
+ // ...then, handle focus/blur
5550
+ //
5551
+ // focus/blur don't bubble while focusin/focusout do; simulate the former by only
5552
+ // invoking the handler at the lower level.
5553
+ if ( event.target === event.currentTarget ) {
5650
5554
 
5651
- if ( button & 4 ) {
5652
- return 2;
5555
+ // The setup part calls `leverageNative`, which, in turn, calls
5556
+ // `jQuery.event.add`, so event handle will already have been set
5557
+ // by this point.
5558
+ handle( event );
5653
5559
  }
5560
+ } else {
5654
5561
 
5655
- return 0;
5562
+ // For non-IE browsers, attach a single capturing handler on the document
5563
+ // while someone wants focusin/focusout.
5564
+ jQuery.event.simulate( delegateType, nativeEvent.target,
5565
+ jQuery.event.fix( nativeEvent ) );
5656
5566
  }
5657
-
5658
- return event.which;
5659
5567
  }
5660
- }, jQuery.event.addProp );
5661
5568
 
5662
- jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5663
5569
  jQuery.event.special[ type ] = {
5664
5570
 
5665
5571
  // Utilize native event if possible so blur/focus sequence is correct
5666
5572
  setup: function() {
5667
5573
 
5574
+ var attaches;
5575
+
5668
5576
  // Claim the first handler
5669
5577
  // dataPriv.set( this, "focus", ... )
5670
5578
  // dataPriv.set( this, "blur", ... )
5671
- leverageNative( this, type, expectSync );
5579
+ leverageNative( this, type, true );
5672
5580
 
5673
- // Return false to allow normal processing in the caller
5674
- return false;
5581
+ if ( document.documentMode ) {
5582
+
5583
+ // Support: IE 9 - 11+
5584
+ // We use the same native handler for focusin & focus (and focusout & blur)
5585
+ // so we need to coordinate setup & teardown parts between those events.
5586
+ // Use `delegateType` as the key as `type` is already used by `leverageNative`.
5587
+ attaches = dataPriv.get( this, delegateType );
5588
+ if ( !attaches ) {
5589
+ this.addEventListener( delegateType, focusMappedHandler );
5590
+ }
5591
+ dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 );
5592
+ } else {
5593
+
5594
+ // Return false to allow normal processing in the caller
5595
+ return false;
5596
+ }
5675
5597
  },
5676
5598
  trigger: function() {
5677
5599
 
@@ -5682,8 +5604,84 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
5682
5604
  return true;
5683
5605
  },
5684
5606
 
5607
+ teardown: function() {
5608
+ var attaches;
5609
+
5610
+ if ( document.documentMode ) {
5611
+ attaches = dataPriv.get( this, delegateType ) - 1;
5612
+ if ( !attaches ) {
5613
+ this.removeEventListener( delegateType, focusMappedHandler );
5614
+ dataPriv.remove( this, delegateType );
5615
+ } else {
5616
+ dataPriv.set( this, delegateType, attaches );
5617
+ }
5618
+ } else {
5619
+
5620
+ // Return false to indicate standard teardown should be applied
5621
+ return false;
5622
+ }
5623
+ },
5624
+
5625
+ // Suppress native focus or blur if we're currently inside
5626
+ // a leveraged native-event stack
5627
+ _default: function( event ) {
5628
+ return dataPriv.get( event.target, type );
5629
+ },
5630
+
5685
5631
  delegateType: delegateType
5686
5632
  };
5633
+
5634
+ // Support: Firefox <=44
5635
+ // Firefox doesn't have focus(in | out) events
5636
+ // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
5637
+ //
5638
+ // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
5639
+ // focus(in | out) events fire after focus & blur events,
5640
+ // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
5641
+ // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
5642
+ //
5643
+ // Support: IE 9 - 11+
5644
+ // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,
5645
+ // attach a single handler for both events in IE.
5646
+ jQuery.event.special[ delegateType ] = {
5647
+ setup: function() {
5648
+
5649
+ // Handle: regular nodes (via `this.ownerDocument`), window
5650
+ // (via `this.document`) & document (via `this`).
5651
+ var doc = this.ownerDocument || this.document || this,
5652
+ dataHolder = document.documentMode ? this : doc,
5653
+ attaches = dataPriv.get( dataHolder, delegateType );
5654
+
5655
+ // Support: IE 9 - 11+
5656
+ // We use the same native handler for focusin & focus (and focusout & blur)
5657
+ // so we need to coordinate setup & teardown parts between those events.
5658
+ // Use `delegateType` as the key as `type` is already used by `leverageNative`.
5659
+ if ( !attaches ) {
5660
+ if ( document.documentMode ) {
5661
+ this.addEventListener( delegateType, focusMappedHandler );
5662
+ } else {
5663
+ doc.addEventListener( type, focusMappedHandler, true );
5664
+ }
5665
+ }
5666
+ dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 );
5667
+ },
5668
+ teardown: function() {
5669
+ var doc = this.ownerDocument || this.document || this,
5670
+ dataHolder = document.documentMode ? this : doc,
5671
+ attaches = dataPriv.get( dataHolder, delegateType ) - 1;
5672
+
5673
+ if ( !attaches ) {
5674
+ if ( document.documentMode ) {
5675
+ this.removeEventListener( delegateType, focusMappedHandler );
5676
+ } else {
5677
+ doc.removeEventListener( type, focusMappedHandler, true );
5678
+ }
5679
+ dataPriv.remove( dataHolder, delegateType );
5680
+ } else {
5681
+ dataPriv.set( dataHolder, delegateType, attaches );
5682
+ }
5683
+ }
5684
+ };
5687
5685
  } );
5688
5686
 
5689
5687
  // Create mouseenter/leave events using mouseover/out and event-time checks
@@ -5771,13 +5769,6 @@ jQuery.fn.extend( {
5771
5769
 
5772
5770
  var
5773
5771
 
5774
- /* eslint-disable max-len */
5775
-
5776
- // See https://github.com/eslint/eslint/issues/3229
5777
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
5778
-
5779
- /* eslint-enable */
5780
-
5781
5772
  // Support: IE <=10 - 11, Edge 12 - 13 only
5782
5773
  // In IE/Edge using regex groups here causes severe slowdowns.
5783
5774
  // See https://connect.microsoft.com/IE/feedback/details/1736512/
@@ -5785,7 +5776,8 @@ var
5785
5776
 
5786
5777
  // checked="checked" or checked
5787
5778
  rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5788
- rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
5779
+
5780
+ rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g;
5789
5781
 
5790
5782
  // Prefer a tbody over its parent table for containing new rows
5791
5783
  function manipulationTarget( elem, content ) {
@@ -5814,7 +5806,7 @@ function restoreScript( elem ) {
5814
5806
  }
5815
5807
 
5816
5808
  function cloneCopyEvent( src, dest ) {
5817
- var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
5809
+ var i, l, type, pdataOld, udataOld, udataCur, events;
5818
5810
 
5819
5811
  if ( dest.nodeType !== 1 ) {
5820
5812
  return;
@@ -5822,13 +5814,11 @@ function cloneCopyEvent( src, dest ) {
5822
5814
 
5823
5815
  // 1. Copy private data: events, handlers, etc.
5824
5816
  if ( dataPriv.hasData( src ) ) {
5825
- pdataOld = dataPriv.access( src );
5826
- pdataCur = dataPriv.set( dest, pdataOld );
5817
+ pdataOld = dataPriv.get( src );
5827
5818
  events = pdataOld.events;
5828
5819
 
5829
5820
  if ( events ) {
5830
- delete pdataCur.handle;
5831
- pdataCur.events = {};
5821
+ dataPriv.remove( dest, "handle events" );
5832
5822
 
5833
5823
  for ( type in events ) {
5834
5824
  for ( i = 0, l = events[ type ].length; i < l; i++ ) {
@@ -5864,7 +5854,7 @@ function fixInput( src, dest ) {
5864
5854
  function domManip( collection, args, callback, ignored ) {
5865
5855
 
5866
5856
  // Flatten any nested arrays
5867
- args = concat.apply( [], args );
5857
+ args = flat( args );
5868
5858
 
5869
5859
  var fragment, first, scripts, hasScripts, node, doc,
5870
5860
  i = 0,
@@ -5901,7 +5891,7 @@ function domManip( collection, args, callback, ignored ) {
5901
5891
 
5902
5892
  // Use the original fragment for the last item
5903
5893
  // instead of the first because it can end up
5904
- // being emptied incorrectly in certain situations (#8070).
5894
+ // being emptied incorrectly in certain situations (trac-8070).
5905
5895
  for ( ; i < l; i++ ) {
5906
5896
  node = fragment;
5907
5897
 
@@ -5939,9 +5929,15 @@ function domManip( collection, args, callback, ignored ) {
5939
5929
  if ( jQuery._evalUrl && !node.noModule ) {
5940
5930
  jQuery._evalUrl( node.src, {
5941
5931
  nonce: node.nonce || node.getAttribute( "nonce" )
5942
- } );
5932
+ }, doc );
5943
5933
  }
5944
5934
  } else {
5935
+
5936
+ // Unwrap a CDATA section containing script contents. This shouldn't be
5937
+ // needed as in XML documents they're already not visible when
5938
+ // inspecting element contents and in HTML documents they have no
5939
+ // meaning but we're preserving that logic for backwards compatibility.
5940
+ // This will be removed completely in 4.0. See gh-4904.
5945
5941
  DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
5946
5942
  }
5947
5943
  }
@@ -5976,7 +5972,7 @@ function remove( elem, selector, keepData ) {
5976
5972
 
5977
5973
  jQuery.extend( {
5978
5974
  htmlPrefilter: function( html ) {
5979
- return html.replace( rxhtmlTag, "<$1></$2>" );
5975
+ return html;
5980
5976
  },
5981
5977
 
5982
5978
  clone: function( elem, dataAndEvents, deepDataAndEvents ) {
@@ -5988,7 +5984,8 @@ jQuery.extend( {
5988
5984
  if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
5989
5985
  !jQuery.isXMLDoc( elem ) ) {
5990
5986
 
5991
- // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
5987
+ // We eschew jQuery#find here for performance reasons:
5988
+ // https://jsperf.com/getall-vs-sizzle/2
5992
5989
  destElements = getAll( clone );
5993
5990
  srcElements = getAll( elem );
5994
5991
 
@@ -6224,9 +6221,12 @@ jQuery.each( {
6224
6221
  } );
6225
6222
  var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6226
6223
 
6224
+ var rcustomProp = /^--/;
6225
+
6226
+
6227
6227
  var getStyles = function( elem ) {
6228
6228
 
6229
- // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
6229
+ // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)
6230
6230
  // IE throws on elements created in popups
6231
6231
  // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6232
6232
  var view = elem.ownerDocument.defaultView;
@@ -6238,6 +6238,27 @@ var getStyles = function( elem ) {
6238
6238
  return view.getComputedStyle( elem );
6239
6239
  };
6240
6240
 
6241
+ var swap = function( elem, options, callback ) {
6242
+ var ret, name,
6243
+ old = {};
6244
+
6245
+ // Remember the old values, and insert the new ones
6246
+ for ( name in options ) {
6247
+ old[ name ] = elem.style[ name ];
6248
+ elem.style[ name ] = options[ name ];
6249
+ }
6250
+
6251
+ ret = callback.call( elem );
6252
+
6253
+ // Revert the old values
6254
+ for ( name in options ) {
6255
+ elem.style[ name ] = old[ name ];
6256
+ }
6257
+
6258
+ return ret;
6259
+ };
6260
+
6261
+
6241
6262
  var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6242
6263
 
6243
6264
 
@@ -6295,7 +6316,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6295
6316
  }
6296
6317
 
6297
6318
  var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
6298
- reliableMarginLeftVal,
6319
+ reliableTrDimensionsVal, reliableMarginLeftVal,
6299
6320
  container = document.createElement( "div" ),
6300
6321
  div = document.createElement( "div" );
6301
6322
 
@@ -6305,7 +6326,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6305
6326
  }
6306
6327
 
6307
6328
  // Support: IE <=9 - 11 only
6308
- // Style of cloned element affects source element cloned (#8908)
6329
+ // Style of cloned element affects source element cloned (trac-8908)
6309
6330
  div.style.backgroundClip = "content-box";
6310
6331
  div.cloneNode( true ).style.backgroundClip = "";
6311
6332
  support.clearCloneStyle = div.style.backgroundClip === "content-box";
@@ -6330,6 +6351,54 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6330
6351
  scrollboxSize: function() {
6331
6352
  computeStyleTests();
6332
6353
  return scrollboxSizeVal;
6354
+ },
6355
+
6356
+ // Support: IE 9 - 11+, Edge 15 - 18+
6357
+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
6358
+ // set in CSS while `offset*` properties report correct values.
6359
+ // Behavior in IE 9 is more subtle than in newer versions & it passes
6360
+ // some versions of this test; make sure not to make it pass there!
6361
+ //
6362
+ // Support: Firefox 70+
6363
+ // Only Firefox includes border widths
6364
+ // in computed dimensions. (gh-4529)
6365
+ reliableTrDimensions: function() {
6366
+ var table, tr, trChild, trStyle;
6367
+ if ( reliableTrDimensionsVal == null ) {
6368
+ table = document.createElement( "table" );
6369
+ tr = document.createElement( "tr" );
6370
+ trChild = document.createElement( "div" );
6371
+
6372
+ table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
6373
+ tr.style.cssText = "border:1px solid";
6374
+
6375
+ // Support: Chrome 86+
6376
+ // Height set through cssText does not get applied.
6377
+ // Computed height then comes back as 0.
6378
+ tr.style.height = "1px";
6379
+ trChild.style.height = "9px";
6380
+
6381
+ // Support: Android 8 Chrome 86+
6382
+ // In our bodyBackground.html iframe,
6383
+ // display for all div elements is set to "inline",
6384
+ // which causes a problem only in Android 8 Chrome 86.
6385
+ // Ensuring the div is display: block
6386
+ // gets around this issue.
6387
+ trChild.style.display = "block";
6388
+
6389
+ documentElement
6390
+ .appendChild( table )
6391
+ .appendChild( tr )
6392
+ .appendChild( trChild );
6393
+
6394
+ trStyle = window.getComputedStyle( tr );
6395
+ reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
6396
+ parseInt( trStyle.borderTopWidth, 10 ) +
6397
+ parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
6398
+
6399
+ documentElement.removeChild( table );
6400
+ }
6401
+ return reliableTrDimensionsVal;
6333
6402
  }
6334
6403
  } );
6335
6404
  } )();
@@ -6337,6 +6406,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6337
6406
 
6338
6407
  function curCSS( elem, name, computed ) {
6339
6408
  var width, minWidth, maxWidth, ret,
6409
+ isCustomProp = rcustomProp.test( name ),
6340
6410
 
6341
6411
  // Support: Firefox 51+
6342
6412
  // Retrieving style before computed somehow
@@ -6347,11 +6417,42 @@ function curCSS( elem, name, computed ) {
6347
6417
  computed = computed || getStyles( elem );
6348
6418
 
6349
6419
  // getPropertyValue is needed for:
6350
- // .css('filter') (IE 9 only, #12537)
6351
- // .css('--customProperty) (#3144)
6420
+ // .css('filter') (IE 9 only, trac-12537)
6421
+ // .css('--customProperty) (gh-3144)
6352
6422
  if ( computed ) {
6423
+
6424
+ // Support: IE <=9 - 11+
6425
+ // IE only supports `"float"` in `getPropertyValue`; in computed styles
6426
+ // it's only available as `"cssFloat"`. We no longer modify properties
6427
+ // sent to `.css()` apart from camelCasing, so we need to check both.
6428
+ // Normally, this would create difference in behavior: if
6429
+ // `getPropertyValue` returns an empty string, the value returned
6430
+ // by `.css()` would be `undefined`. This is usually the case for
6431
+ // disconnected elements. However, in IE even disconnected elements
6432
+ // with no styles return `"none"` for `getPropertyValue( "float" )`
6353
6433
  ret = computed.getPropertyValue( name ) || computed[ name ];
6354
6434
 
6435
+ if ( isCustomProp && ret ) {
6436
+
6437
+ // Support: Firefox 105+, Chrome <=105+
6438
+ // Spec requires trimming whitespace for custom properties (gh-4926).
6439
+ // Firefox only trims leading whitespace. Chrome just collapses
6440
+ // both leading & trailing whitespace to a single space.
6441
+ //
6442
+ // Fall back to `undefined` if empty string returned.
6443
+ // This collapses a missing definition with property defined
6444
+ // and set to an empty string but there's no standard API
6445
+ // allowing us to differentiate them without a performance penalty
6446
+ // and returning `undefined` aligns with older jQuery.
6447
+ //
6448
+ // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED
6449
+ // as whitespace while CSS does not, but this is not a problem
6450
+ // because CSS preprocessing replaces them with U+000A LINE FEED
6451
+ // (which *is* CSS whitespace)
6452
+ // https://www.w3.org/TR/css-syntax-3/#input-preprocessing
6453
+ ret = ret.replace( rtrimCSS, "$1" ) || undefined;
6454
+ }
6455
+
6355
6456
  if ( ret === "" && !isAttached( elem ) ) {
6356
6457
  ret = jQuery.style( elem, name );
6357
6458
  }
@@ -6447,14 +6548,13 @@ var
6447
6548
  // except "table", "table-cell", or "table-caption"
6448
6549
  // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6449
6550
  rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6450
- rcustomProp = /^--/,
6451
6551
  cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6452
6552
  cssNormalTransform = {
6453
6553
  letterSpacing: "0",
6454
6554
  fontWeight: "400"
6455
6555
  };
6456
6556
 
6457
- function setPositiveNumber( elem, value, subtract ) {
6557
+ function setPositiveNumber( _elem, value, subtract ) {
6458
6558
 
6459
6559
  // Any relative (+/-) values have already been
6460
6560
  // normalized at this point
@@ -6469,7 +6569,8 @@ function setPositiveNumber( elem, value, subtract ) {
6469
6569
  function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
6470
6570
  var i = dimension === "width" ? 1 : 0,
6471
6571
  extra = 0,
6472
- delta = 0;
6572
+ delta = 0,
6573
+ marginDelta = 0;
6473
6574
 
6474
6575
  // Adjustment may not be necessary
6475
6576
  if ( box === ( isBorderBox ? "border" : "content" ) ) {
@@ -6479,8 +6580,10 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed
6479
6580
  for ( ; i < 4; i += 2 ) {
6480
6581
 
6481
6582
  // Both box models exclude margin
6583
+ // Count margin delta separately to only add it after scroll gutter adjustment.
6584
+ // This is needed to make negative margins work with `outerHeight( true )` (gh-3982).
6482
6585
  if ( box === "margin" ) {
6483
- delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6586
+ marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6484
6587
  }
6485
6588
 
6486
6589
  // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
@@ -6531,7 +6634,7 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed
6531
6634
  ) ) || 0;
6532
6635
  }
6533
6636
 
6534
- return delta;
6637
+ return delta + marginDelta;
6535
6638
  }
6536
6639
 
6537
6640
  function getWidthOrHeight( elem, dimension, extra ) {
@@ -6559,17 +6662,26 @@ function getWidthOrHeight( elem, dimension, extra ) {
6559
6662
  }
6560
6663
 
6561
6664
 
6562
- // Fall back to offsetWidth/offsetHeight when value is "auto"
6563
- // This happens for inline elements with no explicit setting (gh-3571)
6564
- // Support: Android <=4.1 - 4.3 only
6565
- // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6566
- // Support: IE 9-11 only
6567
- // Also use offsetWidth/offsetHeight for when box sizing is unreliable
6568
- // We use getClientRects() to check for hidden/disconnected.
6569
- // In those cases, the computed value can be trusted to be border-box
6665
+ // Support: IE 9 - 11 only
6666
+ // Use offsetWidth/offsetHeight for when box sizing is unreliable.
6667
+ // In those cases, the computed value can be trusted to be border-box.
6570
6668
  if ( ( !support.boxSizingReliable() && isBorderBox ||
6669
+
6670
+ // Support: IE 10 - 11+, Edge 15 - 18+
6671
+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
6672
+ // set in CSS while `offset*` properties report correct values.
6673
+ // Interestingly, in some cases IE 9 doesn't suffer from this issue.
6674
+ !support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
6675
+
6676
+ // Fall back to offsetWidth/offsetHeight when value is "auto"
6677
+ // This happens for inline elements with no explicit setting (gh-3571)
6571
6678
  val === "auto" ||
6679
+
6680
+ // Support: Android <=4.1 - 4.3 only
6681
+ // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6572
6682
  !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
6683
+
6684
+ // Make sure the element is visible & connected
6573
6685
  elem.getClientRects().length ) {
6574
6686
 
6575
6687
  isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
@@ -6620,26 +6732,35 @@ jQuery.extend( {
6620
6732
 
6621
6733
  // Don't automatically add "px" to these possibly-unitless properties
6622
6734
  cssNumber: {
6623
- "animationIterationCount": true,
6624
- "columnCount": true,
6625
- "fillOpacity": true,
6626
- "flexGrow": true,
6627
- "flexShrink": true,
6628
- "fontWeight": true,
6629
- "gridArea": true,
6630
- "gridColumn": true,
6631
- "gridColumnEnd": true,
6632
- "gridColumnStart": true,
6633
- "gridRow": true,
6634
- "gridRowEnd": true,
6635
- "gridRowStart": true,
6636
- "lineHeight": true,
6637
- "opacity": true,
6638
- "order": true,
6639
- "orphans": true,
6640
- "widows": true,
6641
- "zIndex": true,
6642
- "zoom": true
6735
+ animationIterationCount: true,
6736
+ aspectRatio: true,
6737
+ borderImageSlice: true,
6738
+ columnCount: true,
6739
+ flexGrow: true,
6740
+ flexShrink: true,
6741
+ fontWeight: true,
6742
+ gridArea: true,
6743
+ gridColumn: true,
6744
+ gridColumnEnd: true,
6745
+ gridColumnStart: true,
6746
+ gridRow: true,
6747
+ gridRowEnd: true,
6748
+ gridRowStart: true,
6749
+ lineHeight: true,
6750
+ opacity: true,
6751
+ order: true,
6752
+ orphans: true,
6753
+ scale: true,
6754
+ widows: true,
6755
+ zIndex: true,
6756
+ zoom: true,
6757
+
6758
+ // SVG-related
6759
+ fillOpacity: true,
6760
+ floodOpacity: true,
6761
+ stopOpacity: true,
6762
+ strokeMiterlimit: true,
6763
+ strokeOpacity: true
6643
6764
  },
6644
6765
 
6645
6766
  // Add in properties whose names you wish to fix before
@@ -6674,15 +6795,15 @@ jQuery.extend( {
6674
6795
  if ( value !== undefined ) {
6675
6796
  type = typeof value;
6676
6797
 
6677
- // Convert "+=" or "-=" to relative numbers (#7345)
6798
+ // Convert "+=" or "-=" to relative numbers (trac-7345)
6678
6799
  if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
6679
6800
  value = adjustCSS( elem, name, ret );
6680
6801
 
6681
- // Fixes bug #9237
6802
+ // Fixes bug trac-9237
6682
6803
  type = "number";
6683
6804
  }
6684
6805
 
6685
- // Make sure that null and NaN values aren't set (#7116)
6806
+ // Make sure that null and NaN values aren't set (trac-7116)
6686
6807
  if ( value == null || value !== value ) {
6687
6808
  return;
6688
6809
  }
@@ -6764,7 +6885,7 @@ jQuery.extend( {
6764
6885
  }
6765
6886
  } );
6766
6887
 
6767
- jQuery.each( [ "height", "width" ], function( i, dimension ) {
6888
+ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
6768
6889
  jQuery.cssHooks[ dimension ] = {
6769
6890
  get: function( elem, computed, extra ) {
6770
6891
  if ( computed ) {
@@ -6780,10 +6901,10 @@ jQuery.each( [ "height", "width" ], function( i, dimension ) {
6780
6901
  // Running getBoundingClientRect on a disconnected node
6781
6902
  // in IE throws an error.
6782
6903
  ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
6783
- swap( elem, cssShow, function() {
6784
- return getWidthOrHeight( elem, dimension, extra );
6785
- } ) :
6786
- getWidthOrHeight( elem, dimension, extra );
6904
+ swap( elem, cssShow, function() {
6905
+ return getWidthOrHeight( elem, dimension, extra );
6906
+ } ) :
6907
+ getWidthOrHeight( elem, dimension, extra );
6787
6908
  }
6788
6909
  },
6789
6910
 
@@ -6842,7 +6963,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
6842
6963
  swap( elem, { marginLeft: 0 }, function() {
6843
6964
  return elem.getBoundingClientRect().left;
6844
6965
  } )
6845
- ) + "px";
6966
+ ) + "px";
6846
6967
  }
6847
6968
  }
6848
6969
  );
@@ -6981,7 +7102,7 @@ Tween.propHooks = {
6981
7102
  if ( jQuery.fx.step[ tween.prop ] ) {
6982
7103
  jQuery.fx.step[ tween.prop ]( tween );
6983
7104
  } else if ( tween.elem.nodeType === 1 && (
6984
- jQuery.cssHooks[ tween.prop ] ||
7105
+ jQuery.cssHooks[ tween.prop ] ||
6985
7106
  tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
6986
7107
  jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
6987
7108
  } else {
@@ -7226,7 +7347,7 @@ function defaultPrefilter( elem, props, opts ) {
7226
7347
 
7227
7348
  anim.done( function() {
7228
7349
 
7229
- /* eslint-enable no-loop-func */
7350
+ /* eslint-enable no-loop-func */
7230
7351
 
7231
7352
  // The final step of a "hide" animation is actually hiding the element
7232
7353
  if ( !hidden ) {
@@ -7306,7 +7427,7 @@ function Animation( elem, properties, options ) {
7306
7427
  remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7307
7428
 
7308
7429
  // Support: Android 2.3 only
7309
- // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
7430
+ // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)
7310
7431
  temp = remaining / animation.duration || 0,
7311
7432
  percent = 1 - temp,
7312
7433
  index = 0,
@@ -7346,7 +7467,7 @@ function Animation( elem, properties, options ) {
7346
7467
  tweens: [],
7347
7468
  createTween: function( prop, end ) {
7348
7469
  var tween = jQuery.Tween( elem, animation.opts, prop, end,
7349
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
7470
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
7350
7471
  animation.tweens.push( tween );
7351
7472
  return tween;
7352
7473
  },
@@ -7519,7 +7640,8 @@ jQuery.fn.extend( {
7519
7640
  anim.stop( true );
7520
7641
  }
7521
7642
  };
7522
- doAnimation.finish = doAnimation;
7643
+
7644
+ doAnimation.finish = doAnimation;
7523
7645
 
7524
7646
  return empty || optall.queue === false ?
7525
7647
  this.each( doAnimation ) :
@@ -7537,7 +7659,7 @@ jQuery.fn.extend( {
7537
7659
  clearQueue = type;
7538
7660
  type = undefined;
7539
7661
  }
7540
- if ( clearQueue && type !== false ) {
7662
+ if ( clearQueue ) {
7541
7663
  this.queue( type || "fx", [] );
7542
7664
  }
7543
7665
 
@@ -7620,7 +7742,7 @@ jQuery.fn.extend( {
7620
7742
  }
7621
7743
  } );
7622
7744
 
7623
- jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
7745
+ jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
7624
7746
  var cssFn = jQuery.fn[ name ];
7625
7747
  jQuery.fn[ name ] = function( speed, easing, callback ) {
7626
7748
  return speed == null || typeof speed === "boolean" ?
@@ -7695,7 +7817,6 @@ jQuery.fx.speeds = {
7695
7817
 
7696
7818
 
7697
7819
  // Based off of the plugin by Clint Helfers, with permission.
7698
- // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
7699
7820
  jQuery.fn.delay = function( time, type ) {
7700
7821
  time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7701
7822
  type = type || "fx";
@@ -7841,7 +7962,7 @@ boolHook = {
7841
7962
  }
7842
7963
  };
7843
7964
 
7844
- jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
7965
+ jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
7845
7966
  var getter = attrHandle[ name ] || jQuery.find.attr;
7846
7967
 
7847
7968
  attrHandle[ name ] = function( elem, name, isXML ) {
@@ -7920,8 +8041,7 @@ jQuery.extend( {
7920
8041
  // Support: IE <=9 - 11 only
7921
8042
  // elem.tabIndex doesn't always return the
7922
8043
  // correct value when it hasn't been explicitly set
7923
- // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
7924
- // Use proper attribute retrieval(#12072)
8044
+ // Use proper attribute retrieval (trac-12072)
7925
8045
  var tabindex = jQuery.find.attr( elem, "tabindex" );
7926
8046
 
7927
8047
  if ( tabindex ) {
@@ -8025,8 +8145,7 @@ function classesToArray( value ) {
8025
8145
 
8026
8146
  jQuery.fn.extend( {
8027
8147
  addClass: function( value ) {
8028
- var classes, elem, cur, curValue, clazz, j, finalValue,
8029
- i = 0;
8148
+ var classNames, cur, curValue, className, i, finalValue;
8030
8149
 
8031
8150
  if ( isFunction( value ) ) {
8032
8151
  return this.each( function( j ) {
@@ -8034,36 +8153,35 @@ jQuery.fn.extend( {
8034
8153
  } );
8035
8154
  }
8036
8155
 
8037
- classes = classesToArray( value );
8156
+ classNames = classesToArray( value );
8038
8157
 
8039
- if ( classes.length ) {
8040
- while ( ( elem = this[ i++ ] ) ) {
8041
- curValue = getClass( elem );
8042
- cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8158
+ if ( classNames.length ) {
8159
+ return this.each( function() {
8160
+ curValue = getClass( this );
8161
+ cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8043
8162
 
8044
8163
  if ( cur ) {
8045
- j = 0;
8046
- while ( ( clazz = classes[ j++ ] ) ) {
8047
- if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
8048
- cur += clazz + " ";
8164
+ for ( i = 0; i < classNames.length; i++ ) {
8165
+ className = classNames[ i ];
8166
+ if ( cur.indexOf( " " + className + " " ) < 0 ) {
8167
+ cur += className + " ";
8049
8168
  }
8050
8169
  }
8051
8170
 
8052
8171
  // Only assign if different to avoid unneeded rendering.
8053
8172
  finalValue = stripAndCollapse( cur );
8054
8173
  if ( curValue !== finalValue ) {
8055
- elem.setAttribute( "class", finalValue );
8174
+ this.setAttribute( "class", finalValue );
8056
8175
  }
8057
8176
  }
8058
- }
8177
+ } );
8059
8178
  }
8060
8179
 
8061
8180
  return this;
8062
8181
  },
8063
8182
 
8064
8183
  removeClass: function( value ) {
8065
- var classes, elem, cur, curValue, clazz, j, finalValue,
8066
- i = 0;
8184
+ var classNames, cur, curValue, className, i, finalValue;
8067
8185
 
8068
8186
  if ( isFunction( value ) ) {
8069
8187
  return this.each( function( j ) {
@@ -8075,45 +8193,42 @@ jQuery.fn.extend( {
8075
8193
  return this.attr( "class", "" );
8076
8194
  }
8077
8195
 
8078
- classes = classesToArray( value );
8196
+ classNames = classesToArray( value );
8079
8197
 
8080
- if ( classes.length ) {
8081
- while ( ( elem = this[ i++ ] ) ) {
8082
- curValue = getClass( elem );
8198
+ if ( classNames.length ) {
8199
+ return this.each( function() {
8200
+ curValue = getClass( this );
8083
8201
 
8084
8202
  // This expression is here for better compressibility (see addClass)
8085
- cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8203
+ cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8086
8204
 
8087
8205
  if ( cur ) {
8088
- j = 0;
8089
- while ( ( clazz = classes[ j++ ] ) ) {
8206
+ for ( i = 0; i < classNames.length; i++ ) {
8207
+ className = classNames[ i ];
8090
8208
 
8091
8209
  // Remove *all* instances
8092
- while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
8093
- cur = cur.replace( " " + clazz + " ", " " );
8210
+ while ( cur.indexOf( " " + className + " " ) > -1 ) {
8211
+ cur = cur.replace( " " + className + " ", " " );
8094
8212
  }
8095
8213
  }
8096
8214
 
8097
8215
  // Only assign if different to avoid unneeded rendering.
8098
8216
  finalValue = stripAndCollapse( cur );
8099
8217
  if ( curValue !== finalValue ) {
8100
- elem.setAttribute( "class", finalValue );
8218
+ this.setAttribute( "class", finalValue );
8101
8219
  }
8102
8220
  }
8103
- }
8221
+ } );
8104
8222
  }
8105
8223
 
8106
8224
  return this;
8107
8225
  },
8108
8226
 
8109
8227
  toggleClass: function( value, stateVal ) {
8110
- var type = typeof value,
8228
+ var classNames, className, i, self,
8229
+ type = typeof value,
8111
8230
  isValidValue = type === "string" || Array.isArray( value );
8112
8231
 
8113
- if ( typeof stateVal === "boolean" && isValidValue ) {
8114
- return stateVal ? this.addClass( value ) : this.removeClass( value );
8115
- }
8116
-
8117
8232
  if ( isFunction( value ) ) {
8118
8233
  return this.each( function( i ) {
8119
8234
  jQuery( this ).toggleClass(
@@ -8123,17 +8238,20 @@ jQuery.fn.extend( {
8123
8238
  } );
8124
8239
  }
8125
8240
 
8126
- return this.each( function() {
8127
- var className, i, self, classNames;
8241
+ if ( typeof stateVal === "boolean" && isValidValue ) {
8242
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
8243
+ }
8244
+
8245
+ classNames = classesToArray( value );
8128
8246
 
8247
+ return this.each( function() {
8129
8248
  if ( isValidValue ) {
8130
8249
 
8131
8250
  // Toggle individual class names
8132
- i = 0;
8133
8251
  self = jQuery( this );
8134
- classNames = classesToArray( value );
8135
8252
 
8136
- while ( ( className = classNames[ i++ ] ) ) {
8253
+ for ( i = 0; i < classNames.length; i++ ) {
8254
+ className = classNames[ i ];
8137
8255
 
8138
8256
  // Check each className given, space separated list
8139
8257
  if ( self.hasClass( className ) ) {
@@ -8159,8 +8277,8 @@ jQuery.fn.extend( {
8159
8277
  if ( this.setAttribute ) {
8160
8278
  this.setAttribute( "class",
8161
8279
  className || value === false ?
8162
- "" :
8163
- dataPriv.get( this, "__className__" ) || ""
8280
+ "" :
8281
+ dataPriv.get( this, "__className__" ) || ""
8164
8282
  );
8165
8283
  }
8166
8284
  }
@@ -8175,7 +8293,7 @@ jQuery.fn.extend( {
8175
8293
  while ( ( elem = this[ i++ ] ) ) {
8176
8294
  if ( elem.nodeType === 1 &&
8177
8295
  ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
8178
- return true;
8296
+ return true;
8179
8297
  }
8180
8298
  }
8181
8299
 
@@ -8267,7 +8385,7 @@ jQuery.extend( {
8267
8385
  val :
8268
8386
 
8269
8387
  // Support: IE <=10 - 11 only
8270
- // option.text throws exceptions (#14686, #14858)
8388
+ // option.text throws exceptions (trac-14686, trac-14858)
8271
8389
  // Strip and collapse whitespace
8272
8390
  // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8273
8391
  stripAndCollapse( jQuery.text( elem ) );
@@ -8294,7 +8412,7 @@ jQuery.extend( {
8294
8412
  option = options[ i ];
8295
8413
 
8296
8414
  // Support: IE <=9 only
8297
- // IE8-9 doesn't update selected after form reset (#2551)
8415
+ // IE8-9 doesn't update selected after form reset (trac-2551)
8298
8416
  if ( ( option.selected || i === index ) &&
8299
8417
 
8300
8418
  // Don't return options that are disabled or in a disabled optgroup
@@ -8368,9 +8486,39 @@ jQuery.each( [ "radio", "checkbox" ], function() {
8368
8486
 
8369
8487
 
8370
8488
  // Return jQuery for attributes-only inclusion
8489
+ var location = window.location;
8490
+
8491
+ var nonce = { guid: Date.now() };
8492
+
8493
+ var rquery = ( /\?/ );
8494
+
8495
+
8496
+
8497
+ // Cross-browser xml parsing
8498
+ jQuery.parseXML = function( data ) {
8499
+ var xml, parserErrorElem;
8500
+ if ( !data || typeof data !== "string" ) {
8501
+ return null;
8502
+ }
8371
8503
 
8504
+ // Support: IE 9 - 11 only
8505
+ // IE throws on parseFromString with invalid input.
8506
+ try {
8507
+ xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8508
+ } catch ( e ) {}
8372
8509
 
8373
- support.focusin = "onfocusin" in window;
8510
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
8511
+ if ( !xml || parserErrorElem ) {
8512
+ jQuery.error( "Invalid XML: " + (
8513
+ parserErrorElem ?
8514
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
8515
+ return el.textContent;
8516
+ } ).join( "\n" ) :
8517
+ data
8518
+ ) );
8519
+ }
8520
+ return xml;
8521
+ };
8374
8522
 
8375
8523
 
8376
8524
  var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
@@ -8437,8 +8585,8 @@ jQuery.extend( jQuery.event, {
8437
8585
  return;
8438
8586
  }
8439
8587
 
8440
- // Determine event propagation path in advance, per W3C events spec (#9951)
8441
- // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
8588
+ // Determine event propagation path in advance, per W3C events spec (trac-9951)
8589
+ // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)
8442
8590
  if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
8443
8591
 
8444
8592
  bubbleType = special.delegateType || type;
@@ -8465,7 +8613,7 @@ jQuery.extend( jQuery.event, {
8465
8613
  special.bindType || type;
8466
8614
 
8467
8615
  // jQuery handler
8468
- handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
8616
+ handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
8469
8617
  dataPriv.get( cur, "handle" );
8470
8618
  if ( handle ) {
8471
8619
  handle.apply( cur, data );
@@ -8490,7 +8638,7 @@ jQuery.extend( jQuery.event, {
8490
8638
  acceptData( elem ) ) {
8491
8639
 
8492
8640
  // Call a native DOM method on the target with the same name as the event.
8493
- // Don't do default actions on window, that's where global variables be (#6170)
8641
+ // Don't do default actions on window, that's where global variables be (trac-6170)
8494
8642
  if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
8495
8643
 
8496
8644
  // Don't re-trigger an onFOO event when we call its FOO() method
@@ -8558,77 +8706,6 @@ jQuery.fn.extend( {
8558
8706
  } );
8559
8707
 
8560
8708
 
8561
- // Support: Firefox <=44
8562
- // Firefox doesn't have focus(in | out) events
8563
- // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
8564
- //
8565
- // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
8566
- // focus(in | out) events fire after focus & blur events,
8567
- // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
8568
- // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
8569
- if ( !support.focusin ) {
8570
- jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
8571
-
8572
- // Attach a single capturing handler on the document while someone wants focusin/focusout
8573
- var handler = function( event ) {
8574
- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
8575
- };
8576
-
8577
- jQuery.event.special[ fix ] = {
8578
- setup: function() {
8579
- var doc = this.ownerDocument || this,
8580
- attaches = dataPriv.access( doc, fix );
8581
-
8582
- if ( !attaches ) {
8583
- doc.addEventListener( orig, handler, true );
8584
- }
8585
- dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
8586
- },
8587
- teardown: function() {
8588
- var doc = this.ownerDocument || this,
8589
- attaches = dataPriv.access( doc, fix ) - 1;
8590
-
8591
- if ( !attaches ) {
8592
- doc.removeEventListener( orig, handler, true );
8593
- dataPriv.remove( doc, fix );
8594
-
8595
- } else {
8596
- dataPriv.access( doc, fix, attaches );
8597
- }
8598
- }
8599
- };
8600
- } );
8601
- }
8602
- var location = window.location;
8603
-
8604
- var nonce = Date.now();
8605
-
8606
- var rquery = ( /\?/ );
8607
-
8608
-
8609
-
8610
- // Cross-browser xml parsing
8611
- jQuery.parseXML = function( data ) {
8612
- var xml;
8613
- if ( !data || typeof data !== "string" ) {
8614
- return null;
8615
- }
8616
-
8617
- // Support: IE 9 - 11 only
8618
- // IE throws on parseFromString with invalid input.
8619
- try {
8620
- xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8621
- } catch ( e ) {
8622
- xml = undefined;
8623
- }
8624
-
8625
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
8626
- jQuery.error( "Invalid XML: " + data );
8627
- }
8628
- return xml;
8629
- };
8630
-
8631
-
8632
8709
  var
8633
8710
  rbracket = /\[\]$/,
8634
8711
  rCRLF = /\r?\n/g,
@@ -8724,16 +8801,14 @@ jQuery.fn.extend( {
8724
8801
  // Can add propHook for "elements" to filter or add form elements
8725
8802
  var elements = jQuery.prop( this, "elements" );
8726
8803
  return elements ? jQuery.makeArray( elements ) : this;
8727
- } )
8728
- .filter( function() {
8804
+ } ).filter( function() {
8729
8805
  var type = this.type;
8730
8806
 
8731
8807
  // Use .is( ":disabled" ) so that fieldset[disabled] works
8732
8808
  return this.name && !jQuery( this ).is( ":disabled" ) &&
8733
8809
  rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8734
8810
  ( this.checked || !rcheckableType.test( type ) );
8735
- } )
8736
- .map( function( i, elem ) {
8811
+ } ).map( function( _i, elem ) {
8737
8812
  var val = jQuery( this ).val();
8738
8813
 
8739
8814
  if ( val == null ) {
@@ -8758,7 +8833,7 @@ var
8758
8833
  rantiCache = /([?&])_=[^&]*/,
8759
8834
  rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
8760
8835
 
8761
- // #7653, #8125, #8152: local protocol detection
8836
+ // trac-7653, trac-8125, trac-8152: local protocol detection
8762
8837
  rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
8763
8838
  rnoContent = /^(?:GET|HEAD)$/,
8764
8839
  rprotocol = /^\/\//,
@@ -8781,12 +8856,13 @@ var
8781
8856
  */
8782
8857
  transports = {},
8783
8858
 
8784
- // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
8859
+ // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression
8785
8860
  allTypes = "*/".concat( "*" ),
8786
8861
 
8787
8862
  // Anchor tag for parsing the document origin
8788
8863
  originAnchor = document.createElement( "a" );
8789
- originAnchor.href = location.href;
8864
+
8865
+ originAnchor.href = location.href;
8790
8866
 
8791
8867
  // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
8792
8868
  function addToPrefiltersOrTransports( structure ) {
@@ -8851,7 +8927,7 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX
8851
8927
 
8852
8928
  // A special extend for ajax options
8853
8929
  // that takes "flat" options (not to be deep extended)
8854
- // Fixes #9887
8930
+ // Fixes trac-9887
8855
8931
  function ajaxExtend( target, src ) {
8856
8932
  var key, deep,
8857
8933
  flatOptions = jQuery.ajaxSettings.flatOptions || {};
@@ -9167,8 +9243,8 @@ jQuery.extend( {
9167
9243
  // Context for global events is callbackContext if it is a DOM node or jQuery collection
9168
9244
  globalEventContext = s.context &&
9169
9245
  ( callbackContext.nodeType || callbackContext.jquery ) ?
9170
- jQuery( callbackContext ) :
9171
- jQuery.event,
9246
+ jQuery( callbackContext ) :
9247
+ jQuery.event,
9172
9248
 
9173
9249
  // Deferreds
9174
9250
  deferred = jQuery.Deferred(),
@@ -9262,12 +9338,12 @@ jQuery.extend( {
9262
9338
  deferred.promise( jqXHR );
9263
9339
 
9264
9340
  // Add protocol if not provided (prefilters might expect it)
9265
- // Handle falsy url in the settings object (#10093: consistency with old signature)
9341
+ // Handle falsy url in the settings object (trac-10093: consistency with old signature)
9266
9342
  // We also use the url parameter if available
9267
9343
  s.url = ( ( url || s.url || location.href ) + "" )
9268
9344
  .replace( rprotocol, location.protocol + "//" );
9269
9345
 
9270
- // Alias method option to type as per ticket #12004
9346
+ // Alias method option to type as per ticket trac-12004
9271
9347
  s.type = options.method || options.type || s.method || s.type;
9272
9348
 
9273
9349
  // Extract dataTypes list
@@ -9310,7 +9386,7 @@ jQuery.extend( {
9310
9386
  }
9311
9387
 
9312
9388
  // We can fire global events as of now if asked to
9313
- // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9389
+ // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)
9314
9390
  fireGlobals = jQuery.event && s.global;
9315
9391
 
9316
9392
  // Watch for a new set of requests
@@ -9339,14 +9415,15 @@ jQuery.extend( {
9339
9415
  if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
9340
9416
  cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9341
9417
 
9342
- // #9682: remove data so that it's not used in an eventual retry
9418
+ // trac-9682: remove data so that it's not used in an eventual retry
9343
9419
  delete s.data;
9344
9420
  }
9345
9421
 
9346
9422
  // Add or update anti-cache param if needed
9347
9423
  if ( s.cache === false ) {
9348
9424
  cacheURL = cacheURL.replace( rantiCache, "$1" );
9349
- uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
9425
+ uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
9426
+ uncached;
9350
9427
  }
9351
9428
 
9352
9429
  // Put hash and anti-cache on the URL that will be requested (gh-1732)
@@ -9479,6 +9556,13 @@ jQuery.extend( {
9479
9556
  response = ajaxHandleResponses( s, jqXHR, responses );
9480
9557
  }
9481
9558
 
9559
+ // Use a noop converter for missing script but not if jsonp
9560
+ if ( !isSuccess &&
9561
+ jQuery.inArray( "script", s.dataTypes ) > -1 &&
9562
+ jQuery.inArray( "json", s.dataTypes ) < 0 ) {
9563
+ s.converters[ "text script" ] = function() {};
9564
+ }
9565
+
9482
9566
  // Convert no matter what (that way responseXXX fields are always set)
9483
9567
  response = ajaxConvert( s, response, jqXHR, isSuccess );
9484
9568
 
@@ -9569,7 +9653,7 @@ jQuery.extend( {
9569
9653
  }
9570
9654
  } );
9571
9655
 
9572
- jQuery.each( [ "get", "post" ], function( i, method ) {
9656
+ jQuery.each( [ "get", "post" ], function( _i, method ) {
9573
9657
  jQuery[ method ] = function( url, data, callback, type ) {
9574
9658
 
9575
9659
  // Shift arguments if data argument was omitted
@@ -9590,12 +9674,21 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
9590
9674
  };
9591
9675
  } );
9592
9676
 
9677
+ jQuery.ajaxPrefilter( function( s ) {
9678
+ var i;
9679
+ for ( i in s.headers ) {
9680
+ if ( i.toLowerCase() === "content-type" ) {
9681
+ s.contentType = s.headers[ i ] || "";
9682
+ }
9683
+ }
9684
+ } );
9685
+
9593
9686
 
9594
- jQuery._evalUrl = function( url, options ) {
9687
+ jQuery._evalUrl = function( url, options, doc ) {
9595
9688
  return jQuery.ajax( {
9596
9689
  url: url,
9597
9690
 
9598
- // Make this explicit, since user can override this through ajaxSetup (#11264)
9691
+ // Make this explicit, since user can override this through ajaxSetup (trac-11264)
9599
9692
  type: "GET",
9600
9693
  dataType: "script",
9601
9694
  cache: true,
@@ -9609,7 +9702,7 @@ jQuery._evalUrl = function( url, options ) {
9609
9702
  "text script": function() {}
9610
9703
  },
9611
9704
  dataFilter: function( response ) {
9612
- jQuery.globalEval( response, options );
9705
+ jQuery.globalEval( response, options, doc );
9613
9706
  }
9614
9707
  } );
9615
9708
  };
@@ -9704,7 +9797,7 @@ var xhrSuccessStatus = {
9704
9797
  0: 200,
9705
9798
 
9706
9799
  // Support: IE <=9 only
9707
- // #1450: sometimes IE returns 1223 when it should be 204
9800
+ // trac-1450: sometimes IE returns 1223 when it should be 204
9708
9801
  1223: 204
9709
9802
  },
9710
9803
  xhrSupported = jQuery.ajaxSettings.xhr();
@@ -9776,7 +9869,7 @@ jQuery.ajaxTransport( function( options ) {
9776
9869
  } else {
9777
9870
  complete(
9778
9871
 
9779
- // File: protocol always yields status 0; see #8605, #14207
9872
+ // File: protocol always yields status 0; see trac-8605, trac-14207
9780
9873
  xhr.status,
9781
9874
  xhr.statusText
9782
9875
  );
@@ -9837,7 +9930,7 @@ jQuery.ajaxTransport( function( options ) {
9837
9930
  xhr.send( options.hasContent && options.data || null );
9838
9931
  } catch ( e ) {
9839
9932
 
9840
- // #14683: Only rethrow if this hasn't been notified as an error yet
9933
+ // trac-14683: Only rethrow if this hasn't been notified as an error yet
9841
9934
  if ( callback ) {
9842
9935
  throw e;
9843
9936
  }
@@ -9931,7 +10024,7 @@ var oldCallbacks = [],
9931
10024
  jQuery.ajaxSetup( {
9932
10025
  jsonp: "callback",
9933
10026
  jsonpCallback: function() {
9934
- var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
10027
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
9935
10028
  this[ callback ] = true;
9936
10029
  return callback;
9937
10030
  }
@@ -10148,23 +10241,6 @@ jQuery.fn.load = function( url, params, callback ) {
10148
10241
 
10149
10242
 
10150
10243
 
10151
- // Attach a bunch of functions for handling common AJAX events
10152
- jQuery.each( [
10153
- "ajaxStart",
10154
- "ajaxStop",
10155
- "ajaxComplete",
10156
- "ajaxError",
10157
- "ajaxSuccess",
10158
- "ajaxSend"
10159
- ], function( i, type ) {
10160
- jQuery.fn[ type ] = function( fn ) {
10161
- return this.on( type, fn );
10162
- };
10163
- } );
10164
-
10165
-
10166
-
10167
-
10168
10244
  jQuery.expr.pseudos.animated = function( elem ) {
10169
10245
  return jQuery.grep( jQuery.timers, function( fn ) {
10170
10246
  return elem === fn.elem;
@@ -10371,7 +10447,7 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(
10371
10447
  // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
10372
10448
  // getComputedStyle returns percent when specified for top/left/bottom/right;
10373
10449
  // rather than make the css module depend on the offset module, just check for it here
10374
- jQuery.each( [ "top", "left" ], function( i, prop ) {
10450
+ jQuery.each( [ "top", "left" ], function( _i, prop ) {
10375
10451
  jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10376
10452
  function( elem, computed ) {
10377
10453
  if ( computed ) {
@@ -10389,8 +10465,11 @@ jQuery.each( [ "top", "left" ], function( i, prop ) {
10389
10465
 
10390
10466
  // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10391
10467
  jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10392
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
10393
- function( defaultExtra, funcName ) {
10468
+ jQuery.each( {
10469
+ padding: "inner" + name,
10470
+ content: type,
10471
+ "": "outer" + name
10472
+ }, function( defaultExtra, funcName ) {
10394
10473
 
10395
10474
  // Margin is only for outerHeight, outerWidth
10396
10475
  jQuery.fn[ funcName ] = function( margin, value ) {
@@ -10434,25 +10513,19 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10434
10513
  } );
10435
10514
 
10436
10515
 
10437
- jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
10438
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10439
- "change select submit keydown keypress keyup contextmenu" ).split( " " ),
10440
- function( i, name ) {
10441
-
10442
- // Handle event binding
10443
- jQuery.fn[ name ] = function( data, fn ) {
10444
- return arguments.length > 0 ?
10445
- this.on( name, null, data, fn ) :
10446
- this.trigger( name );
10516
+ jQuery.each( [
10517
+ "ajaxStart",
10518
+ "ajaxStop",
10519
+ "ajaxComplete",
10520
+ "ajaxError",
10521
+ "ajaxSuccess",
10522
+ "ajaxSend"
10523
+ ], function( _i, type ) {
10524
+ jQuery.fn[ type ] = function( fn ) {
10525
+ return this.on( type, fn );
10447
10526
  };
10448
10527
  } );
10449
10528
 
10450
- jQuery.fn.extend( {
10451
- hover: function( fnOver, fnOut ) {
10452
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
10453
- }
10454
- } );
10455
-
10456
10529
 
10457
10530
 
10458
10531
 
@@ -10474,9 +10547,37 @@ jQuery.fn.extend( {
10474
10547
  return arguments.length === 1 ?
10475
10548
  this.off( selector, "**" ) :
10476
10549
  this.off( types, selector || "**", fn );
10550
+ },
10551
+
10552
+ hover: function( fnOver, fnOut ) {
10553
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
10477
10554
  }
10478
10555
  } );
10479
10556
 
10557
+ jQuery.each(
10558
+ ( "blur focus focusin focusout resize scroll click dblclick " +
10559
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10560
+ "change select submit keydown keypress keyup contextmenu" ).split( " " ),
10561
+ function( _i, name ) {
10562
+
10563
+ // Handle event binding
10564
+ jQuery.fn[ name ] = function( data, fn ) {
10565
+ return arguments.length > 0 ?
10566
+ this.on( name, null, data, fn ) :
10567
+ this.trigger( name );
10568
+ };
10569
+ }
10570
+ );
10571
+
10572
+
10573
+
10574
+
10575
+ // Support: Android <=4.0 only
10576
+ // Make sure we trim BOM and NBSP
10577
+ // Require that the "whitespace run" starts from a non-whitespace
10578
+ // to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position.
10579
+ var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
10580
+
10480
10581
  // Bind a function to a context, optionally partially applying any
10481
10582
  // arguments.
10482
10583
  // jQuery.proxy is deprecated to promote standards (specifically Function#bind)
@@ -10539,6 +10640,11 @@ jQuery.isNumeric = function( obj ) {
10539
10640
  !isNaN( obj - parseFloat( obj ) );
10540
10641
  };
10541
10642
 
10643
+ jQuery.trim = function( text ) {
10644
+ return text == null ?
10645
+ "" :
10646
+ ( text + "" ).replace( rtrim, "$1" );
10647
+ };
10542
10648
 
10543
10649
 
10544
10650
 
@@ -10585,9 +10691,9 @@ jQuery.noConflict = function( deep ) {
10585
10691
  };
10586
10692
 
10587
10693
  // Expose jQuery and $ identifiers, even in AMD
10588
- // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10589
- // and CommonJS for browser emulators (#13566)
10590
- if ( !noGlobal ) {
10694
+ // (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)
10695
+ // and CommonJS for browser emulators (trac-13566)
10696
+ if ( typeof noGlobal === "undefined" ) {
10591
10697
  window.jQuery = window.$ = jQuery;
10592
10698
  }
10593
10699