/*! * jquery javascript library v3.6.3 * https://jquery.com/ * * includes sizzle.js * https://sizzlejs.com/ * * copyright openjs foundation and other contributors * released under the mit license * https://jquery.org/license * * date: 2022-12-20t21:28z */ ( function( global, factory ) { "use strict"; if ( typeof module === "object" && typeof module.exports === "object" ) { // for commonjs and commonjs-like environments where a proper `window` // is present, execute the factory and get jquery. // for environments that do not have a `window` with a `document` // (such as node.js), expose a factory as module.exports. // this accentuates the need for the creation of a real `window`. // e.g. var jquery = require("jquery")(window); // see ticket trac-14549 for more info. module.exports = global.document ? factory( global, true ) : function( w ) { if ( !w.document ) { throw new error( "jquery requires a window with a document" ); } return factory( w ); }; } else { factory( global ); } // pass this if window is not defined yet } )( typeof window !== "undefined" ? window : this, function( window, noglobal ) { // edge <= 12 - 13+, firefox <=18 - 45+, ie 10 - 11, safari 5.1 - 9+, ios 6 - 9.1 // throw exceptions when non-strict code (e.g., asp.net 4.5) accesses strict mode // arguments.callee.caller (trac-13335). but as of jquery 3.0 (2016), strict mode should be common // enough that all such attempts are guarded in a try block. "use strict"; var arr = []; var getproto = object.getprototypeof; var slice = arr.slice; var flat = arr.flat ? function( array ) { return arr.flat.call( array ); } : function( array ) { return arr.concat.apply( [], array ); }; var push = arr.push; var indexof = arr.indexof; var class2type = {}; var tostring = class2type.tostring; var hasown = class2type.hasownproperty; var fntostring = hasown.tostring; var objectfunctionstring = fntostring.call( object ); var support = {}; var isfunction = function isfunction( obj ) { // support: chrome <=57, firefox <=52 // in some browsers, typeof returns "function" for html elements // (i.e., `typeof document.createelement( "object" ) === "function"`). // we don't want to classify *any* dom node as a function. // support: qtweb <=3.8.5, webkit <=534.34, wkhtmltopdf tool <=0.12.5 // plus for old webkit, typeof returns "function" for html collections // (e.g., `typeof document.getelementsbytagname("div") === "function"`). (gh-4756) return typeof obj === "function" && typeof obj.nodetype !== "number" && typeof obj.item !== "function"; }; var iswindow = function iswindow( obj ) { return obj != null && obj === obj.window; }; var document = window.document; var preservedscriptattributes = { type: true, src: true, nonce: true, nomodule: true }; function domeval( code, node, doc ) { doc = doc || document; var i, val, script = doc.createelement( "script" ); script.text = code; if ( node ) { for ( i in preservedscriptattributes ) { // support: firefox 64+, edge 18+ // some browsers don't support the "nonce" property on scripts. // on the other hand, just using `getattribute` is not enough as // the `nonce` attribute is reset to an empty string whenever it // becomes browsing-context connected. // see https://github.com/whatwg/html/issues/2369 // see https://html.spec.whatwg.org/#nonce-attributes // the `node.getattribute` check was added for the sake of // `jquery.globaleval` so that it can fake a nonce-containing node // via an object. val = node[ i ] || node.getattribute && node.getattribute( i ); if ( val ) { script.setattribute( i, val ); } } } doc.head.appendchild( script ).parentnode.removechild( script ); } function totype( obj ) { if ( obj == null ) { return obj + ""; } // support: android <=2.3 only (functionish regexp) return typeof obj === "object" || typeof obj === "function" ? class2type[ tostring.call( obj ) ] || "object" : typeof obj; } /* global symbol */ // defining this global in .eslintrc.json would create a danger of using the global // unguarded in another place, it seems safer to define global only for this module var version = "3.6.3", // define a local copy of jquery jquery = function( selector, context ) { // the jquery object is actually just the init constructor 'enhanced' // need init if jquery is called (just allow error to be thrown if not included) return new jquery.fn.init( selector, context ); }; jquery.fn = jquery.prototype = { // the current version of jquery being used jquery: version, constructor: jquery, // the default length of a jquery object is 0 length: 0, toarray: function() { return slice.call( this ); }, // get the nth element in the matched element set or // get the whole matched element set as a clean array get: function( num ) { // return all the elements in a clean array if ( num == null ) { return slice.call( this ); } // return just the one element from the set return num < 0 ? this[ num + this.length ] : this[ num ]; }, // take an array of elements and push it onto the stack // (returning the new matched element set) pushstack: function( elems ) { // build a new jquery matched element set var ret = jquery.merge( this.constructor(), elems ); // add the old object onto the stack (as a reference) ret.prevobject = this; // return the newly-formed element set return ret; }, // execute a callback for every element in the matched set. each: function( callback ) { return jquery.each( this, callback ); }, map: function( callback ) { return this.pushstack( jquery.map( this, function( elem, i ) { return callback.call( elem, i, elem ); } ) ); }, slice: function() { return this.pushstack( slice.apply( this, arguments ) ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, even: function() { return this.pushstack( jquery.grep( this, function( _elem, i ) { return ( i + 1 ) % 2; } ) ); }, odd: function() { return this.pushstack( jquery.grep( this, function( _elem, i ) { return i % 2; } ) ); }, eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); return this.pushstack( j >= 0 && j < len ? [ this[ j ] ] : [] ); }, end: function() { return this.prevobject || this.constructor(); }, // for internal use only. // behaves like an array's method, not like a jquery method. push: push, sort: arr.sort, splice: arr.splice }; jquery.extend = jquery.fn.extend = function() { var options, name, src, copy, copyisarray, clone, target = arguments[ 0 ] || {}, i = 1, length = arguments.length, deep = false; // handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; // skip the boolean and the target target = arguments[ i ] || {}; i++; } // handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !isfunction( target ) ) { target = {}; } // extend jquery itself if only one argument is passed if ( i === length ) { target = this; i--; } for ( ; i < length; i++ ) { // only deal with non-null/undefined values if ( ( options = arguments[ i ] ) != null ) { // extend the base object for ( name in options ) { copy = options[ name ]; // prevent object.prototype pollution // prevent never-ending loop if ( name === "__proto__" || target === copy ) { continue; } // recurse if we're merging plain objects or arrays if ( deep && copy && ( jquery.isplainobject( copy ) || ( copyisarray = array.isarray( copy ) ) ) ) { src = target[ name ]; // ensure proper type for the source value if ( copyisarray && !array.isarray( src ) ) { clone = []; } else if ( !copyisarray && !jquery.isplainobject( src ) ) { clone = {}; } else { clone = src; } copyisarray = false; // never move original objects, clone them target[ name ] = jquery.extend( deep, clone, copy ); // don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // return the modified object return target; }; jquery.extend( { // unique for each copy of jquery on the page expando: "jquery" + ( version + math.random() ).replace( /\d/g, "" ), // assume jquery is ready without the ready module isready: true, error: function( msg ) { throw new error( msg ); }, noop: function() {}, isplainobject: function( obj ) { var proto, ctor; // detect obvious negatives // use tostring instead of jquery.type to catch host objects if ( !obj || tostring.call( obj ) !== "[object object]" ) { return false; } proto = getproto( obj ); // objects with no prototype (e.g., `object.create( null )`) are plain if ( !proto ) { return true; } // objects with prototype are plain iff they were constructed by a global object function ctor = hasown.call( proto, "constructor" ) && proto.constructor; return typeof ctor === "function" && fntostring.call( ctor ) === objectfunctionstring; }, isemptyobject: function( obj ) { var name; for ( name in obj ) { return false; } return true; }, // evaluates a script in a provided context; falls back to the global one // if not specified. globaleval: function( code, options, doc ) { domeval( code, { nonce: options && options.nonce }, doc ); }, each: function( obj, callback ) { var length, i = 0; if ( isarraylike( obj ) ) { length = obj.length; for ( ; i < length; i++ ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } else { for ( i in obj ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } return obj; }, // results is for internal usage only makearray: function( arr, results ) { var ret = results || []; if ( arr != null ) { if ( isarraylike( object( arr ) ) ) { jquery.merge( ret, typeof arr === "string" ? [ arr ] : arr ); } else { push.call( ret, arr ); } } return ret; }, inarray: function( elem, arr, i ) { return arr == null ? -1 : indexof.call( arr, elem, i ); }, // support: android <=4.0 only, phantomjs 1 only // push.apply(_, arraylike) throws on ancient webkit merge: function( first, second ) { var len = +second.length, j = 0, i = first.length; for ( ; j < len; j++ ) { first[ i++ ] = second[ j ]; } first.length = i; return first; }, grep: function( elems, callback, invert ) { var callbackinverse, matches = [], i = 0, length = elems.length, callbackexpect = !invert; // go through the array, only saving the items // that pass the validator function for ( ; i < length; i++ ) { callbackinverse = !callback( elems[ i ], i ); if ( callbackinverse !== callbackexpect ) { matches.push( elems[ i ] ); } } return matches; }, // arg is for internal usage only map: function( elems, callback, arg ) { var length, value, i = 0, ret = []; // go through the array, translating each of the items to their new values if ( isarraylike( elems ) ) { length = elems.length; for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } // go through every key on the object, } else { for ( i in elems ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } } // flatten any nested arrays return flat( ret ); }, // a global guid counter for objects guid: 1, // jquery.support is not used in core but other projects attach their // properties to it so it needs to exist. support: support } ); if ( typeof symbol === "function" ) { jquery.fn[ symbol.iterator ] = arr[ symbol.iterator ]; } // populate the class2type map jquery.each( "boolean number string function array date regexp object error symbol".split( " " ), function( _i, name ) { class2type[ "[object " + name + "]" ] = name.tolowercase(); } ); function isarraylike( obj ) { // support: real ios 8.2 only (not reproducible in simulator) // `in` check used to prevent jit error (gh-2145) // hasown isn't used here due to false negatives // regarding nodelist length in ie var length = !!obj && "length" in obj && obj.length, type = totype( obj ); if ( isfunction( obj ) || iswindow( obj ) ) { return false; } return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } var sizzle = /*! * sizzle css selector engine v2.3.9 * https://sizzlejs.com/ * * copyright js foundation and other contributors * released under the mit license * https://js.foundation/ * * date: 2022-12-19 */ ( function( window ) { var i, support, expr, gettext, isxml, tokenize, compile, select, outermostcontext, sortinput, hasduplicate, // local document vars setdocument, document, docelem, documentishtml, rbuggyqsa, rbuggymatches, matches, contains, // instance-specific data expando = "sizzle" + 1 * new date(), preferreddoc = window.document, dirruns = 0, done = 0, classcache = createcache(), tokencache = createcache(), compilercache = createcache(), nonnativeselectorcache = createcache(), sortorder = function( a, b ) { if ( a === b ) { hasduplicate = true; } return 0; }, // instance methods hasown = ( {} ).hasownproperty, arr = [], pop = arr.pop, pushnative = arr.push, push = arr.push, slice = arr.slice, // use a stripped-down indexof as it's faster than native // https://jsperf.com/thor-indexof-vs-for/5 indexof = function( list, elem ) { var i = 0, len = list.length; for ( ; i < len; i++ ) { if ( list[ i ] === elem ) { return i; } } return -1; }, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + "ismap|loop|multiple|open|readonly|required|scoped", // regular expressions // http://www.w3.org/tr/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]", // https://www.w3.org/tr/css-syntax-3/#ident-token-diagram identifier = "(?:\\\\[\\da-fa-f]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", // attribute selectors: http://www.w3.org/tr/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // operator (capture 2) "*([*^$|!~]?=)" + whitespace + // "attribute values must be css identifiers [capture 5] // or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + identifier + ")(?:\\((" + // to reduce the number of selectors needing tokenize in the prefilter, prefer arguments: // 1. quoted (capture 3; capture 4 or capture 5) "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + // 2. simple (capture 6) "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + // 3. anything else (capture 2) ".*" + ")\\)|)", // leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new regexp( whitespace + "+", "g" ), rtrim = new regexp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), rcomma = new regexp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new regexp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), rdescend = new regexp( whitespace + "|>" ), rpseudo = new regexp( pseudos ), ridentifier = new regexp( "^" + identifier + "$" ), matchexpr = { "id": new regexp( "^#(" + identifier + ")" ), "class": new regexp( "^\\.(" + identifier + ")" ), "tag": new regexp( "^(" + identifier + "|[*])" ), "attr": new regexp( "^" + attributes ), "pseudo": new regexp( "^" + pseudos ), "child": new regexp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), "bool": new regexp( "^(?:" + booleans + ")$", "i" ), // for use in libraries implementing .is() // we use this for pos matching in `select` "needscontext": new regexp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, rhtml = /html$/i, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rnative = /^[^{]+\{\s*\[native \w/, // easily-parseable/retrievable id or tag or class selectors rquickexpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, // css escapes // http://www.w3.org/tr/css21/syndata.html#escaped-characters runescape = new regexp( "\\\\[\\da-fa-f]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), funescape = function( escape, nonhex ) { var high = "0x" + escape.slice( 1 ) - 0x10000; return nonhex ? // strip the backslash prefix from a non-hex escape sequence nonhex : // replace a hexadecimal escape sequence with the encoded unicode code point // support: ie <=11+ // for values outside the basic multilingual plane (bmp), manually construct a // surrogate pair high < 0 ? string.fromcharcode( high + 0x10000 ) : string.fromcharcode( high >> 10 | 0xd800, high & 0x3ff | 0xdc00 ); }, // css string/identifier serialization // https://drafts.csswg.org/cssom/#common-serializing-idioms rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uffff\w-]/g, fcssescape = function( ch, ascodepoint ) { if ( ascodepoint ) { // u+0000 null becomes u+fffd replacement character if ( ch === "\0" ) { return "\ufffd"; } // control characters and (dependent upon position) numbers get escaped as code points return ch.slice( 0, -1 ) + "\\" + ch.charcodeat( ch.length - 1 ).tostring( 16 ) + " "; } // other potentially-special ascii characters get backslash-escaped return "\\" + ch; }, // used for iframes // see setdocument() // removing the function wrapper causes a "permission denied" // error in ie unloadhandler = function() { setdocument(); }, indisabledfieldset = addcombinator( function( elem ) { return elem.disabled === true && elem.nodename.tolowercase() === "fieldset"; }, { dir: "parentnode", next: "legend" } ); // optimize for push.apply( _, nodelist ) try { push.apply( ( arr = slice.call( preferreddoc.childnodes ) ), preferreddoc.childnodes ); // support: android<4.0 // detect silently failing push.apply // eslint-disable-next-line no-unused-expressions arr[ preferreddoc.childnodes.length ].nodetype; } catch ( e ) { push = { apply: arr.length ? // leverage slice if possible function( target, els ) { pushnative.apply( target, slice.call( els ) ); } : // support: ie<9 // otherwise append directly function( target, els ) { var j = target.length, i = 0; // can't trust nodelist.length while ( ( target[ j++ ] = els[ i++ ] ) ) {} target.length = j - 1; } }; } function sizzle( selector, context, results, seed ) { var m, i, elem, nid, match, groups, newselector, newcontext = context && context.ownerdocument, // nodetype defaults to 9, since context defaults to document nodetype = context ? context.nodetype : 9; results = results || []; // return early from calls with invalid selector or context if ( typeof selector !== "string" || !selector || nodetype !== 1 && nodetype !== 9 && nodetype !== 11 ) { return results; } // try to shortcut find operations (as opposed to filters) in html documents if ( !seed ) { setdocument( context ); context = context || document; if ( documentishtml ) { // if the selector is sufficiently simple, try using a "get*by*" dom method // (excepting documentfragment context, where the methods don't exist) if ( nodetype !== 11 && ( match = rquickexpr.exec( selector ) ) ) { // id selector if ( ( m = match[ 1 ] ) ) { // document context if ( nodetype === 9 ) { if ( ( elem = context.getelementbyid( m ) ) ) { // support: ie, opera, webkit // todo: identify versions // getelementbyid can match elements by name instead of id if ( elem.id === m ) { results.push( elem ); return results; } } else { return results; } // element context } else { // support: ie, opera, webkit // todo: identify versions // getelementbyid can match elements by name instead of id if ( newcontext && ( elem = newcontext.getelementbyid( m ) ) && contains( context, elem ) && elem.id === m ) { results.push( elem ); return results; } } // type selector } else if ( match[ 2 ] ) { push.apply( results, context.getelementsbytagname( selector ) ); return results; // class selector } else if ( ( m = match[ 3 ] ) && support.getelementsbyclassname && context.getelementsbyclassname ) { push.apply( results, context.getelementsbyclassname( m ) ); return results; } } // take advantage of queryselectorall if ( support.qsa && !nonnativeselectorcache[ selector + " " ] && ( !rbuggyqsa || !rbuggyqsa.test( selector ) ) && // support: ie 8 only // exclude object elements ( nodetype !== 1 || context.nodename.tolowercase() !== "object" ) ) { newselector = selector; newcontext = context; // qsa considers elements outside a scoping root when evaluating child or // descendant combinators, which is not what we want. // in such cases, we work around the behavior by prefixing every selector in the // list with an id selector referencing the scope context. // the technique has to be used as well when a leading combinator is used // as such selectors are not recognized by queryselectorall. // thanks to andrew dupont for this technique. if ( nodetype === 1 && ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { // expand context for sibling selectors newcontext = rsibling.test( selector ) && testcontext( context.parentnode ) || context; // we can use :scope instead of the id hack if the browser // supports it & if we're not changing the context. if ( newcontext !== context || !support.scope ) { // capture the context id, setting it first if necessary if ( ( nid = context.getattribute( "id" ) ) ) { nid = nid.replace( rcssescape, fcssescape ); } else { context.setattribute( "id", ( nid = expando ) ); } } // prefix every selector in the list groups = tokenize( selector ); i = groups.length; while ( i-- ) { groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + toselector( groups[ i ] ); } newselector = groups.join( "," ); } try { // `qsa` may not throw for unrecognized parts using forgiving parsing: // https://drafts.csswg.org/selectors/#forgiving-selector // like the `:has()` pseudo-class: // https://drafts.csswg.org/selectors/#relational // `css.supports` is still expected to return `false` then: // https://drafts.csswg.org/css-conditional-4/#typedef-supports-selector-fn // https://drafts.csswg.org/css-conditional-4/#dfn-support-selector if ( support.csssupportsselector && // eslint-disable-next-line no-undef !css.supports( "selector(:is(" + newselector + "))" ) ) { // support: ie 11+ // throw to get to the same code path as an error directly in qsa. // note: once we only support browser supporting // `css.supports('selector(...)')`, we can most likely drop // the `try-catch`. ie doesn't implement the api. throw new error(); } push.apply( results, newcontext.queryselectorall( newselector ) ); return results; } catch ( qsaerror ) { nonnativeselectorcache( selector, true ); } finally { if ( nid === expando ) { context.removeattribute( "id" ); } } } } } // all others return select( selector.replace( rtrim, "$1" ), context, results, seed ); } /** * create key-value caches of limited size * @returns {function(string, object)} returns the object data after storing it on itself with * property name the (space-suffixed) string and (if the cache is larger than expr.cachelength) * deleting the oldest entry */ function createcache() { var keys = []; function cache( key, value ) { // use (key + " ") to avoid collision with native prototype properties (see issue #157) if ( keys.push( key + " " ) > expr.cachelength ) { // only keep the most recent entries delete cache[ keys.shift() ]; } return ( cache[ key + " " ] = value ); } return cache; } /** * mark a function for special use by sizzle * @param {function} fn the function to mark */ function markfunction( fn ) { fn[ expando ] = true; return fn; } /** * support testing using an element * @param {function} fn passed the created element and returns a boolean result */ function assert( fn ) { var el = document.createelement( "fieldset" ); try { return !!fn( el ); } catch ( e ) { return false; } finally { // remove from its parent by default if ( el.parentnode ) { el.parentnode.removechild( el ); } // release memory in ie el = null; } } /** * adds the same handler for all of the specified attrs * @param {string} attrs pipe-separated list of attributes * @param {function} handler the method that will be applied */ function addhandle( attrs, handler ) { var arr = attrs.split( "|" ), i = arr.length; while ( i-- ) { expr.attrhandle[ arr[ i ] ] = handler; } } /** * checks document order of two siblings * @param {element} a * @param {element} b * @returns {number} returns less than 0 if a precedes b, greater than 0 if a follows b */ function siblingcheck( a, b ) { var cur = b && a, diff = cur && a.nodetype === 1 && b.nodetype === 1 && a.sourceindex - b.sourceindex; // use ie sourceindex if available on both nodes if ( diff ) { return diff; } // check if b follows a if ( cur ) { while ( ( cur = cur.nextsibling ) ) { if ( cur === b ) { return -1; } } } return a ? 1 : -1; } /** * returns a function to use in pseudos for input types * @param {string} type */ function createinputpseudo( type ) { return function( elem ) { var name = elem.nodename.tolowercase(); return name === "input" && elem.type === type; }; } /** * returns a function to use in pseudos for buttons * @param {string} type */ function createbuttonpseudo( type ) { return function( elem ) { var name = elem.nodename.tolowercase(); return ( name === "input" || name === "button" ) && elem.type === type; }; } /** * returns a function to use in pseudos for :enabled/:disabled * @param {boolean} disabled true for :disabled; false for :enabled */ function createdisabledpseudo( disabled ) { // known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable return function( elem ) { // only certain elements can match :enabled or :disabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled if ( "form" in elem ) { // check for inherited disabledness on relevant non-disabled elements: // * listed form-associated elements in a disabled fieldset // https://html.spec.whatwg.org/multipage/forms.html#category-listed // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled // * option elements in a disabled optgroup // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled // all such elements have a "form" property. if ( elem.parentnode && elem.disabled === false ) { // option elements defer to a parent optgroup if present if ( "label" in elem ) { if ( "label" in elem.parentnode ) { return elem.parentnode.disabled === disabled; } else { return elem.disabled === disabled; } } // support: ie 6 - 11 // use the isdisabled shortcut property to check for disabled fieldset ancestors return elem.isdisabled === disabled || // where there is no isdisabled, check manually /* jshint -w018 */ elem.isdisabled !== !disabled && indisabledfieldset( elem ) === disabled; } return elem.disabled === disabled; // try to winnow out elements that can't be disabled before trusting the disabled property. // some victims get caught in our net (label, legend, menu, track), but it shouldn't // even exist on them, let alone have a boolean value. } else if ( "label" in elem ) { return elem.disabled === disabled; } // remaining elements are neither :enabled nor :disabled return false; }; } /** * returns a function to use in pseudos for positionals * @param {function} fn */ function createpositionalpseudo( fn ) { return markfunction( function( argument ) { argument = +argument; return markfunction( function( seed, matches ) { var j, matchindexes = fn( [], seed.length, argument ), i = matchindexes.length; // match elements found at the specified indexes while ( i-- ) { if ( seed[ ( j = matchindexes[ i ] ) ] ) { seed[ j ] = !( matches[ j ] = seed[ j ] ); } } } ); } ); } /** * checks a node for validity as a sizzle context * @param {element|object=} context * @returns {element|object|boolean} the input node if acceptable, otherwise a falsy value */ function testcontext( context ) { return context && typeof context.getelementsbytagname !== "undefined" && context; } // expose support vars for convenience support = sizzle.support = {}; /** * detects xml nodes * @param {element|object} elem an element or a document * @returns {boolean} true iff elem is a non-html xml node */ isxml = sizzle.isxml = function( elem ) { var namespace = elem && elem.namespaceuri, docelem = elem && ( elem.ownerdocument || elem ).documentelement; // support: ie <=8 // assume html when documentelement doesn't yet exist, such as inside loading iframes // https://bugs.jquery.com/ticket/4833 return !rhtml.test( namespace || docelem && docelem.nodename || "html" ); }; /** * sets document-related variables once based on the current document * @param {element|object} [doc] an element or document object to use to set the document * @returns {object} returns the current document */ setdocument = sizzle.setdocument = function( node ) { var hascompare, subwindow, doc = node ? node.ownerdocument || node : preferreddoc; // return early if doc is invalid or already selected // support: ie 11+, edge 17 - 18+ // ie/edge sometimes throw a "permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( doc == document || doc.nodetype !== 9 || !doc.documentelement ) { return document; } // update global variables document = doc; docelem = document.documentelement; documentishtml = !isxml( document ); // support: ie 9 - 11+, edge 12 - 18+ // accessing iframe documents after unload throws "permission denied" errors (jquery #13936) // support: ie 11+, edge 17 - 18+ // ie/edge sometimes throw a "permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( preferreddoc != document && ( subwindow = document.defaultview ) && subwindow.top !== subwindow ) { // support: ie 11, edge if ( subwindow.addeventlistener ) { subwindow.addeventlistener( "unload", unloadhandler, false ); // support: ie 9 - 10 only } else if ( subwindow.attachevent ) { subwindow.attachevent( "onunload", unloadhandler ); } } // support: ie 8 - 11+, edge 12 - 18+, chrome <=16 - 25 only, firefox <=3.6 - 31 only, // safari 4 - 5 only, opera <=11.6 - 12.x only // ie/edge & older browsers don't support the :scope pseudo-class. // support: safari 6.0 only // safari 6.0 supports :scope but it's an alias of :root there. support.scope = assert( function( el ) { docelem.appendchild( el ).appendchild( document.createelement( "div" ) ); return typeof el.queryselectorall !== "undefined" && !el.queryselectorall( ":scope fieldset div" ).length; } ); // support: chrome 105+, firefox 104+, safari 15.4+ // make sure forgiving mode is not used in `css.supports( "selector(...)" )`. // // `:is()` uses a forgiving selector list as an argument and is widely // implemented, so it's a good one to test against. support.csssupportsselector = assert( function() { /* eslint-disable no-undef */ return css.supports( "selector(*)" ) && // support: firefox 78-81 only // in old firefox, `:is()` didn't use forgiving parsing. in that case, // fail this test as there's no selector to test against that. // `css.supports` uses unforgiving parsing document.queryselectorall( ":is(:jqfake)" ) && // `*` is needed as safari & newer chrome implemented something in between // for `:has()` - it throws in `qsa` if it only contains an unsupported // argument but multiple ones, one of which is supported, are fine. // we want to play safe in case `:is()` gets the same treatment. !css.supports( "selector(:is(*,:jqfake))" ); /* eslint-enable */ } ); /* attributes ---------------------------------------------------------------------- */ // support: ie<8 // verify that getattribute really returns attributes and not properties // (excepting ie8 booleans) support.attributes = assert( function( el ) { el.classname = "i"; return !el.getattribute( "classname" ); } ); /* getelement(s)by* ---------------------------------------------------------------------- */ // check if getelementsbytagname("*") returns only elements support.getelementsbytagname = assert( function( el ) { el.appendchild( document.createcomment( "" ) ); return !el.getelementsbytagname( "*" ).length; } ); // support: ie<9 support.getelementsbyclassname = rnative.test( document.getelementsbyclassname ); // support: ie<10 // check if getelementbyid returns elements by name // the broken getelementbyid methods don't pick up programmatically-set names, // so use a roundabout getelementsbyname test support.getbyid = assert( function( el ) { docelem.appendchild( el ).id = expando; return !document.getelementsbyname || !document.getelementsbyname( expando ).length; } ); // id filter and find if ( support.getbyid ) { expr.filter[ "id" ] = function( id ) { var attrid = id.replace( runescape, funescape ); return function( elem ) { return elem.getattribute( "id" ) === attrid; }; }; expr.find[ "id" ] = function( id, context ) { if ( typeof context.getelementbyid !== "undefined" && documentishtml ) { var elem = context.getelementbyid( id ); return elem ? [ elem ] : []; } }; } else { expr.filter[ "id" ] = function( id ) { var attrid = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getattributenode !== "undefined" && elem.getattributenode( "id" ); return node && node.value === attrid; }; }; // support: ie 6 - 7 only // getelementbyid is not reliable as a find shortcut expr.find[ "id" ] = function( id, context ) { if ( typeof context.getelementbyid !== "undefined" && documentishtml ) { var node, i, elems, elem = context.getelementbyid( id ); if ( elem ) { // verify the id attribute node = elem.getattributenode( "id" ); if ( node && node.value === id ) { return [ elem ]; } // fall back on getelementsbyname elems = context.getelementsbyname( id ); i = 0; while ( ( elem = elems[ i++ ] ) ) { node = elem.getattributenode( "id" ); if ( node && node.value === id ) { return [ elem ]; } } } return []; } }; } // tag expr.find[ "tag" ] = support.getelementsbytagname ? function( tag, context ) { if ( typeof context.getelementsbytagname !== "undefined" ) { return context.getelementsbytagname( tag ); // documentfragment nodes don't have gebtn } else if ( support.qsa ) { return context.queryselectorall( tag ); } } : function( tag, context ) { var elem, tmp = [], i = 0, // by happy coincidence, a (broken) gebtn appears on documentfragment nodes too results = context.getelementsbytagname( tag ); // filter out possible comments if ( tag === "*" ) { while ( ( elem = results[ i++ ] ) ) { if ( elem.nodetype === 1 ) { tmp.push( elem ); } } return tmp; } return results; }; // class expr.find[ "class" ] = support.getelementsbyclassname && function( classname, context ) { if ( typeof context.getelementsbyclassname !== "undefined" && documentishtml ) { return context.getelementsbyclassname( classname ); } }; /* qsa/matchesselector ---------------------------------------------------------------------- */ // qsa and matchesselector support // matchesselector(:active) reports false when true (ie9/opera 11.5) rbuggymatches = []; // qsa(:focus) reports false when true (chrome 21) // we allow this because of a bug in ie8/9 that throws an error // whenever `document.activeelement` is accessed on an iframe // so, we allow :focus to pass through qsa all the time to avoid the ie error // see https://bugs.jquery.com/ticket/13378 rbuggyqsa = []; if ( ( support.qsa = rnative.test( document.queryselectorall ) ) ) { // build qsa regex // regex strategy adopted from diego perini assert( function( el ) { var input; // select is set to empty string on purpose // this is to test ie's treatment of not explicitly // setting a boolean content attribute, // since its presence should be enough // https://bugs.jquery.com/ticket/12359 docelem.appendchild( el ).innerhtml = "" + ""; // support: ie8, opera 11-12.16 // nothing should be selected when empty strings follow ^= or $= or *= // the test attribute must be unknown in opera but "safe" for winrt // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section if ( el.queryselectorall( "[msallowcapture^='']" ).length ) { rbuggyqsa.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } // support: ie8 // boolean attributes and "value" are not treated correctly if ( !el.queryselectorall( "[selected]" ).length ) { rbuggyqsa.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } // support: chrome<29, android<4.4, safari<7.0+, ios<7.0+, phantomjs<1.9.8+ if ( !el.queryselectorall( "[id~=" + expando + "-]" ).length ) { rbuggyqsa.push( "~=" ); } // support: ie 11+, edge 15 - 18+ // ie 11/edge don't find elements on a `[name='']` query in some cases. // adding a temporary attribute to the document before the selection works // around the issue. // interestingly, ie 10 & older don't seem to have the issue. input = document.createelement( "input" ); input.setattribute( "name", "" ); el.appendchild( input ); if ( !el.queryselectorall( "[name='']" ).length ) { rbuggyqsa.push( "\\[" + whitespace + "*name" + whitespace + "*=" + whitespace + "*(?:''|\"\")" ); } // webkit/opera - :checked should return selected option elements // http://www.w3.org/tr/2011/rec-css3-selectors-20110929/#checked // ie8 throws error here and will not see later tests if ( !el.queryselectorall( ":checked" ).length ) { rbuggyqsa.push( ":checked" ); } // support: safari 8+, ios 8+ // https://bugs.webkit.org/show_bug.cgi?id=136851 // in-page `selector#id sibling-combinator selector` fails if ( !el.queryselectorall( "a#" + expando + "+*" ).length ) { rbuggyqsa.push( ".#.+[+~]" ); } // support: firefox <=3.6 - 5 only // old firefox doesn't throw on a badly-escaped identifier. el.queryselectorall( "\\\f" ); rbuggyqsa.push( "[\\r\\n\\f]" ); } ); assert( function( el ) { el.innerhtml = "" + ""; // support: windows 8 native apps // the type and name attributes are restricted during .innerhtml assignment var input = document.createelement( "input" ); input.setattribute( "type", "hidden" ); el.appendchild( input ).setattribute( "name", "d" ); // support: ie8 // enforce case-sensitivity of name attribute if ( el.queryselectorall( "[name=d]" ).length ) { rbuggyqsa.push( "name" + whitespace + "*[*^$|!~]?=" ); } // ff 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // ie8 throws error here and will not see later tests if ( el.queryselectorall( ":enabled" ).length !== 2 ) { rbuggyqsa.push( ":enabled", ":disabled" ); } // support: ie9-11+ // ie's :disabled selector does not pick up the children of disabled fieldsets docelem.appendchild( el ).disabled = true; if ( el.queryselectorall( ":disabled" ).length !== 2 ) { rbuggyqsa.push( ":enabled", ":disabled" ); } // support: opera 10 - 11 only // opera 10-11 does not throw on post-comma invalid pseudos el.queryselectorall( "*,:x" ); rbuggyqsa.push( ",.*:" ); } ); } if ( ( support.matchesselector = rnative.test( ( matches = docelem.matches || docelem.webkitmatchesselector || docelem.mozmatchesselector || docelem.omatchesselector || docelem.msmatchesselector ) ) ) ) { assert( function( el ) { // check to see if it's possible to do matchesselector // on a disconnected node (ie 9) support.disconnectedmatch = matches.call( el, "*" ); // this should fail with an exception // gecko does not error, returns false instead matches.call( el, "[s!='']:x" ); rbuggymatches.push( "!=", pseudos ); } ); } if ( !support.csssupportsselector ) { // support: chrome 105+, safari 15.4+ // `:has()` uses a forgiving selector list as an argument so our regular // `try-catch` mechanism fails to catch `:has()` with arguments not supported // natively like `:has(:contains("foo"))`. where supported & spec-compliant, // we now use `css.supports("selector(:is(selector_to_be_tested))")`, but // outside that we mark `:has` as buggy. rbuggyqsa.push( ":has" ); } rbuggyqsa = rbuggyqsa.length && new regexp( rbuggyqsa.join( "|" ) ); rbuggymatches = rbuggymatches.length && new regexp( rbuggymatches.join( "|" ) ); /* contains ---------------------------------------------------------------------- */ hascompare = rnative.test( docelem.comparedocumentposition ); // element contains another // purposefully self-exclusive // as in, an element does not contain itself contains = hascompare || rnative.test( docelem.contains ) ? function( a, b ) { // support: ie <9 only // ie doesn't have `contains` on `document` so we need to check for // `documentelement` presence. // we need to fall back to `a` when `documentelement` is missing // as `ownerdocument` of elements within `