try_api 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/try_api/application.js.coffee +0 -3
  3. data/app/assets/javascripts/try_api/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot +0 -0
  4. data/app/assets/javascripts/try_api/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
  5. data/app/assets/javascripts/try_api/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff +0 -0
  6. data/app/assets/javascripts/try_api/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 +0 -0
  7. data/app/assets/javascripts/try_api/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
  8. data/app/assets/javascripts/try_api/bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
  9. data/app/assets/javascripts/try_api/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
  10. data/app/assets/javascripts/try_api/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
  11. data/app/assets/javascripts/try_api/bower_components/bootstrap/grunt/change-version.js +0 -0
  12. data/app/assets/javascripts/try_api/param.directive.js.coffee +9 -4
  13. data/app/models/try_api/menu_item.rb +0 -2
  14. data/app/models/try_api/method.rb +2 -2
  15. data/app/views/layouts/try_api/application.html.erb +4 -0
  16. data/app/views/try_api/pages/index.html +15 -10
  17. data/lib/try_api/version.rb +1 -1
  18. metadata +2 -138
  19. data/app/assets/javascripts/try_api/bower_components/jquery/AUTHORS.txt +0 -295
  20. data/app/assets/javascripts/try_api/bower_components/jquery/LICENSE.txt +0 -36
  21. data/app/assets/javascripts/try_api/bower_components/jquery/README.md +0 -65
  22. data/app/assets/javascripts/try_api/bower_components/jquery/bower.json +0 -14
  23. data/app/assets/javascripts/try_api/bower_components/jquery/dist/core.js +0 -481
  24. data/app/assets/javascripts/try_api/bower_components/jquery/dist/jquery.js +0 -10074
  25. data/app/assets/javascripts/try_api/bower_components/jquery/dist/jquery.min.js +0 -4
  26. data/app/assets/javascripts/try_api/bower_components/jquery/dist/jquery.slim.js +0 -7966
  27. data/app/assets/javascripts/try_api/bower_components/jquery/dist/jquery.slim.min.js +0 -4
  28. data/app/assets/javascripts/try_api/bower_components/jquery/external/sizzle/LICENSE.txt +0 -36
  29. data/app/assets/javascripts/try_api/bower_components/jquery/external/sizzle/dist/sizzle.js +0 -2217
  30. data/app/assets/javascripts/try_api/bower_components/jquery/external/sizzle/dist/sizzle.min.js +0 -3
  31. data/app/assets/javascripts/try_api/bower_components/jquery/external/sizzle/dist/sizzle.min.map +0 -1
  32. data/app/assets/javascripts/try_api/bower_components/jquery/src/ajax/jsonp.js +0 -102
  33. data/app/assets/javascripts/try_api/bower_components/jquery/src/ajax/load.js +0 -75
  34. data/app/assets/javascripts/try_api/bower_components/jquery/src/ajax/parseXML.js +0 -30
  35. data/app/assets/javascripts/try_api/bower_components/jquery/src/ajax/script.js +0 -77
  36. data/app/assets/javascripts/try_api/bower_components/jquery/src/ajax/var/location.js +0 -5
  37. data/app/assets/javascripts/try_api/bower_components/jquery/src/ajax/var/nonce.js +0 -7
  38. data/app/assets/javascripts/try_api/bower_components/jquery/src/ajax/var/rquery.js +0 -5
  39. data/app/assets/javascripts/try_api/bower_components/jquery/src/ajax/xhr.js +0 -169
  40. data/app/assets/javascripts/try_api/bower_components/jquery/src/ajax.js +0 -855
  41. data/app/assets/javascripts/try_api/bower_components/jquery/src/attributes/attr.js +0 -137
  42. data/app/assets/javascripts/try_api/bower_components/jquery/src/attributes/classes.js +0 -179
  43. data/app/assets/javascripts/try_api/bower_components/jquery/src/attributes/prop.js +0 -128
  44. data/app/assets/javascripts/try_api/bower_components/jquery/src/attributes/support.js +0 -33
  45. data/app/assets/javascripts/try_api/bower_components/jquery/src/attributes/val.js +0 -184
  46. data/app/assets/javascripts/try_api/bower_components/jquery/src/attributes.js +0 -13
  47. data/app/assets/javascripts/try_api/bower_components/jquery/src/callbacks.js +0 -234
  48. data/app/assets/javascripts/try_api/bower_components/jquery/src/core/DOMEval.js +0 -16
  49. data/app/assets/javascripts/try_api/bower_components/jquery/src/core/access.js +0 -67
  50. data/app/assets/javascripts/try_api/bower_components/jquery/src/core/init.js +0 -127
  51. data/app/assets/javascripts/try_api/bower_components/jquery/src/core/parseHTML.js +0 -65
  52. data/app/assets/javascripts/try_api/bower_components/jquery/src/core/ready-no-deferred.js +0 -111
  53. data/app/assets/javascripts/try_api/bower_components/jquery/src/core/ready.js +0 -95
  54. data/app/assets/javascripts/try_api/bower_components/jquery/src/core/readyException.js +0 -13
  55. data/app/assets/javascripts/try_api/bower_components/jquery/src/core/support.js +0 -20
  56. data/app/assets/javascripts/try_api/bower_components/jquery/src/core/var/rsingleTag.js +0 -6
  57. data/app/assets/javascripts/try_api/bower_components/jquery/src/core.js +0 -481
  58. data/app/assets/javascripts/try_api/bower_components/jquery/src/css/addGetHookIf.js +0 -26
  59. data/app/assets/javascripts/try_api/bower_components/jquery/src/css/adjustCSS.js +0 -71
  60. data/app/assets/javascripts/try_api/bower_components/jquery/src/css/curCSS.js +0 -59
  61. data/app/assets/javascripts/try_api/bower_components/jquery/src/css/hiddenVisibleSelectors.js +0 -15
  62. data/app/assets/javascripts/try_api/bower_components/jquery/src/css/showHide.js +0 -105
  63. data/app/assets/javascripts/try_api/bower_components/jquery/src/css/support.js +0 -89
  64. data/app/assets/javascripts/try_api/bower_components/jquery/src/css/var/cssExpand.js +0 -5
  65. data/app/assets/javascripts/try_api/bower_components/jquery/src/css/var/getStyles.js +0 -17
  66. data/app/assets/javascripts/try_api/bower_components/jquery/src/css/var/isHiddenWithinTree.js +0 -34
  67. data/app/assets/javascripts/try_api/bower_components/jquery/src/css/var/rmargin.js +0 -5
  68. data/app/assets/javascripts/try_api/bower_components/jquery/src/css/var/rnumnonpx.js +0 -7
  69. data/app/assets/javascripts/try_api/bower_components/jquery/src/css/var/swap.js +0 -26
  70. data/app/assets/javascripts/try_api/bower_components/jquery/src/css.js +0 -424
  71. data/app/assets/javascripts/try_api/bower_components/jquery/src/data/Data.js +0 -161
  72. data/app/assets/javascripts/try_api/bower_components/jquery/src/data/var/acceptData.js +0 -19
  73. data/app/assets/javascripts/try_api/bower_components/jquery/src/data/var/dataPriv.js +0 -7
  74. data/app/assets/javascripts/try_api/bower_components/jquery/src/data/var/dataUser.js +0 -7
  75. data/app/assets/javascripts/try_api/bower_components/jquery/src/data.js +0 -161
  76. data/app/assets/javascripts/try_api/bower_components/jquery/src/deferred/exceptionHook.js +0 -21
  77. data/app/assets/javascripts/try_api/bower_components/jquery/src/deferred.js +0 -389
  78. data/app/assets/javascripts/try_api/bower_components/jquery/src/deprecated.js +0 -30
  79. data/app/assets/javascripts/try_api/bower_components/jquery/src/dimensions.js +0 -56
  80. data/app/assets/javascripts/try_api/bower_components/jquery/src/effects/Tween.js +0 -123
  81. data/app/assets/javascripts/try_api/bower_components/jquery/src/effects/animatedSelector.js +0 -15
  82. data/app/assets/javascripts/try_api/bower_components/jquery/src/effects.js +0 -688
  83. data/app/assets/javascripts/try_api/bower_components/jquery/src/event/ajax.js +0 -22
  84. data/app/assets/javascripts/try_api/bower_components/jquery/src/event/alias.js +0 -29
  85. data/app/assets/javascripts/try_api/bower_components/jquery/src/event/focusin.js +0 -55
  86. data/app/assets/javascripts/try_api/bower_components/jquery/src/event/support.js +0 -11
  87. data/app/assets/javascripts/try_api/bower_components/jquery/src/event/trigger.js +0 -185
  88. data/app/assets/javascripts/try_api/bower_components/jquery/src/event.js +0 -726
  89. data/app/assets/javascripts/try_api/bower_components/jquery/src/exports/amd.js +0 -26
  90. data/app/assets/javascripts/try_api/bower_components/jquery/src/exports/global.js +0 -34
  91. data/app/assets/javascripts/try_api/bower_components/jquery/src/jquery.js +0 -40
  92. data/app/assets/javascripts/try_api/bower_components/jquery/src/manipulation/_evalUrl.js +0 -23
  93. data/app/assets/javascripts/try_api/bower_components/jquery/src/manipulation/buildFragment.js +0 -104
  94. data/app/assets/javascripts/try_api/bower_components/jquery/src/manipulation/getAll.js +0 -23
  95. data/app/assets/javascripts/try_api/bower_components/jquery/src/manipulation/setGlobalEval.js +0 -22
  96. data/app/assets/javascripts/try_api/bower_components/jquery/src/manipulation/support.js +0 -35
  97. data/app/assets/javascripts/try_api/bower_components/jquery/src/manipulation/var/rcheckableType.js +0 -5
  98. data/app/assets/javascripts/try_api/bower_components/jquery/src/manipulation/var/rscriptType.js +0 -5
  99. data/app/assets/javascripts/try_api/bower_components/jquery/src/manipulation/var/rtagName.js +0 -5
  100. data/app/assets/javascripts/try_api/bower_components/jquery/src/manipulation/wrapMap.js +0 -29
  101. data/app/assets/javascripts/try_api/bower_components/jquery/src/manipulation.js +0 -486
  102. data/app/assets/javascripts/try_api/bower_components/jquery/src/offset.js +0 -232
  103. data/app/assets/javascripts/try_api/bower_components/jquery/src/queue/delay.js +0 -24
  104. data/app/assets/javascripts/try_api/bower_components/jquery/src/queue.js +0 -145
  105. data/app/assets/javascripts/try_api/bower_components/jquery/src/selector-native.js +0 -237
  106. data/app/assets/javascripts/try_api/bower_components/jquery/src/selector-sizzle.js +0 -19
  107. data/app/assets/javascripts/try_api/bower_components/jquery/src/selector.js +0 -3
  108. data/app/assets/javascripts/try_api/bower_components/jquery/src/serialize.js +0 -126
  109. data/app/assets/javascripts/try_api/bower_components/jquery/src/traversing/findFilter.js +0 -99
  110. data/app/assets/javascripts/try_api/bower_components/jquery/src/traversing/var/dir.js +0 -22
  111. data/app/assets/javascripts/try_api/bower_components/jquery/src/traversing/var/rneedsContext.js +0 -8
  112. data/app/assets/javascripts/try_api/bower_components/jquery/src/traversing/var/siblings.js +0 -17
  113. data/app/assets/javascripts/try_api/bower_components/jquery/src/traversing.js +0 -178
  114. data/app/assets/javascripts/try_api/bower_components/jquery/src/var/ObjectFunctionString.js +0 -7
  115. data/app/assets/javascripts/try_api/bower_components/jquery/src/var/arr.js +0 -5
  116. data/app/assets/javascripts/try_api/bower_components/jquery/src/var/class2type.js +0 -6
  117. data/app/assets/javascripts/try_api/bower_components/jquery/src/var/concat.js +0 -7
  118. data/app/assets/javascripts/try_api/bower_components/jquery/src/var/document.js +0 -5
  119. data/app/assets/javascripts/try_api/bower_components/jquery/src/var/documentElement.js +0 -7
  120. data/app/assets/javascripts/try_api/bower_components/jquery/src/var/fnToString.js +0 -7
  121. data/app/assets/javascripts/try_api/bower_components/jquery/src/var/getProto.js +0 -5
  122. data/app/assets/javascripts/try_api/bower_components/jquery/src/var/hasOwn.js +0 -7
  123. data/app/assets/javascripts/try_api/bower_components/jquery/src/var/indexOf.js +0 -7
  124. data/app/assets/javascripts/try_api/bower_components/jquery/src/var/pnum.js +0 -5
  125. data/app/assets/javascripts/try_api/bower_components/jquery/src/var/push.js +0 -7
  126. data/app/assets/javascripts/try_api/bower_components/jquery/src/var/rcssNum.js +0 -9
  127. data/app/assets/javascripts/try_api/bower_components/jquery/src/var/rnotwhite.js +0 -5
  128. data/app/assets/javascripts/try_api/bower_components/jquery/src/var/slice.js +0 -7
  129. data/app/assets/javascripts/try_api/bower_components/jquery/src/var/support.js +0 -6
  130. data/app/assets/javascripts/try_api/bower_components/jquery/src/var/toString.js +0 -7
  131. data/app/assets/javascripts/try_api/bower_components/jquery/src/wrap.js +0 -77
  132. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/README.md +0 -8
  133. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/bower.json +0 -46
  134. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/allow-page-scroll.html +0 -94
  135. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/chaining.html +0 -80
  136. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/disable-fade-out.html +0 -94
  137. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/dynamic-content.html +0 -81
  138. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/height-width.html +0 -125
  139. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/index.html +0 -9
  140. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/libs/prettify/prettify.css +0 -52
  141. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/libs/prettify/prettify.js +0 -1477
  142. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/mouse-wheel.html +0 -99
  143. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/multiple-elements.html +0 -120
  144. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/navigation.html +0 -30
  145. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/nested.html +0 -82
  146. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/programmatic-scrolling.html +0 -138
  147. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/rail.html +0 -190
  148. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/scroll-events.html +0 -88
  149. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/scrollbar.html +0 -189
  150. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/start-position.html +0 -100
  151. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/examples/style.css +0 -13
  152. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/jquery.slimscroll.js +0 -474
  153. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/jquery.slimscroll.min.js +0 -16
  154. data/app/assets/javascripts/try_api/bower_components/jquery-slimscroll/package.json +0 -32
@@ -1,2217 +0,0 @@
1
- /*!
2
- * Sizzle CSS Selector Engine v2.3.0
3
- * https://sizzlejs.com/
4
- *
5
- * Copyright jQuery Foundation and other contributors
6
- * Released under the MIT license
7
- * http://jquery.org/license
8
- *
9
- * Date: 2016-01-04
10
- */
11
- (function( window ) {
12
-
13
- var i,
14
- support,
15
- Expr,
16
- getText,
17
- isXML,
18
- tokenize,
19
- compile,
20
- select,
21
- outermostContext,
22
- sortInput,
23
- hasDuplicate,
24
-
25
- // Local document vars
26
- setDocument,
27
- document,
28
- docElem,
29
- documentIsHTML,
30
- rbuggyQSA,
31
- rbuggyMatches,
32
- matches,
33
- contains,
34
-
35
- // Instance-specific data
36
- expando = "sizzle" + 1 * new Date(),
37
- preferredDoc = window.document,
38
- dirruns = 0,
39
- done = 0,
40
- classCache = createCache(),
41
- tokenCache = createCache(),
42
- compilerCache = createCache(),
43
- sortOrder = function( a, b ) {
44
- if ( a === b ) {
45
- hasDuplicate = true;
46
- }
47
- return 0;
48
- },
49
-
50
- // Instance methods
51
- hasOwn = ({}).hasOwnProperty,
52
- arr = [],
53
- pop = arr.pop,
54
- push_native = arr.push,
55
- push = arr.push,
56
- slice = arr.slice,
57
- // Use a stripped-down indexOf as it's faster than native
58
- // https://jsperf.com/thor-indexof-vs-for/5
59
- indexOf = function( list, elem ) {
60
- var i = 0,
61
- len = list.length;
62
- for ( ; i < len; i++ ) {
63
- if ( list[i] === elem ) {
64
- return i;
65
- }
66
- }
67
- return -1;
68
- },
69
-
70
- booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
71
-
72
- // Regular expressions
73
-
74
- // http://www.w3.org/TR/css3-selectors/#whitespace
75
- whitespace = "[\\x20\\t\\r\\n\\f]",
76
-
77
- // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
78
- identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
79
-
80
- // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
81
- attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
82
- // Operator (capture 2)
83
- "*([*^$|!~]?=)" + whitespace +
84
- // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
85
- "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
86
- "*\\]",
87
-
88
- pseudos = ":(" + identifier + ")(?:\\((" +
89
- // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
90
- // 1. quoted (capture 3; capture 4 or capture 5)
91
- "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
92
- // 2. simple (capture 6)
93
- "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
94
- // 3. anything else (capture 2)
95
- ".*" +
96
- ")\\)|)",
97
-
98
- // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
99
- rwhitespace = new RegExp( whitespace + "+", "g" ),
100
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
101
-
102
- rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
103
- rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
104
-
105
- rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
106
-
107
- rpseudo = new RegExp( pseudos ),
108
- ridentifier = new RegExp( "^" + identifier + "$" ),
109
-
110
- matchExpr = {
111
- "ID": new RegExp( "^#(" + identifier + ")" ),
112
- "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
113
- "TAG": new RegExp( "^(" + identifier + "|[*])" ),
114
- "ATTR": new RegExp( "^" + attributes ),
115
- "PSEUDO": new RegExp( "^" + pseudos ),
116
- "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
117
- "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
118
- "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
119
- "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
120
- // For use in libraries implementing .is()
121
- // We use this for POS matching in `select`
122
- "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
123
- whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
124
- },
125
-
126
- rinputs = /^(?:input|select|textarea|button)$/i,
127
- rheader = /^h\d$/i,
128
-
129
- rnative = /^[^{]+\{\s*\[native \w/,
130
-
131
- // Easily-parseable/retrievable ID or TAG or CLASS selectors
132
- rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
133
-
134
- rsibling = /[+~]/,
135
-
136
- // CSS escapes
137
- // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
138
- runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
139
- funescape = function( _, escaped, escapedWhitespace ) {
140
- var high = "0x" + escaped - 0x10000;
141
- // NaN means non-codepoint
142
- // Support: Firefox<24
143
- // Workaround erroneous numeric interpretation of +"0x"
144
- return high !== high || escapedWhitespace ?
145
- escaped :
146
- high < 0 ?
147
- // BMP codepoint
148
- String.fromCharCode( high + 0x10000 ) :
149
- // Supplemental Plane codepoint (surrogate pair)
150
- String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
151
- },
152
-
153
- // CSS string/identifier serialization
154
- // https://drafts.csswg.org/cssom/#common-serializing-idioms
155
- rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,
156
- fcssescape = function( ch, asCodePoint ) {
157
- if ( asCodePoint ) {
158
-
159
- // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
160
- if ( ch === "\0" ) {
161
- return "\uFFFD";
162
- }
163
-
164
- // Control characters and (dependent upon position) numbers get escaped as code points
165
- return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
166
- }
167
-
168
- // Other potentially-special ASCII characters get backslash-escaped
169
- return "\\" + ch;
170
- },
171
-
172
- // Used for iframes
173
- // See setDocument()
174
- // Removing the function wrapper causes a "Permission Denied"
175
- // error in IE
176
- unloadHandler = function() {
177
- setDocument();
178
- },
179
-
180
- disabledAncestor = addCombinator(
181
- function( elem ) {
182
- return elem.disabled === true;
183
- },
184
- { dir: "parentNode", next: "legend" }
185
- );
186
-
187
- // Optimize for push.apply( _, NodeList )
188
- try {
189
- push.apply(
190
- (arr = slice.call( preferredDoc.childNodes )),
191
- preferredDoc.childNodes
192
- );
193
- // Support: Android<4.0
194
- // Detect silently failing push.apply
195
- arr[ preferredDoc.childNodes.length ].nodeType;
196
- } catch ( e ) {
197
- push = { apply: arr.length ?
198
-
199
- // Leverage slice if possible
200
- function( target, els ) {
201
- push_native.apply( target, slice.call(els) );
202
- } :
203
-
204
- // Support: IE<9
205
- // Otherwise append directly
206
- function( target, els ) {
207
- var j = target.length,
208
- i = 0;
209
- // Can't trust NodeList.length
210
- while ( (target[j++] = els[i++]) ) {}
211
- target.length = j - 1;
212
- }
213
- };
214
- }
215
-
216
- function Sizzle( selector, context, results, seed ) {
217
- var m, i, elem, nid, match, groups, newSelector,
218
- newContext = context && context.ownerDocument,
219
-
220
- // nodeType defaults to 9, since context defaults to document
221
- nodeType = context ? context.nodeType : 9;
222
-
223
- results = results || [];
224
-
225
- // Return early from calls with invalid selector or context
226
- if ( typeof selector !== "string" || !selector ||
227
- nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
228
-
229
- return results;
230
- }
231
-
232
- // Try to shortcut find operations (as opposed to filters) in HTML documents
233
- if ( !seed ) {
234
-
235
- if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
236
- setDocument( context );
237
- }
238
- context = context || document;
239
-
240
- if ( documentIsHTML ) {
241
-
242
- // If the selector is sufficiently simple, try using a "get*By*" DOM method
243
- // (excepting DocumentFragment context, where the methods don't exist)
244
- if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
245
-
246
- // ID selector
247
- if ( (m = match[1]) ) {
248
-
249
- // Document context
250
- if ( nodeType === 9 ) {
251
- if ( (elem = context.getElementById( m )) ) {
252
-
253
- // Support: IE, Opera, Webkit
254
- // TODO: identify versions
255
- // getElementById can match elements by name instead of ID
256
- if ( elem.id === m ) {
257
- results.push( elem );
258
- return results;
259
- }
260
- } else {
261
- return results;
262
- }
263
-
264
- // Element context
265
- } else {
266
-
267
- // Support: IE, Opera, Webkit
268
- // TODO: identify versions
269
- // getElementById can match elements by name instead of ID
270
- if ( newContext && (elem = newContext.getElementById( m )) &&
271
- contains( context, elem ) &&
272
- elem.id === m ) {
273
-
274
- results.push( elem );
275
- return results;
276
- }
277
- }
278
-
279
- // Type selector
280
- } else if ( match[2] ) {
281
- push.apply( results, context.getElementsByTagName( selector ) );
282
- return results;
283
-
284
- // Class selector
285
- } else if ( (m = match[3]) && support.getElementsByClassName &&
286
- context.getElementsByClassName ) {
287
-
288
- push.apply( results, context.getElementsByClassName( m ) );
289
- return results;
290
- }
291
- }
292
-
293
- // Take advantage of querySelectorAll
294
- if ( support.qsa &&
295
- !compilerCache[ selector + " " ] &&
296
- (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
297
-
298
- if ( nodeType !== 1 ) {
299
- newContext = context;
300
- newSelector = selector;
301
-
302
- // qSA looks outside Element context, which is not what we want
303
- // Thanks to Andrew Dupont for this workaround technique
304
- // Support: IE <=8
305
- // Exclude object elements
306
- } else if ( context.nodeName.toLowerCase() !== "object" ) {
307
-
308
- // Capture the context ID, setting it first if necessary
309
- if ( (nid = context.getAttribute( "id" )) ) {
310
- nid = nid.replace( rcssescape, fcssescape );
311
- } else {
312
- context.setAttribute( "id", (nid = expando) );
313
- }
314
-
315
- // Prefix every selector in the list
316
- groups = tokenize( selector );
317
- i = groups.length;
318
- while ( i-- ) {
319
- groups[i] = "#" + nid + " " + toSelector( groups[i] );
320
- }
321
- newSelector = groups.join( "," );
322
-
323
- // Expand context for sibling selectors
324
- newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
325
- context;
326
- }
327
-
328
- if ( newSelector ) {
329
- try {
330
- push.apply( results,
331
- newContext.querySelectorAll( newSelector )
332
- );
333
- return results;
334
- } catch ( qsaError ) {
335
- } finally {
336
- if ( nid === expando ) {
337
- context.removeAttribute( "id" );
338
- }
339
- }
340
- }
341
- }
342
- }
343
- }
344
-
345
- // All others
346
- return select( selector.replace( rtrim, "$1" ), context, results, seed );
347
- }
348
-
349
- /**
350
- * Create key-value caches of limited size
351
- * @returns {function(string, object)} Returns the Object data after storing it on itself with
352
- * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
353
- * deleting the oldest entry
354
- */
355
- function createCache() {
356
- var keys = [];
357
-
358
- function cache( key, value ) {
359
- // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
360
- if ( keys.push( key + " " ) > Expr.cacheLength ) {
361
- // Only keep the most recent entries
362
- delete cache[ keys.shift() ];
363
- }
364
- return (cache[ key + " " ] = value);
365
- }
366
- return cache;
367
- }
368
-
369
- /**
370
- * Mark a function for special use by Sizzle
371
- * @param {Function} fn The function to mark
372
- */
373
- function markFunction( fn ) {
374
- fn[ expando ] = true;
375
- return fn;
376
- }
377
-
378
- /**
379
- * Support testing using an element
380
- * @param {Function} fn Passed the created element and returns a boolean result
381
- */
382
- function assert( fn ) {
383
- var el = document.createElement("fieldset");
384
-
385
- try {
386
- return !!fn( el );
387
- } catch (e) {
388
- return false;
389
- } finally {
390
- // Remove from its parent by default
391
- if ( el.parentNode ) {
392
- el.parentNode.removeChild( el );
393
- }
394
- // release memory in IE
395
- el = null;
396
- }
397
- }
398
-
399
- /**
400
- * Adds the same handler for all of the specified attrs
401
- * @param {String} attrs Pipe-separated list of attributes
402
- * @param {Function} handler The method that will be applied
403
- */
404
- function addHandle( attrs, handler ) {
405
- var arr = attrs.split("|"),
406
- i = arr.length;
407
-
408
- while ( i-- ) {
409
- Expr.attrHandle[ arr[i] ] = handler;
410
- }
411
- }
412
-
413
- /**
414
- * Checks document order of two siblings
415
- * @param {Element} a
416
- * @param {Element} b
417
- * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
418
- */
419
- function siblingCheck( a, b ) {
420
- var cur = b && a,
421
- diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
422
- a.sourceIndex - b.sourceIndex;
423
-
424
- // Use IE sourceIndex if available on both nodes
425
- if ( diff ) {
426
- return diff;
427
- }
428
-
429
- // Check if b follows a
430
- if ( cur ) {
431
- while ( (cur = cur.nextSibling) ) {
432
- if ( cur === b ) {
433
- return -1;
434
- }
435
- }
436
- }
437
-
438
- return a ? 1 : -1;
439
- }
440
-
441
- /**
442
- * Returns a function to use in pseudos for input types
443
- * @param {String} type
444
- */
445
- function createInputPseudo( type ) {
446
- return function( elem ) {
447
- var name = elem.nodeName.toLowerCase();
448
- return name === "input" && elem.type === type;
449
- };
450
- }
451
-
452
- /**
453
- * Returns a function to use in pseudos for buttons
454
- * @param {String} type
455
- */
456
- function createButtonPseudo( type ) {
457
- return function( elem ) {
458
- var name = elem.nodeName.toLowerCase();
459
- return (name === "input" || name === "button") && elem.type === type;
460
- };
461
- }
462
-
463
- /**
464
- * Returns a function to use in pseudos for :enabled/:disabled
465
- * @param {Boolean} disabled true for :disabled; false for :enabled
466
- */
467
- function createDisabledPseudo( disabled ) {
468
- // Known :disabled false positives:
469
- // IE: *[disabled]:not(button, input, select, textarea, optgroup, option, menuitem, fieldset)
470
- // not IE: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
471
- return function( elem ) {
472
-
473
- // Check form elements and option elements for explicit disabling
474
- return "label" in elem && elem.disabled === disabled ||
475
- "form" in elem && elem.disabled === disabled ||
476
-
477
- // Check non-disabled form elements for fieldset[disabled] ancestors
478
- "form" in elem && elem.disabled === false && (
479
- // Support: IE6-11+
480
- // Ancestry is covered for us
481
- elem.isDisabled === disabled ||
482
-
483
- // Otherwise, assume any non-<option> under fieldset[disabled] is disabled
484
- /* jshint -W018 */
485
- elem.isDisabled !== !disabled &&
486
- ("label" in elem || !disabledAncestor( elem )) !== disabled
487
- );
488
- };
489
- }
490
-
491
- /**
492
- * Returns a function to use in pseudos for positionals
493
- * @param {Function} fn
494
- */
495
- function createPositionalPseudo( fn ) {
496
- return markFunction(function( argument ) {
497
- argument = +argument;
498
- return markFunction(function( seed, matches ) {
499
- var j,
500
- matchIndexes = fn( [], seed.length, argument ),
501
- i = matchIndexes.length;
502
-
503
- // Match elements found at the specified indexes
504
- while ( i-- ) {
505
- if ( seed[ (j = matchIndexes[i]) ] ) {
506
- seed[j] = !(matches[j] = seed[j]);
507
- }
508
- }
509
- });
510
- });
511
- }
512
-
513
- /**
514
- * Checks a node for validity as a Sizzle context
515
- * @param {Element|Object=} context
516
- * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
517
- */
518
- function testContext( context ) {
519
- return context && typeof context.getElementsByTagName !== "undefined" && context;
520
- }
521
-
522
- // Expose support vars for convenience
523
- support = Sizzle.support = {};
524
-
525
- /**
526
- * Detects XML nodes
527
- * @param {Element|Object} elem An element or a document
528
- * @returns {Boolean} True iff elem is a non-HTML XML node
529
- */
530
- isXML = Sizzle.isXML = function( elem ) {
531
- // documentElement is verified for cases where it doesn't yet exist
532
- // (such as loading iframes in IE - #4833)
533
- var documentElement = elem && (elem.ownerDocument || elem).documentElement;
534
- return documentElement ? documentElement.nodeName !== "HTML" : false;
535
- };
536
-
537
- /**
538
- * Sets document-related variables once based on the current document
539
- * @param {Element|Object} [doc] An element or document object to use to set the document
540
- * @returns {Object} Returns the current document
541
- */
542
- setDocument = Sizzle.setDocument = function( node ) {
543
- var hasCompare, subWindow,
544
- doc = node ? node.ownerDocument || node : preferredDoc;
545
-
546
- // Return early if doc is invalid or already selected
547
- if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
548
- return document;
549
- }
550
-
551
- // Update global variables
552
- document = doc;
553
- docElem = document.documentElement;
554
- documentIsHTML = !isXML( document );
555
-
556
- // Support: IE 9-11, Edge
557
- // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
558
- if ( preferredDoc !== document &&
559
- (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
560
-
561
- // Support: IE 11, Edge
562
- if ( subWindow.addEventListener ) {
563
- subWindow.addEventListener( "unload", unloadHandler, false );
564
-
565
- // Support: IE 9 - 10 only
566
- } else if ( subWindow.attachEvent ) {
567
- subWindow.attachEvent( "onunload", unloadHandler );
568
- }
569
- }
570
-
571
- /* Attributes
572
- ---------------------------------------------------------------------- */
573
-
574
- // Support: IE<8
575
- // Verify that getAttribute really returns attributes and not properties
576
- // (excepting IE8 booleans)
577
- support.attributes = assert(function( el ) {
578
- el.className = "i";
579
- return !el.getAttribute("className");
580
- });
581
-
582
- /* getElement(s)By*
583
- ---------------------------------------------------------------------- */
584
-
585
- // Check if getElementsByTagName("*") returns only elements
586
- support.getElementsByTagName = assert(function( el ) {
587
- el.appendChild( document.createComment("") );
588
- return !el.getElementsByTagName("*").length;
589
- });
590
-
591
- // Support: IE<9
592
- support.getElementsByClassName = rnative.test( document.getElementsByClassName );
593
-
594
- // Support: IE<10
595
- // Check if getElementById returns elements by name
596
- // The broken getElementById methods don't pick up programmatically-set names,
597
- // so use a roundabout getElementsByName test
598
- support.getById = assert(function( el ) {
599
- docElem.appendChild( el ).id = expando;
600
- return !document.getElementsByName || !document.getElementsByName( expando ).length;
601
- });
602
-
603
- // ID find and filter
604
- if ( support.getById ) {
605
- Expr.find["ID"] = function( id, context ) {
606
- if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
607
- var m = context.getElementById( id );
608
- return m ? [ m ] : [];
609
- }
610
- };
611
- Expr.filter["ID"] = function( id ) {
612
- var attrId = id.replace( runescape, funescape );
613
- return function( elem ) {
614
- return elem.getAttribute("id") === attrId;
615
- };
616
- };
617
- } else {
618
- // Support: IE6/7
619
- // getElementById is not reliable as a find shortcut
620
- delete Expr.find["ID"];
621
-
622
- Expr.filter["ID"] = function( id ) {
623
- var attrId = id.replace( runescape, funescape );
624
- return function( elem ) {
625
- var node = typeof elem.getAttributeNode !== "undefined" &&
626
- elem.getAttributeNode("id");
627
- return node && node.value === attrId;
628
- };
629
- };
630
- }
631
-
632
- // Tag
633
- Expr.find["TAG"] = support.getElementsByTagName ?
634
- function( tag, context ) {
635
- if ( typeof context.getElementsByTagName !== "undefined" ) {
636
- return context.getElementsByTagName( tag );
637
-
638
- // DocumentFragment nodes don't have gEBTN
639
- } else if ( support.qsa ) {
640
- return context.querySelectorAll( tag );
641
- }
642
- } :
643
-
644
- function( tag, context ) {
645
- var elem,
646
- tmp = [],
647
- i = 0,
648
- // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
649
- results = context.getElementsByTagName( tag );
650
-
651
- // Filter out possible comments
652
- if ( tag === "*" ) {
653
- while ( (elem = results[i++]) ) {
654
- if ( elem.nodeType === 1 ) {
655
- tmp.push( elem );
656
- }
657
- }
658
-
659
- return tmp;
660
- }
661
- return results;
662
- };
663
-
664
- // Class
665
- Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
666
- if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
667
- return context.getElementsByClassName( className );
668
- }
669
- };
670
-
671
- /* QSA/matchesSelector
672
- ---------------------------------------------------------------------- */
673
-
674
- // QSA and matchesSelector support
675
-
676
- // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
677
- rbuggyMatches = [];
678
-
679
- // qSa(:focus) reports false when true (Chrome 21)
680
- // We allow this because of a bug in IE8/9 that throws an error
681
- // whenever `document.activeElement` is accessed on an iframe
682
- // So, we allow :focus to pass through QSA all the time to avoid the IE error
683
- // See https://bugs.jquery.com/ticket/13378
684
- rbuggyQSA = [];
685
-
686
- if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
687
- // Build QSA regex
688
- // Regex strategy adopted from Diego Perini
689
- assert(function( el ) {
690
- // Select is set to empty string on purpose
691
- // This is to test IE's treatment of not explicitly
692
- // setting a boolean content attribute,
693
- // since its presence should be enough
694
- // https://bugs.jquery.com/ticket/12359
695
- docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
696
- "<select id='" + expando + "-\r\\' msallowcapture=''>" +
697
- "<option selected=''></option></select>";
698
-
699
- // Support: IE8, Opera 11-12.16
700
- // Nothing should be selected when empty strings follow ^= or $= or *=
701
- // The test attribute must be unknown in Opera but "safe" for WinRT
702
- // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
703
- if ( el.querySelectorAll("[msallowcapture^='']").length ) {
704
- rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
705
- }
706
-
707
- // Support: IE8
708
- // Boolean attributes and "value" are not treated correctly
709
- if ( !el.querySelectorAll("[selected]").length ) {
710
- rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
711
- }
712
-
713
- // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
714
- if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
715
- rbuggyQSA.push("~=");
716
- }
717
-
718
- // Webkit/Opera - :checked should return selected option elements
719
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
720
- // IE8 throws error here and will not see later tests
721
- if ( !el.querySelectorAll(":checked").length ) {
722
- rbuggyQSA.push(":checked");
723
- }
724
-
725
- // Support: Safari 8+, iOS 8+
726
- // https://bugs.webkit.org/show_bug.cgi?id=136851
727
- // In-page `selector#id sibling-combinator selector` fails
728
- if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
729
- rbuggyQSA.push(".#.+[+~]");
730
- }
731
- });
732
-
733
- assert(function( el ) {
734
- el.innerHTML = "<a href='' disabled='disabled'></a>" +
735
- "<select disabled='disabled'><option/></select>";
736
-
737
- // Support: Windows 8 Native Apps
738
- // The type and name attributes are restricted during .innerHTML assignment
739
- var input = document.createElement("input");
740
- input.setAttribute( "type", "hidden" );
741
- el.appendChild( input ).setAttribute( "name", "D" );
742
-
743
- // Support: IE8
744
- // Enforce case-sensitivity of name attribute
745
- if ( el.querySelectorAll("[name=d]").length ) {
746
- rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
747
- }
748
-
749
- // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
750
- // IE8 throws error here and will not see later tests
751
- if ( el.querySelectorAll(":enabled").length !== 2 ) {
752
- rbuggyQSA.push( ":enabled", ":disabled" );
753
- }
754
-
755
- // Support: IE9-11+
756
- // IE's :disabled selector does not pick up the children of disabled fieldsets
757
- docElem.appendChild( el ).disabled = true;
758
- if ( el.querySelectorAll(":disabled").length !== 2 ) {
759
- rbuggyQSA.push( ":enabled", ":disabled" );
760
- }
761
-
762
- // Opera 10-11 does not throw on post-comma invalid pseudos
763
- el.querySelectorAll("*,:x");
764
- rbuggyQSA.push(",.*:");
765
- });
766
- }
767
-
768
- if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
769
- docElem.webkitMatchesSelector ||
770
- docElem.mozMatchesSelector ||
771
- docElem.oMatchesSelector ||
772
- docElem.msMatchesSelector) )) ) {
773
-
774
- assert(function( el ) {
775
- // Check to see if it's possible to do matchesSelector
776
- // on a disconnected node (IE 9)
777
- support.disconnectedMatch = matches.call( el, "*" );
778
-
779
- // This should fail with an exception
780
- // Gecko does not error, returns false instead
781
- matches.call( el, "[s!='']:x" );
782
- rbuggyMatches.push( "!=", pseudos );
783
- });
784
- }
785
-
786
- rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
787
- rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
788
-
789
- /* Contains
790
- ---------------------------------------------------------------------- */
791
- hasCompare = rnative.test( docElem.compareDocumentPosition );
792
-
793
- // Element contains another
794
- // Purposefully self-exclusive
795
- // As in, an element does not contain itself
796
- contains = hasCompare || rnative.test( docElem.contains ) ?
797
- function( a, b ) {
798
- var adown = a.nodeType === 9 ? a.documentElement : a,
799
- bup = b && b.parentNode;
800
- return a === bup || !!( bup && bup.nodeType === 1 && (
801
- adown.contains ?
802
- adown.contains( bup ) :
803
- a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
804
- ));
805
- } :
806
- function( a, b ) {
807
- if ( b ) {
808
- while ( (b = b.parentNode) ) {
809
- if ( b === a ) {
810
- return true;
811
- }
812
- }
813
- }
814
- return false;
815
- };
816
-
817
- /* Sorting
818
- ---------------------------------------------------------------------- */
819
-
820
- // Document order sorting
821
- sortOrder = hasCompare ?
822
- function( a, b ) {
823
-
824
- // Flag for duplicate removal
825
- if ( a === b ) {
826
- hasDuplicate = true;
827
- return 0;
828
- }
829
-
830
- // Sort on method existence if only one input has compareDocumentPosition
831
- var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
832
- if ( compare ) {
833
- return compare;
834
- }
835
-
836
- // Calculate position if both inputs belong to the same document
837
- compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
838
- a.compareDocumentPosition( b ) :
839
-
840
- // Otherwise we know they are disconnected
841
- 1;
842
-
843
- // Disconnected nodes
844
- if ( compare & 1 ||
845
- (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
846
-
847
- // Choose the first element that is related to our preferred document
848
- if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
849
- return -1;
850
- }
851
- if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
852
- return 1;
853
- }
854
-
855
- // Maintain original order
856
- return sortInput ?
857
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
858
- 0;
859
- }
860
-
861
- return compare & 4 ? -1 : 1;
862
- } :
863
- function( a, b ) {
864
- // Exit early if the nodes are identical
865
- if ( a === b ) {
866
- hasDuplicate = true;
867
- return 0;
868
- }
869
-
870
- var cur,
871
- i = 0,
872
- aup = a.parentNode,
873
- bup = b.parentNode,
874
- ap = [ a ],
875
- bp = [ b ];
876
-
877
- // Parentless nodes are either documents or disconnected
878
- if ( !aup || !bup ) {
879
- return a === document ? -1 :
880
- b === document ? 1 :
881
- aup ? -1 :
882
- bup ? 1 :
883
- sortInput ?
884
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
885
- 0;
886
-
887
- // If the nodes are siblings, we can do a quick check
888
- } else if ( aup === bup ) {
889
- return siblingCheck( a, b );
890
- }
891
-
892
- // Otherwise we need full lists of their ancestors for comparison
893
- cur = a;
894
- while ( (cur = cur.parentNode) ) {
895
- ap.unshift( cur );
896
- }
897
- cur = b;
898
- while ( (cur = cur.parentNode) ) {
899
- bp.unshift( cur );
900
- }
901
-
902
- // Walk down the tree looking for a discrepancy
903
- while ( ap[i] === bp[i] ) {
904
- i++;
905
- }
906
-
907
- return i ?
908
- // Do a sibling check if the nodes have a common ancestor
909
- siblingCheck( ap[i], bp[i] ) :
910
-
911
- // Otherwise nodes in our document sort first
912
- ap[i] === preferredDoc ? -1 :
913
- bp[i] === preferredDoc ? 1 :
914
- 0;
915
- };
916
-
917
- return document;
918
- };
919
-
920
- Sizzle.matches = function( expr, elements ) {
921
- return Sizzle( expr, null, null, elements );
922
- };
923
-
924
- Sizzle.matchesSelector = function( elem, expr ) {
925
- // Set document vars if needed
926
- if ( ( elem.ownerDocument || elem ) !== document ) {
927
- setDocument( elem );
928
- }
929
-
930
- // Make sure that attribute selectors are quoted
931
- expr = expr.replace( rattributeQuotes, "='$1']" );
932
-
933
- if ( support.matchesSelector && documentIsHTML &&
934
- !compilerCache[ expr + " " ] &&
935
- ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
936
- ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
937
-
938
- try {
939
- var ret = matches.call( elem, expr );
940
-
941
- // IE 9's matchesSelector returns false on disconnected nodes
942
- if ( ret || support.disconnectedMatch ||
943
- // As well, disconnected nodes are said to be in a document
944
- // fragment in IE 9
945
- elem.document && elem.document.nodeType !== 11 ) {
946
- return ret;
947
- }
948
- } catch (e) {}
949
- }
950
-
951
- return Sizzle( expr, document, null, [ elem ] ).length > 0;
952
- };
953
-
954
- Sizzle.contains = function( context, elem ) {
955
- // Set document vars if needed
956
- if ( ( context.ownerDocument || context ) !== document ) {
957
- setDocument( context );
958
- }
959
- return contains( context, elem );
960
- };
961
-
962
- Sizzle.attr = function( elem, name ) {
963
- // Set document vars if needed
964
- if ( ( elem.ownerDocument || elem ) !== document ) {
965
- setDocument( elem );
966
- }
967
-
968
- var fn = Expr.attrHandle[ name.toLowerCase() ],
969
- // Don't get fooled by Object.prototype properties (jQuery #13807)
970
- val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
971
- fn( elem, name, !documentIsHTML ) :
972
- undefined;
973
-
974
- return val !== undefined ?
975
- val :
976
- support.attributes || !documentIsHTML ?
977
- elem.getAttribute( name ) :
978
- (val = elem.getAttributeNode(name)) && val.specified ?
979
- val.value :
980
- null;
981
- };
982
-
983
- Sizzle.escape = function( sel ) {
984
- return (sel + "").replace( rcssescape, fcssescape );
985
- };
986
-
987
- Sizzle.error = function( msg ) {
988
- throw new Error( "Syntax error, unrecognized expression: " + msg );
989
- };
990
-
991
- /**
992
- * Document sorting and removing duplicates
993
- * @param {ArrayLike} results
994
- */
995
- Sizzle.uniqueSort = function( results ) {
996
- var elem,
997
- duplicates = [],
998
- j = 0,
999
- i = 0;
1000
-
1001
- // Unless we *know* we can detect duplicates, assume their presence
1002
- hasDuplicate = !support.detectDuplicates;
1003
- sortInput = !support.sortStable && results.slice( 0 );
1004
- results.sort( sortOrder );
1005
-
1006
- if ( hasDuplicate ) {
1007
- while ( (elem = results[i++]) ) {
1008
- if ( elem === results[ i ] ) {
1009
- j = duplicates.push( i );
1010
- }
1011
- }
1012
- while ( j-- ) {
1013
- results.splice( duplicates[ j ], 1 );
1014
- }
1015
- }
1016
-
1017
- // Clear input after sorting to release objects
1018
- // See https://github.com/jquery/sizzle/pull/225
1019
- sortInput = null;
1020
-
1021
- return results;
1022
- };
1023
-
1024
- /**
1025
- * Utility function for retrieving the text value of an array of DOM nodes
1026
- * @param {Array|Element} elem
1027
- */
1028
- getText = Sizzle.getText = function( elem ) {
1029
- var node,
1030
- ret = "",
1031
- i = 0,
1032
- nodeType = elem.nodeType;
1033
-
1034
- if ( !nodeType ) {
1035
- // If no nodeType, this is expected to be an array
1036
- while ( (node = elem[i++]) ) {
1037
- // Do not traverse comment nodes
1038
- ret += getText( node );
1039
- }
1040
- } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1041
- // Use textContent for elements
1042
- // innerText usage removed for consistency of new lines (jQuery #11153)
1043
- if ( typeof elem.textContent === "string" ) {
1044
- return elem.textContent;
1045
- } else {
1046
- // Traverse its children
1047
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1048
- ret += getText( elem );
1049
- }
1050
- }
1051
- } else if ( nodeType === 3 || nodeType === 4 ) {
1052
- return elem.nodeValue;
1053
- }
1054
- // Do not include comment or processing instruction nodes
1055
-
1056
- return ret;
1057
- };
1058
-
1059
- Expr = Sizzle.selectors = {
1060
-
1061
- // Can be adjusted by the user
1062
- cacheLength: 50,
1063
-
1064
- createPseudo: markFunction,
1065
-
1066
- match: matchExpr,
1067
-
1068
- attrHandle: {},
1069
-
1070
- find: {},
1071
-
1072
- relative: {
1073
- ">": { dir: "parentNode", first: true },
1074
- " ": { dir: "parentNode" },
1075
- "+": { dir: "previousSibling", first: true },
1076
- "~": { dir: "previousSibling" }
1077
- },
1078
-
1079
- preFilter: {
1080
- "ATTR": function( match ) {
1081
- match[1] = match[1].replace( runescape, funescape );
1082
-
1083
- // Move the given value to match[3] whether quoted or unquoted
1084
- match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1085
-
1086
- if ( match[2] === "~=" ) {
1087
- match[3] = " " + match[3] + " ";
1088
- }
1089
-
1090
- return match.slice( 0, 4 );
1091
- },
1092
-
1093
- "CHILD": function( match ) {
1094
- /* matches from matchExpr["CHILD"]
1095
- 1 type (only|nth|...)
1096
- 2 what (child|of-type)
1097
- 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1098
- 4 xn-component of xn+y argument ([+-]?\d*n|)
1099
- 5 sign of xn-component
1100
- 6 x of xn-component
1101
- 7 sign of y-component
1102
- 8 y of y-component
1103
- */
1104
- match[1] = match[1].toLowerCase();
1105
-
1106
- if ( match[1].slice( 0, 3 ) === "nth" ) {
1107
- // nth-* requires argument
1108
- if ( !match[3] ) {
1109
- Sizzle.error( match[0] );
1110
- }
1111
-
1112
- // numeric x and y parameters for Expr.filter.CHILD
1113
- // remember that false/true cast respectively to 0/1
1114
- match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1115
- match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1116
-
1117
- // other types prohibit arguments
1118
- } else if ( match[3] ) {
1119
- Sizzle.error( match[0] );
1120
- }
1121
-
1122
- return match;
1123
- },
1124
-
1125
- "PSEUDO": function( match ) {
1126
- var excess,
1127
- unquoted = !match[6] && match[2];
1128
-
1129
- if ( matchExpr["CHILD"].test( match[0] ) ) {
1130
- return null;
1131
- }
1132
-
1133
- // Accept quoted arguments as-is
1134
- if ( match[3] ) {
1135
- match[2] = match[4] || match[5] || "";
1136
-
1137
- // Strip excess characters from unquoted arguments
1138
- } else if ( unquoted && rpseudo.test( unquoted ) &&
1139
- // Get excess from tokenize (recursively)
1140
- (excess = tokenize( unquoted, true )) &&
1141
- // advance to the next closing parenthesis
1142
- (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1143
-
1144
- // excess is a negative index
1145
- match[0] = match[0].slice( 0, excess );
1146
- match[2] = unquoted.slice( 0, excess );
1147
- }
1148
-
1149
- // Return only captures needed by the pseudo filter method (type and argument)
1150
- return match.slice( 0, 3 );
1151
- }
1152
- },
1153
-
1154
- filter: {
1155
-
1156
- "TAG": function( nodeNameSelector ) {
1157
- var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1158
- return nodeNameSelector === "*" ?
1159
- function() { return true; } :
1160
- function( elem ) {
1161
- return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1162
- };
1163
- },
1164
-
1165
- "CLASS": function( className ) {
1166
- var pattern = classCache[ className + " " ];
1167
-
1168
- return pattern ||
1169
- (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1170
- classCache( className, function( elem ) {
1171
- return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
1172
- });
1173
- },
1174
-
1175
- "ATTR": function( name, operator, check ) {
1176
- return function( elem ) {
1177
- var result = Sizzle.attr( elem, name );
1178
-
1179
- if ( result == null ) {
1180
- return operator === "!=";
1181
- }
1182
- if ( !operator ) {
1183
- return true;
1184
- }
1185
-
1186
- result += "";
1187
-
1188
- return operator === "=" ? result === check :
1189
- operator === "!=" ? result !== check :
1190
- operator === "^=" ? check && result.indexOf( check ) === 0 :
1191
- operator === "*=" ? check && result.indexOf( check ) > -1 :
1192
- operator === "$=" ? check && result.slice( -check.length ) === check :
1193
- operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1194
- operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1195
- false;
1196
- };
1197
- },
1198
-
1199
- "CHILD": function( type, what, argument, first, last ) {
1200
- var simple = type.slice( 0, 3 ) !== "nth",
1201
- forward = type.slice( -4 ) !== "last",
1202
- ofType = what === "of-type";
1203
-
1204
- return first === 1 && last === 0 ?
1205
-
1206
- // Shortcut for :nth-*(n)
1207
- function( elem ) {
1208
- return !!elem.parentNode;
1209
- } :
1210
-
1211
- function( elem, context, xml ) {
1212
- var cache, uniqueCache, outerCache, node, nodeIndex, start,
1213
- dir = simple !== forward ? "nextSibling" : "previousSibling",
1214
- parent = elem.parentNode,
1215
- name = ofType && elem.nodeName.toLowerCase(),
1216
- useCache = !xml && !ofType,
1217
- diff = false;
1218
-
1219
- if ( parent ) {
1220
-
1221
- // :(first|last|only)-(child|of-type)
1222
- if ( simple ) {
1223
- while ( dir ) {
1224
- node = elem;
1225
- while ( (node = node[ dir ]) ) {
1226
- if ( ofType ?
1227
- node.nodeName.toLowerCase() === name :
1228
- node.nodeType === 1 ) {
1229
-
1230
- return false;
1231
- }
1232
- }
1233
- // Reverse direction for :only-* (if we haven't yet done so)
1234
- start = dir = type === "only" && !start && "nextSibling";
1235
- }
1236
- return true;
1237
- }
1238
-
1239
- start = [ forward ? parent.firstChild : parent.lastChild ];
1240
-
1241
- // non-xml :nth-child(...) stores cache data on `parent`
1242
- if ( forward && useCache ) {
1243
-
1244
- // Seek `elem` from a previously-cached index
1245
-
1246
- // ...in a gzip-friendly way
1247
- node = parent;
1248
- outerCache = node[ expando ] || (node[ expando ] = {});
1249
-
1250
- // Support: IE <9 only
1251
- // Defend against cloned attroperties (jQuery gh-1709)
1252
- uniqueCache = outerCache[ node.uniqueID ] ||
1253
- (outerCache[ node.uniqueID ] = {});
1254
-
1255
- cache = uniqueCache[ type ] || [];
1256
- nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1257
- diff = nodeIndex && cache[ 2 ];
1258
- node = nodeIndex && parent.childNodes[ nodeIndex ];
1259
-
1260
- while ( (node = ++nodeIndex && node && node[ dir ] ||
1261
-
1262
- // Fallback to seeking `elem` from the start
1263
- (diff = nodeIndex = 0) || start.pop()) ) {
1264
-
1265
- // When found, cache indexes on `parent` and break
1266
- if ( node.nodeType === 1 && ++diff && node === elem ) {
1267
- uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
1268
- break;
1269
- }
1270
- }
1271
-
1272
- } else {
1273
- // Use previously-cached element index if available
1274
- if ( useCache ) {
1275
- // ...in a gzip-friendly way
1276
- node = elem;
1277
- outerCache = node[ expando ] || (node[ expando ] = {});
1278
-
1279
- // Support: IE <9 only
1280
- // Defend against cloned attroperties (jQuery gh-1709)
1281
- uniqueCache = outerCache[ node.uniqueID ] ||
1282
- (outerCache[ node.uniqueID ] = {});
1283
-
1284
- cache = uniqueCache[ type ] || [];
1285
- nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1286
- diff = nodeIndex;
1287
- }
1288
-
1289
- // xml :nth-child(...)
1290
- // or :nth-last-child(...) or :nth(-last)?-of-type(...)
1291
- if ( diff === false ) {
1292
- // Use the same loop as above to seek `elem` from the start
1293
- while ( (node = ++nodeIndex && node && node[ dir ] ||
1294
- (diff = nodeIndex = 0) || start.pop()) ) {
1295
-
1296
- if ( ( ofType ?
1297
- node.nodeName.toLowerCase() === name :
1298
- node.nodeType === 1 ) &&
1299
- ++diff ) {
1300
-
1301
- // Cache the index of each encountered element
1302
- if ( useCache ) {
1303
- outerCache = node[ expando ] || (node[ expando ] = {});
1304
-
1305
- // Support: IE <9 only
1306
- // Defend against cloned attroperties (jQuery gh-1709)
1307
- uniqueCache = outerCache[ node.uniqueID ] ||
1308
- (outerCache[ node.uniqueID ] = {});
1309
-
1310
- uniqueCache[ type ] = [ dirruns, diff ];
1311
- }
1312
-
1313
- if ( node === elem ) {
1314
- break;
1315
- }
1316
- }
1317
- }
1318
- }
1319
- }
1320
-
1321
- // Incorporate the offset, then check against cycle size
1322
- diff -= last;
1323
- return diff === first || ( diff % first === 0 && diff / first >= 0 );
1324
- }
1325
- };
1326
- },
1327
-
1328
- "PSEUDO": function( pseudo, argument ) {
1329
- // pseudo-class names are case-insensitive
1330
- // http://www.w3.org/TR/selectors/#pseudo-classes
1331
- // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1332
- // Remember that setFilters inherits from pseudos
1333
- var args,
1334
- fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
1335
- Sizzle.error( "unsupported pseudo: " + pseudo );
1336
-
1337
- // The user may use createPseudo to indicate that
1338
- // arguments are needed to create the filter function
1339
- // just as Sizzle does
1340
- if ( fn[ expando ] ) {
1341
- return fn( argument );
1342
- }
1343
-
1344
- // But maintain support for old signatures
1345
- if ( fn.length > 1 ) {
1346
- args = [ pseudo, pseudo, "", argument ];
1347
- return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1348
- markFunction(function( seed, matches ) {
1349
- var idx,
1350
- matched = fn( seed, argument ),
1351
- i = matched.length;
1352
- while ( i-- ) {
1353
- idx = indexOf( seed, matched[i] );
1354
- seed[ idx ] = !( matches[ idx ] = matched[i] );
1355
- }
1356
- }) :
1357
- function( elem ) {
1358
- return fn( elem, 0, args );
1359
- };
1360
- }
1361
-
1362
- return fn;
1363
- }
1364
- },
1365
-
1366
- pseudos: {
1367
- // Potentially complex pseudos
1368
- "not": markFunction(function( selector ) {
1369
- // Trim the selector passed to compile
1370
- // to avoid treating leading and trailing
1371
- // spaces as combinators
1372
- var input = [],
1373
- results = [],
1374
- matcher = compile( selector.replace( rtrim, "$1" ) );
1375
-
1376
- return matcher[ expando ] ?
1377
- markFunction(function( seed, matches, context, xml ) {
1378
- var elem,
1379
- unmatched = matcher( seed, null, xml, [] ),
1380
- i = seed.length;
1381
-
1382
- // Match elements unmatched by `matcher`
1383
- while ( i-- ) {
1384
- if ( (elem = unmatched[i]) ) {
1385
- seed[i] = !(matches[i] = elem);
1386
- }
1387
- }
1388
- }) :
1389
- function( elem, context, xml ) {
1390
- input[0] = elem;
1391
- matcher( input, null, xml, results );
1392
- // Don't keep the element (issue #299)
1393
- input[0] = null;
1394
- return !results.pop();
1395
- };
1396
- }),
1397
-
1398
- "has": markFunction(function( selector ) {
1399
- return function( elem ) {
1400
- return Sizzle( selector, elem ).length > 0;
1401
- };
1402
- }),
1403
-
1404
- "contains": markFunction(function( text ) {
1405
- text = text.replace( runescape, funescape );
1406
- return function( elem ) {
1407
- return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
1408
- };
1409
- }),
1410
-
1411
- // "Whether an element is represented by a :lang() selector
1412
- // is based solely on the element's language value
1413
- // being equal to the identifier C,
1414
- // or beginning with the identifier C immediately followed by "-".
1415
- // The matching of C against the element's language value is performed case-insensitively.
1416
- // The identifier C does not have to be a valid language name."
1417
- // http://www.w3.org/TR/selectors/#lang-pseudo
1418
- "lang": markFunction( function( lang ) {
1419
- // lang value must be a valid identifier
1420
- if ( !ridentifier.test(lang || "") ) {
1421
- Sizzle.error( "unsupported lang: " + lang );
1422
- }
1423
- lang = lang.replace( runescape, funescape ).toLowerCase();
1424
- return function( elem ) {
1425
- var elemLang;
1426
- do {
1427
- if ( (elemLang = documentIsHTML ?
1428
- elem.lang :
1429
- elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
1430
-
1431
- elemLang = elemLang.toLowerCase();
1432
- return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
1433
- }
1434
- } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
1435
- return false;
1436
- };
1437
- }),
1438
-
1439
- // Miscellaneous
1440
- "target": function( elem ) {
1441
- var hash = window.location && window.location.hash;
1442
- return hash && hash.slice( 1 ) === elem.id;
1443
- },
1444
-
1445
- "root": function( elem ) {
1446
- return elem === docElem;
1447
- },
1448
-
1449
- "focus": function( elem ) {
1450
- return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
1451
- },
1452
-
1453
- // Boolean properties
1454
- "enabled": createDisabledPseudo( false ),
1455
- "disabled": createDisabledPseudo( true ),
1456
-
1457
- "checked": function( elem ) {
1458
- // In CSS3, :checked should return both checked and selected elements
1459
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1460
- var nodeName = elem.nodeName.toLowerCase();
1461
- return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
1462
- },
1463
-
1464
- "selected": function( elem ) {
1465
- // Accessing this property makes selected-by-default
1466
- // options in Safari work properly
1467
- if ( elem.parentNode ) {
1468
- elem.parentNode.selectedIndex;
1469
- }
1470
-
1471
- return elem.selected === true;
1472
- },
1473
-
1474
- // Contents
1475
- "empty": function( elem ) {
1476
- // http://www.w3.org/TR/selectors/#empty-pseudo
1477
- // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
1478
- // but not by others (comment: 8; processing instruction: 7; etc.)
1479
- // nodeType < 6 works because attributes (2) do not appear as children
1480
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1481
- if ( elem.nodeType < 6 ) {
1482
- return false;
1483
- }
1484
- }
1485
- return true;
1486
- },
1487
-
1488
- "parent": function( elem ) {
1489
- return !Expr.pseudos["empty"]( elem );
1490
- },
1491
-
1492
- // Element/input types
1493
- "header": function( elem ) {
1494
- return rheader.test( elem.nodeName );
1495
- },
1496
-
1497
- "input": function( elem ) {
1498
- return rinputs.test( elem.nodeName );
1499
- },
1500
-
1501
- "button": function( elem ) {
1502
- var name = elem.nodeName.toLowerCase();
1503
- return name === "input" && elem.type === "button" || name === "button";
1504
- },
1505
-
1506
- "text": function( elem ) {
1507
- var attr;
1508
- return elem.nodeName.toLowerCase() === "input" &&
1509
- elem.type === "text" &&
1510
-
1511
- // Support: IE<8
1512
- // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
1513
- ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
1514
- },
1515
-
1516
- // Position-in-collection
1517
- "first": createPositionalPseudo(function() {
1518
- return [ 0 ];
1519
- }),
1520
-
1521
- "last": createPositionalPseudo(function( matchIndexes, length ) {
1522
- return [ length - 1 ];
1523
- }),
1524
-
1525
- "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
1526
- return [ argument < 0 ? argument + length : argument ];
1527
- }),
1528
-
1529
- "even": createPositionalPseudo(function( matchIndexes, length ) {
1530
- var i = 0;
1531
- for ( ; i < length; i += 2 ) {
1532
- matchIndexes.push( i );
1533
- }
1534
- return matchIndexes;
1535
- }),
1536
-
1537
- "odd": createPositionalPseudo(function( matchIndexes, length ) {
1538
- var i = 1;
1539
- for ( ; i < length; i += 2 ) {
1540
- matchIndexes.push( i );
1541
- }
1542
- return matchIndexes;
1543
- }),
1544
-
1545
- "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
1546
- var i = argument < 0 ? argument + length : argument;
1547
- for ( ; --i >= 0; ) {
1548
- matchIndexes.push( i );
1549
- }
1550
- return matchIndexes;
1551
- }),
1552
-
1553
- "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
1554
- var i = argument < 0 ? argument + length : argument;
1555
- for ( ; ++i < length; ) {
1556
- matchIndexes.push( i );
1557
- }
1558
- return matchIndexes;
1559
- })
1560
- }
1561
- };
1562
-
1563
- Expr.pseudos["nth"] = Expr.pseudos["eq"];
1564
-
1565
- // Add button/input type pseudos
1566
- for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
1567
- Expr.pseudos[ i ] = createInputPseudo( i );
1568
- }
1569
- for ( i in { submit: true, reset: true } ) {
1570
- Expr.pseudos[ i ] = createButtonPseudo( i );
1571
- }
1572
-
1573
- // Easy API for creating new setFilters
1574
- function setFilters() {}
1575
- setFilters.prototype = Expr.filters = Expr.pseudos;
1576
- Expr.setFilters = new setFilters();
1577
-
1578
- tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
1579
- var matched, match, tokens, type,
1580
- soFar, groups, preFilters,
1581
- cached = tokenCache[ selector + " " ];
1582
-
1583
- if ( cached ) {
1584
- return parseOnly ? 0 : cached.slice( 0 );
1585
- }
1586
-
1587
- soFar = selector;
1588
- groups = [];
1589
- preFilters = Expr.preFilter;
1590
-
1591
- while ( soFar ) {
1592
-
1593
- // Comma and first run
1594
- if ( !matched || (match = rcomma.exec( soFar )) ) {
1595
- if ( match ) {
1596
- // Don't consume trailing commas as valid
1597
- soFar = soFar.slice( match[0].length ) || soFar;
1598
- }
1599
- groups.push( (tokens = []) );
1600
- }
1601
-
1602
- matched = false;
1603
-
1604
- // Combinators
1605
- if ( (match = rcombinators.exec( soFar )) ) {
1606
- matched = match.shift();
1607
- tokens.push({
1608
- value: matched,
1609
- // Cast descendant combinators to space
1610
- type: match[0].replace( rtrim, " " )
1611
- });
1612
- soFar = soFar.slice( matched.length );
1613
- }
1614
-
1615
- // Filters
1616
- for ( type in Expr.filter ) {
1617
- if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
1618
- (match = preFilters[ type ]( match ))) ) {
1619
- matched = match.shift();
1620
- tokens.push({
1621
- value: matched,
1622
- type: type,
1623
- matches: match
1624
- });
1625
- soFar = soFar.slice( matched.length );
1626
- }
1627
- }
1628
-
1629
- if ( !matched ) {
1630
- break;
1631
- }
1632
- }
1633
-
1634
- // Return the length of the invalid excess
1635
- // if we're just parsing
1636
- // Otherwise, throw an error or return tokens
1637
- return parseOnly ?
1638
- soFar.length :
1639
- soFar ?
1640
- Sizzle.error( selector ) :
1641
- // Cache the tokens
1642
- tokenCache( selector, groups ).slice( 0 );
1643
- };
1644
-
1645
- function toSelector( tokens ) {
1646
- var i = 0,
1647
- len = tokens.length,
1648
- selector = "";
1649
- for ( ; i < len; i++ ) {
1650
- selector += tokens[i].value;
1651
- }
1652
- return selector;
1653
- }
1654
-
1655
- function addCombinator( matcher, combinator, base ) {
1656
- var dir = combinator.dir,
1657
- skip = combinator.next,
1658
- key = skip || dir,
1659
- checkNonElements = base && key === "parentNode",
1660
- doneName = done++;
1661
-
1662
- return combinator.first ?
1663
- // Check against closest ancestor/preceding element
1664
- function( elem, context, xml ) {
1665
- while ( (elem = elem[ dir ]) ) {
1666
- if ( elem.nodeType === 1 || checkNonElements ) {
1667
- return matcher( elem, context, xml );
1668
- }
1669
- }
1670
- } :
1671
-
1672
- // Check against all ancestor/preceding elements
1673
- function( elem, context, xml ) {
1674
- var oldCache, uniqueCache, outerCache,
1675
- newCache = [ dirruns, doneName ];
1676
-
1677
- // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
1678
- if ( xml ) {
1679
- while ( (elem = elem[ dir ]) ) {
1680
- if ( elem.nodeType === 1 || checkNonElements ) {
1681
- if ( matcher( elem, context, xml ) ) {
1682
- return true;
1683
- }
1684
- }
1685
- }
1686
- } else {
1687
- while ( (elem = elem[ dir ]) ) {
1688
- if ( elem.nodeType === 1 || checkNonElements ) {
1689
- outerCache = elem[ expando ] || (elem[ expando ] = {});
1690
-
1691
- // Support: IE <9 only
1692
- // Defend against cloned attroperties (jQuery gh-1709)
1693
- uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
1694
-
1695
- if ( skip && skip === elem.nodeName.toLowerCase() ) {
1696
- elem = elem[ dir ] || elem;
1697
- } else if ( (oldCache = uniqueCache[ key ]) &&
1698
- oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
1699
-
1700
- // Assign to newCache so results back-propagate to previous elements
1701
- return (newCache[ 2 ] = oldCache[ 2 ]);
1702
- } else {
1703
- // Reuse newcache so results back-propagate to previous elements
1704
- uniqueCache[ key ] = newCache;
1705
-
1706
- // A match means we're done; a fail means we have to keep checking
1707
- if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
1708
- return true;
1709
- }
1710
- }
1711
- }
1712
- }
1713
- }
1714
- };
1715
- }
1716
-
1717
- function elementMatcher( matchers ) {
1718
- return matchers.length > 1 ?
1719
- function( elem, context, xml ) {
1720
- var i = matchers.length;
1721
- while ( i-- ) {
1722
- if ( !matchers[i]( elem, context, xml ) ) {
1723
- return false;
1724
- }
1725
- }
1726
- return true;
1727
- } :
1728
- matchers[0];
1729
- }
1730
-
1731
- function multipleContexts( selector, contexts, results ) {
1732
- var i = 0,
1733
- len = contexts.length;
1734
- for ( ; i < len; i++ ) {
1735
- Sizzle( selector, contexts[i], results );
1736
- }
1737
- return results;
1738
- }
1739
-
1740
- function condense( unmatched, map, filter, context, xml ) {
1741
- var elem,
1742
- newUnmatched = [],
1743
- i = 0,
1744
- len = unmatched.length,
1745
- mapped = map != null;
1746
-
1747
- for ( ; i < len; i++ ) {
1748
- if ( (elem = unmatched[i]) ) {
1749
- if ( !filter || filter( elem, context, xml ) ) {
1750
- newUnmatched.push( elem );
1751
- if ( mapped ) {
1752
- map.push( i );
1753
- }
1754
- }
1755
- }
1756
- }
1757
-
1758
- return newUnmatched;
1759
- }
1760
-
1761
- function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
1762
- if ( postFilter && !postFilter[ expando ] ) {
1763
- postFilter = setMatcher( postFilter );
1764
- }
1765
- if ( postFinder && !postFinder[ expando ] ) {
1766
- postFinder = setMatcher( postFinder, postSelector );
1767
- }
1768
- return markFunction(function( seed, results, context, xml ) {
1769
- var temp, i, elem,
1770
- preMap = [],
1771
- postMap = [],
1772
- preexisting = results.length,
1773
-
1774
- // Get initial elements from seed or context
1775
- elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
1776
-
1777
- // Prefilter to get matcher input, preserving a map for seed-results synchronization
1778
- matcherIn = preFilter && ( seed || !selector ) ?
1779
- condense( elems, preMap, preFilter, context, xml ) :
1780
- elems,
1781
-
1782
- matcherOut = matcher ?
1783
- // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
1784
- postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
1785
-
1786
- // ...intermediate processing is necessary
1787
- [] :
1788
-
1789
- // ...otherwise use results directly
1790
- results :
1791
- matcherIn;
1792
-
1793
- // Find primary matches
1794
- if ( matcher ) {
1795
- matcher( matcherIn, matcherOut, context, xml );
1796
- }
1797
-
1798
- // Apply postFilter
1799
- if ( postFilter ) {
1800
- temp = condense( matcherOut, postMap );
1801
- postFilter( temp, [], context, xml );
1802
-
1803
- // Un-match failing elements by moving them back to matcherIn
1804
- i = temp.length;
1805
- while ( i-- ) {
1806
- if ( (elem = temp[i]) ) {
1807
- matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
1808
- }
1809
- }
1810
- }
1811
-
1812
- if ( seed ) {
1813
- if ( postFinder || preFilter ) {
1814
- if ( postFinder ) {
1815
- // Get the final matcherOut by condensing this intermediate into postFinder contexts
1816
- temp = [];
1817
- i = matcherOut.length;
1818
- while ( i-- ) {
1819
- if ( (elem = matcherOut[i]) ) {
1820
- // Restore matcherIn since elem is not yet a final match
1821
- temp.push( (matcherIn[i] = elem) );
1822
- }
1823
- }
1824
- postFinder( null, (matcherOut = []), temp, xml );
1825
- }
1826
-
1827
- // Move matched elements from seed to results to keep them synchronized
1828
- i = matcherOut.length;
1829
- while ( i-- ) {
1830
- if ( (elem = matcherOut[i]) &&
1831
- (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
1832
-
1833
- seed[temp] = !(results[temp] = elem);
1834
- }
1835
- }
1836
- }
1837
-
1838
- // Add elements to results, through postFinder if defined
1839
- } else {
1840
- matcherOut = condense(
1841
- matcherOut === results ?
1842
- matcherOut.splice( preexisting, matcherOut.length ) :
1843
- matcherOut
1844
- );
1845
- if ( postFinder ) {
1846
- postFinder( null, results, matcherOut, xml );
1847
- } else {
1848
- push.apply( results, matcherOut );
1849
- }
1850
- }
1851
- });
1852
- }
1853
-
1854
- function matcherFromTokens( tokens ) {
1855
- var checkContext, matcher, j,
1856
- len = tokens.length,
1857
- leadingRelative = Expr.relative[ tokens[0].type ],
1858
- implicitRelative = leadingRelative || Expr.relative[" "],
1859
- i = leadingRelative ? 1 : 0,
1860
-
1861
- // The foundational matcher ensures that elements are reachable from top-level context(s)
1862
- matchContext = addCombinator( function( elem ) {
1863
- return elem === checkContext;
1864
- }, implicitRelative, true ),
1865
- matchAnyContext = addCombinator( function( elem ) {
1866
- return indexOf( checkContext, elem ) > -1;
1867
- }, implicitRelative, true ),
1868
- matchers = [ function( elem, context, xml ) {
1869
- var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
1870
- (checkContext = context).nodeType ?
1871
- matchContext( elem, context, xml ) :
1872
- matchAnyContext( elem, context, xml ) );
1873
- // Avoid hanging onto element (issue #299)
1874
- checkContext = null;
1875
- return ret;
1876
- } ];
1877
-
1878
- for ( ; i < len; i++ ) {
1879
- if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
1880
- matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
1881
- } else {
1882
- matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
1883
-
1884
- // Return special upon seeing a positional matcher
1885
- if ( matcher[ expando ] ) {
1886
- // Find the next relative operator (if any) for proper handling
1887
- j = ++i;
1888
- for ( ; j < len; j++ ) {
1889
- if ( Expr.relative[ tokens[j].type ] ) {
1890
- break;
1891
- }
1892
- }
1893
- return setMatcher(
1894
- i > 1 && elementMatcher( matchers ),
1895
- i > 1 && toSelector(
1896
- // If the preceding token was a descendant combinator, insert an implicit any-element `*`
1897
- tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
1898
- ).replace( rtrim, "$1" ),
1899
- matcher,
1900
- i < j && matcherFromTokens( tokens.slice( i, j ) ),
1901
- j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
1902
- j < len && toSelector( tokens )
1903
- );
1904
- }
1905
- matchers.push( matcher );
1906
- }
1907
- }
1908
-
1909
- return elementMatcher( matchers );
1910
- }
1911
-
1912
- function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
1913
- var bySet = setMatchers.length > 0,
1914
- byElement = elementMatchers.length > 0,
1915
- superMatcher = function( seed, context, xml, results, outermost ) {
1916
- var elem, j, matcher,
1917
- matchedCount = 0,
1918
- i = "0",
1919
- unmatched = seed && [],
1920
- setMatched = [],
1921
- contextBackup = outermostContext,
1922
- // We must always have either seed elements or outermost context
1923
- elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
1924
- // Use integer dirruns iff this is the outermost matcher
1925
- dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
1926
- len = elems.length;
1927
-
1928
- if ( outermost ) {
1929
- outermostContext = context === document || context || outermost;
1930
- }
1931
-
1932
- // Add elements passing elementMatchers directly to results
1933
- // Support: IE<9, Safari
1934
- // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
1935
- for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
1936
- if ( byElement && elem ) {
1937
- j = 0;
1938
- if ( !context && elem.ownerDocument !== document ) {
1939
- setDocument( elem );
1940
- xml = !documentIsHTML;
1941
- }
1942
- while ( (matcher = elementMatchers[j++]) ) {
1943
- if ( matcher( elem, context || document, xml) ) {
1944
- results.push( elem );
1945
- break;
1946
- }
1947
- }
1948
- if ( outermost ) {
1949
- dirruns = dirrunsUnique;
1950
- }
1951
- }
1952
-
1953
- // Track unmatched elements for set filters
1954
- if ( bySet ) {
1955
- // They will have gone through all possible matchers
1956
- if ( (elem = !matcher && elem) ) {
1957
- matchedCount--;
1958
- }
1959
-
1960
- // Lengthen the array for every element, matched or not
1961
- if ( seed ) {
1962
- unmatched.push( elem );
1963
- }
1964
- }
1965
- }
1966
-
1967
- // `i` is now the count of elements visited above, and adding it to `matchedCount`
1968
- // makes the latter nonnegative.
1969
- matchedCount += i;
1970
-
1971
- // Apply set filters to unmatched elements
1972
- // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
1973
- // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
1974
- // no element matchers and no seed.
1975
- // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
1976
- // case, which will result in a "00" `matchedCount` that differs from `i` but is also
1977
- // numerically zero.
1978
- if ( bySet && i !== matchedCount ) {
1979
- j = 0;
1980
- while ( (matcher = setMatchers[j++]) ) {
1981
- matcher( unmatched, setMatched, context, xml );
1982
- }
1983
-
1984
- if ( seed ) {
1985
- // Reintegrate element matches to eliminate the need for sorting
1986
- if ( matchedCount > 0 ) {
1987
- while ( i-- ) {
1988
- if ( !(unmatched[i] || setMatched[i]) ) {
1989
- setMatched[i] = pop.call( results );
1990
- }
1991
- }
1992
- }
1993
-
1994
- // Discard index placeholder values to get only actual matches
1995
- setMatched = condense( setMatched );
1996
- }
1997
-
1998
- // Add matches to results
1999
- push.apply( results, setMatched );
2000
-
2001
- // Seedless set matches succeeding multiple successful matchers stipulate sorting
2002
- if ( outermost && !seed && setMatched.length > 0 &&
2003
- ( matchedCount + setMatchers.length ) > 1 ) {
2004
-
2005
- Sizzle.uniqueSort( results );
2006
- }
2007
- }
2008
-
2009
- // Override manipulation of globals by nested matchers
2010
- if ( outermost ) {
2011
- dirruns = dirrunsUnique;
2012
- outermostContext = contextBackup;
2013
- }
2014
-
2015
- return unmatched;
2016
- };
2017
-
2018
- return bySet ?
2019
- markFunction( superMatcher ) :
2020
- superMatcher;
2021
- }
2022
-
2023
- compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2024
- var i,
2025
- setMatchers = [],
2026
- elementMatchers = [],
2027
- cached = compilerCache[ selector + " " ];
2028
-
2029
- if ( !cached ) {
2030
- // Generate a function of recursive functions that can be used to check each element
2031
- if ( !match ) {
2032
- match = tokenize( selector );
2033
- }
2034
- i = match.length;
2035
- while ( i-- ) {
2036
- cached = matcherFromTokens( match[i] );
2037
- if ( cached[ expando ] ) {
2038
- setMatchers.push( cached );
2039
- } else {
2040
- elementMatchers.push( cached );
2041
- }
2042
- }
2043
-
2044
- // Cache the compiled function
2045
- cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2046
-
2047
- // Save selector and tokenization
2048
- cached.selector = selector;
2049
- }
2050
- return cached;
2051
- };
2052
-
2053
- /**
2054
- * A low-level selection function that works with Sizzle's compiled
2055
- * selector functions
2056
- * @param {String|Function} selector A selector or a pre-compiled
2057
- * selector function built with Sizzle.compile
2058
- * @param {Element} context
2059
- * @param {Array} [results]
2060
- * @param {Array} [seed] A set of elements to match against
2061
- */
2062
- select = Sizzle.select = function( selector, context, results, seed ) {
2063
- var i, tokens, token, type, find,
2064
- compiled = typeof selector === "function" && selector,
2065
- match = !seed && tokenize( (selector = compiled.selector || selector) );
2066
-
2067
- results = results || [];
2068
-
2069
- // Try to minimize operations if there is only one selector in the list and no seed
2070
- // (the latter of which guarantees us context)
2071
- if ( match.length === 1 ) {
2072
-
2073
- // Reduce context if the leading compound selector is an ID
2074
- tokens = match[0] = match[0].slice( 0 );
2075
- if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2076
- support.getById && context.nodeType === 9 && documentIsHTML &&
2077
- Expr.relative[ tokens[1].type ] ) {
2078
-
2079
- context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2080
- if ( !context ) {
2081
- return results;
2082
-
2083
- // Precompiled matchers will still verify ancestry, so step up a level
2084
- } else if ( compiled ) {
2085
- context = context.parentNode;
2086
- }
2087
-
2088
- selector = selector.slice( tokens.shift().value.length );
2089
- }
2090
-
2091
- // Fetch a seed set for right-to-left matching
2092
- i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2093
- while ( i-- ) {
2094
- token = tokens[i];
2095
-
2096
- // Abort if we hit a combinator
2097
- if ( Expr.relative[ (type = token.type) ] ) {
2098
- break;
2099
- }
2100
- if ( (find = Expr.find[ type ]) ) {
2101
- // Search, expanding context for leading sibling combinators
2102
- if ( (seed = find(
2103
- token.matches[0].replace( runescape, funescape ),
2104
- rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2105
- )) ) {
2106
-
2107
- // If seed is empty or no tokens remain, we can return early
2108
- tokens.splice( i, 1 );
2109
- selector = seed.length && toSelector( tokens );
2110
- if ( !selector ) {
2111
- push.apply( results, seed );
2112
- return results;
2113
- }
2114
-
2115
- break;
2116
- }
2117
- }
2118
- }
2119
- }
2120
-
2121
- // Compile and execute a filtering function if one is not provided
2122
- // Provide `match` to avoid retokenization if we modified the selector above
2123
- ( compiled || compile( selector, match ) )(
2124
- seed,
2125
- context,
2126
- !documentIsHTML,
2127
- results,
2128
- !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2129
- );
2130
- return results;
2131
- };
2132
-
2133
- // One-time assignments
2134
-
2135
- // Sort stability
2136
- support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2137
-
2138
- // Support: Chrome 14-35+
2139
- // Always assume duplicates if they aren't passed to the comparison function
2140
- support.detectDuplicates = !!hasDuplicate;
2141
-
2142
- // Initialize against the default document
2143
- setDocument();
2144
-
2145
- // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2146
- // Detached nodes confoundingly follow *each other*
2147
- support.sortDetached = assert(function( el ) {
2148
- // Should return 1, but returns 4 (following)
2149
- return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
2150
- });
2151
-
2152
- // Support: IE<8
2153
- // Prevent attribute/property "interpolation"
2154
- // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2155
- if ( !assert(function( el ) {
2156
- el.innerHTML = "<a href='#'></a>";
2157
- return el.firstChild.getAttribute("href") === "#" ;
2158
- }) ) {
2159
- addHandle( "type|href|height|width", function( elem, name, isXML ) {
2160
- if ( !isXML ) {
2161
- return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2162
- }
2163
- });
2164
- }
2165
-
2166
- // Support: IE<9
2167
- // Use defaultValue in place of getAttribute("value")
2168
- if ( !support.attributes || !assert(function( el ) {
2169
- el.innerHTML = "<input/>";
2170
- el.firstChild.setAttribute( "value", "" );
2171
- return el.firstChild.getAttribute( "value" ) === "";
2172
- }) ) {
2173
- addHandle( "value", function( elem, name, isXML ) {
2174
- if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2175
- return elem.defaultValue;
2176
- }
2177
- });
2178
- }
2179
-
2180
- // Support: IE<9
2181
- // Use getAttributeNode to fetch booleans when getAttribute lies
2182
- if ( !assert(function( el ) {
2183
- return el.getAttribute("disabled") == null;
2184
- }) ) {
2185
- addHandle( booleans, function( elem, name, isXML ) {
2186
- var val;
2187
- if ( !isXML ) {
2188
- return elem[ name ] === true ? name.toLowerCase() :
2189
- (val = elem.getAttributeNode( name )) && val.specified ?
2190
- val.value :
2191
- null;
2192
- }
2193
- });
2194
- }
2195
-
2196
- // EXPOSE
2197
- var _sizzle = window.Sizzle;
2198
-
2199
- Sizzle.noConflict = function() {
2200
- if ( window.Sizzle === Sizzle ) {
2201
- window.Sizzle = _sizzle;
2202
- }
2203
-
2204
- return Sizzle;
2205
- };
2206
-
2207
- if ( typeof define === "function" && define.amd ) {
2208
- define(function() { return Sizzle; });
2209
- // Sizzle requires that there be a global window in Common-JS like environments
2210
- } else if ( typeof module !== "undefined" && module.exports ) {
2211
- module.exports = Sizzle;
2212
- } else {
2213
- window.Sizzle = Sizzle;
2214
- }
2215
- // EXPOSE
2216
-
2217
- })( window );