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