Make WordPress Core

Ticket #37110: 37110.diff

File 37110.diff, 398.9 KB (added by adamsilverstein, 7 years ago)
  • src/wp-includes/js/jquery/jquery-migrate.js

    diff --git src/wp-includes/js/jquery/jquery-migrate.js src/wp-includes/js/jquery/jquery-migrate.js
    index 89437ebed9..05b1a803c2 100644
     
    11/*!
    2  * jQuery Migrate - v1.4.1 - 2016-05-19
     2 * jQuery Migrate - v3.0.0 - 2016-06-09
    33 * Copyright jQuery Foundation and other contributors
    44 */
    5 (function( jQuery, window, undefined ) {
    6 // See http://bugs.jquery.com/ticket/13335
    7 // "use strict";
     5(function( jQuery, window ) {
     6"use strict";
    87
    98
    10 jQuery.migrateVersion = "1.4.1";
     9jQuery.migrateVersion = "3.0.0";
    1110
    1211
    13 var warnedAbout = {};
     12( function() {
    1413
    15 // List of warnings already given; public read only
    16 jQuery.migrateWarnings = [];
     14        // Support: IE9 only
     15        // IE9 only creates console object when dev tools are first opened
     16        // Also, avoid Function#bind here to simplify PhantomJS usage
     17        var log = window.console && window.console.log &&
     18                        function() { window.console.log.apply( window.console, arguments ); },
     19                rbadVersions = /^[12]\./;
     20
     21        if ( !log ) {
     22                return;
     23        }
    1724
    18 // Set to true to prevent console output; migrateWarnings still maintained
    19 // jQuery.migrateMute = false;
     25        // Need jQuery 3.0.0+ and no older Migrate loaded
     26        if ( !jQuery || rbadVersions.test( jQuery.fn.jquery ) ) {
     27                log( "JQMIGRATE: jQuery 3.0.0+ REQUIRED" );
     28        }
     29        if ( jQuery.migrateWarnings ) {
     30                log( "JQMIGRATE: Migrate plugin loaded multiple times" );
     31        }
    2032
    21 // Show a message on the console so devs know we're active
    22 if ( window.console && window.console.log ) {
    23         window.console.log( "JQMIGRATE: Migrate is installed" +
     33        // Show a message on the console so devs know we're active
     34        log( "JQMIGRATE: Migrate is installed" +
    2435                ( jQuery.migrateMute ? "" : " with logging active" ) +
    2536                ", version " + jQuery.migrateVersion );
    26 }
     37
     38} )();
     39
     40var warnedAbout = {};
     41
     42// List of warnings already given; public read only
     43jQuery.migrateWarnings = [];
    2744
    2845// Set to false to disable traces that appear with warnings
    2946if ( jQuery.migrateTrace === undefined ) {
    jQuery.migrateReset = function() { 
    3653        jQuery.migrateWarnings.length = 0;
    3754};
    3855
    39 function migrateWarn( msg) {
     56function migrateWarn( msg ) {
    4057        var console = window.console;
    4158        if ( !warnedAbout[ msg ] ) {
    4259                warnedAbout[ msg ] = true;
    function migrateWarn( msg) { 
    5168}
    5269
    5370function migrateWarnProp( obj, prop, value, msg ) {
    54         if ( Object.defineProperty ) {
    55                 // On ES5 browsers (non-oldIE), warn if the code tries to get prop;
    56                 // allow property to be overwritten in case some other plugin wants it
    57                 try {
    58                         Object.defineProperty( obj, prop, {
    59                                 configurable: true,
    60                                 enumerable: true,
    61                                 get: function() {
    62                                         migrateWarn( msg );
    63                                         return value;
    64                                 },
    65                                 set: function( newValue ) {
    66                                         migrateWarn( msg );
    67                                         value = newValue;
    68                                 }
    69                         });
    70                         return;
    71                 } catch( err ) {
    72                         // IE8 is a dope about Object.defineProperty, can't warn there
     71        Object.defineProperty( obj, prop, {
     72                configurable: true,
     73                enumerable: true,
     74                get: function() {
     75                        migrateWarn( msg );
     76                        return value;
    7377                }
    74         }
    75 
    76         // Non-ES5 (or broken) browser; just set the property
    77         jQuery._definePropertyBroken = true;
    78         obj[ prop ] = value;
     78        } );
    7979}
    8080
    8181if ( document.compatMode === "BackCompat" ) {
    82         // jQuery has never supported or tested Quirks Mode
     82
     83        // JQuery has never supported or tested Quirks Mode
    8384        migrateWarn( "jQuery is not compatible with Quirks Mode" );
    8485}
    8586
    8687
    87 var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
    88         oldAttr = jQuery.attr,
    89         valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
    90                 function() { return null; },
    91         valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
    92                 function() { return undefined; },
    93         rnoType = /^(?:input|button)$/i,
    94         rnoAttrNodeType = /^[238]$/,
    95         rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
    96         ruseDefault = /^(?:checked|selected)$/i;
    97 
    98 // jQuery.attrFn
    99 migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );
    100 
    101 jQuery.attr = function( elem, name, value, pass ) {
    102         var lowerName = name.toLowerCase(),
    103                 nType = elem && elem.nodeType;
    104 
    105         if ( pass ) {
    106                 // Since pass is used internally, we only warn for new jQuery
    107                 // versions where there isn't a pass arg in the formal params
    108                 if ( oldAttr.length < 4 ) {
    109                         migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
    110                 }
    111                 if ( elem && !rnoAttrNodeType.test( nType ) &&
    112                         (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
    113                         return jQuery( elem )[ name ]( value );
    114                 }
    115         }
    116 
    117         // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
    118         // for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
    119         if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
    120                 migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
    121         }
    122 
    123         // Restore boolHook for boolean property/attribute synchronization
    124         if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
    125                 jQuery.attrHooks[ lowerName ] = {
    126                         get: function( elem, name ) {
    127                                 // Align boolean attributes with corresponding properties
    128                                 // Fall back to attribute presence where some booleans are not supported
    129                                 var attrNode,
    130                                         property = jQuery.prop( elem, name );
    131                                 return property === true || typeof property !== "boolean" &&
    132                                         ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
    133 
    134                                         name.toLowerCase() :
    135                                         undefined;
    136                         },
    137                         set: function( elem, value, name ) {
    138                                 var propName;
    139                                 if ( value === false ) {
    140                                         // Remove boolean attributes when set to false
    141                                         jQuery.removeAttr( elem, name );
    142                                 } else {
    143                                         // value is true since we know at this point it's type boolean and not false
    144                                         // Set boolean attributes to the same name and set the DOM property
    145                                         propName = jQuery.propFix[ name ] || name;
    146                                         if ( propName in elem ) {
    147                                                 // Only set the IDL specifically if it already exists on the element
    148                                                 elem[ propName ] = true;
    149                                         }
    150 
    151                                         elem.setAttribute( name, name.toLowerCase() );
    152                                 }
    153                                 return name;
    154                         }
    155                 };
    156 
    157                 // Warn only for attributes that can remain distinct from their properties post-1.9
    158                 if ( ruseDefault.test( lowerName ) ) {
    159                         migrateWarn( "jQuery.fn.attr('" + lowerName + "') might use property instead of attribute" );
    160                 }
    161         }
    162 
    163         return oldAttr.call( jQuery, elem, name, value );
    164 };
    165 
    166 // attrHooks: value
    167 jQuery.attrHooks.value = {
    168         get: function( elem, name ) {
    169                 var nodeName = ( elem.nodeName || "" ).toLowerCase();
    170                 if ( nodeName === "button" ) {
    171                         return valueAttrGet.apply( this, arguments );
    172                 }
    173                 if ( nodeName !== "input" && nodeName !== "option" ) {
    174                         migrateWarn("jQuery.fn.attr('value') no longer gets properties");
    175                 }
    176                 return name in elem ?
    177                         elem.value :
    178                         null;
    179         },
    180         set: function( elem, value ) {
    181                 var nodeName = ( elem.nodeName || "" ).toLowerCase();
    182                 if ( nodeName === "button" ) {
    183                         return valueAttrSet.apply( this, arguments );
    184                 }
    185                 if ( nodeName !== "input" && nodeName !== "option" ) {
    186                         migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
    187                 }
    188                 // Does not return so that setAttribute is also used
    189                 elem.value = value;
    190         }
    191 };
    192 
    193 
    194 var matched, browser,
    195         oldInit = jQuery.fn.init,
     88var oldInit = jQuery.fn.init,
     89        oldIsNumeric = jQuery.isNumeric,
    19690        oldFind = jQuery.find,
    197         oldParseJSON = jQuery.parseJSON,
    198         rspaceAngle = /^\s*</,
    19991        rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
    200         rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,
    201         // Note: XSS check is done below after string is trimmed
    202         rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/;
    203 
    204 // $(html) "looks like html" rule change
    205 jQuery.fn.init = function( selector, context, rootjQuery ) {
    206         var match, ret;
    207 
    208         if ( selector && typeof selector === "string" ) {
    209                 if ( !jQuery.isPlainObject( context ) &&
    210                                 (match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
    211 
    212                         // This is an HTML string according to the "old" rules; is it still?
    213                         if ( !rspaceAngle.test( selector ) ) {
    214                                 migrateWarn("$(html) HTML strings must start with '<' character");
    215                         }
    216                         if ( match[ 3 ] ) {
    217                                 migrateWarn("$(html) HTML text after last tag is ignored");
    218                         }
    219 
    220                         // Consistently reject any HTML-like string starting with a hash (gh-9521)
    221                         // Note that this may break jQuery 1.6.x code that otherwise would work.
    222                         if ( match[ 0 ].charAt( 0 ) === "#" ) {
    223                                 migrateWarn("HTML string cannot start with a '#' character");
    224                                 jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
    225                         }
    226 
    227                         // Now process using loose rules; let pre-1.8 play too
    228                         // Is this a jQuery context? parseHTML expects a DOM element (#178)
    229                         if ( context && context.context && context.context.nodeType ) {
    230                                 context = context.context;
    231                         }
    232 
    233                         if ( jQuery.parseHTML ) {
    234                                 return oldInit.call( this,
    235                                                 jQuery.parseHTML( match[ 2 ], context && context.ownerDocument ||
    236                                                         context || document, true ), context, rootjQuery );
    237                         }
    238                 }
    239         }
     92        rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g;
    24093
    241         ret = oldInit.apply( this, arguments );
     94jQuery.fn.init = function( arg1 ) {
     95        var args = Array.prototype.slice.call( arguments );
    24296
    243         // Fill in selector and context properties so .live() works
    244         if ( selector && selector.selector !== undefined ) {
    245                 // A jQuery object, copy its properties
    246                 ret.selector = selector.selector;
    247                 ret.context = selector.context;
     97        if ( typeof arg1 === "string" && arg1 === "#" ) {
    24898
    249         } else {
    250                 ret.selector = typeof selector === "string" ? selector : "";
    251                 if ( selector ) {
    252                         ret.context = selector.nodeType? selector : context || document;
    253                 }
     99                // JQuery( "#" ) is a bogus ID selector, but it returned an empty set before jQuery 3.0
     100                migrateWarn( "jQuery( '#' ) is not a valid selector" );
     101                args[ 0 ] = [];
    254102        }
    255103
    256         return ret;
     104        return oldInit.apply( this, args );
    257105};
    258106jQuery.fn.init.prototype = jQuery.fn;
    259107
    for ( findProp in oldFind ) { 
    298146        }
    299147}
    300148
    301 // Let $.parseJSON(falsy_value) return null
    302 jQuery.parseJSON = function( json ) {
    303         if ( !json ) {
    304                 migrateWarn("jQuery.parseJSON requires a valid JSON string");
    305                 return null;
    306         }
    307         return oldParseJSON.apply( this, arguments );
     149// The number of elements contained in the matched element set
     150jQuery.fn.size = function() {
     151        migrateWarn( "jQuery.fn.size() is deprecated; use the .length property" );
     152        return this.length;
    308153};
    309154
    310 jQuery.uaMatch = function( ua ) {
    311         ua = ua.toLowerCase();
    312 
    313         var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
    314                 /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
    315                 /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
    316                 /(msie) ([\w.]+)/.exec( ua ) ||
    317                 ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
    318                 [];
    319 
    320         return {
    321                 browser: match[ 1 ] || "",
    322                 version: match[ 2 ] || "0"
    323         };
     155jQuery.parseJSON = function() {
     156        migrateWarn( "jQuery.parseJSON is deprecated; use JSON.parse" );
     157        return JSON.parse.apply( null, arguments );
    324158};
    325159
    326 // Don't clobber any existing jQuery.browser in case it's different
    327 if ( !jQuery.browser ) {
    328         matched = jQuery.uaMatch( navigator.userAgent );
    329         browser = {};
     160jQuery.isNumeric = function( val ) {
    330161
    331         if ( matched.browser ) {
    332                 browser[ matched.browser ] = true;
    333                 browser.version = matched.version;
     162        // The jQuery 2.2.3 implementation of isNumeric
     163        function isNumeric2( obj ) {
     164                var realStringObj = obj && obj.toString();
     165                return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
    334166        }
    335167
    336         // Chrome is Webkit, but Webkit is also Safari.
    337         if ( browser.chrome ) {
    338                 browser.webkit = true;
    339         } else if ( browser.webkit ) {
    340                 browser.safari = true;
     168        var newValue = oldIsNumeric( val ),
     169                oldValue = isNumeric2( val );
     170
     171        if ( newValue !== oldValue ) {
     172                migrateWarn( "jQuery.isNumeric() should not be called on constructed objects" );
    341173        }
    342174
    343         jQuery.browser = browser;
    344 }
     175        return oldValue;
     176};
     177
     178migrateWarnProp( jQuery, "unique", jQuery.uniqueSort,
     179        "jQuery.unique is deprecated, use jQuery.uniqueSort" );
    345180
    346 // Warn if the code tries to get jQuery.browser
    347 migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
     181// Now jQuery.expr.pseudos is the standard incantation
     182migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos,
     183        "jQuery.expr.filters is now jQuery.expr.pseudos" );
     184migrateWarnProp( jQuery.expr, ":", jQuery.expr.pseudos,
     185        "jQuery.expr[\":\"] is now jQuery.expr.pseudos" );
    348186
    349 // jQuery.boxModel deprecated in 1.3, jQuery.support.boxModel deprecated in 1.7
    350 jQuery.boxModel = jQuery.support.boxModel = (document.compatMode === "CSS1Compat");
    351 migrateWarnProp( jQuery, "boxModel", jQuery.boxModel, "jQuery.boxModel is deprecated" );
    352 migrateWarnProp( jQuery.support, "boxModel", jQuery.support.boxModel, "jQuery.support.boxModel is deprecated" );
    353187
    354 jQuery.sub = function() {
    355         function jQuerySub( selector, context ) {
    356                 return new jQuerySub.fn.init( selector, context );
     188var oldAjax = jQuery.ajax;
     189
     190jQuery.ajax = function( ) {
     191        var jQXHR = oldAjax.apply( this, arguments );
     192
     193        // Be sure we got a jQXHR (e.g., not sync)
     194        if ( jQXHR.promise ) {
     195                migrateWarnProp( jQXHR, "success", jQXHR.done,
     196                        "jQXHR.success is deprecated and removed" );
     197                migrateWarnProp( jQXHR, "error", jQXHR.fail,
     198                        "jQXHR.error is deprecated and removed" );
     199                migrateWarnProp( jQXHR, "complete", jQXHR.always,
     200                        "jQXHR.complete is deprecated and removed" );
    357201        }
    358         jQuery.extend( true, jQuerySub, this );
    359         jQuerySub.superclass = this;
    360         jQuerySub.fn = jQuerySub.prototype = this();
    361         jQuerySub.fn.constructor = jQuerySub;
    362         jQuerySub.sub = this.sub;
    363         jQuerySub.fn.init = function init( selector, context ) {
    364                 var instance = jQuery.fn.init.call( this, selector, context, rootjQuerySub );
    365                 return instance instanceof jQuerySub ?
    366                         instance :
    367                         jQuerySub( instance );
    368         };
    369         jQuerySub.fn.init.prototype = jQuerySub.fn;
    370         var rootjQuerySub = jQuerySub(document);
    371         migrateWarn( "jQuery.sub() is deprecated" );
    372         return jQuerySub;
     202
     203        return jQXHR;
    373204};
    374205
    375 // The number of elements contained in the matched element set
    376 jQuery.fn.size = function() {
    377         migrateWarn( "jQuery.fn.size() is deprecated; use the .length property" );
    378         return this.length;
     206
     207var oldRemoveAttr = jQuery.fn.removeAttr,
     208        oldToggleClass = jQuery.fn.toggleClass,
     209        rmatchNonSpace = /\S+/g;
     210
     211jQuery.fn.removeAttr = function( name ) {
     212        var self = this;
     213
     214        jQuery.each( name.match( rmatchNonSpace ), function( i, attr ) {
     215                if ( jQuery.expr.match.bool.test( attr ) ) {
     216                        migrateWarn( "jQuery.fn.removeAttr no longer sets boolean properties: " + attr );
     217                        self.prop( attr, false );
     218                }
     219        } );
     220
     221        return oldRemoveAttr.apply( this, arguments );
     222};
     223
     224jQuery.fn.toggleClass = function( state ) {
     225
     226        // Only deprecating no-args or single boolean arg
     227        if ( state !== undefined && typeof state !== "boolean" ) {
     228                return oldToggleClass.apply( this, arguments );
     229        }
     230
     231        migrateWarn( "jQuery.fn.toggleClass( boolean ) is deprecated" );
     232
     233        // Toggle entire class name of each element
     234        return this.each( function() {
     235                var className = this.getAttribute && this.getAttribute( "class" ) || "";
     236
     237                if ( className ) {
     238                        jQuery.data( this, "__className__", className );
     239                }
     240
     241                // If the element has a class name or if we're passed `false`,
     242                // then remove the whole classname (if there was one, the above saved it).
     243                // Otherwise bring back whatever was previously saved (if anything),
     244                // falling back to the empty string if nothing was stored.
     245                if ( this.setAttribute ) {
     246                        this.setAttribute( "class",
     247                                className || state === false ?
     248                                "" :
     249                                jQuery.data( this, "__className__" ) || ""
     250                        );
     251                }
     252        } );
    379253};
    380254
    381255
    if ( jQuery.swap ) { 
    396270                                return ret;
    397271                        };
    398272                }
    399         });
     273        } );
    400274}
    401275
    402276jQuery.swap = function( elem, options, callback, args ) {
    jQuery.swap = function( elem, options, callback, args ) { 
    423297        return ret;
    424298};
    425299
     300var oldData = jQuery.data;
    426301
    427 // Ensure that $.ajax gets the new parseJSON defined in core.js
    428 jQuery.ajaxSetup({
    429         converters: {
    430                 "text json": jQuery.parseJSON
    431         }
    432 });
    433 
    434 
    435 var oldFnData = jQuery.fn.data;
    436 
    437 jQuery.fn.data = function( name ) {
    438         var ret, evt,
    439                 elem = this[0];
     302jQuery.data = function( elem, name, value ) {
     303        var curData;
    440304
    441         // Handles 1.7 which has this behavior and 1.8 which doesn't
    442         if ( elem && name === "events" && arguments.length === 1 ) {
    443                 ret = jQuery.data( elem, name );
    444                 evt = jQuery._data( elem, name );
    445                 if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
    446                         migrateWarn("Use of jQuery.fn.data('events') is deprecated");
    447                         return evt;
     305        // If the name is transformed, look for the un-transformed name in the data object
     306        if ( name && name !== jQuery.camelCase( name ) ) {
     307                curData = jQuery.hasData( elem ) && oldData.call( this, elem );
     308                if ( curData && name in curData ) {
     309                        migrateWarn( "jQuery.data() always sets/gets camelCased names: " + name );
     310                        if ( arguments.length > 2 ) {
     311                                curData[ name ] = value;
     312                        }
     313                        return curData[ name ];
    448314                }
    449315        }
    450         return oldFnData.apply( this, arguments );
     316
     317        return oldData.apply( this, arguments );
    451318};
    452319
     320var oldTweenRun = jQuery.Tween.prototype.run;
    453321
    454 var rscriptType = /\/(java|ecma)script/i;
     322jQuery.Tween.prototype.run = function( percent ) {
     323        if ( jQuery.easing[ this.easing ].length > 1 ) {
     324                migrateWarn(
     325                        "easing function " +
     326                        "\"jQuery.easing." + this.easing.toString() +
     327                        "\" should use only first argument"
     328                );
    455329
    456 // Since jQuery.clean is used internally on older versions, we only shim if it's missing
    457 if ( !jQuery.clean ) {
    458         jQuery.clean = function( elems, context, fragment, scripts ) {
    459                 // Set context per 1.8 logic
    460                 context = context || document;
    461                 context = !context.nodeType && context[0] || context;
    462                 context = context.ownerDocument || context;
     330                jQuery.easing[ this.easing ] = jQuery.easing[ this.easing ].bind(
     331                        jQuery.easing,
     332                        percent, this.options.duration * percent, 0, 1, this.options.duration
     333                );
     334        }
    463335
    464                 migrateWarn("jQuery.clean() is deprecated");
     336        oldTweenRun.apply( this, arguments );
     337};
    465338
    466                 var i, elem, handleScript, jsTags,
    467                         ret = [];
     339var oldLoad = jQuery.fn.load,
     340        originalFix = jQuery.event.fix;
    468341
    469                 jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
     342jQuery.event.props = [];
     343jQuery.event.fixHooks = {};
    470344
    471                 // Complex logic lifted directly from jQuery 1.8
    472                 if ( fragment ) {
    473                         // Special handling of each script element
    474                         handleScript = function( elem ) {
    475                                 // Check if we consider it executable
    476                                 if ( !elem.type || rscriptType.test( elem.type ) ) {
    477                                         // Detach the script and store it in the scripts array (if provided) or the fragment
    478                                         // Return truthy to indicate that it has been handled
    479                                         return scripts ?
    480                                                 scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
    481                                                 fragment.appendChild( elem );
    482                                 }
    483                         };
     345jQuery.event.fix = function( originalEvent ) {
     346        var event,
     347                type = originalEvent.type,
     348                fixHook = this.fixHooks[ type ],
     349                props = jQuery.event.props;
    484350
    485                         for ( i = 0; (elem = ret[i]) != null; i++ ) {
    486                                 // Check if we're done after handling an executable script
    487                                 if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
    488                                         // Append to fragment and handle embedded scripts
    489                                         fragment.appendChild( elem );
    490                                         if ( typeof elem.getElementsByTagName !== "undefined" ) {
    491                                                 // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
    492                                                 jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
    493 
    494                                                 // Splice the scripts into ret after their former ancestor and advance our index beyond them
    495                                                 ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
    496                                                 i += jsTags.length;
    497                                         }
    498                                 }
    499                         }
     351        if ( props.length ) {
     352                migrateWarn( "jQuery.event.props are deprecated and removed: " + props.join() );
     353                while ( props.length ) {
     354                        jQuery.event.addProp( props.pop() );
    500355                }
     356        }
    501357
    502                 return ret;
    503         };
    504 }
    505 
    506 var eventAdd = jQuery.event.add,
    507         eventRemove = jQuery.event.remove,
    508         eventTrigger = jQuery.event.trigger,
    509         oldToggle = jQuery.fn.toggle,
    510         oldLive = jQuery.fn.live,
    511         oldDie = jQuery.fn.die,
    512         oldLoad = jQuery.fn.load,
    513         ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
    514         rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
    515         rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
    516         hoverHack = function( events ) {
    517                 if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
    518                         return events;
    519                 }
    520                 if ( rhoverHack.test( events ) ) {
    521                         migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
     358        if ( fixHook && !fixHook._migrated_ ) {
     359                fixHook._migrated_ = true;
     360                migrateWarn( "jQuery.event.fixHooks are deprecated and removed: " + type );
     361                if ( ( props = fixHook.props ) && props.length ) {
     362                        while ( props.length ) {
     363                           jQuery.event.addProp( props.pop() );
     364                        }
    522365                }
    523                 return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
    524         };
    525 
    526 // Event props removed in 1.9, put them back if needed; no practical way to warn them
    527 if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
    528         jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
    529 }
     366        }
    530367
    531 // Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
    532 if ( jQuery.event.dispatch ) {
    533         migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
    534 }
     368        event = originalFix.call( this, originalEvent );
    535369
    536 // Support for 'hover' pseudo-event and ajax event warnings
    537 jQuery.event.add = function( elem, types, handler, data, selector ){
    538         if ( elem !== document && rajaxEvent.test( types ) ) {
    539                 migrateWarn( "AJAX events should be attached to document: " + types );
    540         }
    541         eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
    542 };
    543 jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
    544         eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
     370        return fixHook && fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
    545371};
    546372
    547373jQuery.each( [ "load", "unload", "error" ], function( _, name ) {
    jQuery.each( [ "load", "unload", "error" ], function( _, name ) { 
    561387
    562388                args.splice( 0, 0, name );
    563389                if ( arguments.length ) {
    564                         return this.bind.apply( this, args );
     390                        return this.on.apply( this, args );
    565391                }
    566392
    567393                // Use .triggerHandler here because:
    jQuery.each( [ "load", "unload", "error" ], function( _, name ) { 
    572398                return this;
    573399        };
    574400
    575 });
     401} );
    576402
    577 jQuery.fn.toggle = function( fn, fn2 ) {
     403// Trigger "ready" event only once, on document ready
     404jQuery( function() {
     405        jQuery( document ).triggerHandler( "ready" );
     406} );
    578407
    579         // Don't mess with animation or css toggles
    580         if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
    581                 return oldToggle.apply( this, arguments );
    582         }
    583         migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
    584 
    585         // Save reference to arguments for access in closure
    586         var args = arguments,
    587                 guid = fn.guid || jQuery.guid++,
    588                 i = 0,
    589                 toggler = function( event ) {
    590                         // Figure out which function to execute
    591                         var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
    592                         jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
    593 
    594                         // Make sure that clicks stop
    595                         event.preventDefault();
    596 
    597                         // and execute the function
    598                         return args[ lastToggle ].apply( this, arguments ) || false;
    599                 };
    600 
    601         // link all the functions, so any of them can unbind this click handler
    602         toggler.guid = guid;
    603         while ( i < args.length ) {
    604                 args[ i++ ].guid = guid;
     408jQuery.event.special.ready = {
     409        setup: function() {
     410                if ( this === document ) {
     411                        migrateWarn( "'ready' event is deprecated" );
     412                }
    605413        }
    606 
    607         return this.click( toggler );
    608414};
    609415
    610 jQuery.fn.live = function( types, data, fn ) {
    611         migrateWarn("jQuery.fn.live() is deprecated");
    612         if ( oldLive ) {
    613                 return oldLive.apply( this, arguments );
     416jQuery.fn.extend( {
     417
     418        bind: function( types, data, fn ) {
     419                migrateWarn( "jQuery.fn.bind() is deprecated" );
     420                return this.on( types, null, data, fn );
     421        },
     422        unbind: function( types, fn ) {
     423                migrateWarn( "jQuery.fn.unbind() is deprecated" );
     424                return this.off( types, null, fn );
     425        },
     426        delegate: function( selector, types, data, fn ) {
     427                migrateWarn( "jQuery.fn.delegate() is deprecated" );
     428                return this.on( types, selector, data, fn );
     429        },
     430        undelegate: function( selector, types, fn ) {
     431                migrateWarn( "jQuery.fn.undelegate() is deprecated" );
     432                return arguments.length === 1 ?
     433                        this.off( selector, "**" ) :
     434                        this.off( types, selector || "**", fn );
    614435        }
    615         jQuery( this.context ).on( types, this.selector, data, fn );
    616         return this;
    617 };
     436} );
    618437
    619 jQuery.fn.die = function( types, fn ) {
    620         migrateWarn("jQuery.fn.die() is deprecated");
    621         if ( oldDie ) {
    622                 return oldDie.apply( this, arguments );
     438
     439var oldOffset = jQuery.fn.offset;
     440
     441jQuery.fn.offset = function() {
     442        var docElem,
     443                elem = this[ 0 ],
     444                origin = { top: 0, left: 0 };
     445
     446        if ( !elem || !elem.nodeType ) {
     447                migrateWarn( "jQuery.fn.offset() requires a valid DOM element" );
     448                return origin;
    623449        }
    624         jQuery( this.context ).off( types, this.selector || "**", fn );
    625         return this;
    626 };
    627450
    628 // Turn global events into document-triggered events
    629 jQuery.event.trigger = function( event, data, elem, onlyHandlers  ){
    630         if ( !elem && !rajaxEvent.test( event ) ) {
    631                 migrateWarn( "Global events are undocumented and deprecated" );
     451        docElem = ( elem.ownerDocument || document ).documentElement;
     452        if ( !jQuery.contains( docElem, elem ) ) {
     453                migrateWarn( "jQuery.fn.offset() requires an element connected to a document" );
     454                return origin;
    632455        }
    633         return eventTrigger.call( this,  event, data, elem || document, onlyHandlers  );
     456
     457        return oldOffset.apply( this, arguments );
    634458};
    635 jQuery.each( ajaxEvents.split("|"),
    636         function( _, name ) {
    637                 jQuery.event.special[ name ] = {
    638                         setup: function() {
    639                                 var elem = this;
    640 
    641                                 // The document needs no shimming; must be !== for oldIE
    642                                 if ( elem !== document ) {
    643                                         jQuery.event.add( document, name + "." + jQuery.guid, function() {
    644                                                 jQuery.event.trigger( name, Array.prototype.slice.call( arguments, 1 ), elem, true );
    645                                         });
    646                                         jQuery._data( this, name, jQuery.guid++ );
    647                                 }
    648                                 return false;
    649                         },
    650                         teardown: function() {
    651                                 if ( this !== document ) {
    652                                         jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
    653                                 }
    654                                 return false;
    655                         }
    656                 };
    657         }
    658 );
    659459
    660 jQuery.event.special.ready = {
    661         setup: function() {
    662                 if ( this === document ) {
    663                         migrateWarn( "'ready' event is deprecated" );
    664                 }
     460
     461var oldParam = jQuery.param;
     462
     463jQuery.param = function( data, traditional ) {
     464        var ajaxTraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
     465
     466        if ( traditional === undefined && ajaxTraditional ) {
     467
     468                migrateWarn( "jQuery.param() no longer uses jQuery.ajaxSettings.traditional" );
     469                traditional = ajaxTraditional;
    665470        }
     471
     472        return oldParam.call( this, data, traditional );
    666473};
    667474
    668 var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack,
    669         oldFnFind = jQuery.fn.find;
     475var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
    670476
    671477jQuery.fn.andSelf = function() {
    672         migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
     478        migrateWarn( "jQuery.fn.andSelf() replaced by jQuery.fn.addBack()" );
    673479        return oldSelf.apply( this, arguments );
    674480};
    675481
    676 jQuery.fn.find = function( selector ) {
    677         var ret = oldFnFind.apply( this, arguments );
    678         ret.context = this.context;
    679         ret.selector = this.selector ? this.selector + " " + selector : selector;
    680         return ret;
    681 };
    682 
    683482
    684 // jQuery 1.6 did not support Callbacks, do not warn there
    685 if ( jQuery.Callbacks ) {
    686 
    687         var oldDeferred = jQuery.Deferred,
    688                 tuples = [
    689                         // action, add listener, callbacks, .then handlers, final state
    690                         [ "resolve", "done", jQuery.Callbacks("once memory"),
    691                                 jQuery.Callbacks("once memory"), "resolved" ],
    692                         [ "reject", "fail", jQuery.Callbacks("once memory"),
    693                                 jQuery.Callbacks("once memory"), "rejected" ],
    694                         [ "notify", "progress", jQuery.Callbacks("memory"),
    695                                 jQuery.Callbacks("memory") ]
    696                 ];
    697 
    698         jQuery.Deferred = function( func ) {
    699                 var deferred = oldDeferred(),
    700                         promise = deferred.promise();
    701 
    702                 deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress */ ) {
    703                         var fns = arguments;
    704 
    705                         migrateWarn( "deferred.pipe() is deprecated" );
    706 
    707                         return jQuery.Deferred(function( newDefer ) {
    708                                 jQuery.each( tuples, function( i, tuple ) {
    709                                         var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
    710                                         // deferred.done(function() { bind to newDefer or newDefer.resolve })
    711                                         // deferred.fail(function() { bind to newDefer or newDefer.reject })
    712                                         // deferred.progress(function() { bind to newDefer or newDefer.notify })
    713                                         deferred[ tuple[1] ](function() {
    714                                                 var returned = fn && fn.apply( this, arguments );
    715                                                 if ( returned && jQuery.isFunction( returned.promise ) ) {
    716                                                         returned.promise()
    717                                                                 .done( newDefer.resolve )
    718                                                                 .fail( newDefer.reject )
    719                                                                 .progress( newDefer.notify );
    720                                                 } else {
    721                                                         newDefer[ tuple[ 0 ] + "With" ](
    722                                                                 this === promise ? newDefer.promise() : this,
    723                                                                 fn ? [ returned ] : arguments
    724                                                         );
    725                                                 }
    726                                         });
    727                                 });
    728                                 fns = null;
    729                         }).promise();
    730 
    731                 };
    732 
    733                 deferred.isResolved = function() {
    734                         migrateWarn( "deferred.isResolved is deprecated" );
    735                         return deferred.state() === "resolved";
    736                 };
    737 
    738                 deferred.isRejected = function() {
    739                         migrateWarn( "deferred.isRejected is deprecated" );
    740                         return deferred.state() === "rejected";
    741                 };
    742 
    743                 if ( func ) {
    744                         func.call( deferred, deferred );
    745                 }
     483var oldDeferred = jQuery.Deferred,
     484        tuples = [
     485
     486                // Action, add listener, callbacks, .then handlers, final state
     487                [ "resolve", "done", jQuery.Callbacks( "once memory" ),
     488                        jQuery.Callbacks( "once memory" ), "resolved" ],
     489                [ "reject", "fail", jQuery.Callbacks( "once memory" ),
     490                        jQuery.Callbacks( "once memory" ), "rejected" ],
     491                [ "notify", "progress", jQuery.Callbacks( "memory" ),
     492                        jQuery.Callbacks( "memory" ) ]
     493        ];
     494
     495jQuery.Deferred = function( func ) {
     496        var deferred = oldDeferred(),
     497                promise = deferred.promise();
     498
     499        deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress */ ) {
     500                var fns = arguments;
     501
     502                migrateWarn( "deferred.pipe() is deprecated" );
     503
     504                return jQuery.Deferred( function( newDefer ) {
     505                        jQuery.each( tuples, function( i, tuple ) {
     506                                var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
     507
     508                                // Deferred.done(function() { bind to newDefer or newDefer.resolve })
     509                                // deferred.fail(function() { bind to newDefer or newDefer.reject })
     510                                // deferred.progress(function() { bind to newDefer or newDefer.notify })
     511                                deferred[ tuple[ 1 ] ]( function() {
     512                                        var returned = fn && fn.apply( this, arguments );
     513                                        if ( returned && jQuery.isFunction( returned.promise ) ) {
     514                                                returned.promise()
     515                                                        .done( newDefer.resolve )
     516                                                        .fail( newDefer.reject )
     517                                                        .progress( newDefer.notify );
     518                                        } else {
     519                                                newDefer[ tuple[ 0 ] + "With" ](
     520                                                        this === promise ? newDefer.promise() : this,
     521                                                        fn ? [ returned ] : arguments
     522                                                );
     523                                        }
     524                                } );
     525                        } );
     526                        fns = null;
     527                } ).promise();
    746528
    747                 return deferred;
    748529        };
    749530
    750 }
     531        if ( func ) {
     532                func.call( deferred, deferred );
     533        }
     534
     535        return deferred;
     536};
     537
     538
    751539
    752540})( jQuery, window );
  • src/wp-includes/js/jquery/jquery.js

    diff --git src/wp-includes/js/jquery/jquery.js src/wp-includes/js/jquery/jquery.js
    index 292c720a4e..d2d8ca4790 100644
     
    1 /*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */
    2 !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=R.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0;
    3 }return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}}),function(){var a;l.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,e;return c=d.getElementsByTagName("body")[0],c&&c.style?(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(d.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(e),a):void 0}}();var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),V=["Top","Right","Bottom","Left"],W=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function X(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&U.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var Y=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)Y(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/<tbody/i;function ia(a){Z.test(a.type)&&(a.defaultChecked=a.checked)}function ja(a,b,c,d,e){for(var f,g,h,i,j,k,m,o=a.length,p=ca(b),q=[],r=0;o>r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?"<table>"!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ma.test(f)?this.mouseHooks:la.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=g.srcElement||d),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,h.filter?h.filter(a,g):a},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button,h=b.fromElement;return null==a.pageX&&null!=b.clientX&&(e=a.target.ownerDocument||d,f=e.documentElement,c=e.body,a.pageX=b.clientX+(f&&f.scrollLeft||c&&c.scrollLeft||0)-(f&&f.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(f&&f.scrollTop||c&&c.scrollTop||0)-(f&&f.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&h&&(a.relatedTarget=h===a.target?b.toElement:h),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ra()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ra()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=d.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)}:function(a,b,c){var d="on"+b;a.detachEvent&&("undefined"==typeof a[d]&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?pa:qa):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:qa,isPropagationStopped:qa,isImmediatePropagationStopped:qa,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=pa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=pa,a&&!this.isSimulated&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=pa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||n.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submit||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?n.prop(b,"form"):void 0;c&&!n._data(c,"submit")&&(n.event.add(c,"submit._submit",function(a){a._submitBubble=!0}),n._data(c,"submit",!0))})},postDispatch:function(a){a._submitBubble&&(delete a._submitBubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.change||(n.event.special.change={setup:function(){return ka.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._justChanged=!0)}),n.event.add(this,"click._change",function(a){this._justChanged&&!a.isTrigger&&(this._justChanged=!1),n.event.simulate("change",this,a)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;ka.test(b.nodeName)&&!n._data(b,"change")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a)}),n._data(b,"change",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!ka.test(this.nodeName)}}),l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d){return sa(this,a,b,c,d)},one:function(a,b,c,d){return sa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=qa),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ta=/ jQuery\d+="(?:null|\d+)"/g,ua=new RegExp("<(?:"+ba+")[\\s/>]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/<script|<style|<link/i,xa=/checked\s*(?:[^=]|=\s*.checked.)/i,ya=/^true\/(.*)/,za=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ja[0].contentWindow||Ja[0].contentDocument).document,b.write(),b.close(),c=La(a,b),Ja.detach()),Ka[a]=c),c}var Na=/^margin/,Oa=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Pa=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Qa=d.documentElement;!function(){var b,c,e,f,g,h,i=d.createElement("div"),j=d.createElement("div");if(j.style){j.style.cssText="float:left;opacity:.5",l.opacity="0.5"===j.style.opacity,l.cssFloat=!!j.style.cssFloat,j.style.backgroundClip="content-box",j.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===j.style.backgroundClip,i=d.createElement("div"),i.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",j.innerHTML="",i.appendChild(j),l.boxSizing=""===j.style.boxSizing||""===j.style.MozBoxSizing||""===j.style.WebkitBoxSizing,n.extend(l,{reliableHiddenOffsets:function(){return null==b&&k(),f},boxSizingReliable:function(){return null==b&&k(),e},pixelMarginRight:function(){return null==b&&k(),c},pixelPosition:function(){return null==b&&k(),b},reliableMarginRight:function(){return null==b&&k(),g},reliableMarginLeft:function(){return null==b&&k(),h}});function k(){var k,l,m=d.documentElement;m.appendChild(i),j.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",b=e=h=!1,c=g=!0,a.getComputedStyle&&(l=a.getComputedStyle(j),b="1%"!==(l||{}).top,h="2px"===(l||{}).marginLeft,e="4px"===(l||{width:"4px"}).width,j.style.marginRight="50%",c="4px"===(l||{marginRight:"4px"}).marginRight,k=j.appendChild(d.createElement("div")),k.style.cssText=j.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",k.style.marginRight=k.style.width="0",j.style.width="1px",g=!parseFloat((a.getComputedStyle(k)||{}).marginRight),j.removeChild(k)),j.style.display="none",f=0===j.getClientRects().length,f&&(j.style.display="",j.innerHTML="<table><tr><td></td><td>t</td></tr></table>",j.childNodes[0].style.borderCollapse="separate",k=j.getElementsByTagName("td"),k[0].style.cssText="margin:0;border:0;padding:0;display:none",f=0===k[0].offsetHeight,f&&(k[0].style.display="",k[1].style.display="none",f=0===k[0].offsetHeight)),m.removeChild(i)}}}();var Ra,Sa,Ta=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ra=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Oa.test(g)&&Na.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0===g?g:g+""}):Qa.currentStyle&&(Ra=function(a){return a.currentStyle},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Oa.test(g)&&!Ta.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Ua(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Va=/alpha\([^)]*\)/i,Wa=/opacity\s*=\s*([^)]*)/i,Xa=/^(none|table(?!-c[ea]).+)/,Ya=new RegExp("^("+T+")(.*)$","i"),Za={position:"absolute",visibility:"hidden",display:"block"},$a={letterSpacing:"0",fontWeight:"400"},_a=["Webkit","O","Moz","ms"],ab=d.createElement("div").style;function bb(a){if(a in ab)return a;var b=a.charAt(0).toUpperCase()+a.slice(1),c=_a.length;while(c--)if(a=_a[c]+b,a in ab)return a}function cb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&W(d)&&(f[g]=n._data(d,"olddisplay",Ma(d.nodeName)))):(e=W(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function db(a,b,c){var d=Ya.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function eb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+V[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+V[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+V[f]+"Width",!0,e))):(g+=n.css(a,"padding"+V[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+V[f]+"Width",!0,e)));return g}function fb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ra(a),g=l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Sa(a,b,f),(0>e||null==e)&&(e=a.style[b]),Oa.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+eb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Sa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=U.exec(c))&&e[1]&&(c=X(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Sa(a,b,d)),"normal"===f&&b in $a&&(f=$a[b]),""===c||c?(e=parseFloat(f),c===!0||isFinite(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Xa.test(n.css(a,"display"))&&0===a.offsetWidth?Pa(a,Za,function(){return fb(a,b,d)}):fb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ra(a);return db(a,c,d?eb(a,b,d,l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Wa.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Va,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Va.test(f)?f.replace(Va,e):f+" "+e)}}),n.cssHooks.marginRight=Ua(l.reliableMarginRight,function(a,b){return b?Pa(a,{display:"inline-block"},Sa,[a,"marginRight"]):void 0}),n.cssHooks.marginLeft=Ua(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Sa(a,"marginLeft"))||(n.contains(a.ownerDocument,a)?a.getBoundingClientRect().left-Pa(a,{
    4 marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return Y(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return cb(this,!0)},hide:function(){return cb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){W(this)?n(this).show():n(this).hide()})}});function gb(a,b,c,d,e){return new gb.prototype.init(a,b,c,d,e)}n.Tween=gb,gb.prototype={constructor:gb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=gb.propHooks[this.prop];return a&&a.get?a.get(this):gb.propHooks._default.get(this)},run:function(a){var b,c=gb.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):gb.propHooks._default.set(this),this}},gb.prototype.init.prototype=gb.prototype,gb.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},gb.propHooks.scrollTop=gb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=gb.prototype.init,n.fx.step={};var hb,ib,jb=/^(?:toggle|show|hide)$/,kb=/queueHooks$/;function lb(){return a.setTimeout(function(){hb=void 0}),hb=n.now()}function mb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=V[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function nb(a,b,c){for(var d,e=(qb.tweeners[b]||[]).concat(qb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ob(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&W(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k="none"===j?n._data(a,"olddisplay")||Ma(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==Ma(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],jb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(o))"inline"===("none"===j?Ma(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=nb(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function pb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function qb(a,b,c){var d,e,f=0,g=qb.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=hb||lb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:hb||lb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(pb(k,j.opts.specialEasing);g>f;f++)if(d=qb.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,nb,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(qb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return X(c.elem,a,U.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],qb.tweeners[c]=qb.tweeners[c]||[],qb.tweeners[c].unshift(b)},prefilters:[ob],prefilter:function(a,b){b?qb.prefilters.unshift(a):qb.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(W).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=qb(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&kb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(mb(b,!0),a,d,e)}}),n.each({slideDown:mb("show"),slideUp:mb("hide"),slideToggle:mb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(hb=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),hb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ib||(ib=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(ib),ib=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a,b=d.createElement("input"),c=d.createElement("div"),e=d.createElement("select"),f=e.appendChild(d.createElement("option"));c=d.createElement("div"),c.setAttribute("className","t"),c.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],b.setAttribute("type","checkbox"),c.appendChild(b),a=c.getElementsByTagName("a")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==c.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=f.selected,l.enctype=!!d.createElement("form").enctype,e.disabled=!0,l.optDisabled=!f.disabled,b=d.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value}();var rb=/\r/g,sb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(sb," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>-1)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var tb,ub,vb=n.expr.attrHandle,wb=/^(?:checked|selected)$/i,xb=l.getSetAttribute,yb=l.input;n.fn.extend({attr:function(a,b){return Y(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ub:tb)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?yb&&xb||!wb.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(xb?c:d)}}),ub={set:function(a,b,c){return b===!1?n.removeAttr(a,c):yb&&xb||!wb.test(c)?a.setAttribute(!xb&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=vb[b]||n.find.attr;yb&&xb||!wb.test(b)?vb[b]=function(a,b,d){var e,f;return d||(f=vb[b],vb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,vb[b]=f),e}:vb[b]=function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),yb&&xb||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):tb&&tb.set(a,b,c)}}),xb||(tb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},vb.id=vb.name=vb.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:tb.set},n.attrHooks.contenteditable={set:function(a,b,c){tb.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var zb=/^(?:input|select|textarea|button|object)$/i,Ab=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return Y(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):zb.test(a.nodeName)||Ab.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var Bb=/[\t\r\n\f]/g;function Cb(a){return n.attr(a,"class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,Cb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,Cb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,Cb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=Cb(this),b&&n._data(this,"__className__",b),n.attr(this,"class",b||a===!1?"":n._data(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+Cb(c)+" ").replace(Bb," ").indexOf(b)>-1)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Db=a.location,Eb=n.now(),Fb=/\?/,Gb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(Gb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new a.DOMParser,c=d.parseFromString(b,"text/xml")):(c=new a.ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var Hb=/#.*$/,Ib=/([?&])_=[^&]*/,Jb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Kb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Lb=/^(?:GET|HEAD)$/,Mb=/^\/\//,Nb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ob={},Pb={},Qb="*/".concat("*"),Rb=Db.href,Sb=Nb.exec(Rb.toLowerCase())||[];function Tb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Ub(a,b,c,d){var e={},f=a===Pb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Vb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Wb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Xb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Rb,type:"GET",isLocal:Kb.test(Sb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Qb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Vb(Vb(a,n.ajaxSettings),b):Vb(n.ajaxSettings,a)},ajaxPrefilter:Tb(Ob),ajaxTransport:Tb(Pb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var d,e,f,g,h,i,j,k,l=n.ajaxSetup({},c),m=l.context||l,o=l.context&&(m.nodeType||m.jquery)?n(m):n.event,p=n.Deferred(),q=n.Callbacks("once memory"),r=l.statusCode||{},s={},t={},u=0,v="canceled",w={readyState:0,getResponseHeader:function(a){var b;if(2===u){if(!k){k={};while(b=Jb.exec(g))k[b[1].toLowerCase()]=b[2]}b=k[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===u?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return u||(a=t[c]=t[c]||a,s[a]=b),this},overrideMimeType:function(a){return u||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>u)for(b in a)r[b]=[r[b],a[b]];else w.always(a[w.status]);return this},abort:function(a){var b=a||v;return j&&j.abort(b),y(0,b),this}};if(p.promise(w).complete=q.add,w.success=w.done,w.error=w.fail,l.url=((b||l.url||Rb)+"").replace(Hb,"").replace(Mb,Sb[1]+"//"),l.type=c.method||c.type||l.method||l.type,l.dataTypes=n.trim(l.dataType||"*").toLowerCase().match(G)||[""],null==l.crossDomain&&(d=Nb.exec(l.url.toLowerCase()),l.crossDomain=!(!d||d[1]===Sb[1]&&d[2]===Sb[2]&&(d[3]||("http:"===d[1]?"80":"443"))===(Sb[3]||("http:"===Sb[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=n.param(l.data,l.traditional)),Ub(Ob,l,c,w),2===u)return w;i=n.event&&l.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!Lb.test(l.type),f=l.url,l.hasContent||(l.data&&(f=l.url+=(Fb.test(f)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=Ib.test(f)?f.replace(Ib,"$1_="+Eb++):f+(Fb.test(f)?"&":"?")+"_="+Eb++)),l.ifModified&&(n.lastModified[f]&&w.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&w.setRequestHeader("If-None-Match",n.etag[f])),(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&w.setRequestHeader("Content-Type",l.contentType),w.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+Qb+"; q=0.01":""):l.accepts["*"]);for(e in l.headers)w.setRequestHeader(e,l.headers[e]);if(l.beforeSend&&(l.beforeSend.call(m,w,l)===!1||2===u))return w.abort();v="abort";for(e in{success:1,error:1,complete:1})w[e](l[e]);if(j=Ub(Pb,l,c,w)){if(w.readyState=1,i&&o.trigger("ajaxSend",[w,l]),2===u)return w;l.async&&l.timeout>0&&(h=a.setTimeout(function(){w.abort("timeout")},l.timeout));try{u=1,j.send(s,y)}catch(x){if(!(2>u))throw x;y(-1,x)}}else y(-1,"No Transport");function y(b,c,d,e){var k,s,t,v,x,y=c;2!==u&&(u=2,h&&a.clearTimeout(h),j=void 0,g=e||"",w.readyState=b>0?4:0,k=b>=200&&300>b||304===b,d&&(v=Wb(l,w,d)),v=Xb(l,v,w,k),k?(l.ifModified&&(x=w.getResponseHeader("Last-Modified"),x&&(n.lastModified[f]=x),x=w.getResponseHeader("etag"),x&&(n.etag[f]=x)),204===b||"HEAD"===l.type?y="nocontent":304===b?y="notmodified":(y=v.state,s=v.data,t=v.error,k=!t)):(t=y,!b&&y||(y="error",0>b&&(b=0))),w.status=b,w.statusText=(c||y)+"",k?p.resolveWith(m,[s,y,w]):p.rejectWith(m,[w,y,t]),w.statusCode(r),r=void 0,i&&o.trigger(k?"ajaxSuccess":"ajaxError",[w,l,k?s:t]),q.fireWith(m,[w,y]),i&&(o.trigger("ajaxComplete",[w,l]),--n.active||n.event.trigger("ajaxStop")))}return w},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}});function Yb(a){return a.style&&a.style.display||n.css(a,"display")}function Zb(a){if(!n.contains(a.ownerDocument||d,a))return!0;while(a&&1===a.nodeType){if("none"===Yb(a)||"hidden"===a.type)return!0;a=a.parentNode}return!1}n.expr.filters.hidden=function(a){return l.reliableHiddenOffsets()?a.offsetWidth<=0&&a.offsetHeight<=0&&!a.getClientRects().length:Zb(a)},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var $b=/%20/g,_b=/\[\]$/,ac=/\r?\n/g,bc=/^(?:submit|button|image|reset|file)$/i,cc=/^(?:input|select|textarea|keygen)/i;function dc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||_b.test(a)?d(a,e):dc(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)dc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)dc(c,a[c],b,e);return d.join("&").replace($b,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&cc.test(this.nodeName)&&!bc.test(a)&&(this.checked||!Z.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(ac,"\r\n")}}):{name:b.name,value:c.replace(ac,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return this.isLocal?ic():d.documentMode>8?hc():/^(get|post|head|put|delete|options)$/i.test(this.type)&&hc()||ic()}:hc;var ec=0,fc={},gc=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in fc)fc[a](void 0,!0)}),l.cors=!!gc&&"withCredentials"in gc,gc=l.ajax=!!gc,gc&&n.ajaxTransport(function(b){if(!b.crossDomain||l.cors){var c;return{send:function(d,e){var f,g=b.xhr(),h=++ec;if(g.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(f in b.xhrFields)g[f]=b.xhrFields[f];b.mimeType&&g.overrideMimeType&&g.overrideMimeType(b.mimeType),b.crossDomain||d["X-Requested-With"]||(d["X-Requested-With"]="XMLHttpRequest");for(f in d)void 0!==d[f]&&g.setRequestHeader(f,d[f]+"");g.send(b.hasContent&&b.data||null),c=function(a,d){var f,i,j;if(c&&(d||4===g.readyState))if(delete fc[h],c=void 0,g.onreadystatechange=n.noop,d)4!==g.readyState&&g.abort();else{j={},f=g.status,"string"==typeof g.responseText&&(j.text=g.responseText);try{i=g.statusText}catch(k){i=""}f||!b.isLocal||b.crossDomain?1223===f&&(f=204):f=j.text?200:404}j&&e(f,i,j,g.getAllResponseHeaders())},b.async?4===g.readyState?a.setTimeout(c):g.onreadystatechange=fc[h]=c:c()},abort:function(){c&&c(void 0,!0)}}}});function hc(){try{return new a.XMLHttpRequest}catch(b){}}function ic(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=d.head||n("head")[0]||d.documentElement;return{send:function(e,f){b=d.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||f(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var jc=[],kc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=jc.pop()||n.expando+"_"+Eb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(kc.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&kc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(kc,"$1"+e):b.jsonp!==!1&&(b.url+=(Fb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,jc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||d;var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ja([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var lc=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&lc)return lc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h,a.length)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function mc(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?("undefined"!=typeof e.getBoundingClientRect&&(d=e.getBoundingClientRect()),c=mc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Qa})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return Y(this,function(a,d,e){var f=mc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ua(l.pixelPosition,function(a,c){return c?(c=Sa(a,b),Oa.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({
    5 padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var nc=a.jQuery,oc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=oc),b&&a.jQuery===n&&(a.jQuery=nc),n},b||(a.jQuery=a.$=n),n});
    6 jQuery.noConflict();
     1/*!
     2 * jQuery JavaScript Library v3.2.1
     3 * https://jquery.com/
     4 *
     5 * Includes Sizzle.js
     6 * https://sizzlejs.com/
     7 *
     8 * Copyright JS Foundation and other contributors
     9 * Released under the MIT license
     10 * https://jquery.org/license
     11 *
     12 * Date: 2017-03-20T18:59Z
     13 */
     14( function( global, factory ) {
     15
     16        "use strict";
     17
     18        if ( typeof module === "object" && typeof module.exports === "object" ) {
     19
     20                // For CommonJS and CommonJS-like environments where a proper `window`
     21                // is present, execute the factory and get jQuery.
     22                // For environments that do not have a `window` with a `document`
     23                // (such as Node.js), expose a factory as module.exports.
     24                // This accentuates the need for the creation of a real `window`.
     25                // e.g. var jQuery = require("jquery")(window);
     26                // See ticket #14549 for more info.
     27                module.exports = global.document ?
     28                        factory( global, true ) :
     29                        function( w ) {
     30                                if ( !w.document ) {
     31                                        throw new Error( "jQuery requires a window with a document" );
     32                                }
     33                                return factory( w );
     34                        };
     35        } else {
     36                factory( global );
     37        }
     38
     39// Pass this if window is not defined yet
     40} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
     41
     42// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
     43// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
     44// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
     45// enough that all such attempts are guarded in a try block.
     46"use strict";
     47
     48var arr = [];
     49
     50var document = window.document;
     51
     52var getProto = Object.getPrototypeOf;
     53
     54var slice = arr.slice;
     55
     56var concat = arr.concat;
     57
     58var push = arr.push;
     59
     60var indexOf = arr.indexOf;
     61
     62var class2type = {};
     63
     64var toString = class2type.toString;
     65
     66var hasOwn = class2type.hasOwnProperty;
     67
     68var fnToString = hasOwn.toString;
     69
     70var ObjectFunctionString = fnToString.call( Object );
     71
     72var support = {};
     73
     74
     75
     76        function DOMEval( code, doc ) {
     77                doc = doc || document;
     78
     79                var script = doc.createElement( "script" );
     80
     81                script.text = code;
     82                doc.head.appendChild( script ).parentNode.removeChild( script );
     83        }
     84/* global Symbol */
     85// Defining this global in .eslintrc.json would create a danger of using the global
     86// unguarded in another place, it seems safer to define global only for this module
     87
     88
     89
     90var
     91        version = "3.2.1",
     92
     93        // Define a local copy of jQuery
     94        jQuery = function( selector, context ) {
     95
     96                // The jQuery object is actually just the init constructor 'enhanced'
     97                // Need init if jQuery is called (just allow error to be thrown if not included)
     98                return new jQuery.fn.init( selector, context );
     99        },
     100
     101        // Support: Android <=4.0 only
     102        // Make sure we trim BOM and NBSP
     103        rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
     104
     105        // Matches dashed string for camelizing
     106        rmsPrefix = /^-ms-/,
     107        rdashAlpha = /-([a-z])/g,
     108
     109        // Used by jQuery.camelCase as callback to replace()
     110        fcamelCase = function( all, letter ) {
     111                return letter.toUpperCase();
     112        };
     113
     114jQuery.fn = jQuery.prototype = {
     115
     116        // The current version of jQuery being used
     117        jquery: version,
     118
     119        constructor: jQuery,
     120
     121        // The default length of a jQuery object is 0
     122        length: 0,
     123
     124        toArray: function() {
     125                return slice.call( this );
     126        },
     127
     128        // Get the Nth element in the matched element set OR
     129        // Get the whole matched element set as a clean array
     130        get: function( num ) {
     131
     132                // Return all the elements in a clean array
     133                if ( num == null ) {
     134                        return slice.call( this );
     135                }
     136
     137                // Return just the one element from the set
     138                return num < 0 ? this[ num + this.length ] : this[ num ];
     139        },
     140
     141        // Take an array of elements and push it onto the stack
     142        // (returning the new matched element set)
     143        pushStack: function( elems ) {
     144
     145                // Build a new jQuery matched element set
     146                var ret = jQuery.merge( this.constructor(), elems );
     147
     148                // Add the old object onto the stack (as a reference)
     149                ret.prevObject = this;
     150
     151                // Return the newly-formed element set
     152                return ret;
     153        },
     154
     155        // Execute a callback for every element in the matched set.
     156        each: function( callback ) {
     157                return jQuery.each( this, callback );
     158        },
     159
     160        map: function( callback ) {
     161                return this.pushStack( jQuery.map( this, function( elem, i ) {
     162                        return callback.call( elem, i, elem );
     163                } ) );
     164        },
     165
     166        slice: function() {
     167                return this.pushStack( slice.apply( this, arguments ) );
     168        },
     169
     170        first: function() {
     171                return this.eq( 0 );
     172        },
     173
     174        last: function() {
     175                return this.eq( -1 );
     176        },
     177
     178        eq: function( i ) {
     179                var len = this.length,
     180                        j = +i + ( i < 0 ? len : 0 );
     181                return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
     182        },
     183
     184        end: function() {
     185                return this.prevObject || this.constructor();
     186        },
     187
     188        // For internal use only.
     189        // Behaves like an Array's method, not like a jQuery method.
     190        push: push,
     191        sort: arr.sort,
     192        splice: arr.splice
     193};
     194
     195jQuery.extend = jQuery.fn.extend = function() {
     196        var options, name, src, copy, copyIsArray, clone,
     197                target = arguments[ 0 ] || {},
     198                i = 1,
     199                length = arguments.length,
     200                deep = false;
     201
     202        // Handle a deep copy situation
     203        if ( typeof target === "boolean" ) {
     204                deep = target;
     205
     206                // Skip the boolean and the target
     207                target = arguments[ i ] || {};
     208                i++;
     209        }
     210
     211        // Handle case when target is a string or something (possible in deep copy)
     212        if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
     213                target = {};
     214        }
     215
     216        // Extend jQuery itself if only one argument is passed
     217        if ( i === length ) {
     218                target = this;
     219                i--;
     220        }
     221
     222        for ( ; i < length; i++ ) {
     223
     224                // Only deal with non-null/undefined values
     225                if ( ( options = arguments[ i ] ) != null ) {
     226
     227                        // Extend the base object
     228                        for ( name in options ) {
     229                                src = target[ name ];
     230                                copy = options[ name ];
     231
     232                                // Prevent never-ending loop
     233                                if ( target === copy ) {
     234                                        continue;
     235                                }
     236
     237                                // Recurse if we're merging plain objects or arrays
     238                                if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
     239                                        ( copyIsArray = Array.isArray( copy ) ) ) ) {
     240
     241                                        if ( copyIsArray ) {
     242                                                copyIsArray = false;
     243                                                clone = src && Array.isArray( src ) ? src : [];
     244
     245                                        } else {
     246                                                clone = src && jQuery.isPlainObject( src ) ? src : {};
     247                                        }
     248
     249                                        // Never move original objects, clone them
     250                                        target[ name ] = jQuery.extend( deep, clone, copy );
     251
     252                                // Don't bring in undefined values
     253                                } else if ( copy !== undefined ) {
     254                                        target[ name ] = copy;
     255                                }
     256                        }
     257                }
     258        }
     259
     260        // Return the modified object
     261        return target;
     262};
     263
     264jQuery.extend( {
     265
     266        // Unique for each copy of jQuery on the page
     267        expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
     268
     269        // Assume jQuery is ready without the ready module
     270        isReady: true,
     271
     272        error: function( msg ) {
     273                throw new Error( msg );
     274        },
     275
     276        noop: function() {},
     277
     278        isFunction: function( obj ) {
     279                return jQuery.type( obj ) === "function";
     280        },
     281
     282        isWindow: function( obj ) {
     283                return obj != null && obj === obj.window;
     284        },
     285
     286        isNumeric: function( obj ) {
     287
     288                // As of jQuery 3.0, isNumeric is limited to
     289                // strings and numbers (primitives or objects)
     290                // that can be coerced to finite numbers (gh-2662)
     291                var type = jQuery.type( obj );
     292                return ( type === "number" || type === "string" ) &&
     293
     294                        // parseFloat NaNs numeric-cast false positives ("")
     295                        // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
     296                        // subtraction forces infinities to NaN
     297                        !isNaN( obj - parseFloat( obj ) );
     298        },
     299
     300        isPlainObject: function( obj ) {
     301                var proto, Ctor;
     302
     303                // Detect obvious negatives
     304                // Use toString instead of jQuery.type to catch host objects
     305                if ( !obj || toString.call( obj ) !== "[object Object]" ) {
     306                        return false;
     307                }
     308
     309                proto = getProto( obj );
     310
     311                // Objects with no prototype (e.g., `Object.create( null )`) are plain
     312                if ( !proto ) {
     313                        return true;
     314                }
     315
     316                // Objects with prototype are plain iff they were constructed by a global Object function
     317                Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
     318                return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
     319        },
     320
     321        isEmptyObject: function( obj ) {
     322
     323                /* eslint-disable no-unused-vars */
     324                // See https://github.com/eslint/eslint/issues/6125
     325                var name;
     326
     327                for ( name in obj ) {
     328                        return false;
     329                }
     330                return true;
     331        },
     332
     333        type: function( obj ) {
     334                if ( obj == null ) {
     335                        return obj + "";
     336                }
     337
     338                // Support: Android <=2.3 only (functionish RegExp)
     339                return typeof obj === "object" || typeof obj === "function" ?
     340                        class2type[ toString.call( obj ) ] || "object" :
     341                        typeof obj;
     342        },
     343
     344        // Evaluates a script in a global context
     345        globalEval: function( code ) {
     346                DOMEval( code );
     347        },
     348
     349        // Convert dashed to camelCase; used by the css and data modules
     350        // Support: IE <=9 - 11, Edge 12 - 13
     351        // Microsoft forgot to hump their vendor prefix (#9572)
     352        camelCase: function( string ) {
     353                return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
     354        },
     355
     356        each: function( obj, callback ) {
     357                var length, i = 0;
     358
     359                if ( isArrayLike( obj ) ) {
     360                        length = obj.length;
     361                        for ( ; i < length; i++ ) {
     362                                if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
     363                                        break;
     364                                }
     365                        }
     366                } else {
     367                        for ( i in obj ) {
     368                                if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
     369                                        break;
     370                                }
     371                        }
     372                }
     373
     374                return obj;
     375        },
     376
     377        // Support: Android <=4.0 only
     378        trim: function( text ) {
     379                return text == null ?
     380                        "" :
     381                        ( text + "" ).replace( rtrim, "" );
     382        },
     383
     384        // results is for internal usage only
     385        makeArray: function( arr, results ) {
     386                var ret = results || [];
     387
     388                if ( arr != null ) {
     389                        if ( isArrayLike( Object( arr ) ) ) {
     390                                jQuery.merge( ret,
     391                                        typeof arr === "string" ?
     392                                        [ arr ] : arr
     393                                );
     394                        } else {
     395                                push.call( ret, arr );
     396                        }
     397                }
     398
     399                return ret;
     400        },
     401
     402        inArray: function( elem, arr, i ) {
     403                return arr == null ? -1 : indexOf.call( arr, elem, i );
     404        },
     405
     406        // Support: Android <=4.0 only, PhantomJS 1 only
     407        // push.apply(_, arraylike) throws on ancient WebKit
     408        merge: function( first, second ) {
     409                var len = +second.length,
     410                        j = 0,
     411                        i = first.length;
     412
     413                for ( ; j < len; j++ ) {
     414                        first[ i++ ] = second[ j ];
     415                }
     416
     417                first.length = i;
     418
     419                return first;
     420        },
     421
     422        grep: function( elems, callback, invert ) {
     423                var callbackInverse,
     424                        matches = [],
     425                        i = 0,
     426                        length = elems.length,
     427                        callbackExpect = !invert;
     428
     429                // Go through the array, only saving the items
     430                // that pass the validator function
     431                for ( ; i < length; i++ ) {
     432                        callbackInverse = !callback( elems[ i ], i );
     433                        if ( callbackInverse !== callbackExpect ) {
     434                                matches.push( elems[ i ] );
     435                        }
     436                }
     437
     438                return matches;
     439        },
     440
     441        // arg is for internal usage only
     442        map: function( elems, callback, arg ) {
     443                var length, value,
     444                        i = 0,
     445                        ret = [];
     446
     447                // Go through the array, translating each of the items to their new values
     448                if ( isArrayLike( elems ) ) {
     449                        length = elems.length;
     450                        for ( ; i < length; i++ ) {
     451                                value = callback( elems[ i ], i, arg );
     452
     453                                if ( value != null ) {
     454                                        ret.push( value );
     455                                }
     456                        }
     457
     458                // Go through every key on the object,
     459                } else {
     460                        for ( i in elems ) {
     461                                value = callback( elems[ i ], i, arg );
     462
     463                                if ( value != null ) {
     464                                        ret.push( value );
     465                                }
     466                        }
     467                }
     468
     469                // Flatten any nested arrays
     470                return concat.apply( [], ret );
     471        },
     472
     473        // A global GUID counter for objects
     474        guid: 1,
     475
     476        // Bind a function to a context, optionally partially applying any
     477        // arguments.
     478        proxy: function( fn, context ) {
     479                var tmp, args, proxy;
     480
     481                if ( typeof context === "string" ) {
     482                        tmp = fn[ context ];
     483                        context = fn;
     484                        fn = tmp;
     485                }
     486
     487                // Quick check to determine if target is callable, in the spec
     488                // this throws a TypeError, but we will just return undefined.
     489                if ( !jQuery.isFunction( fn ) ) {
     490                        return undefined;
     491                }
     492
     493                // Simulated bind
     494                args = slice.call( arguments, 2 );
     495                proxy = function() {
     496                        return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
     497                };
     498
     499                // Set the guid of unique handler to the same of original handler, so it can be removed
     500                proxy.guid = fn.guid = fn.guid || jQuery.guid++;
     501
     502                return proxy;
     503        },
     504
     505        now: Date.now,
     506
     507        // jQuery.support is not used in Core but other projects attach their
     508        // properties to it so it needs to exist.
     509        support: support
     510} );
     511
     512if ( typeof Symbol === "function" ) {
     513        jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
     514}
     515
     516// Populate the class2type map
     517jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
     518function( i, name ) {
     519        class2type[ "[object " + name + "]" ] = name.toLowerCase();
     520} );
     521
     522function isArrayLike( obj ) {
     523
     524        // Support: real iOS 8.2 only (not reproducible in simulator)
     525        // `in` check used to prevent JIT error (gh-2145)
     526        // hasOwn isn't used here due to false negatives
     527        // regarding Nodelist length in IE
     528        var length = !!obj && "length" in obj && obj.length,
     529                type = jQuery.type( obj );
     530
     531        if ( type === "function" || jQuery.isWindow( obj ) ) {
     532                return false;
     533        }
     534
     535        return type === "array" || length === 0 ||
     536                typeof length === "number" && length > 0 && ( length - 1 ) in obj;
     537}
     538var Sizzle =
     539/*!
     540 * Sizzle CSS Selector Engine v2.3.3
     541 * https://sizzlejs.com/
     542 *
     543 * Copyright jQuery Foundation and other contributors
     544 * Released under the MIT license
     545 * http://jquery.org/license
     546 *
     547 * Date: 2016-08-08
     548 */
     549(function( window ) {
     550
     551var i,
     552        support,
     553        Expr,
     554        getText,
     555        isXML,
     556        tokenize,
     557        compile,
     558        select,
     559        outermostContext,
     560        sortInput,
     561        hasDuplicate,
     562
     563        // Local document vars
     564        setDocument,
     565        document,
     566        docElem,
     567        documentIsHTML,
     568        rbuggyQSA,
     569        rbuggyMatches,
     570        matches,
     571        contains,
     572
     573        // Instance-specific data
     574        expando = "sizzle" + 1 * new Date(),
     575        preferredDoc = window.document,
     576        dirruns = 0,
     577        done = 0,
     578        classCache = createCache(),
     579        tokenCache = createCache(),
     580        compilerCache = createCache(),
     581        sortOrder = function( a, b ) {
     582                if ( a === b ) {
     583                        hasDuplicate = true;
     584                }
     585                return 0;
     586        },
     587
     588        // Instance methods
     589        hasOwn = ({}).hasOwnProperty,
     590        arr = [],
     591        pop = arr.pop,
     592        push_native = arr.push,
     593        push = arr.push,
     594        slice = arr.slice,
     595        // Use a stripped-down indexOf as it's faster than native
     596        // https://jsperf.com/thor-indexof-vs-for/5
     597        indexOf = function( list, elem ) {
     598                var i = 0,
     599                        len = list.length;
     600                for ( ; i < len; i++ ) {
     601                        if ( list[i] === elem ) {
     602                                return i;
     603                        }
     604                }
     605                return -1;
     606        },
     607
     608        booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
     609
     610        // Regular expressions
     611
     612        // http://www.w3.org/TR/css3-selectors/#whitespace
     613        whitespace = "[\\x20\\t\\r\\n\\f]",
     614
     615        // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
     616        identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
     617
     618        // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
     619        attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
     620                // Operator (capture 2)
     621                "*([*^$|!~]?=)" + whitespace +
     622                // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
     623                "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
     624                "*\\]",
     625
     626        pseudos = ":(" + identifier + ")(?:\\((" +
     627                // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
     628                // 1. quoted (capture 3; capture 4 or capture 5)
     629                "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
     630                // 2. simple (capture 6)
     631                "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
     632                // 3. anything else (capture 2)
     633                ".*" +
     634                ")\\)|)",
     635
     636        // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
     637        rwhitespace = new RegExp( whitespace + "+", "g" ),
     638        rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
     639
     640        rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
     641        rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
     642
     643        rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
     644
     645        rpseudo = new RegExp( pseudos ),
     646        ridentifier = new RegExp( "^" + identifier + "$" ),
     647
     648        matchExpr = {
     649                "ID": new RegExp( "^#(" + identifier + ")" ),
     650                "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
     651                "TAG": new RegExp( "^(" + identifier + "|[*])" ),
     652                "ATTR": new RegExp( "^" + attributes ),
     653                "PSEUDO": new RegExp( "^" + pseudos ),
     654                "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
     655                        "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
     656                        "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
     657                "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
     658                // For use in libraries implementing .is()
     659                // We use this for POS matching in `select`
     660                "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
     661                        whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
     662        },
     663
     664        rinputs = /^(?:input|select|textarea|button)$/i,
     665        rheader = /^h\d$/i,
     666
     667        rnative = /^[^{]+\{\s*\[native \w/,
     668
     669        // Easily-parseable/retrievable ID or TAG or CLASS selectors
     670        rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
     671
     672        rsibling = /[+~]/,
     673
     674        // CSS escapes
     675        // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
     676        runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
     677        funescape = function( _, escaped, escapedWhitespace ) {
     678                var high = "0x" + escaped - 0x10000;
     679                // NaN means non-codepoint
     680                // Support: Firefox<24
     681                // Workaround erroneous numeric interpretation of +"0x"
     682                return high !== high || escapedWhitespace ?
     683                        escaped :
     684                        high < 0 ?
     685                                // BMP codepoint
     686                                String.fromCharCode( high + 0x10000 ) :
     687                                // Supplemental Plane codepoint (surrogate pair)
     688                                String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
     689        },
     690
     691        // CSS string/identifier serialization
     692        // https://drafts.csswg.org/cssom/#common-serializing-idioms
     693        rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
     694        fcssescape = function( ch, asCodePoint ) {
     695                if ( asCodePoint ) {
     696
     697                        // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
     698                        if ( ch === "\0" ) {
     699                                return "\uFFFD";
     700                        }
     701
     702                        // Control characters and (dependent upon position) numbers get escaped as code points
     703                        return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
     704                }
     705
     706                // Other potentially-special ASCII characters get backslash-escaped
     707                return "\\" + ch;
     708        },
     709
     710        // Used for iframes
     711        // See setDocument()
     712        // Removing the function wrapper causes a "Permission Denied"
     713        // error in IE
     714        unloadHandler = function() {
     715                setDocument();
     716        },
     717
     718        disabledAncestor = addCombinator(
     719                function( elem ) {
     720                        return elem.disabled === true && ("form" in elem || "label" in elem);
     721                },
     722                { dir: "parentNode", next: "legend" }
     723        );
     724
     725// Optimize for push.apply( _, NodeList )
     726try {
     727        push.apply(
     728                (arr = slice.call( preferredDoc.childNodes )),
     729                preferredDoc.childNodes
     730        );
     731        // Support: Android<4.0
     732        // Detect silently failing push.apply
     733        arr[ preferredDoc.childNodes.length ].nodeType;
     734} catch ( e ) {
     735        push = { apply: arr.length ?
     736
     737                // Leverage slice if possible
     738                function( target, els ) {
     739                        push_native.apply( target, slice.call(els) );
     740                } :
     741
     742                // Support: IE<9
     743                // Otherwise append directly
     744                function( target, els ) {
     745                        var j = target.length,
     746                                i = 0;
     747                        // Can't trust NodeList.length
     748                        while ( (target[j++] = els[i++]) ) {}
     749                        target.length = j - 1;
     750                }
     751        };
     752}
     753
     754function Sizzle( selector, context, results, seed ) {
     755        var m, i, elem, nid, match, groups, newSelector,
     756                newContext = context && context.ownerDocument,
     757
     758                // nodeType defaults to 9, since context defaults to document
     759                nodeType = context ? context.nodeType : 9;
     760
     761        results = results || [];
     762
     763        // Return early from calls with invalid selector or context
     764        if ( typeof selector !== "string" || !selector ||
     765                nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
     766
     767                return results;
     768        }
     769
     770        // Try to shortcut find operations (as opposed to filters) in HTML documents
     771        if ( !seed ) {
     772
     773                if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
     774                        setDocument( context );
     775                }
     776                context = context || document;
     777
     778                if ( documentIsHTML ) {
     779
     780                        // If the selector is sufficiently simple, try using a "get*By*" DOM method
     781                        // (excepting DocumentFragment context, where the methods don't exist)
     782                        if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
     783
     784                                // ID selector
     785                                if ( (m = match[1]) ) {
     786
     787                                        // Document context
     788                                        if ( nodeType === 9 ) {
     789                                                if ( (elem = context.getElementById( m )) ) {
     790
     791                                                        // Support: IE, Opera, Webkit
     792                                                        // TODO: identify versions
     793                                                        // getElementById can match elements by name instead of ID
     794                                                        if ( elem.id === m ) {
     795                                                                results.push( elem );
     796                                                                return results;
     797                                                        }
     798                                                } else {
     799                                                        return results;
     800                                                }
     801
     802                                        // Element context
     803                                        } else {
     804
     805                                                // Support: IE, Opera, Webkit
     806                                                // TODO: identify versions
     807                                                // getElementById can match elements by name instead of ID
     808                                                if ( newContext && (elem = newContext.getElementById( m )) &&
     809                                                        contains( context, elem ) &&
     810                                                        elem.id === m ) {
     811
     812                                                        results.push( elem );
     813                                                        return results;
     814                                                }
     815                                        }
     816
     817                                // Type selector
     818                                } else if ( match[2] ) {
     819                                        push.apply( results, context.getElementsByTagName( selector ) );
     820                                        return results;
     821
     822                                // Class selector
     823                                } else if ( (m = match[3]) && support.getElementsByClassName &&
     824                                        context.getElementsByClassName ) {
     825
     826                                        push.apply( results, context.getElementsByClassName( m ) );
     827                                        return results;
     828                                }
     829                        }
     830
     831                        // Take advantage of querySelectorAll
     832                        if ( support.qsa &&
     833                                !compilerCache[ selector + " " ] &&
     834                                (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
     835
     836                                if ( nodeType !== 1 ) {
     837                                        newContext = context;
     838                                        newSelector = selector;
     839
     840                                // qSA looks outside Element context, which is not what we want
     841                                // Thanks to Andrew Dupont for this workaround technique
     842                                // Support: IE <=8
     843                                // Exclude object elements
     844                                } else if ( context.nodeName.toLowerCase() !== "object" ) {
     845
     846                                        // Capture the context ID, setting it first if necessary
     847                                        if ( (nid = context.getAttribute( "id" )) ) {
     848                                                nid = nid.replace( rcssescape, fcssescape );
     849                                        } else {
     850                                                context.setAttribute( "id", (nid = expando) );
     851                                        }
     852
     853                                        // Prefix every selector in the list
     854                                        groups = tokenize( selector );
     855                                        i = groups.length;
     856                                        while ( i-- ) {
     857                                                groups[i] = "#" + nid + " " + toSelector( groups[i] );
     858                                        }
     859                                        newSelector = groups.join( "," );
     860
     861                                        // Expand context for sibling selectors
     862                                        newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
     863                                                context;
     864                                }
     865
     866                                if ( newSelector ) {
     867                                        try {
     868                                                push.apply( results,
     869                                                        newContext.querySelectorAll( newSelector )
     870                                                );
     871                                                return results;
     872                                        } catch ( qsaError ) {
     873                                        } finally {
     874                                                if ( nid === expando ) {
     875                                                        context.removeAttribute( "id" );
     876                                                }
     877                                        }
     878                                }
     879                        }
     880                }
     881        }
     882
     883        // All others
     884        return select( selector.replace( rtrim, "$1" ), context, results, seed );
     885}
     886
     887/**
     888 * Create key-value caches of limited size
     889 * @returns {function(string, object)} Returns the Object data after storing it on itself with
     890 *      property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
     891 *      deleting the oldest entry
     892 */
     893function createCache() {
     894        var keys = [];
     895
     896        function cache( key, value ) {
     897                // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
     898                if ( keys.push( key + " " ) > Expr.cacheLength ) {
     899                        // Only keep the most recent entries
     900                        delete cache[ keys.shift() ];
     901                }
     902                return (cache[ key + " " ] = value);
     903        }
     904        return cache;
     905}
     906
     907/**
     908 * Mark a function for special use by Sizzle
     909 * @param {Function} fn The function to mark
     910 */
     911function markFunction( fn ) {
     912        fn[ expando ] = true;
     913        return fn;
     914}
     915
     916/**
     917 * Support testing using an element
     918 * @param {Function} fn Passed the created element and returns a boolean result
     919 */
     920function assert( fn ) {
     921        var el = document.createElement("fieldset");
     922
     923        try {
     924                return !!fn( el );
     925        } catch (e) {
     926                return false;
     927        } finally {
     928                // Remove from its parent by default
     929                if ( el.parentNode ) {
     930                        el.parentNode.removeChild( el );
     931                }
     932                // release memory in IE
     933                el = null;
     934        }
     935}
     936
     937/**
     938 * Adds the same handler for all of the specified attrs
     939 * @param {String} attrs Pipe-separated list of attributes
     940 * @param {Function} handler The method that will be applied
     941 */
     942function addHandle( attrs, handler ) {
     943        var arr = attrs.split("|"),
     944                i = arr.length;
     945
     946        while ( i-- ) {
     947                Expr.attrHandle[ arr[i] ] = handler;
     948        }
     949}
     950
     951/**
     952 * Checks document order of two siblings
     953 * @param {Element} a
     954 * @param {Element} b
     955 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
     956 */
     957function siblingCheck( a, b ) {
     958        var cur = b && a,
     959                diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
     960                        a.sourceIndex - b.sourceIndex;
     961
     962        // Use IE sourceIndex if available on both nodes
     963        if ( diff ) {
     964                return diff;
     965        }
     966
     967        // Check if b follows a
     968        if ( cur ) {
     969                while ( (cur = cur.nextSibling) ) {
     970                        if ( cur === b ) {
     971                                return -1;
     972                        }
     973                }
     974        }
     975
     976        return a ? 1 : -1;
     977}
     978
     979/**
     980 * Returns a function to use in pseudos for input types
     981 * @param {String} type
     982 */
     983function createInputPseudo( type ) {
     984        return function( elem ) {
     985                var name = elem.nodeName.toLowerCase();
     986                return name === "input" && elem.type === type;
     987        };
     988}
     989
     990/**
     991 * Returns a function to use in pseudos for buttons
     992 * @param {String} type
     993 */
     994function createButtonPseudo( type ) {
     995        return function( elem ) {
     996                var name = elem.nodeName.toLowerCase();
     997                return (name === "input" || name === "button") && elem.type === type;
     998        };
     999}
     1000
     1001/**
     1002 * Returns a function to use in pseudos for :enabled/:disabled
     1003 * @param {Boolean} disabled true for :disabled; false for :enabled
     1004 */
     1005function createDisabledPseudo( disabled ) {
     1006
     1007        // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
     1008        return function( elem ) {
     1009
     1010                // Only certain elements can match :enabled or :disabled
     1011                // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
     1012                // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
     1013                if ( "form" in elem ) {
     1014
     1015                        // Check for inherited disabledness on relevant non-disabled elements:
     1016                        // * listed form-associated elements in a disabled fieldset
     1017                        //   https://html.spec.whatwg.org/multipage/forms.html#category-listed
     1018                        //   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
     1019                        // * option elements in a disabled optgroup
     1020                        //   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
     1021                        // All such elements have a "form" property.
     1022                        if ( elem.parentNode && elem.disabled === false ) {
     1023
     1024                                // Option elements defer to a parent optgroup if present
     1025                                if ( "label" in elem ) {
     1026                                        if ( "label" in elem.parentNode ) {
     1027                                                return elem.parentNode.disabled === disabled;
     1028                                        } else {
     1029                                                return elem.disabled === disabled;
     1030                                        }
     1031                                }
     1032
     1033                                // Support: IE 6 - 11
     1034                                // Use the isDisabled shortcut property to check for disabled fieldset ancestors
     1035                                return elem.isDisabled === disabled ||
     1036
     1037                                        // Where there is no isDisabled, check manually
     1038                                        /* jshint -W018 */
     1039                                        elem.isDisabled !== !disabled &&
     1040                                                disabledAncestor( elem ) === disabled;
     1041                        }
     1042
     1043                        return elem.disabled === disabled;
     1044
     1045                // Try to winnow out elements that can't be disabled before trusting the disabled property.
     1046                // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
     1047                // even exist on them, let alone have a boolean value.
     1048                } else if ( "label" in elem ) {
     1049                        return elem.disabled === disabled;
     1050                }
     1051
     1052                // Remaining elements are neither :enabled nor :disabled
     1053                return false;
     1054        };
     1055}
     1056
     1057/**
     1058 * Returns a function to use in pseudos for positionals
     1059 * @param {Function} fn
     1060 */
     1061function createPositionalPseudo( fn ) {
     1062        return markFunction(function( argument ) {
     1063                argument = +argument;
     1064                return markFunction(function( seed, matches ) {
     1065                        var j,
     1066                                matchIndexes = fn( [], seed.length, argument ),
     1067                                i = matchIndexes.length;
     1068
     1069                        // Match elements found at the specified indexes
     1070                        while ( i-- ) {
     1071                                if ( seed[ (j = matchIndexes[i]) ] ) {
     1072                                        seed[j] = !(matches[j] = seed[j]);
     1073                                }
     1074                        }
     1075                });
     1076        });
     1077}
     1078
     1079/**
     1080 * Checks a node for validity as a Sizzle context
     1081 * @param {Element|Object=} context
     1082 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
     1083 */
     1084function testContext( context ) {
     1085        return context && typeof context.getElementsByTagName !== "undefined" && context;
     1086}
     1087
     1088// Expose support vars for convenience
     1089support = Sizzle.support = {};
     1090
     1091/**
     1092 * Detects XML nodes
     1093 * @param {Element|Object} elem An element or a document
     1094 * @returns {Boolean} True iff elem is a non-HTML XML node
     1095 */
     1096isXML = Sizzle.isXML = function( elem ) {
     1097        // documentElement is verified for cases where it doesn't yet exist
     1098        // (such as loading iframes in IE - #4833)
     1099        var documentElement = elem && (elem.ownerDocument || elem).documentElement;
     1100        return documentElement ? documentElement.nodeName !== "HTML" : false;
     1101};
     1102
     1103/**
     1104 * Sets document-related variables once based on the current document
     1105 * @param {Element|Object} [doc] An element or document object to use to set the document
     1106 * @returns {Object} Returns the current document
     1107 */
     1108setDocument = Sizzle.setDocument = function( node ) {
     1109        var hasCompare, subWindow,
     1110                doc = node ? node.ownerDocument || node : preferredDoc;
     1111
     1112        // Return early if doc is invalid or already selected
     1113        if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
     1114                return document;
     1115        }
     1116
     1117        // Update global variables
     1118        document = doc;
     1119        docElem = document.documentElement;
     1120        documentIsHTML = !isXML( document );
     1121
     1122        // Support: IE 9-11, Edge
     1123        // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
     1124        if ( preferredDoc !== document &&
     1125                (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
     1126
     1127                // Support: IE 11, Edge
     1128                if ( subWindow.addEventListener ) {
     1129                        subWindow.addEventListener( "unload", unloadHandler, false );
     1130
     1131                // Support: IE 9 - 10 only
     1132                } else if ( subWindow.attachEvent ) {
     1133                        subWindow.attachEvent( "onunload", unloadHandler );
     1134                }
     1135        }
     1136
     1137        /* Attributes
     1138        ---------------------------------------------------------------------- */
     1139
     1140        // Support: IE<8
     1141        // Verify that getAttribute really returns attributes and not properties
     1142        // (excepting IE8 booleans)
     1143        support.attributes = assert(function( el ) {
     1144                el.className = "i";
     1145                return !el.getAttribute("className");
     1146        });
     1147
     1148        /* getElement(s)By*
     1149        ---------------------------------------------------------------------- */
     1150
     1151        // Check if getElementsByTagName("*") returns only elements
     1152        support.getElementsByTagName = assert(function( el ) {
     1153                el.appendChild( document.createComment("") );
     1154                return !el.getElementsByTagName("*").length;
     1155        });
     1156
     1157        // Support: IE<9
     1158        support.getElementsByClassName = rnative.test( document.getElementsByClassName );
     1159
     1160        // Support: IE<10
     1161        // Check if getElementById returns elements by name
     1162        // The broken getElementById methods don't pick up programmatically-set names,
     1163        // so use a roundabout getElementsByName test
     1164        support.getById = assert(function( el ) {
     1165                docElem.appendChild( el ).id = expando;
     1166                return !document.getElementsByName || !document.getElementsByName( expando ).length;
     1167        });
     1168
     1169        // ID filter and find
     1170        if ( support.getById ) {
     1171                Expr.filter["ID"] = function( id ) {
     1172                        var attrId = id.replace( runescape, funescape );
     1173                        return function( elem ) {
     1174                                return elem.getAttribute("id") === attrId;
     1175                        };
     1176                };
     1177                Expr.find["ID"] = function( id, context ) {
     1178                        if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
     1179                                var elem = context.getElementById( id );
     1180                                return elem ? [ elem ] : [];
     1181                        }
     1182                };
     1183        } else {
     1184                Expr.filter["ID"] =  function( id ) {
     1185                        var attrId = id.replace( runescape, funescape );
     1186                        return function( elem ) {
     1187                                var node = typeof elem.getAttributeNode !== "undefined" &&
     1188                                        elem.getAttributeNode("id");
     1189                                return node && node.value === attrId;
     1190                        };
     1191                };
     1192
     1193                // Support: IE 6 - 7 only
     1194                // getElementById is not reliable as a find shortcut
     1195                Expr.find["ID"] = function( id, context ) {
     1196                        if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
     1197                                var node, i, elems,
     1198                                        elem = context.getElementById( id );
     1199
     1200                                if ( elem ) {
     1201
     1202                                        // Verify the id attribute
     1203                                        node = elem.getAttributeNode("id");
     1204                                        if ( node && node.value === id ) {
     1205                                                return [ elem ];
     1206                                        }
     1207
     1208                                        // Fall back on getElementsByName
     1209                                        elems = context.getElementsByName( id );
     1210                                        i = 0;
     1211                                        while ( (elem = elems[i++]) ) {
     1212                                                node = elem.getAttributeNode("id");
     1213                                                if ( node && node.value === id ) {
     1214                                                        return [ elem ];
     1215                                                }
     1216                                        }
     1217                                }
     1218
     1219                                return [];
     1220                        }
     1221                };
     1222        }
     1223
     1224        // Tag
     1225        Expr.find["TAG"] = support.getElementsByTagName ?
     1226                function( tag, context ) {
     1227                        if ( typeof context.getElementsByTagName !== "undefined" ) {
     1228                                return context.getElementsByTagName( tag );
     1229
     1230                        // DocumentFragment nodes don't have gEBTN
     1231                        } else if ( support.qsa ) {
     1232                                return context.querySelectorAll( tag );
     1233                        }
     1234                } :
     1235
     1236                function( tag, context ) {
     1237                        var elem,
     1238                                tmp = [],
     1239                                i = 0,
     1240                                // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
     1241                                results = context.getElementsByTagName( tag );
     1242
     1243                        // Filter out possible comments
     1244                        if ( tag === "*" ) {
     1245                                while ( (elem = results[i++]) ) {
     1246                                        if ( elem.nodeType === 1 ) {
     1247                                                tmp.push( elem );
     1248                                        }
     1249                                }
     1250
     1251                                return tmp;
     1252                        }
     1253                        return results;
     1254                };
     1255
     1256        // Class
     1257        Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
     1258                if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
     1259                        return context.getElementsByClassName( className );
     1260                }
     1261        };
     1262
     1263        /* QSA/matchesSelector
     1264        ---------------------------------------------------------------------- */
     1265
     1266        // QSA and matchesSelector support
     1267
     1268        // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
     1269        rbuggyMatches = [];
     1270
     1271        // qSa(:focus) reports false when true (Chrome 21)
     1272        // We allow this because of a bug in IE8/9 that throws an error
     1273        // whenever `document.activeElement` is accessed on an iframe
     1274        // So, we allow :focus to pass through QSA all the time to avoid the IE error
     1275        // See https://bugs.jquery.com/ticket/13378
     1276        rbuggyQSA = [];
     1277
     1278        if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
     1279                // Build QSA regex
     1280                // Regex strategy adopted from Diego Perini
     1281                assert(function( el ) {
     1282                        // Select is set to empty string on purpose
     1283                        // This is to test IE's treatment of not explicitly
     1284                        // setting a boolean content attribute,
     1285                        // since its presence should be enough
     1286                        // https://bugs.jquery.com/ticket/12359
     1287                        docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
     1288                                "<select id='" + expando + "-\r\\' msallowcapture=''>" +
     1289                                "<option selected=''></option></select>";
     1290
     1291                        // Support: IE8, Opera 11-12.16
     1292                        // Nothing should be selected when empty strings follow ^= or $= or *=
     1293                        // The test attribute must be unknown in Opera but "safe" for WinRT
     1294                        // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
     1295                        if ( el.querySelectorAll("[msallowcapture^='']").length ) {
     1296                                rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
     1297                        }
     1298
     1299                        // Support: IE8
     1300                        // Boolean attributes and "value" are not treated correctly
     1301                        if ( !el.querySelectorAll("[selected]").length ) {
     1302                                rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
     1303                        }
     1304
     1305                        // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
     1306                        if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
     1307                                rbuggyQSA.push("~=");
     1308                        }
     1309
     1310                        // Webkit/Opera - :checked should return selected option elements
     1311                        // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
     1312                        // IE8 throws error here and will not see later tests
     1313                        if ( !el.querySelectorAll(":checked").length ) {
     1314                                rbuggyQSA.push(":checked");
     1315                        }
     1316
     1317                        // Support: Safari 8+, iOS 8+
     1318                        // https://bugs.webkit.org/show_bug.cgi?id=136851
     1319                        // In-page `selector#id sibling-combinator selector` fails
     1320                        if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
     1321                                rbuggyQSA.push(".#.+[+~]");
     1322                        }
     1323                });
     1324
     1325                assert(function( el ) {
     1326                        el.innerHTML = "<a href='' disabled='disabled'></a>" +
     1327                                "<select disabled='disabled'><option/></select>";
     1328
     1329                        // Support: Windows 8 Native Apps
     1330                        // The type and name attributes are restricted during .innerHTML assignment
     1331                        var input = document.createElement("input");
     1332                        input.setAttribute( "type", "hidden" );
     1333                        el.appendChild( input ).setAttribute( "name", "D" );
     1334
     1335                        // Support: IE8
     1336                        // Enforce case-sensitivity of name attribute
     1337                        if ( el.querySelectorAll("[name=d]").length ) {
     1338                                rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
     1339                        }
     1340
     1341                        // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
     1342                        // IE8 throws error here and will not see later tests
     1343                        if ( el.querySelectorAll(":enabled").length !== 2 ) {
     1344                                rbuggyQSA.push( ":enabled", ":disabled" );
     1345                        }
     1346
     1347                        // Support: IE9-11+
     1348                        // IE's :disabled selector does not pick up the children of disabled fieldsets
     1349                        docElem.appendChild( el ).disabled = true;
     1350                        if ( el.querySelectorAll(":disabled").length !== 2 ) {
     1351                                rbuggyQSA.push( ":enabled", ":disabled" );
     1352                        }
     1353
     1354                        // Opera 10-11 does not throw on post-comma invalid pseudos
     1355                        el.querySelectorAll("*,:x");
     1356                        rbuggyQSA.push(",.*:");
     1357                });
     1358        }
     1359
     1360        if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
     1361                docElem.webkitMatchesSelector ||
     1362                docElem.mozMatchesSelector ||
     1363                docElem.oMatchesSelector ||
     1364                docElem.msMatchesSelector) )) ) {
     1365
     1366                assert(function( el ) {
     1367                        // Check to see if it's possible to do matchesSelector
     1368                        // on a disconnected node (IE 9)
     1369                        support.disconnectedMatch = matches.call( el, "*" );
     1370
     1371                        // This should fail with an exception
     1372                        // Gecko does not error, returns false instead
     1373                        matches.call( el, "[s!='']:x" );
     1374                        rbuggyMatches.push( "!=", pseudos );
     1375                });
     1376        }
     1377
     1378        rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
     1379        rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
     1380
     1381        /* Contains
     1382        ---------------------------------------------------------------------- */
     1383        hasCompare = rnative.test( docElem.compareDocumentPosition );
     1384
     1385        // Element contains another
     1386        // Purposefully self-exclusive
     1387        // As in, an element does not contain itself
     1388        contains = hasCompare || rnative.test( docElem.contains ) ?
     1389                function( a, b ) {
     1390                        var adown = a.nodeType === 9 ? a.documentElement : a,
     1391                                bup = b && b.parentNode;
     1392                        return a === bup || !!( bup && bup.nodeType === 1 && (
     1393                                adown.contains ?
     1394                                        adown.contains( bup ) :
     1395                                        a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
     1396                        ));
     1397                } :
     1398                function( a, b ) {
     1399                        if ( b ) {
     1400                                while ( (b = b.parentNode) ) {
     1401                                        if ( b === a ) {
     1402                                                return true;
     1403                                        }
     1404                                }
     1405                        }
     1406                        return false;
     1407                };
     1408
     1409        /* Sorting
     1410        ---------------------------------------------------------------------- */
     1411
     1412        // Document order sorting
     1413        sortOrder = hasCompare ?
     1414        function( a, b ) {
     1415
     1416                // Flag for duplicate removal
     1417                if ( a === b ) {
     1418                        hasDuplicate = true;
     1419                        return 0;
     1420                }
     1421
     1422                // Sort on method existence if only one input has compareDocumentPosition
     1423                var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
     1424                if ( compare ) {
     1425                        return compare;
     1426                }
     1427
     1428                // Calculate position if both inputs belong to the same document
     1429                compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
     1430                        a.compareDocumentPosition( b ) :
     1431
     1432                        // Otherwise we know they are disconnected
     1433                        1;
     1434
     1435                // Disconnected nodes
     1436                if ( compare & 1 ||
     1437                        (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
     1438
     1439                        // Choose the first element that is related to our preferred document
     1440                        if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
     1441                                return -1;
     1442                        }
     1443                        if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
     1444                                return 1;
     1445                        }
     1446
     1447                        // Maintain original order
     1448                        return sortInput ?
     1449                                ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
     1450                                0;
     1451                }
     1452
     1453                return compare & 4 ? -1 : 1;
     1454        } :
     1455        function( a, b ) {
     1456                // Exit early if the nodes are identical
     1457                if ( a === b ) {
     1458                        hasDuplicate = true;
     1459                        return 0;
     1460                }
     1461
     1462                var cur,
     1463                        i = 0,
     1464                        aup = a.parentNode,
     1465                        bup = b.parentNode,
     1466                        ap = [ a ],
     1467                        bp = [ b ];
     1468
     1469                // Parentless nodes are either documents or disconnected
     1470                if ( !aup || !bup ) {
     1471                        return a === document ? -1 :
     1472                                b === document ? 1 :
     1473                                aup ? -1 :
     1474                                bup ? 1 :
     1475                                sortInput ?
     1476                                ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
     1477                                0;
     1478
     1479                // If the nodes are siblings, we can do a quick check
     1480                } else if ( aup === bup ) {
     1481                        return siblingCheck( a, b );
     1482                }
     1483
     1484                // Otherwise we need full lists of their ancestors for comparison
     1485                cur = a;
     1486                while ( (cur = cur.parentNode) ) {
     1487                        ap.unshift( cur );
     1488                }
     1489                cur = b;
     1490                while ( (cur = cur.parentNode) ) {
     1491                        bp.unshift( cur );
     1492                }
     1493
     1494                // Walk down the tree looking for a discrepancy
     1495                while ( ap[i] === bp[i] ) {
     1496                        i++;
     1497                }
     1498
     1499                return i ?
     1500                        // Do a sibling check if the nodes have a common ancestor
     1501                        siblingCheck( ap[i], bp[i] ) :
     1502
     1503                        // Otherwise nodes in our document sort first
     1504                        ap[i] === preferredDoc ? -1 :
     1505                        bp[i] === preferredDoc ? 1 :
     1506                        0;
     1507        };
     1508
     1509        return document;
     1510};
     1511
     1512Sizzle.matches = function( expr, elements ) {
     1513        return Sizzle( expr, null, null, elements );
     1514};
     1515
     1516Sizzle.matchesSelector = function( elem, expr ) {
     1517        // Set document vars if needed
     1518        if ( ( elem.ownerDocument || elem ) !== document ) {
     1519                setDocument( elem );
     1520        }
     1521
     1522        // Make sure that attribute selectors are quoted
     1523        expr = expr.replace( rattributeQuotes, "='$1']" );
     1524
     1525        if ( support.matchesSelector && documentIsHTML &&
     1526                !compilerCache[ expr + " " ] &&
     1527                ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
     1528                ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
     1529
     1530                try {
     1531                        var ret = matches.call( elem, expr );
     1532
     1533                        // IE 9's matchesSelector returns false on disconnected nodes
     1534                        if ( ret || support.disconnectedMatch ||
     1535                                        // As well, disconnected nodes are said to be in a document
     1536                                        // fragment in IE 9
     1537                                        elem.document && elem.document.nodeType !== 11 ) {
     1538                                return ret;
     1539                        }
     1540                } catch (e) {}
     1541        }
     1542
     1543        return Sizzle( expr, document, null, [ elem ] ).length > 0;
     1544};
     1545
     1546Sizzle.contains = function( context, elem ) {
     1547        // Set document vars if needed
     1548        if ( ( context.ownerDocument || context ) !== document ) {
     1549                setDocument( context );
     1550        }
     1551        return contains( context, elem );
     1552};
     1553
     1554Sizzle.attr = function( elem, name ) {
     1555        // Set document vars if needed
     1556        if ( ( elem.ownerDocument || elem ) !== document ) {
     1557                setDocument( elem );
     1558        }
     1559
     1560        var fn = Expr.attrHandle[ name.toLowerCase() ],
     1561                // Don't get fooled by Object.prototype properties (jQuery #13807)
     1562                val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
     1563                        fn( elem, name, !documentIsHTML ) :
     1564                        undefined;
     1565
     1566        return val !== undefined ?
     1567                val :
     1568                support.attributes || !documentIsHTML ?
     1569                        elem.getAttribute( name ) :
     1570                        (val = elem.getAttributeNode(name)) && val.specified ?
     1571                                val.value :
     1572                                null;
     1573};
     1574
     1575Sizzle.escape = function( sel ) {
     1576        return (sel + "").replace( rcssescape, fcssescape );
     1577};
     1578
     1579Sizzle.error = function( msg ) {
     1580        throw new Error( "Syntax error, unrecognized expression: " + msg );
     1581};
     1582
     1583/**
     1584 * Document sorting and removing duplicates
     1585 * @param {ArrayLike} results
     1586 */
     1587Sizzle.uniqueSort = function( results ) {
     1588        var elem,
     1589                duplicates = [],
     1590                j = 0,
     1591                i = 0;
     1592
     1593        // Unless we *know* we can detect duplicates, assume their presence
     1594        hasDuplicate = !support.detectDuplicates;
     1595        sortInput = !support.sortStable && results.slice( 0 );
     1596        results.sort( sortOrder );
     1597
     1598        if ( hasDuplicate ) {
     1599                while ( (elem = results[i++]) ) {
     1600                        if ( elem === results[ i ] ) {
     1601                                j = duplicates.push( i );
     1602                        }
     1603                }
     1604                while ( j-- ) {
     1605                        results.splice( duplicates[ j ], 1 );
     1606                }
     1607        }
     1608
     1609        // Clear input after sorting to release objects
     1610        // See https://github.com/jquery/sizzle/pull/225
     1611        sortInput = null;
     1612
     1613        return results;
     1614};
     1615
     1616/**
     1617 * Utility function for retrieving the text value of an array of DOM nodes
     1618 * @param {Array|Element} elem
     1619 */
     1620getText = Sizzle.getText = function( elem ) {
     1621        var node,
     1622                ret = "",
     1623                i = 0,
     1624                nodeType = elem.nodeType;
     1625
     1626        if ( !nodeType ) {
     1627                // If no nodeType, this is expected to be an array
     1628                while ( (node = elem[i++]) ) {
     1629                        // Do not traverse comment nodes
     1630                        ret += getText( node );
     1631                }
     1632        } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
     1633                // Use textContent for elements
     1634                // innerText usage removed for consistency of new lines (jQuery #11153)
     1635                if ( typeof elem.textContent === "string" ) {
     1636                        return elem.textContent;
     1637                } else {
     1638                        // Traverse its children
     1639                        for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
     1640                                ret += getText( elem );
     1641                        }
     1642                }
     1643        } else if ( nodeType === 3 || nodeType === 4 ) {
     1644                return elem.nodeValue;
     1645        }
     1646        // Do not include comment or processing instruction nodes
     1647
     1648        return ret;
     1649};
     1650
     1651Expr = Sizzle.selectors = {
     1652
     1653        // Can be adjusted by the user
     1654        cacheLength: 50,
     1655
     1656        createPseudo: markFunction,
     1657
     1658        match: matchExpr,
     1659
     1660        attrHandle: {},
     1661
     1662        find: {},
     1663
     1664        relative: {
     1665                ">": { dir: "parentNode", first: true },
     1666                " ": { dir: "parentNode" },
     1667                "+": { dir: "previousSibling", first: true },
     1668                "~": { dir: "previousSibling" }
     1669        },
     1670
     1671        preFilter: {
     1672                "ATTR": function( match ) {
     1673                        match[1] = match[1].replace( runescape, funescape );
     1674
     1675                        // Move the given value to match[3] whether quoted or unquoted
     1676                        match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
     1677
     1678                        if ( match[2] === "~=" ) {
     1679                                match[3] = " " + match[3] + " ";
     1680                        }
     1681
     1682                        return match.slice( 0, 4 );
     1683                },
     1684
     1685                "CHILD": function( match ) {
     1686                        /* matches from matchExpr["CHILD"]
     1687                                1 type (only|nth|...)
     1688                                2 what (child|of-type)
     1689                                3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
     1690                                4 xn-component of xn+y argument ([+-]?\d*n|)
     1691                                5 sign of xn-component
     1692                                6 x of xn-component
     1693                                7 sign of y-component
     1694                                8 y of y-component
     1695                        */
     1696                        match[1] = match[1].toLowerCase();
     1697
     1698                        if ( match[1].slice( 0, 3 ) === "nth" ) {
     1699                                // nth-* requires argument
     1700                                if ( !match[3] ) {
     1701                                        Sizzle.error( match[0] );
     1702                                }
     1703
     1704                                // numeric x and y parameters for Expr.filter.CHILD
     1705                                // remember that false/true cast respectively to 0/1
     1706                                match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
     1707                                match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
     1708
     1709                        // other types prohibit arguments
     1710                        } else if ( match[3] ) {
     1711                                Sizzle.error( match[0] );
     1712                        }
     1713
     1714                        return match;
     1715                },
     1716
     1717                "PSEUDO": function( match ) {
     1718                        var excess,
     1719                                unquoted = !match[6] && match[2];
     1720
     1721                        if ( matchExpr["CHILD"].test( match[0] ) ) {
     1722                                return null;
     1723                        }
     1724
     1725                        // Accept quoted arguments as-is
     1726                        if ( match[3] ) {
     1727                                match[2] = match[4] || match[5] || "";
     1728
     1729                        // Strip excess characters from unquoted arguments
     1730                        } else if ( unquoted && rpseudo.test( unquoted ) &&
     1731                                // Get excess from tokenize (recursively)
     1732                                (excess = tokenize( unquoted, true )) &&
     1733                                // advance to the next closing parenthesis
     1734                                (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
     1735
     1736                                // excess is a negative index
     1737                                match[0] = match[0].slice( 0, excess );
     1738                                match[2] = unquoted.slice( 0, excess );
     1739                        }
     1740
     1741                        // Return only captures needed by the pseudo filter method (type and argument)
     1742                        return match.slice( 0, 3 );
     1743                }
     1744        },
     1745
     1746        filter: {
     1747
     1748                "TAG": function( nodeNameSelector ) {
     1749                        var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
     1750                        return nodeNameSelector === "*" ?
     1751                                function() { return true; } :
     1752                                function( elem ) {
     1753                                        return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
     1754                                };
     1755                },
     1756
     1757                "CLASS": function( className ) {
     1758                        var pattern = classCache[ className + " " ];
     1759
     1760                        return pattern ||
     1761                                (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
     1762                                classCache( className, function( elem ) {
     1763                                        return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
     1764                                });
     1765                },
     1766
     1767                "ATTR": function( name, operator, check ) {
     1768                        return function( elem ) {
     1769                                var result = Sizzle.attr( elem, name );
     1770
     1771                                if ( result == null ) {
     1772                                        return operator === "!=";
     1773                                }
     1774                                if ( !operator ) {
     1775                                        return true;
     1776                                }
     1777
     1778                                result += "";
     1779
     1780                                return operator === "=" ? result === check :
     1781                                        operator === "!=" ? result !== check :
     1782                                        operator === "^=" ? check && result.indexOf( check ) === 0 :
     1783                                        operator === "*=" ? check && result.indexOf( check ) > -1 :
     1784                                        operator === "$=" ? check && result.slice( -check.length ) === check :
     1785                                        operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
     1786                                        operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
     1787                                        false;
     1788                        };
     1789                },
     1790
     1791                "CHILD": function( type, what, argument, first, last ) {
     1792                        var simple = type.slice( 0, 3 ) !== "nth",
     1793                                forward = type.slice( -4 ) !== "last",
     1794                                ofType = what === "of-type";
     1795
     1796                        return first === 1 && last === 0 ?
     1797
     1798                                // Shortcut for :nth-*(n)
     1799                                function( elem ) {
     1800                                        return !!elem.parentNode;
     1801                                } :
     1802
     1803                                function( elem, context, xml ) {
     1804                                        var cache, uniqueCache, outerCache, node, nodeIndex, start,
     1805                                                dir = simple !== forward ? "nextSibling" : "previousSibling",
     1806                                                parent = elem.parentNode,
     1807                                                name = ofType && elem.nodeName.toLowerCase(),
     1808                                                useCache = !xml && !ofType,
     1809                                                diff = false;
     1810
     1811                                        if ( parent ) {
     1812
     1813                                                // :(first|last|only)-(child|of-type)
     1814                                                if ( simple ) {
     1815                                                        while ( dir ) {
     1816                                                                node = elem;
     1817                                                                while ( (node = node[ dir ]) ) {
     1818                                                                        if ( ofType ?
     1819                                                                                node.nodeName.toLowerCase() === name :
     1820                                                                                node.nodeType === 1 ) {
     1821
     1822                                                                                return false;
     1823                                                                        }
     1824                                                                }
     1825                                                                // Reverse direction for :only-* (if we haven't yet done so)
     1826                                                                start = dir = type === "only" && !start && "nextSibling";
     1827                                                        }
     1828                                                        return true;
     1829                                                }
     1830
     1831                                                start = [ forward ? parent.firstChild : parent.lastChild ];
     1832
     1833                                                // non-xml :nth-child(...) stores cache data on `parent`
     1834                                                if ( forward && useCache ) {
     1835
     1836                                                        // Seek `elem` from a previously-cached index
     1837
     1838                                                        // ...in a gzip-friendly way
     1839                                                        node = parent;
     1840                                                        outerCache = node[ expando ] || (node[ expando ] = {});
     1841
     1842                                                        // Support: IE <9 only
     1843                                                        // Defend against cloned attroperties (jQuery gh-1709)
     1844                                                        uniqueCache = outerCache[ node.uniqueID ] ||
     1845                                                                (outerCache[ node.uniqueID ] = {});
     1846
     1847                                                        cache = uniqueCache[ type ] || [];
     1848                                                        nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
     1849                                                        diff = nodeIndex && cache[ 2 ];
     1850                                                        node = nodeIndex && parent.childNodes[ nodeIndex ];
     1851
     1852                                                        while ( (node = ++nodeIndex && node && node[ dir ] ||
     1853
     1854                                                                // Fallback to seeking `elem` from the start
     1855                                                                (diff = nodeIndex = 0) || start.pop()) ) {
     1856
     1857                                                                // When found, cache indexes on `parent` and break
     1858                                                                if ( node.nodeType === 1 && ++diff && node === elem ) {
     1859                                                                        uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
     1860                                                                        break;
     1861                                                                }
     1862                                                        }
     1863
     1864                                                } else {
     1865                                                        // Use previously-cached element index if available
     1866                                                        if ( useCache ) {
     1867                                                                // ...in a gzip-friendly way
     1868                                                                node = elem;
     1869                                                                outerCache = node[ expando ] || (node[ expando ] = {});
     1870
     1871                                                                // Support: IE <9 only
     1872                                                                // Defend against cloned attroperties (jQuery gh-1709)
     1873                                                                uniqueCache = outerCache[ node.uniqueID ] ||
     1874                                                                        (outerCache[ node.uniqueID ] = {});
     1875
     1876                                                                cache = uniqueCache[ type ] || [];
     1877                                                                nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
     1878                                                                diff = nodeIndex;
     1879                                                        }
     1880
     1881                                                        // xml :nth-child(...)
     1882                                                        // or :nth-last-child(...) or :nth(-last)?-of-type(...)
     1883                                                        if ( diff === false ) {
     1884                                                                // Use the same loop as above to seek `elem` from the start
     1885                                                                while ( (node = ++nodeIndex && node && node[ dir ] ||
     1886                                                                        (diff = nodeIndex = 0) || start.pop()) ) {
     1887
     1888                                                                        if ( ( ofType ?
     1889                                                                                node.nodeName.toLowerCase() === name :
     1890                                                                                node.nodeType === 1 ) &&
     1891                                                                                ++diff ) {
     1892
     1893                                                                                // Cache the index of each encountered element
     1894                                                                                if ( useCache ) {
     1895                                                                                        outerCache = node[ expando ] || (node[ expando ] = {});
     1896
     1897                                                                                        // Support: IE <9 only
     1898                                                                                        // Defend against cloned attroperties (jQuery gh-1709)
     1899                                                                                        uniqueCache = outerCache[ node.uniqueID ] ||
     1900                                                                                                (outerCache[ node.uniqueID ] = {});
     1901
     1902                                                                                        uniqueCache[ type ] = [ dirruns, diff ];
     1903                                                                                }
     1904
     1905                                                                                if ( node === elem ) {
     1906                                                                                        break;
     1907                                                                                }
     1908                                                                        }
     1909                                                                }
     1910                                                        }
     1911                                                }
     1912
     1913                                                // Incorporate the offset, then check against cycle size
     1914                                                diff -= last;
     1915                                                return diff === first || ( diff % first === 0 && diff / first >= 0 );
     1916                                        }
     1917                                };
     1918                },
     1919
     1920                "PSEUDO": function( pseudo, argument ) {
     1921                        // pseudo-class names are case-insensitive
     1922                        // http://www.w3.org/TR/selectors/#pseudo-classes
     1923                        // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
     1924                        // Remember that setFilters inherits from pseudos
     1925                        var args,
     1926                                fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
     1927                                        Sizzle.error( "unsupported pseudo: " + pseudo );
     1928
     1929                        // The user may use createPseudo to indicate that
     1930                        // arguments are needed to create the filter function
     1931                        // just as Sizzle does
     1932                        if ( fn[ expando ] ) {
     1933                                return fn( argument );
     1934                        }
     1935
     1936                        // But maintain support for old signatures
     1937                        if ( fn.length > 1 ) {
     1938                                args = [ pseudo, pseudo, "", argument ];
     1939                                return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
     1940                                        markFunction(function( seed, matches ) {
     1941                                                var idx,
     1942                                                        matched = fn( seed, argument ),
     1943                                                        i = matched.length;
     1944                                                while ( i-- ) {
     1945                                                        idx = indexOf( seed, matched[i] );
     1946                                                        seed[ idx ] = !( matches[ idx ] = matched[i] );
     1947                                                }
     1948                                        }) :
     1949                                        function( elem ) {
     1950                                                return fn( elem, 0, args );
     1951                                        };
     1952                        }
     1953
     1954                        return fn;
     1955                }
     1956        },
     1957
     1958        pseudos: {
     1959                // Potentially complex pseudos
     1960                "not": markFunction(function( selector ) {
     1961                        // Trim the selector passed to compile
     1962                        // to avoid treating leading and trailing
     1963                        // spaces as combinators
     1964                        var input = [],
     1965                                results = [],
     1966                                matcher = compile( selector.replace( rtrim, "$1" ) );
     1967
     1968                        return matcher[ expando ] ?
     1969                                markFunction(function( seed, matches, context, xml ) {
     1970                                        var elem,
     1971                                                unmatched = matcher( seed, null, xml, [] ),
     1972                                                i = seed.length;
     1973
     1974                                        // Match elements unmatched by `matcher`
     1975                                        while ( i-- ) {
     1976                                                if ( (elem = unmatched[i]) ) {
     1977                                                        seed[i] = !(matches[i] = elem);
     1978                                                }
     1979                                        }
     1980                                }) :
     1981                                function( elem, context, xml ) {
     1982                                        input[0] = elem;
     1983                                        matcher( input, null, xml, results );
     1984                                        // Don't keep the element (issue #299)
     1985                                        input[0] = null;
     1986                                        return !results.pop();
     1987                                };
     1988                }),
     1989
     1990                "has": markFunction(function( selector ) {
     1991                        return function( elem ) {
     1992                                return Sizzle( selector, elem ).length > 0;
     1993                        };
     1994                }),
     1995
     1996                "contains": markFunction(function( text ) {
     1997                        text = text.replace( runescape, funescape );
     1998                        return function( elem ) {
     1999                                return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
     2000                        };
     2001                }),
     2002
     2003                // "Whether an element is represented by a :lang() selector
     2004                // is based solely on the element's language value
     2005                // being equal to the identifier C,
     2006                // or beginning with the identifier C immediately followed by "-".
     2007                // The matching of C against the element's language value is performed case-insensitively.
     2008                // The identifier C does not have to be a valid language name."
     2009                // http://www.w3.org/TR/selectors/#lang-pseudo
     2010                "lang": markFunction( function( lang ) {
     2011                        // lang value must be a valid identifier
     2012                        if ( !ridentifier.test(lang || "") ) {
     2013                                Sizzle.error( "unsupported lang: " + lang );
     2014                        }
     2015                        lang = lang.replace( runescape, funescape ).toLowerCase();
     2016                        return function( elem ) {
     2017                                var elemLang;
     2018                                do {
     2019                                        if ( (elemLang = documentIsHTML ?
     2020                                                elem.lang :
     2021                                                elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
     2022
     2023                                                elemLang = elemLang.toLowerCase();
     2024                                                return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
     2025                                        }
     2026                                } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
     2027                                return false;
     2028                        };
     2029                }),
     2030
     2031                // Miscellaneous
     2032                "target": function( elem ) {
     2033                        var hash = window.location && window.location.hash;
     2034                        return hash && hash.slice( 1 ) === elem.id;
     2035                },
     2036
     2037                "root": function( elem ) {
     2038                        return elem === docElem;
     2039                },
     2040
     2041                "focus": function( elem ) {
     2042                        return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
     2043                },
     2044
     2045                // Boolean properties
     2046                "enabled": createDisabledPseudo( false ),
     2047                "disabled": createDisabledPseudo( true ),
     2048
     2049                "checked": function( elem ) {
     2050                        // In CSS3, :checked should return both checked and selected elements
     2051                        // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
     2052                        var nodeName = elem.nodeName.toLowerCase();
     2053                        return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
     2054                },
     2055
     2056                "selected": function( elem ) {
     2057                        // Accessing this property makes selected-by-default
     2058                        // options in Safari work properly
     2059                        if ( elem.parentNode ) {
     2060                                elem.parentNode.selectedIndex;
     2061                        }
     2062
     2063                        return elem.selected === true;
     2064                },
     2065
     2066                // Contents
     2067                "empty": function( elem ) {
     2068                        // http://www.w3.org/TR/selectors/#empty-pseudo
     2069                        // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
     2070                        //   but not by others (comment: 8; processing instruction: 7; etc.)
     2071                        // nodeType < 6 works because attributes (2) do not appear as children
     2072                        for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
     2073                                if ( elem.nodeType < 6 ) {
     2074                                        return false;
     2075                                }
     2076                        }
     2077                        return true;
     2078                },
     2079
     2080                "parent": function( elem ) {
     2081                        return !Expr.pseudos["empty"]( elem );
     2082                },
     2083
     2084                // Element/input types
     2085                "header": function( elem ) {
     2086                        return rheader.test( elem.nodeName );
     2087                },
     2088
     2089                "input": function( elem ) {
     2090                        return rinputs.test( elem.nodeName );
     2091                },
     2092
     2093                "button": function( elem ) {
     2094                        var name = elem.nodeName.toLowerCase();
     2095                        return name === "input" && elem.type === "button" || name === "button";
     2096                },
     2097
     2098                "text": function( elem ) {
     2099                        var attr;
     2100                        return elem.nodeName.toLowerCase() === "input" &&
     2101                                elem.type === "text" &&
     2102
     2103                                // Support: IE<8
     2104                                // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
     2105                                ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
     2106                },
     2107
     2108                // Position-in-collection
     2109                "first": createPositionalPseudo(function() {
     2110                        return [ 0 ];
     2111                }),
     2112
     2113                "last": createPositionalPseudo(function( matchIndexes, length ) {
     2114                        return [ length - 1 ];
     2115                }),
     2116
     2117                "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
     2118                        return [ argument < 0 ? argument + length : argument ];
     2119                }),
     2120
     2121                "even": createPositionalPseudo(function( matchIndexes, length ) {
     2122                        var i = 0;
     2123                        for ( ; i < length; i += 2 ) {
     2124                                matchIndexes.push( i );
     2125                        }
     2126                        return matchIndexes;
     2127                }),
     2128
     2129                "odd": createPositionalPseudo(function( matchIndexes, length ) {
     2130                        var i = 1;
     2131                        for ( ; i < length; i += 2 ) {
     2132                                matchIndexes.push( i );
     2133                        }
     2134                        return matchIndexes;
     2135                }),
     2136
     2137                "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
     2138                        var i = argument < 0 ? argument + length : argument;
     2139                        for ( ; --i >= 0; ) {
     2140                                matchIndexes.push( i );
     2141                        }
     2142                        return matchIndexes;
     2143                }),
     2144
     2145                "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
     2146                        var i = argument < 0 ? argument + length : argument;
     2147                        for ( ; ++i < length; ) {
     2148                                matchIndexes.push( i );
     2149                        }
     2150                        return matchIndexes;
     2151                })
     2152        }
     2153};
     2154
     2155Expr.pseudos["nth"] = Expr.pseudos["eq"];
     2156
     2157// Add button/input type pseudos
     2158for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
     2159        Expr.pseudos[ i ] = createInputPseudo( i );
     2160}
     2161for ( i in { submit: true, reset: true } ) {
     2162        Expr.pseudos[ i ] = createButtonPseudo( i );
     2163}
     2164
     2165// Easy API for creating new setFilters
     2166function setFilters() {}
     2167setFilters.prototype = Expr.filters = Expr.pseudos;
     2168Expr.setFilters = new setFilters();
     2169
     2170tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
     2171        var matched, match, tokens, type,
     2172                soFar, groups, preFilters,
     2173                cached = tokenCache[ selector + " " ];
     2174
     2175        if ( cached ) {
     2176                return parseOnly ? 0 : cached.slice( 0 );
     2177        }
     2178
     2179        soFar = selector;
     2180        groups = [];
     2181        preFilters = Expr.preFilter;
     2182
     2183        while ( soFar ) {
     2184
     2185                // Comma and first run
     2186                if ( !matched || (match = rcomma.exec( soFar )) ) {
     2187                        if ( match ) {
     2188                                // Don't consume trailing commas as valid
     2189                                soFar = soFar.slice( match[0].length ) || soFar;
     2190                        }
     2191                        groups.push( (tokens = []) );
     2192                }
     2193
     2194                matched = false;
     2195
     2196                // Combinators
     2197                if ( (match = rcombinators.exec( soFar )) ) {
     2198                        matched = match.shift();
     2199                        tokens.push({
     2200                                value: matched,
     2201                                // Cast descendant combinators to space
     2202                                type: match[0].replace( rtrim, " " )
     2203                        });
     2204                        soFar = soFar.slice( matched.length );
     2205                }
     2206
     2207                // Filters
     2208                for ( type in Expr.filter ) {
     2209                        if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
     2210                                (match = preFilters[ type ]( match ))) ) {
     2211                                matched = match.shift();
     2212                                tokens.push({
     2213                                        value: matched,
     2214                                        type: type,
     2215                                        matches: match
     2216                                });
     2217                                soFar = soFar.slice( matched.length );
     2218                        }
     2219                }
     2220
     2221                if ( !matched ) {
     2222                        break;
     2223                }
     2224        }
     2225
     2226        // Return the length of the invalid excess
     2227        // if we're just parsing
     2228        // Otherwise, throw an error or return tokens
     2229        return parseOnly ?
     2230                soFar.length :
     2231                soFar ?
     2232                        Sizzle.error( selector ) :
     2233                        // Cache the tokens
     2234                        tokenCache( selector, groups ).slice( 0 );
     2235};
     2236
     2237function toSelector( tokens ) {
     2238        var i = 0,
     2239                len = tokens.length,
     2240                selector = "";
     2241        for ( ; i < len; i++ ) {
     2242                selector += tokens[i].value;
     2243        }
     2244        return selector;
     2245}
     2246
     2247function addCombinator( matcher, combinator, base ) {
     2248        var dir = combinator.dir,
     2249                skip = combinator.next,
     2250                key = skip || dir,
     2251                checkNonElements = base && key === "parentNode",
     2252                doneName = done++;
     2253
     2254        return combinator.first ?
     2255                // Check against closest ancestor/preceding element
     2256                function( elem, context, xml ) {
     2257                        while ( (elem = elem[ dir ]) ) {
     2258                                if ( elem.nodeType === 1 || checkNonElements ) {
     2259                                        return matcher( elem, context, xml );
     2260                                }
     2261                        }
     2262                        return false;
     2263                } :
     2264
     2265                // Check against all ancestor/preceding elements
     2266                function( elem, context, xml ) {
     2267                        var oldCache, uniqueCache, outerCache,
     2268                                newCache = [ dirruns, doneName ];
     2269
     2270                        // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
     2271                        if ( xml ) {
     2272                                while ( (elem = elem[ dir ]) ) {
     2273                                        if ( elem.nodeType === 1 || checkNonElements ) {
     2274                                                if ( matcher( elem, context, xml ) ) {
     2275                                                        return true;
     2276                                                }
     2277                                        }
     2278                                }
     2279                        } else {
     2280                                while ( (elem = elem[ dir ]) ) {
     2281                                        if ( elem.nodeType === 1 || checkNonElements ) {
     2282                                                outerCache = elem[ expando ] || (elem[ expando ] = {});
     2283
     2284                                                // Support: IE <9 only
     2285                                                // Defend against cloned attroperties (jQuery gh-1709)
     2286                                                uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
     2287
     2288                                                if ( skip && skip === elem.nodeName.toLowerCase() ) {
     2289                                                        elem = elem[ dir ] || elem;
     2290                                                } else if ( (oldCache = uniqueCache[ key ]) &&
     2291                                                        oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
     2292
     2293                                                        // Assign to newCache so results back-propagate to previous elements
     2294                                                        return (newCache[ 2 ] = oldCache[ 2 ]);
     2295                                                } else {
     2296                                                        // Reuse newcache so results back-propagate to previous elements
     2297                                                        uniqueCache[ key ] = newCache;
     2298
     2299                                                        // A match means we're done; a fail means we have to keep checking
     2300                                                        if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
     2301                                                                return true;
     2302                                                        }
     2303                                                }
     2304                                        }
     2305                                }
     2306                        }
     2307                        return false;
     2308                };
     2309}
     2310
     2311function elementMatcher( matchers ) {
     2312        return matchers.length > 1 ?
     2313                function( elem, context, xml ) {
     2314                        var i = matchers.length;
     2315                        while ( i-- ) {
     2316                                if ( !matchers[i]( elem, context, xml ) ) {
     2317                                        return false;
     2318                                }
     2319                        }
     2320                        return true;
     2321                } :
     2322                matchers[0];
     2323}
     2324
     2325function multipleContexts( selector, contexts, results ) {
     2326        var i = 0,
     2327                len = contexts.length;
     2328        for ( ; i < len; i++ ) {
     2329                Sizzle( selector, contexts[i], results );
     2330        }
     2331        return results;
     2332}
     2333
     2334function condense( unmatched, map, filter, context, xml ) {
     2335        var elem,
     2336                newUnmatched = [],
     2337                i = 0,
     2338                len = unmatched.length,
     2339                mapped = map != null;
     2340
     2341        for ( ; i < len; i++ ) {
     2342                if ( (elem = unmatched[i]) ) {
     2343                        if ( !filter || filter( elem, context, xml ) ) {
     2344                                newUnmatched.push( elem );
     2345                                if ( mapped ) {
     2346                                        map.push( i );
     2347                                }
     2348                        }
     2349                }
     2350        }
     2351
     2352        return newUnmatched;
     2353}
     2354
     2355function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
     2356        if ( postFilter && !postFilter[ expando ] ) {
     2357                postFilter = setMatcher( postFilter );
     2358        }
     2359        if ( postFinder && !postFinder[ expando ] ) {
     2360                postFinder = setMatcher( postFinder, postSelector );
     2361        }
     2362        return markFunction(function( seed, results, context, xml ) {
     2363                var temp, i, elem,
     2364                        preMap = [],
     2365                        postMap = [],
     2366                        preexisting = results.length,
     2367
     2368                        // Get initial elements from seed or context
     2369                        elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
     2370
     2371                        // Prefilter to get matcher input, preserving a map for seed-results synchronization
     2372                        matcherIn = preFilter && ( seed || !selector ) ?
     2373                                condense( elems, preMap, preFilter, context, xml ) :
     2374                                elems,
     2375
     2376                        matcherOut = matcher ?
     2377                                // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
     2378                                postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
     2379
     2380                                        // ...intermediate processing is necessary
     2381                                        [] :
     2382
     2383                                        // ...otherwise use results directly
     2384                                        results :
     2385                                matcherIn;
     2386
     2387                // Find primary matches
     2388                if ( matcher ) {
     2389                        matcher( matcherIn, matcherOut, context, xml );
     2390                }
     2391
     2392                // Apply postFilter
     2393                if ( postFilter ) {
     2394                        temp = condense( matcherOut, postMap );
     2395                        postFilter( temp, [], context, xml );
     2396
     2397                        // Un-match failing elements by moving them back to matcherIn
     2398                        i = temp.length;
     2399                        while ( i-- ) {
     2400                                if ( (elem = temp[i]) ) {
     2401                                        matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
     2402                                }
     2403                        }
     2404                }
     2405
     2406                if ( seed ) {
     2407                        if ( postFinder || preFilter ) {
     2408                                if ( postFinder ) {
     2409                                        // Get the final matcherOut by condensing this intermediate into postFinder contexts
     2410                                        temp = [];
     2411                                        i = matcherOut.length;
     2412                                        while ( i-- ) {
     2413                                                if ( (elem = matcherOut[i]) ) {
     2414                                                        // Restore matcherIn since elem is not yet a final match
     2415                                                        temp.push( (matcherIn[i] = elem) );
     2416                                                }
     2417                                        }
     2418                                        postFinder( null, (matcherOut = []), temp, xml );
     2419                                }
     2420
     2421                                // Move matched elements from seed to results to keep them synchronized
     2422                                i = matcherOut.length;
     2423                                while ( i-- ) {
     2424                                        if ( (elem = matcherOut[i]) &&
     2425                                                (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
     2426
     2427                                                seed[temp] = !(results[temp] = elem);
     2428                                        }
     2429                                }
     2430                        }
     2431
     2432                // Add elements to results, through postFinder if defined
     2433                } else {
     2434                        matcherOut = condense(
     2435                                matcherOut === results ?
     2436                                        matcherOut.splice( preexisting, matcherOut.length ) :
     2437                                        matcherOut
     2438                        );
     2439                        if ( postFinder ) {
     2440                                postFinder( null, results, matcherOut, xml );
     2441                        } else {
     2442                                push.apply( results, matcherOut );
     2443                        }
     2444                }
     2445        });
     2446}
     2447
     2448function matcherFromTokens( tokens ) {
     2449        var checkContext, matcher, j,
     2450                len = tokens.length,
     2451                leadingRelative = Expr.relative[ tokens[0].type ],
     2452                implicitRelative = leadingRelative || Expr.relative[" "],
     2453                i = leadingRelative ? 1 : 0,
     2454
     2455                // The foundational matcher ensures that elements are reachable from top-level context(s)
     2456                matchContext = addCombinator( function( elem ) {
     2457                        return elem === checkContext;
     2458                }, implicitRelative, true ),
     2459                matchAnyContext = addCombinator( function( elem ) {
     2460                        return indexOf( checkContext, elem ) > -1;
     2461                }, implicitRelative, true ),
     2462                matchers = [ function( elem, context, xml ) {
     2463                        var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
     2464                                (checkContext = context).nodeType ?
     2465                                        matchContext( elem, context, xml ) :
     2466                                        matchAnyContext( elem, context, xml ) );
     2467                        // Avoid hanging onto element (issue #299)
     2468                        checkContext = null;
     2469                        return ret;
     2470                } ];
     2471
     2472        for ( ; i < len; i++ ) {
     2473                if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
     2474                        matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
     2475                } else {
     2476                        matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
     2477
     2478                        // Return special upon seeing a positional matcher
     2479                        if ( matcher[ expando ] ) {
     2480                                // Find the next relative operator (if any) for proper handling
     2481                                j = ++i;
     2482                                for ( ; j < len; j++ ) {
     2483                                        if ( Expr.relative[ tokens[j].type ] ) {
     2484                                                break;
     2485                                        }
     2486                                }
     2487                                return setMatcher(
     2488                                        i > 1 && elementMatcher( matchers ),
     2489                                        i > 1 && toSelector(
     2490                                                // If the preceding token was a descendant combinator, insert an implicit any-element `*`
     2491                                                tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
     2492                                        ).replace( rtrim, "$1" ),
     2493                                        matcher,
     2494                                        i < j && matcherFromTokens( tokens.slice( i, j ) ),
     2495                                        j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
     2496                                        j < len && toSelector( tokens )
     2497                                );
     2498                        }
     2499                        matchers.push( matcher );
     2500                }
     2501        }
     2502
     2503        return elementMatcher( matchers );
     2504}
     2505
     2506function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
     2507        var bySet = setMatchers.length > 0,
     2508                byElement = elementMatchers.length > 0,
     2509                superMatcher = function( seed, context, xml, results, outermost ) {
     2510                        var elem, j, matcher,
     2511                                matchedCount = 0,
     2512                                i = "0",
     2513                                unmatched = seed && [],
     2514                                setMatched = [],
     2515                                contextBackup = outermostContext,
     2516                                // We must always have either seed elements or outermost context
     2517                                elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
     2518                                // Use integer dirruns iff this is the outermost matcher
     2519                                dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
     2520                                len = elems.length;
     2521
     2522                        if ( outermost ) {
     2523                                outermostContext = context === document || context || outermost;
     2524                        }
     2525
     2526                        // Add elements passing elementMatchers directly to results
     2527                        // Support: IE<9, Safari
     2528                        // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
     2529                        for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
     2530                                if ( byElement && elem ) {
     2531                                        j = 0;
     2532                                        if ( !context && elem.ownerDocument !== document ) {
     2533                                                setDocument( elem );
     2534                                                xml = !documentIsHTML;
     2535                                        }
     2536                                        while ( (matcher = elementMatchers[j++]) ) {
     2537                                                if ( matcher( elem, context || document, xml) ) {
     2538                                                        results.push( elem );
     2539                                                        break;
     2540                                                }
     2541                                        }
     2542                                        if ( outermost ) {
     2543                                                dirruns = dirrunsUnique;
     2544                                        }
     2545                                }
     2546
     2547                                // Track unmatched elements for set filters
     2548                                if ( bySet ) {
     2549                                        // They will have gone through all possible matchers
     2550                                        if ( (elem = !matcher && elem) ) {
     2551                                                matchedCount--;
     2552                                        }
     2553
     2554                                        // Lengthen the array for every element, matched or not
     2555                                        if ( seed ) {
     2556                                                unmatched.push( elem );
     2557                                        }
     2558                                }
     2559                        }
     2560
     2561                        // `i` is now the count of elements visited above, and adding it to `matchedCount`
     2562                        // makes the latter nonnegative.
     2563                        matchedCount += i;
     2564
     2565                        // Apply set filters to unmatched elements
     2566                        // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
     2567                        // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
     2568                        // no element matchers and no seed.
     2569                        // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
     2570                        // case, which will result in a "00" `matchedCount` that differs from `i` but is also
     2571                        // numerically zero.
     2572                        if ( bySet && i !== matchedCount ) {
     2573                                j = 0;
     2574                                while ( (matcher = setMatchers[j++]) ) {
     2575                                        matcher( unmatched, setMatched, context, xml );
     2576                                }
     2577
     2578                                if ( seed ) {
     2579                                        // Reintegrate element matches to eliminate the need for sorting
     2580                                        if ( matchedCount > 0 ) {
     2581                                                while ( i-- ) {
     2582                                                        if ( !(unmatched[i] || setMatched[i]) ) {
     2583                                                                setMatched[i] = pop.call( results );
     2584                                                        }
     2585                                                }
     2586                                        }
     2587
     2588                                        // Discard index placeholder values to get only actual matches
     2589                                        setMatched = condense( setMatched );
     2590                                }
     2591
     2592                                // Add matches to results
     2593                                push.apply( results, setMatched );
     2594
     2595                                // Seedless set matches succeeding multiple successful matchers stipulate sorting
     2596                                if ( outermost && !seed && setMatched.length > 0 &&
     2597                                        ( matchedCount + setMatchers.length ) > 1 ) {
     2598
     2599                                        Sizzle.uniqueSort( results );
     2600                                }
     2601                        }
     2602
     2603                        // Override manipulation of globals by nested matchers
     2604                        if ( outermost ) {
     2605                                dirruns = dirrunsUnique;
     2606                                outermostContext = contextBackup;
     2607                        }
     2608
     2609                        return unmatched;
     2610                };
     2611
     2612        return bySet ?
     2613                markFunction( superMatcher ) :
     2614                superMatcher;
     2615}
     2616
     2617compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
     2618        var i,
     2619                setMatchers = [],
     2620                elementMatchers = [],
     2621                cached = compilerCache[ selector + " " ];
     2622
     2623        if ( !cached ) {
     2624                // Generate a function of recursive functions that can be used to check each element
     2625                if ( !match ) {
     2626                        match = tokenize( selector );
     2627                }
     2628                i = match.length;
     2629                while ( i-- ) {
     2630                        cached = matcherFromTokens( match[i] );
     2631                        if ( cached[ expando ] ) {
     2632                                setMatchers.push( cached );
     2633                        } else {
     2634                                elementMatchers.push( cached );
     2635                        }
     2636                }
     2637
     2638                // Cache the compiled function
     2639                cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
     2640
     2641                // Save selector and tokenization
     2642                cached.selector = selector;
     2643        }
     2644        return cached;
     2645};
     2646
     2647/**
     2648 * A low-level selection function that works with Sizzle's compiled
     2649 *  selector functions
     2650 * @param {String|Function} selector A selector or a pre-compiled
     2651 *  selector function built with Sizzle.compile
     2652 * @param {Element} context
     2653 * @param {Array} [results]
     2654 * @param {Array} [seed] A set of elements to match against
     2655 */
     2656select = Sizzle.select = function( selector, context, results, seed ) {
     2657        var i, tokens, token, type, find,
     2658                compiled = typeof selector === "function" && selector,
     2659                match = !seed && tokenize( (selector = compiled.selector || selector) );
     2660
     2661        results = results || [];
     2662
     2663        // Try to minimize operations if there is only one selector in the list and no seed
     2664        // (the latter of which guarantees us context)
     2665        if ( match.length === 1 ) {
     2666
     2667                // Reduce context if the leading compound selector is an ID
     2668                tokens = match[0] = match[0].slice( 0 );
     2669                if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
     2670                                context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
     2671
     2672                        context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
     2673                        if ( !context ) {
     2674                                return results;
     2675
     2676                        // Precompiled matchers will still verify ancestry, so step up a level
     2677                        } else if ( compiled ) {
     2678                                context = context.parentNode;
     2679                        }
     2680
     2681                        selector = selector.slice( tokens.shift().value.length );
     2682                }
     2683
     2684                // Fetch a seed set for right-to-left matching
     2685                i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
     2686                while ( i-- ) {
     2687                        token = tokens[i];
     2688
     2689                        // Abort if we hit a combinator
     2690                        if ( Expr.relative[ (type = token.type) ] ) {
     2691                                break;
     2692                        }
     2693                        if ( (find = Expr.find[ type ]) ) {
     2694                                // Search, expanding context for leading sibling combinators
     2695                                if ( (seed = find(
     2696                                        token.matches[0].replace( runescape, funescape ),
     2697                                        rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
     2698                                )) ) {
     2699
     2700                                        // If seed is empty or no tokens remain, we can return early
     2701                                        tokens.splice( i, 1 );
     2702                                        selector = seed.length && toSelector( tokens );
     2703                                        if ( !selector ) {
     2704                                                push.apply( results, seed );
     2705                                                return results;
     2706                                        }
     2707
     2708                                        break;
     2709                                }
     2710                        }
     2711                }
     2712        }
     2713
     2714        // Compile and execute a filtering function if one is not provided
     2715        // Provide `match` to avoid retokenization if we modified the selector above
     2716        ( compiled || compile( selector, match ) )(
     2717                seed,
     2718                context,
     2719                !documentIsHTML,
     2720                results,
     2721                !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
     2722        );
     2723        return results;
     2724};
     2725
     2726// One-time assignments
     2727
     2728// Sort stability
     2729support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
     2730
     2731// Support: Chrome 14-35+
     2732// Always assume duplicates if they aren't passed to the comparison function
     2733support.detectDuplicates = !!hasDuplicate;
     2734
     2735// Initialize against the default document
     2736setDocument();
     2737
     2738// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
     2739// Detached nodes confoundingly follow *each other*
     2740support.sortDetached = assert(function( el ) {
     2741        // Should return 1, but returns 4 (following)
     2742        return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
     2743});
     2744
     2745// Support: IE<8
     2746// Prevent attribute/property "interpolation"
     2747// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
     2748if ( !assert(function( el ) {
     2749        el.innerHTML = "<a href='#'></a>";
     2750        return el.firstChild.getAttribute("href") === "#" ;
     2751}) ) {
     2752        addHandle( "type|href|height|width", function( elem, name, isXML ) {
     2753                if ( !isXML ) {
     2754                        return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
     2755                }
     2756        });
     2757}
     2758
     2759// Support: IE<9
     2760// Use defaultValue in place of getAttribute("value")
     2761if ( !support.attributes || !assert(function( el ) {
     2762        el.innerHTML = "<input/>";
     2763        el.firstChild.setAttribute( "value", "" );
     2764        return el.firstChild.getAttribute( "value" ) === "";
     2765}) ) {
     2766        addHandle( "value", function( elem, name, isXML ) {
     2767                if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
     2768                        return elem.defaultValue;
     2769                }
     2770        });
     2771}
     2772
     2773// Support: IE<9
     2774// Use getAttributeNode to fetch booleans when getAttribute lies
     2775if ( !assert(function( el ) {
     2776        return el.getAttribute("disabled") == null;
     2777}) ) {
     2778        addHandle( booleans, function( elem, name, isXML ) {
     2779                var val;
     2780                if ( !isXML ) {
     2781                        return elem[ name ] === true ? name.toLowerCase() :
     2782                                        (val = elem.getAttributeNode( name )) && val.specified ?
     2783                                        val.value :
     2784                                null;
     2785                }
     2786        });
     2787}
     2788
     2789return Sizzle;
     2790
     2791})( window );
     2792
     2793
     2794
     2795jQuery.find = Sizzle;
     2796jQuery.expr = Sizzle.selectors;
     2797
     2798// Deprecated
     2799jQuery.expr[ ":" ] = jQuery.expr.pseudos;
     2800jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
     2801jQuery.text = Sizzle.getText;
     2802jQuery.isXMLDoc = Sizzle.isXML;
     2803jQuery.contains = Sizzle.contains;
     2804jQuery.escapeSelector = Sizzle.escape;
     2805
     2806
     2807
     2808
     2809var dir = function( elem, dir, until ) {
     2810        var matched = [],
     2811                truncate = until !== undefined;
     2812
     2813        while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
     2814                if ( elem.nodeType === 1 ) {
     2815                        if ( truncate && jQuery( elem ).is( until ) ) {
     2816                                break;
     2817                        }
     2818                        matched.push( elem );
     2819                }
     2820        }
     2821        return matched;
     2822};
     2823
     2824
     2825var siblings = function( n, elem ) {
     2826        var matched = [];
     2827
     2828        for ( ; n; n = n.nextSibling ) {
     2829                if ( n.nodeType === 1 && n !== elem ) {
     2830                        matched.push( n );
     2831                }
     2832        }
     2833
     2834        return matched;
     2835};
     2836
     2837
     2838var rneedsContext = jQuery.expr.match.needsContext;
     2839
     2840
     2841
     2842function nodeName( elem, name ) {
     2843
     2844  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
     2845
     2846};
     2847var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
     2848
     2849
     2850
     2851var risSimple = /^.[^:#\[\.,]*$/;
     2852
     2853// Implement the identical functionality for filter and not
     2854function winnow( elements, qualifier, not ) {
     2855        if ( jQuery.isFunction( qualifier ) ) {
     2856                return jQuery.grep( elements, function( elem, i ) {
     2857                        return !!qualifier.call( elem, i, elem ) !== not;
     2858                } );
     2859        }
     2860
     2861        // Single element
     2862        if ( qualifier.nodeType ) {
     2863                return jQuery.grep( elements, function( elem ) {
     2864                        return ( elem === qualifier ) !== not;
     2865                } );
     2866        }
     2867
     2868        // Arraylike of elements (jQuery, arguments, Array)
     2869        if ( typeof qualifier !== "string" ) {
     2870                return jQuery.grep( elements, function( elem ) {
     2871                        return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
     2872                } );
     2873        }
     2874
     2875        // Simple selector that can be filtered directly, removing non-Elements
     2876        if ( risSimple.test( qualifier ) ) {
     2877                return jQuery.filter( qualifier, elements, not );
     2878        }
     2879
     2880        // Complex selector, compare the two sets, removing non-Elements
     2881        qualifier = jQuery.filter( qualifier, elements );
     2882        return jQuery.grep( elements, function( elem ) {
     2883                return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
     2884        } );
     2885}
     2886
     2887jQuery.filter = function( expr, elems, not ) {
     2888        var elem = elems[ 0 ];
     2889
     2890        if ( not ) {
     2891                expr = ":not(" + expr + ")";
     2892        }
     2893
     2894        if ( elems.length === 1 && elem.nodeType === 1 ) {
     2895                return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
     2896        }
     2897
     2898        return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
     2899                return elem.nodeType === 1;
     2900        } ) );
     2901};
     2902
     2903jQuery.fn.extend( {
     2904        find: function( selector ) {
     2905                var i, ret,
     2906                        len = this.length,
     2907                        self = this;
     2908
     2909                if ( typeof selector !== "string" ) {
     2910                        return this.pushStack( jQuery( selector ).filter( function() {
     2911                                for ( i = 0; i < len; i++ ) {
     2912                                        if ( jQuery.contains( self[ i ], this ) ) {
     2913                                                return true;
     2914                                        }
     2915                                }
     2916                        } ) );
     2917                }
     2918
     2919                ret = this.pushStack( [] );
     2920
     2921                for ( i = 0; i < len; i++ ) {
     2922                        jQuery.find( selector, self[ i ], ret );
     2923                }
     2924
     2925                return len > 1 ? jQuery.uniqueSort( ret ) : ret;
     2926        },
     2927        filter: function( selector ) {
     2928                return this.pushStack( winnow( this, selector || [], false ) );
     2929        },
     2930        not: function( selector ) {
     2931                return this.pushStack( winnow( this, selector || [], true ) );
     2932        },
     2933        is: function( selector ) {
     2934                return !!winnow(
     2935                        this,
     2936
     2937                        // If this is a positional/relative selector, check membership in the returned set
     2938                        // so $("p:first").is("p:last") won't return true for a doc with two "p".
     2939                        typeof selector === "string" && rneedsContext.test( selector ) ?
     2940                                jQuery( selector ) :
     2941                                selector || [],
     2942                        false
     2943                ).length;
     2944        }
     2945} );
     2946
     2947
     2948// Initialize a jQuery object
     2949
     2950
     2951// A central reference to the root jQuery(document)
     2952var rootjQuery,
     2953
     2954        // A simple way to check for HTML strings
     2955        // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
     2956        // Strict HTML recognition (#11290: must start with <)
     2957        // Shortcut simple #id case for speed
     2958        rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
     2959
     2960        init = jQuery.fn.init = function( selector, context, root ) {
     2961                var match, elem;
     2962
     2963                // HANDLE: $(""), $(null), $(undefined), $(false)
     2964                if ( !selector ) {
     2965                        return this;
     2966                }
     2967
     2968                // Method init() accepts an alternate rootjQuery
     2969                // so migrate can support jQuery.sub (gh-2101)
     2970                root = root || rootjQuery;
     2971
     2972                // Handle HTML strings
     2973                if ( typeof selector === "string" ) {
     2974                        if ( selector[ 0 ] === "<" &&
     2975                                selector[ selector.length - 1 ] === ">" &&
     2976                                selector.length >= 3 ) {
     2977
     2978                                // Assume that strings that start and end with <> are HTML and skip the regex check
     2979                                match = [ null, selector, null ];
     2980
     2981                        } else {
     2982                                match = rquickExpr.exec( selector );
     2983                        }
     2984
     2985                        // Match html or make sure no context is specified for #id
     2986                        if ( match && ( match[ 1 ] || !context ) ) {
     2987
     2988                                // HANDLE: $(html) -> $(array)
     2989                                if ( match[ 1 ] ) {
     2990                                        context = context instanceof jQuery ? context[ 0 ] : context;
     2991
     2992                                        // Option to run scripts is true for back-compat
     2993                                        // Intentionally let the error be thrown if parseHTML is not present
     2994                                        jQuery.merge( this, jQuery.parseHTML(
     2995                                                match[ 1 ],
     2996                                                context && context.nodeType ? context.ownerDocument || context : document,
     2997                                                true
     2998                                        ) );
     2999
     3000                                        // HANDLE: $(html, props)
     3001                                        if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
     3002                                                for ( match in context ) {
     3003
     3004                                                        // Properties of context are called as methods if possible
     3005                                                        if ( jQuery.isFunction( this[ match ] ) ) {
     3006                                                                this[ match ]( context[ match ] );
     3007
     3008                                                        // ...and otherwise set as attributes
     3009                                                        } else {
     3010                                                                this.attr( match, context[ match ] );
     3011                                                        }
     3012                                                }
     3013                                        }
     3014
     3015                                        return this;
     3016
     3017                                // HANDLE: $(#id)
     3018                                } else {
     3019                                        elem = document.getElementById( match[ 2 ] );
     3020
     3021                                        if ( elem ) {
     3022
     3023                                                // Inject the element directly into the jQuery object
     3024                                                this[ 0 ] = elem;
     3025                                                this.length = 1;
     3026                                        }
     3027                                        return this;
     3028                                }
     3029
     3030                        // HANDLE: $(expr, $(...))
     3031                        } else if ( !context || context.jquery ) {
     3032                                return ( context || root ).find( selector );
     3033
     3034                        // HANDLE: $(expr, context)
     3035                        // (which is just equivalent to: $(context).find(expr)
     3036                        } else {
     3037                                return this.constructor( context ).find( selector );
     3038                        }
     3039
     3040                // HANDLE: $(DOMElement)
     3041                } else if ( selector.nodeType ) {
     3042                        this[ 0 ] = selector;
     3043                        this.length = 1;
     3044                        return this;
     3045
     3046                // HANDLE: $(function)
     3047                // Shortcut for document ready
     3048                } else if ( jQuery.isFunction( selector ) ) {
     3049                        return root.ready !== undefined ?
     3050                                root.ready( selector ) :
     3051
     3052                                // Execute immediately if ready is not present
     3053                                selector( jQuery );
     3054                }
     3055
     3056                return jQuery.makeArray( selector, this );
     3057        };
     3058
     3059// Give the init function the jQuery prototype for later instantiation
     3060init.prototype = jQuery.fn;
     3061
     3062// Initialize central reference
     3063rootjQuery = jQuery( document );
     3064
     3065
     3066var rparentsprev = /^(?:parents|prev(?:Until|All))/,
     3067
     3068        // Methods guaranteed to produce a unique set when starting from a unique set
     3069        guaranteedUnique = {
     3070                children: true,
     3071                contents: true,
     3072                next: true,
     3073                prev: true
     3074        };
     3075
     3076jQuery.fn.extend( {
     3077        has: function( target ) {
     3078                var targets = jQuery( target, this ),
     3079                        l = targets.length;
     3080
     3081                return this.filter( function() {
     3082                        var i = 0;
     3083                        for ( ; i < l; i++ ) {
     3084                                if ( jQuery.contains( this, targets[ i ] ) ) {
     3085                                        return true;
     3086                                }
     3087                        }
     3088                } );
     3089        },
     3090
     3091        closest: function( selectors, context ) {
     3092                var cur,
     3093                        i = 0,
     3094                        l = this.length,
     3095                        matched = [],
     3096                        targets = typeof selectors !== "string" && jQuery( selectors );
     3097
     3098                // Positional selectors never match, since there's no _selection_ context
     3099                if ( !rneedsContext.test( selectors ) ) {
     3100                        for ( ; i < l; i++ ) {
     3101                                for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
     3102
     3103                                        // Always skip document fragments
     3104                                        if ( cur.nodeType < 11 && ( targets ?
     3105                                                targets.index( cur ) > -1 :
     3106
     3107                                                // Don't pass non-elements to Sizzle
     3108                                                cur.nodeType === 1 &&
     3109                                                        jQuery.find.matchesSelector( cur, selectors ) ) ) {
     3110
     3111                                                matched.push( cur );
     3112                                                break;
     3113                                        }
     3114                                }
     3115                        }
     3116                }
     3117
     3118                return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
     3119        },
     3120
     3121        // Determine the position of an element within the set
     3122        index: function( elem ) {
     3123
     3124                // No argument, return index in parent
     3125                if ( !elem ) {
     3126                        return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
     3127                }
     3128
     3129                // Index in selector
     3130                if ( typeof elem === "string" ) {
     3131                        return indexOf.call( jQuery( elem ), this[ 0 ] );
     3132                }
     3133
     3134                // Locate the position of the desired element
     3135                return indexOf.call( this,
     3136
     3137                        // If it receives a jQuery object, the first element is used
     3138                        elem.jquery ? elem[ 0 ] : elem
     3139                );
     3140        },
     3141
     3142        add: function( selector, context ) {
     3143                return this.pushStack(
     3144                        jQuery.uniqueSort(
     3145                                jQuery.merge( this.get(), jQuery( selector, context ) )
     3146                        )
     3147                );
     3148        },
     3149
     3150        addBack: function( selector ) {
     3151                return this.add( selector == null ?
     3152                        this.prevObject : this.prevObject.filter( selector )
     3153                );
     3154        }
     3155} );
     3156
     3157function sibling( cur, dir ) {
     3158        while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
     3159        return cur;
     3160}
     3161
     3162jQuery.each( {
     3163        parent: function( elem ) {
     3164                var parent = elem.parentNode;
     3165                return parent && parent.nodeType !== 11 ? parent : null;
     3166        },
     3167        parents: function( elem ) {
     3168                return dir( elem, "parentNode" );
     3169        },
     3170        parentsUntil: function( elem, i, until ) {
     3171                return dir( elem, "parentNode", until );
     3172        },
     3173        next: function( elem ) {
     3174                return sibling( elem, "nextSibling" );
     3175        },
     3176        prev: function( elem ) {
     3177                return sibling( elem, "previousSibling" );
     3178        },
     3179        nextAll: function( elem ) {
     3180                return dir( elem, "nextSibling" );
     3181        },
     3182        prevAll: function( elem ) {
     3183                return dir( elem, "previousSibling" );
     3184        },
     3185        nextUntil: function( elem, i, until ) {
     3186                return dir( elem, "nextSibling", until );
     3187        },
     3188        prevUntil: function( elem, i, until ) {
     3189                return dir( elem, "previousSibling", until );
     3190        },
     3191        siblings: function( elem ) {
     3192                return siblings( ( elem.parentNode || {} ).firstChild, elem );
     3193        },
     3194        children: function( elem ) {
     3195                return siblings( elem.firstChild );
     3196        },
     3197        contents: function( elem ) {
     3198        if ( nodeName( elem, "iframe" ) ) {
     3199            return elem.contentDocument;
     3200        }
     3201
     3202        // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
     3203        // Treat the template element as a regular one in browsers that
     3204        // don't support it.
     3205        if ( nodeName( elem, "template" ) ) {
     3206            elem = elem.content || elem;
     3207        }
     3208
     3209        return jQuery.merge( [], elem.childNodes );
     3210        }
     3211}, function( name, fn ) {
     3212        jQuery.fn[ name ] = function( until, selector ) {
     3213                var matched = jQuery.map( this, fn, until );
     3214
     3215                if ( name.slice( -5 ) !== "Until" ) {
     3216                        selector = until;
     3217                }
     3218
     3219                if ( selector && typeof selector === "string" ) {
     3220                        matched = jQuery.filter( selector, matched );
     3221                }
     3222
     3223                if ( this.length > 1 ) {
     3224
     3225                        // Remove duplicates
     3226                        if ( !guaranteedUnique[ name ] ) {
     3227                                jQuery.uniqueSort( matched );
     3228                        }
     3229
     3230                        // Reverse order for parents* and prev-derivatives
     3231                        if ( rparentsprev.test( name ) ) {
     3232                                matched.reverse();
     3233                        }
     3234                }
     3235
     3236                return this.pushStack( matched );
     3237        };
     3238} );
     3239var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
     3240
     3241
     3242
     3243// Convert String-formatted options into Object-formatted ones
     3244function createOptions( options ) {
     3245        var object = {};
     3246        jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
     3247                object[ flag ] = true;
     3248        } );
     3249        return object;
     3250}
     3251
     3252/*
     3253 * Create a callback list using the following parameters:
     3254 *
     3255 *      options: an optional list of space-separated options that will change how
     3256 *                      the callback list behaves or a more traditional option object
     3257 *
     3258 * By default a callback list will act like an event callback list and can be
     3259 * "fired" multiple times.
     3260 *
     3261 * Possible options:
     3262 *
     3263 *      once:                   will ensure the callback list can only be fired once (like a Deferred)
     3264 *
     3265 *      memory:                 will keep track of previous values and will call any callback added
     3266 *                                      after the list has been fired right away with the latest "memorized"
     3267 *                                      values (like a Deferred)
     3268 *
     3269 *      unique:                 will ensure a callback can only be added once (no duplicate in the list)
     3270 *
     3271 *      stopOnFalse:    interrupt callings when a callback returns false
     3272 *
     3273 */
     3274jQuery.Callbacks = function( options ) {
     3275
     3276        // Convert options from String-formatted to Object-formatted if needed
     3277        // (we check in cache first)
     3278        options = typeof options === "string" ?
     3279                createOptions( options ) :
     3280                jQuery.extend( {}, options );
     3281
     3282        var // Flag to know if list is currently firing
     3283                firing,
     3284
     3285                // Last fire value for non-forgettable lists
     3286                memory,
     3287
     3288                // Flag to know if list was already fired
     3289                fired,
     3290
     3291                // Flag to prevent firing
     3292                locked,
     3293
     3294                // Actual callback list
     3295                list = [],
     3296
     3297                // Queue of execution data for repeatable lists
     3298                queue = [],
     3299
     3300                // Index of currently firing callback (modified by add/remove as needed)
     3301                firingIndex = -1,
     3302
     3303                // Fire callbacks
     3304                fire = function() {
     3305
     3306                        // Enforce single-firing
     3307                        locked = locked || options.once;
     3308
     3309                        // Execute callbacks for all pending executions,
     3310                        // respecting firingIndex overrides and runtime changes
     3311                        fired = firing = true;
     3312                        for ( ; queue.length; firingIndex = -1 ) {
     3313      &nbs