web/res/js/jquery.js
changeset 1304 10974bff4dae
parent 1198 ff4b567d51f2
child 1514 5869151a1f2f
equal deleted inserted replaced
1303:20e00017dd60 1304:10974bff4dae
     1 /*!
     1 /*!
     2  * jQuery JavaScript Library v2.0.3
     2  * jQuery JavaScript Library v2.1.4
     3  * http://jquery.com/
     3  * http://jquery.com/
     4  *
     4  *
     5  * Includes Sizzle.js
     5  * Includes Sizzle.js
     6  * http://sizzlejs.com/
     6  * http://sizzlejs.com/
     7  *
     7  *
     8  * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
     8  * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
     9  * Released under the MIT license
     9  * Released under the MIT license
    10  * http://jquery.org/license
    10  * http://jquery.org/license
    11  *
    11  *
    12  * Date: 2013-07-03T13:30Z
    12  * Date: 2015-04-28T16:01Z
    13  */
    13  */
    14 (function( window, undefined ) {
    14 
    15 
    15 (function( global, factory ) {
    16 // Can't do this because several apps including ASP.NET trace
    16 
       
    17 	if ( typeof module === "object" && typeof module.exports === "object" ) {
       
    18 		// For CommonJS and CommonJS-like environments where a proper `window`
       
    19 		// is present, execute the factory and get jQuery.
       
    20 		// For environments that do not have a `window` with a `document`
       
    21 		// (such as Node.js), expose a factory as module.exports.
       
    22 		// This accentuates the need for the creation of a real `window`.
       
    23 		// e.g. var jQuery = require("jquery")(window);
       
    24 		// See ticket #14549 for more info.
       
    25 		module.exports = global.document ?
       
    26 			factory( global, true ) :
       
    27 			function( w ) {
       
    28 				if ( !w.document ) {
       
    29 					throw new Error( "jQuery requires a window with a document" );
       
    30 				}
       
    31 				return factory( w );
       
    32 			};
       
    33 	} else {
       
    34 		factory( global );
       
    35 	}
       
    36 
       
    37 // Pass this if window is not defined yet
       
    38 }(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
       
    39 
       
    40 // Support: Firefox 18+
       
    41 // Can't be in strict mode, several libs including ASP.NET trace
    17 // the stack via arguments.caller.callee and Firefox dies if
    42 // the stack via arguments.caller.callee and Firefox dies if
    18 // you try to trace through "use strict" call chains. (#13335)
    43 // you try to trace through "use strict" call chains. (#13335)
    19 // Support: Firefox 18+
    44 //
    20 //"use strict";
    45 
       
    46 var arr = [];
       
    47 
       
    48 var slice = arr.slice;
       
    49 
       
    50 var concat = arr.concat;
       
    51 
       
    52 var push = arr.push;
       
    53 
       
    54 var indexOf = arr.indexOf;
       
    55 
       
    56 var class2type = {};
       
    57 
       
    58 var toString = class2type.toString;
       
    59 
       
    60 var hasOwn = class2type.hasOwnProperty;
       
    61 
       
    62 var support = {};
       
    63 
       
    64 
       
    65 
    21 var
    66 var
    22 	// A central reference to the root jQuery(document)
       
    23 	rootjQuery,
       
    24 
       
    25 	// The deferred used on DOM ready
       
    26 	readyList,
       
    27 
       
    28 	// Support: IE9
       
    29 	// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
       
    30 	core_strundefined = typeof undefined,
       
    31 
       
    32 	// Use the correct document accordingly with window argument (sandbox)
    67 	// Use the correct document accordingly with window argument (sandbox)
    33 	location = window.location,
       
    34 	document = window.document,
    68 	document = window.document,
    35 	docElem = document.documentElement,
    69 
    36 
    70 	version = "2.1.4",
    37 	// Map over jQuery in case of overwrite
       
    38 	_jQuery = window.jQuery,
       
    39 
       
    40 	// Map over the $ in case of overwrite
       
    41 	_$ = window.$,
       
    42 
       
    43 	// [[Class]] -> type pairs
       
    44 	class2type = {},
       
    45 
       
    46 	// List of deleted data cache ids, so we can reuse them
       
    47 	core_deletedIds = [],
       
    48 
       
    49 	core_version = "2.0.3",
       
    50 
       
    51 	// Save a reference to some core methods
       
    52 	core_concat = core_deletedIds.concat,
       
    53 	core_push = core_deletedIds.push,
       
    54 	core_slice = core_deletedIds.slice,
       
    55 	core_indexOf = core_deletedIds.indexOf,
       
    56 	core_toString = class2type.toString,
       
    57 	core_hasOwn = class2type.hasOwnProperty,
       
    58 	core_trim = core_version.trim,
       
    59 
    71 
    60 	// Define a local copy of jQuery
    72 	// Define a local copy of jQuery
    61 	jQuery = function( selector, context ) {
    73 	jQuery = function( selector, context ) {
    62 		// The jQuery object is actually just the init constructor 'enhanced'
    74 		// The jQuery object is actually just the init constructor 'enhanced'
    63 		return new jQuery.fn.init( selector, context, rootjQuery );
    75 		// Need init if jQuery is called (just allow error to be thrown if not included)
    64 	},
    76 		return new jQuery.fn.init( selector, context );
    65 
    77 	},
    66 	// Used for matching numbers
    78 
    67 	core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
    79 	// Support: Android<4.1
    68 
    80 	// Make sure we trim BOM and NBSP
    69 	// Used for splitting on whitespace
    81 	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
    70 	core_rnotwhite = /\S+/g,
       
    71 
       
    72 	// A simple way to check for HTML strings
       
    73 	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
       
    74 	// Strict HTML recognition (#11290: must start with <)
       
    75 	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
       
    76 
       
    77 	// Match a standalone tag
       
    78 	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
       
    79 
    82 
    80 	// Matches dashed string for camelizing
    83 	// Matches dashed string for camelizing
    81 	rmsPrefix = /^-ms-/,
    84 	rmsPrefix = /^-ms-/,
    82 	rdashAlpha = /-([\da-z])/gi,
    85 	rdashAlpha = /-([\da-z])/gi,
    83 
    86 
    84 	// Used by jQuery.camelCase as callback to replace()
    87 	// Used by jQuery.camelCase as callback to replace()
    85 	fcamelCase = function( all, letter ) {
    88 	fcamelCase = function( all, letter ) {
    86 		return letter.toUpperCase();
    89 		return letter.toUpperCase();
    87 	},
       
    88 
       
    89 	// The ready event handler and self cleanup method
       
    90 	completed = function() {
       
    91 		document.removeEventListener( "DOMContentLoaded", completed, false );
       
    92 		window.removeEventListener( "load", completed, false );
       
    93 		jQuery.ready();
       
    94 	};
    90 	};
    95 
    91 
    96 jQuery.fn = jQuery.prototype = {
    92 jQuery.fn = jQuery.prototype = {
    97 	// The current version of jQuery being used
    93 	// The current version of jQuery being used
    98 	jquery: core_version,
    94 	jquery: version,
    99 
    95 
   100 	constructor: jQuery,
    96 	constructor: jQuery,
   101 	init: function( selector, context, rootjQuery ) {
       
   102 		var match, elem;
       
   103 
       
   104 		// HANDLE: $(""), $(null), $(undefined), $(false)
       
   105 		if ( !selector ) {
       
   106 			return this;
       
   107 		}
       
   108 
       
   109 		// Handle HTML strings
       
   110 		if ( typeof selector === "string" ) {
       
   111 			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
       
   112 				// Assume that strings that start and end with <> are HTML and skip the regex check
       
   113 				match = [ null, selector, null ];
       
   114 
       
   115 			} else {
       
   116 				match = rquickExpr.exec( selector );
       
   117 			}
       
   118 
       
   119 			// Match html or make sure no context is specified for #id
       
   120 			if ( match && (match[1] || !context) ) {
       
   121 
       
   122 				// HANDLE: $(html) -> $(array)
       
   123 				if ( match[1] ) {
       
   124 					context = context instanceof jQuery ? context[0] : context;
       
   125 
       
   126 					// scripts is true for back-compat
       
   127 					jQuery.merge( this, jQuery.parseHTML(
       
   128 						match[1],
       
   129 						context && context.nodeType ? context.ownerDocument || context : document,
       
   130 						true
       
   131 					) );
       
   132 
       
   133 					// HANDLE: $(html, props)
       
   134 					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
       
   135 						for ( match in context ) {
       
   136 							// Properties of context are called as methods if possible
       
   137 							if ( jQuery.isFunction( this[ match ] ) ) {
       
   138 								this[ match ]( context[ match ] );
       
   139 
       
   140 							// ...and otherwise set as attributes
       
   141 							} else {
       
   142 								this.attr( match, context[ match ] );
       
   143 							}
       
   144 						}
       
   145 					}
       
   146 
       
   147 					return this;
       
   148 
       
   149 				// HANDLE: $(#id)
       
   150 				} else {
       
   151 					elem = document.getElementById( match[2] );
       
   152 
       
   153 					// Check parentNode to catch when Blackberry 4.6 returns
       
   154 					// nodes that are no longer in the document #6963
       
   155 					if ( elem && elem.parentNode ) {
       
   156 						// Inject the element directly into the jQuery object
       
   157 						this.length = 1;
       
   158 						this[0] = elem;
       
   159 					}
       
   160 
       
   161 					this.context = document;
       
   162 					this.selector = selector;
       
   163 					return this;
       
   164 				}
       
   165 
       
   166 			// HANDLE: $(expr, $(...))
       
   167 			} else if ( !context || context.jquery ) {
       
   168 				return ( context || rootjQuery ).find( selector );
       
   169 
       
   170 			// HANDLE: $(expr, context)
       
   171 			// (which is just equivalent to: $(context).find(expr)
       
   172 			} else {
       
   173 				return this.constructor( context ).find( selector );
       
   174 			}
       
   175 
       
   176 		// HANDLE: $(DOMElement)
       
   177 		} else if ( selector.nodeType ) {
       
   178 			this.context = this[0] = selector;
       
   179 			this.length = 1;
       
   180 			return this;
       
   181 
       
   182 		// HANDLE: $(function)
       
   183 		// Shortcut for document ready
       
   184 		} else if ( jQuery.isFunction( selector ) ) {
       
   185 			return rootjQuery.ready( selector );
       
   186 		}
       
   187 
       
   188 		if ( selector.selector !== undefined ) {
       
   189 			this.selector = selector.selector;
       
   190 			this.context = selector.context;
       
   191 		}
       
   192 
       
   193 		return jQuery.makeArray( selector, this );
       
   194 	},
       
   195 
    97 
   196 	// Start with an empty selector
    98 	// Start with an empty selector
   197 	selector: "",
    99 	selector: "",
   198 
   100 
   199 	// The default length of a jQuery object is 0
   101 	// The default length of a jQuery object is 0
   200 	length: 0,
   102 	length: 0,
   201 
   103 
   202 	toArray: function() {
   104 	toArray: function() {
   203 		return core_slice.call( this );
   105 		return slice.call( this );
   204 	},
   106 	},
   205 
   107 
   206 	// Get the Nth element in the matched element set OR
   108 	// Get the Nth element in the matched element set OR
   207 	// Get the whole matched element set as a clean array
   109 	// Get the whole matched element set as a clean array
   208 	get: function( num ) {
   110 	get: function( num ) {
   209 		return num == null ?
   111 		return num != null ?
   210 
   112 
   211 			// Return a 'clean' array
   113 			// Return just the one element from the set
   212 			this.toArray() :
   114 			( num < 0 ? this[ num + this.length ] : this[ num ] ) :
   213 
   115 
   214 			// Return just the object
   116 			// Return all the elements in a clean array
   215 			( num < 0 ? this[ this.length + num ] : this[ num ] );
   117 			slice.call( this );
   216 	},
   118 	},
   217 
   119 
   218 	// Take an array of elements and push it onto the stack
   120 	// Take an array of elements and push it onto the stack
   219 	// (returning the new matched element set)
   121 	// (returning the new matched element set)
   220 	pushStack: function( elems ) {
   122 	pushStack: function( elems ) {
   235 	// only used internally.)
   137 	// only used internally.)
   236 	each: function( callback, args ) {
   138 	each: function( callback, args ) {
   237 		return jQuery.each( this, callback, args );
   139 		return jQuery.each( this, callback, args );
   238 	},
   140 	},
   239 
   141 
   240 	ready: function( fn ) {
   142 	map: function( callback ) {
   241 		// Add the callback
   143 		return this.pushStack( jQuery.map(this, function( elem, i ) {
   242 		jQuery.ready.promise().done( fn );
   144 			return callback.call( elem, i, elem );
   243 
   145 		}));
   244 		return this;
       
   245 	},
   146 	},
   246 
   147 
   247 	slice: function() {
   148 	slice: function() {
   248 		return this.pushStack( core_slice.apply( this, arguments ) );
   149 		return this.pushStack( slice.apply( this, arguments ) );
   249 	},
   150 	},
   250 
   151 
   251 	first: function() {
   152 	first: function() {
   252 		return this.eq( 0 );
   153 		return this.eq( 0 );
   253 	},
   154 	},
   260 		var len = this.length,
   161 		var len = this.length,
   261 			j = +i + ( i < 0 ? len : 0 );
   162 			j = +i + ( i < 0 ? len : 0 );
   262 		return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
   163 		return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
   263 	},
   164 	},
   264 
   165 
   265 	map: function( callback ) {
       
   266 		return this.pushStack( jQuery.map(this, function( elem, i ) {
       
   267 			return callback.call( elem, i, elem );
       
   268 		}));
       
   269 	},
       
   270 
       
   271 	end: function() {
   166 	end: function() {
   272 		return this.prevObject || this.constructor(null);
   167 		return this.prevObject || this.constructor(null);
   273 	},
   168 	},
   274 
   169 
   275 	// For internal use only.
   170 	// For internal use only.
   276 	// Behaves like an Array's method, not like a jQuery method.
   171 	// Behaves like an Array's method, not like a jQuery method.
   277 	push: core_push,
   172 	push: push,
   278 	sort: [].sort,
   173 	sort: arr.sort,
   279 	splice: [].splice
   174 	splice: arr.splice
   280 };
   175 };
   281 
       
   282 // Give the init function the jQuery prototype for later instantiation
       
   283 jQuery.fn.init.prototype = jQuery.fn;
       
   284 
   176 
   285 jQuery.extend = jQuery.fn.extend = function() {
   177 jQuery.extend = jQuery.fn.extend = function() {
   286 	var options, name, src, copy, copyIsArray, clone,
   178 	var options, name, src, copy, copyIsArray, clone,
   287 		target = arguments[0] || {},
   179 		target = arguments[0] || {},
   288 		i = 1,
   180 		i = 1,
   290 		deep = false;
   182 		deep = false;
   291 
   183 
   292 	// Handle a deep copy situation
   184 	// Handle a deep copy situation
   293 	if ( typeof target === "boolean" ) {
   185 	if ( typeof target === "boolean" ) {
   294 		deep = target;
   186 		deep = target;
   295 		target = arguments[1] || {};
   187 
   296 		// skip the boolean and the target
   188 		// Skip the boolean and the target
   297 		i = 2;
   189 		target = arguments[ i ] || {};
       
   190 		i++;
   298 	}
   191 	}
   299 
   192 
   300 	// Handle case when target is a string or something (possible in deep copy)
   193 	// Handle case when target is a string or something (possible in deep copy)
   301 	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
   194 	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
   302 		target = {};
   195 		target = {};
   303 	}
   196 	}
   304 
   197 
   305 	// extend jQuery itself if only one argument is passed
   198 	// Extend jQuery itself if only one argument is passed
   306 	if ( length === i ) {
   199 	if ( i === length ) {
   307 		target = this;
   200 		target = this;
   308 		--i;
   201 		i--;
   309 	}
   202 	}
   310 
   203 
   311 	for ( ; i < length; i++ ) {
   204 	for ( ; i < length; i++ ) {
   312 		// Only deal with non-null/undefined values
   205 		// Only deal with non-null/undefined values
   313 		if ( (options = arguments[ i ]) != null ) {
   206 		if ( (options = arguments[ i ]) != null ) {
   346 	return target;
   239 	return target;
   347 };
   240 };
   348 
   241 
   349 jQuery.extend({
   242 jQuery.extend({
   350 	// Unique for each copy of jQuery on the page
   243 	// Unique for each copy of jQuery on the page
   351 	expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
   244 	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
   352 
   245 
   353 	noConflict: function( deep ) {
   246 	// Assume jQuery is ready without the ready module
   354 		if ( window.$ === jQuery ) {
   247 	isReady: true,
   355 			window.$ = _$;
   248 
   356 		}
   249 	error: function( msg ) {
   357 
   250 		throw new Error( msg );
   358 		if ( deep && window.jQuery === jQuery ) {
   251 	},
   359 			window.jQuery = _jQuery;
   252 
   360 		}
   253 	noop: function() {},
   361 
   254 
   362 		return jQuery;
       
   363 	},
       
   364 
       
   365 	// Is the DOM ready to be used? Set to true once it occurs.
       
   366 	isReady: false,
       
   367 
       
   368 	// A counter to track how many items to wait for before
       
   369 	// the ready event fires. See #6781
       
   370 	readyWait: 1,
       
   371 
       
   372 	// Hold (or release) the ready event
       
   373 	holdReady: function( hold ) {
       
   374 		if ( hold ) {
       
   375 			jQuery.readyWait++;
       
   376 		} else {
       
   377 			jQuery.ready( true );
       
   378 		}
       
   379 	},
       
   380 
       
   381 	// Handle when the DOM is ready
       
   382 	ready: function( wait ) {
       
   383 
       
   384 		// Abort if there are pending holds or we're already ready
       
   385 		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
       
   386 			return;
       
   387 		}
       
   388 
       
   389 		// Remember that the DOM is ready
       
   390 		jQuery.isReady = true;
       
   391 
       
   392 		// If a normal DOM Ready event fired, decrement, and wait if need be
       
   393 		if ( wait !== true && --jQuery.readyWait > 0 ) {
       
   394 			return;
       
   395 		}
       
   396 
       
   397 		// If there are functions bound, to execute
       
   398 		readyList.resolveWith( document, [ jQuery ] );
       
   399 
       
   400 		// Trigger any bound ready events
       
   401 		if ( jQuery.fn.trigger ) {
       
   402 			jQuery( document ).trigger("ready").off("ready");
       
   403 		}
       
   404 	},
       
   405 
       
   406 	// See test/unit/core.js for details concerning isFunction.
       
   407 	// Since version 1.3, DOM methods and functions like alert
       
   408 	// aren't supported. They return false on IE (#2968).
       
   409 	isFunction: function( obj ) {
   255 	isFunction: function( obj ) {
   410 		return jQuery.type(obj) === "function";
   256 		return jQuery.type(obj) === "function";
   411 	},
   257 	},
   412 
   258 
   413 	isArray: Array.isArray,
   259 	isArray: Array.isArray,
   415 	isWindow: function( obj ) {
   261 	isWindow: function( obj ) {
   416 		return obj != null && obj === obj.window;
   262 		return obj != null && obj === obj.window;
   417 	},
   263 	},
   418 
   264 
   419 	isNumeric: function( obj ) {
   265 	isNumeric: function( obj ) {
   420 		return !isNaN( parseFloat(obj) ) && isFinite( obj );
   266 		// parseFloat NaNs numeric-cast false positives (null|true|false|"")
   421 	},
   267 		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
   422 
   268 		// subtraction forces infinities to NaN
   423 	type: function( obj ) {
   269 		// adding 1 corrects loss of precision from parseFloat (#15100)
   424 		if ( obj == null ) {
   270 		return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
   425 			return String( obj );
       
   426 		}
       
   427 		// Support: Safari <= 5.1 (functionish RegExp)
       
   428 		return typeof obj === "object" || typeof obj === "function" ?
       
   429 			class2type[ core_toString.call(obj) ] || "object" :
       
   430 			typeof obj;
       
   431 	},
   271 	},
   432 
   272 
   433 	isPlainObject: function( obj ) {
   273 	isPlainObject: function( obj ) {
   434 		// Not plain objects:
   274 		// Not plain objects:
   435 		// - Any object or value whose internal [[Class]] property is not "[object Object]"
   275 		// - Any object or value whose internal [[Class]] property is not "[object Object]"
   437 		// - window
   277 		// - window
   438 		if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
   278 		if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
   439 			return false;
   279 			return false;
   440 		}
   280 		}
   441 
   281 
   442 		// Support: Firefox <20
   282 		if ( obj.constructor &&
   443 		// The try/catch suppresses exceptions thrown when attempting to access
   283 				!hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
   444 		// the "constructor" property of certain host objects, ie. |window.location|
       
   445 		// https://bugzilla.mozilla.org/show_bug.cgi?id=814622
       
   446 		try {
       
   447 			if ( obj.constructor &&
       
   448 					!core_hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
       
   449 				return false;
       
   450 			}
       
   451 		} catch ( e ) {
       
   452 			return false;
   284 			return false;
   453 		}
   285 		}
   454 
   286 
   455 		// If the function hasn't returned already, we're confident that
   287 		// If the function hasn't returned already, we're confident that
   456 		// |obj| is a plain object, created by {} or constructed with new Object
   288 		// |obj| is a plain object, created by {} or constructed with new Object
   463 			return false;
   295 			return false;
   464 		}
   296 		}
   465 		return true;
   297 		return true;
   466 	},
   298 	},
   467 
   299 
   468 	error: function( msg ) {
   300 	type: function( obj ) {
   469 		throw new Error( msg );
   301 		if ( obj == null ) {
   470 	},
   302 			return obj + "";
   471 
   303 		}
   472 	// data: string of html
   304 		// Support: Android<4.0, iOS<6 (functionish RegExp)
   473 	// context (optional): If specified, the fragment will be created in this context, defaults to document
   305 		return typeof obj === "object" || typeof obj === "function" ?
   474 	// keepScripts (optional): If true, will include scripts passed in the html string
   306 			class2type[ toString.call(obj) ] || "object" :
   475 	parseHTML: function( data, context, keepScripts ) {
   307 			typeof obj;
   476 		if ( !data || typeof data !== "string" ) {
   308 	},
   477 			return null;
       
   478 		}
       
   479 		if ( typeof context === "boolean" ) {
       
   480 			keepScripts = context;
       
   481 			context = false;
       
   482 		}
       
   483 		context = context || document;
       
   484 
       
   485 		var parsed = rsingleTag.exec( data ),
       
   486 			scripts = !keepScripts && [];
       
   487 
       
   488 		// Single tag
       
   489 		if ( parsed ) {
       
   490 			return [ context.createElement( parsed[1] ) ];
       
   491 		}
       
   492 
       
   493 		parsed = jQuery.buildFragment( [ data ], context, scripts );
       
   494 
       
   495 		if ( scripts ) {
       
   496 			jQuery( scripts ).remove();
       
   497 		}
       
   498 
       
   499 		return jQuery.merge( [], parsed.childNodes );
       
   500 	},
       
   501 
       
   502 	parseJSON: JSON.parse,
       
   503 
       
   504 	// Cross-browser xml parsing
       
   505 	parseXML: function( data ) {
       
   506 		var xml, tmp;
       
   507 		if ( !data || typeof data !== "string" ) {
       
   508 			return null;
       
   509 		}
       
   510 
       
   511 		// Support: IE9
       
   512 		try {
       
   513 			tmp = new DOMParser();
       
   514 			xml = tmp.parseFromString( data , "text/xml" );
       
   515 		} catch ( e ) {
       
   516 			xml = undefined;
       
   517 		}
       
   518 
       
   519 		if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
       
   520 			jQuery.error( "Invalid XML: " + data );
       
   521 		}
       
   522 		return xml;
       
   523 	},
       
   524 
       
   525 	noop: function() {},
       
   526 
   309 
   527 	// Evaluates a script in a global context
   310 	// Evaluates a script in a global context
   528 	globalEval: function( code ) {
   311 	globalEval: function( code ) {
   529 		var script,
   312 		var script,
   530 				indirect = eval;
   313 			indirect = eval;
   531 
   314 
   532 		code = jQuery.trim( code );
   315 		code = jQuery.trim( code );
   533 
   316 
   534 		if ( code ) {
   317 		if ( code ) {
   535 			// If the code includes a valid, prologue position
   318 			// If the code includes a valid, prologue position
   546 			}
   329 			}
   547 		}
   330 		}
   548 	},
   331 	},
   549 
   332 
   550 	// Convert dashed to camelCase; used by the css and data modules
   333 	// Convert dashed to camelCase; used by the css and data modules
       
   334 	// Support: IE9-11+
   551 	// Microsoft forgot to hump their vendor prefix (#9572)
   335 	// Microsoft forgot to hump their vendor prefix (#9572)
   552 	camelCase: function( string ) {
   336 	camelCase: function( string ) {
   553 		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
   337 		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
   554 	},
   338 	},
   555 
   339 
   605 		}
   389 		}
   606 
   390 
   607 		return obj;
   391 		return obj;
   608 	},
   392 	},
   609 
   393 
       
   394 	// Support: Android<4.1
   610 	trim: function( text ) {
   395 	trim: function( text ) {
   611 		return text == null ? "" : core_trim.call( text );
   396 		return text == null ?
       
   397 			"" :
       
   398 			( text + "" ).replace( rtrim, "" );
   612 	},
   399 	},
   613 
   400 
   614 	// results is for internal usage only
   401 	// results is for internal usage only
   615 	makeArray: function( arr, results ) {
   402 	makeArray: function( arr, results ) {
   616 		var ret = results || [];
   403 		var ret = results || [];
   620 				jQuery.merge( ret,
   407 				jQuery.merge( ret,
   621 					typeof arr === "string" ?
   408 					typeof arr === "string" ?
   622 					[ arr ] : arr
   409 					[ arr ] : arr
   623 				);
   410 				);
   624 			} else {
   411 			} else {
   625 				core_push.call( ret, arr );
   412 				push.call( ret, arr );
   626 			}
   413 			}
   627 		}
   414 		}
   628 
   415 
   629 		return ret;
   416 		return ret;
   630 	},
   417 	},
   631 
   418 
   632 	inArray: function( elem, arr, i ) {
   419 	inArray: function( elem, arr, i ) {
   633 		return arr == null ? -1 : core_indexOf.call( arr, elem, i );
   420 		return arr == null ? -1 : indexOf.call( arr, elem, i );
   634 	},
   421 	},
   635 
   422 
   636 	merge: function( first, second ) {
   423 	merge: function( first, second ) {
   637 		var l = second.length,
   424 		var len = +second.length,
   638 			i = first.length,
   425 			j = 0,
   639 			j = 0;
   426 			i = first.length;
   640 
   427 
   641 		if ( typeof l === "number" ) {
   428 		for ( ; j < len; j++ ) {
   642 			for ( ; j < l; j++ ) {
   429 			first[ i++ ] = second[ j ];
   643 				first[ i++ ] = second[ j ];
       
   644 			}
       
   645 		} else {
       
   646 			while ( second[j] !== undefined ) {
       
   647 				first[ i++ ] = second[ j++ ];
       
   648 			}
       
   649 		}
   430 		}
   650 
   431 
   651 		first.length = i;
   432 		first.length = i;
   652 
   433 
   653 		return first;
   434 		return first;
   654 	},
   435 	},
   655 
   436 
   656 	grep: function( elems, callback, inv ) {
   437 	grep: function( elems, callback, invert ) {
   657 		var retVal,
   438 		var callbackInverse,
   658 			ret = [],
   439 			matches = [],
   659 			i = 0,
   440 			i = 0,
   660 			length = elems.length;
   441 			length = elems.length,
   661 		inv = !!inv;
   442 			callbackExpect = !invert;
   662 
   443 
   663 		// Go through the array, only saving the items
   444 		// Go through the array, only saving the items
   664 		// that pass the validator function
   445 		// that pass the validator function
   665 		for ( ; i < length; i++ ) {
   446 		for ( ; i < length; i++ ) {
   666 			retVal = !!callback( elems[ i ], i );
   447 			callbackInverse = !callback( elems[ i ], i );
   667 			if ( inv !== retVal ) {
   448 			if ( callbackInverse !== callbackExpect ) {
   668 				ret.push( elems[ i ] );
   449 				matches.push( elems[ i ] );
   669 			}
   450 			}
   670 		}
   451 		}
   671 
   452 
   672 		return ret;
   453 		return matches;
   673 	},
   454 	},
   674 
   455 
   675 	// arg is for internal usage only
   456 	// arg is for internal usage only
   676 	map: function( elems, callback, arg ) {
   457 	map: function( elems, callback, arg ) {
   677 		var value,
   458 		var value,
   678 			i = 0,
   459 			i = 0,
   679 			length = elems.length,
   460 			length = elems.length,
   680 			isArray = isArraylike( elems ),
   461 			isArray = isArraylike( elems ),
   681 			ret = [];
   462 			ret = [];
   682 
   463 
   683 		// Go through the array, translating each of the items to their
   464 		// Go through the array, translating each of the items to their new values
   684 		if ( isArray ) {
   465 		if ( isArray ) {
   685 			for ( ; i < length; i++ ) {
   466 			for ( ; i < length; i++ ) {
   686 				value = callback( elems[ i ], i, arg );
   467 				value = callback( elems[ i ], i, arg );
   687 
   468 
   688 				if ( value != null ) {
   469 				if ( value != null ) {
   689 					ret[ ret.length ] = value;
   470 					ret.push( value );
   690 				}
   471 				}
   691 			}
   472 			}
   692 
   473 
   693 		// Go through every key on the object,
   474 		// Go through every key on the object,
   694 		} else {
   475 		} else {
   695 			for ( i in elems ) {
   476 			for ( i in elems ) {
   696 				value = callback( elems[ i ], i, arg );
   477 				value = callback( elems[ i ], i, arg );
   697 
   478 
   698 				if ( value != null ) {
   479 				if ( value != null ) {
   699 					ret[ ret.length ] = value;
   480 					ret.push( value );
   700 				}
   481 				}
   701 			}
   482 			}
   702 		}
   483 		}
   703 
   484 
   704 		// Flatten any nested arrays
   485 		// Flatten any nested arrays
   705 		return core_concat.apply( [], ret );
   486 		return concat.apply( [], ret );
   706 	},
   487 	},
   707 
   488 
   708 	// A global GUID counter for objects
   489 	// A global GUID counter for objects
   709 	guid: 1,
   490 	guid: 1,
   710 
   491 
   724 		if ( !jQuery.isFunction( fn ) ) {
   505 		if ( !jQuery.isFunction( fn ) ) {
   725 			return undefined;
   506 			return undefined;
   726 		}
   507 		}
   727 
   508 
   728 		// Simulated bind
   509 		// Simulated bind
   729 		args = core_slice.call( arguments, 2 );
   510 		args = slice.call( arguments, 2 );
   730 		proxy = function() {
   511 		proxy = function() {
   731 			return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
   512 			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
   732 		};
   513 		};
   733 
   514 
   734 		// Set the guid of unique handler to the same of original handler, so it can be removed
   515 		// Set the guid of unique handler to the same of original handler, so it can be removed
   735 		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
   516 		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
   736 
   517 
   737 		return proxy;
   518 		return proxy;
   738 	},
   519 	},
   739 
   520 
   740 	// Multifunctional method to get and set values of a collection
       
   741 	// The value/s can optionally be executed if it's a function
       
   742 	access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
       
   743 		var i = 0,
       
   744 			length = elems.length,
       
   745 			bulk = key == null;
       
   746 
       
   747 		// Sets many values
       
   748 		if ( jQuery.type( key ) === "object" ) {
       
   749 			chainable = true;
       
   750 			for ( i in key ) {
       
   751 				jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
       
   752 			}
       
   753 
       
   754 		// Sets one value
       
   755 		} else if ( value !== undefined ) {
       
   756 			chainable = true;
       
   757 
       
   758 			if ( !jQuery.isFunction( value ) ) {
       
   759 				raw = true;
       
   760 			}
       
   761 
       
   762 			if ( bulk ) {
       
   763 				// Bulk operations run against the entire set
       
   764 				if ( raw ) {
       
   765 					fn.call( elems, value );
       
   766 					fn = null;
       
   767 
       
   768 				// ...except when executing function values
       
   769 				} else {
       
   770 					bulk = fn;
       
   771 					fn = function( elem, key, value ) {
       
   772 						return bulk.call( jQuery( elem ), value );
       
   773 					};
       
   774 				}
       
   775 			}
       
   776 
       
   777 			if ( fn ) {
       
   778 				for ( ; i < length; i++ ) {
       
   779 					fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
       
   780 				}
       
   781 			}
       
   782 		}
       
   783 
       
   784 		return chainable ?
       
   785 			elems :
       
   786 
       
   787 			// Gets
       
   788 			bulk ?
       
   789 				fn.call( elems ) :
       
   790 				length ? fn( elems[0], key ) : emptyGet;
       
   791 	},
       
   792 
       
   793 	now: Date.now,
   521 	now: Date.now,
   794 
   522 
   795 	// A method for quickly swapping in/out CSS properties to get correct calculations.
   523 	// jQuery.support is not used in Core but other projects attach their
   796 	// Note: this method belongs to the css module but it's needed here for the support module.
   524 	// properties to it so it needs to exist.
   797 	// If support gets modularized, this method should be moved back to the css module.
   525 	support: support
   798 	swap: function( elem, options, callback, args ) {
       
   799 		var ret, name,
       
   800 			old = {};
       
   801 
       
   802 		// Remember the old values, and insert the new ones
       
   803 		for ( name in options ) {
       
   804 			old[ name ] = elem.style[ name ];
       
   805 			elem.style[ name ] = options[ name ];
       
   806 		}
       
   807 
       
   808 		ret = callback.apply( elem, args || [] );
       
   809 
       
   810 		// Revert the old values
       
   811 		for ( name in options ) {
       
   812 			elem.style[ name ] = old[ name ];
       
   813 		}
       
   814 
       
   815 		return ret;
       
   816 	}
       
   817 });
   526 });
   818 
       
   819 jQuery.ready.promise = function( obj ) {
       
   820 	if ( !readyList ) {
       
   821 
       
   822 		readyList = jQuery.Deferred();
       
   823 
       
   824 		// Catch cases where $(document).ready() is called after the browser event has already occurred.
       
   825 		// we once tried to use readyState "interactive" here, but it caused issues like the one
       
   826 		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
       
   827 		if ( document.readyState === "complete" ) {
       
   828 			// Handle it asynchronously to allow scripts the opportunity to delay ready
       
   829 			setTimeout( jQuery.ready );
       
   830 
       
   831 		} else {
       
   832 
       
   833 			// Use the handy event callback
       
   834 			document.addEventListener( "DOMContentLoaded", completed, false );
       
   835 
       
   836 			// A fallback to window.onload, that will always work
       
   837 			window.addEventListener( "load", completed, false );
       
   838 		}
       
   839 	}
       
   840 	return readyList.promise( obj );
       
   841 };
       
   842 
   527 
   843 // Populate the class2type map
   528 // Populate the class2type map
   844 jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
   529 jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
   845 	class2type[ "[object " + name + "]" ] = name.toLowerCase();
   530 	class2type[ "[object " + name + "]" ] = name.toLowerCase();
   846 });
   531 });
   847 
   532 
   848 function isArraylike( obj ) {
   533 function isArraylike( obj ) {
   849 	var length = obj.length,
   534 
       
   535 	// Support: iOS 8.2 (not reproducible in simulator)
       
   536 	// `in` check used to prevent JIT error (gh-2145)
       
   537 	// hasOwn isn't used here due to false negatives
       
   538 	// regarding Nodelist length in IE
       
   539 	var length = "length" in obj && obj.length,
   850 		type = jQuery.type( obj );
   540 		type = jQuery.type( obj );
   851 
   541 
   852 	if ( jQuery.isWindow( obj ) ) {
   542 	if ( type === "function" || jQuery.isWindow( obj ) ) {
   853 		return false;
   543 		return false;
   854 	}
   544 	}
   855 
   545 
   856 	if ( obj.nodeType === 1 && length ) {
   546 	if ( obj.nodeType === 1 && length ) {
   857 		return true;
   547 		return true;
   858 	}
   548 	}
   859 
   549 
   860 	return type === "array" || type !== "function" &&
   550 	return type === "array" || length === 0 ||
   861 		( length === 0 ||
   551 		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
   862 		typeof length === "number" && length > 0 && ( length - 1 ) in obj );
       
   863 }
   552 }
   864 
   553 var Sizzle =
   865 // All jQuery objects should point back to these
       
   866 rootjQuery = jQuery(document);
       
   867 /*!
   554 /*!
   868  * Sizzle CSS Selector Engine v1.9.4-pre
   555  * Sizzle CSS Selector Engine v2.2.0-pre
   869  * http://sizzlejs.com/
   556  * http://sizzlejs.com/
   870  *
   557  *
   871  * Copyright 2013 jQuery Foundation, Inc. and other contributors
   558  * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors
   872  * Released under the MIT license
   559  * Released under the MIT license
   873  * http://jquery.org/license
   560  * http://jquery.org/license
   874  *
   561  *
   875  * Date: 2013-06-03
   562  * Date: 2014-12-16
   876  */
   563  */
   877 (function( window, undefined ) {
   564 (function( window ) {
   878 
   565 
   879 var i,
   566 var i,
   880 	support,
   567 	support,
   881 	cachedruns,
       
   882 	Expr,
   568 	Expr,
   883 	getText,
   569 	getText,
   884 	isXML,
   570 	isXML,
       
   571 	tokenize,
   885 	compile,
   572 	compile,
       
   573 	select,
   886 	outermostContext,
   574 	outermostContext,
   887 	sortInput,
   575 	sortInput,
       
   576 	hasDuplicate,
   888 
   577 
   889 	// Local document vars
   578 	// Local document vars
   890 	setDocument,
   579 	setDocument,
   891 	document,
   580 	document,
   892 	docElem,
   581 	docElem,
   895 	rbuggyMatches,
   584 	rbuggyMatches,
   896 	matches,
   585 	matches,
   897 	contains,
   586 	contains,
   898 
   587 
   899 	// Instance-specific data
   588 	// Instance-specific data
   900 	expando = "sizzle" + -(new Date()),
   589 	expando = "sizzle" + 1 * new Date(),
   901 	preferredDoc = window.document,
   590 	preferredDoc = window.document,
   902 	dirruns = 0,
   591 	dirruns = 0,
   903 	done = 0,
   592 	done = 0,
   904 	classCache = createCache(),
   593 	classCache = createCache(),
   905 	tokenCache = createCache(),
   594 	tokenCache = createCache(),
   906 	compilerCache = createCache(),
   595 	compilerCache = createCache(),
   907 	hasDuplicate = false,
       
   908 	sortOrder = function( a, b ) {
   596 	sortOrder = function( a, b ) {
   909 		if ( a === b ) {
   597 		if ( a === b ) {
   910 			hasDuplicate = true;
   598 			hasDuplicate = true;
   911 			return 0;
       
   912 		}
   599 		}
   913 		return 0;
   600 		return 0;
   914 	},
   601 	},
   915 
   602 
   916 	// General-purpose constants
   603 	// General-purpose constants
   917 	strundefined = typeof undefined,
       
   918 	MAX_NEGATIVE = 1 << 31,
   604 	MAX_NEGATIVE = 1 << 31,
   919 
   605 
   920 	// Instance methods
   606 	// Instance methods
   921 	hasOwn = ({}).hasOwnProperty,
   607 	hasOwn = ({}).hasOwnProperty,
   922 	arr = [],
   608 	arr = [],
   923 	pop = arr.pop,
   609 	pop = arr.pop,
   924 	push_native = arr.push,
   610 	push_native = arr.push,
   925 	push = arr.push,
   611 	push = arr.push,
   926 	slice = arr.slice,
   612 	slice = arr.slice,
   927 	// Use a stripped-down indexOf if we can't use a native one
   613 	// Use a stripped-down indexOf as it's faster than native
   928 	indexOf = arr.indexOf || function( elem ) {
   614 	// http://jsperf.com/thor-indexof-vs-for/5
       
   615 	indexOf = function( list, elem ) {
   929 		var i = 0,
   616 		var i = 0,
   930 			len = this.length;
   617 			len = list.length;
   931 		for ( ; i < len; i++ ) {
   618 		for ( ; i < len; i++ ) {
   932 			if ( this[i] === elem ) {
   619 			if ( list[i] === elem ) {
   933 				return i;
   620 				return i;
   934 			}
   621 			}
   935 		}
   622 		}
   936 		return -1;
   623 		return -1;
   937 	},
   624 	},
   948 	// Loosely modeled on CSS identifier characters
   635 	// Loosely modeled on CSS identifier characters
   949 	// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
   636 	// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
   950 	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
   637 	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
   951 	identifier = characterEncoding.replace( "w", "w#" ),
   638 	identifier = characterEncoding.replace( "w", "w#" ),
   952 
   639 
   953 	// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
   640 	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
   954 	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
   641 	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
   955 		"*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
   642 		// Operator (capture 2)
   956 
   643 		"*([*^$|!~]?=)" + whitespace +
   957 	// Prefer arguments quoted,
   644 		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
   958 	//   then not containing pseudos/brackets,
   645 		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
   959 	//   then attribute selectors/non-parenthetical expressions,
   646 		"*\\]",
   960 	//   then anything else
   647 
   961 	// These preferences are here to reduce the number of selectors
   648 	pseudos = ":(" + characterEncoding + ")(?:\\((" +
   962 	//   needing tokenize in the PSEUDO preFilter
   649 		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
   963 	pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
   650 		// 1. quoted (capture 3; capture 4 or capture 5)
       
   651 		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
       
   652 		// 2. simple (capture 6)
       
   653 		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
       
   654 		// 3. anything else (capture 2)
       
   655 		".*" +
       
   656 		")\\)|)",
   964 
   657 
   965 	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
   658 	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
       
   659 	rwhitespace = new RegExp( whitespace + "+", "g" ),
   966 	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
   660 	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
   967 
   661 
   968 	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
   662 	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
   969 	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
   663 	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
   970 
   664 
   971 	rsibling = new RegExp( whitespace + "*[+~]" ),
   665 	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
   972 	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ),
       
   973 
   666 
   974 	rpseudo = new RegExp( pseudos ),
   667 	rpseudo = new RegExp( pseudos ),
   975 	ridentifier = new RegExp( "^" + identifier + "$" ),
   668 	ridentifier = new RegExp( "^" + identifier + "$" ),
   976 
   669 
   977 	matchExpr = {
   670 	matchExpr = {
   988 		// We use this for POS matching in `select`
   681 		// We use this for POS matching in `select`
   989 		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
   682 		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
   990 			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
   683 			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
   991 	},
   684 	},
   992 
   685 
       
   686 	rinputs = /^(?:input|select|textarea|button)$/i,
       
   687 	rheader = /^h\d$/i,
       
   688 
   993 	rnative = /^[^{]+\{\s*\[native \w/,
   689 	rnative = /^[^{]+\{\s*\[native \w/,
   994 
   690 
   995 	// Easily-parseable/retrievable ID or TAG or CLASS selectors
   691 	// Easily-parseable/retrievable ID or TAG or CLASS selectors
   996 	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
   692 	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
   997 
   693 
   998 	rinputs = /^(?:input|select|textarea|button)$/i,
   694 	rsibling = /[+~]/,
   999 	rheader = /^h\d$/i,
       
  1000 
       
  1001 	rescape = /'|\\/g,
   695 	rescape = /'|\\/g,
  1002 
   696 
  1003 	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
   697 	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
  1004 	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
   698 	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
  1005 	funescape = function( _, escaped, escapedWhitespace ) {
   699 	funescape = function( _, escaped, escapedWhitespace ) {
  1006 		var high = "0x" + escaped - 0x10000;
   700 		var high = "0x" + escaped - 0x10000;
  1007 		// NaN means non-codepoint
   701 		// NaN means non-codepoint
  1008 		// Support: Firefox
   702 		// Support: Firefox<24
  1009 		// Workaround erroneous numeric interpretation of +"0x"
   703 		// Workaround erroneous numeric interpretation of +"0x"
  1010 		return high !== high || escapedWhitespace ?
   704 		return high !== high || escapedWhitespace ?
  1011 			escaped :
   705 			escaped :
  1012 			// BMP codepoint
       
  1013 			high < 0 ?
   706 			high < 0 ?
       
   707 				// BMP codepoint
  1014 				String.fromCharCode( high + 0x10000 ) :
   708 				String.fromCharCode( high + 0x10000 ) :
  1015 				// Supplemental Plane codepoint (surrogate pair)
   709 				// Supplemental Plane codepoint (surrogate pair)
  1016 				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
   710 				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
       
   711 	},
       
   712 
       
   713 	// Used for iframes
       
   714 	// See setDocument()
       
   715 	// Removing the function wrapper causes a "Permission Denied"
       
   716 	// error in IE
       
   717 	unloadHandler = function() {
       
   718 		setDocument();
  1017 	};
   719 	};
  1018 
   720 
  1019 // Optimize for push.apply( _, NodeList )
   721 // Optimize for push.apply( _, NodeList )
  1020 try {
   722 try {
  1021 	push.apply(
   723 	push.apply(
  1054 		setDocument( context );
   756 		setDocument( context );
  1055 	}
   757 	}
  1056 
   758 
  1057 	context = context || document;
   759 	context = context || document;
  1058 	results = results || [];
   760 	results = results || [];
  1059 
   761 	nodeType = context.nodeType;
  1060 	if ( !selector || typeof selector !== "string" ) {
   762 
       
   763 	if ( typeof selector !== "string" || !selector ||
       
   764 		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
       
   765 
  1061 		return results;
   766 		return results;
  1062 	}
   767 	}
  1063 
   768 
  1064 	if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
   769 	if ( !seed && documentIsHTML ) {
  1065 		return [];
   770 
  1066 	}
   771 		// Try to shortcut find operations when possible (e.g., not under DocumentFragment)
  1067 
   772 		if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
  1068 	if ( documentIsHTML && !seed ) {
       
  1069 
       
  1070 		// Shortcuts
       
  1071 		if ( (match = rquickExpr.exec( selector )) ) {
       
  1072 			// Speed-up: Sizzle("#ID")
   773 			// Speed-up: Sizzle("#ID")
  1073 			if ( (m = match[1]) ) {
   774 			if ( (m = match[1]) ) {
  1074 				if ( nodeType === 9 ) {
   775 				if ( nodeType === 9 ) {
  1075 					elem = context.getElementById( m );
   776 					elem = context.getElementById( m );
  1076 					// Check parentNode to catch when Blackberry 4.6 returns
   777 					// Check parentNode to catch when Blackberry 4.6 returns
  1077 					// nodes that are no longer in the document #6963
   778 					// nodes that are no longer in the document (jQuery #6963)
  1078 					if ( elem && elem.parentNode ) {
   779 					if ( elem && elem.parentNode ) {
  1079 						// Handle the case where IE, Opera, and Webkit return items
   780 						// Handle the case where IE, Opera, and Webkit return items
  1080 						// by name instead of ID
   781 						// by name instead of ID
  1081 						if ( elem.id === m ) {
   782 						if ( elem.id === m ) {
  1082 							results.push( elem );
   783 							results.push( elem );
  1098 			} else if ( match[2] ) {
   799 			} else if ( match[2] ) {
  1099 				push.apply( results, context.getElementsByTagName( selector ) );
   800 				push.apply( results, context.getElementsByTagName( selector ) );
  1100 				return results;
   801 				return results;
  1101 
   802 
  1102 			// Speed-up: Sizzle(".CLASS")
   803 			// Speed-up: Sizzle(".CLASS")
  1103 			} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
   804 			} else if ( (m = match[3]) && support.getElementsByClassName ) {
  1104 				push.apply( results, context.getElementsByClassName( m ) );
   805 				push.apply( results, context.getElementsByClassName( m ) );
  1105 				return results;
   806 				return results;
  1106 			}
   807 			}
  1107 		}
   808 		}
  1108 
   809 
  1109 		// QSA path
   810 		// QSA path
  1110 		if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
   811 		if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
  1111 			nid = old = expando;
   812 			nid = old = expando;
  1112 			newContext = context;
   813 			newContext = context;
  1113 			newSelector = nodeType === 9 && selector;
   814 			newSelector = nodeType !== 1 && selector;
  1114 
   815 
  1115 			// qSA works strangely on Element-rooted queries
   816 			// qSA works strangely on Element-rooted queries
  1116 			// We can work around this by specifying an extra ID on the root
   817 			// We can work around this by specifying an extra ID on the root
  1117 			// and working up from there (Thanks to Andrew Dupont for the technique)
   818 			// and working up from there (Thanks to Andrew Dupont for the technique)
  1118 			// IE 8 doesn't work on object elements
   819 			// IE 8 doesn't work on object elements
  1128 
   829 
  1129 				i = groups.length;
   830 				i = groups.length;
  1130 				while ( i-- ) {
   831 				while ( i-- ) {
  1131 					groups[i] = nid + toSelector( groups[i] );
   832 					groups[i] = nid + toSelector( groups[i] );
  1132 				}
   833 				}
  1133 				newContext = rsibling.test( selector ) && context.parentNode || context;
   834 				newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
  1134 				newSelector = groups.join(",");
   835 				newSelector = groups.join(",");
  1135 			}
   836 			}
  1136 
   837 
  1137 			if ( newSelector ) {
   838 			if ( newSelector ) {
  1138 				try {
   839 				try {
  1163 function createCache() {
   864 function createCache() {
  1164 	var keys = [];
   865 	var keys = [];
  1165 
   866 
  1166 	function cache( key, value ) {
   867 	function cache( key, value ) {
  1167 		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
   868 		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
  1168 		if ( keys.push( key += " " ) > Expr.cacheLength ) {
   869 		if ( keys.push( key + " " ) > Expr.cacheLength ) {
  1169 			// Only keep the most recent entries
   870 			// Only keep the most recent entries
  1170 			delete cache[ keys.shift() ];
   871 			delete cache[ keys.shift() ];
  1171 		}
   872 		}
  1172 		return (cache[ key ] = value);
   873 		return (cache[ key + " " ] = value);
  1173 	}
   874 	}
  1174 	return cache;
   875 	return cache;
  1175 }
   876 }
  1176 
   877 
  1177 /**
   878 /**
  1290 		});
   991 		});
  1291 	});
   992 	});
  1292 }
   993 }
  1293 
   994 
  1294 /**
   995 /**
  1295  * Detect xml
   996  * Checks a node for validity as a Sizzle context
       
   997  * @param {Element|Object=} context
       
   998  * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
       
   999  */
       
  1000 function testContext( context ) {
       
  1001 	return context && typeof context.getElementsByTagName !== "undefined" && context;
       
  1002 }
       
  1003 
       
  1004 // Expose support vars for convenience
       
  1005 support = Sizzle.support = {};
       
  1006 
       
  1007 /**
       
  1008  * Detects XML nodes
  1296  * @param {Element|Object} elem An element or a document
  1009  * @param {Element|Object} elem An element or a document
       
  1010  * @returns {Boolean} True iff elem is a non-HTML XML node
  1297  */
  1011  */
  1298 isXML = Sizzle.isXML = function( elem ) {
  1012 isXML = Sizzle.isXML = function( elem ) {
  1299 	// documentElement is verified for cases where it doesn't yet exist
  1013 	// documentElement is verified for cases where it doesn't yet exist
  1300 	// (such as loading iframes in IE - #4833)
  1014 	// (such as loading iframes in IE - #4833)
  1301 	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
  1015 	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
  1302 	return documentElement ? documentElement.nodeName !== "HTML" : false;
  1016 	return documentElement ? documentElement.nodeName !== "HTML" : false;
  1303 };
  1017 };
  1304 
  1018 
  1305 // Expose support vars for convenience
       
  1306 support = Sizzle.support = {};
       
  1307 
       
  1308 /**
  1019 /**
  1309  * Sets document-related variables once based on the current document
  1020  * Sets document-related variables once based on the current document
  1310  * @param {Element|Object} [doc] An element or document object to use to set the document
  1021  * @param {Element|Object} [doc] An element or document object to use to set the document
  1311  * @returns {Object} Returns the current document
  1022  * @returns {Object} Returns the current document
  1312  */
  1023  */
  1313 setDocument = Sizzle.setDocument = function( node ) {
  1024 setDocument = Sizzle.setDocument = function( node ) {
  1314 	var doc = node ? node.ownerDocument || node : preferredDoc,
  1025 	var hasCompare, parent,
  1315 		parent = doc.defaultView;
  1026 		doc = node ? node.ownerDocument || node : preferredDoc;
  1316 
  1027 
  1317 	// If no document and documentElement is available, return
  1028 	// If no document and documentElement is available, return
  1318 	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
  1029 	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
  1319 		return document;
  1030 		return document;
  1320 	}
  1031 	}
  1321 
  1032 
  1322 	// Set our document
  1033 	// Set our document
  1323 	document = doc;
  1034 	document = doc;
  1324 	docElem = doc.documentElement;
  1035 	docElem = doc.documentElement;
  1325 
  1036 	parent = doc.defaultView;
  1326 	// Support tests
       
  1327 	documentIsHTML = !isXML( doc );
       
  1328 
  1037 
  1329 	// Support: IE>8
  1038 	// Support: IE>8
  1330 	// If iframe document is assigned to "document" variable and if iframe has been reloaded,
  1039 	// If iframe document is assigned to "document" variable and if iframe has been reloaded,
  1331 	// IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
  1040 	// IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
  1332 	// IE6-8 do not support the defaultView property so parent will be undefined
  1041 	// IE6-8 do not support the defaultView property so parent will be undefined
  1333 	if ( parent && parent.attachEvent && parent !== parent.top ) {
  1042 	if ( parent && parent !== parent.top ) {
  1334 		parent.attachEvent( "onbeforeunload", function() {
  1043 		// IE11 does not have attachEvent, so all must suffer
  1335 			setDocument();
  1044 		if ( parent.addEventListener ) {
  1336 		});
  1045 			parent.addEventListener( "unload", unloadHandler, false );
  1337 	}
  1046 		} else if ( parent.attachEvent ) {
       
  1047 			parent.attachEvent( "onunload", unloadHandler );
       
  1048 		}
       
  1049 	}
       
  1050 
       
  1051 	/* Support tests
       
  1052 	---------------------------------------------------------------------- */
       
  1053 	documentIsHTML = !isXML( doc );
  1338 
  1054 
  1339 	/* Attributes
  1055 	/* Attributes
  1340 	---------------------------------------------------------------------- */
  1056 	---------------------------------------------------------------------- */
  1341 
  1057 
  1342 	// Support: IE<8
  1058 	// Support: IE<8
  1343 	// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
  1059 	// Verify that getAttribute really returns attributes and not properties
       
  1060 	// (excepting IE8 booleans)
  1344 	support.attributes = assert(function( div ) {
  1061 	support.attributes = assert(function( div ) {
  1345 		div.className = "i";
  1062 		div.className = "i";
  1346 		return !div.getAttribute("className");
  1063 		return !div.getAttribute("className");
  1347 	});
  1064 	});
  1348 
  1065 
  1353 	support.getElementsByTagName = assert(function( div ) {
  1070 	support.getElementsByTagName = assert(function( div ) {
  1354 		div.appendChild( doc.createComment("") );
  1071 		div.appendChild( doc.createComment("") );
  1355 		return !div.getElementsByTagName("*").length;
  1072 		return !div.getElementsByTagName("*").length;
  1356 	});
  1073 	});
  1357 
  1074 
  1358 	// Check if getElementsByClassName can be trusted
  1075 	// Support: IE<9
  1359 	support.getElementsByClassName = assert(function( div ) {
  1076 	support.getElementsByClassName = rnative.test( doc.getElementsByClassName );
  1360 		div.innerHTML = "<div class='a'></div><div class='a i'></div>";
       
  1361 
       
  1362 		// Support: Safari<4
       
  1363 		// Catch class over-caching
       
  1364 		div.firstChild.className = "i";
       
  1365 		// Support: Opera<10
       
  1366 		// Catch gEBCN failure to find non-leading classes
       
  1367 		return div.getElementsByClassName("i").length === 2;
       
  1368 	});
       
  1369 
  1077 
  1370 	// Support: IE<10
  1078 	// Support: IE<10
  1371 	// Check if getElementById returns elements by name
  1079 	// Check if getElementById returns elements by name
  1372 	// The broken getElementById methods don't pick up programatically-set names,
  1080 	// The broken getElementById methods don't pick up programatically-set names,
  1373 	// so use a roundabout getElementsByName test
  1081 	// so use a roundabout getElementsByName test
  1377 	});
  1085 	});
  1378 
  1086 
  1379 	// ID find and filter
  1087 	// ID find and filter
  1380 	if ( support.getById ) {
  1088 	if ( support.getById ) {
  1381 		Expr.find["ID"] = function( id, context ) {
  1089 		Expr.find["ID"] = function( id, context ) {
  1382 			if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
  1090 			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
  1383 				var m = context.getElementById( id );
  1091 				var m = context.getElementById( id );
  1384 				// Check parentNode to catch when Blackberry 4.6 returns
  1092 				// Check parentNode to catch when Blackberry 4.6 returns
  1385 				// nodes that are no longer in the document #6963
  1093 				// nodes that are no longer in the document #6963
  1386 				return m && m.parentNode ? [m] : [];
  1094 				return m && m.parentNode ? [ m ] : [];
  1387 			}
  1095 			}
  1388 		};
  1096 		};
  1389 		Expr.filter["ID"] = function( id ) {
  1097 		Expr.filter["ID"] = function( id ) {
  1390 			var attrId = id.replace( runescape, funescape );
  1098 			var attrId = id.replace( runescape, funescape );
  1391 			return function( elem ) {
  1099 			return function( elem ) {
  1398 		delete Expr.find["ID"];
  1106 		delete Expr.find["ID"];
  1399 
  1107 
  1400 		Expr.filter["ID"] =  function( id ) {
  1108 		Expr.filter["ID"] =  function( id ) {
  1401 			var attrId = id.replace( runescape, funescape );
  1109 			var attrId = id.replace( runescape, funescape );
  1402 			return function( elem ) {
  1110 			return function( elem ) {
  1403 				var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
  1111 				var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
  1404 				return node && node.value === attrId;
  1112 				return node && node.value === attrId;
  1405 			};
  1113 			};
  1406 		};
  1114 		};
  1407 	}
  1115 	}
  1408 
  1116 
  1409 	// Tag
  1117 	// Tag
  1410 	Expr.find["TAG"] = support.getElementsByTagName ?
  1118 	Expr.find["TAG"] = support.getElementsByTagName ?
  1411 		function( tag, context ) {
  1119 		function( tag, context ) {
  1412 			if ( typeof context.getElementsByTagName !== strundefined ) {
  1120 			if ( typeof context.getElementsByTagName !== "undefined" ) {
  1413 				return context.getElementsByTagName( tag );
  1121 				return context.getElementsByTagName( tag );
       
  1122 
       
  1123 			// DocumentFragment nodes don't have gEBTN
       
  1124 			} else if ( support.qsa ) {
       
  1125 				return context.querySelectorAll( tag );
  1414 			}
  1126 			}
  1415 		} :
  1127 		} :
       
  1128 
  1416 		function( tag, context ) {
  1129 		function( tag, context ) {
  1417 			var elem,
  1130 			var elem,
  1418 				tmp = [],
  1131 				tmp = [],
  1419 				i = 0,
  1132 				i = 0,
       
  1133 				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
  1420 				results = context.getElementsByTagName( tag );
  1134 				results = context.getElementsByTagName( tag );
  1421 
  1135 
  1422 			// Filter out possible comments
  1136 			// Filter out possible comments
  1423 			if ( tag === "*" ) {
  1137 			if ( tag === "*" ) {
  1424 				while ( (elem = results[i++]) ) {
  1138 				while ( (elem = results[i++]) ) {
  1432 			return results;
  1146 			return results;
  1433 		};
  1147 		};
  1434 
  1148 
  1435 	// Class
  1149 	// Class
  1436 	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
  1150 	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
  1437 		if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
  1151 		if ( documentIsHTML ) {
  1438 			return context.getElementsByClassName( className );
  1152 			return context.getElementsByClassName( className );
  1439 		}
  1153 		}
  1440 	};
  1154 	};
  1441 
  1155 
  1442 	/* QSA/matchesSelector
  1156 	/* QSA/matchesSelector
  1461 			// Select is set to empty string on purpose
  1175 			// Select is set to empty string on purpose
  1462 			// This is to test IE's treatment of not explicitly
  1176 			// This is to test IE's treatment of not explicitly
  1463 			// setting a boolean content attribute,
  1177 			// setting a boolean content attribute,
  1464 			// since its presence should be enough
  1178 			// since its presence should be enough
  1465 			// http://bugs.jquery.com/ticket/12359
  1179 			// http://bugs.jquery.com/ticket/12359
  1466 			div.innerHTML = "<select><option selected=''></option></select>";
  1180 			docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
       
  1181 				"<select id='" + expando + "-\f]' msallowcapture=''>" +
       
  1182 				"<option selected=''></option></select>";
       
  1183 
       
  1184 			// Support: IE8, Opera 11-12.16
       
  1185 			// Nothing should be selected when empty strings follow ^= or $= or *=
       
  1186 			// The test attribute must be unknown in Opera but "safe" for WinRT
       
  1187 			// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
       
  1188 			if ( div.querySelectorAll("[msallowcapture^='']").length ) {
       
  1189 				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
       
  1190 			}
  1467 
  1191 
  1468 			// Support: IE8
  1192 			// Support: IE8
  1469 			// Boolean attributes and "value" are not treated correctly
  1193 			// Boolean attributes and "value" are not treated correctly
  1470 			if ( !div.querySelectorAll("[selected]").length ) {
  1194 			if ( !div.querySelectorAll("[selected]").length ) {
  1471 				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
  1195 				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
       
  1196 			}
       
  1197 
       
  1198 			// Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+
       
  1199 			if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
       
  1200 				rbuggyQSA.push("~=");
  1472 			}
  1201 			}
  1473 
  1202 
  1474 			// Webkit/Opera - :checked should return selected option elements
  1203 			// Webkit/Opera - :checked should return selected option elements
  1475 			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
  1204 			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
  1476 			// IE8 throws error here and will not see later tests
  1205 			// IE8 throws error here and will not see later tests
  1477 			if ( !div.querySelectorAll(":checked").length ) {
  1206 			if ( !div.querySelectorAll(":checked").length ) {
  1478 				rbuggyQSA.push(":checked");
  1207 				rbuggyQSA.push(":checked");
  1479 			}
  1208 			}
       
  1209 
       
  1210 			// Support: Safari 8+, iOS 8+
       
  1211 			// https://bugs.webkit.org/show_bug.cgi?id=136851
       
  1212 			// In-page `selector#id sibing-combinator selector` fails
       
  1213 			if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
       
  1214 				rbuggyQSA.push(".#.+[+~]");
       
  1215 			}
  1480 		});
  1216 		});
  1481 
  1217 
  1482 		assert(function( div ) {
  1218 		assert(function( div ) {
  1483 
       
  1484 			// Support: Opera 10-12/IE8
       
  1485 			// ^= $= *= and empty values
       
  1486 			// Should not select anything
       
  1487 			// Support: Windows 8 Native Apps
  1219 			// Support: Windows 8 Native Apps
  1488 			// The type attribute is restricted during .innerHTML assignment
  1220 			// The type and name attributes are restricted during .innerHTML assignment
  1489 			var input = doc.createElement("input");
  1221 			var input = doc.createElement("input");
  1490 			input.setAttribute( "type", "hidden" );
  1222 			input.setAttribute( "type", "hidden" );
  1491 			div.appendChild( input ).setAttribute( "t", "" );
  1223 			div.appendChild( input ).setAttribute( "name", "D" );
  1492 
  1224 
  1493 			if ( div.querySelectorAll("[t^='']").length ) {
  1225 			// Support: IE8
  1494 				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
  1226 			// Enforce case-sensitivity of name attribute
       
  1227 			if ( div.querySelectorAll("[name=d]").length ) {
       
  1228 				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
  1495 			}
  1229 			}
  1496 
  1230 
  1497 			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
  1231 			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
  1498 			// IE8 throws error here and will not see later tests
  1232 			// IE8 throws error here and will not see later tests
  1499 			if ( !div.querySelectorAll(":enabled").length ) {
  1233 			if ( !div.querySelectorAll(":enabled").length ) {
  1504 			div.querySelectorAll("*,:x");
  1238 			div.querySelectorAll("*,:x");
  1505 			rbuggyQSA.push(",.*:");
  1239 			rbuggyQSA.push(",.*:");
  1506 		});
  1240 		});
  1507 	}
  1241 	}
  1508 
  1242 
  1509 	if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||
  1243 	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
       
  1244 		docElem.webkitMatchesSelector ||
  1510 		docElem.mozMatchesSelector ||
  1245 		docElem.mozMatchesSelector ||
  1511 		docElem.oMatchesSelector ||
  1246 		docElem.oMatchesSelector ||
  1512 		docElem.msMatchesSelector) )) ) {
  1247 		docElem.msMatchesSelector) )) ) {
  1513 
  1248 
  1514 		assert(function( div ) {
  1249 		assert(function( div ) {
  1526 	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
  1261 	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
  1527 	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
  1262 	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
  1528 
  1263 
  1529 	/* Contains
  1264 	/* Contains
  1530 	---------------------------------------------------------------------- */
  1265 	---------------------------------------------------------------------- */
       
  1266 	hasCompare = rnative.test( docElem.compareDocumentPosition );
  1531 
  1267 
  1532 	// Element contains another
  1268 	// Element contains another
  1533 	// Purposefully does not implement inclusive descendent
  1269 	// Purposefully does not implement inclusive descendent
  1534 	// As in, an element does not contain itself
  1270 	// As in, an element does not contain itself
  1535 	contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?
  1271 	contains = hasCompare || rnative.test( docElem.contains ) ?
  1536 		function( a, b ) {
  1272 		function( a, b ) {
  1537 			var adown = a.nodeType === 9 ? a.documentElement : a,
  1273 			var adown = a.nodeType === 9 ? a.documentElement : a,
  1538 				bup = b && b.parentNode;
  1274 				bup = b && b.parentNode;
  1539 			return a === bup || !!( bup && bup.nodeType === 1 && (
  1275 			return a === bup || !!( bup && bup.nodeType === 1 && (
  1540 				adown.contains ?
  1276 				adown.contains ?
  1555 
  1291 
  1556 	/* Sorting
  1292 	/* Sorting
  1557 	---------------------------------------------------------------------- */
  1293 	---------------------------------------------------------------------- */
  1558 
  1294 
  1559 	// Document order sorting
  1295 	// Document order sorting
  1560 	sortOrder = docElem.compareDocumentPosition ?
  1296 	sortOrder = hasCompare ?
  1561 	function( a, b ) {
  1297 	function( a, b ) {
  1562 
  1298 
  1563 		// Flag for duplicate removal
  1299 		// Flag for duplicate removal
  1564 		if ( a === b ) {
  1300 		if ( a === b ) {
  1565 			hasDuplicate = true;
  1301 			hasDuplicate = true;
  1566 			return 0;
  1302 			return 0;
  1567 		}
  1303 		}
  1568 
  1304 
  1569 		var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );
  1305 		// Sort on method existence if only one input has compareDocumentPosition
  1570 
  1306 		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
  1571 		if ( compare ) {
  1307 		if ( compare ) {
  1572 			// Disconnected nodes
  1308 			return compare;
  1573 			if ( compare & 1 ||
  1309 		}
  1574 				(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
  1310 
  1575 
  1311 		// Calculate position if both inputs belong to the same document
  1576 				// Choose the first element that is related to our preferred document
  1312 		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
  1577 				if ( a === doc || contains(preferredDoc, a) ) {
  1313 			a.compareDocumentPosition( b ) :
  1578 					return -1;
  1314 
  1579 				}
  1315 			// Otherwise we know they are disconnected
  1580 				if ( b === doc || contains(preferredDoc, b) ) {
  1316 			1;
  1581 					return 1;
  1317 
  1582 				}
  1318 		// Disconnected nodes
  1583 
  1319 		if ( compare & 1 ||
  1584 				// Maintain original order
  1320 			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
  1585 				return sortInput ?
  1321 
  1586 					( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
  1322 			// Choose the first element that is related to our preferred document
  1587 					0;
  1323 			if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
  1588 			}
  1324 				return -1;
  1589 
  1325 			}
  1590 			return compare & 4 ? -1 : 1;
  1326 			if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
  1591 		}
  1327 				return 1;
  1592 
  1328 			}
  1593 		// Not directly comparable, sort on existence of method
  1329 
  1594 		return a.compareDocumentPosition ? -1 : 1;
  1330 			// Maintain original order
       
  1331 			return sortInput ?
       
  1332 				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
       
  1333 				0;
       
  1334 		}
       
  1335 
       
  1336 		return compare & 4 ? -1 : 1;
  1595 	} :
  1337 	} :
  1596 	function( a, b ) {
  1338 	function( a, b ) {
       
  1339 		// Exit early if the nodes are identical
       
  1340 		if ( a === b ) {
       
  1341 			hasDuplicate = true;
       
  1342 			return 0;
       
  1343 		}
       
  1344 
  1597 		var cur,
  1345 		var cur,
  1598 			i = 0,
  1346 			i = 0,
  1599 			aup = a.parentNode,
  1347 			aup = a.parentNode,
  1600 			bup = b.parentNode,
  1348 			bup = b.parentNode,
  1601 			ap = [ a ],
  1349 			ap = [ a ],
  1602 			bp = [ b ];
  1350 			bp = [ b ];
  1603 
  1351 
  1604 		// Exit early if the nodes are identical
       
  1605 		if ( a === b ) {
       
  1606 			hasDuplicate = true;
       
  1607 			return 0;
       
  1608 
       
  1609 		// Parentless nodes are either documents or disconnected
  1352 		// Parentless nodes are either documents or disconnected
  1610 		} else if ( !aup || !bup ) {
  1353 		if ( !aup || !bup ) {
  1611 			return a === doc ? -1 :
  1354 			return a === doc ? -1 :
  1612 				b === doc ? 1 :
  1355 				b === doc ? 1 :
  1613 				aup ? -1 :
  1356 				aup ? -1 :
  1614 				bup ? 1 :
  1357 				bup ? 1 :
  1615 				sortInput ?
  1358 				sortInput ?
  1616 				( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
  1359 				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
  1617 				0;
  1360 				0;
  1618 
  1361 
  1619 		// If the nodes are siblings, we can do a quick check
  1362 		// If the nodes are siblings, we can do a quick check
  1620 		} else if ( aup === bup ) {
  1363 		} else if ( aup === bup ) {
  1621 			return siblingCheck( a, b );
  1364 			return siblingCheck( a, b );
  1674 					// As well, disconnected nodes are said to be in a document
  1417 					// As well, disconnected nodes are said to be in a document
  1675 					// fragment in IE 9
  1418 					// fragment in IE 9
  1676 					elem.document && elem.document.nodeType !== 11 ) {
  1419 					elem.document && elem.document.nodeType !== 11 ) {
  1677 				return ret;
  1420 				return ret;
  1678 			}
  1421 			}
  1679 		} catch(e) {}
  1422 		} catch (e) {}
  1680 	}
  1423 	}
  1681 
  1424 
  1682 	return Sizzle( expr, document, null, [elem] ).length > 0;
  1425 	return Sizzle( expr, document, null, [ elem ] ).length > 0;
  1683 };
  1426 };
  1684 
  1427 
  1685 Sizzle.contains = function( context, elem ) {
  1428 Sizzle.contains = function( context, elem ) {
  1686 	// Set document vars if needed
  1429 	// Set document vars if needed
  1687 	if ( ( context.ownerDocument || context ) !== document ) {
  1430 	if ( ( context.ownerDocument || context ) !== document ) {
  1700 		// Don't get fooled by Object.prototype properties (jQuery #13807)
  1443 		// Don't get fooled by Object.prototype properties (jQuery #13807)
  1701 		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
  1444 		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
  1702 			fn( elem, name, !documentIsHTML ) :
  1445 			fn( elem, name, !documentIsHTML ) :
  1703 			undefined;
  1446 			undefined;
  1704 
  1447 
  1705 	return val === undefined ?
  1448 	return val !== undefined ?
       
  1449 		val :
  1706 		support.attributes || !documentIsHTML ?
  1450 		support.attributes || !documentIsHTML ?
  1707 			elem.getAttribute( name ) :
  1451 			elem.getAttribute( name ) :
  1708 			(val = elem.getAttributeNode(name)) && val.specified ?
  1452 			(val = elem.getAttributeNode(name)) && val.specified ?
  1709 				val.value :
  1453 				val.value :
  1710 				null :
  1454 				null;
  1711 		val;
       
  1712 };
  1455 };
  1713 
  1456 
  1714 Sizzle.error = function( msg ) {
  1457 Sizzle.error = function( msg ) {
  1715 	throw new Error( "Syntax error, unrecognized expression: " + msg );
  1458 	throw new Error( "Syntax error, unrecognized expression: " + msg );
  1716 };
  1459 };
  1739 		while ( j-- ) {
  1482 		while ( j-- ) {
  1740 			results.splice( duplicates[ j ], 1 );
  1483 			results.splice( duplicates[ j ], 1 );
  1741 		}
  1484 		}
  1742 	}
  1485 	}
  1743 
  1486 
       
  1487 	// Clear input after sorting to release objects
       
  1488 	// See https://github.com/jquery/sizzle/pull/225
       
  1489 	sortInput = null;
       
  1490 
  1744 	return results;
  1491 	return results;
  1745 };
  1492 };
  1746 
  1493 
  1747 /**
  1494 /**
  1748  * Utility function for retrieving the text value of an array of DOM nodes
  1495  * Utility function for retrieving the text value of an array of DOM nodes
  1754 		i = 0,
  1501 		i = 0,
  1755 		nodeType = elem.nodeType;
  1502 		nodeType = elem.nodeType;
  1756 
  1503 
  1757 	if ( !nodeType ) {
  1504 	if ( !nodeType ) {
  1758 		// If no nodeType, this is expected to be an array
  1505 		// If no nodeType, this is expected to be an array
  1759 		for ( ; (node = elem[i]); i++ ) {
  1506 		while ( (node = elem[i++]) ) {
  1760 			// Do not traverse comment nodes
  1507 			// Do not traverse comment nodes
  1761 			ret += getText( node );
  1508 			ret += getText( node );
  1762 		}
  1509 		}
  1763 	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
  1510 	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
  1764 		// Use textContent for elements
  1511 		// Use textContent for elements
  1765 		// innerText usage removed for consistency of new lines (see #11153)
  1512 		// innerText usage removed for consistency of new lines (jQuery #11153)
  1766 		if ( typeof elem.textContent === "string" ) {
  1513 		if ( typeof elem.textContent === "string" ) {
  1767 			return elem.textContent;
  1514 			return elem.textContent;
  1768 		} else {
  1515 		} else {
  1769 			// Traverse its children
  1516 			// Traverse its children
  1770 			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
  1517 			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
  1802 	preFilter: {
  1549 	preFilter: {
  1803 		"ATTR": function( match ) {
  1550 		"ATTR": function( match ) {
  1804 			match[1] = match[1].replace( runescape, funescape );
  1551 			match[1] = match[1].replace( runescape, funescape );
  1805 
  1552 
  1806 			// Move the given value to match[3] whether quoted or unquoted
  1553 			// Move the given value to match[3] whether quoted or unquoted
  1807 			match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
  1554 			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
  1808 
  1555 
  1809 			if ( match[2] === "~=" ) {
  1556 			if ( match[2] === "~=" ) {
  1810 				match[3] = " " + match[3] + " ";
  1557 				match[3] = " " + match[3] + " ";
  1811 			}
  1558 			}
  1812 
  1559 
  1845 			return match;
  1592 			return match;
  1846 		},
  1593 		},
  1847 
  1594 
  1848 		"PSEUDO": function( match ) {
  1595 		"PSEUDO": function( match ) {
  1849 			var excess,
  1596 			var excess,
  1850 				unquoted = !match[5] && match[2];
  1597 				unquoted = !match[6] && match[2];
  1851 
  1598 
  1852 			if ( matchExpr["CHILD"].test( match[0] ) ) {
  1599 			if ( matchExpr["CHILD"].test( match[0] ) ) {
  1853 				return null;
  1600 				return null;
  1854 			}
  1601 			}
  1855 
  1602 
  1856 			// Accept quoted arguments as-is
  1603 			// Accept quoted arguments as-is
  1857 			if ( match[3] && match[4] !== undefined ) {
  1604 			if ( match[3] ) {
  1858 				match[2] = match[4];
  1605 				match[2] = match[4] || match[5] || "";
  1859 
  1606 
  1860 			// Strip excess characters from unquoted arguments
  1607 			// Strip excess characters from unquoted arguments
  1861 			} else if ( unquoted && rpseudo.test( unquoted ) &&
  1608 			} else if ( unquoted && rpseudo.test( unquoted ) &&
  1862 				// Get excess from tokenize (recursively)
  1609 				// Get excess from tokenize (recursively)
  1863 				(excess = tokenize( unquoted, true )) &&
  1610 				(excess = tokenize( unquoted, true )) &&
  1889 			var pattern = classCache[ className + " " ];
  1636 			var pattern = classCache[ className + " " ];
  1890 
  1637 
  1891 			return pattern ||
  1638 			return pattern ||
  1892 				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
  1639 				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
  1893 				classCache( className, function( elem ) {
  1640 				classCache( className, function( elem ) {
  1894 					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
  1641 					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
  1895 				});
  1642 				});
  1896 		},
  1643 		},
  1897 
  1644 
  1898 		"ATTR": function( name, operator, check ) {
  1645 		"ATTR": function( name, operator, check ) {
  1899 			return function( elem ) {
  1646 			return function( elem ) {
  1911 				return operator === "=" ? result === check :
  1658 				return operator === "=" ? result === check :
  1912 					operator === "!=" ? result !== check :
  1659 					operator === "!=" ? result !== check :
  1913 					operator === "^=" ? check && result.indexOf( check ) === 0 :
  1660 					operator === "^=" ? check && result.indexOf( check ) === 0 :
  1914 					operator === "*=" ? check && result.indexOf( check ) > -1 :
  1661 					operator === "*=" ? check && result.indexOf( check ) > -1 :
  1915 					operator === "$=" ? check && result.slice( -check.length ) === check :
  1662 					operator === "$=" ? check && result.slice( -check.length ) === check :
  1916 					operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
  1663 					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
  1917 					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
  1664 					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
  1918 					false;
  1665 					false;
  1919 			};
  1666 			};
  1920 		},
  1667 		},
  1921 
  1668 
  2031 					markFunction(function( seed, matches ) {
  1778 					markFunction(function( seed, matches ) {
  2032 						var idx,
  1779 						var idx,
  2033 							matched = fn( seed, argument ),
  1780 							matched = fn( seed, argument ),
  2034 							i = matched.length;
  1781 							i = matched.length;
  2035 						while ( i-- ) {
  1782 						while ( i-- ) {
  2036 							idx = indexOf.call( seed, matched[i] );
  1783 							idx = indexOf( seed, matched[i] );
  2037 							seed[ idx ] = !( matches[ idx ] = matched[i] );
  1784 							seed[ idx ] = !( matches[ idx ] = matched[i] );
  2038 						}
  1785 						}
  2039 					}) :
  1786 					}) :
  2040 					function( elem ) {
  1787 					function( elem ) {
  2041 						return fn( elem, 0, args );
  1788 						return fn( elem, 0, args );
  2070 					}
  1817 					}
  2071 				}) :
  1818 				}) :
  2072 				function( elem, context, xml ) {
  1819 				function( elem, context, xml ) {
  2073 					input[0] = elem;
  1820 					input[0] = elem;
  2074 					matcher( input, null, xml, results );
  1821 					matcher( input, null, xml, results );
       
  1822 					// Don't keep the element (issue #299)
       
  1823 					input[0] = null;
  2075 					return !results.pop();
  1824 					return !results.pop();
  2076 				};
  1825 				};
  2077 		}),
  1826 		}),
  2078 
  1827 
  2079 		"has": markFunction(function( selector ) {
  1828 		"has": markFunction(function( selector ) {
  2081 				return Sizzle( selector, elem ).length > 0;
  1830 				return Sizzle( selector, elem ).length > 0;
  2082 			};
  1831 			};
  2083 		}),
  1832 		}),
  2084 
  1833 
  2085 		"contains": markFunction(function( text ) {
  1834 		"contains": markFunction(function( text ) {
       
  1835 			text = text.replace( runescape, funescape );
  2086 			return function( elem ) {
  1836 			return function( elem ) {
  2087 				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
  1837 				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
  2088 			};
  1838 			};
  2089 		}),
  1839 		}),
  2090 
  1840 
  2157 		},
  1907 		},
  2158 
  1908 
  2159 		// Contents
  1909 		// Contents
  2160 		"empty": function( elem ) {
  1910 		"empty": function( elem ) {
  2161 			// http://www.w3.org/TR/selectors/#empty-pseudo
  1911 			// http://www.w3.org/TR/selectors/#empty-pseudo
  2162 			// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
  1912 			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
  2163 			//   not comment, processing instructions, or others
  1913 			//   but not by others (comment: 8; processing instruction: 7; etc.)
  2164 			// Thanks to Diego Perini for the nodeName shortcut
  1914 			// nodeType < 6 works because attributes (2) do not appear as children
  2165 			//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
       
  2166 			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
  1915 			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
  2167 				if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
  1916 				if ( elem.nodeType < 6 ) {
  2168 					return false;
  1917 					return false;
  2169 				}
  1918 				}
  2170 			}
  1919 			}
  2171 			return true;
  1920 			return true;
  2172 		},
  1921 		},
  2189 			return name === "input" && elem.type === "button" || name === "button";
  1938 			return name === "input" && elem.type === "button" || name === "button";
  2190 		},
  1939 		},
  2191 
  1940 
  2192 		"text": function( elem ) {
  1941 		"text": function( elem ) {
  2193 			var attr;
  1942 			var attr;
  2194 			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
       
  2195 			// use getAttribute instead to test this case
       
  2196 			return elem.nodeName.toLowerCase() === "input" &&
  1943 			return elem.nodeName.toLowerCase() === "input" &&
  2197 				elem.type === "text" &&
  1944 				elem.type === "text" &&
  2198 				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
  1945 
       
  1946 				// Support: IE<8
       
  1947 				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
       
  1948 				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
  2199 		},
  1949 		},
  2200 
  1950 
  2201 		// Position-in-collection
  1951 		// Position-in-collection
  2202 		"first": createPositionalPseudo(function() {
  1952 		"first": createPositionalPseudo(function() {
  2203 			return [ 0 ];
  1953 			return [ 0 ];
  2258 // Easy API for creating new setFilters
  2008 // Easy API for creating new setFilters
  2259 function setFilters() {}
  2009 function setFilters() {}
  2260 setFilters.prototype = Expr.filters = Expr.pseudos;
  2010 setFilters.prototype = Expr.filters = Expr.pseudos;
  2261 Expr.setFilters = new setFilters();
  2011 Expr.setFilters = new setFilters();
  2262 
  2012 
  2263 function tokenize( selector, parseOnly ) {
  2013 tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
  2264 	var matched, match, tokens, type,
  2014 	var matched, match, tokens, type,
  2265 		soFar, groups, preFilters,
  2015 		soFar, groups, preFilters,
  2266 		cached = tokenCache[ selector + " " ];
  2016 		cached = tokenCache[ selector + " " ];
  2267 
  2017 
  2268 	if ( cached ) {
  2018 	if ( cached ) {
  2279 		if ( !matched || (match = rcomma.exec( soFar )) ) {
  2029 		if ( !matched || (match = rcomma.exec( soFar )) ) {
  2280 			if ( match ) {
  2030 			if ( match ) {
  2281 				// Don't consume trailing commas as valid
  2031 				// Don't consume trailing commas as valid
  2282 				soFar = soFar.slice( match[0].length ) || soFar;
  2032 				soFar = soFar.slice( match[0].length ) || soFar;
  2283 			}
  2033 			}
  2284 			groups.push( tokens = [] );
  2034 			groups.push( (tokens = []) );
  2285 		}
  2035 		}
  2286 
  2036 
  2287 		matched = false;
  2037 		matched = false;
  2288 
  2038 
  2289 		// Combinators
  2039 		// Combinators
  2323 		soFar.length :
  2073 		soFar.length :
  2324 		soFar ?
  2074 		soFar ?
  2325 			Sizzle.error( selector ) :
  2075 			Sizzle.error( selector ) :
  2326 			// Cache the tokens
  2076 			// Cache the tokens
  2327 			tokenCache( selector, groups ).slice( 0 );
  2077 			tokenCache( selector, groups ).slice( 0 );
  2328 }
  2078 };
  2329 
  2079 
  2330 function toSelector( tokens ) {
  2080 function toSelector( tokens ) {
  2331 	var i = 0,
  2081 	var i = 0,
  2332 		len = tokens.length,
  2082 		len = tokens.length,
  2333 		selector = "";
  2083 		selector = "";
  2352 			}
  2102 			}
  2353 		} :
  2103 		} :
  2354 
  2104 
  2355 		// Check against all ancestor/preceding elements
  2105 		// Check against all ancestor/preceding elements
  2356 		function( elem, context, xml ) {
  2106 		function( elem, context, xml ) {
  2357 			var data, cache, outerCache,
  2107 			var oldCache, outerCache,
  2358 				dirkey = dirruns + " " + doneName;
  2108 				newCache = [ dirruns, doneName ];
  2359 
  2109 
  2360 			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
  2110 			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
  2361 			if ( xml ) {
  2111 			if ( xml ) {
  2362 				while ( (elem = elem[ dir ]) ) {
  2112 				while ( (elem = elem[ dir ]) ) {
  2363 					if ( elem.nodeType === 1 || checkNonElements ) {
  2113 					if ( elem.nodeType === 1 || checkNonElements ) {
  2368 				}
  2118 				}
  2369 			} else {
  2119 			} else {
  2370 				while ( (elem = elem[ dir ]) ) {
  2120 				while ( (elem = elem[ dir ]) ) {
  2371 					if ( elem.nodeType === 1 || checkNonElements ) {
  2121 					if ( elem.nodeType === 1 || checkNonElements ) {
  2372 						outerCache = elem[ expando ] || (elem[ expando ] = {});
  2122 						outerCache = elem[ expando ] || (elem[ expando ] = {});
  2373 						if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
  2123 						if ( (oldCache = outerCache[ dir ]) &&
  2374 							if ( (data = cache[1]) === true || data === cachedruns ) {
  2124 							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
  2375 								return data === true;
  2125 
  2376 							}
  2126 							// Assign to newCache so results back-propagate to previous elements
       
  2127 							return (newCache[ 2 ] = oldCache[ 2 ]);
  2377 						} else {
  2128 						} else {
  2378 							cache = outerCache[ dir ] = [ dirkey ];
  2129 							// Reuse newcache so results back-propagate to previous elements
  2379 							cache[1] = matcher( elem, context, xml ) || cachedruns;
  2130 							outerCache[ dir ] = newCache;
  2380 							if ( cache[1] === true ) {
  2131 
       
  2132 							// A match means we're done; a fail means we have to keep checking
       
  2133 							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
  2381 								return true;
  2134 								return true;
  2382 							}
  2135 							}
  2383 						}
  2136 						}
  2384 					}
  2137 					}
  2385 				}
  2138 				}
  2397 				}
  2150 				}
  2398 			}
  2151 			}
  2399 			return true;
  2152 			return true;
  2400 		} :
  2153 		} :
  2401 		matchers[0];
  2154 		matchers[0];
       
  2155 }
       
  2156 
       
  2157 function multipleContexts( selector, contexts, results ) {
       
  2158 	var i = 0,
       
  2159 		len = contexts.length;
       
  2160 	for ( ; i < len; i++ ) {
       
  2161 		Sizzle( selector, contexts[i], results );
       
  2162 	}
       
  2163 	return results;
  2402 }
  2164 }
  2403 
  2165 
  2404 function condense( unmatched, map, filter, context, xml ) {
  2166 function condense( unmatched, map, filter, context, xml ) {
  2405 	var elem,
  2167 	var elem,
  2406 		newUnmatched = [],
  2168 		newUnmatched = [],
  2490 
  2252 
  2491 				// Move matched elements from seed to results to keep them synchronized
  2253 				// Move matched elements from seed to results to keep them synchronized
  2492 				i = matcherOut.length;
  2254 				i = matcherOut.length;
  2493 				while ( i-- ) {
  2255 				while ( i-- ) {
  2494 					if ( (elem = matcherOut[i]) &&
  2256 					if ( (elem = matcherOut[i]) &&
  2495 						(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
  2257 						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
  2496 
  2258 
  2497 						seed[temp] = !(results[temp] = elem);
  2259 						seed[temp] = !(results[temp] = elem);
  2498 					}
  2260 					}
  2499 				}
  2261 				}
  2500 			}
  2262 			}
  2525 		// The foundational matcher ensures that elements are reachable from top-level context(s)
  2287 		// The foundational matcher ensures that elements are reachable from top-level context(s)
  2526 		matchContext = addCombinator( function( elem ) {
  2288 		matchContext = addCombinator( function( elem ) {
  2527 			return elem === checkContext;
  2289 			return elem === checkContext;
  2528 		}, implicitRelative, true ),
  2290 		}, implicitRelative, true ),
  2529 		matchAnyContext = addCombinator( function( elem ) {
  2291 		matchAnyContext = addCombinator( function( elem ) {
  2530 			return indexOf.call( checkContext, elem ) > -1;
  2292 			return indexOf( checkContext, elem ) > -1;
  2531 		}, implicitRelative, true ),
  2293 		}, implicitRelative, true ),
  2532 		matchers = [ function( elem, context, xml ) {
  2294 		matchers = [ function( elem, context, xml ) {
  2533 			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
  2295 			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
  2534 				(checkContext = context).nodeType ?
  2296 				(checkContext = context).nodeType ?
  2535 					matchContext( elem, context, xml ) :
  2297 					matchContext( elem, context, xml ) :
  2536 					matchAnyContext( elem, context, xml ) );
  2298 					matchAnyContext( elem, context, xml ) );
       
  2299 			// Avoid hanging onto element (issue #299)
       
  2300 			checkContext = null;
       
  2301 			return ret;
  2537 		} ];
  2302 		} ];
  2538 
  2303 
  2539 	for ( ; i < len; i++ ) {
  2304 	for ( ; i < len; i++ ) {
  2540 		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
  2305 		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
  2541 			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
  2306 			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
  2569 
  2334 
  2570 	return elementMatcher( matchers );
  2335 	return elementMatcher( matchers );
  2571 }
  2336 }
  2572 
  2337 
  2573 function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  2338 function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  2574 	// A counter to specify which element is currently being matched
  2339 	var bySet = setMatchers.length > 0,
  2575 	var matcherCachedRuns = 0,
       
  2576 		bySet = setMatchers.length > 0,
       
  2577 		byElement = elementMatchers.length > 0,
  2340 		byElement = elementMatchers.length > 0,
  2578 		superMatcher = function( seed, context, xml, results, expandContext ) {
  2341 		superMatcher = function( seed, context, xml, results, outermost ) {
  2579 			var elem, j, matcher,
  2342 			var elem, j, matcher,
  2580 				setMatched = [],
       
  2581 				matchedCount = 0,
  2343 				matchedCount = 0,
  2582 				i = "0",
  2344 				i = "0",
  2583 				unmatched = seed && [],
  2345 				unmatched = seed && [],
  2584 				outermost = expandContext != null,
  2346 				setMatched = [],
  2585 				contextBackup = outermostContext,
  2347 				contextBackup = outermostContext,
  2586 				// We must always have either seed elements or context
  2348 				// We must always have either seed elements or outermost context
  2587 				elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
  2349 				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
  2588 				// Use integer dirruns iff this is the outermost matcher
  2350 				// Use integer dirruns iff this is the outermost matcher
  2589 				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
  2351 				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
       
  2352 				len = elems.length;
  2590 
  2353 
  2591 			if ( outermost ) {
  2354 			if ( outermost ) {
  2592 				outermostContext = context !== document && context;
  2355 				outermostContext = context !== document && context;
  2593 				cachedruns = matcherCachedRuns;
       
  2594 			}
  2356 			}
  2595 
  2357 
  2596 			// Add elements passing elementMatchers directly to results
  2358 			// Add elements passing elementMatchers directly to results
  2597 			// Keep `i` a string if there are no elements so `matchedCount` will be "00" below
  2359 			// Keep `i` a string if there are no elements so `matchedCount` will be "00" below
  2598 			for ( ; (elem = elems[i]) != null; i++ ) {
  2360 			// Support: IE<9, Safari
       
  2361 			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
       
  2362 			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
  2599 				if ( byElement && elem ) {
  2363 				if ( byElement && elem ) {
  2600 					j = 0;
  2364 					j = 0;
  2601 					while ( (matcher = elementMatchers[j++]) ) {
  2365 					while ( (matcher = elementMatchers[j++]) ) {
  2602 						if ( matcher( elem, context, xml ) ) {
  2366 						if ( matcher( elem, context, xml ) ) {
  2603 							results.push( elem );
  2367 							results.push( elem );
  2604 							break;
  2368 							break;
  2605 						}
  2369 						}
  2606 					}
  2370 					}
  2607 					if ( outermost ) {
  2371 					if ( outermost ) {
  2608 						dirruns = dirrunsUnique;
  2372 						dirruns = dirrunsUnique;
  2609 						cachedruns = ++matcherCachedRuns;
       
  2610 					}
  2373 					}
  2611 				}
  2374 				}
  2612 
  2375 
  2613 				// Track unmatched elements for set filters
  2376 				// Track unmatched elements for set filters
  2614 				if ( bySet ) {
  2377 				if ( bySet ) {
  2669 	return bySet ?
  2432 	return bySet ?
  2670 		markFunction( superMatcher ) :
  2433 		markFunction( superMatcher ) :
  2671 		superMatcher;
  2434 		superMatcher;
  2672 }
  2435 }
  2673 
  2436 
  2674 compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
  2437 compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
  2675 	var i,
  2438 	var i,
  2676 		setMatchers = [],
  2439 		setMatchers = [],
  2677 		elementMatchers = [],
  2440 		elementMatchers = [],
  2678 		cached = compilerCache[ selector + " " ];
  2441 		cached = compilerCache[ selector + " " ];
  2679 
  2442 
  2680 	if ( !cached ) {
  2443 	if ( !cached ) {
  2681 		// Generate a function of recursive functions that can be used to check each element
  2444 		// Generate a function of recursive functions that can be used to check each element
  2682 		if ( !group ) {
  2445 		if ( !match ) {
  2683 			group = tokenize( selector );
  2446 			match = tokenize( selector );
  2684 		}
  2447 		}
  2685 		i = group.length;
  2448 		i = match.length;
  2686 		while ( i-- ) {
  2449 		while ( i-- ) {
  2687 			cached = matcherFromTokens( group[i] );
  2450 			cached = matcherFromTokens( match[i] );
  2688 			if ( cached[ expando ] ) {
  2451 			if ( cached[ expando ] ) {
  2689 				setMatchers.push( cached );
  2452 				setMatchers.push( cached );
  2690 			} else {
  2453 			} else {
  2691 				elementMatchers.push( cached );
  2454 				elementMatchers.push( cached );
  2692 			}
  2455 			}
  2693 		}
  2456 		}
  2694 
  2457 
  2695 		// Cache the compiled function
  2458 		// Cache the compiled function
  2696 		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
  2459 		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
       
  2460 
       
  2461 		// Save selector and tokenization
       
  2462 		cached.selector = selector;
  2697 	}
  2463 	}
  2698 	return cached;
  2464 	return cached;
  2699 };
  2465 };
  2700 
  2466 
  2701 function multipleContexts( selector, contexts, results ) {
  2467 /**
  2702 	var i = 0,
  2468  * A low-level selection function that works with Sizzle's compiled
  2703 		len = contexts.length;
  2469  *  selector functions
  2704 	for ( ; i < len; i++ ) {
  2470  * @param {String|Function} selector A selector or a pre-compiled
  2705 		Sizzle( selector, contexts[i], results );
  2471  *  selector function built with Sizzle.compile
  2706 	}
  2472  * @param {Element} context
  2707 	return results;
  2473  * @param {Array} [results]
  2708 }
  2474  * @param {Array} [seed] A set of elements to match against
  2709 
  2475  */
  2710 function select( selector, context, results, seed ) {
  2476 select = Sizzle.select = function( selector, context, results, seed ) {
  2711 	var i, tokens, token, type, find,
  2477 	var i, tokens, token, type, find,
  2712 		match = tokenize( selector );
  2478 		compiled = typeof selector === "function" && selector,
  2713 
  2479 		match = !seed && tokenize( (selector = compiled.selector || selector) );
  2714 	if ( !seed ) {
  2480 
  2715 		// Try to minimize operations if there is only one group
  2481 	results = results || [];
  2716 		if ( match.length === 1 ) {
  2482 
  2717 
  2483 	// Try to minimize operations if there is no seed and only one group
  2718 			// Take a shortcut and set the context if the root selector is an ID
  2484 	if ( match.length === 1 ) {
  2719 			tokens = match[0] = match[0].slice( 0 );
  2485 
  2720 			if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
  2486 		// Take a shortcut and set the context if the root selector is an ID
  2721 					support.getById && context.nodeType === 9 && documentIsHTML &&
  2487 		tokens = match[0] = match[0].slice( 0 );
  2722 					Expr.relative[ tokens[1].type ] ) {
  2488 		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
  2723 
  2489 				support.getById && context.nodeType === 9 && documentIsHTML &&
  2724 				context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
  2490 				Expr.relative[ tokens[1].type ] ) {
  2725 				if ( !context ) {
  2491 
  2726 					return results;
  2492 			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
  2727 				}
  2493 			if ( !context ) {
  2728 				selector = selector.slice( tokens.shift().value.length );
  2494 				return results;
  2729 			}
  2495 
  2730 
  2496 			// Precompiled matchers will still verify ancestry, so step up a level
  2731 			// Fetch a seed set for right-to-left matching
  2497 			} else if ( compiled ) {
  2732 			i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
  2498 				context = context.parentNode;
  2733 			while ( i-- ) {
  2499 			}
  2734 				token = tokens[i];
  2500 
  2735 
  2501 			selector = selector.slice( tokens.shift().value.length );
  2736 				// Abort if we hit a combinator
  2502 		}
  2737 				if ( Expr.relative[ (type = token.type) ] ) {
  2503 
       
  2504 		// Fetch a seed set for right-to-left matching
       
  2505 		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
       
  2506 		while ( i-- ) {
       
  2507 			token = tokens[i];
       
  2508 
       
  2509 			// Abort if we hit a combinator
       
  2510 			if ( Expr.relative[ (type = token.type) ] ) {
       
  2511 				break;
       
  2512 			}
       
  2513 			if ( (find = Expr.find[ type ]) ) {
       
  2514 				// Search, expanding context for leading sibling combinators
       
  2515 				if ( (seed = find(
       
  2516 					token.matches[0].replace( runescape, funescape ),
       
  2517 					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
       
  2518 				)) ) {
       
  2519 
       
  2520 					// If seed is empty or no tokens remain, we can return early
       
  2521 					tokens.splice( i, 1 );
       
  2522 					selector = seed.length && toSelector( tokens );
       
  2523 					if ( !selector ) {
       
  2524 						push.apply( results, seed );
       
  2525 						return results;
       
  2526 					}
       
  2527 
  2738 					break;
  2528 					break;
  2739 				}
  2529 				}
  2740 				if ( (find = Expr.find[ type ]) ) {
  2530 			}
  2741 					// Search, expanding context for leading sibling combinators
  2531 		}
  2742 					if ( (seed = find(
  2532 	}
  2743 						token.matches[0].replace( runescape, funescape ),
  2533 
  2744 						rsibling.test( tokens[0].type ) && context.parentNode || context
  2534 	// Compile and execute a filtering function if one is not provided
  2745 					)) ) {
       
  2746 
       
  2747 						// If seed is empty or no tokens remain, we can return early
       
  2748 						tokens.splice( i, 1 );
       
  2749 						selector = seed.length && toSelector( tokens );
       
  2750 						if ( !selector ) {
       
  2751 							push.apply( results, seed );
       
  2752 							return results;
       
  2753 						}
       
  2754 
       
  2755 						break;
       
  2756 					}
       
  2757 				}
       
  2758 			}
       
  2759 		}
       
  2760 	}
       
  2761 
       
  2762 	// Compile and execute a filtering function
       
  2763 	// Provide `match` to avoid retokenization if we modified the selector above
  2535 	// Provide `match` to avoid retokenization if we modified the selector above
  2764 	compile( selector, match )(
  2536 	( compiled || compile( selector, match ) )(
  2765 		seed,
  2537 		seed,
  2766 		context,
  2538 		context,
  2767 		!documentIsHTML,
  2539 		!documentIsHTML,
  2768 		results,
  2540 		results,
  2769 		rsibling.test( selector )
  2541 		rsibling.test( selector ) && testContext( context.parentNode ) || context
  2770 	);
  2542 	);
  2771 	return results;
  2543 	return results;
  2772 }
  2544 };
  2773 
  2545 
  2774 // One-time assignments
  2546 // One-time assignments
  2775 
  2547 
  2776 // Sort stability
  2548 // Sort stability
  2777 support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
  2549 support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
  2778 
  2550 
  2779 // Support: Chrome<14
  2551 // Support: Chrome 14-35+
  2780 // Always assume duplicates if they aren't passed to the comparison function
  2552 // Always assume duplicates if they aren't passed to the comparison function
  2781 support.detectDuplicates = hasDuplicate;
  2553 support.detectDuplicates = !!hasDuplicate;
  2782 
  2554 
  2783 // Initialize against the default document
  2555 // Initialize against the default document
  2784 setDocument();
  2556 setDocument();
  2785 
  2557 
  2786 // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
  2558 // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
  2824 	return div.getAttribute("disabled") == null;
  2596 	return div.getAttribute("disabled") == null;
  2825 }) ) {
  2597 }) ) {
  2826 	addHandle( booleans, function( elem, name, isXML ) {
  2598 	addHandle( booleans, function( elem, name, isXML ) {
  2827 		var val;
  2599 		var val;
  2828 		if ( !isXML ) {
  2600 		if ( !isXML ) {
  2829 			return (val = elem.getAttributeNode( name )) && val.specified ?
  2601 			return elem[ name ] === true ? name.toLowerCase() :
  2830 				val.value :
  2602 					(val = elem.getAttributeNode( name )) && val.specified ?
  2831 				elem[ name ] === true ? name.toLowerCase() : null;
  2603 					val.value :
       
  2604 				null;
  2832 		}
  2605 		}
  2833 	});
  2606 	});
  2834 }
  2607 }
       
  2608 
       
  2609 return Sizzle;
       
  2610 
       
  2611 })( window );
       
  2612 
       
  2613 
  2835 
  2614 
  2836 jQuery.find = Sizzle;
  2615 jQuery.find = Sizzle;
  2837 jQuery.expr = Sizzle.selectors;
  2616 jQuery.expr = Sizzle.selectors;
  2838 jQuery.expr[":"] = jQuery.expr.pseudos;
  2617 jQuery.expr[":"] = jQuery.expr.pseudos;
  2839 jQuery.unique = Sizzle.uniqueSort;
  2618 jQuery.unique = Sizzle.uniqueSort;
  2840 jQuery.text = Sizzle.getText;
  2619 jQuery.text = Sizzle.getText;
  2841 jQuery.isXMLDoc = Sizzle.isXML;
  2620 jQuery.isXMLDoc = Sizzle.isXML;
  2842 jQuery.contains = Sizzle.contains;
  2621 jQuery.contains = Sizzle.contains;
  2843 
  2622 
  2844 
  2623 
  2845 })( window );
  2624 
       
  2625 var rneedsContext = jQuery.expr.match.needsContext;
       
  2626 
       
  2627 var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
       
  2628 
       
  2629 
       
  2630 
       
  2631 var risSimple = /^.[^:#\[\.,]*$/;
       
  2632 
       
  2633 // Implement the identical functionality for filter and not
       
  2634 function winnow( elements, qualifier, not ) {
       
  2635 	if ( jQuery.isFunction( qualifier ) ) {
       
  2636 		return jQuery.grep( elements, function( elem, i ) {
       
  2637 			/* jshint -W018 */
       
  2638 			return !!qualifier.call( elem, i, elem ) !== not;
       
  2639 		});
       
  2640 
       
  2641 	}
       
  2642 
       
  2643 	if ( qualifier.nodeType ) {
       
  2644 		return jQuery.grep( elements, function( elem ) {
       
  2645 			return ( elem === qualifier ) !== not;
       
  2646 		});
       
  2647 
       
  2648 	}
       
  2649 
       
  2650 	if ( typeof qualifier === "string" ) {
       
  2651 		if ( risSimple.test( qualifier ) ) {
       
  2652 			return jQuery.filter( qualifier, elements, not );
       
  2653 		}
       
  2654 
       
  2655 		qualifier = jQuery.filter( qualifier, elements );
       
  2656 	}
       
  2657 
       
  2658 	return jQuery.grep( elements, function( elem ) {
       
  2659 		return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
       
  2660 	});
       
  2661 }
       
  2662 
       
  2663 jQuery.filter = function( expr, elems, not ) {
       
  2664 	var elem = elems[ 0 ];
       
  2665 
       
  2666 	if ( not ) {
       
  2667 		expr = ":not(" + expr + ")";
       
  2668 	}
       
  2669 
       
  2670 	return elems.length === 1 && elem.nodeType === 1 ?
       
  2671 		jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
       
  2672 		jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
       
  2673 			return elem.nodeType === 1;
       
  2674 		}));
       
  2675 };
       
  2676 
       
  2677 jQuery.fn.extend({
       
  2678 	find: function( selector ) {
       
  2679 		var i,
       
  2680 			len = this.length,
       
  2681 			ret = [],
       
  2682 			self = this;
       
  2683 
       
  2684 		if ( typeof selector !== "string" ) {
       
  2685 			return this.pushStack( jQuery( selector ).filter(function() {
       
  2686 				for ( i = 0; i < len; i++ ) {
       
  2687 					if ( jQuery.contains( self[ i ], this ) ) {
       
  2688 						return true;
       
  2689 					}
       
  2690 				}
       
  2691 			}) );
       
  2692 		}
       
  2693 
       
  2694 		for ( i = 0; i < len; i++ ) {
       
  2695 			jQuery.find( selector, self[ i ], ret );
       
  2696 		}
       
  2697 
       
  2698 		// Needed because $( selector, context ) becomes $( context ).find( selector )
       
  2699 		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
       
  2700 		ret.selector = this.selector ? this.selector + " " + selector : selector;
       
  2701 		return ret;
       
  2702 	},
       
  2703 	filter: function( selector ) {
       
  2704 		return this.pushStack( winnow(this, selector || [], false) );
       
  2705 	},
       
  2706 	not: function( selector ) {
       
  2707 		return this.pushStack( winnow(this, selector || [], true) );
       
  2708 	},
       
  2709 	is: function( selector ) {
       
  2710 		return !!winnow(
       
  2711 			this,
       
  2712 
       
  2713 			// If this is a positional/relative selector, check membership in the returned set
       
  2714 			// so $("p:first").is("p:last") won't return true for a doc with two "p".
       
  2715 			typeof selector === "string" && rneedsContext.test( selector ) ?
       
  2716 				jQuery( selector ) :
       
  2717 				selector || [],
       
  2718 			false
       
  2719 		).length;
       
  2720 	}
       
  2721 });
       
  2722 
       
  2723 
       
  2724 // Initialize a jQuery object
       
  2725 
       
  2726 
       
  2727 // A central reference to the root jQuery(document)
       
  2728 var rootjQuery,
       
  2729 
       
  2730 	// A simple way to check for HTML strings
       
  2731 	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
       
  2732 	// Strict HTML recognition (#11290: must start with <)
       
  2733 	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
       
  2734 
       
  2735 	init = jQuery.fn.init = function( selector, context ) {
       
  2736 		var match, elem;
       
  2737 
       
  2738 		// HANDLE: $(""), $(null), $(undefined), $(false)
       
  2739 		if ( !selector ) {
       
  2740 			return this;
       
  2741 		}
       
  2742 
       
  2743 		// Handle HTML strings
       
  2744 		if ( typeof selector === "string" ) {
       
  2745 			if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
       
  2746 				// Assume that strings that start and end with <> are HTML and skip the regex check
       
  2747 				match = [ null, selector, null ];
       
  2748 
       
  2749 			} else {
       
  2750 				match = rquickExpr.exec( selector );
       
  2751 			}
       
  2752 
       
  2753 			// Match html or make sure no context is specified for #id
       
  2754 			if ( match && (match[1] || !context) ) {
       
  2755 
       
  2756 				// HANDLE: $(html) -> $(array)
       
  2757 				if ( match[1] ) {
       
  2758 					context = context instanceof jQuery ? context[0] : context;
       
  2759 
       
  2760 					// Option to run scripts is true for back-compat
       
  2761 					// Intentionally let the error be thrown if parseHTML is not present
       
  2762 					jQuery.merge( this, jQuery.parseHTML(
       
  2763 						match[1],
       
  2764 						context && context.nodeType ? context.ownerDocument || context : document,
       
  2765 						true
       
  2766 					) );
       
  2767 
       
  2768 					// HANDLE: $(html, props)
       
  2769 					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
       
  2770 						for ( match in context ) {
       
  2771 							// Properties of context are called as methods if possible
       
  2772 							if ( jQuery.isFunction( this[ match ] ) ) {
       
  2773 								this[ match ]( context[ match ] );
       
  2774 
       
  2775 							// ...and otherwise set as attributes
       
  2776 							} else {
       
  2777 								this.attr( match, context[ match ] );
       
  2778 							}
       
  2779 						}
       
  2780 					}
       
  2781 
       
  2782 					return this;
       
  2783 
       
  2784 				// HANDLE: $(#id)
       
  2785 				} else {
       
  2786 					elem = document.getElementById( match[2] );
       
  2787 
       
  2788 					// Support: Blackberry 4.6
       
  2789 					// gEBID returns nodes no longer in the document (#6963)
       
  2790 					if ( elem && elem.parentNode ) {
       
  2791 						// Inject the element directly into the jQuery object
       
  2792 						this.length = 1;
       
  2793 						this[0] = elem;
       
  2794 					}
       
  2795 
       
  2796 					this.context = document;
       
  2797 					this.selector = selector;
       
  2798 					return this;
       
  2799 				}
       
  2800 
       
  2801 			// HANDLE: $(expr, $(...))
       
  2802 			} else if ( !context || context.jquery ) {
       
  2803 				return ( context || rootjQuery ).find( selector );
       
  2804 
       
  2805 			// HANDLE: $(expr, context)
       
  2806 			// (which is just equivalent to: $(context).find(expr)
       
  2807 			} else {
       
  2808 				return this.constructor( context ).find( selector );
       
  2809 			}
       
  2810 
       
  2811 		// HANDLE: $(DOMElement)
       
  2812 		} else if ( selector.nodeType ) {
       
  2813 			this.context = this[0] = selector;
       
  2814 			this.length = 1;
       
  2815 			return this;
       
  2816 
       
  2817 		// HANDLE: $(function)
       
  2818 		// Shortcut for document ready
       
  2819 		} else if ( jQuery.isFunction( selector ) ) {
       
  2820 			return typeof rootjQuery.ready !== "undefined" ?
       
  2821 				rootjQuery.ready( selector ) :
       
  2822 				// Execute immediately if ready is not present
       
  2823 				selector( jQuery );
       
  2824 		}
       
  2825 
       
  2826 		if ( selector.selector !== undefined ) {
       
  2827 			this.selector = selector.selector;
       
  2828 			this.context = selector.context;
       
  2829 		}
       
  2830 
       
  2831 		return jQuery.makeArray( selector, this );
       
  2832 	};
       
  2833 
       
  2834 // Give the init function the jQuery prototype for later instantiation
       
  2835 init.prototype = jQuery.fn;
       
  2836 
       
  2837 // Initialize central reference
       
  2838 rootjQuery = jQuery( document );
       
  2839 
       
  2840 
       
  2841 var rparentsprev = /^(?:parents|prev(?:Until|All))/,
       
  2842 	// Methods guaranteed to produce a unique set when starting from a unique set
       
  2843 	guaranteedUnique = {
       
  2844 		children: true,
       
  2845 		contents: true,
       
  2846 		next: true,
       
  2847 		prev: true
       
  2848 	};
       
  2849 
       
  2850 jQuery.extend({
       
  2851 	dir: function( elem, dir, until ) {
       
  2852 		var matched = [],
       
  2853 			truncate = until !== undefined;
       
  2854 
       
  2855 		while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
       
  2856 			if ( elem.nodeType === 1 ) {
       
  2857 				if ( truncate && jQuery( elem ).is( until ) ) {
       
  2858 					break;
       
  2859 				}
       
  2860 				matched.push( elem );
       
  2861 			}
       
  2862 		}
       
  2863 		return matched;
       
  2864 	},
       
  2865 
       
  2866 	sibling: function( n, elem ) {
       
  2867 		var matched = [];
       
  2868 
       
  2869 		for ( ; n; n = n.nextSibling ) {
       
  2870 			if ( n.nodeType === 1 && n !== elem ) {
       
  2871 				matched.push( n );
       
  2872 			}
       
  2873 		}
       
  2874 
       
  2875 		return matched;
       
  2876 	}
       
  2877 });
       
  2878 
       
  2879 jQuery.fn.extend({
       
  2880 	has: function( target ) {
       
  2881 		var targets = jQuery( target, this ),
       
  2882 			l = targets.length;
       
  2883 
       
  2884 		return this.filter(function() {
       
  2885 			var i = 0;
       
  2886 			for ( ; i < l; i++ ) {
       
  2887 				if ( jQuery.contains( this, targets[i] ) ) {
       
  2888 					return true;
       
  2889 				}
       
  2890 			}
       
  2891 		});
       
  2892 	},
       
  2893 
       
  2894 	closest: function( selectors, context ) {
       
  2895 		var cur,
       
  2896 			i = 0,
       
  2897 			l = this.length,
       
  2898 			matched = [],
       
  2899 			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
       
  2900 				jQuery( selectors, context || this.context ) :
       
  2901 				0;
       
  2902 
       
  2903 		for ( ; i < l; i++ ) {
       
  2904 			for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
       
  2905 				// Always skip document fragments
       
  2906 				if ( cur.nodeType < 11 && (pos ?
       
  2907 					pos.index(cur) > -1 :
       
  2908 
       
  2909 					// Don't pass non-elements to Sizzle
       
  2910 					cur.nodeType === 1 &&
       
  2911 						jQuery.find.matchesSelector(cur, selectors)) ) {
       
  2912 
       
  2913 					matched.push( cur );
       
  2914 					break;
       
  2915 				}
       
  2916 			}
       
  2917 		}
       
  2918 
       
  2919 		return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
       
  2920 	},
       
  2921 
       
  2922 	// Determine the position of an element within the set
       
  2923 	index: function( elem ) {
       
  2924 
       
  2925 		// No argument, return index in parent
       
  2926 		if ( !elem ) {
       
  2927 			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
       
  2928 		}
       
  2929 
       
  2930 		// Index in selector
       
  2931 		if ( typeof elem === "string" ) {
       
  2932 			return indexOf.call( jQuery( elem ), this[ 0 ] );
       
  2933 		}
       
  2934 
       
  2935 		// Locate the position of the desired element
       
  2936 		return indexOf.call( this,
       
  2937 
       
  2938 			// If it receives a jQuery object, the first element is used
       
  2939 			elem.jquery ? elem[ 0 ] : elem
       
  2940 		);
       
  2941 	},
       
  2942 
       
  2943 	add: function( selector, context ) {
       
  2944 		return this.pushStack(
       
  2945 			jQuery.unique(
       
  2946 				jQuery.merge( this.get(), jQuery( selector, context ) )
       
  2947 			)
       
  2948 		);
       
  2949 	},
       
  2950 
       
  2951 	addBack: function( selector ) {
       
  2952 		return this.add( selector == null ?
       
  2953 			this.prevObject : this.prevObject.filter(selector)
       
  2954 		);
       
  2955 	}
       
  2956 });
       
  2957 
       
  2958 function sibling( cur, dir ) {
       
  2959 	while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
       
  2960 	return cur;
       
  2961 }
       
  2962 
       
  2963 jQuery.each({
       
  2964 	parent: function( elem ) {
       
  2965 		var parent = elem.parentNode;
       
  2966 		return parent && parent.nodeType !== 11 ? parent : null;
       
  2967 	},
       
  2968 	parents: function( elem ) {
       
  2969 		return jQuery.dir( elem, "parentNode" );
       
  2970 	},
       
  2971 	parentsUntil: function( elem, i, until ) {
       
  2972 		return jQuery.dir( elem, "parentNode", until );
       
  2973 	},
       
  2974 	next: function( elem ) {
       
  2975 		return sibling( elem, "nextSibling" );
       
  2976 	},
       
  2977 	prev: function( elem ) {
       
  2978 		return sibling( elem, "previousSibling" );
       
  2979 	},
       
  2980 	nextAll: function( elem ) {
       
  2981 		return jQuery.dir( elem, "nextSibling" );
       
  2982 	},
       
  2983 	prevAll: function( elem ) {
       
  2984 		return jQuery.dir( elem, "previousSibling" );
       
  2985 	},
       
  2986 	nextUntil: function( elem, i, until ) {
       
  2987 		return jQuery.dir( elem, "nextSibling", until );
       
  2988 	},
       
  2989 	prevUntil: function( elem, i, until ) {
       
  2990 		return jQuery.dir( elem, "previousSibling", until );
       
  2991 	},
       
  2992 	siblings: function( elem ) {
       
  2993 		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
       
  2994 	},
       
  2995 	children: function( elem ) {
       
  2996 		return jQuery.sibling( elem.firstChild );
       
  2997 	},
       
  2998 	contents: function( elem ) {
       
  2999 		return elem.contentDocument || jQuery.merge( [], elem.childNodes );
       
  3000 	}
       
  3001 }, function( name, fn ) {
       
  3002 	jQuery.fn[ name ] = function( until, selector ) {
       
  3003 		var matched = jQuery.map( this, fn, until );
       
  3004 
       
  3005 		if ( name.slice( -5 ) !== "Until" ) {
       
  3006 			selector = until;
       
  3007 		}
       
  3008 
       
  3009 		if ( selector && typeof selector === "string" ) {
       
  3010 			matched = jQuery.filter( selector, matched );
       
  3011 		}
       
  3012 
       
  3013 		if ( this.length > 1 ) {
       
  3014 			// Remove duplicates
       
  3015 			if ( !guaranteedUnique[ name ] ) {
       
  3016 				jQuery.unique( matched );
       
  3017 			}
       
  3018 
       
  3019 			// Reverse order for parents* and prev-derivatives
       
  3020 			if ( rparentsprev.test( name ) ) {
       
  3021 				matched.reverse();
       
  3022 			}
       
  3023 		}
       
  3024 
       
  3025 		return this.pushStack( matched );
       
  3026 	};
       
  3027 });
       
  3028 var rnotwhite = (/\S+/g);
       
  3029 
       
  3030 
       
  3031 
  2846 // String to Object options format cache
  3032 // String to Object options format cache
  2847 var optionsCache = {};
  3033 var optionsCache = {};
  2848 
  3034 
  2849 // Convert String-formatted options into Object-formatted ones and store in cache
  3035 // Convert String-formatted options into Object-formatted ones and store in cache
  2850 function createOptions( options ) {
  3036 function createOptions( options ) {
  2851 	var object = optionsCache[ options ] = {};
  3037 	var object = optionsCache[ options ] = {};
  2852 	jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
  3038 	jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
  2853 		object[ flag ] = true;
  3039 		object[ flag ] = true;
  2854 	});
  3040 	});
  2855 	return object;
  3041 	return object;
  2856 }
  3042 }
  2857 
  3043 
  2964 			// Remove a callback from the list
  3150 			// Remove a callback from the list
  2965 			remove: function() {
  3151 			remove: function() {
  2966 				if ( list ) {
  3152 				if ( list ) {
  2967 					jQuery.each( arguments, function( _, arg ) {
  3153 					jQuery.each( arguments, function( _, arg ) {
  2968 						var index;
  3154 						var index;
  2969 						while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
  3155 						while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
  2970 							list.splice( index, 1 );
  3156 							list.splice( index, 1 );
  2971 							// Handle firing indexes
  3157 							// Handle firing indexes
  2972 							if ( firing ) {
  3158 							if ( firing ) {
  2973 								if ( index <= firingLength ) {
  3159 								if ( index <= firingLength ) {
  2974 									firingLength--;
  3160 									firingLength--;
  3038 			}
  3224 			}
  3039 		};
  3225 		};
  3040 
  3226 
  3041 	return self;
  3227 	return self;
  3042 };
  3228 };
       
  3229 
       
  3230 
  3043 jQuery.extend({
  3231 jQuery.extend({
  3044 
  3232 
  3045 	Deferred: function( func ) {
  3233 	Deferred: function( func ) {
  3046 		var tuples = [
  3234 		var tuples = [
  3047 				// action, add listener, listener list, final state
  3235 				// action, add listener, listener list, final state
  3060 				},
  3248 				},
  3061 				then: function( /* fnDone, fnFail, fnProgress */ ) {
  3249 				then: function( /* fnDone, fnFail, fnProgress */ ) {
  3062 					var fns = arguments;
  3250 					var fns = arguments;
  3063 					return jQuery.Deferred(function( newDefer ) {
  3251 					return jQuery.Deferred(function( newDefer ) {
  3064 						jQuery.each( tuples, function( i, tuple ) {
  3252 						jQuery.each( tuples, function( i, tuple ) {
  3065 							var action = tuple[ 0 ],
  3253 							var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
  3066 								fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
       
  3067 							// deferred[ done | fail | progress ] for forwarding actions to newDefer
  3254 							// deferred[ done | fail | progress ] for forwarding actions to newDefer
  3068 							deferred[ tuple[1] ](function() {
  3255 							deferred[ tuple[1] ](function() {
  3069 								var returned = fn && fn.apply( this, arguments );
  3256 								var returned = fn && fn.apply( this, arguments );
  3070 								if ( returned && jQuery.isFunction( returned.promise ) ) {
  3257 								if ( returned && jQuery.isFunction( returned.promise ) ) {
  3071 									returned.promise()
  3258 									returned.promise()
  3072 										.done( newDefer.resolve )
  3259 										.done( newDefer.resolve )
  3073 										.fail( newDefer.reject )
  3260 										.fail( newDefer.reject )
  3074 										.progress( newDefer.notify );
  3261 										.progress( newDefer.notify );
  3075 								} else {
  3262 								} else {
  3076 									newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
  3263 									newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
  3077 								}
  3264 								}
  3078 							});
  3265 							});
  3079 						});
  3266 						});
  3080 						fns = null;
  3267 						fns = null;
  3081 					}).promise();
  3268 					}).promise();
  3130 	},
  3317 	},
  3131 
  3318 
  3132 	// Deferred helper
  3319 	// Deferred helper
  3133 	when: function( subordinate /* , ..., subordinateN */ ) {
  3320 	when: function( subordinate /* , ..., subordinateN */ ) {
  3134 		var i = 0,
  3321 		var i = 0,
  3135 			resolveValues = core_slice.call( arguments ),
  3322 			resolveValues = slice.call( arguments ),
  3136 			length = resolveValues.length,
  3323 			length = resolveValues.length,
  3137 
  3324 
  3138 			// the count of uncompleted subordinates
  3325 			// the count of uncompleted subordinates
  3139 			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
  3326 			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
  3140 
  3327 
  3143 
  3330 
  3144 			// Update function for both resolve and progress values
  3331 			// Update function for both resolve and progress values
  3145 			updateFunc = function( i, contexts, values ) {
  3332 			updateFunc = function( i, contexts, values ) {
  3146 				return function( value ) {
  3333 				return function( value ) {
  3147 					contexts[ i ] = this;
  3334 					contexts[ i ] = this;
  3148 					values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
  3335 					values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
  3149 					if( values === progressValues ) {
  3336 					if ( values === progressValues ) {
  3150 						deferred.notifyWith( contexts, values );
  3337 						deferred.notifyWith( contexts, values );
  3151 					} else if ( !( --remaining ) ) {
  3338 					} else if ( !( --remaining ) ) {
  3152 						deferred.resolveWith( contexts, values );
  3339 						deferred.resolveWith( contexts, values );
  3153 					}
  3340 					}
  3154 				};
  3341 				};
  3155 			},
  3342 			},
  3156 
  3343 
  3157 			progressValues, progressContexts, resolveContexts;
  3344 			progressValues, progressContexts, resolveContexts;
  3158 
  3345 
  3159 		// add listeners to Deferred subordinates; treat others as resolved
  3346 		// Add listeners to Deferred subordinates; treat others as resolved
  3160 		if ( length > 1 ) {
  3347 		if ( length > 1 ) {
  3161 			progressValues = new Array( length );
  3348 			progressValues = new Array( length );
  3162 			progressContexts = new Array( length );
  3349 			progressContexts = new Array( length );
  3163 			resolveContexts = new Array( length );
  3350 			resolveContexts = new Array( length );
  3164 			for ( ; i < length; i++ ) {
  3351 			for ( ; i < length; i++ ) {
  3171 					--remaining;
  3358 					--remaining;
  3172 				}
  3359 				}
  3173 			}
  3360 			}
  3174 		}
  3361 		}
  3175 
  3362 
  3176 		// if we're not waiting on anything, resolve the master
  3363 		// If we're not waiting on anything, resolve the master
  3177 		if ( !remaining ) {
  3364 		if ( !remaining ) {
  3178 			deferred.resolveWith( resolveContexts, resolveValues );
  3365 			deferred.resolveWith( resolveContexts, resolveValues );
  3179 		}
  3366 		}
  3180 
  3367 
  3181 		return deferred.promise();
  3368 		return deferred.promise();
  3182 	}
  3369 	}
  3183 });
  3370 });
  3184 jQuery.support = (function( support ) {
  3371 
  3185 	var input = document.createElement("input"),
  3372 
  3186 		fragment = document.createDocumentFragment(),
  3373 // The deferred used on DOM ready
  3187 		div = document.createElement("div"),
  3374 var readyList;
  3188 		select = document.createElement("select"),
  3375 
  3189 		opt = select.appendChild( document.createElement("option") );
  3376 jQuery.fn.ready = function( fn ) {
  3190 
  3377 	// Add the callback
  3191 	// Finish early in limited environments
  3378 	jQuery.ready.promise().done( fn );
  3192 	if ( !input.type ) {
  3379 
  3193 		return support;
  3380 	return this;
  3194 	}
  3381 };
  3195 
  3382 
  3196 	input.type = "checkbox";
  3383 jQuery.extend({
  3197 
  3384 	// Is the DOM ready to be used? Set to true once it occurs.
  3198 	// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
  3385 	isReady: false,
  3199 	// Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere)
  3386 
  3200 	support.checkOn = input.value !== "";
  3387 	// A counter to track how many items to wait for before
  3201 
  3388 	// the ready event fires. See #6781
  3202 	// Must access the parent to make an option select properly
  3389 	readyWait: 1,
  3203 	// Support: IE9, IE10
  3390 
  3204 	support.optSelected = opt.selected;
  3391 	// Hold (or release) the ready event
  3205 
  3392 	holdReady: function( hold ) {
  3206 	// Will be defined later
  3393 		if ( hold ) {
  3207 	support.reliableMarginRight = true;
  3394 			jQuery.readyWait++;
  3208 	support.boxSizingReliable = true;
  3395 		} else {
  3209 	support.pixelPosition = false;
  3396 			jQuery.ready( true );
  3210 
  3397 		}
  3211 	// Make sure checked status is properly cloned
  3398 	},
  3212 	// Support: IE9, IE10
  3399 
  3213 	input.checked = true;
  3400 	// Handle when the DOM is ready
  3214 	support.noCloneChecked = input.cloneNode( true ).checked;
  3401 	ready: function( wait ) {
  3215 
  3402 
  3216 	// Make sure that the options inside disabled selects aren't marked as disabled
  3403 		// Abort if there are pending holds or we're already ready
  3217 	// (WebKit marks them as disabled)
  3404 		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
  3218 	select.disabled = true;
       
  3219 	support.optDisabled = !opt.disabled;
       
  3220 
       
  3221 	// Check if an input maintains its value after becoming a radio
       
  3222 	// Support: IE9, IE10
       
  3223 	input = document.createElement("input");
       
  3224 	input.value = "t";
       
  3225 	input.type = "radio";
       
  3226 	support.radioValue = input.value === "t";
       
  3227 
       
  3228 	// #11217 - WebKit loses check when the name is after the checked attribute
       
  3229 	input.setAttribute( "checked", "t" );
       
  3230 	input.setAttribute( "name", "t" );
       
  3231 
       
  3232 	fragment.appendChild( input );
       
  3233 
       
  3234 	// Support: Safari 5.1, Android 4.x, Android 2.3
       
  3235 	// old WebKit doesn't clone checked state correctly in fragments
       
  3236 	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
       
  3237 
       
  3238 	// Support: Firefox, Chrome, Safari
       
  3239 	// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
       
  3240 	support.focusinBubbles = "onfocusin" in window;
       
  3241 
       
  3242 	div.style.backgroundClip = "content-box";
       
  3243 	div.cloneNode( true ).style.backgroundClip = "";
       
  3244 	support.clearCloneStyle = div.style.backgroundClip === "content-box";
       
  3245 
       
  3246 	// Run tests that need a body at doc ready
       
  3247 	jQuery(function() {
       
  3248 		var container, marginDiv,
       
  3249 			// Support: Firefox, Android 2.3 (Prefixed box-sizing versions).
       
  3250 			divReset = "padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",
       
  3251 			body = document.getElementsByTagName("body")[ 0 ];
       
  3252 
       
  3253 		if ( !body ) {
       
  3254 			// Return for frameset docs that don't have a body
       
  3255 			return;
  3405 			return;
  3256 		}
  3406 		}
  3257 
  3407 
  3258 		container = document.createElement("div");
  3408 		// Remember that the DOM is ready
  3259 		container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
  3409 		jQuery.isReady = true;
  3260 
  3410 
  3261 		// Check box-sizing and margin behavior.
  3411 		// If a normal DOM Ready event fired, decrement, and wait if need be
  3262 		body.appendChild( container ).appendChild( div );
  3412 		if ( wait !== true && --jQuery.readyWait > 0 ) {
  3263 		div.innerHTML = "";
  3413 			return;
  3264 		// Support: Firefox, Android 2.3 (Prefixed box-sizing versions).
  3414 		}
  3265 		div.style.cssText = "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%";
  3415 
  3266 
  3416 		// If there are functions bound, to execute
  3267 		// Workaround failing boxSizing test due to offsetWidth returning wrong value
  3417 		readyList.resolveWith( document, [ jQuery ] );
  3268 		// with some non-1 values of body zoom, ticket #13543
  3418 
  3269 		jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {
  3419 		// Trigger any bound ready events
  3270 			support.boxSizing = div.offsetWidth === 4;
  3420 		if ( jQuery.fn.triggerHandler ) {
  3271 		});
  3421 			jQuery( document ).triggerHandler( "ready" );
  3272 
  3422 			jQuery( document ).off( "ready" );
  3273 		// Use window.getComputedStyle because jsdom on node.js will break without it.
  3423 		}
  3274 		if ( window.getComputedStyle ) {
  3424 	}
  3275 			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
  3425 });
  3276 			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
  3426 
  3277 
  3427 /**
  3278 			// Support: Android 2.3
  3428  * The ready event handler and self cleanup method
  3279 			// Check if div with explicit width and no margin-right incorrectly
  3429  */
  3280 			// gets computed margin-right based on width of container. (#3333)
  3430 function completed() {
  3281 			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
  3431 	document.removeEventListener( "DOMContentLoaded", completed, false );
  3282 			marginDiv = div.appendChild( document.createElement("div") );
  3432 	window.removeEventListener( "load", completed, false );
  3283 			marginDiv.style.cssText = div.style.cssText = divReset;
  3433 	jQuery.ready();
  3284 			marginDiv.style.marginRight = marginDiv.style.width = "0";
       
  3285 			div.style.width = "1px";
       
  3286 
       
  3287 			support.reliableMarginRight =
       
  3288 				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
       
  3289 		}
       
  3290 
       
  3291 		body.removeChild( container );
       
  3292 	});
       
  3293 
       
  3294 	return support;
       
  3295 })( {} );
       
  3296 
       
  3297 /*
       
  3298 	Implementation Summary
       
  3299 
       
  3300 	1. Enforce API surface and semantic compatibility with 1.9.x branch
       
  3301 	2. Improve the module's maintainability by reducing the storage
       
  3302 		paths to a single mechanism.
       
  3303 	3. Use the same single mechanism to support "private" and "user" data.
       
  3304 	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
       
  3305 	5. Avoid exposing implementation details on user objects (eg. expando properties)
       
  3306 	6. Provide a clear path for implementation upgrade to WeakMap in 2014
       
  3307 */
       
  3308 var data_user, data_priv,
       
  3309 	rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
       
  3310 	rmultiDash = /([A-Z])/g;
       
  3311 
       
  3312 function Data() {
       
  3313 	// Support: Android < 4,
       
  3314 	// Old WebKit does not have Object.preventExtensions/freeze method,
       
  3315 	// return new empty object instead with no [[set]] accessor
       
  3316 	Object.defineProperty( this.cache = {}, 0, {
       
  3317 		get: function() {
       
  3318 			return {};
       
  3319 		}
       
  3320 	});
       
  3321 
       
  3322 	this.expando = jQuery.expando + Math.random();
       
  3323 }
  3434 }
  3324 
  3435 
  3325 Data.uid = 1;
  3436 jQuery.ready.promise = function( obj ) {
  3326 
  3437 	if ( !readyList ) {
  3327 Data.accepts = function( owner ) {
  3438 
       
  3439 		readyList = jQuery.Deferred();
       
  3440 
       
  3441 		// Catch cases where $(document).ready() is called after the browser event has already occurred.
       
  3442 		// We once tried to use readyState "interactive" here, but it caused issues like the one
       
  3443 		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
       
  3444 		if ( document.readyState === "complete" ) {
       
  3445 			// Handle it asynchronously to allow scripts the opportunity to delay ready
       
  3446 			setTimeout( jQuery.ready );
       
  3447 
       
  3448 		} else {
       
  3449 
       
  3450 			// Use the handy event callback
       
  3451 			document.addEventListener( "DOMContentLoaded", completed, false );
       
  3452 
       
  3453 			// A fallback to window.onload, that will always work
       
  3454 			window.addEventListener( "load", completed, false );
       
  3455 		}
       
  3456 	}
       
  3457 	return readyList.promise( obj );
       
  3458 };
       
  3459 
       
  3460 // Kick off the DOM ready check even if the user does not
       
  3461 jQuery.ready.promise();
       
  3462 
       
  3463 
       
  3464 
       
  3465 
       
  3466 // Multifunctional method to get and set values of a collection
       
  3467 // The value/s can optionally be executed if it's a function
       
  3468 var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
       
  3469 	var i = 0,
       
  3470 		len = elems.length,
       
  3471 		bulk = key == null;
       
  3472 
       
  3473 	// Sets many values
       
  3474 	if ( jQuery.type( key ) === "object" ) {
       
  3475 		chainable = true;
       
  3476 		for ( i in key ) {
       
  3477 			jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
       
  3478 		}
       
  3479 
       
  3480 	// Sets one value
       
  3481 	} else if ( value !== undefined ) {
       
  3482 		chainable = true;
       
  3483 
       
  3484 		if ( !jQuery.isFunction( value ) ) {
       
  3485 			raw = true;
       
  3486 		}
       
  3487 
       
  3488 		if ( bulk ) {
       
  3489 			// Bulk operations run against the entire set
       
  3490 			if ( raw ) {
       
  3491 				fn.call( elems, value );
       
  3492 				fn = null;
       
  3493 
       
  3494 			// ...except when executing function values
       
  3495 			} else {
       
  3496 				bulk = fn;
       
  3497 				fn = function( elem, key, value ) {
       
  3498 					return bulk.call( jQuery( elem ), value );
       
  3499 				};
       
  3500 			}
       
  3501 		}
       
  3502 
       
  3503 		if ( fn ) {
       
  3504 			for ( ; i < len; i++ ) {
       
  3505 				fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
       
  3506 			}
       
  3507 		}
       
  3508 	}
       
  3509 
       
  3510 	return chainable ?
       
  3511 		elems :
       
  3512 
       
  3513 		// Gets
       
  3514 		bulk ?
       
  3515 			fn.call( elems ) :
       
  3516 			len ? fn( elems[0], key ) : emptyGet;
       
  3517 };
       
  3518 
       
  3519 
       
  3520 /**
       
  3521  * Determines whether an object can have data
       
  3522  */
       
  3523 jQuery.acceptData = function( owner ) {
  3328 	// Accepts only:
  3524 	// Accepts only:
  3329 	//  - Node
  3525 	//  - Node
  3330 	//    - Node.ELEMENT_NODE
  3526 	//    - Node.ELEMENT_NODE
  3331 	//    - Node.DOCUMENT_NODE
  3527 	//    - Node.DOCUMENT_NODE
  3332 	//  - Object
  3528 	//  - Object
  3333 	//    - Any
  3529 	//    - Any
  3334 	return owner.nodeType ?
  3530 	/* jshint -W018 */
  3335 		owner.nodeType === 1 || owner.nodeType === 9 : true;
  3531 	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
  3336 };
  3532 };
       
  3533 
       
  3534 
       
  3535 function Data() {
       
  3536 	// Support: Android<4,
       
  3537 	// Old WebKit does not have Object.preventExtensions/freeze method,
       
  3538 	// return new empty object instead with no [[set]] accessor
       
  3539 	Object.defineProperty( this.cache = {}, 0, {
       
  3540 		get: function() {
       
  3541 			return {};
       
  3542 		}
       
  3543 	});
       
  3544 
       
  3545 	this.expando = jQuery.expando + Data.uid++;
       
  3546 }
       
  3547 
       
  3548 Data.uid = 1;
       
  3549 Data.accepts = jQuery.acceptData;
  3337 
  3550 
  3338 Data.prototype = {
  3551 Data.prototype = {
  3339 	key: function( owner ) {
  3552 	key: function( owner ) {
  3340 		// We can accept data for non-element nodes in modern browsers,
  3553 		// We can accept data for non-element nodes in modern browsers,
  3341 		// but we should not, see #8335.
  3554 		// but we should not, see #8335.
  3355 			// Secure it in a non-enumerable, non-writable property
  3568 			// Secure it in a non-enumerable, non-writable property
  3356 			try {
  3569 			try {
  3357 				descriptor[ this.expando ] = { value: unlock };
  3570 				descriptor[ this.expando ] = { value: unlock };
  3358 				Object.defineProperties( owner, descriptor );
  3571 				Object.defineProperties( owner, descriptor );
  3359 
  3572 
  3360 			// Support: Android < 4
  3573 			// Support: Android<4
  3361 			// Fallback to a less secure definition
  3574 			// Fallback to a less secure definition
  3362 			} catch ( e ) {
  3575 			} catch ( e ) {
  3363 				descriptor[ this.expando ] = unlock;
  3576 				descriptor[ this.expando ] = unlock;
  3364 				jQuery.extend( owner, descriptor );
  3577 				jQuery.extend( owner, descriptor );
  3365 			}
  3578 			}
  3468 				} else {
  3681 				} else {
  3469 					// If a key with the spaces exists, use it.
  3682 					// If a key with the spaces exists, use it.
  3470 					// Otherwise, create an array by matching non-whitespace
  3683 					// Otherwise, create an array by matching non-whitespace
  3471 					name = camel;
  3684 					name = camel;
  3472 					name = name in cache ?
  3685 					name = name in cache ?
  3473 						[ name ] : ( name.match( core_rnotwhite ) || [] );
  3686 						[ name ] : ( name.match( rnotwhite ) || [] );
  3474 				}
  3687 				}
  3475 			}
  3688 			}
  3476 
  3689 
  3477 			i = name.length;
  3690 			i = name.length;
  3478 			while ( i-- ) {
  3691 			while ( i-- ) {
  3489 		if ( owner[ this.expando ] ) {
  3702 		if ( owner[ this.expando ] ) {
  3490 			delete this.cache[ owner[ this.expando ] ];
  3703 			delete this.cache[ owner[ this.expando ] ];
  3491 		}
  3704 		}
  3492 	}
  3705 	}
  3493 };
  3706 };
  3494 
  3707 var data_priv = new Data();
  3495 // These may be used throughout the jQuery core codebase
  3708 
  3496 data_user = new Data();
  3709 var data_user = new Data();
  3497 data_priv = new Data();
  3710 
  3498 
  3711 
       
  3712 
       
  3713 //	Implementation Summary
       
  3714 //
       
  3715 //	1. Enforce API surface and semantic compatibility with 1.9.x branch
       
  3716 //	2. Improve the module's maintainability by reducing the storage
       
  3717 //		paths to a single mechanism.
       
  3718 //	3. Use the same single mechanism to support "private" and "user" data.
       
  3719 //	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
       
  3720 //	5. Avoid exposing implementation details on user objects (eg. expando properties)
       
  3721 //	6. Provide a clear path for implementation upgrade to WeakMap in 2014
       
  3722 
       
  3723 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
       
  3724 	rmultiDash = /([A-Z])/g;
       
  3725 
       
  3726 function dataAttr( elem, key, data ) {
       
  3727 	var name;
       
  3728 
       
  3729 	// If nothing was found internally, try to fetch any
       
  3730 	// data from the HTML5 data-* attribute
       
  3731 	if ( data === undefined && elem.nodeType === 1 ) {
       
  3732 		name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
       
  3733 		data = elem.getAttribute( name );
       
  3734 
       
  3735 		if ( typeof data === "string" ) {
       
  3736 			try {
       
  3737 				data = data === "true" ? true :
       
  3738 					data === "false" ? false :
       
  3739 					data === "null" ? null :
       
  3740 					// Only convert to a number if it doesn't change the string
       
  3741 					+data + "" === data ? +data :
       
  3742 					rbrace.test( data ) ? jQuery.parseJSON( data ) :
       
  3743 					data;
       
  3744 			} catch( e ) {}
       
  3745 
       
  3746 			// Make sure we set the data so it isn't changed later
       
  3747 			data_user.set( elem, key, data );
       
  3748 		} else {
       
  3749 			data = undefined;
       
  3750 		}
       
  3751 	}
       
  3752 	return data;
       
  3753 }
  3499 
  3754 
  3500 jQuery.extend({
  3755 jQuery.extend({
  3501 	acceptData: Data.accepts,
       
  3502 
       
  3503 	hasData: function( elem ) {
  3756 	hasData: function( elem ) {
  3504 		return data_user.hasData( elem ) || data_priv.hasData( elem );
  3757 		return data_user.hasData( elem ) || data_priv.hasData( elem );
  3505 	},
  3758 	},
  3506 
  3759 
  3507 	data: function( elem, name, data ) {
  3760 	data: function( elem, name, data ) {
  3523 	}
  3776 	}
  3524 });
  3777 });
  3525 
  3778 
  3526 jQuery.fn.extend({
  3779 jQuery.fn.extend({
  3527 	data: function( key, value ) {
  3780 	data: function( key, value ) {
  3528 		var attrs, name,
  3781 		var i, name, data,
  3529 			elem = this[ 0 ],
  3782 			elem = this[ 0 ],
  3530 			i = 0,
  3783 			attrs = elem && elem.attributes;
  3531 			data = null;
       
  3532 
  3784 
  3533 		// Gets all values
  3785 		// Gets all values
  3534 		if ( key === undefined ) {
  3786 		if ( key === undefined ) {
  3535 			if ( this.length ) {
  3787 			if ( this.length ) {
  3536 				data = data_user.get( elem );
  3788 				data = data_user.get( elem );
  3537 
  3789 
  3538 				if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
  3790 				if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
  3539 					attrs = elem.attributes;
  3791 					i = attrs.length;
  3540 					for ( ; i < attrs.length; i++ ) {
  3792 					while ( i-- ) {
  3541 						name = attrs[ i ].name;
  3793 
  3542 
  3794 						// Support: IE11+
  3543 						if ( name.indexOf( "data-" ) === 0 ) {
  3795 						// The attrs elements can be null (#14894)
  3544 							name = jQuery.camelCase( name.slice(5) );
  3796 						if ( attrs[ i ] ) {
  3545 							dataAttr( elem, name, data[ name ] );
  3797 							name = attrs[ i ].name;
       
  3798 							if ( name.indexOf( "data-" ) === 0 ) {
       
  3799 								name = jQuery.camelCase( name.slice(5) );
       
  3800 								dataAttr( elem, name, data[ name ] );
       
  3801 							}
  3546 						}
  3802 						}
  3547 					}
  3803 					}
  3548 					data_priv.set( elem, "hasDataAttrs", true );
  3804 					data_priv.set( elem, "hasDataAttrs", true );
  3549 				}
  3805 				}
  3550 			}
  3806 			}
  3557 			return this.each(function() {
  3813 			return this.each(function() {
  3558 				data_user.set( this, key );
  3814 				data_user.set( this, key );
  3559 			});
  3815 			});
  3560 		}
  3816 		}
  3561 
  3817 
  3562 		return jQuery.access( this, function( value ) {
  3818 		return access( this, function( value ) {
  3563 			var data,
  3819 			var data,
  3564 				camelKey = jQuery.camelCase( key );
  3820 				camelKey = jQuery.camelCase( key );
  3565 
  3821 
  3566 			// The calling jQuery object (element matches) is not empty
  3822 			// The calling jQuery object (element matches) is not empty
  3567 			// (and therefore has an element appears at this[ 0 ]) and the
  3823 			// (and therefore has an element appears at this[ 0 ]) and the
  3620 			data_user.remove( this, key );
  3876 			data_user.remove( this, key );
  3621 		});
  3877 		});
  3622 	}
  3878 	}
  3623 });
  3879 });
  3624 
  3880 
  3625 function dataAttr( elem, key, data ) {
  3881 
  3626 	var name;
       
  3627 
       
  3628 	// If nothing was found internally, try to fetch any
       
  3629 	// data from the HTML5 data-* attribute
       
  3630 	if ( data === undefined && elem.nodeType === 1 ) {
       
  3631 		name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
       
  3632 		data = elem.getAttribute( name );
       
  3633 
       
  3634 		if ( typeof data === "string" ) {
       
  3635 			try {
       
  3636 				data = data === "true" ? true :
       
  3637 					data === "false" ? false :
       
  3638 					data === "null" ? null :
       
  3639 					// Only convert to a number if it doesn't change the string
       
  3640 					+data + "" === data ? +data :
       
  3641 					rbrace.test( data ) ? JSON.parse( data ) :
       
  3642 					data;
       
  3643 			} catch( e ) {}
       
  3644 
       
  3645 			// Make sure we set the data so it isn't changed later
       
  3646 			data_user.set( elem, key, data );
       
  3647 		} else {
       
  3648 			data = undefined;
       
  3649 		}
       
  3650 	}
       
  3651 	return data;
       
  3652 }
       
  3653 jQuery.extend({
  3882 jQuery.extend({
  3654 	queue: function( elem, type, data ) {
  3883 	queue: function( elem, type, data ) {
  3655 		var queue;
  3884 		var queue;
  3656 
  3885 
  3657 		if ( elem ) {
  3886 		if ( elem ) {
  3693 			// automatically dequeued
  3922 			// automatically dequeued
  3694 			if ( type === "fx" ) {
  3923 			if ( type === "fx" ) {
  3695 				queue.unshift( "inprogress" );
  3924 				queue.unshift( "inprogress" );
  3696 			}
  3925 			}
  3697 
  3926 
  3698 			// clear up the last queue stop function
  3927 			// Clear up the last queue stop function
  3699 			delete hooks.stop;
  3928 			delete hooks.stop;
  3700 			fn.call( elem, next, hooks );
  3929 			fn.call( elem, next, hooks );
  3701 		}
  3930 		}
  3702 
  3931 
  3703 		if ( !startLength && hooks ) {
  3932 		if ( !startLength && hooks ) {
  3704 			hooks.empty.fire();
  3933 			hooks.empty.fire();
  3705 		}
  3934 		}
  3706 	},
  3935 	},
  3707 
  3936 
  3708 	// not intended for public consumption - generates a queueHooks object, or returns the current one
  3937 	// Not public - generate a queueHooks object, or return the current one
  3709 	_queueHooks: function( elem, type ) {
  3938 	_queueHooks: function( elem, type ) {
  3710 		var key = type + "queueHooks";
  3939 		var key = type + "queueHooks";
  3711 		return data_priv.get( elem, key ) || data_priv.access( elem, key, {
  3940 		return data_priv.get( elem, key ) || data_priv.access( elem, key, {
  3712 			empty: jQuery.Callbacks("once memory").add(function() {
  3941 			empty: jQuery.Callbacks("once memory").add(function() {
  3713 				data_priv.remove( elem, [ type + "queue", key ] );
  3942 				data_priv.remove( elem, [ type + "queue", key ] );
  3733 		return data === undefined ?
  3962 		return data === undefined ?
  3734 			this :
  3963 			this :
  3735 			this.each(function() {
  3964 			this.each(function() {
  3736 				var queue = jQuery.queue( this, type, data );
  3965 				var queue = jQuery.queue( this, type, data );
  3737 
  3966 
  3738 				// ensure a hooks for this queue
  3967 				// Ensure a hooks for this queue
  3739 				jQuery._queueHooks( this, type );
  3968 				jQuery._queueHooks( this, type );
  3740 
  3969 
  3741 				if ( type === "fx" && queue[0] !== "inprogress" ) {
  3970 				if ( type === "fx" && queue[0] !== "inprogress" ) {
  3742 					jQuery.dequeue( this, type );
  3971 					jQuery.dequeue( this, type );
  3743 				}
  3972 				}
  3744 			});
  3973 			});
  3745 	},
  3974 	},
  3746 	dequeue: function( type ) {
  3975 	dequeue: function( type ) {
  3747 		return this.each(function() {
  3976 		return this.each(function() {
  3748 			jQuery.dequeue( this, type );
  3977 			jQuery.dequeue( this, type );
  3749 		});
       
  3750 	},
       
  3751 	// Based off of the plugin by Clint Helfers, with permission.
       
  3752 	// http://blindsignals.com/index.php/2009/07/jquery-delay/
       
  3753 	delay: function( time, type ) {
       
  3754 		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
       
  3755 		type = type || "fx";
       
  3756 
       
  3757 		return this.queue( type, function( next, hooks ) {
       
  3758 			var timeout = setTimeout( next, time );
       
  3759 			hooks.stop = function() {
       
  3760 				clearTimeout( timeout );
       
  3761 			};
       
  3762 		});
  3978 		});
  3763 	},
  3979 	},
  3764 	clearQueue: function( type ) {
  3980 	clearQueue: function( type ) {
  3765 		return this.queue( type || "fx", [] );
  3981 		return this.queue( type || "fx", [] );
  3766 	},
  3982 	},
  3782 			obj = type;
  3998 			obj = type;
  3783 			type = undefined;
  3999 			type = undefined;
  3784 		}
  4000 		}
  3785 		type = type || "fx";
  4001 		type = type || "fx";
  3786 
  4002 
  3787 		while( i-- ) {
  4003 		while ( i-- ) {
  3788 			tmp = data_priv.get( elements[ i ], type + "queueHooks" );
  4004 			tmp = data_priv.get( elements[ i ], type + "queueHooks" );
  3789 			if ( tmp && tmp.empty ) {
  4005 			if ( tmp && tmp.empty ) {
  3790 				count++;
  4006 				count++;
  3791 				tmp.empty.add( resolve );
  4007 				tmp.empty.add( resolve );
  3792 			}
  4008 			}
  3793 		}
  4009 		}
  3794 		resolve();
  4010 		resolve();
  3795 		return defer.promise( obj );
  4011 		return defer.promise( obj );
  3796 	}
  4012 	}
  3797 });
  4013 });
       
  4014 var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
       
  4015 
       
  4016 var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
       
  4017 
       
  4018 var isHidden = function( elem, el ) {
       
  4019 		// isHidden might be called from jQuery#filter function;
       
  4020 		// in that case, element will be second argument
       
  4021 		elem = el || elem;
       
  4022 		return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
       
  4023 	};
       
  4024 
       
  4025 var rcheckableType = (/^(?:checkbox|radio)$/i);
       
  4026 
       
  4027 
       
  4028 
       
  4029 (function() {
       
  4030 	var fragment = document.createDocumentFragment(),
       
  4031 		div = fragment.appendChild( document.createElement( "div" ) ),
       
  4032 		input = document.createElement( "input" );
       
  4033 
       
  4034 	// Support: Safari<=5.1
       
  4035 	// Check state lost if the name is set (#11217)
       
  4036 	// Support: Windows Web Apps (WWA)
       
  4037 	// `name` and `type` must use .setAttribute for WWA (#14901)
       
  4038 	input.setAttribute( "type", "radio" );
       
  4039 	input.setAttribute( "checked", "checked" );
       
  4040 	input.setAttribute( "name", "t" );
       
  4041 
       
  4042 	div.appendChild( input );
       
  4043 
       
  4044 	// Support: Safari<=5.1, Android<4.2
       
  4045 	// Older WebKit doesn't clone checked state correctly in fragments
       
  4046 	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
       
  4047 
       
  4048 	// Support: IE<=11+
       
  4049 	// Make sure textarea (and checkbox) defaultValue is properly cloned
       
  4050 	div.innerHTML = "<textarea>x</textarea>";
       
  4051 	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
       
  4052 })();
       
  4053 var strundefined = typeof undefined;
       
  4054 
       
  4055 
       
  4056 
       
  4057 support.focusinBubbles = "onfocusin" in window;
       
  4058 
       
  4059 
       
  4060 var
       
  4061 	rkeyEvent = /^key/,
       
  4062 	rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
       
  4063 	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
       
  4064 	rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
       
  4065 
       
  4066 function returnTrue() {
       
  4067 	return true;
       
  4068 }
       
  4069 
       
  4070 function returnFalse() {
       
  4071 	return false;
       
  4072 }
       
  4073 
       
  4074 function safeActiveElement() {
       
  4075 	try {
       
  4076 		return document.activeElement;
       
  4077 	} catch ( err ) { }
       
  4078 }
       
  4079 
       
  4080 /*
       
  4081  * Helper functions for managing events -- not part of the public interface.
       
  4082  * Props to Dean Edwards' addEvent library for many of the ideas.
       
  4083  */
       
  4084 jQuery.event = {
       
  4085 
       
  4086 	global: {},
       
  4087 
       
  4088 	add: function( elem, types, handler, data, selector ) {
       
  4089 
       
  4090 		var handleObjIn, eventHandle, tmp,
       
  4091 			events, t, handleObj,
       
  4092 			special, handlers, type, namespaces, origType,
       
  4093 			elemData = data_priv.get( elem );
       
  4094 
       
  4095 		// Don't attach events to noData or text/comment nodes (but allow plain objects)
       
  4096 		if ( !elemData ) {
       
  4097 			return;
       
  4098 		}
       
  4099 
       
  4100 		// Caller can pass in an object of custom data in lieu of the handler
       
  4101 		if ( handler.handler ) {
       
  4102 			handleObjIn = handler;
       
  4103 			handler = handleObjIn.handler;
       
  4104 			selector = handleObjIn.selector;
       
  4105 		}
       
  4106 
       
  4107 		// Make sure that the handler has a unique ID, used to find/remove it later
       
  4108 		if ( !handler.guid ) {
       
  4109 			handler.guid = jQuery.guid++;
       
  4110 		}
       
  4111 
       
  4112 		// Init the element's event structure and main handler, if this is the first
       
  4113 		if ( !(events = elemData.events) ) {
       
  4114 			events = elemData.events = {};
       
  4115 		}
       
  4116 		if ( !(eventHandle = elemData.handle) ) {
       
  4117 			eventHandle = elemData.handle = function( e ) {
       
  4118 				// Discard the second event of a jQuery.event.trigger() and
       
  4119 				// when an event is called after a page has unloaded
       
  4120 				return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
       
  4121 					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
       
  4122 			};
       
  4123 		}
       
  4124 
       
  4125 		// Handle multiple events separated by a space
       
  4126 		types = ( types || "" ).match( rnotwhite ) || [ "" ];
       
  4127 		t = types.length;
       
  4128 		while ( t-- ) {
       
  4129 			tmp = rtypenamespace.exec( types[t] ) || [];
       
  4130 			type = origType = tmp[1];
       
  4131 			namespaces = ( tmp[2] || "" ).split( "." ).sort();
       
  4132 
       
  4133 			// There *must* be a type, no attaching namespace-only handlers
       
  4134 			if ( !type ) {
       
  4135 				continue;
       
  4136 			}
       
  4137 
       
  4138 			// If event changes its type, use the special event handlers for the changed type
       
  4139 			special = jQuery.event.special[ type ] || {};
       
  4140 
       
  4141 			// If selector defined, determine special event api type, otherwise given type
       
  4142 			type = ( selector ? special.delegateType : special.bindType ) || type;
       
  4143 
       
  4144 			// Update special based on newly reset type
       
  4145 			special = jQuery.event.special[ type ] || {};
       
  4146 
       
  4147 			// handleObj is passed to all event handlers
       
  4148 			handleObj = jQuery.extend({
       
  4149 				type: type,
       
  4150 				origType: origType,
       
  4151 				data: data,
       
  4152 				handler: handler,
       
  4153 				guid: handler.guid,
       
  4154 				selector: selector,
       
  4155 				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
       
  4156 				namespace: namespaces.join(".")
       
  4157 			}, handleObjIn );
       
  4158 
       
  4159 			// Init the event handler queue if we're the first
       
  4160 			if ( !(handlers = events[ type ]) ) {
       
  4161 				handlers = events[ type ] = [];
       
  4162 				handlers.delegateCount = 0;
       
  4163 
       
  4164 				// Only use addEventListener if the special events handler returns false
       
  4165 				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
       
  4166 					if ( elem.addEventListener ) {
       
  4167 						elem.addEventListener( type, eventHandle, false );
       
  4168 					}
       
  4169 				}
       
  4170 			}
       
  4171 
       
  4172 			if ( special.add ) {
       
  4173 				special.add.call( elem, handleObj );
       
  4174 
       
  4175 				if ( !handleObj.handler.guid ) {
       
  4176 					handleObj.handler.guid = handler.guid;
       
  4177 				}
       
  4178 			}
       
  4179 
       
  4180 			// Add to the element's handler list, delegates in front
       
  4181 			if ( selector ) {
       
  4182 				handlers.splice( handlers.delegateCount++, 0, handleObj );
       
  4183 			} else {
       
  4184 				handlers.push( handleObj );
       
  4185 			}
       
  4186 
       
  4187 			// Keep track of which events have ever been used, for event optimization
       
  4188 			jQuery.event.global[ type ] = true;
       
  4189 		}
       
  4190 
       
  4191 	},
       
  4192 
       
  4193 	// Detach an event or set of events from an element
       
  4194 	remove: function( elem, types, handler, selector, mappedTypes ) {
       
  4195 
       
  4196 		var j, origCount, tmp,
       
  4197 			events, t, handleObj,
       
  4198 			special, handlers, type, namespaces, origType,
       
  4199 			elemData = data_priv.hasData( elem ) && data_priv.get( elem );
       
  4200 
       
  4201 		if ( !elemData || !(events = elemData.events) ) {
       
  4202 			return;
       
  4203 		}
       
  4204 
       
  4205 		// Once for each type.namespace in types; type may be omitted
       
  4206 		types = ( types || "" ).match( rnotwhite ) || [ "" ];
       
  4207 		t = types.length;
       
  4208 		while ( t-- ) {
       
  4209 			tmp = rtypenamespace.exec( types[t] ) || [];
       
  4210 			type = origType = tmp[1];
       
  4211 			namespaces = ( tmp[2] || "" ).split( "." ).sort();
       
  4212 
       
  4213 			// Unbind all events (on this namespace, if provided) for the element
       
  4214 			if ( !type ) {
       
  4215 				for ( type in events ) {
       
  4216 					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
       
  4217 				}
       
  4218 				continue;
       
  4219 			}
       
  4220 
       
  4221 			special = jQuery.event.special[ type ] || {};
       
  4222 			type = ( selector ? special.delegateType : special.bindType ) || type;
       
  4223 			handlers = events[ type ] || [];
       
  4224 			tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
       
  4225 
       
  4226 			// Remove matching events
       
  4227 			origCount = j = handlers.length;
       
  4228 			while ( j-- ) {
       
  4229 				handleObj = handlers[ j ];
       
  4230 
       
  4231 				if ( ( mappedTypes || origType === handleObj.origType ) &&
       
  4232 					( !handler || handler.guid === handleObj.guid ) &&
       
  4233 					( !tmp || tmp.test( handleObj.namespace ) ) &&
       
  4234 					( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
       
  4235 					handlers.splice( j, 1 );
       
  4236 
       
  4237 					if ( handleObj.selector ) {
       
  4238 						handlers.delegateCount--;
       
  4239 					}
       
  4240 					if ( special.remove ) {
       
  4241 						special.remove.call( elem, handleObj );
       
  4242 					}
       
  4243 				}
       
  4244 			}
       
  4245 
       
  4246 			// Remove generic event handler if we removed something and no more handlers exist
       
  4247 			// (avoids potential for endless recursion during removal of special event handlers)
       
  4248 			if ( origCount && !handlers.length ) {
       
  4249 				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
       
  4250 					jQuery.removeEvent( elem, type, elemData.handle );
       
  4251 				}
       
  4252 
       
  4253 				delete events[ type ];
       
  4254 			}
       
  4255 		}
       
  4256 
       
  4257 		// Remove the expando if it's no longer used
       
  4258 		if ( jQuery.isEmptyObject( events ) ) {
       
  4259 			delete elemData.handle;
       
  4260 			data_priv.remove( elem, "events" );
       
  4261 		}
       
  4262 	},
       
  4263 
       
  4264 	trigger: function( event, data, elem, onlyHandlers ) {
       
  4265 
       
  4266 		var i, cur, tmp, bubbleType, ontype, handle, special,
       
  4267 			eventPath = [ elem || document ],
       
  4268 			type = hasOwn.call( event, "type" ) ? event.type : event,
       
  4269 			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
       
  4270 
       
  4271 		cur = tmp = elem = elem || document;
       
  4272 
       
  4273 		// Don't do events on text and comment nodes
       
  4274 		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
       
  4275 			return;
       
  4276 		}
       
  4277 
       
  4278 		// focus/blur morphs to focusin/out; ensure we're not firing them right now
       
  4279 		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
       
  4280 			return;
       
  4281 		}
       
  4282 
       
  4283 		if ( type.indexOf(".") >= 0 ) {
       
  4284 			// Namespaced trigger; create a regexp to match event type in handle()
       
  4285 			namespaces = type.split(".");
       
  4286 			type = namespaces.shift();
       
  4287 			namespaces.sort();
       
  4288 		}
       
  4289 		ontype = type.indexOf(":") < 0 && "on" + type;
       
  4290 
       
  4291 		// Caller can pass in a jQuery.Event object, Object, or just an event type string
       
  4292 		event = event[ jQuery.expando ] ?
       
  4293 			event :
       
  4294 			new jQuery.Event( type, typeof event === "object" && event );
       
  4295 
       
  4296 		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
       
  4297 		event.isTrigger = onlyHandlers ? 2 : 3;
       
  4298 		event.namespace = namespaces.join(".");
       
  4299 		event.namespace_re = event.namespace ?
       
  4300 			new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
       
  4301 			null;
       
  4302 
       
  4303 		// Clean up the event in case it is being reused
       
  4304 		event.result = undefined;
       
  4305 		if ( !event.target ) {
       
  4306 			event.target = elem;
       
  4307 		}
       
  4308 
       
  4309 		// Clone any incoming data and prepend the event, creating the handler arg list
       
  4310 		data = data == null ?
       
  4311 			[ event ] :
       
  4312 			jQuery.makeArray( data, [ event ] );
       
  4313 
       
  4314 		// Allow special events to draw outside the lines
       
  4315 		special = jQuery.event.special[ type ] || {};
       
  4316 		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
       
  4317 			return;
       
  4318 		}
       
  4319 
       
  4320 		// Determine event propagation path in advance, per W3C events spec (#9951)
       
  4321 		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
       
  4322 		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
       
  4323 
       
  4324 			bubbleType = special.delegateType || type;
       
  4325 			if ( !rfocusMorph.test( bubbleType + type ) ) {
       
  4326 				cur = cur.parentNode;
       
  4327 			}
       
  4328 			for ( ; cur; cur = cur.parentNode ) {
       
  4329 				eventPath.push( cur );
       
  4330 				tmp = cur;
       
  4331 			}
       
  4332 
       
  4333 			// Only add window if we got to document (e.g., not plain obj or detached DOM)
       
  4334 			if ( tmp === (elem.ownerDocument || document) ) {
       
  4335 				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
       
  4336 			}
       
  4337 		}
       
  4338 
       
  4339 		// Fire handlers on the event path
       
  4340 		i = 0;
       
  4341 		while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
       
  4342 
       
  4343 			event.type = i > 1 ?
       
  4344 				bubbleType :
       
  4345 				special.bindType || type;
       
  4346 
       
  4347 			// jQuery handler
       
  4348 			handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
       
  4349 			if ( handle ) {
       
  4350 				handle.apply( cur, data );
       
  4351 			}
       
  4352 
       
  4353 			// Native handler
       
  4354 			handle = ontype && cur[ ontype ];
       
  4355 			if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
       
  4356 				event.result = handle.apply( cur, data );
       
  4357 				if ( event.result === false ) {
       
  4358 					event.preventDefault();
       
  4359 				}
       
  4360 			}
       
  4361 		}
       
  4362 		event.type = type;
       
  4363 
       
  4364 		// If nobody prevented the default action, do it now
       
  4365 		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
       
  4366 
       
  4367 			if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
       
  4368 				jQuery.acceptData( elem ) ) {
       
  4369 
       
  4370 				// Call a native DOM method on the target with the same name name as the event.
       
  4371 				// Don't do default actions on window, that's where global variables be (#6170)
       
  4372 				if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
       
  4373 
       
  4374 					// Don't re-trigger an onFOO event when we call its FOO() method
       
  4375 					tmp = elem[ ontype ];
       
  4376 
       
  4377 					if ( tmp ) {
       
  4378 						elem[ ontype ] = null;
       
  4379 					}
       
  4380 
       
  4381 					// Prevent re-triggering of the same event, since we already bubbled it above
       
  4382 					jQuery.event.triggered = type;
       
  4383 					elem[ type ]();
       
  4384 					jQuery.event.triggered = undefined;
       
  4385 
       
  4386 					if ( tmp ) {
       
  4387 						elem[ ontype ] = tmp;
       
  4388 					}
       
  4389 				}
       
  4390 			}
       
  4391 		}
       
  4392 
       
  4393 		return event.result;
       
  4394 	},
       
  4395 
       
  4396 	dispatch: function( event ) {
       
  4397 
       
  4398 		// Make a writable jQuery.Event from the native event object
       
  4399 		event = jQuery.event.fix( event );
       
  4400 
       
  4401 		var i, j, ret, matched, handleObj,
       
  4402 			handlerQueue = [],
       
  4403 			args = slice.call( arguments ),
       
  4404 			handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
       
  4405 			special = jQuery.event.special[ event.type ] || {};
       
  4406 
       
  4407 		// Use the fix-ed jQuery.Event rather than the (read-only) native event
       
  4408 		args[0] = event;
       
  4409 		event.delegateTarget = this;
       
  4410 
       
  4411 		// Call the preDispatch hook for the mapped type, and let it bail if desired
       
  4412 		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
       
  4413 			return;
       
  4414 		}
       
  4415 
       
  4416 		// Determine handlers
       
  4417 		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
       
  4418 
       
  4419 		// Run delegates first; they may want to stop propagation beneath us
       
  4420 		i = 0;
       
  4421 		while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
       
  4422 			event.currentTarget = matched.elem;
       
  4423 
       
  4424 			j = 0;
       
  4425 			while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
       
  4426 
       
  4427 				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
       
  4428 				// a subset or equal to those in the bound event (both can have no namespace).
       
  4429 				if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
       
  4430 
       
  4431 					event.handleObj = handleObj;
       
  4432 					event.data = handleObj.data;
       
  4433 
       
  4434 					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
       
  4435 							.apply( matched.elem, args );
       
  4436 
       
  4437 					if ( ret !== undefined ) {
       
  4438 						if ( (event.result = ret) === false ) {
       
  4439 							event.preventDefault();
       
  4440 							event.stopPropagation();
       
  4441 						}
       
  4442 					}
       
  4443 				}
       
  4444 			}
       
  4445 		}
       
  4446 
       
  4447 		// Call the postDispatch hook for the mapped type
       
  4448 		if ( special.postDispatch ) {
       
  4449 			special.postDispatch.call( this, event );
       
  4450 		}
       
  4451 
       
  4452 		return event.result;
       
  4453 	},
       
  4454 
       
  4455 	handlers: function( event, handlers ) {
       
  4456 		var i, matches, sel, handleObj,
       
  4457 			handlerQueue = [],
       
  4458 			delegateCount = handlers.delegateCount,
       
  4459 			cur = event.target;
       
  4460 
       
  4461 		// Find delegate handlers
       
  4462 		// Black-hole SVG <use> instance trees (#13180)
       
  4463 		// Avoid non-left-click bubbling in Firefox (#3861)
       
  4464 		if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
       
  4465 
       
  4466 			for ( ; cur !== this; cur = cur.parentNode || this ) {
       
  4467 
       
  4468 				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
       
  4469 				if ( cur.disabled !== true || event.type !== "click" ) {
       
  4470 					matches = [];
       
  4471 					for ( i = 0; i < delegateCount; i++ ) {
       
  4472 						handleObj = handlers[ i ];
       
  4473 
       
  4474 						// Don't conflict with Object.prototype properties (#13203)
       
  4475 						sel = handleObj.selector + " ";
       
  4476 
       
  4477 						if ( matches[ sel ] === undefined ) {
       
  4478 							matches[ sel ] = handleObj.needsContext ?
       
  4479 								jQuery( sel, this ).index( cur ) >= 0 :
       
  4480 								jQuery.find( sel, this, null, [ cur ] ).length;
       
  4481 						}
       
  4482 						if ( matches[ sel ] ) {
       
  4483 							matches.push( handleObj );
       
  4484 						}
       
  4485 					}
       
  4486 					if ( matches.length ) {
       
  4487 						handlerQueue.push({ elem: cur, handlers: matches });
       
  4488 					}
       
  4489 				}
       
  4490 			}
       
  4491 		}
       
  4492 
       
  4493 		// Add the remaining (directly-bound) handlers
       
  4494 		if ( delegateCount < handlers.length ) {
       
  4495 			handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
       
  4496 		}
       
  4497 
       
  4498 		return handlerQueue;
       
  4499 	},
       
  4500 
       
  4501 	// Includes some event props shared by KeyEvent and MouseEvent
       
  4502 	props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
       
  4503 
       
  4504 	fixHooks: {},
       
  4505 
       
  4506 	keyHooks: {
       
  4507 		props: "char charCode key keyCode".split(" "),
       
  4508 		filter: function( event, original ) {
       
  4509 
       
  4510 			// Add which for key events
       
  4511 			if ( event.which == null ) {
       
  4512 				event.which = original.charCode != null ? original.charCode : original.keyCode;
       
  4513 			}
       
  4514 
       
  4515 			return event;
       
  4516 		}
       
  4517 	},
       
  4518 
       
  4519 	mouseHooks: {
       
  4520 		props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
       
  4521 		filter: function( event, original ) {
       
  4522 			var eventDoc, doc, body,
       
  4523 				button = original.button;
       
  4524 
       
  4525 			// Calculate pageX/Y if missing and clientX/Y available
       
  4526 			if ( event.pageX == null && original.clientX != null ) {
       
  4527 				eventDoc = event.target.ownerDocument || document;
       
  4528 				doc = eventDoc.documentElement;
       
  4529 				body = eventDoc.body;
       
  4530 
       
  4531 				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
       
  4532 				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
       
  4533 			}
       
  4534 
       
  4535 			// Add which for click: 1 === left; 2 === middle; 3 === right
       
  4536 			// Note: button is not normalized, so don't use it
       
  4537 			if ( !event.which && button !== undefined ) {
       
  4538 				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
       
  4539 			}
       
  4540 
       
  4541 			return event;
       
  4542 		}
       
  4543 	},
       
  4544 
       
  4545 	fix: function( event ) {
       
  4546 		if ( event[ jQuery.expando ] ) {
       
  4547 			return event;
       
  4548 		}
       
  4549 
       
  4550 		// Create a writable copy of the event object and normalize some properties
       
  4551 		var i, prop, copy,
       
  4552 			type = event.type,
       
  4553 			originalEvent = event,
       
  4554 			fixHook = this.fixHooks[ type ];
       
  4555 
       
  4556 		if ( !fixHook ) {
       
  4557 			this.fixHooks[ type ] = fixHook =
       
  4558 				rmouseEvent.test( type ) ? this.mouseHooks :
       
  4559 				rkeyEvent.test( type ) ? this.keyHooks :
       
  4560 				{};
       
  4561 		}
       
  4562 		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
       
  4563 
       
  4564 		event = new jQuery.Event( originalEvent );
       
  4565 
       
  4566 		i = copy.length;
       
  4567 		while ( i-- ) {
       
  4568 			prop = copy[ i ];
       
  4569 			event[ prop ] = originalEvent[ prop ];
       
  4570 		}
       
  4571 
       
  4572 		// Support: Cordova 2.5 (WebKit) (#13255)
       
  4573 		// All events should have a target; Cordova deviceready doesn't
       
  4574 		if ( !event.target ) {
       
  4575 			event.target = document;
       
  4576 		}
       
  4577 
       
  4578 		// Support: Safari 6.0+, Chrome<28
       
  4579 		// Target should not be a text node (#504, #13143)
       
  4580 		if ( event.target.nodeType === 3 ) {
       
  4581 			event.target = event.target.parentNode;
       
  4582 		}
       
  4583 
       
  4584 		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
       
  4585 	},
       
  4586 
       
  4587 	special: {
       
  4588 		load: {
       
  4589 			// Prevent triggered image.load events from bubbling to window.load
       
  4590 			noBubble: true
       
  4591 		},
       
  4592 		focus: {
       
  4593 			// Fire native event if possible so blur/focus sequence is correct
       
  4594 			trigger: function() {
       
  4595 				if ( this !== safeActiveElement() && this.focus ) {
       
  4596 					this.focus();
       
  4597 					return false;
       
  4598 				}
       
  4599 			},
       
  4600 			delegateType: "focusin"
       
  4601 		},
       
  4602 		blur: {
       
  4603 			trigger: function() {
       
  4604 				if ( this === safeActiveElement() && this.blur ) {
       
  4605 					this.blur();
       
  4606 					return false;
       
  4607 				}
       
  4608 			},
       
  4609 			delegateType: "focusout"
       
  4610 		},
       
  4611 		click: {
       
  4612 			// For checkbox, fire native event so checked state will be right
       
  4613 			trigger: function() {
       
  4614 				if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
       
  4615 					this.click();
       
  4616 					return false;
       
  4617 				}
       
  4618 			},
       
  4619 
       
  4620 			// For cross-browser consistency, don't fire native .click() on links
       
  4621 			_default: function( event ) {
       
  4622 				return jQuery.nodeName( event.target, "a" );
       
  4623 			}
       
  4624 		},
       
  4625 
       
  4626 		beforeunload: {
       
  4627 			postDispatch: function( event ) {
       
  4628 
       
  4629 				// Support: Firefox 20+
       
  4630 				// Firefox doesn't alert if the returnValue field is not set.
       
  4631 				if ( event.result !== undefined && event.originalEvent ) {
       
  4632 					event.originalEvent.returnValue = event.result;
       
  4633 				}
       
  4634 			}
       
  4635 		}
       
  4636 	},
       
  4637 
       
  4638 	simulate: function( type, elem, event, bubble ) {
       
  4639 		// Piggyback on a donor event to simulate a different one.
       
  4640 		// Fake originalEvent to avoid donor's stopPropagation, but if the
       
  4641 		// simulated event prevents default then we do the same on the donor.
       
  4642 		var e = jQuery.extend(
       
  4643 			new jQuery.Event(),
       
  4644 			event,
       
  4645 			{
       
  4646 				type: type,
       
  4647 				isSimulated: true,
       
  4648 				originalEvent: {}
       
  4649 			}
       
  4650 		);
       
  4651 		if ( bubble ) {
       
  4652 			jQuery.event.trigger( e, null, elem );
       
  4653 		} else {
       
  4654 			jQuery.event.dispatch.call( elem, e );
       
  4655 		}
       
  4656 		if ( e.isDefaultPrevented() ) {
       
  4657 			event.preventDefault();
       
  4658 		}
       
  4659 	}
       
  4660 };
       
  4661 
       
  4662 jQuery.removeEvent = function( elem, type, handle ) {
       
  4663 	if ( elem.removeEventListener ) {
       
  4664 		elem.removeEventListener( type, handle, false );
       
  4665 	}
       
  4666 };
       
  4667 
       
  4668 jQuery.Event = function( src, props ) {
       
  4669 	// Allow instantiation without the 'new' keyword
       
  4670 	if ( !(this instanceof jQuery.Event) ) {
       
  4671 		return new jQuery.Event( src, props );
       
  4672 	}
       
  4673 
       
  4674 	// Event object
       
  4675 	if ( src && src.type ) {
       
  4676 		this.originalEvent = src;
       
  4677 		this.type = src.type;
       
  4678 
       
  4679 		// Events bubbling up the document may have been marked as prevented
       
  4680 		// by a handler lower down the tree; reflect the correct value.
       
  4681 		this.isDefaultPrevented = src.defaultPrevented ||
       
  4682 				src.defaultPrevented === undefined &&
       
  4683 				// Support: Android<4.0
       
  4684 				src.returnValue === false ?
       
  4685 			returnTrue :
       
  4686 			returnFalse;
       
  4687 
       
  4688 	// Event type
       
  4689 	} else {
       
  4690 		this.type = src;
       
  4691 	}
       
  4692 
       
  4693 	// Put explicitly provided properties onto the event object
       
  4694 	if ( props ) {
       
  4695 		jQuery.extend( this, props );
       
  4696 	}
       
  4697 
       
  4698 	// Create a timestamp if incoming event doesn't have one
       
  4699 	this.timeStamp = src && src.timeStamp || jQuery.now();
       
  4700 
       
  4701 	// Mark it as fixed
       
  4702 	this[ jQuery.expando ] = true;
       
  4703 };
       
  4704 
       
  4705 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
       
  4706 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
       
  4707 jQuery.Event.prototype = {
       
  4708 	isDefaultPrevented: returnFalse,
       
  4709 	isPropagationStopped: returnFalse,
       
  4710 	isImmediatePropagationStopped: returnFalse,
       
  4711 
       
  4712 	preventDefault: function() {
       
  4713 		var e = this.originalEvent;
       
  4714 
       
  4715 		this.isDefaultPrevented = returnTrue;
       
  4716 
       
  4717 		if ( e && e.preventDefault ) {
       
  4718 			e.preventDefault();
       
  4719 		}
       
  4720 	},
       
  4721 	stopPropagation: function() {
       
  4722 		var e = this.originalEvent;
       
  4723 
       
  4724 		this.isPropagationStopped = returnTrue;
       
  4725 
       
  4726 		if ( e && e.stopPropagation ) {
       
  4727 			e.stopPropagation();
       
  4728 		}
       
  4729 	},
       
  4730 	stopImmediatePropagation: function() {
       
  4731 		var e = this.originalEvent;
       
  4732 
       
  4733 		this.isImmediatePropagationStopped = returnTrue;
       
  4734 
       
  4735 		if ( e && e.stopImmediatePropagation ) {
       
  4736 			e.stopImmediatePropagation();
       
  4737 		}
       
  4738 
       
  4739 		this.stopPropagation();
       
  4740 	}
       
  4741 };
       
  4742 
       
  4743 // Create mouseenter/leave events using mouseover/out and event-time checks
       
  4744 // Support: Chrome 15+
       
  4745 jQuery.each({
       
  4746 	mouseenter: "mouseover",
       
  4747 	mouseleave: "mouseout",
       
  4748 	pointerenter: "pointerover",
       
  4749 	pointerleave: "pointerout"
       
  4750 }, function( orig, fix ) {
       
  4751 	jQuery.event.special[ orig ] = {
       
  4752 		delegateType: fix,
       
  4753 		bindType: fix,
       
  4754 
       
  4755 		handle: function( event ) {
       
  4756 			var ret,
       
  4757 				target = this,
       
  4758 				related = event.relatedTarget,
       
  4759 				handleObj = event.handleObj;
       
  4760 
       
  4761 			// For mousenter/leave call the handler if related is outside the target.
       
  4762 			// NB: No relatedTarget if the mouse left/entered the browser window
       
  4763 			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
       
  4764 				event.type = handleObj.origType;
       
  4765 				ret = handleObj.handler.apply( this, arguments );
       
  4766 				event.type = fix;
       
  4767 			}
       
  4768 			return ret;
       
  4769 		}
       
  4770 	};
       
  4771 });
       
  4772 
       
  4773 // Support: Firefox, Chrome, Safari
       
  4774 // Create "bubbling" focus and blur events
       
  4775 if ( !support.focusinBubbles ) {
       
  4776 	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
       
  4777 
       
  4778 		// Attach a single capturing handler on the document while someone wants focusin/focusout
       
  4779 		var handler = function( event ) {
       
  4780 				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
       
  4781 			};
       
  4782 
       
  4783 		jQuery.event.special[ fix ] = {
       
  4784 			setup: function() {
       
  4785 				var doc = this.ownerDocument || this,
       
  4786 					attaches = data_priv.access( doc, fix );
       
  4787 
       
  4788 				if ( !attaches ) {
       
  4789 					doc.addEventListener( orig, handler, true );
       
  4790 				}
       
  4791 				data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
       
  4792 			},
       
  4793 			teardown: function() {
       
  4794 				var doc = this.ownerDocument || this,
       
  4795 					attaches = data_priv.access( doc, fix ) - 1;
       
  4796 
       
  4797 				if ( !attaches ) {
       
  4798 					doc.removeEventListener( orig, handler, true );
       
  4799 					data_priv.remove( doc, fix );
       
  4800 
       
  4801 				} else {
       
  4802 					data_priv.access( doc, fix, attaches );
       
  4803 				}
       
  4804 			}
       
  4805 		};
       
  4806 	});
       
  4807 }
       
  4808 
       
  4809 jQuery.fn.extend({
       
  4810 
       
  4811 	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
       
  4812 		var origFn, type;
       
  4813 
       
  4814 		// Types can be a map of types/handlers
       
  4815 		if ( typeof types === "object" ) {
       
  4816 			// ( types-Object, selector, data )
       
  4817 			if ( typeof selector !== "string" ) {
       
  4818 				// ( types-Object, data )
       
  4819 				data = data || selector;
       
  4820 				selector = undefined;
       
  4821 			}
       
  4822 			for ( type in types ) {
       
  4823 				this.on( type, selector, data, types[ type ], one );
       
  4824 			}
       
  4825 			return this;
       
  4826 		}
       
  4827 
       
  4828 		if ( data == null && fn == null ) {
       
  4829 			// ( types, fn )
       
  4830 			fn = selector;
       
  4831 			data = selector = undefined;
       
  4832 		} else if ( fn == null ) {
       
  4833 			if ( typeof selector === "string" ) {
       
  4834 				// ( types, selector, fn )
       
  4835 				fn = data;
       
  4836 				data = undefined;
       
  4837 			} else {
       
  4838 				// ( types, data, fn )
       
  4839 				fn = data;
       
  4840 				data = selector;
       
  4841 				selector = undefined;
       
  4842 			}
       
  4843 		}
       
  4844 		if ( fn === false ) {
       
  4845 			fn = returnFalse;
       
  4846 		} else if ( !fn ) {
       
  4847 			return this;
       
  4848 		}
       
  4849 
       
  4850 		if ( one === 1 ) {
       
  4851 			origFn = fn;
       
  4852 			fn = function( event ) {
       
  4853 				// Can use an empty set, since event contains the info
       
  4854 				jQuery().off( event );
       
  4855 				return origFn.apply( this, arguments );
       
  4856 			};
       
  4857 			// Use same guid so caller can remove using origFn
       
  4858 			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
       
  4859 		}
       
  4860 		return this.each( function() {
       
  4861 			jQuery.event.add( this, types, fn, data, selector );
       
  4862 		});
       
  4863 	},
       
  4864 	one: function( types, selector, data, fn ) {
       
  4865 		return this.on( types, selector, data, fn, 1 );
       
  4866 	},
       
  4867 	off: function( types, selector, fn ) {
       
  4868 		var handleObj, type;
       
  4869 		if ( types && types.preventDefault && types.handleObj ) {
       
  4870 			// ( event )  dispatched jQuery.Event
       
  4871 			handleObj = types.handleObj;
       
  4872 			jQuery( types.delegateTarget ).off(
       
  4873 				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
       
  4874 				handleObj.selector,
       
  4875 				handleObj.handler
       
  4876 			);
       
  4877 			return this;
       
  4878 		}
       
  4879 		if ( typeof types === "object" ) {
       
  4880 			// ( types-object [, selector] )
       
  4881 			for ( type in types ) {
       
  4882 				this.off( type, selector, types[ type ] );
       
  4883 			}
       
  4884 			return this;
       
  4885 		}
       
  4886 		if ( selector === false || typeof selector === "function" ) {
       
  4887 			// ( types [, fn] )
       
  4888 			fn = selector;
       
  4889 			selector = undefined;
       
  4890 		}
       
  4891 		if ( fn === false ) {
       
  4892 			fn = returnFalse;
       
  4893 		}
       
  4894 		return this.each(function() {
       
  4895 			jQuery.event.remove( this, types, fn, selector );
       
  4896 		});
       
  4897 	},
       
  4898 
       
  4899 	trigger: function( type, data ) {
       
  4900 		return this.each(function() {
       
  4901 			jQuery.event.trigger( type, data, this );
       
  4902 		});
       
  4903 	},
       
  4904 	triggerHandler: function( type, data ) {
       
  4905 		var elem = this[0];
       
  4906 		if ( elem ) {
       
  4907 			return jQuery.event.trigger( type, data, elem, true );
       
  4908 		}
       
  4909 	}
       
  4910 });
       
  4911 
       
  4912 
       
  4913 var
       
  4914 	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
       
  4915 	rtagName = /<([\w:]+)/,
       
  4916 	rhtml = /<|&#?\w+;/,
       
  4917 	rnoInnerhtml = /<(?:script|style|link)/i,
       
  4918 	// checked="checked" or checked
       
  4919 	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
       
  4920 	rscriptType = /^$|\/(?:java|ecma)script/i,
       
  4921 	rscriptTypeMasked = /^true\/(.*)/,
       
  4922 	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
       
  4923 
       
  4924 	// We have to close these tags to support XHTML (#13200)
       
  4925 	wrapMap = {
       
  4926 
       
  4927 		// Support: IE9
       
  4928 		option: [ 1, "<select multiple='multiple'>", "</select>" ],
       
  4929 
       
  4930 		thead: [ 1, "<table>", "</table>" ],
       
  4931 		col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
       
  4932 		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
       
  4933 		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
       
  4934 
       
  4935 		_default: [ 0, "", "" ]
       
  4936 	};
       
  4937 
       
  4938 // Support: IE9
       
  4939 wrapMap.optgroup = wrapMap.option;
       
  4940 
       
  4941 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
       
  4942 wrapMap.th = wrapMap.td;
       
  4943 
       
  4944 // Support: 1.x compatibility
       
  4945 // Manipulating tables requires a tbody
       
  4946 function manipulationTarget( elem, content ) {
       
  4947 	return jQuery.nodeName( elem, "table" ) &&
       
  4948 		jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
       
  4949 
       
  4950 		elem.getElementsByTagName("tbody")[0] ||
       
  4951 			elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
       
  4952 		elem;
       
  4953 }
       
  4954 
       
  4955 // Replace/restore the type attribute of script elements for safe DOM manipulation
       
  4956 function disableScript( elem ) {
       
  4957 	elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
       
  4958 	return elem;
       
  4959 }
       
  4960 function restoreScript( elem ) {
       
  4961 	var match = rscriptTypeMasked.exec( elem.type );
       
  4962 
       
  4963 	if ( match ) {
       
  4964 		elem.type = match[ 1 ];
       
  4965 	} else {
       
  4966 		elem.removeAttribute("type");
       
  4967 	}
       
  4968 
       
  4969 	return elem;
       
  4970 }
       
  4971 
       
  4972 // Mark scripts as having already been evaluated
       
  4973 function setGlobalEval( elems, refElements ) {
       
  4974 	var i = 0,
       
  4975 		l = elems.length;
       
  4976 
       
  4977 	for ( ; i < l; i++ ) {
       
  4978 		data_priv.set(
       
  4979 			elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
       
  4980 		);
       
  4981 	}
       
  4982 }
       
  4983 
       
  4984 function cloneCopyEvent( src, dest ) {
       
  4985 	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
       
  4986 
       
  4987 	if ( dest.nodeType !== 1 ) {
       
  4988 		return;
       
  4989 	}
       
  4990 
       
  4991 	// 1. Copy private data: events, handlers, etc.
       
  4992 	if ( data_priv.hasData( src ) ) {
       
  4993 		pdataOld = data_priv.access( src );
       
  4994 		pdataCur = data_priv.set( dest, pdataOld );
       
  4995 		events = pdataOld.events;
       
  4996 
       
  4997 		if ( events ) {
       
  4998 			delete pdataCur.handle;
       
  4999 			pdataCur.events = {};
       
  5000 
       
  5001 			for ( type in events ) {
       
  5002 				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
       
  5003 					jQuery.event.add( dest, type, events[ type ][ i ] );
       
  5004 				}
       
  5005 			}
       
  5006 		}
       
  5007 	}
       
  5008 
       
  5009 	// 2. Copy user data
       
  5010 	if ( data_user.hasData( src ) ) {
       
  5011 		udataOld = data_user.access( src );
       
  5012 		udataCur = jQuery.extend( {}, udataOld );
       
  5013 
       
  5014 		data_user.set( dest, udataCur );
       
  5015 	}
       
  5016 }
       
  5017 
       
  5018 function getAll( context, tag ) {
       
  5019 	var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
       
  5020 			context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
       
  5021 			[];
       
  5022 
       
  5023 	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
       
  5024 		jQuery.merge( [ context ], ret ) :
       
  5025 		ret;
       
  5026 }
       
  5027 
       
  5028 // Fix IE bugs, see support tests
       
  5029 function fixInput( src, dest ) {
       
  5030 	var nodeName = dest.nodeName.toLowerCase();
       
  5031 
       
  5032 	// Fails to persist the checked state of a cloned checkbox or radio button.
       
  5033 	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
       
  5034 		dest.checked = src.checked;
       
  5035 
       
  5036 	// Fails to return the selected option to the default selected state when cloning options
       
  5037 	} else if ( nodeName === "input" || nodeName === "textarea" ) {
       
  5038 		dest.defaultValue = src.defaultValue;
       
  5039 	}
       
  5040 }
       
  5041 
       
  5042 jQuery.extend({
       
  5043 	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
       
  5044 		var i, l, srcElements, destElements,
       
  5045 			clone = elem.cloneNode( true ),
       
  5046 			inPage = jQuery.contains( elem.ownerDocument, elem );
       
  5047 
       
  5048 		// Fix IE cloning issues
       
  5049 		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
       
  5050 				!jQuery.isXMLDoc( elem ) ) {
       
  5051 
       
  5052 			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
       
  5053 			destElements = getAll( clone );
       
  5054 			srcElements = getAll( elem );
       
  5055 
       
  5056 			for ( i = 0, l = srcElements.length; i < l; i++ ) {
       
  5057 				fixInput( srcElements[ i ], destElements[ i ] );
       
  5058 			}
       
  5059 		}
       
  5060 
       
  5061 		// Copy the events from the original to the clone
       
  5062 		if ( dataAndEvents ) {
       
  5063 			if ( deepDataAndEvents ) {
       
  5064 				srcElements = srcElements || getAll( elem );
       
  5065 				destElements = destElements || getAll( clone );
       
  5066 
       
  5067 				for ( i = 0, l = srcElements.length; i < l; i++ ) {
       
  5068 					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
       
  5069 				}
       
  5070 			} else {
       
  5071 				cloneCopyEvent( elem, clone );
       
  5072 			}
       
  5073 		}
       
  5074 
       
  5075 		// Preserve script evaluation history
       
  5076 		destElements = getAll( clone, "script" );
       
  5077 		if ( destElements.length > 0 ) {
       
  5078 			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
       
  5079 		}
       
  5080 
       
  5081 		// Return the cloned set
       
  5082 		return clone;
       
  5083 	},
       
  5084 
       
  5085 	buildFragment: function( elems, context, scripts, selection ) {
       
  5086 		var elem, tmp, tag, wrap, contains, j,
       
  5087 			fragment = context.createDocumentFragment(),
       
  5088 			nodes = [],
       
  5089 			i = 0,
       
  5090 			l = elems.length;
       
  5091 
       
  5092 		for ( ; i < l; i++ ) {
       
  5093 			elem = elems[ i ];
       
  5094 
       
  5095 			if ( elem || elem === 0 ) {
       
  5096 
       
  5097 				// Add nodes directly
       
  5098 				if ( jQuery.type( elem ) === "object" ) {
       
  5099 					// Support: QtWebKit, PhantomJS
       
  5100 					// push.apply(_, arraylike) throws on ancient WebKit
       
  5101 					jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
       
  5102 
       
  5103 				// Convert non-html into a text node
       
  5104 				} else if ( !rhtml.test( elem ) ) {
       
  5105 					nodes.push( context.createTextNode( elem ) );
       
  5106 
       
  5107 				// Convert html into DOM nodes
       
  5108 				} else {
       
  5109 					tmp = tmp || fragment.appendChild( context.createElement("div") );
       
  5110 
       
  5111 					// Deserialize a standard representation
       
  5112 					tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
       
  5113 					wrap = wrapMap[ tag ] || wrapMap._default;
       
  5114 					tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
       
  5115 
       
  5116 					// Descend through wrappers to the right content
       
  5117 					j = wrap[ 0 ];
       
  5118 					while ( j-- ) {
       
  5119 						tmp = tmp.lastChild;
       
  5120 					}
       
  5121 
       
  5122 					// Support: QtWebKit, PhantomJS
       
  5123 					// push.apply(_, arraylike) throws on ancient WebKit
       
  5124 					jQuery.merge( nodes, tmp.childNodes );
       
  5125 
       
  5126 					// Remember the top-level container
       
  5127 					tmp = fragment.firstChild;
       
  5128 
       
  5129 					// Ensure the created nodes are orphaned (#12392)
       
  5130 					tmp.textContent = "";
       
  5131 				}
       
  5132 			}
       
  5133 		}
       
  5134 
       
  5135 		// Remove wrapper from fragment
       
  5136 		fragment.textContent = "";
       
  5137 
       
  5138 		i = 0;
       
  5139 		while ( (elem = nodes[ i++ ]) ) {
       
  5140 
       
  5141 			// #4087 - If origin and destination elements are the same, and this is
       
  5142 			// that element, do not do anything
       
  5143 			if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
       
  5144 				continue;
       
  5145 			}
       
  5146 
       
  5147 			contains = jQuery.contains( elem.ownerDocument, elem );
       
  5148 
       
  5149 			// Append to fragment
       
  5150 			tmp = getAll( fragment.appendChild( elem ), "script" );
       
  5151 
       
  5152 			// Preserve script evaluation history
       
  5153 			if ( contains ) {
       
  5154 				setGlobalEval( tmp );
       
  5155 			}
       
  5156 
       
  5157 			// Capture executables
       
  5158 			if ( scripts ) {
       
  5159 				j = 0;
       
  5160 				while ( (elem = tmp[ j++ ]) ) {
       
  5161 					if ( rscriptType.test( elem.type || "" ) ) {
       
  5162 						scripts.push( elem );
       
  5163 					}
       
  5164 				}
       
  5165 			}
       
  5166 		}
       
  5167 
       
  5168 		return fragment;
       
  5169 	},
       
  5170 
       
  5171 	cleanData: function( elems ) {
       
  5172 		var data, elem, type, key,
       
  5173 			special = jQuery.event.special,
       
  5174 			i = 0;
       
  5175 
       
  5176 		for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
       
  5177 			if ( jQuery.acceptData( elem ) ) {
       
  5178 				key = elem[ data_priv.expando ];
       
  5179 
       
  5180 				if ( key && (data = data_priv.cache[ key ]) ) {
       
  5181 					if ( data.events ) {
       
  5182 						for ( type in data.events ) {
       
  5183 							if ( special[ type ] ) {
       
  5184 								jQuery.event.remove( elem, type );
       
  5185 
       
  5186 							// This is a shortcut to avoid jQuery.event.remove's overhead
       
  5187 							} else {
       
  5188 								jQuery.removeEvent( elem, type, data.handle );
       
  5189 							}
       
  5190 						}
       
  5191 					}
       
  5192 					if ( data_priv.cache[ key ] ) {
       
  5193 						// Discard any remaining `private` data
       
  5194 						delete data_priv.cache[ key ];
       
  5195 					}
       
  5196 				}
       
  5197 			}
       
  5198 			// Discard any remaining `user` data
       
  5199 			delete data_user.cache[ elem[ data_user.expando ] ];
       
  5200 		}
       
  5201 	}
       
  5202 });
       
  5203 
       
  5204 jQuery.fn.extend({
       
  5205 	text: function( value ) {
       
  5206 		return access( this, function( value ) {
       
  5207 			return value === undefined ?
       
  5208 				jQuery.text( this ) :
       
  5209 				this.empty().each(function() {
       
  5210 					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
       
  5211 						this.textContent = value;
       
  5212 					}
       
  5213 				});
       
  5214 		}, null, value, arguments.length );
       
  5215 	},
       
  5216 
       
  5217 	append: function() {
       
  5218 		return this.domManip( arguments, function( elem ) {
       
  5219 			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
       
  5220 				var target = manipulationTarget( this, elem );
       
  5221 				target.appendChild( elem );
       
  5222 			}
       
  5223 		});
       
  5224 	},
       
  5225 
       
  5226 	prepend: function() {
       
  5227 		return this.domManip( arguments, function( elem ) {
       
  5228 			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
       
  5229 				var target = manipulationTarget( this, elem );
       
  5230 				target.insertBefore( elem, target.firstChild );
       
  5231 			}
       
  5232 		});
       
  5233 	},
       
  5234 
       
  5235 	before: function() {
       
  5236 		return this.domManip( arguments, function( elem ) {
       
  5237 			if ( this.parentNode ) {
       
  5238 				this.parentNode.insertBefore( elem, this );
       
  5239 			}
       
  5240 		});
       
  5241 	},
       
  5242 
       
  5243 	after: function() {
       
  5244 		return this.domManip( arguments, function( elem ) {
       
  5245 			if ( this.parentNode ) {
       
  5246 				this.parentNode.insertBefore( elem, this.nextSibling );
       
  5247 			}
       
  5248 		});
       
  5249 	},
       
  5250 
       
  5251 	remove: function( selector, keepData /* Internal Use Only */ ) {
       
  5252 		var elem,
       
  5253 			elems = selector ? jQuery.filter( selector, this ) : this,
       
  5254 			i = 0;
       
  5255 
       
  5256 		for ( ; (elem = elems[i]) != null; i++ ) {
       
  5257 			if ( !keepData && elem.nodeType === 1 ) {
       
  5258 				jQuery.cleanData( getAll( elem ) );
       
  5259 			}
       
  5260 
       
  5261 			if ( elem.parentNode ) {
       
  5262 				if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
       
  5263 					setGlobalEval( getAll( elem, "script" ) );
       
  5264 				}
       
  5265 				elem.parentNode.removeChild( elem );
       
  5266 			}
       
  5267 		}
       
  5268 
       
  5269 		return this;
       
  5270 	},
       
  5271 
       
  5272 	empty: function() {
       
  5273 		var elem,
       
  5274 			i = 0;
       
  5275 
       
  5276 		for ( ; (elem = this[i]) != null; i++ ) {
       
  5277 			if ( elem.nodeType === 1 ) {
       
  5278 
       
  5279 				// Prevent memory leaks
       
  5280 				jQuery.cleanData( getAll( elem, false ) );
       
  5281 
       
  5282 				// Remove any remaining nodes
       
  5283 				elem.textContent = "";
       
  5284 			}
       
  5285 		}
       
  5286 
       
  5287 		return this;
       
  5288 	},
       
  5289 
       
  5290 	clone: function( dataAndEvents, deepDataAndEvents ) {
       
  5291 		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
       
  5292 		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
       
  5293 
       
  5294 		return this.map(function() {
       
  5295 			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
       
  5296 		});
       
  5297 	},
       
  5298 
       
  5299 	html: function( value ) {
       
  5300 		return access( this, function( value ) {
       
  5301 			var elem = this[ 0 ] || {},
       
  5302 				i = 0,
       
  5303 				l = this.length;
       
  5304 
       
  5305 			if ( value === undefined && elem.nodeType === 1 ) {
       
  5306 				return elem.innerHTML;
       
  5307 			}
       
  5308 
       
  5309 			// See if we can take a shortcut and just use innerHTML
       
  5310 			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
       
  5311 				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
       
  5312 
       
  5313 				value = value.replace( rxhtmlTag, "<$1></$2>" );
       
  5314 
       
  5315 				try {
       
  5316 					for ( ; i < l; i++ ) {
       
  5317 						elem = this[ i ] || {};
       
  5318 
       
  5319 						// Remove element nodes and prevent memory leaks
       
  5320 						if ( elem.nodeType === 1 ) {
       
  5321 							jQuery.cleanData( getAll( elem, false ) );
       
  5322 							elem.innerHTML = value;
       
  5323 						}
       
  5324 					}
       
  5325 
       
  5326 					elem = 0;
       
  5327 
       
  5328 				// If using innerHTML throws an exception, use the fallback method
       
  5329 				} catch( e ) {}
       
  5330 			}
       
  5331 
       
  5332 			if ( elem ) {
       
  5333 				this.empty().append( value );
       
  5334 			}
       
  5335 		}, null, value, arguments.length );
       
  5336 	},
       
  5337 
       
  5338 	replaceWith: function() {
       
  5339 		var arg = arguments[ 0 ];
       
  5340 
       
  5341 		// Make the changes, replacing each context element with the new content
       
  5342 		this.domManip( arguments, function( elem ) {
       
  5343 			arg = this.parentNode;
       
  5344 
       
  5345 			jQuery.cleanData( getAll( this ) );
       
  5346 
       
  5347 			if ( arg ) {
       
  5348 				arg.replaceChild( elem, this );
       
  5349 			}
       
  5350 		});
       
  5351 
       
  5352 		// Force removal if there was no new content (e.g., from empty arguments)
       
  5353 		return arg && (arg.length || arg.nodeType) ? this : this.remove();
       
  5354 	},
       
  5355 
       
  5356 	detach: function( selector ) {
       
  5357 		return this.remove( selector, true );
       
  5358 	},
       
  5359 
       
  5360 	domManip: function( args, callback ) {
       
  5361 
       
  5362 		// Flatten any nested arrays
       
  5363 		args = concat.apply( [], args );
       
  5364 
       
  5365 		var fragment, first, scripts, hasScripts, node, doc,
       
  5366 			i = 0,
       
  5367 			l = this.length,
       
  5368 			set = this,
       
  5369 			iNoClone = l - 1,
       
  5370 			value = args[ 0 ],
       
  5371 			isFunction = jQuery.isFunction( value );
       
  5372 
       
  5373 		// We can't cloneNode fragments that contain checked, in WebKit
       
  5374 		if ( isFunction ||
       
  5375 				( l > 1 && typeof value === "string" &&
       
  5376 					!support.checkClone && rchecked.test( value ) ) ) {
       
  5377 			return this.each(function( index ) {
       
  5378 				var self = set.eq( index );
       
  5379 				if ( isFunction ) {
       
  5380 					args[ 0 ] = value.call( this, index, self.html() );
       
  5381 				}
       
  5382 				self.domManip( args, callback );
       
  5383 			});
       
  5384 		}
       
  5385 
       
  5386 		if ( l ) {
       
  5387 			fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
       
  5388 			first = fragment.firstChild;
       
  5389 
       
  5390 			if ( fragment.childNodes.length === 1 ) {
       
  5391 				fragment = first;
       
  5392 			}
       
  5393 
       
  5394 			if ( first ) {
       
  5395 				scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
       
  5396 				hasScripts = scripts.length;
       
  5397 
       
  5398 				// Use the original fragment for the last item instead of the first because it can end up
       
  5399 				// being emptied incorrectly in certain situations (#8070).
       
  5400 				for ( ; i < l; i++ ) {
       
  5401 					node = fragment;
       
  5402 
       
  5403 					if ( i !== iNoClone ) {
       
  5404 						node = jQuery.clone( node, true, true );
       
  5405 
       
  5406 						// Keep references to cloned scripts for later restoration
       
  5407 						if ( hasScripts ) {
       
  5408 							// Support: QtWebKit
       
  5409 							// jQuery.merge because push.apply(_, arraylike) throws
       
  5410 							jQuery.merge( scripts, getAll( node, "script" ) );
       
  5411 						}
       
  5412 					}
       
  5413 
       
  5414 					callback.call( this[ i ], node, i );
       
  5415 				}
       
  5416 
       
  5417 				if ( hasScripts ) {
       
  5418 					doc = scripts[ scripts.length - 1 ].ownerDocument;
       
  5419 
       
  5420 					// Reenable scripts
       
  5421 					jQuery.map( scripts, restoreScript );
       
  5422 
       
  5423 					// Evaluate executable scripts on first document insertion
       
  5424 					for ( i = 0; i < hasScripts; i++ ) {
       
  5425 						node = scripts[ i ];
       
  5426 						if ( rscriptType.test( node.type || "" ) &&
       
  5427 							!data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
       
  5428 
       
  5429 							if ( node.src ) {
       
  5430 								// Optional AJAX dependency, but won't run scripts if not present
       
  5431 								if ( jQuery._evalUrl ) {
       
  5432 									jQuery._evalUrl( node.src );
       
  5433 								}
       
  5434 							} else {
       
  5435 								jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
       
  5436 							}
       
  5437 						}
       
  5438 					}
       
  5439 				}
       
  5440 			}
       
  5441 		}
       
  5442 
       
  5443 		return this;
       
  5444 	}
       
  5445 });
       
  5446 
       
  5447 jQuery.each({
       
  5448 	appendTo: "append",
       
  5449 	prependTo: "prepend",
       
  5450 	insertBefore: "before",
       
  5451 	insertAfter: "after",
       
  5452 	replaceAll: "replaceWith"
       
  5453 }, function( name, original ) {
       
  5454 	jQuery.fn[ name ] = function( selector ) {
       
  5455 		var elems,
       
  5456 			ret = [],
       
  5457 			insert = jQuery( selector ),
       
  5458 			last = insert.length - 1,
       
  5459 			i = 0;
       
  5460 
       
  5461 		for ( ; i <= last; i++ ) {
       
  5462 			elems = i === last ? this : this.clone( true );
       
  5463 			jQuery( insert[ i ] )[ original ]( elems );
       
  5464 
       
  5465 			// Support: QtWebKit
       
  5466 			// .get() because push.apply(_, arraylike) throws
       
  5467 			push.apply( ret, elems.get() );
       
  5468 		}
       
  5469 
       
  5470 		return this.pushStack( ret );
       
  5471 	};
       
  5472 });
       
  5473 
       
  5474 
       
  5475 var iframe,
       
  5476 	elemdisplay = {};
       
  5477 
       
  5478 /**
       
  5479  * Retrieve the actual display of a element
       
  5480  * @param {String} name nodeName of the element
       
  5481  * @param {Object} doc Document object
       
  5482  */
       
  5483 // Called only from within defaultDisplay
       
  5484 function actualDisplay( name, doc ) {
       
  5485 	var style,
       
  5486 		elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
       
  5487 
       
  5488 		// getDefaultComputedStyle might be reliably used only on attached element
       
  5489 		display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
       
  5490 
       
  5491 			// Use of this method is a temporary fix (more like optimization) until something better comes along,
       
  5492 			// since it was removed from specification and supported only in FF
       
  5493 			style.display : jQuery.css( elem[ 0 ], "display" );
       
  5494 
       
  5495 	// We don't have any data stored on the element,
       
  5496 	// so use "detach" method as fast way to get rid of the element
       
  5497 	elem.detach();
       
  5498 
       
  5499 	return display;
       
  5500 }
       
  5501 
       
  5502 /**
       
  5503  * Try to determine the default display value of an element
       
  5504  * @param {String} nodeName
       
  5505  */
       
  5506 function defaultDisplay( nodeName ) {
       
  5507 	var doc = document,
       
  5508 		display = elemdisplay[ nodeName ];
       
  5509 
       
  5510 	if ( !display ) {
       
  5511 		display = actualDisplay( nodeName, doc );
       
  5512 
       
  5513 		// If the simple way fails, read from inside an iframe
       
  5514 		if ( display === "none" || !display ) {
       
  5515 
       
  5516 			// Use the already-created iframe if possible
       
  5517 			iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
       
  5518 
       
  5519 			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
       
  5520 			doc = iframe[ 0 ].contentDocument;
       
  5521 
       
  5522 			// Support: IE
       
  5523 			doc.write();
       
  5524 			doc.close();
       
  5525 
       
  5526 			display = actualDisplay( nodeName, doc );
       
  5527 			iframe.detach();
       
  5528 		}
       
  5529 
       
  5530 		// Store the correct default display
       
  5531 		elemdisplay[ nodeName ] = display;
       
  5532 	}
       
  5533 
       
  5534 	return display;
       
  5535 }
       
  5536 var rmargin = (/^margin/);
       
  5537 
       
  5538 var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
       
  5539 
       
  5540 var getStyles = function( elem ) {
       
  5541 		// Support: IE<=11+, Firefox<=30+ (#15098, #14150)
       
  5542 		// IE throws on elements created in popups
       
  5543 		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
       
  5544 		if ( elem.ownerDocument.defaultView.opener ) {
       
  5545 			return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
       
  5546 		}
       
  5547 
       
  5548 		return window.getComputedStyle( elem, null );
       
  5549 	};
       
  5550 
       
  5551 
       
  5552 
       
  5553 function curCSS( elem, name, computed ) {
       
  5554 	var width, minWidth, maxWidth, ret,
       
  5555 		style = elem.style;
       
  5556 
       
  5557 	computed = computed || getStyles( elem );
       
  5558 
       
  5559 	// Support: IE9
       
  5560 	// getPropertyValue is only needed for .css('filter') (#12537)
       
  5561 	if ( computed ) {
       
  5562 		ret = computed.getPropertyValue( name ) || computed[ name ];
       
  5563 	}
       
  5564 
       
  5565 	if ( computed ) {
       
  5566 
       
  5567 		if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
       
  5568 			ret = jQuery.style( elem, name );
       
  5569 		}
       
  5570 
       
  5571 		// Support: iOS < 6
       
  5572 		// A tribute to the "awesome hack by Dean Edwards"
       
  5573 		// iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
       
  5574 		// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
       
  5575 		if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
       
  5576 
       
  5577 			// Remember the original values
       
  5578 			width = style.width;
       
  5579 			minWidth = style.minWidth;
       
  5580 			maxWidth = style.maxWidth;
       
  5581 
       
  5582 			// Put in the new values to get a computed value out
       
  5583 			style.minWidth = style.maxWidth = style.width = ret;
       
  5584 			ret = computed.width;
       
  5585 
       
  5586 			// Revert the changed values
       
  5587 			style.width = width;
       
  5588 			style.minWidth = minWidth;
       
  5589 			style.maxWidth = maxWidth;
       
  5590 		}
       
  5591 	}
       
  5592 
       
  5593 	return ret !== undefined ?
       
  5594 		// Support: IE
       
  5595 		// IE returns zIndex value as an integer.
       
  5596 		ret + "" :
       
  5597 		ret;
       
  5598 }
       
  5599 
       
  5600 
       
  5601 function addGetHookIf( conditionFn, hookFn ) {
       
  5602 	// Define the hook, we'll check on the first run if it's really needed.
       
  5603 	return {
       
  5604 		get: function() {
       
  5605 			if ( conditionFn() ) {
       
  5606 				// Hook not needed (or it's not possible to use it due
       
  5607 				// to missing dependency), remove it.
       
  5608 				delete this.get;
       
  5609 				return;
       
  5610 			}
       
  5611 
       
  5612 			// Hook needed; redefine it so that the support test is not executed again.
       
  5613 			return (this.get = hookFn).apply( this, arguments );
       
  5614 		}
       
  5615 	};
       
  5616 }
       
  5617 
       
  5618 
       
  5619 (function() {
       
  5620 	var pixelPositionVal, boxSizingReliableVal,
       
  5621 		docElem = document.documentElement,
       
  5622 		container = document.createElement( "div" ),
       
  5623 		div = document.createElement( "div" );
       
  5624 
       
  5625 	if ( !div.style ) {
       
  5626 		return;
       
  5627 	}
       
  5628 
       
  5629 	// Support: IE9-11+
       
  5630 	// Style of cloned element affects source element cloned (#8908)
       
  5631 	div.style.backgroundClip = "content-box";
       
  5632 	div.cloneNode( true ).style.backgroundClip = "";
       
  5633 	support.clearCloneStyle = div.style.backgroundClip === "content-box";
       
  5634 
       
  5635 	container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +
       
  5636 		"position:absolute";
       
  5637 	container.appendChild( div );
       
  5638 
       
  5639 	// Executing both pixelPosition & boxSizingReliable tests require only one layout
       
  5640 	// so they're executed at the same time to save the second computation.
       
  5641 	function computePixelPositionAndBoxSizingReliable() {
       
  5642 		div.style.cssText =
       
  5643 			// Support: Firefox<29, Android 2.3
       
  5644 			// Vendor-prefix box-sizing
       
  5645 			"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
       
  5646 			"box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
       
  5647 			"border:1px;padding:1px;width:4px;position:absolute";
       
  5648 		div.innerHTML = "";
       
  5649 		docElem.appendChild( container );
       
  5650 
       
  5651 		var divStyle = window.getComputedStyle( div, null );
       
  5652 		pixelPositionVal = divStyle.top !== "1%";
       
  5653 		boxSizingReliableVal = divStyle.width === "4px";
       
  5654 
       
  5655 		docElem.removeChild( container );
       
  5656 	}
       
  5657 
       
  5658 	// Support: node.js jsdom
       
  5659 	// Don't assume that getComputedStyle is a property of the global object
       
  5660 	if ( window.getComputedStyle ) {
       
  5661 		jQuery.extend( support, {
       
  5662 			pixelPosition: function() {
       
  5663 
       
  5664 				// This test is executed only once but we still do memoizing
       
  5665 				// since we can use the boxSizingReliable pre-computing.
       
  5666 				// No need to check if the test was already performed, though.
       
  5667 				computePixelPositionAndBoxSizingReliable();
       
  5668 				return pixelPositionVal;
       
  5669 			},
       
  5670 			boxSizingReliable: function() {
       
  5671 				if ( boxSizingReliableVal == null ) {
       
  5672 					computePixelPositionAndBoxSizingReliable();
       
  5673 				}
       
  5674 				return boxSizingReliableVal;
       
  5675 			},
       
  5676 			reliableMarginRight: function() {
       
  5677 
       
  5678 				// Support: Android 2.3
       
  5679 				// Check if div with explicit width and no margin-right incorrectly
       
  5680 				// gets computed margin-right based on width of container. (#3333)
       
  5681 				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
       
  5682 				// This support function is only executed once so no memoizing is needed.
       
  5683 				var ret,
       
  5684 					marginDiv = div.appendChild( document.createElement( "div" ) );
       
  5685 
       
  5686 				// Reset CSS: box-sizing; display; margin; border; padding
       
  5687 				marginDiv.style.cssText = div.style.cssText =
       
  5688 					// Support: Firefox<29, Android 2.3
       
  5689 					// Vendor-prefix box-sizing
       
  5690 					"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
       
  5691 					"box-sizing:content-box;display:block;margin:0;border:0;padding:0";
       
  5692 				marginDiv.style.marginRight = marginDiv.style.width = "0";
       
  5693 				div.style.width = "1px";
       
  5694 				docElem.appendChild( container );
       
  5695 
       
  5696 				ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
       
  5697 
       
  5698 				docElem.removeChild( container );
       
  5699 				div.removeChild( marginDiv );
       
  5700 
       
  5701 				return ret;
       
  5702 			}
       
  5703 		});
       
  5704 	}
       
  5705 })();
       
  5706 
       
  5707 
       
  5708 // A method for quickly swapping in/out CSS properties to get correct calculations.
       
  5709 jQuery.swap = function( elem, options, callback, args ) {
       
  5710 	var ret, name,
       
  5711 		old = {};
       
  5712 
       
  5713 	// Remember the old values, and insert the new ones
       
  5714 	for ( name in options ) {
       
  5715 		old[ name ] = elem.style[ name ];
       
  5716 		elem.style[ name ] = options[ name ];
       
  5717 	}
       
  5718 
       
  5719 	ret = callback.apply( elem, args || [] );
       
  5720 
       
  5721 	// Revert the old values
       
  5722 	for ( name in options ) {
       
  5723 		elem.style[ name ] = old[ name ];
       
  5724 	}
       
  5725 
       
  5726 	return ret;
       
  5727 };
       
  5728 
       
  5729 
       
  5730 var
       
  5731 	// Swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
       
  5732 	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
       
  5733 	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
       
  5734 	rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
       
  5735 	rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
       
  5736 
       
  5737 	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
       
  5738 	cssNormalTransform = {
       
  5739 		letterSpacing: "0",
       
  5740 		fontWeight: "400"
       
  5741 	},
       
  5742 
       
  5743 	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
       
  5744 
       
  5745 // Return a css property mapped to a potentially vendor prefixed property
       
  5746 function vendorPropName( style, name ) {
       
  5747 
       
  5748 	// Shortcut for names that are not vendor prefixed
       
  5749 	if ( name in style ) {
       
  5750 		return name;
       
  5751 	}
       
  5752 
       
  5753 	// Check for vendor prefixed names
       
  5754 	var capName = name[0].toUpperCase() + name.slice(1),
       
  5755 		origName = name,
       
  5756 		i = cssPrefixes.length;
       
  5757 
       
  5758 	while ( i-- ) {
       
  5759 		name = cssPrefixes[ i ] + capName;
       
  5760 		if ( name in style ) {
       
  5761 			return name;
       
  5762 		}
       
  5763 	}
       
  5764 
       
  5765 	return origName;
       
  5766 }
       
  5767 
       
  5768 function setPositiveNumber( elem, value, subtract ) {
       
  5769 	var matches = rnumsplit.exec( value );
       
  5770 	return matches ?
       
  5771 		// Guard against undefined "subtract", e.g., when used as in cssHooks
       
  5772 		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
       
  5773 		value;
       
  5774 }
       
  5775 
       
  5776 function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
       
  5777 	var i = extra === ( isBorderBox ? "border" : "content" ) ?
       
  5778 		// If we already have the right measurement, avoid augmentation
       
  5779 		4 :
       
  5780 		// Otherwise initialize for horizontal or vertical properties
       
  5781 		name === "width" ? 1 : 0,
       
  5782 
       
  5783 		val = 0;
       
  5784 
       
  5785 	for ( ; i < 4; i += 2 ) {
       
  5786 		// Both box models exclude margin, so add it if we want it
       
  5787 		if ( extra === "margin" ) {
       
  5788 			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
       
  5789 		}
       
  5790 
       
  5791 		if ( isBorderBox ) {
       
  5792 			// border-box includes padding, so remove it if we want content
       
  5793 			if ( extra === "content" ) {
       
  5794 				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
       
  5795 			}
       
  5796 
       
  5797 			// At this point, extra isn't border nor margin, so remove border
       
  5798 			if ( extra !== "margin" ) {
       
  5799 				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
       
  5800 			}
       
  5801 		} else {
       
  5802 			// At this point, extra isn't content, so add padding
       
  5803 			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
       
  5804 
       
  5805 			// At this point, extra isn't content nor padding, so add border
       
  5806 			if ( extra !== "padding" ) {
       
  5807 				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
       
  5808 			}
       
  5809 		}
       
  5810 	}
       
  5811 
       
  5812 	return val;
       
  5813 }
       
  5814 
       
  5815 function getWidthOrHeight( elem, name, extra ) {
       
  5816 
       
  5817 	// Start with offset property, which is equivalent to the border-box value
       
  5818 	var valueIsBorderBox = true,
       
  5819 		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
       
  5820 		styles = getStyles( elem ),
       
  5821 		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
       
  5822 
       
  5823 	// Some non-html elements return undefined for offsetWidth, so check for null/undefined
       
  5824 	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
       
  5825 	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
       
  5826 	if ( val <= 0 || val == null ) {
       
  5827 		// Fall back to computed then uncomputed css if necessary
       
  5828 		val = curCSS( elem, name, styles );
       
  5829 		if ( val < 0 || val == null ) {
       
  5830 			val = elem.style[ name ];
       
  5831 		}
       
  5832 
       
  5833 		// Computed unit is not pixels. Stop here and return.
       
  5834 		if ( rnumnonpx.test(val) ) {
       
  5835 			return val;
       
  5836 		}
       
  5837 
       
  5838 		// Check for style in case a browser which returns unreliable values
       
  5839 		// for getComputedStyle silently falls back to the reliable elem.style
       
  5840 		valueIsBorderBox = isBorderBox &&
       
  5841 			( support.boxSizingReliable() || val === elem.style[ name ] );
       
  5842 
       
  5843 		// Normalize "", auto, and prepare for extra
       
  5844 		val = parseFloat( val ) || 0;
       
  5845 	}
       
  5846 
       
  5847 	// Use the active box-sizing model to add/subtract irrelevant styles
       
  5848 	return ( val +
       
  5849 		augmentWidthOrHeight(
       
  5850 			elem,
       
  5851 			name,
       
  5852 			extra || ( isBorderBox ? "border" : "content" ),
       
  5853 			valueIsBorderBox,
       
  5854 			styles
       
  5855 		)
       
  5856 	) + "px";
       
  5857 }
       
  5858 
       
  5859 function showHide( elements, show ) {
       
  5860 	var display, elem, hidden,
       
  5861 		values = [],
       
  5862 		index = 0,
       
  5863 		length = elements.length;
       
  5864 
       
  5865 	for ( ; index < length; index++ ) {
       
  5866 		elem = elements[ index ];
       
  5867 		if ( !elem.style ) {
       
  5868 			continue;
       
  5869 		}
       
  5870 
       
  5871 		values[ index ] = data_priv.get( elem, "olddisplay" );
       
  5872 		display = elem.style.display;
       
  5873 		if ( show ) {
       
  5874 			// Reset the inline display of this element to learn if it is
       
  5875 			// being hidden by cascaded rules or not
       
  5876 			if ( !values[ index ] && display === "none" ) {
       
  5877 				elem.style.display = "";
       
  5878 			}
       
  5879 
       
  5880 			// Set elements which have been overridden with display: none
       
  5881 			// in a stylesheet to whatever the default browser style is
       
  5882 			// for such an element
       
  5883 			if ( elem.style.display === "" && isHidden( elem ) ) {
       
  5884 				values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );
       
  5885 			}
       
  5886 		} else {
       
  5887 			hidden = isHidden( elem );
       
  5888 
       
  5889 			if ( display !== "none" || !hidden ) {
       
  5890 				data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
       
  5891 			}
       
  5892 		}
       
  5893 	}
       
  5894 
       
  5895 	// Set the display of most of the elements in a second loop
       
  5896 	// to avoid the constant reflow
       
  5897 	for ( index = 0; index < length; index++ ) {
       
  5898 		elem = elements[ index ];
       
  5899 		if ( !elem.style ) {
       
  5900 			continue;
       
  5901 		}
       
  5902 		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
       
  5903 			elem.style.display = show ? values[ index ] || "" : "none";
       
  5904 		}
       
  5905 	}
       
  5906 
       
  5907 	return elements;
       
  5908 }
       
  5909 
       
  5910 jQuery.extend({
       
  5911 
       
  5912 	// Add in style property hooks for overriding the default
       
  5913 	// behavior of getting and setting a style property
       
  5914 	cssHooks: {
       
  5915 		opacity: {
       
  5916 			get: function( elem, computed ) {
       
  5917 				if ( computed ) {
       
  5918 
       
  5919 					// We should always get a number back from opacity
       
  5920 					var ret = curCSS( elem, "opacity" );
       
  5921 					return ret === "" ? "1" : ret;
       
  5922 				}
       
  5923 			}
       
  5924 		}
       
  5925 	},
       
  5926 
       
  5927 	// Don't automatically add "px" to these possibly-unitless properties
       
  5928 	cssNumber: {
       
  5929 		"columnCount": true,
       
  5930 		"fillOpacity": true,
       
  5931 		"flexGrow": true,
       
  5932 		"flexShrink": true,
       
  5933 		"fontWeight": true,
       
  5934 		"lineHeight": true,
       
  5935 		"opacity": true,
       
  5936 		"order": true,
       
  5937 		"orphans": true,
       
  5938 		"widows": true,
       
  5939 		"zIndex": true,
       
  5940 		"zoom": true
       
  5941 	},
       
  5942 
       
  5943 	// Add in properties whose names you wish to fix before
       
  5944 	// setting or getting the value
       
  5945 	cssProps: {
       
  5946 		"float": "cssFloat"
       
  5947 	},
       
  5948 
       
  5949 	// Get and set the style property on a DOM Node
       
  5950 	style: function( elem, name, value, extra ) {
       
  5951 
       
  5952 		// Don't set styles on text and comment nodes
       
  5953 		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
       
  5954 			return;
       
  5955 		}
       
  5956 
       
  5957 		// Make sure that we're working with the right name
       
  5958 		var ret, type, hooks,
       
  5959 			origName = jQuery.camelCase( name ),
       
  5960 			style = elem.style;
       
  5961 
       
  5962 		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
       
  5963 
       
  5964 		// Gets hook for the prefixed version, then unprefixed version
       
  5965 		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
       
  5966 
       
  5967 		// Check if we're setting a value
       
  5968 		if ( value !== undefined ) {
       
  5969 			type = typeof value;
       
  5970 
       
  5971 			// Convert "+=" or "-=" to relative numbers (#7345)
       
  5972 			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
       
  5973 				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
       
  5974 				// Fixes bug #9237
       
  5975 				type = "number";
       
  5976 			}
       
  5977 
       
  5978 			// Make sure that null and NaN values aren't set (#7116)
       
  5979 			if ( value == null || value !== value ) {
       
  5980 				return;
       
  5981 			}
       
  5982 
       
  5983 			// If a number, add 'px' to the (except for certain CSS properties)
       
  5984 			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
       
  5985 				value += "px";
       
  5986 			}
       
  5987 
       
  5988 			// Support: IE9-11+
       
  5989 			// background-* props affect original clone's values
       
  5990 			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
       
  5991 				style[ name ] = "inherit";
       
  5992 			}
       
  5993 
       
  5994 			// If a hook was provided, use that value, otherwise just set the specified value
       
  5995 			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
       
  5996 				style[ name ] = value;
       
  5997 			}
       
  5998 
       
  5999 		} else {
       
  6000 			// If a hook was provided get the non-computed value from there
       
  6001 			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
       
  6002 				return ret;
       
  6003 			}
       
  6004 
       
  6005 			// Otherwise just get the value from the style object
       
  6006 			return style[ name ];
       
  6007 		}
       
  6008 	},
       
  6009 
       
  6010 	css: function( elem, name, extra, styles ) {
       
  6011 		var val, num, hooks,
       
  6012 			origName = jQuery.camelCase( name );
       
  6013 
       
  6014 		// Make sure that we're working with the right name
       
  6015 		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
       
  6016 
       
  6017 		// Try prefixed name followed by the unprefixed name
       
  6018 		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
       
  6019 
       
  6020 		// If a hook was provided get the computed value from there
       
  6021 		if ( hooks && "get" in hooks ) {
       
  6022 			val = hooks.get( elem, true, extra );
       
  6023 		}
       
  6024 
       
  6025 		// Otherwise, if a way to get the computed value exists, use that
       
  6026 		if ( val === undefined ) {
       
  6027 			val = curCSS( elem, name, styles );
       
  6028 		}
       
  6029 
       
  6030 		// Convert "normal" to computed value
       
  6031 		if ( val === "normal" && name in cssNormalTransform ) {
       
  6032 			val = cssNormalTransform[ name ];
       
  6033 		}
       
  6034 
       
  6035 		// Make numeric if forced or a qualifier was provided and val looks numeric
       
  6036 		if ( extra === "" || extra ) {
       
  6037 			num = parseFloat( val );
       
  6038 			return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
       
  6039 		}
       
  6040 		return val;
       
  6041 	}
       
  6042 });
       
  6043 
       
  6044 jQuery.each([ "height", "width" ], function( i, name ) {
       
  6045 	jQuery.cssHooks[ name ] = {
       
  6046 		get: function( elem, computed, extra ) {
       
  6047 			if ( computed ) {
       
  6048 
       
  6049 				// Certain elements can have dimension info if we invisibly show them
       
  6050 				// but it must have a current display style that would benefit
       
  6051 				return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
       
  6052 					jQuery.swap( elem, cssShow, function() {
       
  6053 						return getWidthOrHeight( elem, name, extra );
       
  6054 					}) :
       
  6055 					getWidthOrHeight( elem, name, extra );
       
  6056 			}
       
  6057 		},
       
  6058 
       
  6059 		set: function( elem, value, extra ) {
       
  6060 			var styles = extra && getStyles( elem );
       
  6061 			return setPositiveNumber( elem, value, extra ?
       
  6062 				augmentWidthOrHeight(
       
  6063 					elem,
       
  6064 					name,
       
  6065 					extra,
       
  6066 					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
       
  6067 					styles
       
  6068 				) : 0
       
  6069 			);
       
  6070 		}
       
  6071 	};
       
  6072 });
       
  6073 
       
  6074 // Support: Android 2.3
       
  6075 jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
       
  6076 	function( elem, computed ) {
       
  6077 		if ( computed ) {
       
  6078 			return jQuery.swap( elem, { "display": "inline-block" },
       
  6079 				curCSS, [ elem, "marginRight" ] );
       
  6080 		}
       
  6081 	}
       
  6082 );
       
  6083 
       
  6084 // These hooks are used by animate to expand properties
       
  6085 jQuery.each({
       
  6086 	margin: "",
       
  6087 	padding: "",
       
  6088 	border: "Width"
       
  6089 }, function( prefix, suffix ) {
       
  6090 	jQuery.cssHooks[ prefix + suffix ] = {
       
  6091 		expand: function( value ) {
       
  6092 			var i = 0,
       
  6093 				expanded = {},
       
  6094 
       
  6095 				// Assumes a single number if not a string
       
  6096 				parts = typeof value === "string" ? value.split(" ") : [ value ];
       
  6097 
       
  6098 			for ( ; i < 4; i++ ) {
       
  6099 				expanded[ prefix + cssExpand[ i ] + suffix ] =
       
  6100 					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
       
  6101 			}
       
  6102 
       
  6103 			return expanded;
       
  6104 		}
       
  6105 	};
       
  6106 
       
  6107 	if ( !rmargin.test( prefix ) ) {
       
  6108 		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
       
  6109 	}
       
  6110 });
       
  6111 
       
  6112 jQuery.fn.extend({
       
  6113 	css: function( name, value ) {
       
  6114 		return access( this, function( elem, name, value ) {
       
  6115 			var styles, len,
       
  6116 				map = {},
       
  6117 				i = 0;
       
  6118 
       
  6119 			if ( jQuery.isArray( name ) ) {
       
  6120 				styles = getStyles( elem );
       
  6121 				len = name.length;
       
  6122 
       
  6123 				for ( ; i < len; i++ ) {
       
  6124 					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
       
  6125 				}
       
  6126 
       
  6127 				return map;
       
  6128 			}
       
  6129 
       
  6130 			return value !== undefined ?
       
  6131 				jQuery.style( elem, name, value ) :
       
  6132 				jQuery.css( elem, name );
       
  6133 		}, name, value, arguments.length > 1 );
       
  6134 	},
       
  6135 	show: function() {
       
  6136 		return showHide( this, true );
       
  6137 	},
       
  6138 	hide: function() {
       
  6139 		return showHide( this );
       
  6140 	},
       
  6141 	toggle: function( state ) {
       
  6142 		if ( typeof state === "boolean" ) {
       
  6143 			return state ? this.show() : this.hide();
       
  6144 		}
       
  6145 
       
  6146 		return this.each(function() {
       
  6147 			if ( isHidden( this ) ) {
       
  6148 				jQuery( this ).show();
       
  6149 			} else {
       
  6150 				jQuery( this ).hide();
       
  6151 			}
       
  6152 		});
       
  6153 	}
       
  6154 });
       
  6155 
       
  6156 
       
  6157 function Tween( elem, options, prop, end, easing ) {
       
  6158 	return new Tween.prototype.init( elem, options, prop, end, easing );
       
  6159 }
       
  6160 jQuery.Tween = Tween;
       
  6161 
       
  6162 Tween.prototype = {
       
  6163 	constructor: Tween,
       
  6164 	init: function( elem, options, prop, end, easing, unit ) {
       
  6165 		this.elem = elem;
       
  6166 		this.prop = prop;
       
  6167 		this.easing = easing || "swing";
       
  6168 		this.options = options;
       
  6169 		this.start = this.now = this.cur();
       
  6170 		this.end = end;
       
  6171 		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
       
  6172 	},
       
  6173 	cur: function() {
       
  6174 		var hooks = Tween.propHooks[ this.prop ];
       
  6175 
       
  6176 		return hooks && hooks.get ?
       
  6177 			hooks.get( this ) :
       
  6178 			Tween.propHooks._default.get( this );
       
  6179 	},
       
  6180 	run: function( percent ) {
       
  6181 		var eased,
       
  6182 			hooks = Tween.propHooks[ this.prop ];
       
  6183 
       
  6184 		if ( this.options.duration ) {
       
  6185 			this.pos = eased = jQuery.easing[ this.easing ](
       
  6186 				percent, this.options.duration * percent, 0, 1, this.options.duration
       
  6187 			);
       
  6188 		} else {
       
  6189 			this.pos = eased = percent;
       
  6190 		}
       
  6191 		this.now = ( this.end - this.start ) * eased + this.start;
       
  6192 
       
  6193 		if ( this.options.step ) {
       
  6194 			this.options.step.call( this.elem, this.now, this );
       
  6195 		}
       
  6196 
       
  6197 		if ( hooks && hooks.set ) {
       
  6198 			hooks.set( this );
       
  6199 		} else {
       
  6200 			Tween.propHooks._default.set( this );
       
  6201 		}
       
  6202 		return this;
       
  6203 	}
       
  6204 };
       
  6205 
       
  6206 Tween.prototype.init.prototype = Tween.prototype;
       
  6207 
       
  6208 Tween.propHooks = {
       
  6209 	_default: {
       
  6210 		get: function( tween ) {
       
  6211 			var result;
       
  6212 
       
  6213 			if ( tween.elem[ tween.prop ] != null &&
       
  6214 				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
       
  6215 				return tween.elem[ tween.prop ];
       
  6216 			}
       
  6217 
       
  6218 			// Passing an empty string as a 3rd parameter to .css will automatically
       
  6219 			// attempt a parseFloat and fallback to a string if the parse fails.
       
  6220 			// Simple values such as "10px" are parsed to Float;
       
  6221 			// complex values such as "rotate(1rad)" are returned as-is.
       
  6222 			result = jQuery.css( tween.elem, tween.prop, "" );
       
  6223 			// Empty strings, null, undefined and "auto" are converted to 0.
       
  6224 			return !result || result === "auto" ? 0 : result;
       
  6225 		},
       
  6226 		set: function( tween ) {
       
  6227 			// Use step hook for back compat.
       
  6228 			// Use cssHook if its there.
       
  6229 			// Use .style if available and use plain properties where available.
       
  6230 			if ( jQuery.fx.step[ tween.prop ] ) {
       
  6231 				jQuery.fx.step[ tween.prop ]( tween );
       
  6232 			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
       
  6233 				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
       
  6234 			} else {
       
  6235 				tween.elem[ tween.prop ] = tween.now;
       
  6236 			}
       
  6237 		}
       
  6238 	}
       
  6239 };
       
  6240 
       
  6241 // Support: IE9
       
  6242 // Panic based approach to setting things on disconnected nodes
       
  6243 Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
       
  6244 	set: function( tween ) {
       
  6245 		if ( tween.elem.nodeType && tween.elem.parentNode ) {
       
  6246 			tween.elem[ tween.prop ] = tween.now;
       
  6247 		}
       
  6248 	}
       
  6249 };
       
  6250 
       
  6251 jQuery.easing = {
       
  6252 	linear: function( p ) {
       
  6253 		return p;
       
  6254 	},
       
  6255 	swing: function( p ) {
       
  6256 		return 0.5 - Math.cos( p * Math.PI ) / 2;
       
  6257 	}
       
  6258 };
       
  6259 
       
  6260 jQuery.fx = Tween.prototype.init;
       
  6261 
       
  6262 // Back Compat <1.8 extension point
       
  6263 jQuery.fx.step = {};
       
  6264 
       
  6265 
       
  6266 
       
  6267 
       
  6268 var
       
  6269 	fxNow, timerId,
       
  6270 	rfxtypes = /^(?:toggle|show|hide)$/,
       
  6271 	rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
       
  6272 	rrun = /queueHooks$/,
       
  6273 	animationPrefilters = [ defaultPrefilter ],
       
  6274 	tweeners = {
       
  6275 		"*": [ function( prop, value ) {
       
  6276 			var tween = this.createTween( prop, value ),
       
  6277 				target = tween.cur(),
       
  6278 				parts = rfxnum.exec( value ),
       
  6279 				unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
       
  6280 
       
  6281 				// Starting value computation is required for potential unit mismatches
       
  6282 				start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
       
  6283 					rfxnum.exec( jQuery.css( tween.elem, prop ) ),
       
  6284 				scale = 1,
       
  6285 				maxIterations = 20;
       
  6286 
       
  6287 			if ( start && start[ 3 ] !== unit ) {
       
  6288 				// Trust units reported by jQuery.css
       
  6289 				unit = unit || start[ 3 ];
       
  6290 
       
  6291 				// Make sure we update the tween properties later on
       
  6292 				parts = parts || [];
       
  6293 
       
  6294 				// Iteratively approximate from a nonzero starting point
       
  6295 				start = +target || 1;
       
  6296 
       
  6297 				do {
       
  6298 					// If previous iteration zeroed out, double until we get *something*.
       
  6299 					// Use string for doubling so we don't accidentally see scale as unchanged below
       
  6300 					scale = scale || ".5";
       
  6301 
       
  6302 					// Adjust and apply
       
  6303 					start = start / scale;
       
  6304 					jQuery.style( tween.elem, prop, start + unit );
       
  6305 
       
  6306 				// Update scale, tolerating zero or NaN from tween.cur(),
       
  6307 				// break the loop if scale is unchanged or perfect, or if we've just had enough
       
  6308 				} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
       
  6309 			}
       
  6310 
       
  6311 			// Update tween properties
       
  6312 			if ( parts ) {
       
  6313 				start = tween.start = +start || +target || 0;
       
  6314 				tween.unit = unit;
       
  6315 				// If a +=/-= token was provided, we're doing a relative animation
       
  6316 				tween.end = parts[ 1 ] ?
       
  6317 					start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
       
  6318 					+parts[ 2 ];
       
  6319 			}
       
  6320 
       
  6321 			return tween;
       
  6322 		} ]
       
  6323 	};
       
  6324 
       
  6325 // Animations created synchronously will run synchronously
       
  6326 function createFxNow() {
       
  6327 	setTimeout(function() {
       
  6328 		fxNow = undefined;
       
  6329 	});
       
  6330 	return ( fxNow = jQuery.now() );
       
  6331 }
       
  6332 
       
  6333 // Generate parameters to create a standard animation
       
  6334 function genFx( type, includeWidth ) {
       
  6335 	var which,
       
  6336 		i = 0,
       
  6337 		attrs = { height: type };
       
  6338 
       
  6339 	// If we include width, step value is 1 to do all cssExpand values,
       
  6340 	// otherwise step value is 2 to skip over Left and Right
       
  6341 	includeWidth = includeWidth ? 1 : 0;
       
  6342 	for ( ; i < 4 ; i += 2 - includeWidth ) {
       
  6343 		which = cssExpand[ i ];
       
  6344 		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
       
  6345 	}
       
  6346 
       
  6347 	if ( includeWidth ) {
       
  6348 		attrs.opacity = attrs.width = type;
       
  6349 	}
       
  6350 
       
  6351 	return attrs;
       
  6352 }
       
  6353 
       
  6354 function createTween( value, prop, animation ) {
       
  6355 	var tween,
       
  6356 		collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
       
  6357 		index = 0,
       
  6358 		length = collection.length;
       
  6359 	for ( ; index < length; index++ ) {
       
  6360 		if ( (tween = collection[ index ].call( animation, prop, value )) ) {
       
  6361 
       
  6362 			// We're done with this property
       
  6363 			return tween;
       
  6364 		}
       
  6365 	}
       
  6366 }
       
  6367 
       
  6368 function defaultPrefilter( elem, props, opts ) {
       
  6369 	/* jshint validthis: true */
       
  6370 	var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
       
  6371 		anim = this,
       
  6372 		orig = {},
       
  6373 		style = elem.style,
       
  6374 		hidden = elem.nodeType && isHidden( elem ),
       
  6375 		dataShow = data_priv.get( elem, "fxshow" );
       
  6376 
       
  6377 	// Handle queue: false promises
       
  6378 	if ( !opts.queue ) {
       
  6379 		hooks = jQuery._queueHooks( elem, "fx" );
       
  6380 		if ( hooks.unqueued == null ) {
       
  6381 			hooks.unqueued = 0;
       
  6382 			oldfire = hooks.empty.fire;
       
  6383 			hooks.empty.fire = function() {
       
  6384 				if ( !hooks.unqueued ) {
       
  6385 					oldfire();
       
  6386 				}
       
  6387 			};
       
  6388 		}
       
  6389 		hooks.unqueued++;
       
  6390 
       
  6391 		anim.always(function() {
       
  6392 			// Ensure the complete handler is called before this completes
       
  6393 			anim.always(function() {
       
  6394 				hooks.unqueued--;
       
  6395 				if ( !jQuery.queue( elem, "fx" ).length ) {
       
  6396 					hooks.empty.fire();
       
  6397 				}
       
  6398 			});
       
  6399 		});
       
  6400 	}
       
  6401 
       
  6402 	// Height/width overflow pass
       
  6403 	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
       
  6404 		// Make sure that nothing sneaks out
       
  6405 		// Record all 3 overflow attributes because IE9-10 do not
       
  6406 		// change the overflow attribute when overflowX and
       
  6407 		// overflowY are set to the same value
       
  6408 		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
       
  6409 
       
  6410 		// Set display property to inline-block for height/width
       
  6411 		// animations on inline elements that are having width/height animated
       
  6412 		display = jQuery.css( elem, "display" );
       
  6413 
       
  6414 		// Test default display if display is currently "none"
       
  6415 		checkDisplay = display === "none" ?
       
  6416 			data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
       
  6417 
       
  6418 		if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
       
  6419 			style.display = "inline-block";
       
  6420 		}
       
  6421 	}
       
  6422 
       
  6423 	if ( opts.overflow ) {
       
  6424 		style.overflow = "hidden";
       
  6425 		anim.always(function() {
       
  6426 			style.overflow = opts.overflow[ 0 ];
       
  6427 			style.overflowX = opts.overflow[ 1 ];
       
  6428 			style.overflowY = opts.overflow[ 2 ];
       
  6429 		});
       
  6430 	}
       
  6431 
       
  6432 	// show/hide pass
       
  6433 	for ( prop in props ) {
       
  6434 		value = props[ prop ];
       
  6435 		if ( rfxtypes.exec( value ) ) {
       
  6436 			delete props[ prop ];
       
  6437 			toggle = toggle || value === "toggle";
       
  6438 			if ( value === ( hidden ? "hide" : "show" ) ) {
       
  6439 
       
  6440 				// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
       
  6441 				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
       
  6442 					hidden = true;
       
  6443 				} else {
       
  6444 					continue;
       
  6445 				}
       
  6446 			}
       
  6447 			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
       
  6448 
       
  6449 		// Any non-fx value stops us from restoring the original display value
       
  6450 		} else {
       
  6451 			display = undefined;
       
  6452 		}
       
  6453 	}
       
  6454 
       
  6455 	if ( !jQuery.isEmptyObject( orig ) ) {
       
  6456 		if ( dataShow ) {
       
  6457 			if ( "hidden" in dataShow ) {
       
  6458 				hidden = dataShow.hidden;
       
  6459 			}
       
  6460 		} else {
       
  6461 			dataShow = data_priv.access( elem, "fxshow", {} );
       
  6462 		}
       
  6463 
       
  6464 		// Store state if its toggle - enables .stop().toggle() to "reverse"
       
  6465 		if ( toggle ) {
       
  6466 			dataShow.hidden = !hidden;
       
  6467 		}
       
  6468 		if ( hidden ) {
       
  6469 			jQuery( elem ).show();
       
  6470 		} else {
       
  6471 			anim.done(function() {
       
  6472 				jQuery( elem ).hide();
       
  6473 			});
       
  6474 		}
       
  6475 		anim.done(function() {
       
  6476 			var prop;
       
  6477 
       
  6478 			data_priv.remove( elem, "fxshow" );
       
  6479 			for ( prop in orig ) {
       
  6480 				jQuery.style( elem, prop, orig[ prop ] );
       
  6481 			}
       
  6482 		});
       
  6483 		for ( prop in orig ) {
       
  6484 			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
       
  6485 
       
  6486 			if ( !( prop in dataShow ) ) {
       
  6487 				dataShow[ prop ] = tween.start;
       
  6488 				if ( hidden ) {
       
  6489 					tween.end = tween.start;
       
  6490 					tween.start = prop === "width" || prop === "height" ? 1 : 0;
       
  6491 				}
       
  6492 			}
       
  6493 		}
       
  6494 
       
  6495 	// If this is a noop like .hide().hide(), restore an overwritten display value
       
  6496 	} else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
       
  6497 		style.display = display;
       
  6498 	}
       
  6499 }
       
  6500 
       
  6501 function propFilter( props, specialEasing ) {
       
  6502 	var index, name, easing, value, hooks;
       
  6503 
       
  6504 	// camelCase, specialEasing and expand cssHook pass
       
  6505 	for ( index in props ) {
       
  6506 		name = jQuery.camelCase( index );
       
  6507 		easing = specialEasing[ name ];
       
  6508 		value = props[ index ];
       
  6509 		if ( jQuery.isArray( value ) ) {
       
  6510 			easing = value[ 1 ];
       
  6511 			value = props[ index ] = value[ 0 ];
       
  6512 		}
       
  6513 
       
  6514 		if ( index !== name ) {
       
  6515 			props[ name ] = value;
       
  6516 			delete props[ index ];
       
  6517 		}
       
  6518 
       
  6519 		hooks = jQuery.cssHooks[ name ];
       
  6520 		if ( hooks && "expand" in hooks ) {
       
  6521 			value = hooks.expand( value );
       
  6522 			delete props[ name ];
       
  6523 
       
  6524 			// Not quite $.extend, this won't overwrite existing keys.
       
  6525 			// Reusing 'index' because we have the correct "name"
       
  6526 			for ( index in value ) {
       
  6527 				if ( !( index in props ) ) {
       
  6528 					props[ index ] = value[ index ];
       
  6529 					specialEasing[ index ] = easing;
       
  6530 				}
       
  6531 			}
       
  6532 		} else {
       
  6533 			specialEasing[ name ] = easing;
       
  6534 		}
       
  6535 	}
       
  6536 }
       
  6537 
       
  6538 function Animation( elem, properties, options ) {
       
  6539 	var result,
       
  6540 		stopped,
       
  6541 		index = 0,
       
  6542 		length = animationPrefilters.length,
       
  6543 		deferred = jQuery.Deferred().always( function() {
       
  6544 			// Don't match elem in the :animated selector
       
  6545 			delete tick.elem;
       
  6546 		}),
       
  6547 		tick = function() {
       
  6548 			if ( stopped ) {
       
  6549 				return false;
       
  6550 			}
       
  6551 			var currentTime = fxNow || createFxNow(),
       
  6552 				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
       
  6553 				// Support: Android 2.3
       
  6554 				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
       
  6555 				temp = remaining / animation.duration || 0,
       
  6556 				percent = 1 - temp,
       
  6557 				index = 0,
       
  6558 				length = animation.tweens.length;
       
  6559 
       
  6560 			for ( ; index < length ; index++ ) {
       
  6561 				animation.tweens[ index ].run( percent );
       
  6562 			}
       
  6563 
       
  6564 			deferred.notifyWith( elem, [ animation, percent, remaining ]);
       
  6565 
       
  6566 			if ( percent < 1 && length ) {
       
  6567 				return remaining;
       
  6568 			} else {
       
  6569 				deferred.resolveWith( elem, [ animation ] );
       
  6570 				return false;
       
  6571 			}
       
  6572 		},
       
  6573 		animation = deferred.promise({
       
  6574 			elem: elem,
       
  6575 			props: jQuery.extend( {}, properties ),
       
  6576 			opts: jQuery.extend( true, { specialEasing: {} }, options ),
       
  6577 			originalProperties: properties,
       
  6578 			originalOptions: options,
       
  6579 			startTime: fxNow || createFxNow(),
       
  6580 			duration: options.duration,
       
  6581 			tweens: [],
       
  6582 			createTween: function( prop, end ) {
       
  6583 				var tween = jQuery.Tween( elem, animation.opts, prop, end,
       
  6584 						animation.opts.specialEasing[ prop ] || animation.opts.easing );
       
  6585 				animation.tweens.push( tween );
       
  6586 				return tween;
       
  6587 			},
       
  6588 			stop: function( gotoEnd ) {
       
  6589 				var index = 0,
       
  6590 					// If we are going to the end, we want to run all the tweens
       
  6591 					// otherwise we skip this part
       
  6592 					length = gotoEnd ? animation.tweens.length : 0;
       
  6593 				if ( stopped ) {
       
  6594 					return this;
       
  6595 				}
       
  6596 				stopped = true;
       
  6597 				for ( ; index < length ; index++ ) {
       
  6598 					animation.tweens[ index ].run( 1 );
       
  6599 				}
       
  6600 
       
  6601 				// Resolve when we played the last frame; otherwise, reject
       
  6602 				if ( gotoEnd ) {
       
  6603 					deferred.resolveWith( elem, [ animation, gotoEnd ] );
       
  6604 				} else {
       
  6605 					deferred.rejectWith( elem, [ animation, gotoEnd ] );
       
  6606 				}
       
  6607 				return this;
       
  6608 			}
       
  6609 		}),
       
  6610 		props = animation.props;
       
  6611 
       
  6612 	propFilter( props, animation.opts.specialEasing );
       
  6613 
       
  6614 	for ( ; index < length ; index++ ) {
       
  6615 		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
       
  6616 		if ( result ) {
       
  6617 			return result;
       
  6618 		}
       
  6619 	}
       
  6620 
       
  6621 	jQuery.map( props, createTween, animation );
       
  6622 
       
  6623 	if ( jQuery.isFunction( animation.opts.start ) ) {
       
  6624 		animation.opts.start.call( elem, animation );
       
  6625 	}
       
  6626 
       
  6627 	jQuery.fx.timer(
       
  6628 		jQuery.extend( tick, {
       
  6629 			elem: elem,
       
  6630 			anim: animation,
       
  6631 			queue: animation.opts.queue
       
  6632 		})
       
  6633 	);
       
  6634 
       
  6635 	// attach callbacks from options
       
  6636 	return animation.progress( animation.opts.progress )
       
  6637 		.done( animation.opts.done, animation.opts.complete )
       
  6638 		.fail( animation.opts.fail )
       
  6639 		.always( animation.opts.always );
       
  6640 }
       
  6641 
       
  6642 jQuery.Animation = jQuery.extend( Animation, {
       
  6643 
       
  6644 	tweener: function( props, callback ) {
       
  6645 		if ( jQuery.isFunction( props ) ) {
       
  6646 			callback = props;
       
  6647 			props = [ "*" ];
       
  6648 		} else {
       
  6649 			props = props.split(" ");
       
  6650 		}
       
  6651 
       
  6652 		var prop,
       
  6653 			index = 0,
       
  6654 			length = props.length;
       
  6655 
       
  6656 		for ( ; index < length ; index++ ) {
       
  6657 			prop = props[ index ];
       
  6658 			tweeners[ prop ] = tweeners[ prop ] || [];
       
  6659 			tweeners[ prop ].unshift( callback );
       
  6660 		}
       
  6661 	},
       
  6662 
       
  6663 	prefilter: function( callback, prepend ) {
       
  6664 		if ( prepend ) {
       
  6665 			animationPrefilters.unshift( callback );
       
  6666 		} else {
       
  6667 			animationPrefilters.push( callback );
       
  6668 		}
       
  6669 	}
       
  6670 });
       
  6671 
       
  6672 jQuery.speed = function( speed, easing, fn ) {
       
  6673 	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
       
  6674 		complete: fn || !fn && easing ||
       
  6675 			jQuery.isFunction( speed ) && speed,
       
  6676 		duration: speed,
       
  6677 		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
       
  6678 	};
       
  6679 
       
  6680 	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
       
  6681 		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
       
  6682 
       
  6683 	// Normalize opt.queue - true/undefined/null -> "fx"
       
  6684 	if ( opt.queue == null || opt.queue === true ) {
       
  6685 		opt.queue = "fx";
       
  6686 	}
       
  6687 
       
  6688 	// Queueing
       
  6689 	opt.old = opt.complete;
       
  6690 
       
  6691 	opt.complete = function() {
       
  6692 		if ( jQuery.isFunction( opt.old ) ) {
       
  6693 			opt.old.call( this );
       
  6694 		}
       
  6695 
       
  6696 		if ( opt.queue ) {
       
  6697 			jQuery.dequeue( this, opt.queue );
       
  6698 		}
       
  6699 	};
       
  6700 
       
  6701 	return opt;
       
  6702 };
       
  6703 
       
  6704 jQuery.fn.extend({
       
  6705 	fadeTo: function( speed, to, easing, callback ) {
       
  6706 
       
  6707 		// Show any hidden elements after setting opacity to 0
       
  6708 		return this.filter( isHidden ).css( "opacity", 0 ).show()
       
  6709 
       
  6710 			// Animate to the value specified
       
  6711 			.end().animate({ opacity: to }, speed, easing, callback );
       
  6712 	},
       
  6713 	animate: function( prop, speed, easing, callback ) {
       
  6714 		var empty = jQuery.isEmptyObject( prop ),
       
  6715 			optall = jQuery.speed( speed, easing, callback ),
       
  6716 			doAnimation = function() {
       
  6717 				// Operate on a copy of prop so per-property easing won't be lost
       
  6718 				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
       
  6719 
       
  6720 				// Empty animations, or finishing resolves immediately
       
  6721 				if ( empty || data_priv.get( this, "finish" ) ) {
       
  6722 					anim.stop( true );
       
  6723 				}
       
  6724 			};
       
  6725 			doAnimation.finish = doAnimation;
       
  6726 
       
  6727 		return empty || optall.queue === false ?
       
  6728 			this.each( doAnimation ) :
       
  6729 			this.queue( optall.queue, doAnimation );
       
  6730 	},
       
  6731 	stop: function( type, clearQueue, gotoEnd ) {
       
  6732 		var stopQueue = function( hooks ) {
       
  6733 			var stop = hooks.stop;
       
  6734 			delete hooks.stop;
       
  6735 			stop( gotoEnd );
       
  6736 		};
       
  6737 
       
  6738 		if ( typeof type !== "string" ) {
       
  6739 			gotoEnd = clearQueue;
       
  6740 			clearQueue = type;
       
  6741 			type = undefined;
       
  6742 		}
       
  6743 		if ( clearQueue && type !== false ) {
       
  6744 			this.queue( type || "fx", [] );
       
  6745 		}
       
  6746 
       
  6747 		return this.each(function() {
       
  6748 			var dequeue = true,
       
  6749 				index = type != null && type + "queueHooks",
       
  6750 				timers = jQuery.timers,
       
  6751 				data = data_priv.get( this );
       
  6752 
       
  6753 			if ( index ) {
       
  6754 				if ( data[ index ] && data[ index ].stop ) {
       
  6755 					stopQueue( data[ index ] );
       
  6756 				}
       
  6757 			} else {
       
  6758 				for ( index in data ) {
       
  6759 					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
       
  6760 						stopQueue( data[ index ] );
       
  6761 					}
       
  6762 				}
       
  6763 			}
       
  6764 
       
  6765 			for ( index = timers.length; index--; ) {
       
  6766 				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
       
  6767 					timers[ index ].anim.stop( gotoEnd );
       
  6768 					dequeue = false;
       
  6769 					timers.splice( index, 1 );
       
  6770 				}
       
  6771 			}
       
  6772 
       
  6773 			// Start the next in the queue if the last step wasn't forced.
       
  6774 			// Timers currently will call their complete callbacks, which
       
  6775 			// will dequeue but only if they were gotoEnd.
       
  6776 			if ( dequeue || !gotoEnd ) {
       
  6777 				jQuery.dequeue( this, type );
       
  6778 			}
       
  6779 		});
       
  6780 	},
       
  6781 	finish: function( type ) {
       
  6782 		if ( type !== false ) {
       
  6783 			type = type || "fx";
       
  6784 		}
       
  6785 		return this.each(function() {
       
  6786 			var index,
       
  6787 				data = data_priv.get( this ),
       
  6788 				queue = data[ type + "queue" ],
       
  6789 				hooks = data[ type + "queueHooks" ],
       
  6790 				timers = jQuery.timers,
       
  6791 				length = queue ? queue.length : 0;
       
  6792 
       
  6793 			// Enable finishing flag on private data
       
  6794 			data.finish = true;
       
  6795 
       
  6796 			// Empty the queue first
       
  6797 			jQuery.queue( this, type, [] );
       
  6798 
       
  6799 			if ( hooks && hooks.stop ) {
       
  6800 				hooks.stop.call( this, true );
       
  6801 			}
       
  6802 
       
  6803 			// Look for any active animations, and finish them
       
  6804 			for ( index = timers.length; index--; ) {
       
  6805 				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
       
  6806 					timers[ index ].anim.stop( true );
       
  6807 					timers.splice( index, 1 );
       
  6808 				}
       
  6809 			}
       
  6810 
       
  6811 			// Look for any animations in the old queue and finish them
       
  6812 			for ( index = 0; index < length; index++ ) {
       
  6813 				if ( queue[ index ] && queue[ index ].finish ) {
       
  6814 					queue[ index ].finish.call( this );
       
  6815 				}
       
  6816 			}
       
  6817 
       
  6818 			// Turn off finishing flag
       
  6819 			delete data.finish;
       
  6820 		});
       
  6821 	}
       
  6822 });
       
  6823 
       
  6824 jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
       
  6825 	var cssFn = jQuery.fn[ name ];
       
  6826 	jQuery.fn[ name ] = function( speed, easing, callback ) {
       
  6827 		return speed == null || typeof speed === "boolean" ?
       
  6828 			cssFn.apply( this, arguments ) :
       
  6829 			this.animate( genFx( name, true ), speed, easing, callback );
       
  6830 	};
       
  6831 });
       
  6832 
       
  6833 // Generate shortcuts for custom animations
       
  6834 jQuery.each({
       
  6835 	slideDown: genFx("show"),
       
  6836 	slideUp: genFx("hide"),
       
  6837 	slideToggle: genFx("toggle"),
       
  6838 	fadeIn: { opacity: "show" },
       
  6839 	fadeOut: { opacity: "hide" },
       
  6840 	fadeToggle: { opacity: "toggle" }
       
  6841 }, function( name, props ) {
       
  6842 	jQuery.fn[ name ] = function( speed, easing, callback ) {
       
  6843 		return this.animate( props, speed, easing, callback );
       
  6844 	};
       
  6845 });
       
  6846 
       
  6847 jQuery.timers = [];
       
  6848 jQuery.fx.tick = function() {
       
  6849 	var timer,
       
  6850 		i = 0,
       
  6851 		timers = jQuery.timers;
       
  6852 
       
  6853 	fxNow = jQuery.now();
       
  6854 
       
  6855 	for ( ; i < timers.length; i++ ) {
       
  6856 		timer = timers[ i ];
       
  6857 		// Checks the timer has not already been removed
       
  6858 		if ( !timer() && timers[ i ] === timer ) {
       
  6859 			timers.splice( i--, 1 );
       
  6860 		}
       
  6861 	}
       
  6862 
       
  6863 	if ( !timers.length ) {
       
  6864 		jQuery.fx.stop();
       
  6865 	}
       
  6866 	fxNow = undefined;
       
  6867 };
       
  6868 
       
  6869 jQuery.fx.timer = function( timer ) {
       
  6870 	jQuery.timers.push( timer );
       
  6871 	if ( timer() ) {
       
  6872 		jQuery.fx.start();
       
  6873 	} else {
       
  6874 		jQuery.timers.pop();
       
  6875 	}
       
  6876 };
       
  6877 
       
  6878 jQuery.fx.interval = 13;
       
  6879 
       
  6880 jQuery.fx.start = function() {
       
  6881 	if ( !timerId ) {
       
  6882 		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
       
  6883 	}
       
  6884 };
       
  6885 
       
  6886 jQuery.fx.stop = function() {
       
  6887 	clearInterval( timerId );
       
  6888 	timerId = null;
       
  6889 };
       
  6890 
       
  6891 jQuery.fx.speeds = {
       
  6892 	slow: 600,
       
  6893 	fast: 200,
       
  6894 	// Default speed
       
  6895 	_default: 400
       
  6896 };
       
  6897 
       
  6898 
       
  6899 // Based off of the plugin by Clint Helfers, with permission.
       
  6900 // http://blindsignals.com/index.php/2009/07/jquery-delay/
       
  6901 jQuery.fn.delay = function( time, type ) {
       
  6902 	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
       
  6903 	type = type || "fx";
       
  6904 
       
  6905 	return this.queue( type, function( next, hooks ) {
       
  6906 		var timeout = setTimeout( next, time );
       
  6907 		hooks.stop = function() {
       
  6908 			clearTimeout( timeout );
       
  6909 		};
       
  6910 	});
       
  6911 };
       
  6912 
       
  6913 
       
  6914 (function() {
       
  6915 	var input = document.createElement( "input" ),
       
  6916 		select = document.createElement( "select" ),
       
  6917 		opt = select.appendChild( document.createElement( "option" ) );
       
  6918 
       
  6919 	input.type = "checkbox";
       
  6920 
       
  6921 	// Support: iOS<=5.1, Android<=4.2+
       
  6922 	// Default value for a checkbox should be "on"
       
  6923 	support.checkOn = input.value !== "";
       
  6924 
       
  6925 	// Support: IE<=11+
       
  6926 	// Must access selectedIndex to make default options select
       
  6927 	support.optSelected = opt.selected;
       
  6928 
       
  6929 	// Support: Android<=2.3
       
  6930 	// Options inside disabled selects are incorrectly marked as disabled
       
  6931 	select.disabled = true;
       
  6932 	support.optDisabled = !opt.disabled;
       
  6933 
       
  6934 	// Support: IE<=11+
       
  6935 	// An input loses its value after becoming a radio
       
  6936 	input = document.createElement( "input" );
       
  6937 	input.value = "t";
       
  6938 	input.type = "radio";
       
  6939 	support.radioValue = input.value === "t";
       
  6940 })();
       
  6941 
       
  6942 
  3798 var nodeHook, boolHook,
  6943 var nodeHook, boolHook,
  3799 	rclass = /[\t\r\n\f]/g,
  6944 	attrHandle = jQuery.expr.attrHandle;
  3800 	rreturn = /\r/g,
       
  3801 	rfocusable = /^(?:input|select|textarea|button)$/i;
       
  3802 
  6945 
  3803 jQuery.fn.extend({
  6946 jQuery.fn.extend({
  3804 	attr: function( name, value ) {
  6947 	attr: function( name, value ) {
  3805 		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
  6948 		return access( this, jQuery.attr, name, value, arguments.length > 1 );
  3806 	},
  6949 	},
  3807 
  6950 
  3808 	removeAttr: function( name ) {
  6951 	removeAttr: function( name ) {
  3809 		return this.each(function() {
  6952 		return this.each(function() {
  3810 			jQuery.removeAttr( this, name );
  6953 			jQuery.removeAttr( this, name );
  3811 		});
  6954 		});
  3812 	},
       
  3813 
       
  3814 	prop: function( name, value ) {
       
  3815 		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
       
  3816 	},
       
  3817 
       
  3818 	removeProp: function( name ) {
       
  3819 		return this.each(function() {
       
  3820 			delete this[ jQuery.propFix[ name ] || name ];
       
  3821 		});
       
  3822 	},
       
  3823 
       
  3824 	addClass: function( value ) {
       
  3825 		var classes, elem, cur, clazz, j,
       
  3826 			i = 0,
       
  3827 			len = this.length,
       
  3828 			proceed = typeof value === "string" && value;
       
  3829 
       
  3830 		if ( jQuery.isFunction( value ) ) {
       
  3831 			return this.each(function( j ) {
       
  3832 				jQuery( this ).addClass( value.call( this, j, this.className ) );
       
  3833 			});
       
  3834 		}
       
  3835 
       
  3836 		if ( proceed ) {
       
  3837 			// The disjunction here is for better compressibility (see removeClass)
       
  3838 			classes = ( value || "" ).match( core_rnotwhite ) || [];
       
  3839 
       
  3840 			for ( ; i < len; i++ ) {
       
  3841 				elem = this[ i ];
       
  3842 				cur = elem.nodeType === 1 && ( elem.className ?
       
  3843 					( " " + elem.className + " " ).replace( rclass, " " ) :
       
  3844 					" "
       
  3845 				);
       
  3846 
       
  3847 				if ( cur ) {
       
  3848 					j = 0;
       
  3849 					while ( (clazz = classes[j++]) ) {
       
  3850 						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
       
  3851 							cur += clazz + " ";
       
  3852 						}
       
  3853 					}
       
  3854 					elem.className = jQuery.trim( cur );
       
  3855 
       
  3856 				}
       
  3857 			}
       
  3858 		}
       
  3859 
       
  3860 		return this;
       
  3861 	},
       
  3862 
       
  3863 	removeClass: function( value ) {
       
  3864 		var classes, elem, cur, clazz, j,
       
  3865 			i = 0,
       
  3866 			len = this.length,
       
  3867 			proceed = arguments.length === 0 || typeof value === "string" && value;
       
  3868 
       
  3869 		if ( jQuery.isFunction( value ) ) {
       
  3870 			return this.each(function( j ) {
       
  3871 				jQuery( this ).removeClass( value.call( this, j, this.className ) );
       
  3872 			});
       
  3873 		}
       
  3874 		if ( proceed ) {
       
  3875 			classes = ( value || "" ).match( core_rnotwhite ) || [];
       
  3876 
       
  3877 			for ( ; i < len; i++ ) {
       
  3878 				elem = this[ i ];
       
  3879 				// This expression is here for better compressibility (see addClass)
       
  3880 				cur = elem.nodeType === 1 && ( elem.className ?
       
  3881 					( " " + elem.className + " " ).replace( rclass, " " ) :
       
  3882 					""
       
  3883 				);
       
  3884 
       
  3885 				if ( cur ) {
       
  3886 					j = 0;
       
  3887 					while ( (clazz = classes[j++]) ) {
       
  3888 						// Remove *all* instances
       
  3889 						while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
       
  3890 							cur = cur.replace( " " + clazz + " ", " " );
       
  3891 						}
       
  3892 					}
       
  3893 					elem.className = value ? jQuery.trim( cur ) : "";
       
  3894 				}
       
  3895 			}
       
  3896 		}
       
  3897 
       
  3898 		return this;
       
  3899 	},
       
  3900 
       
  3901 	toggleClass: function( value, stateVal ) {
       
  3902 		var type = typeof value;
       
  3903 
       
  3904 		if ( typeof stateVal === "boolean" && type === "string" ) {
       
  3905 			return stateVal ? this.addClass( value ) : this.removeClass( value );
       
  3906 		}
       
  3907 
       
  3908 		if ( jQuery.isFunction( value ) ) {
       
  3909 			return this.each(function( i ) {
       
  3910 				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
       
  3911 			});
       
  3912 		}
       
  3913 
       
  3914 		return this.each(function() {
       
  3915 			if ( type === "string" ) {
       
  3916 				// toggle individual class names
       
  3917 				var className,
       
  3918 					i = 0,
       
  3919 					self = jQuery( this ),
       
  3920 					classNames = value.match( core_rnotwhite ) || [];
       
  3921 
       
  3922 				while ( (className = classNames[ i++ ]) ) {
       
  3923 					// check each className given, space separated list
       
  3924 					if ( self.hasClass( className ) ) {
       
  3925 						self.removeClass( className );
       
  3926 					} else {
       
  3927 						self.addClass( className );
       
  3928 					}
       
  3929 				}
       
  3930 
       
  3931 			// Toggle whole class name
       
  3932 			} else if ( type === core_strundefined || type === "boolean" ) {
       
  3933 				if ( this.className ) {
       
  3934 					// store className if set
       
  3935 					data_priv.set( this, "__className__", this.className );
       
  3936 				}
       
  3937 
       
  3938 				// If the element has a class name or if we're passed "false",
       
  3939 				// then remove the whole classname (if there was one, the above saved it).
       
  3940 				// Otherwise bring back whatever was previously saved (if anything),
       
  3941 				// falling back to the empty string if nothing was stored.
       
  3942 				this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
       
  3943 			}
       
  3944 		});
       
  3945 	},
       
  3946 
       
  3947 	hasClass: function( selector ) {
       
  3948 		var className = " " + selector + " ",
       
  3949 			i = 0,
       
  3950 			l = this.length;
       
  3951 		for ( ; i < l; i++ ) {
       
  3952 			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
       
  3953 				return true;
       
  3954 			}
       
  3955 		}
       
  3956 
       
  3957 		return false;
       
  3958 	},
       
  3959 
       
  3960 	val: function( value ) {
       
  3961 		var hooks, ret, isFunction,
       
  3962 			elem = this[0];
       
  3963 
       
  3964 		if ( !arguments.length ) {
       
  3965 			if ( elem ) {
       
  3966 				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
       
  3967 
       
  3968 				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
       
  3969 					return ret;
       
  3970 				}
       
  3971 
       
  3972 				ret = elem.value;
       
  3973 
       
  3974 				return typeof ret === "string" ?
       
  3975 					// handle most common string cases
       
  3976 					ret.replace(rreturn, "") :
       
  3977 					// handle cases where value is null/undef or number
       
  3978 					ret == null ? "" : ret;
       
  3979 			}
       
  3980 
       
  3981 			return;
       
  3982 		}
       
  3983 
       
  3984 		isFunction = jQuery.isFunction( value );
       
  3985 
       
  3986 		return this.each(function( i ) {
       
  3987 			var val;
       
  3988 
       
  3989 			if ( this.nodeType !== 1 ) {
       
  3990 				return;
       
  3991 			}
       
  3992 
       
  3993 			if ( isFunction ) {
       
  3994 				val = value.call( this, i, jQuery( this ).val() );
       
  3995 			} else {
       
  3996 				val = value;
       
  3997 			}
       
  3998 
       
  3999 			// Treat null/undefined as ""; convert numbers to string
       
  4000 			if ( val == null ) {
       
  4001 				val = "";
       
  4002 			} else if ( typeof val === "number" ) {
       
  4003 				val += "";
       
  4004 			} else if ( jQuery.isArray( val ) ) {
       
  4005 				val = jQuery.map(val, function ( value ) {
       
  4006 					return value == null ? "" : value + "";
       
  4007 				});
       
  4008 			}
       
  4009 
       
  4010 			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
       
  4011 
       
  4012 			// If set returns undefined, fall back to normal setting
       
  4013 			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
       
  4014 				this.value = val;
       
  4015 			}
       
  4016 		});
       
  4017 	}
  6955 	}
  4018 });
  6956 });
  4019 
  6957 
  4020 jQuery.extend({
  6958 jQuery.extend({
  4021 	valHooks: {
       
  4022 		option: {
       
  4023 			get: function( elem ) {
       
  4024 				// attributes.value is undefined in Blackberry 4.7 but
       
  4025 				// uses .value. See #6932
       
  4026 				var val = elem.attributes.value;
       
  4027 				return !val || val.specified ? elem.value : elem.text;
       
  4028 			}
       
  4029 		},
       
  4030 		select: {
       
  4031 			get: function( elem ) {
       
  4032 				var value, option,
       
  4033 					options = elem.options,
       
  4034 					index = elem.selectedIndex,
       
  4035 					one = elem.type === "select-one" || index < 0,
       
  4036 					values = one ? null : [],
       
  4037 					max = one ? index + 1 : options.length,
       
  4038 					i = index < 0 ?
       
  4039 						max :
       
  4040 						one ? index : 0;
       
  4041 
       
  4042 				// Loop through all the selected options
       
  4043 				for ( ; i < max; i++ ) {
       
  4044 					option = options[ i ];
       
  4045 
       
  4046 					// IE6-9 doesn't update selected after form reset (#2551)
       
  4047 					if ( ( option.selected || i === index ) &&
       
  4048 							// Don't return options that are disabled or in a disabled optgroup
       
  4049 							( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
       
  4050 							( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
       
  4051 
       
  4052 						// Get the specific value for the option
       
  4053 						value = jQuery( option ).val();
       
  4054 
       
  4055 						// We don't need an array for one selects
       
  4056 						if ( one ) {
       
  4057 							return value;
       
  4058 						}
       
  4059 
       
  4060 						// Multi-Selects return an array
       
  4061 						values.push( value );
       
  4062 					}
       
  4063 				}
       
  4064 
       
  4065 				return values;
       
  4066 			},
       
  4067 
       
  4068 			set: function( elem, value ) {
       
  4069 				var optionSet, option,
       
  4070 					options = elem.options,
       
  4071 					values = jQuery.makeArray( value ),
       
  4072 					i = options.length;
       
  4073 
       
  4074 				while ( i-- ) {
       
  4075 					option = options[ i ];
       
  4076 					if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
       
  4077 						optionSet = true;
       
  4078 					}
       
  4079 				}
       
  4080 
       
  4081 				// force browsers to behave consistently when non-matching value is set
       
  4082 				if ( !optionSet ) {
       
  4083 					elem.selectedIndex = -1;
       
  4084 				}
       
  4085 				return values;
       
  4086 			}
       
  4087 		}
       
  4088 	},
       
  4089 
       
  4090 	attr: function( elem, name, value ) {
  6959 	attr: function( elem, name, value ) {
  4091 		var hooks, ret,
  6960 		var hooks, ret,
  4092 			nType = elem.nodeType;
  6961 			nType = elem.nodeType;
  4093 
  6962 
  4094 		// don't get/set attributes on text, comment and attribute nodes
  6963 		// don't get/set attributes on text, comment and attribute nodes
  4095 		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
  6964 		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
  4096 			return;
  6965 			return;
  4097 		}
  6966 		}
  4098 
  6967 
  4099 		// Fallback to prop when attributes are not supported
  6968 		// Fallback to prop when attributes are not supported
  4100 		if ( typeof elem.getAttribute === core_strundefined ) {
  6969 		if ( typeof elem.getAttribute === strundefined ) {
  4101 			return jQuery.prop( elem, name, value );
  6970 			return jQuery.prop( elem, name, value );
  4102 		}
  6971 		}
  4103 
  6972 
  4104 		// All attributes are lowercase
  6973 		// All attributes are lowercase
  4105 		// Grab necessary hook if one is defined
  6974 		// Grab necessary hook if one is defined
  4136 	},
  7005 	},
  4137 
  7006 
  4138 	removeAttr: function( elem, value ) {
  7007 	removeAttr: function( elem, value ) {
  4139 		var name, propName,
  7008 		var name, propName,
  4140 			i = 0,
  7009 			i = 0,
  4141 			attrNames = value && value.match( core_rnotwhite );
  7010 			attrNames = value && value.match( rnotwhite );
  4142 
  7011 
  4143 		if ( attrNames && elem.nodeType === 1 ) {
  7012 		if ( attrNames && elem.nodeType === 1 ) {
  4144 			while ( (name = attrNames[i++]) ) {
  7013 			while ( (name = attrNames[i++]) ) {
  4145 				propName = jQuery.propFix[ name ] || name;
  7014 				propName = jQuery.propFix[ name ] || name;
  4146 
  7015 
  4156 	},
  7025 	},
  4157 
  7026 
  4158 	attrHooks: {
  7027 	attrHooks: {
  4159 		type: {
  7028 		type: {
  4160 			set: function( elem, value ) {
  7029 			set: function( elem, value ) {
  4161 				if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
  7030 				if ( !support.radioValue && value === "radio" &&
  4162 					// Setting the type on a radio button after the value resets the value in IE6-9
  7031 					jQuery.nodeName( elem, "input" ) ) {
  4163 					// Reset value to default in case type is set after value during creation
       
  4164 					var val = elem.value;
  7032 					var val = elem.value;
  4165 					elem.setAttribute( "type", value );
  7033 					elem.setAttribute( "type", value );
  4166 					if ( val ) {
  7034 					if ( val ) {
  4167 						elem.value = val;
  7035 						elem.value = val;
  4168 					}
  7036 					}
  4169 					return value;
  7037 					return value;
  4170 				}
  7038 				}
  4171 			}
       
  4172 		}
       
  4173 	},
       
  4174 
       
  4175 	propFix: {
       
  4176 		"for": "htmlFor",
       
  4177 		"class": "className"
       
  4178 	},
       
  4179 
       
  4180 	prop: function( elem, name, value ) {
       
  4181 		var ret, hooks, notxml,
       
  4182 			nType = elem.nodeType;
       
  4183 
       
  4184 		// don't get/set properties on text, comment and attribute nodes
       
  4185 		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
       
  4186 			return;
       
  4187 		}
       
  4188 
       
  4189 		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
       
  4190 
       
  4191 		if ( notxml ) {
       
  4192 			// Fix name and attach hooks
       
  4193 			name = jQuery.propFix[ name ] || name;
       
  4194 			hooks = jQuery.propHooks[ name ];
       
  4195 		}
       
  4196 
       
  4197 		if ( value !== undefined ) {
       
  4198 			return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
       
  4199 				ret :
       
  4200 				( elem[ name ] = value );
       
  4201 
       
  4202 		} else {
       
  4203 			return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
       
  4204 				ret :
       
  4205 				elem[ name ];
       
  4206 		}
       
  4207 	},
       
  4208 
       
  4209 	propHooks: {
       
  4210 		tabIndex: {
       
  4211 			get: function( elem ) {
       
  4212 				return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
       
  4213 					elem.tabIndex :
       
  4214 					-1;
       
  4215 			}
  7039 			}
  4216 		}
  7040 		}
  4217 	}
  7041 	}
  4218 });
  7042 });
  4219 
  7043 
  4228 		}
  7052 		}
  4229 		return name;
  7053 		return name;
  4230 	}
  7054 	}
  4231 };
  7055 };
  4232 jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
  7056 jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
  4233 	var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;
  7057 	var getter = attrHandle[ name ] || jQuery.find.attr;
  4234 
  7058 
  4235 	jQuery.expr.attrHandle[ name ] = function( elem, name, isXML ) {
  7059 	attrHandle[ name ] = function( elem, name, isXML ) {
  4236 		var fn = jQuery.expr.attrHandle[ name ],
  7060 		var ret, handle;
  4237 			ret = isXML ?
  7061 		if ( !isXML ) {
  4238 				undefined :
  7062 			// Avoid an infinite loop by temporarily removing this function from the getter
  4239 				/* jshint eqeqeq: false */
  7063 			handle = attrHandle[ name ];
  4240 				// Temporarily disable this handler to check existence
  7064 			attrHandle[ name ] = ret;
  4241 				(jQuery.expr.attrHandle[ name ] = undefined) !=
  7065 			ret = getter( elem, name, isXML ) != null ?
  4242 					getter( elem, name, isXML ) ?
  7066 				name.toLowerCase() :
  4243 
  7067 				null;
  4244 					name.toLowerCase() :
  7068 			attrHandle[ name ] = handle;
  4245 					null;
  7069 		}
  4246 
       
  4247 		// Restore handler
       
  4248 		jQuery.expr.attrHandle[ name ] = fn;
       
  4249 
       
  4250 		return ret;
  7070 		return ret;
  4251 	};
  7071 	};
  4252 });
  7072 });
  4253 
  7073 
  4254 // Support: IE9+
  7074 
  4255 // Selectedness for an option in an optgroup can be inaccurate
  7075 
  4256 if ( !jQuery.support.optSelected ) {
  7076 
       
  7077 var rfocusable = /^(?:input|select|textarea|button)$/i;
       
  7078 
       
  7079 jQuery.fn.extend({
       
  7080 	prop: function( name, value ) {
       
  7081 		return access( this, jQuery.prop, name, value, arguments.length > 1 );
       
  7082 	},
       
  7083 
       
  7084 	removeProp: function( name ) {
       
  7085 		return this.each(function() {
       
  7086 			delete this[ jQuery.propFix[ name ] || name ];
       
  7087 		});
       
  7088 	}
       
  7089 });
       
  7090 
       
  7091 jQuery.extend({
       
  7092 	propFix: {
       
  7093 		"for": "htmlFor",
       
  7094 		"class": "className"
       
  7095 	},
       
  7096 
       
  7097 	prop: function( elem, name, value ) {
       
  7098 		var ret, hooks, notxml,
       
  7099 			nType = elem.nodeType;
       
  7100 
       
  7101 		// Don't get/set properties on text, comment and attribute nodes
       
  7102 		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
       
  7103 			return;
       
  7104 		}
       
  7105 
       
  7106 		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
       
  7107 
       
  7108 		if ( notxml ) {
       
  7109 			// Fix name and attach hooks
       
  7110 			name = jQuery.propFix[ name ] || name;
       
  7111 			hooks = jQuery.propHooks[ name ];
       
  7112 		}
       
  7113 
       
  7114 		if ( value !== undefined ) {
       
  7115 			return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
       
  7116 				ret :
       
  7117 				( elem[ name ] = value );
       
  7118 
       
  7119 		} else {
       
  7120 			return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
       
  7121 				ret :
       
  7122 				elem[ name ];
       
  7123 		}
       
  7124 	},
       
  7125 
       
  7126 	propHooks: {
       
  7127 		tabIndex: {
       
  7128 			get: function( elem ) {
       
  7129 				return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
       
  7130 					elem.tabIndex :
       
  7131 					-1;
       
  7132 			}
       
  7133 		}
       
  7134 	}
       
  7135 });
       
  7136 
       
  7137 if ( !support.optSelected ) {
  4257 	jQuery.propHooks.selected = {
  7138 	jQuery.propHooks.selected = {
  4258 		get: function( elem ) {
  7139 		get: function( elem ) {
  4259 			var parent = elem.parentNode;
  7140 			var parent = elem.parentNode;
  4260 			if ( parent && parent.parentNode ) {
  7141 			if ( parent && parent.parentNode ) {
  4261 				parent.parentNode.selectedIndex;
  7142 				parent.parentNode.selectedIndex;
  4278 	"contentEditable"
  7159 	"contentEditable"
  4279 ], function() {
  7160 ], function() {
  4280 	jQuery.propFix[ this.toLowerCase() ] = this;
  7161 	jQuery.propFix[ this.toLowerCase() ] = this;
  4281 });
  7162 });
  4282 
  7163 
       
  7164 
       
  7165 
       
  7166 
       
  7167 var rclass = /[\t\r\n\f]/g;
       
  7168 
       
  7169 jQuery.fn.extend({
       
  7170 	addClass: function( value ) {
       
  7171 		var classes, elem, cur, clazz, j, finalValue,
       
  7172 			proceed = typeof value === "string" && value,
       
  7173 			i = 0,
       
  7174 			len = this.length;
       
  7175 
       
  7176 		if ( jQuery.isFunction( value ) ) {
       
  7177 			return this.each(function( j ) {
       
  7178 				jQuery( this ).addClass( value.call( this, j, this.className ) );
       
  7179 			});
       
  7180 		}
       
  7181 
       
  7182 		if ( proceed ) {
       
  7183 			// The disjunction here is for better compressibility (see removeClass)
       
  7184 			classes = ( value || "" ).match( rnotwhite ) || [];
       
  7185 
       
  7186 			for ( ; i < len; i++ ) {
       
  7187 				elem = this[ i ];
       
  7188 				cur = elem.nodeType === 1 && ( elem.className ?
       
  7189 					( " " + elem.className + " " ).replace( rclass, " " ) :
       
  7190 					" "
       
  7191 				);
       
  7192 
       
  7193 				if ( cur ) {
       
  7194 					j = 0;
       
  7195 					while ( (clazz = classes[j++]) ) {
       
  7196 						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
       
  7197 							cur += clazz + " ";
       
  7198 						}
       
  7199 					}
       
  7200 
       
  7201 					// only assign if different to avoid unneeded rendering.
       
  7202 					finalValue = jQuery.trim( cur );
       
  7203 					if ( elem.className !== finalValue ) {
       
  7204 						elem.className = finalValue;
       
  7205 					}
       
  7206 				}
       
  7207 			}
       
  7208 		}
       
  7209 
       
  7210 		return this;
       
  7211 	},
       
  7212 
       
  7213 	removeClass: function( value ) {
       
  7214 		var classes, elem, cur, clazz, j, finalValue,
       
  7215 			proceed = arguments.length === 0 || typeof value === "string" && value,
       
  7216 			i = 0,
       
  7217 			len = this.length;
       
  7218 
       
  7219 		if ( jQuery.isFunction( value ) ) {
       
  7220 			return this.each(function( j ) {
       
  7221 				jQuery( this ).removeClass( value.call( this, j, this.className ) );
       
  7222 			});
       
  7223 		}
       
  7224 		if ( proceed ) {
       
  7225 			classes = ( value || "" ).match( rnotwhite ) || [];
       
  7226 
       
  7227 			for ( ; i < len; i++ ) {
       
  7228 				elem = this[ i ];
       
  7229 				// This expression is here for better compressibility (see addClass)
       
  7230 				cur = elem.nodeType === 1 && ( elem.className ?
       
  7231 					( " " + elem.className + " " ).replace( rclass, " " ) :
       
  7232 					""
       
  7233 				);
       
  7234 
       
  7235 				if ( cur ) {
       
  7236 					j = 0;
       
  7237 					while ( (clazz = classes[j++]) ) {
       
  7238 						// Remove *all* instances
       
  7239 						while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
       
  7240 							cur = cur.replace( " " + clazz + " ", " " );
       
  7241 						}
       
  7242 					}
       
  7243 
       
  7244 					// Only assign if different to avoid unneeded rendering.
       
  7245 					finalValue = value ? jQuery.trim( cur ) : "";
       
  7246 					if ( elem.className !== finalValue ) {
       
  7247 						elem.className = finalValue;
       
  7248 					}
       
  7249 				}
       
  7250 			}
       
  7251 		}
       
  7252 
       
  7253 		return this;
       
  7254 	},
       
  7255 
       
  7256 	toggleClass: function( value, stateVal ) {
       
  7257 		var type = typeof value;
       
  7258 
       
  7259 		if ( typeof stateVal === "boolean" && type === "string" ) {
       
  7260 			return stateVal ? this.addClass( value ) : this.removeClass( value );
       
  7261 		}
       
  7262 
       
  7263 		if ( jQuery.isFunction( value ) ) {
       
  7264 			return this.each(function( i ) {
       
  7265 				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
       
  7266 			});
       
  7267 		}
       
  7268 
       
  7269 		return this.each(function() {
       
  7270 			if ( type === "string" ) {
       
  7271 				// Toggle individual class names
       
  7272 				var className,
       
  7273 					i = 0,
       
  7274 					self = jQuery( this ),
       
  7275 					classNames = value.match( rnotwhite ) || [];
       
  7276 
       
  7277 				while ( (className = classNames[ i++ ]) ) {
       
  7278 					// Check each className given, space separated list
       
  7279 					if ( self.hasClass( className ) ) {
       
  7280 						self.removeClass( className );
       
  7281 					} else {
       
  7282 						self.addClass( className );
       
  7283 					}
       
  7284 				}
       
  7285 
       
  7286 			// Toggle whole class name
       
  7287 			} else if ( type === strundefined || type === "boolean" ) {
       
  7288 				if ( this.className ) {
       
  7289 					// store className if set
       
  7290 					data_priv.set( this, "__className__", this.className );
       
  7291 				}
       
  7292 
       
  7293 				// If the element has a class name or if we're passed `false`,
       
  7294 				// then remove the whole classname (if there was one, the above saved it).
       
  7295 				// Otherwise bring back whatever was previously saved (if anything),
       
  7296 				// falling back to the empty string if nothing was stored.
       
  7297 				this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
       
  7298 			}
       
  7299 		});
       
  7300 	},
       
  7301 
       
  7302 	hasClass: function( selector ) {
       
  7303 		var className = " " + selector + " ",
       
  7304 			i = 0,
       
  7305 			l = this.length;
       
  7306 		for ( ; i < l; i++ ) {
       
  7307 			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
       
  7308 				return true;
       
  7309 			}
       
  7310 		}
       
  7311 
       
  7312 		return false;
       
  7313 	}
       
  7314 });
       
  7315 
       
  7316 
       
  7317 
       
  7318 
       
  7319 var rreturn = /\r/g;
       
  7320 
       
  7321 jQuery.fn.extend({
       
  7322 	val: function( value ) {
       
  7323 		var hooks, ret, isFunction,
       
  7324 			elem = this[0];
       
  7325 
       
  7326 		if ( !arguments.length ) {
       
  7327 			if ( elem ) {
       
  7328 				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
       
  7329 
       
  7330 				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
       
  7331 					return ret;
       
  7332 				}
       
  7333 
       
  7334 				ret = elem.value;
       
  7335 
       
  7336 				return typeof ret === "string" ?
       
  7337 					// Handle most common string cases
       
  7338 					ret.replace(rreturn, "") :
       
  7339 					// Handle cases where value is null/undef or number
       
  7340 					ret == null ? "" : ret;
       
  7341 			}
       
  7342 
       
  7343 			return;
       
  7344 		}
       
  7345 
       
  7346 		isFunction = jQuery.isFunction( value );
       
  7347 
       
  7348 		return this.each(function( i ) {
       
  7349 			var val;
       
  7350 
       
  7351 			if ( this.nodeType !== 1 ) {
       
  7352 				return;
       
  7353 			}
       
  7354 
       
  7355 			if ( isFunction ) {
       
  7356 				val = value.call( this, i, jQuery( this ).val() );
       
  7357 			} else {
       
  7358 				val = value;
       
  7359 			}
       
  7360 
       
  7361 			// Treat null/undefined as ""; convert numbers to string
       
  7362 			if ( val == null ) {
       
  7363 				val = "";
       
  7364 
       
  7365 			} else if ( typeof val === "number" ) {
       
  7366 				val += "";
       
  7367 
       
  7368 			} else if ( jQuery.isArray( val ) ) {
       
  7369 				val = jQuery.map( val, function( value ) {
       
  7370 					return value == null ? "" : value + "";
       
  7371 				});
       
  7372 			}
       
  7373 
       
  7374 			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
       
  7375 
       
  7376 			// If set returns undefined, fall back to normal setting
       
  7377 			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
       
  7378 				this.value = val;
       
  7379 			}
       
  7380 		});
       
  7381 	}
       
  7382 });
       
  7383 
       
  7384 jQuery.extend({
       
  7385 	valHooks: {
       
  7386 		option: {
       
  7387 			get: function( elem ) {
       
  7388 				var val = jQuery.find.attr( elem, "value" );
       
  7389 				return val != null ?
       
  7390 					val :
       
  7391 					// Support: IE10-11+
       
  7392 					// option.text throws exceptions (#14686, #14858)
       
  7393 					jQuery.trim( jQuery.text( elem ) );
       
  7394 			}
       
  7395 		},
       
  7396 		select: {
       
  7397 			get: function( elem ) {
       
  7398 				var value, option,
       
  7399 					options = elem.options,
       
  7400 					index = elem.selectedIndex,
       
  7401 					one = elem.type === "select-one" || index < 0,
       
  7402 					values = one ? null : [],
       
  7403 					max = one ? index + 1 : options.length,
       
  7404 					i = index < 0 ?
       
  7405 						max :
       
  7406 						one ? index : 0;
       
  7407 
       
  7408 				// Loop through all the selected options
       
  7409 				for ( ; i < max; i++ ) {
       
  7410 					option = options[ i ];
       
  7411 
       
  7412 					// IE6-9 doesn't update selected after form reset (#2551)
       
  7413 					if ( ( option.selected || i === index ) &&
       
  7414 							// Don't return options that are disabled or in a disabled optgroup
       
  7415 							( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) &&
       
  7416 							( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
       
  7417 
       
  7418 						// Get the specific value for the option
       
  7419 						value = jQuery( option ).val();
       
  7420 
       
  7421 						// We don't need an array for one selects
       
  7422 						if ( one ) {
       
  7423 							return value;
       
  7424 						}
       
  7425 
       
  7426 						// Multi-Selects return an array
       
  7427 						values.push( value );
       
  7428 					}
       
  7429 				}
       
  7430 
       
  7431 				return values;
       
  7432 			},
       
  7433 
       
  7434 			set: function( elem, value ) {
       
  7435 				var optionSet, option,
       
  7436 					options = elem.options,
       
  7437 					values = jQuery.makeArray( value ),
       
  7438 					i = options.length;
       
  7439 
       
  7440 				while ( i-- ) {
       
  7441 					option = options[ i ];
       
  7442 					if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {
       
  7443 						optionSet = true;
       
  7444 					}
       
  7445 				}
       
  7446 
       
  7447 				// Force browsers to behave consistently when non-matching value is set
       
  7448 				if ( !optionSet ) {
       
  7449 					elem.selectedIndex = -1;
       
  7450 				}
       
  7451 				return values;
       
  7452 			}
       
  7453 		}
       
  7454 	}
       
  7455 });
       
  7456 
  4283 // Radios and checkboxes getter/setter
  7457 // Radios and checkboxes getter/setter
  4284 jQuery.each([ "radio", "checkbox" ], function() {
  7458 jQuery.each([ "radio", "checkbox" ], function() {
  4285 	jQuery.valHooks[ this ] = {
  7459 	jQuery.valHooks[ this ] = {
  4286 		set: function( elem, value ) {
  7460 		set: function( elem, value ) {
  4287 			if ( jQuery.isArray( value ) ) {
  7461 			if ( jQuery.isArray( value ) ) {
  4288 				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
  7462 				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
  4289 			}
  7463 			}
  4290 		}
  7464 		}
  4291 	};
  7465 	};
  4292 	if ( !jQuery.support.checkOn ) {
  7466 	if ( !support.checkOn ) {
  4293 		jQuery.valHooks[ this ].get = function( elem ) {
  7467 		jQuery.valHooks[ this ].get = function( elem ) {
  4294 			// Support: Webkit
       
  4295 			// "" is returned instead of "on" if a value isn't specified
       
  4296 			return elem.getAttribute("value") === null ? "on" : elem.value;
  7468 			return elem.getAttribute("value") === null ? "on" : elem.value;
  4297 		};
  7469 		};
  4298 	}
  7470 	}
  4299 });
  7471 });
  4300 var rkeyEvent = /^key/,
  7472 
  4301 	rmouseEvent = /^(?:mouse|contextmenu)|click/,
  7473 
  4302 	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
  7474 
  4303 	rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
  7475 
  4304 
  7476 // Return jQuery for attributes-only inclusion
  4305 function returnTrue() {
  7477 
  4306 	return true;
  7478 
  4307 }
       
  4308 
       
  4309 function returnFalse() {
       
  4310 	return false;
       
  4311 }
       
  4312 
       
  4313 function safeActiveElement() {
       
  4314 	try {
       
  4315 		return document.activeElement;
       
  4316 	} catch ( err ) { }
       
  4317 }
       
  4318 
       
  4319 /*
       
  4320  * Helper functions for managing events -- not part of the public interface.
       
  4321  * Props to Dean Edwards' addEvent library for many of the ideas.
       
  4322  */
       
  4323 jQuery.event = {
       
  4324 
       
  4325 	global: {},
       
  4326 
       
  4327 	add: function( elem, types, handler, data, selector ) {
       
  4328 
       
  4329 		var handleObjIn, eventHandle, tmp,
       
  4330 			events, t, handleObj,
       
  4331 			special, handlers, type, namespaces, origType,
       
  4332 			elemData = data_priv.get( elem );
       
  4333 
       
  4334 		// Don't attach events to noData or text/comment nodes (but allow plain objects)
       
  4335 		if ( !elemData ) {
       
  4336 			return;
       
  4337 		}
       
  4338 
       
  4339 		// Caller can pass in an object of custom data in lieu of the handler
       
  4340 		if ( handler.handler ) {
       
  4341 			handleObjIn = handler;
       
  4342 			handler = handleObjIn.handler;
       
  4343 			selector = handleObjIn.selector;
       
  4344 		}
       
  4345 
       
  4346 		// Make sure that the handler has a unique ID, used to find/remove it later
       
  4347 		if ( !handler.guid ) {
       
  4348 			handler.guid = jQuery.guid++;
       
  4349 		}
       
  4350 
       
  4351 		// Init the element's event structure and main handler, if this is the first
       
  4352 		if ( !(events = elemData.events) ) {
       
  4353 			events = elemData.events = {};
       
  4354 		}
       
  4355 		if ( !(eventHandle = elemData.handle) ) {
       
  4356 			eventHandle = elemData.handle = function( e ) {
       
  4357 				// Discard the second event of a jQuery.event.trigger() and
       
  4358 				// when an event is called after a page has unloaded
       
  4359 				return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
       
  4360 					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
       
  4361 					undefined;
       
  4362 			};
       
  4363 			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
       
  4364 			eventHandle.elem = elem;
       
  4365 		}
       
  4366 
       
  4367 		// Handle multiple events separated by a space
       
  4368 		types = ( types || "" ).match( core_rnotwhite ) || [""];
       
  4369 		t = types.length;
       
  4370 		while ( t-- ) {
       
  4371 			tmp = rtypenamespace.exec( types[t] ) || [];
       
  4372 			type = origType = tmp[1];
       
  4373 			namespaces = ( tmp[2] || "" ).split( "." ).sort();
       
  4374 
       
  4375 			// There *must* be a type, no attaching namespace-only handlers
       
  4376 			if ( !type ) {
       
  4377 				continue;
       
  4378 			}
       
  4379 
       
  4380 			// If event changes its type, use the special event handlers for the changed type
       
  4381 			special = jQuery.event.special[ type ] || {};
       
  4382 
       
  4383 			// If selector defined, determine special event api type, otherwise given type
       
  4384 			type = ( selector ? special.delegateType : special.bindType ) || type;
       
  4385 
       
  4386 			// Update special based on newly reset type
       
  4387 			special = jQuery.event.special[ type ] || {};
       
  4388 
       
  4389 			// handleObj is passed to all event handlers
       
  4390 			handleObj = jQuery.extend({
       
  4391 				type: type,
       
  4392 				origType: origType,
       
  4393 				data: data,
       
  4394 				handler: handler,
       
  4395 				guid: handler.guid,
       
  4396 				selector: selector,
       
  4397 				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
       
  4398 				namespace: namespaces.join(".")
       
  4399 			}, handleObjIn );
       
  4400 
       
  4401 			// Init the event handler queue if we're the first
       
  4402 			if ( !(handlers = events[ type ]) ) {
       
  4403 				handlers = events[ type ] = [];
       
  4404 				handlers.delegateCount = 0;
       
  4405 
       
  4406 				// Only use addEventListener if the special events handler returns false
       
  4407 				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
       
  4408 					if ( elem.addEventListener ) {
       
  4409 						elem.addEventListener( type, eventHandle, false );
       
  4410 					}
       
  4411 				}
       
  4412 			}
       
  4413 
       
  4414 			if ( special.add ) {
       
  4415 				special.add.call( elem, handleObj );
       
  4416 
       
  4417 				if ( !handleObj.handler.guid ) {
       
  4418 					handleObj.handler.guid = handler.guid;
       
  4419 				}
       
  4420 			}
       
  4421 
       
  4422 			// Add to the element's handler list, delegates in front
       
  4423 			if ( selector ) {
       
  4424 				handlers.splice( handlers.delegateCount++, 0, handleObj );
       
  4425 			} else {
       
  4426 				handlers.push( handleObj );
       
  4427 			}
       
  4428 
       
  4429 			// Keep track of which events have ever been used, for event optimization
       
  4430 			jQuery.event.global[ type ] = true;
       
  4431 		}
       
  4432 
       
  4433 		// Nullify elem to prevent memory leaks in IE
       
  4434 		elem = null;
       
  4435 	},
       
  4436 
       
  4437 	// Detach an event or set of events from an element
       
  4438 	remove: function( elem, types, handler, selector, mappedTypes ) {
       
  4439 
       
  4440 		var j, origCount, tmp,
       
  4441 			events, t, handleObj,
       
  4442 			special, handlers, type, namespaces, origType,
       
  4443 			elemData = data_priv.hasData( elem ) && data_priv.get( elem );
       
  4444 
       
  4445 		if ( !elemData || !(events = elemData.events) ) {
       
  4446 			return;
       
  4447 		}
       
  4448 
       
  4449 		// Once for each type.namespace in types; type may be omitted
       
  4450 		types = ( types || "" ).match( core_rnotwhite ) || [""];
       
  4451 		t = types.length;
       
  4452 		while ( t-- ) {
       
  4453 			tmp = rtypenamespace.exec( types[t] ) || [];
       
  4454 			type = origType = tmp[1];
       
  4455 			namespaces = ( tmp[2] || "" ).split( "." ).sort();
       
  4456 
       
  4457 			// Unbind all events (on this namespace, if provided) for the element
       
  4458 			if ( !type ) {
       
  4459 				for ( type in events ) {
       
  4460 					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
       
  4461 				}
       
  4462 				continue;
       
  4463 			}
       
  4464 
       
  4465 			special = jQuery.event.special[ type ] || {};
       
  4466 			type = ( selector ? special.delegateType : special.bindType ) || type;
       
  4467 			handlers = events[ type ] || [];
       
  4468 			tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
       
  4469 
       
  4470 			// Remove matching events
       
  4471 			origCount = j = handlers.length;
       
  4472 			while ( j-- ) {
       
  4473 				handleObj = handlers[ j ];
       
  4474 
       
  4475 				if ( ( mappedTypes || origType === handleObj.origType ) &&
       
  4476 					( !handler || handler.guid === handleObj.guid ) &&
       
  4477 					( !tmp || tmp.test( handleObj.namespace ) ) &&
       
  4478 					( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
       
  4479 					handlers.splice( j, 1 );
       
  4480 
       
  4481 					if ( handleObj.selector ) {
       
  4482 						handlers.delegateCount--;
       
  4483 					}
       
  4484 					if ( special.remove ) {
       
  4485 						special.remove.call( elem, handleObj );
       
  4486 					}
       
  4487 				}
       
  4488 			}
       
  4489 
       
  4490 			// Remove generic event handler if we removed something and no more handlers exist
       
  4491 			// (avoids potential for endless recursion during removal of special event handlers)
       
  4492 			if ( origCount && !handlers.length ) {
       
  4493 				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
       
  4494 					jQuery.removeEvent( elem, type, elemData.handle );
       
  4495 				}
       
  4496 
       
  4497 				delete events[ type ];
       
  4498 			}
       
  4499 		}
       
  4500 
       
  4501 		// Remove the expando if it's no longer used
       
  4502 		if ( jQuery.isEmptyObject( events ) ) {
       
  4503 			delete elemData.handle;
       
  4504 			data_priv.remove( elem, "events" );
       
  4505 		}
       
  4506 	},
       
  4507 
       
  4508 	trigger: function( event, data, elem, onlyHandlers ) {
       
  4509 
       
  4510 		var i, cur, tmp, bubbleType, ontype, handle, special,
       
  4511 			eventPath = [ elem || document ],
       
  4512 			type = core_hasOwn.call( event, "type" ) ? event.type : event,
       
  4513 			namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
       
  4514 
       
  4515 		cur = tmp = elem = elem || document;
       
  4516 
       
  4517 		// Don't do events on text and comment nodes
       
  4518 		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
       
  4519 			return;
       
  4520 		}
       
  4521 
       
  4522 		// focus/blur morphs to focusin/out; ensure we're not firing them right now
       
  4523 		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
       
  4524 			return;
       
  4525 		}
       
  4526 
       
  4527 		if ( type.indexOf(".") >= 0 ) {
       
  4528 			// Namespaced trigger; create a regexp to match event type in handle()
       
  4529 			namespaces = type.split(".");
       
  4530 			type = namespaces.shift();
       
  4531 			namespaces.sort();
       
  4532 		}
       
  4533 		ontype = type.indexOf(":") < 0 && "on" + type;
       
  4534 
       
  4535 		// Caller can pass in a jQuery.Event object, Object, or just an event type string
       
  4536 		event = event[ jQuery.expando ] ?
       
  4537 			event :
       
  4538 			new jQuery.Event( type, typeof event === "object" && event );
       
  4539 
       
  4540 		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
       
  4541 		event.isTrigger = onlyHandlers ? 2 : 3;
       
  4542 		event.namespace = namespaces.join(".");
       
  4543 		event.namespace_re = event.namespace ?
       
  4544 			new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
       
  4545 			null;
       
  4546 
       
  4547 		// Clean up the event in case it is being reused
       
  4548 		event.result = undefined;
       
  4549 		if ( !event.target ) {
       
  4550 			event.target = elem;
       
  4551 		}
       
  4552 
       
  4553 		// Clone any incoming data and prepend the event, creating the handler arg list
       
  4554 		data = data == null ?
       
  4555 			[ event ] :
       
  4556 			jQuery.makeArray( data, [ event ] );
       
  4557 
       
  4558 		// Allow special events to draw outside the lines
       
  4559 		special = jQuery.event.special[ type ] || {};
       
  4560 		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
       
  4561 			return;
       
  4562 		}
       
  4563 
       
  4564 		// Determine event propagation path in advance, per W3C events spec (#9951)
       
  4565 		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
       
  4566 		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
       
  4567 
       
  4568 			bubbleType = special.delegateType || type;
       
  4569 			if ( !rfocusMorph.test( bubbleType + type ) ) {
       
  4570 				cur = cur.parentNode;
       
  4571 			}
       
  4572 			for ( ; cur; cur = cur.parentNode ) {
       
  4573 				eventPath.push( cur );
       
  4574 				tmp = cur;
       
  4575 			}
       
  4576 
       
  4577 			// Only add window if we got to document (e.g., not plain obj or detached DOM)
       
  4578 			if ( tmp === (elem.ownerDocument || document) ) {
       
  4579 				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
       
  4580 			}
       
  4581 		}
       
  4582 
       
  4583 		// Fire handlers on the event path
       
  4584 		i = 0;
       
  4585 		while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
       
  4586 
       
  4587 			event.type = i > 1 ?
       
  4588 				bubbleType :
       
  4589 				special.bindType || type;
       
  4590 
       
  4591 			// jQuery handler
       
  4592 			handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
       
  4593 			if ( handle ) {
       
  4594 				handle.apply( cur, data );
       
  4595 			}
       
  4596 
       
  4597 			// Native handler
       
  4598 			handle = ontype && cur[ ontype ];
       
  4599 			if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
       
  4600 				event.preventDefault();
       
  4601 			}
       
  4602 		}
       
  4603 		event.type = type;
       
  4604 
       
  4605 		// If nobody prevented the default action, do it now
       
  4606 		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
       
  4607 
       
  4608 			if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
       
  4609 				jQuery.acceptData( elem ) ) {
       
  4610 
       
  4611 				// Call a native DOM method on the target with the same name name as the event.
       
  4612 				// Don't do default actions on window, that's where global variables be (#6170)
       
  4613 				if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
       
  4614 
       
  4615 					// Don't re-trigger an onFOO event when we call its FOO() method
       
  4616 					tmp = elem[ ontype ];
       
  4617 
       
  4618 					if ( tmp ) {
       
  4619 						elem[ ontype ] = null;
       
  4620 					}
       
  4621 
       
  4622 					// Prevent re-triggering of the same event, since we already bubbled it above
       
  4623 					jQuery.event.triggered = type;
       
  4624 					elem[ type ]();
       
  4625 					jQuery.event.triggered = undefined;
       
  4626 
       
  4627 					if ( tmp ) {
       
  4628 						elem[ ontype ] = tmp;
       
  4629 					}
       
  4630 				}
       
  4631 			}
       
  4632 		}
       
  4633 
       
  4634 		return event.result;
       
  4635 	},
       
  4636 
       
  4637 	dispatch: function( event ) {
       
  4638 
       
  4639 		// Make a writable jQuery.Event from the native event object
       
  4640 		event = jQuery.event.fix( event );
       
  4641 
       
  4642 		var i, j, ret, matched, handleObj,
       
  4643 			handlerQueue = [],
       
  4644 			args = core_slice.call( arguments ),
       
  4645 			handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
       
  4646 			special = jQuery.event.special[ event.type ] || {};
       
  4647 
       
  4648 		// Use the fix-ed jQuery.Event rather than the (read-only) native event
       
  4649 		args[0] = event;
       
  4650 		event.delegateTarget = this;
       
  4651 
       
  4652 		// Call the preDispatch hook for the mapped type, and let it bail if desired
       
  4653 		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
       
  4654 			return;
       
  4655 		}
       
  4656 
       
  4657 		// Determine handlers
       
  4658 		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
       
  4659 
       
  4660 		// Run delegates first; they may want to stop propagation beneath us
       
  4661 		i = 0;
       
  4662 		while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
       
  4663 			event.currentTarget = matched.elem;
       
  4664 
       
  4665 			j = 0;
       
  4666 			while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
       
  4667 
       
  4668 				// Triggered event must either 1) have no namespace, or
       
  4669 				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
       
  4670 				if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
       
  4671 
       
  4672 					event.handleObj = handleObj;
       
  4673 					event.data = handleObj.data;
       
  4674 
       
  4675 					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
       
  4676 							.apply( matched.elem, args );
       
  4677 
       
  4678 					if ( ret !== undefined ) {
       
  4679 						if ( (event.result = ret) === false ) {
       
  4680 							event.preventDefault();
       
  4681 							event.stopPropagation();
       
  4682 						}
       
  4683 					}
       
  4684 				}
       
  4685 			}
       
  4686 		}
       
  4687 
       
  4688 		// Call the postDispatch hook for the mapped type
       
  4689 		if ( special.postDispatch ) {
       
  4690 			special.postDispatch.call( this, event );
       
  4691 		}
       
  4692 
       
  4693 		return event.result;
       
  4694 	},
       
  4695 
       
  4696 	handlers: function( event, handlers ) {
       
  4697 		var i, matches, sel, handleObj,
       
  4698 			handlerQueue = [],
       
  4699 			delegateCount = handlers.delegateCount,
       
  4700 			cur = event.target;
       
  4701 
       
  4702 		// Find delegate handlers
       
  4703 		// Black-hole SVG <use> instance trees (#13180)
       
  4704 		// Avoid non-left-click bubbling in Firefox (#3861)
       
  4705 		if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
       
  4706 
       
  4707 			for ( ; cur !== this; cur = cur.parentNode || this ) {
       
  4708 
       
  4709 				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
       
  4710 				if ( cur.disabled !== true || event.type !== "click" ) {
       
  4711 					matches = [];
       
  4712 					for ( i = 0; i < delegateCount; i++ ) {
       
  4713 						handleObj = handlers[ i ];
       
  4714 
       
  4715 						// Don't conflict with Object.prototype properties (#13203)
       
  4716 						sel = handleObj.selector + " ";
       
  4717 
       
  4718 						if ( matches[ sel ] === undefined ) {
       
  4719 							matches[ sel ] = handleObj.needsContext ?
       
  4720 								jQuery( sel, this ).index( cur ) >= 0 :
       
  4721 								jQuery.find( sel, this, null, [ cur ] ).length;
       
  4722 						}
       
  4723 						if ( matches[ sel ] ) {
       
  4724 							matches.push( handleObj );
       
  4725 						}
       
  4726 					}
       
  4727 					if ( matches.length ) {
       
  4728 						handlerQueue.push({ elem: cur, handlers: matches });
       
  4729 					}
       
  4730 				}
       
  4731 			}
       
  4732 		}
       
  4733 
       
  4734 		// Add the remaining (directly-bound) handlers
       
  4735 		if ( delegateCount < handlers.length ) {
       
  4736 			handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
       
  4737 		}
       
  4738 
       
  4739 		return handlerQueue;
       
  4740 	},
       
  4741 
       
  4742 	// Includes some event props shared by KeyEvent and MouseEvent
       
  4743 	props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
       
  4744 
       
  4745 	fixHooks: {},
       
  4746 
       
  4747 	keyHooks: {
       
  4748 		props: "char charCode key keyCode".split(" "),
       
  4749 		filter: function( event, original ) {
       
  4750 
       
  4751 			// Add which for key events
       
  4752 			if ( event.which == null ) {
       
  4753 				event.which = original.charCode != null ? original.charCode : original.keyCode;
       
  4754 			}
       
  4755 
       
  4756 			return event;
       
  4757 		}
       
  4758 	},
       
  4759 
       
  4760 	mouseHooks: {
       
  4761 		props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
       
  4762 		filter: function( event, original ) {
       
  4763 			var eventDoc, doc, body,
       
  4764 				button = original.button;
       
  4765 
       
  4766 			// Calculate pageX/Y if missing and clientX/Y available
       
  4767 			if ( event.pageX == null && original.clientX != null ) {
       
  4768 				eventDoc = event.target.ownerDocument || document;
       
  4769 				doc = eventDoc.documentElement;
       
  4770 				body = eventDoc.body;
       
  4771 
       
  4772 				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
       
  4773 				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
       
  4774 			}
       
  4775 
       
  4776 			// Add which for click: 1 === left; 2 === middle; 3 === right
       
  4777 			// Note: button is not normalized, so don't use it
       
  4778 			if ( !event.which && button !== undefined ) {
       
  4779 				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
       
  4780 			}
       
  4781 
       
  4782 			return event;
       
  4783 		}
       
  4784 	},
       
  4785 
       
  4786 	fix: function( event ) {
       
  4787 		if ( event[ jQuery.expando ] ) {
       
  4788 			return event;
       
  4789 		}
       
  4790 
       
  4791 		// Create a writable copy of the event object and normalize some properties
       
  4792 		var i, prop, copy,
       
  4793 			type = event.type,
       
  4794 			originalEvent = event,
       
  4795 			fixHook = this.fixHooks[ type ];
       
  4796 
       
  4797 		if ( !fixHook ) {
       
  4798 			this.fixHooks[ type ] = fixHook =
       
  4799 				rmouseEvent.test( type ) ? this.mouseHooks :
       
  4800 				rkeyEvent.test( type ) ? this.keyHooks :
       
  4801 				{};
       
  4802 		}
       
  4803 		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
       
  4804 
       
  4805 		event = new jQuery.Event( originalEvent );
       
  4806 
       
  4807 		i = copy.length;
       
  4808 		while ( i-- ) {
       
  4809 			prop = copy[ i ];
       
  4810 			event[ prop ] = originalEvent[ prop ];
       
  4811 		}
       
  4812 
       
  4813 		// Support: Cordova 2.5 (WebKit) (#13255)
       
  4814 		// All events should have a target; Cordova deviceready doesn't
       
  4815 		if ( !event.target ) {
       
  4816 			event.target = document;
       
  4817 		}
       
  4818 
       
  4819 		// Support: Safari 6.0+, Chrome < 28
       
  4820 		// Target should not be a text node (#504, #13143)
       
  4821 		if ( event.target.nodeType === 3 ) {
       
  4822 			event.target = event.target.parentNode;
       
  4823 		}
       
  4824 
       
  4825 		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
       
  4826 	},
       
  4827 
       
  4828 	special: {
       
  4829 		load: {
       
  4830 			// Prevent triggered image.load events from bubbling to window.load
       
  4831 			noBubble: true
       
  4832 		},
       
  4833 		focus: {
       
  4834 			// Fire native event if possible so blur/focus sequence is correct
       
  4835 			trigger: function() {
       
  4836 				if ( this !== safeActiveElement() && this.focus ) {
       
  4837 					this.focus();
       
  4838 					return false;
       
  4839 				}
       
  4840 			},
       
  4841 			delegateType: "focusin"
       
  4842 		},
       
  4843 		blur: {
       
  4844 			trigger: function() {
       
  4845 				if ( this === safeActiveElement() && this.blur ) {
       
  4846 					this.blur();
       
  4847 					return false;
       
  4848 				}
       
  4849 			},
       
  4850 			delegateType: "focusout"
       
  4851 		},
       
  4852 		click: {
       
  4853 			// For checkbox, fire native event so checked state will be right
       
  4854 			trigger: function() {
       
  4855 				if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
       
  4856 					this.click();
       
  4857 					return false;
       
  4858 				}
       
  4859 			},
       
  4860 
       
  4861 			// For cross-browser consistency, don't fire native .click() on links
       
  4862 			_default: function( event ) {
       
  4863 				return jQuery.nodeName( event.target, "a" );
       
  4864 			}
       
  4865 		},
       
  4866 
       
  4867 		beforeunload: {
       
  4868 			postDispatch: function( event ) {
       
  4869 
       
  4870 				// Support: Firefox 20+
       
  4871 				// Firefox doesn't alert if the returnValue field is not set.
       
  4872 				if ( event.result !== undefined ) {
       
  4873 					event.originalEvent.returnValue = event.result;
       
  4874 				}
       
  4875 			}
       
  4876 		}
       
  4877 	},
       
  4878 
       
  4879 	simulate: function( type, elem, event, bubble ) {
       
  4880 		// Piggyback on a donor event to simulate a different one.
       
  4881 		// Fake originalEvent to avoid donor's stopPropagation, but if the
       
  4882 		// simulated event prevents default then we do the same on the donor.
       
  4883 		var e = jQuery.extend(
       
  4884 			new jQuery.Event(),
       
  4885 			event,
       
  4886 			{
       
  4887 				type: type,
       
  4888 				isSimulated: true,
       
  4889 				originalEvent: {}
       
  4890 			}
       
  4891 		);
       
  4892 		if ( bubble ) {
       
  4893 			jQuery.event.trigger( e, null, elem );
       
  4894 		} else {
       
  4895 			jQuery.event.dispatch.call( elem, e );
       
  4896 		}
       
  4897 		if ( e.isDefaultPrevented() ) {
       
  4898 			event.preventDefault();
       
  4899 		}
       
  4900 	}
       
  4901 };
       
  4902 
       
  4903 jQuery.removeEvent = function( elem, type, handle ) {
       
  4904 	if ( elem.removeEventListener ) {
       
  4905 		elem.removeEventListener( type, handle, false );
       
  4906 	}
       
  4907 };
       
  4908 
       
  4909 jQuery.Event = function( src, props ) {
       
  4910 	// Allow instantiation without the 'new' keyword
       
  4911 	if ( !(this instanceof jQuery.Event) ) {
       
  4912 		return new jQuery.Event( src, props );
       
  4913 	}
       
  4914 
       
  4915 	// Event object
       
  4916 	if ( src && src.type ) {
       
  4917 		this.originalEvent = src;
       
  4918 		this.type = src.type;
       
  4919 
       
  4920 		// Events bubbling up the document may have been marked as prevented
       
  4921 		// by a handler lower down the tree; reflect the correct value.
       
  4922 		this.isDefaultPrevented = ( src.defaultPrevented ||
       
  4923 			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
       
  4924 
       
  4925 	// Event type
       
  4926 	} else {
       
  4927 		this.type = src;
       
  4928 	}
       
  4929 
       
  4930 	// Put explicitly provided properties onto the event object
       
  4931 	if ( props ) {
       
  4932 		jQuery.extend( this, props );
       
  4933 	}
       
  4934 
       
  4935 	// Create a timestamp if incoming event doesn't have one
       
  4936 	this.timeStamp = src && src.timeStamp || jQuery.now();
       
  4937 
       
  4938 	// Mark it as fixed
       
  4939 	this[ jQuery.expando ] = true;
       
  4940 };
       
  4941 
       
  4942 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
       
  4943 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
       
  4944 jQuery.Event.prototype = {
       
  4945 	isDefaultPrevented: returnFalse,
       
  4946 	isPropagationStopped: returnFalse,
       
  4947 	isImmediatePropagationStopped: returnFalse,
       
  4948 
       
  4949 	preventDefault: function() {
       
  4950 		var e = this.originalEvent;
       
  4951 
       
  4952 		this.isDefaultPrevented = returnTrue;
       
  4953 
       
  4954 		if ( e && e.preventDefault ) {
       
  4955 			e.preventDefault();
       
  4956 		}
       
  4957 	},
       
  4958 	stopPropagation: function() {
       
  4959 		var e = this.originalEvent;
       
  4960 
       
  4961 		this.isPropagationStopped = returnTrue;
       
  4962 
       
  4963 		if ( e && e.stopPropagation ) {
       
  4964 			e.stopPropagation();
       
  4965 		}
       
  4966 	},
       
  4967 	stopImmediatePropagation: function() {
       
  4968 		this.isImmediatePropagationStopped = returnTrue;
       
  4969 		this.stopPropagation();
       
  4970 	}
       
  4971 };
       
  4972 
       
  4973 // Create mouseenter/leave events using mouseover/out and event-time checks
       
  4974 // Support: Chrome 15+
       
  4975 jQuery.each({
       
  4976 	mouseenter: "mouseover",
       
  4977 	mouseleave: "mouseout"
       
  4978 }, function( orig, fix ) {
       
  4979 	jQuery.event.special[ orig ] = {
       
  4980 		delegateType: fix,
       
  4981 		bindType: fix,
       
  4982 
       
  4983 		handle: function( event ) {
       
  4984 			var ret,
       
  4985 				target = this,
       
  4986 				related = event.relatedTarget,
       
  4987 				handleObj = event.handleObj;
       
  4988 
       
  4989 			// For mousenter/leave call the handler if related is outside the target.
       
  4990 			// NB: No relatedTarget if the mouse left/entered the browser window
       
  4991 			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
       
  4992 				event.type = handleObj.origType;
       
  4993 				ret = handleObj.handler.apply( this, arguments );
       
  4994 				event.type = fix;
       
  4995 			}
       
  4996 			return ret;
       
  4997 		}
       
  4998 	};
       
  4999 });
       
  5000 
       
  5001 // Create "bubbling" focus and blur events
       
  5002 // Support: Firefox, Chrome, Safari
       
  5003 if ( !jQuery.support.focusinBubbles ) {
       
  5004 	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
       
  5005 
       
  5006 		// Attach a single capturing handler while someone wants focusin/focusout
       
  5007 		var attaches = 0,
       
  5008 			handler = function( event ) {
       
  5009 				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
       
  5010 			};
       
  5011 
       
  5012 		jQuery.event.special[ fix ] = {
       
  5013 			setup: function() {
       
  5014 				if ( attaches++ === 0 ) {
       
  5015 					document.addEventListener( orig, handler, true );
       
  5016 				}
       
  5017 			},
       
  5018 			teardown: function() {
       
  5019 				if ( --attaches === 0 ) {
       
  5020 					document.removeEventListener( orig, handler, true );
       
  5021 				}
       
  5022 			}
       
  5023 		};
       
  5024 	});
       
  5025 }
       
  5026 
       
  5027 jQuery.fn.extend({
       
  5028 
       
  5029 	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
       
  5030 		var origFn, type;
       
  5031 
       
  5032 		// Types can be a map of types/handlers
       
  5033 		if ( typeof types === "object" ) {
       
  5034 			// ( types-Object, selector, data )
       
  5035 			if ( typeof selector !== "string" ) {
       
  5036 				// ( types-Object, data )
       
  5037 				data = data || selector;
       
  5038 				selector = undefined;
       
  5039 			}
       
  5040 			for ( type in types ) {
       
  5041 				this.on( type, selector, data, types[ type ], one );
       
  5042 			}
       
  5043 			return this;
       
  5044 		}
       
  5045 
       
  5046 		if ( data == null && fn == null ) {
       
  5047 			// ( types, fn )
       
  5048 			fn = selector;
       
  5049 			data = selector = undefined;
       
  5050 		} else if ( fn == null ) {
       
  5051 			if ( typeof selector === "string" ) {
       
  5052 				// ( types, selector, fn )
       
  5053 				fn = data;
       
  5054 				data = undefined;
       
  5055 			} else {
       
  5056 				// ( types, data, fn )
       
  5057 				fn = data;
       
  5058 				data = selector;
       
  5059 				selector = undefined;
       
  5060 			}
       
  5061 		}
       
  5062 		if ( fn === false ) {
       
  5063 			fn = returnFalse;
       
  5064 		} else if ( !fn ) {
       
  5065 			return this;
       
  5066 		}
       
  5067 
       
  5068 		if ( one === 1 ) {
       
  5069 			origFn = fn;
       
  5070 			fn = function( event ) {
       
  5071 				// Can use an empty set, since event contains the info
       
  5072 				jQuery().off( event );
       
  5073 				return origFn.apply( this, arguments );
       
  5074 			};
       
  5075 			// Use same guid so caller can remove using origFn
       
  5076 			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
       
  5077 		}
       
  5078 		return this.each( function() {
       
  5079 			jQuery.event.add( this, types, fn, data, selector );
       
  5080 		});
       
  5081 	},
       
  5082 	one: function( types, selector, data, fn ) {
       
  5083 		return this.on( types, selector, data, fn, 1 );
       
  5084 	},
       
  5085 	off: function( types, selector, fn ) {
       
  5086 		var handleObj, type;
       
  5087 		if ( types && types.preventDefault && types.handleObj ) {
       
  5088 			// ( event )  dispatched jQuery.Event
       
  5089 			handleObj = types.handleObj;
       
  5090 			jQuery( types.delegateTarget ).off(
       
  5091 				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
       
  5092 				handleObj.selector,
       
  5093 				handleObj.handler
       
  5094 			);
       
  5095 			return this;
       
  5096 		}
       
  5097 		if ( typeof types === "object" ) {
       
  5098 			// ( types-object [, selector] )
       
  5099 			for ( type in types ) {
       
  5100 				this.off( type, selector, types[ type ] );
       
  5101 			}
       
  5102 			return this;
       
  5103 		}
       
  5104 		if ( selector === false || typeof selector === "function" ) {
       
  5105 			// ( types [, fn] )
       
  5106 			fn = selector;
       
  5107 			selector = undefined;
       
  5108 		}
       
  5109 		if ( fn === false ) {
       
  5110 			fn = returnFalse;
       
  5111 		}
       
  5112 		return this.each(function() {
       
  5113 			jQuery.event.remove( this, types, fn, selector );
       
  5114 		});
       
  5115 	},
       
  5116 
       
  5117 	trigger: function( type, data ) {
       
  5118 		return this.each(function() {
       
  5119 			jQuery.event.trigger( type, data, this );
       
  5120 		});
       
  5121 	},
       
  5122 	triggerHandler: function( type, data ) {
       
  5123 		var elem = this[0];
       
  5124 		if ( elem ) {
       
  5125 			return jQuery.event.trigger( type, data, elem, true );
       
  5126 		}
       
  5127 	}
       
  5128 });
       
  5129 var isSimple = /^.[^:#\[\.,]*$/,
       
  5130 	rparentsprev = /^(?:parents|prev(?:Until|All))/,
       
  5131 	rneedsContext = jQuery.expr.match.needsContext,
       
  5132 	// methods guaranteed to produce a unique set when starting from a unique set
       
  5133 	guaranteedUnique = {
       
  5134 		children: true,
       
  5135 		contents: true,
       
  5136 		next: true,
       
  5137 		prev: true
       
  5138 	};
       
  5139 
       
  5140 jQuery.fn.extend({
       
  5141 	find: function( selector ) {
       
  5142 		var i,
       
  5143 			ret = [],
       
  5144 			self = this,
       
  5145 			len = self.length;
       
  5146 
       
  5147 		if ( typeof selector !== "string" ) {
       
  5148 			return this.pushStack( jQuery( selector ).filter(function() {
       
  5149 				for ( i = 0; i < len; i++ ) {
       
  5150 					if ( jQuery.contains( self[ i ], this ) ) {
       
  5151 						return true;
       
  5152 					}
       
  5153 				}
       
  5154 			}) );
       
  5155 		}
       
  5156 
       
  5157 		for ( i = 0; i < len; i++ ) {
       
  5158 			jQuery.find( selector, self[ i ], ret );
       
  5159 		}
       
  5160 
       
  5161 		// Needed because $( selector, context ) becomes $( context ).find( selector )
       
  5162 		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
       
  5163 		ret.selector = this.selector ? this.selector + " " + selector : selector;
       
  5164 		return ret;
       
  5165 	},
       
  5166 
       
  5167 	has: function( target ) {
       
  5168 		var targets = jQuery( target, this ),
       
  5169 			l = targets.length;
       
  5170 
       
  5171 		return this.filter(function() {
       
  5172 			var i = 0;
       
  5173 			for ( ; i < l; i++ ) {
       
  5174 				if ( jQuery.contains( this, targets[i] ) ) {
       
  5175 					return true;
       
  5176 				}
       
  5177 			}
       
  5178 		});
       
  5179 	},
       
  5180 
       
  5181 	not: function( selector ) {
       
  5182 		return this.pushStack( winnow(this, selector || [], true) );
       
  5183 	},
       
  5184 
       
  5185 	filter: function( selector ) {
       
  5186 		return this.pushStack( winnow(this, selector || [], false) );
       
  5187 	},
       
  5188 
       
  5189 	is: function( selector ) {
       
  5190 		return !!winnow(
       
  5191 			this,
       
  5192 
       
  5193 			// If this is a positional/relative selector, check membership in the returned set
       
  5194 			// so $("p:first").is("p:last") won't return true for a doc with two "p".
       
  5195 			typeof selector === "string" && rneedsContext.test( selector ) ?
       
  5196 				jQuery( selector ) :
       
  5197 				selector || [],
       
  5198 			false
       
  5199 		).length;
       
  5200 	},
       
  5201 
       
  5202 	closest: function( selectors, context ) {
       
  5203 		var cur,
       
  5204 			i = 0,
       
  5205 			l = this.length,
       
  5206 			matched = [],
       
  5207 			pos = ( rneedsContext.test( selectors ) || typeof selectors !== "string" ) ?
       
  5208 				jQuery( selectors, context || this.context ) :
       
  5209 				0;
       
  5210 
       
  5211 		for ( ; i < l; i++ ) {
       
  5212 			for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
       
  5213 				// Always skip document fragments
       
  5214 				if ( cur.nodeType < 11 && (pos ?
       
  5215 					pos.index(cur) > -1 :
       
  5216 
       
  5217 					// Don't pass non-elements to Sizzle
       
  5218 					cur.nodeType === 1 &&
       
  5219 						jQuery.find.matchesSelector(cur, selectors)) ) {
       
  5220 
       
  5221 					cur = matched.push( cur );
       
  5222 					break;
       
  5223 				}
       
  5224 			}
       
  5225 		}
       
  5226 
       
  5227 		return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
       
  5228 	},
       
  5229 
       
  5230 	// Determine the position of an element within
       
  5231 	// the matched set of elements
       
  5232 	index: function( elem ) {
       
  5233 
       
  5234 		// No argument, return index in parent
       
  5235 		if ( !elem ) {
       
  5236 			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
       
  5237 		}
       
  5238 
       
  5239 		// index in selector
       
  5240 		if ( typeof elem === "string" ) {
       
  5241 			return core_indexOf.call( jQuery( elem ), this[ 0 ] );
       
  5242 		}
       
  5243 
       
  5244 		// Locate the position of the desired element
       
  5245 		return core_indexOf.call( this,
       
  5246 
       
  5247 			// If it receives a jQuery object, the first element is used
       
  5248 			elem.jquery ? elem[ 0 ] : elem
       
  5249 		);
       
  5250 	},
       
  5251 
       
  5252 	add: function( selector, context ) {
       
  5253 		var set = typeof selector === "string" ?
       
  5254 				jQuery( selector, context ) :
       
  5255 				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
       
  5256 			all = jQuery.merge( this.get(), set );
       
  5257 
       
  5258 		return this.pushStack( jQuery.unique(all) );
       
  5259 	},
       
  5260 
       
  5261 	addBack: function( selector ) {
       
  5262 		return this.add( selector == null ?
       
  5263 			this.prevObject : this.prevObject.filter(selector)
       
  5264 		);
       
  5265 	}
       
  5266 });
       
  5267 
       
  5268 function sibling( cur, dir ) {
       
  5269 	while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
       
  5270 
       
  5271 	return cur;
       
  5272 }
       
  5273 
       
  5274 jQuery.each({
       
  5275 	parent: function( elem ) {
       
  5276 		var parent = elem.parentNode;
       
  5277 		return parent && parent.nodeType !== 11 ? parent : null;
       
  5278 	},
       
  5279 	parents: function( elem ) {
       
  5280 		return jQuery.dir( elem, "parentNode" );
       
  5281 	},
       
  5282 	parentsUntil: function( elem, i, until ) {
       
  5283 		return jQuery.dir( elem, "parentNode", until );
       
  5284 	},
       
  5285 	next: function( elem ) {
       
  5286 		return sibling( elem, "nextSibling" );
       
  5287 	},
       
  5288 	prev: function( elem ) {
       
  5289 		return sibling( elem, "previousSibling" );
       
  5290 	},
       
  5291 	nextAll: function( elem ) {
       
  5292 		return jQuery.dir( elem, "nextSibling" );
       
  5293 	},
       
  5294 	prevAll: function( elem ) {
       
  5295 		return jQuery.dir( elem, "previousSibling" );
       
  5296 	},
       
  5297 	nextUntil: function( elem, i, until ) {
       
  5298 		return jQuery.dir( elem, "nextSibling", until );
       
  5299 	},
       
  5300 	prevUntil: function( elem, i, until ) {
       
  5301 		return jQuery.dir( elem, "previousSibling", until );
       
  5302 	},
       
  5303 	siblings: function( elem ) {
       
  5304 		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
       
  5305 	},
       
  5306 	children: function( elem ) {
       
  5307 		return jQuery.sibling( elem.firstChild );
       
  5308 	},
       
  5309 	contents: function( elem ) {
       
  5310 		return elem.contentDocument || jQuery.merge( [], elem.childNodes );
       
  5311 	}
       
  5312 }, function( name, fn ) {
       
  5313 	jQuery.fn[ name ] = function( until, selector ) {
       
  5314 		var matched = jQuery.map( this, fn, until );
       
  5315 
       
  5316 		if ( name.slice( -5 ) !== "Until" ) {
       
  5317 			selector = until;
       
  5318 		}
       
  5319 
       
  5320 		if ( selector && typeof selector === "string" ) {
       
  5321 			matched = jQuery.filter( selector, matched );
       
  5322 		}
       
  5323 
       
  5324 		if ( this.length > 1 ) {
       
  5325 			// Remove duplicates
       
  5326 			if ( !guaranteedUnique[ name ] ) {
       
  5327 				jQuery.unique( matched );
       
  5328 			}
       
  5329 
       
  5330 			// Reverse order for parents* and prev-derivatives
       
  5331 			if ( rparentsprev.test( name ) ) {
       
  5332 				matched.reverse();
       
  5333 			}
       
  5334 		}
       
  5335 
       
  5336 		return this.pushStack( matched );
       
  5337 	};
       
  5338 });
       
  5339 
       
  5340 jQuery.extend({
       
  5341 	filter: function( expr, elems, not ) {
       
  5342 		var elem = elems[ 0 ];
       
  5343 
       
  5344 		if ( not ) {
       
  5345 			expr = ":not(" + expr + ")";
       
  5346 		}
       
  5347 
       
  5348 		return elems.length === 1 && elem.nodeType === 1 ?
       
  5349 			jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
       
  5350 			jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
       
  5351 				return elem.nodeType === 1;
       
  5352 			}));
       
  5353 	},
       
  5354 
       
  5355 	dir: function( elem, dir, until ) {
       
  5356 		var matched = [],
       
  5357 			truncate = until !== undefined;
       
  5358 
       
  5359 		while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
       
  5360 			if ( elem.nodeType === 1 ) {
       
  5361 				if ( truncate && jQuery( elem ).is( until ) ) {
       
  5362 					break;
       
  5363 				}
       
  5364 				matched.push( elem );
       
  5365 			}
       
  5366 		}
       
  5367 		return matched;
       
  5368 	},
       
  5369 
       
  5370 	sibling: function( n, elem ) {
       
  5371 		var matched = [];
       
  5372 
       
  5373 		for ( ; n; n = n.nextSibling ) {
       
  5374 			if ( n.nodeType === 1 && n !== elem ) {
       
  5375 				matched.push( n );
       
  5376 			}
       
  5377 		}
       
  5378 
       
  5379 		return matched;
       
  5380 	}
       
  5381 });
       
  5382 
       
  5383 // Implement the identical functionality for filter and not
       
  5384 function winnow( elements, qualifier, not ) {
       
  5385 	if ( jQuery.isFunction( qualifier ) ) {
       
  5386 		return jQuery.grep( elements, function( elem, i ) {
       
  5387 			/* jshint -W018 */
       
  5388 			return !!qualifier.call( elem, i, elem ) !== not;
       
  5389 		});
       
  5390 
       
  5391 	}
       
  5392 
       
  5393 	if ( qualifier.nodeType ) {
       
  5394 		return jQuery.grep( elements, function( elem ) {
       
  5395 			return ( elem === qualifier ) !== not;
       
  5396 		});
       
  5397 
       
  5398 	}
       
  5399 
       
  5400 	if ( typeof qualifier === "string" ) {
       
  5401 		if ( isSimple.test( qualifier ) ) {
       
  5402 			return jQuery.filter( qualifier, elements, not );
       
  5403 		}
       
  5404 
       
  5405 		qualifier = jQuery.filter( qualifier, elements );
       
  5406 	}
       
  5407 
       
  5408 	return jQuery.grep( elements, function( elem ) {
       
  5409 		return ( core_indexOf.call( qualifier, elem ) >= 0 ) !== not;
       
  5410 	});
       
  5411 }
       
  5412 var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
       
  5413 	rtagName = /<([\w:]+)/,
       
  5414 	rhtml = /<|&#?\w+;/,
       
  5415 	rnoInnerhtml = /<(?:script|style|link)/i,
       
  5416 	manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
       
  5417 	// checked="checked" or checked
       
  5418 	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
       
  5419 	rscriptType = /^$|\/(?:java|ecma)script/i,
       
  5420 	rscriptTypeMasked = /^true\/(.*)/,
       
  5421 	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
       
  5422 
       
  5423 	// We have to close these tags to support XHTML (#13200)
       
  5424 	wrapMap = {
       
  5425 
       
  5426 		// Support: IE 9
       
  5427 		option: [ 1, "<select multiple='multiple'>", "</select>" ],
       
  5428 
       
  5429 		thead: [ 1, "<table>", "</table>" ],
       
  5430 		col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
       
  5431 		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
       
  5432 		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
       
  5433 
       
  5434 		_default: [ 0, "", "" ]
       
  5435 	};
       
  5436 
       
  5437 // Support: IE 9
       
  5438 wrapMap.optgroup = wrapMap.option;
       
  5439 
       
  5440 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
       
  5441 wrapMap.th = wrapMap.td;
       
  5442 
       
  5443 jQuery.fn.extend({
       
  5444 	text: function( value ) {
       
  5445 		return jQuery.access( this, function( value ) {
       
  5446 			return value === undefined ?
       
  5447 				jQuery.text( this ) :
       
  5448 				this.empty().append( ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) );
       
  5449 		}, null, value, arguments.length );
       
  5450 	},
       
  5451 
       
  5452 	append: function() {
       
  5453 		return this.domManip( arguments, function( elem ) {
       
  5454 			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
       
  5455 				var target = manipulationTarget( this, elem );
       
  5456 				target.appendChild( elem );
       
  5457 			}
       
  5458 		});
       
  5459 	},
       
  5460 
       
  5461 	prepend: function() {
       
  5462 		return this.domManip( arguments, function( elem ) {
       
  5463 			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
       
  5464 				var target = manipulationTarget( this, elem );
       
  5465 				target.insertBefore( elem, target.firstChild );
       
  5466 			}
       
  5467 		});
       
  5468 	},
       
  5469 
       
  5470 	before: function() {
       
  5471 		return this.domManip( arguments, function( elem ) {
       
  5472 			if ( this.parentNode ) {
       
  5473 				this.parentNode.insertBefore( elem, this );
       
  5474 			}
       
  5475 		});
       
  5476 	},
       
  5477 
       
  5478 	after: function() {
       
  5479 		return this.domManip( arguments, function( elem ) {
       
  5480 			if ( this.parentNode ) {
       
  5481 				this.parentNode.insertBefore( elem, this.nextSibling );
       
  5482 			}
       
  5483 		});
       
  5484 	},
       
  5485 
       
  5486 	// keepData is for internal use only--do not document
       
  5487 	remove: function( selector, keepData ) {
       
  5488 		var elem,
       
  5489 			elems = selector ? jQuery.filter( selector, this ) : this,
       
  5490 			i = 0;
       
  5491 
       
  5492 		for ( ; (elem = elems[i]) != null; i++ ) {
       
  5493 			if ( !keepData && elem.nodeType === 1 ) {
       
  5494 				jQuery.cleanData( getAll( elem ) );
       
  5495 			}
       
  5496 
       
  5497 			if ( elem.parentNode ) {
       
  5498 				if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
       
  5499 					setGlobalEval( getAll( elem, "script" ) );
       
  5500 				}
       
  5501 				elem.parentNode.removeChild( elem );
       
  5502 			}
       
  5503 		}
       
  5504 
       
  5505 		return this;
       
  5506 	},
       
  5507 
       
  5508 	empty: function() {
       
  5509 		var elem,
       
  5510 			i = 0;
       
  5511 
       
  5512 		for ( ; (elem = this[i]) != null; i++ ) {
       
  5513 			if ( elem.nodeType === 1 ) {
       
  5514 
       
  5515 				// Prevent memory leaks
       
  5516 				jQuery.cleanData( getAll( elem, false ) );
       
  5517 
       
  5518 				// Remove any remaining nodes
       
  5519 				elem.textContent = "";
       
  5520 			}
       
  5521 		}
       
  5522 
       
  5523 		return this;
       
  5524 	},
       
  5525 
       
  5526 	clone: function( dataAndEvents, deepDataAndEvents ) {
       
  5527 		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
       
  5528 		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
       
  5529 
       
  5530 		return this.map( function () {
       
  5531 			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
       
  5532 		});
       
  5533 	},
       
  5534 
       
  5535 	html: function( value ) {
       
  5536 		return jQuery.access( this, function( value ) {
       
  5537 			var elem = this[ 0 ] || {},
       
  5538 				i = 0,
       
  5539 				l = this.length;
       
  5540 
       
  5541 			if ( value === undefined && elem.nodeType === 1 ) {
       
  5542 				return elem.innerHTML;
       
  5543 			}
       
  5544 
       
  5545 			// See if we can take a shortcut and just use innerHTML
       
  5546 			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
       
  5547 				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
       
  5548 
       
  5549 				value = value.replace( rxhtmlTag, "<$1></$2>" );
       
  5550 
       
  5551 				try {
       
  5552 					for ( ; i < l; i++ ) {
       
  5553 						elem = this[ i ] || {};
       
  5554 
       
  5555 						// Remove element nodes and prevent memory leaks
       
  5556 						if ( elem.nodeType === 1 ) {
       
  5557 							jQuery.cleanData( getAll( elem, false ) );
       
  5558 							elem.innerHTML = value;
       
  5559 						}
       
  5560 					}
       
  5561 
       
  5562 					elem = 0;
       
  5563 
       
  5564 				// If using innerHTML throws an exception, use the fallback method
       
  5565 				} catch( e ) {}
       
  5566 			}
       
  5567 
       
  5568 			if ( elem ) {
       
  5569 				this.empty().append( value );
       
  5570 			}
       
  5571 		}, null, value, arguments.length );
       
  5572 	},
       
  5573 
       
  5574 	replaceWith: function() {
       
  5575 		var
       
  5576 			// Snapshot the DOM in case .domManip sweeps something relevant into its fragment
       
  5577 			args = jQuery.map( this, function( elem ) {
       
  5578 				return [ elem.nextSibling, elem.parentNode ];
       
  5579 			}),
       
  5580 			i = 0;
       
  5581 
       
  5582 		// Make the changes, replacing each context element with the new content
       
  5583 		this.domManip( arguments, function( elem ) {
       
  5584 			var next = args[ i++ ],
       
  5585 				parent = args[ i++ ];
       
  5586 
       
  5587 			if ( parent ) {
       
  5588 				// Don't use the snapshot next if it has moved (#13810)
       
  5589 				if ( next && next.parentNode !== parent ) {
       
  5590 					next = this.nextSibling;
       
  5591 				}
       
  5592 				jQuery( this ).remove();
       
  5593 				parent.insertBefore( elem, next );
       
  5594 			}
       
  5595 		// Allow new content to include elements from the context set
       
  5596 		}, true );
       
  5597 
       
  5598 		// Force removal if there was no new content (e.g., from empty arguments)
       
  5599 		return i ? this : this.remove();
       
  5600 	},
       
  5601 
       
  5602 	detach: function( selector ) {
       
  5603 		return this.remove( selector, true );
       
  5604 	},
       
  5605 
       
  5606 	domManip: function( args, callback, allowIntersection ) {
       
  5607 
       
  5608 		// Flatten any nested arrays
       
  5609 		args = core_concat.apply( [], args );
       
  5610 
       
  5611 		var fragment, first, scripts, hasScripts, node, doc,
       
  5612 			i = 0,
       
  5613 			l = this.length,
       
  5614 			set = this,
       
  5615 			iNoClone = l - 1,
       
  5616 			value = args[ 0 ],
       
  5617 			isFunction = jQuery.isFunction( value );
       
  5618 
       
  5619 		// We can't cloneNode fragments that contain checked, in WebKit
       
  5620 		if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
       
  5621 			return this.each(function( index ) {
       
  5622 				var self = set.eq( index );
       
  5623 				if ( isFunction ) {
       
  5624 					args[ 0 ] = value.call( this, index, self.html() );
       
  5625 				}
       
  5626 				self.domManip( args, callback, allowIntersection );
       
  5627 			});
       
  5628 		}
       
  5629 
       
  5630 		if ( l ) {
       
  5631 			fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );
       
  5632 			first = fragment.firstChild;
       
  5633 
       
  5634 			if ( fragment.childNodes.length === 1 ) {
       
  5635 				fragment = first;
       
  5636 			}
       
  5637 
       
  5638 			if ( first ) {
       
  5639 				scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
       
  5640 				hasScripts = scripts.length;
       
  5641 
       
  5642 				// Use the original fragment for the last item instead of the first because it can end up
       
  5643 				// being emptied incorrectly in certain situations (#8070).
       
  5644 				for ( ; i < l; i++ ) {
       
  5645 					node = fragment;
       
  5646 
       
  5647 					if ( i !== iNoClone ) {
       
  5648 						node = jQuery.clone( node, true, true );
       
  5649 
       
  5650 						// Keep references to cloned scripts for later restoration
       
  5651 						if ( hasScripts ) {
       
  5652 							// Support: QtWebKit
       
  5653 							// jQuery.merge because core_push.apply(_, arraylike) throws
       
  5654 							jQuery.merge( scripts, getAll( node, "script" ) );
       
  5655 						}
       
  5656 					}
       
  5657 
       
  5658 					callback.call( this[ i ], node, i );
       
  5659 				}
       
  5660 
       
  5661 				if ( hasScripts ) {
       
  5662 					doc = scripts[ scripts.length - 1 ].ownerDocument;
       
  5663 
       
  5664 					// Reenable scripts
       
  5665 					jQuery.map( scripts, restoreScript );
       
  5666 
       
  5667 					// Evaluate executable scripts on first document insertion
       
  5668 					for ( i = 0; i < hasScripts; i++ ) {
       
  5669 						node = scripts[ i ];
       
  5670 						if ( rscriptType.test( node.type || "" ) &&
       
  5671 							!data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
       
  5672 
       
  5673 							if ( node.src ) {
       
  5674 								// Hope ajax is available...
       
  5675 								jQuery._evalUrl( node.src );
       
  5676 							} else {
       
  5677 								jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
       
  5678 							}
       
  5679 						}
       
  5680 					}
       
  5681 				}
       
  5682 			}
       
  5683 		}
       
  5684 
       
  5685 		return this;
       
  5686 	}
       
  5687 });
       
  5688 
       
  5689 jQuery.each({
       
  5690 	appendTo: "append",
       
  5691 	prependTo: "prepend",
       
  5692 	insertBefore: "before",
       
  5693 	insertAfter: "after",
       
  5694 	replaceAll: "replaceWith"
       
  5695 }, function( name, original ) {
       
  5696 	jQuery.fn[ name ] = function( selector ) {
       
  5697 		var elems,
       
  5698 			ret = [],
       
  5699 			insert = jQuery( selector ),
       
  5700 			last = insert.length - 1,
       
  5701 			i = 0;
       
  5702 
       
  5703 		for ( ; i <= last; i++ ) {
       
  5704 			elems = i === last ? this : this.clone( true );
       
  5705 			jQuery( insert[ i ] )[ original ]( elems );
       
  5706 
       
  5707 			// Support: QtWebKit
       
  5708 			// .get() because core_push.apply(_, arraylike) throws
       
  5709 			core_push.apply( ret, elems.get() );
       
  5710 		}
       
  5711 
       
  5712 		return this.pushStack( ret );
       
  5713 	};
       
  5714 });
       
  5715 
       
  5716 jQuery.extend({
       
  5717 	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
       
  5718 		var i, l, srcElements, destElements,
       
  5719 			clone = elem.cloneNode( true ),
       
  5720 			inPage = jQuery.contains( elem.ownerDocument, elem );
       
  5721 
       
  5722 		// Support: IE >= 9
       
  5723 		// Fix Cloning issues
       
  5724 		if ( !jQuery.support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) {
       
  5725 
       
  5726 			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
       
  5727 			destElements = getAll( clone );
       
  5728 			srcElements = getAll( elem );
       
  5729 
       
  5730 			for ( i = 0, l = srcElements.length; i < l; i++ ) {
       
  5731 				fixInput( srcElements[ i ], destElements[ i ] );
       
  5732 			}
       
  5733 		}
       
  5734 
       
  5735 		// Copy the events from the original to the clone
       
  5736 		if ( dataAndEvents ) {
       
  5737 			if ( deepDataAndEvents ) {
       
  5738 				srcElements = srcElements || getAll( elem );
       
  5739 				destElements = destElements || getAll( clone );
       
  5740 
       
  5741 				for ( i = 0, l = srcElements.length; i < l; i++ ) {
       
  5742 					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
       
  5743 				}
       
  5744 			} else {
       
  5745 				cloneCopyEvent( elem, clone );
       
  5746 			}
       
  5747 		}
       
  5748 
       
  5749 		// Preserve script evaluation history
       
  5750 		destElements = getAll( clone, "script" );
       
  5751 		if ( destElements.length > 0 ) {
       
  5752 			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
       
  5753 		}
       
  5754 
       
  5755 		// Return the cloned set
       
  5756 		return clone;
       
  5757 	},
       
  5758 
       
  5759 	buildFragment: function( elems, context, scripts, selection ) {
       
  5760 		var elem, tmp, tag, wrap, contains, j,
       
  5761 			i = 0,
       
  5762 			l = elems.length,
       
  5763 			fragment = context.createDocumentFragment(),
       
  5764 			nodes = [];
       
  5765 
       
  5766 		for ( ; i < l; i++ ) {
       
  5767 			elem = elems[ i ];
       
  5768 
       
  5769 			if ( elem || elem === 0 ) {
       
  5770 
       
  5771 				// Add nodes directly
       
  5772 				if ( jQuery.type( elem ) === "object" ) {
       
  5773 					// Support: QtWebKit
       
  5774 					// jQuery.merge because core_push.apply(_, arraylike) throws
       
  5775 					jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
       
  5776 
       
  5777 				// Convert non-html into a text node
       
  5778 				} else if ( !rhtml.test( elem ) ) {
       
  5779 					nodes.push( context.createTextNode( elem ) );
       
  5780 
       
  5781 				// Convert html into DOM nodes
       
  5782 				} else {
       
  5783 					tmp = tmp || fragment.appendChild( context.createElement("div") );
       
  5784 
       
  5785 					// Deserialize a standard representation
       
  5786 					tag = ( rtagName.exec( elem ) || ["", ""] )[ 1 ].toLowerCase();
       
  5787 					wrap = wrapMap[ tag ] || wrapMap._default;
       
  5788 					tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
       
  5789 
       
  5790 					// Descend through wrappers to the right content
       
  5791 					j = wrap[ 0 ];
       
  5792 					while ( j-- ) {
       
  5793 						tmp = tmp.lastChild;
       
  5794 					}
       
  5795 
       
  5796 					// Support: QtWebKit
       
  5797 					// jQuery.merge because core_push.apply(_, arraylike) throws
       
  5798 					jQuery.merge( nodes, tmp.childNodes );
       
  5799 
       
  5800 					// Remember the top-level container
       
  5801 					tmp = fragment.firstChild;
       
  5802 
       
  5803 					// Fixes #12346
       
  5804 					// Support: Webkit, IE
       
  5805 					tmp.textContent = "";
       
  5806 				}
       
  5807 			}
       
  5808 		}
       
  5809 
       
  5810 		// Remove wrapper from fragment
       
  5811 		fragment.textContent = "";
       
  5812 
       
  5813 		i = 0;
       
  5814 		while ( (elem = nodes[ i++ ]) ) {
       
  5815 
       
  5816 			// #4087 - If origin and destination elements are the same, and this is
       
  5817 			// that element, do not do anything
       
  5818 			if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
       
  5819 				continue;
       
  5820 			}
       
  5821 
       
  5822 			contains = jQuery.contains( elem.ownerDocument, elem );
       
  5823 
       
  5824 			// Append to fragment
       
  5825 			tmp = getAll( fragment.appendChild( elem ), "script" );
       
  5826 
       
  5827 			// Preserve script evaluation history
       
  5828 			if ( contains ) {
       
  5829 				setGlobalEval( tmp );
       
  5830 			}
       
  5831 
       
  5832 			// Capture executables
       
  5833 			if ( scripts ) {
       
  5834 				j = 0;
       
  5835 				while ( (elem = tmp[ j++ ]) ) {
       
  5836 					if ( rscriptType.test( elem.type || "" ) ) {
       
  5837 						scripts.push( elem );
       
  5838 					}
       
  5839 				}
       
  5840 			}
       
  5841 		}
       
  5842 
       
  5843 		return fragment;
       
  5844 	},
       
  5845 
       
  5846 	cleanData: function( elems ) {
       
  5847 		var data, elem, events, type, key, j,
       
  5848 			special = jQuery.event.special,
       
  5849 			i = 0;
       
  5850 
       
  5851 		for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
       
  5852 			if ( Data.accepts( elem ) ) {
       
  5853 				key = elem[ data_priv.expando ];
       
  5854 
       
  5855 				if ( key && (data = data_priv.cache[ key ]) ) {
       
  5856 					events = Object.keys( data.events || {} );
       
  5857 					if ( events.length ) {
       
  5858 						for ( j = 0; (type = events[j]) !== undefined; j++ ) {
       
  5859 							if ( special[ type ] ) {
       
  5860 								jQuery.event.remove( elem, type );
       
  5861 
       
  5862 							// This is a shortcut to avoid jQuery.event.remove's overhead
       
  5863 							} else {
       
  5864 								jQuery.removeEvent( elem, type, data.handle );
       
  5865 							}
       
  5866 						}
       
  5867 					}
       
  5868 					if ( data_priv.cache[ key ] ) {
       
  5869 						// Discard any remaining `private` data
       
  5870 						delete data_priv.cache[ key ];
       
  5871 					}
       
  5872 				}
       
  5873 			}
       
  5874 			// Discard any remaining `user` data
       
  5875 			delete data_user.cache[ elem[ data_user.expando ] ];
       
  5876 		}
       
  5877 	},
       
  5878 
       
  5879 	_evalUrl: function( url ) {
       
  5880 		return jQuery.ajax({
       
  5881 			url: url,
       
  5882 			type: "GET",
       
  5883 			dataType: "script",
       
  5884 			async: false,
       
  5885 			global: false,
       
  5886 			"throws": true
       
  5887 		});
       
  5888 	}
       
  5889 });
       
  5890 
       
  5891 // Support: 1.x compatibility
       
  5892 // Manipulating tables requires a tbody
       
  5893 function manipulationTarget( elem, content ) {
       
  5894 	return jQuery.nodeName( elem, "table" ) &&
       
  5895 		jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ?
       
  5896 
       
  5897 		elem.getElementsByTagName("tbody")[0] ||
       
  5898 			elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
       
  5899 		elem;
       
  5900 }
       
  5901 
       
  5902 // Replace/restore the type attribute of script elements for safe DOM manipulation
       
  5903 function disableScript( elem ) {
       
  5904 	elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
       
  5905 	return elem;
       
  5906 }
       
  5907 function restoreScript( elem ) {
       
  5908 	var match = rscriptTypeMasked.exec( elem.type );
       
  5909 
       
  5910 	if ( match ) {
       
  5911 		elem.type = match[ 1 ];
       
  5912 	} else {
       
  5913 		elem.removeAttribute("type");
       
  5914 	}
       
  5915 
       
  5916 	return elem;
       
  5917 }
       
  5918 
       
  5919 // Mark scripts as having already been evaluated
       
  5920 function setGlobalEval( elems, refElements ) {
       
  5921 	var l = elems.length,
       
  5922 		i = 0;
       
  5923 
       
  5924 	for ( ; i < l; i++ ) {
       
  5925 		data_priv.set(
       
  5926 			elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
       
  5927 		);
       
  5928 	}
       
  5929 }
       
  5930 
       
  5931 function cloneCopyEvent( src, dest ) {
       
  5932 	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
       
  5933 
       
  5934 	if ( dest.nodeType !== 1 ) {
       
  5935 		return;
       
  5936 	}
       
  5937 
       
  5938 	// 1. Copy private data: events, handlers, etc.
       
  5939 	if ( data_priv.hasData( src ) ) {
       
  5940 		pdataOld = data_priv.access( src );
       
  5941 		pdataCur = data_priv.set( dest, pdataOld );
       
  5942 		events = pdataOld.events;
       
  5943 
       
  5944 		if ( events ) {
       
  5945 			delete pdataCur.handle;
       
  5946 			pdataCur.events = {};
       
  5947 
       
  5948 			for ( type in events ) {
       
  5949 				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
       
  5950 					jQuery.event.add( dest, type, events[ type ][ i ] );
       
  5951 				}
       
  5952 			}
       
  5953 		}
       
  5954 	}
       
  5955 
       
  5956 	// 2. Copy user data
       
  5957 	if ( data_user.hasData( src ) ) {
       
  5958 		udataOld = data_user.access( src );
       
  5959 		udataCur = jQuery.extend( {}, udataOld );
       
  5960 
       
  5961 		data_user.set( dest, udataCur );
       
  5962 	}
       
  5963 }
       
  5964 
       
  5965 
       
  5966 function getAll( context, tag ) {
       
  5967 	var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
       
  5968 			context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
       
  5969 			[];
       
  5970 
       
  5971 	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
       
  5972 		jQuery.merge( [ context ], ret ) :
       
  5973 		ret;
       
  5974 }
       
  5975 
       
  5976 // Support: IE >= 9
       
  5977 function fixInput( src, dest ) {
       
  5978 	var nodeName = dest.nodeName.toLowerCase();
       
  5979 
       
  5980 	// Fails to persist the checked state of a cloned checkbox or radio button.
       
  5981 	if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
       
  5982 		dest.checked = src.checked;
       
  5983 
       
  5984 	// Fails to return the selected option to the default selected state when cloning options
       
  5985 	} else if ( nodeName === "input" || nodeName === "textarea" ) {
       
  5986 		dest.defaultValue = src.defaultValue;
       
  5987 	}
       
  5988 }
       
  5989 jQuery.fn.extend({
       
  5990 	wrapAll: function( html ) {
       
  5991 		var wrap;
       
  5992 
       
  5993 		if ( jQuery.isFunction( html ) ) {
       
  5994 			return this.each(function( i ) {
       
  5995 				jQuery( this ).wrapAll( html.call(this, i) );
       
  5996 			});
       
  5997 		}
       
  5998 
       
  5999 		if ( this[ 0 ] ) {
       
  6000 
       
  6001 			// The elements to wrap the target around
       
  6002 			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
       
  6003 
       
  6004 			if ( this[ 0 ].parentNode ) {
       
  6005 				wrap.insertBefore( this[ 0 ] );
       
  6006 			}
       
  6007 
       
  6008 			wrap.map(function() {
       
  6009 				var elem = this;
       
  6010 
       
  6011 				while ( elem.firstElementChild ) {
       
  6012 					elem = elem.firstElementChild;
       
  6013 				}
       
  6014 
       
  6015 				return elem;
       
  6016 			}).append( this );
       
  6017 		}
       
  6018 
       
  6019 		return this;
       
  6020 	},
       
  6021 
       
  6022 	wrapInner: function( html ) {
       
  6023 		if ( jQuery.isFunction( html ) ) {
       
  6024 			return this.each(function( i ) {
       
  6025 				jQuery( this ).wrapInner( html.call(this, i) );
       
  6026 			});
       
  6027 		}
       
  6028 
       
  6029 		return this.each(function() {
       
  6030 			var self = jQuery( this ),
       
  6031 				contents = self.contents();
       
  6032 
       
  6033 			if ( contents.length ) {
       
  6034 				contents.wrapAll( html );
       
  6035 
       
  6036 			} else {
       
  6037 				self.append( html );
       
  6038 			}
       
  6039 		});
       
  6040 	},
       
  6041 
       
  6042 	wrap: function( html ) {
       
  6043 		var isFunction = jQuery.isFunction( html );
       
  6044 
       
  6045 		return this.each(function( i ) {
       
  6046 			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
       
  6047 		});
       
  6048 	},
       
  6049 
       
  6050 	unwrap: function() {
       
  6051 		return this.parent().each(function() {
       
  6052 			if ( !jQuery.nodeName( this, "body" ) ) {
       
  6053 				jQuery( this ).replaceWith( this.childNodes );
       
  6054 			}
       
  6055 		}).end();
       
  6056 	}
       
  6057 });
       
  6058 var curCSS, iframe,
       
  6059 	// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
       
  6060 	// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
       
  6061 	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
       
  6062 	rmargin = /^margin/,
       
  6063 	rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
       
  6064 	rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
       
  6065 	rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
       
  6066 	elemdisplay = { BODY: "block" },
       
  6067 
       
  6068 	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
       
  6069 	cssNormalTransform = {
       
  6070 		letterSpacing: 0,
       
  6071 		fontWeight: 400
       
  6072 	},
       
  6073 
       
  6074 	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
       
  6075 	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
       
  6076 
       
  6077 // return a css property mapped to a potentially vendor prefixed property
       
  6078 function vendorPropName( style, name ) {
       
  6079 
       
  6080 	// shortcut for names that are not vendor prefixed
       
  6081 	if ( name in style ) {
       
  6082 		return name;
       
  6083 	}
       
  6084 
       
  6085 	// check for vendor prefixed names
       
  6086 	var capName = name.charAt(0).toUpperCase() + name.slice(1),
       
  6087 		origName = name,
       
  6088 		i = cssPrefixes.length;
       
  6089 
       
  6090 	while ( i-- ) {
       
  6091 		name = cssPrefixes[ i ] + capName;
       
  6092 		if ( name in style ) {
       
  6093 			return name;
       
  6094 		}
       
  6095 	}
       
  6096 
       
  6097 	return origName;
       
  6098 }
       
  6099 
       
  6100 function isHidden( elem, el ) {
       
  6101 	// isHidden might be called from jQuery#filter function;
       
  6102 	// in that case, element will be second argument
       
  6103 	elem = el || elem;
       
  6104 	return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
       
  6105 }
       
  6106 
       
  6107 // NOTE: we've included the "window" in window.getComputedStyle
       
  6108 // because jsdom on node.js will break without it.
       
  6109 function getStyles( elem ) {
       
  6110 	return window.getComputedStyle( elem, null );
       
  6111 }
       
  6112 
       
  6113 function showHide( elements, show ) {
       
  6114 	var display, elem, hidden,
       
  6115 		values = [],
       
  6116 		index = 0,
       
  6117 		length = elements.length;
       
  6118 
       
  6119 	for ( ; index < length; index++ ) {
       
  6120 		elem = elements[ index ];
       
  6121 		if ( !elem.style ) {
       
  6122 			continue;
       
  6123 		}
       
  6124 
       
  6125 		values[ index ] = data_priv.get( elem, "olddisplay" );
       
  6126 		display = elem.style.display;
       
  6127 		if ( show ) {
       
  6128 			// Reset the inline display of this element to learn if it is
       
  6129 			// being hidden by cascaded rules or not
       
  6130 			if ( !values[ index ] && display === "none" ) {
       
  6131 				elem.style.display = "";
       
  6132 			}
       
  6133 
       
  6134 			// Set elements which have been overridden with display: none
       
  6135 			// in a stylesheet to whatever the default browser style is
       
  6136 			// for such an element
       
  6137 			if ( elem.style.display === "" && isHidden( elem ) ) {
       
  6138 				values[ index ] = data_priv.access( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
       
  6139 			}
       
  6140 		} else {
       
  6141 
       
  6142 			if ( !values[ index ] ) {
       
  6143 				hidden = isHidden( elem );
       
  6144 
       
  6145 				if ( display && display !== "none" || !hidden ) {
       
  6146 					data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css(elem, "display") );
       
  6147 				}
       
  6148 			}
       
  6149 		}
       
  6150 	}
       
  6151 
       
  6152 	// Set the display of most of the elements in a second loop
       
  6153 	// to avoid the constant reflow
       
  6154 	for ( index = 0; index < length; index++ ) {
       
  6155 		elem = elements[ index ];
       
  6156 		if ( !elem.style ) {
       
  6157 			continue;
       
  6158 		}
       
  6159 		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
       
  6160 			elem.style.display = show ? values[ index ] || "" : "none";
       
  6161 		}
       
  6162 	}
       
  6163 
       
  6164 	return elements;
       
  6165 }
       
  6166 
       
  6167 jQuery.fn.extend({
       
  6168 	css: function( name, value ) {
       
  6169 		return jQuery.access( this, function( elem, name, value ) {
       
  6170 			var styles, len,
       
  6171 				map = {},
       
  6172 				i = 0;
       
  6173 
       
  6174 			if ( jQuery.isArray( name ) ) {
       
  6175 				styles = getStyles( elem );
       
  6176 				len = name.length;
       
  6177 
       
  6178 				for ( ; i < len; i++ ) {
       
  6179 					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
       
  6180 				}
       
  6181 
       
  6182 				return map;
       
  6183 			}
       
  6184 
       
  6185 			return value !== undefined ?
       
  6186 				jQuery.style( elem, name, value ) :
       
  6187 				jQuery.css( elem, name );
       
  6188 		}, name, value, arguments.length > 1 );
       
  6189 	},
       
  6190 	show: function() {
       
  6191 		return showHide( this, true );
       
  6192 	},
       
  6193 	hide: function() {
       
  6194 		return showHide( this );
       
  6195 	},
       
  6196 	toggle: function( state ) {
       
  6197 		if ( typeof state === "boolean" ) {
       
  6198 			return state ? this.show() : this.hide();
       
  6199 		}
       
  6200 
       
  6201 		return this.each(function() {
       
  6202 			if ( isHidden( this ) ) {
       
  6203 				jQuery( this ).show();
       
  6204 			} else {
       
  6205 				jQuery( this ).hide();
       
  6206 			}
       
  6207 		});
       
  6208 	}
       
  6209 });
       
  6210 
       
  6211 jQuery.extend({
       
  6212 	// Add in style property hooks for overriding the default
       
  6213 	// behavior of getting and setting a style property
       
  6214 	cssHooks: {
       
  6215 		opacity: {
       
  6216 			get: function( elem, computed ) {
       
  6217 				if ( computed ) {
       
  6218 					// We should always get a number back from opacity
       
  6219 					var ret = curCSS( elem, "opacity" );
       
  6220 					return ret === "" ? "1" : ret;
       
  6221 				}
       
  6222 			}
       
  6223 		}
       
  6224 	},
       
  6225 
       
  6226 	// Don't automatically add "px" to these possibly-unitless properties
       
  6227 	cssNumber: {
       
  6228 		"columnCount": true,
       
  6229 		"fillOpacity": true,
       
  6230 		"fontWeight": true,
       
  6231 		"lineHeight": true,
       
  6232 		"opacity": true,
       
  6233 		"order": true,
       
  6234 		"orphans": true,
       
  6235 		"widows": true,
       
  6236 		"zIndex": true,
       
  6237 		"zoom": true
       
  6238 	},
       
  6239 
       
  6240 	// Add in properties whose names you wish to fix before
       
  6241 	// setting or getting the value
       
  6242 	cssProps: {
       
  6243 		// normalize float css property
       
  6244 		"float": "cssFloat"
       
  6245 	},
       
  6246 
       
  6247 	// Get and set the style property on a DOM Node
       
  6248 	style: function( elem, name, value, extra ) {
       
  6249 		// Don't set styles on text and comment nodes
       
  6250 		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
       
  6251 			return;
       
  6252 		}
       
  6253 
       
  6254 		// Make sure that we're working with the right name
       
  6255 		var ret, type, hooks,
       
  6256 			origName = jQuery.camelCase( name ),
       
  6257 			style = elem.style;
       
  6258 
       
  6259 		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
       
  6260 
       
  6261 		// gets hook for the prefixed version
       
  6262 		// followed by the unprefixed version
       
  6263 		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
       
  6264 
       
  6265 		// Check if we're setting a value
       
  6266 		if ( value !== undefined ) {
       
  6267 			type = typeof value;
       
  6268 
       
  6269 			// convert relative number strings (+= or -=) to relative numbers. #7345
       
  6270 			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
       
  6271 				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
       
  6272 				// Fixes bug #9237
       
  6273 				type = "number";
       
  6274 			}
       
  6275 
       
  6276 			// Make sure that NaN and null values aren't set. See: #7116
       
  6277 			if ( value == null || type === "number" && isNaN( value ) ) {
       
  6278 				return;
       
  6279 			}
       
  6280 
       
  6281 			// If a number was passed in, add 'px' to the (except for certain CSS properties)
       
  6282 			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
       
  6283 				value += "px";
       
  6284 			}
       
  6285 
       
  6286 			// Fixes #8908, it can be done more correctly by specifying setters in cssHooks,
       
  6287 			// but it would mean to define eight (for every problematic property) identical functions
       
  6288 			if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
       
  6289 				style[ name ] = "inherit";
       
  6290 			}
       
  6291 
       
  6292 			// If a hook was provided, use that value, otherwise just set the specified value
       
  6293 			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
       
  6294 				style[ name ] = value;
       
  6295 			}
       
  6296 
       
  6297 		} else {
       
  6298 			// If a hook was provided get the non-computed value from there
       
  6299 			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
       
  6300 				return ret;
       
  6301 			}
       
  6302 
       
  6303 			// Otherwise just get the value from the style object
       
  6304 			return style[ name ];
       
  6305 		}
       
  6306 	},
       
  6307 
       
  6308 	css: function( elem, name, extra, styles ) {
       
  6309 		var val, num, hooks,
       
  6310 			origName = jQuery.camelCase( name );
       
  6311 
       
  6312 		// Make sure that we're working with the right name
       
  6313 		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
       
  6314 
       
  6315 		// gets hook for the prefixed version
       
  6316 		// followed by the unprefixed version
       
  6317 		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
       
  6318 
       
  6319 		// If a hook was provided get the computed value from there
       
  6320 		if ( hooks && "get" in hooks ) {
       
  6321 			val = hooks.get( elem, true, extra );
       
  6322 		}
       
  6323 
       
  6324 		// Otherwise, if a way to get the computed value exists, use that
       
  6325 		if ( val === undefined ) {
       
  6326 			val = curCSS( elem, name, styles );
       
  6327 		}
       
  6328 
       
  6329 		//convert "normal" to computed value
       
  6330 		if ( val === "normal" && name in cssNormalTransform ) {
       
  6331 			val = cssNormalTransform[ name ];
       
  6332 		}
       
  6333 
       
  6334 		// Return, converting to number if forced or a qualifier was provided and val looks numeric
       
  6335 		if ( extra === "" || extra ) {
       
  6336 			num = parseFloat( val );
       
  6337 			return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
       
  6338 		}
       
  6339 		return val;
       
  6340 	}
       
  6341 });
       
  6342 
       
  6343 curCSS = function( elem, name, _computed ) {
       
  6344 	var width, minWidth, maxWidth,
       
  6345 		computed = _computed || getStyles( elem ),
       
  6346 
       
  6347 		// Support: IE9
       
  6348 		// getPropertyValue is only needed for .css('filter') in IE9, see #12537
       
  6349 		ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
       
  6350 		style = elem.style;
       
  6351 
       
  6352 	if ( computed ) {
       
  6353 
       
  6354 		if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
       
  6355 			ret = jQuery.style( elem, name );
       
  6356 		}
       
  6357 
       
  6358 		// Support: Safari 5.1
       
  6359 		// A tribute to the "awesome hack by Dean Edwards"
       
  6360 		// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
       
  6361 		// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
       
  6362 		if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
       
  6363 
       
  6364 			// Remember the original values
       
  6365 			width = style.width;
       
  6366 			minWidth = style.minWidth;
       
  6367 			maxWidth = style.maxWidth;
       
  6368 
       
  6369 			// Put in the new values to get a computed value out
       
  6370 			style.minWidth = style.maxWidth = style.width = ret;
       
  6371 			ret = computed.width;
       
  6372 
       
  6373 			// Revert the changed values
       
  6374 			style.width = width;
       
  6375 			style.minWidth = minWidth;
       
  6376 			style.maxWidth = maxWidth;
       
  6377 		}
       
  6378 	}
       
  6379 
       
  6380 	return ret;
       
  6381 };
       
  6382 
       
  6383 
       
  6384 function setPositiveNumber( elem, value, subtract ) {
       
  6385 	var matches = rnumsplit.exec( value );
       
  6386 	return matches ?
       
  6387 		// Guard against undefined "subtract", e.g., when used as in cssHooks
       
  6388 		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
       
  6389 		value;
       
  6390 }
       
  6391 
       
  6392 function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
       
  6393 	var i = extra === ( isBorderBox ? "border" : "content" ) ?
       
  6394 		// If we already have the right measurement, avoid augmentation
       
  6395 		4 :
       
  6396 		// Otherwise initialize for horizontal or vertical properties
       
  6397 		name === "width" ? 1 : 0,
       
  6398 
       
  6399 		val = 0;
       
  6400 
       
  6401 	for ( ; i < 4; i += 2 ) {
       
  6402 		// both box models exclude margin, so add it if we want it
       
  6403 		if ( extra === "margin" ) {
       
  6404 			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
       
  6405 		}
       
  6406 
       
  6407 		if ( isBorderBox ) {
       
  6408 			// border-box includes padding, so remove it if we want content
       
  6409 			if ( extra === "content" ) {
       
  6410 				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
       
  6411 			}
       
  6412 
       
  6413 			// at this point, extra isn't border nor margin, so remove border
       
  6414 			if ( extra !== "margin" ) {
       
  6415 				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
       
  6416 			}
       
  6417 		} else {
       
  6418 			// at this point, extra isn't content, so add padding
       
  6419 			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
       
  6420 
       
  6421 			// at this point, extra isn't content nor padding, so add border
       
  6422 			if ( extra !== "padding" ) {
       
  6423 				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
       
  6424 			}
       
  6425 		}
       
  6426 	}
       
  6427 
       
  6428 	return val;
       
  6429 }
       
  6430 
       
  6431 function getWidthOrHeight( elem, name, extra ) {
       
  6432 
       
  6433 	// Start with offset property, which is equivalent to the border-box value
       
  6434 	var valueIsBorderBox = true,
       
  6435 		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
       
  6436 		styles = getStyles( elem ),
       
  6437 		isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
       
  6438 
       
  6439 	// some non-html elements return undefined for offsetWidth, so check for null/undefined
       
  6440 	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
       
  6441 	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
       
  6442 	if ( val <= 0 || val == null ) {
       
  6443 		// Fall back to computed then uncomputed css if necessary
       
  6444 		val = curCSS( elem, name, styles );
       
  6445 		if ( val < 0 || val == null ) {
       
  6446 			val = elem.style[ name ];
       
  6447 		}
       
  6448 
       
  6449 		// Computed unit is not pixels. Stop here and return.
       
  6450 		if ( rnumnonpx.test(val) ) {
       
  6451 			return val;
       
  6452 		}
       
  6453 
       
  6454 		// we need the check for style in case a browser which returns unreliable values
       
  6455 		// for getComputedStyle silently falls back to the reliable elem.style
       
  6456 		valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
       
  6457 
       
  6458 		// Normalize "", auto, and prepare for extra
       
  6459 		val = parseFloat( val ) || 0;
       
  6460 	}
       
  6461 
       
  6462 	// use the active box-sizing model to add/subtract irrelevant styles
       
  6463 	return ( val +
       
  6464 		augmentWidthOrHeight(
       
  6465 			elem,
       
  6466 			name,
       
  6467 			extra || ( isBorderBox ? "border" : "content" ),
       
  6468 			valueIsBorderBox,
       
  6469 			styles
       
  6470 		)
       
  6471 	) + "px";
       
  6472 }
       
  6473 
       
  6474 // Try to determine the default display value of an element
       
  6475 function css_defaultDisplay( nodeName ) {
       
  6476 	var doc = document,
       
  6477 		display = elemdisplay[ nodeName ];
       
  6478 
       
  6479 	if ( !display ) {
       
  6480 		display = actualDisplay( nodeName, doc );
       
  6481 
       
  6482 		// If the simple way fails, read from inside an iframe
       
  6483 		if ( display === "none" || !display ) {
       
  6484 			// Use the already-created iframe if possible
       
  6485 			iframe = ( iframe ||
       
  6486 				jQuery("<iframe frameborder='0' width='0' height='0'/>")
       
  6487 				.css( "cssText", "display:block !important" )
       
  6488 			).appendTo( doc.documentElement );
       
  6489 
       
  6490 			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
       
  6491 			doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
       
  6492 			doc.write("<!doctype html><html><body>");
       
  6493 			doc.close();
       
  6494 
       
  6495 			display = actualDisplay( nodeName, doc );
       
  6496 			iframe.detach();
       
  6497 		}
       
  6498 
       
  6499 		// Store the correct default display
       
  6500 		elemdisplay[ nodeName ] = display;
       
  6501 	}
       
  6502 
       
  6503 	return display;
       
  6504 }
       
  6505 
       
  6506 // Called ONLY from within css_defaultDisplay
       
  6507 function actualDisplay( name, doc ) {
       
  6508 	var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
       
  6509 		display = jQuery.css( elem[0], "display" );
       
  6510 	elem.remove();
       
  6511 	return display;
       
  6512 }
       
  6513 
       
  6514 jQuery.each([ "height", "width" ], function( i, name ) {
       
  6515 	jQuery.cssHooks[ name ] = {
       
  6516 		get: function( elem, computed, extra ) {
       
  6517 			if ( computed ) {
       
  6518 				// certain elements can have dimension info if we invisibly show them
       
  6519 				// however, it must have a current display style that would benefit from this
       
  6520 				return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
       
  6521 					jQuery.swap( elem, cssShow, function() {
       
  6522 						return getWidthOrHeight( elem, name, extra );
       
  6523 					}) :
       
  6524 					getWidthOrHeight( elem, name, extra );
       
  6525 			}
       
  6526 		},
       
  6527 
       
  6528 		set: function( elem, value, extra ) {
       
  6529 			var styles = extra && getStyles( elem );
       
  6530 			return setPositiveNumber( elem, value, extra ?
       
  6531 				augmentWidthOrHeight(
       
  6532 					elem,
       
  6533 					name,
       
  6534 					extra,
       
  6535 					jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
       
  6536 					styles
       
  6537 				) : 0
       
  6538 			);
       
  6539 		}
       
  6540 	};
       
  6541 });
       
  6542 
       
  6543 // These hooks cannot be added until DOM ready because the support test
       
  6544 // for it is not run until after DOM ready
       
  6545 jQuery(function() {
       
  6546 	// Support: Android 2.3
       
  6547 	if ( !jQuery.support.reliableMarginRight ) {
       
  6548 		jQuery.cssHooks.marginRight = {
       
  6549 			get: function( elem, computed ) {
       
  6550 				if ( computed ) {
       
  6551 					// Support: Android 2.3
       
  6552 					// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
       
  6553 					// Work around by temporarily setting element display to inline-block
       
  6554 					return jQuery.swap( elem, { "display": "inline-block" },
       
  6555 						curCSS, [ elem, "marginRight" ] );
       
  6556 				}
       
  6557 			}
       
  6558 		};
       
  6559 	}
       
  6560 
       
  6561 	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
       
  6562 	// getComputedStyle returns percent when specified for top/left/bottom/right
       
  6563 	// rather than make the css module depend on the offset module, we just check for it here
       
  6564 	if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
       
  6565 		jQuery.each( [ "top", "left" ], function( i, prop ) {
       
  6566 			jQuery.cssHooks[ prop ] = {
       
  6567 				get: function( elem, computed ) {
       
  6568 					if ( computed ) {
       
  6569 						computed = curCSS( elem, prop );
       
  6570 						// if curCSS returns percentage, fallback to offset
       
  6571 						return rnumnonpx.test( computed ) ?
       
  6572 							jQuery( elem ).position()[ prop ] + "px" :
       
  6573 							computed;
       
  6574 					}
       
  6575 				}
       
  6576 			};
       
  6577 		});
       
  6578 	}
       
  6579 
       
  6580 });
       
  6581 
       
  6582 if ( jQuery.expr && jQuery.expr.filters ) {
       
  6583 	jQuery.expr.filters.hidden = function( elem ) {
       
  6584 		// Support: Opera <= 12.12
       
  6585 		// Opera reports offsetWidths and offsetHeights less than zero on some elements
       
  6586 		return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
       
  6587 	};
       
  6588 
       
  6589 	jQuery.expr.filters.visible = function( elem ) {
       
  6590 		return !jQuery.expr.filters.hidden( elem );
       
  6591 	};
       
  6592 }
       
  6593 
       
  6594 // These hooks are used by animate to expand properties
       
  6595 jQuery.each({
       
  6596 	margin: "",
       
  6597 	padding: "",
       
  6598 	border: "Width"
       
  6599 }, function( prefix, suffix ) {
       
  6600 	jQuery.cssHooks[ prefix + suffix ] = {
       
  6601 		expand: function( value ) {
       
  6602 			var i = 0,
       
  6603 				expanded = {},
       
  6604 
       
  6605 				// assumes a single number if not a string
       
  6606 				parts = typeof value === "string" ? value.split(" ") : [ value ];
       
  6607 
       
  6608 			for ( ; i < 4; i++ ) {
       
  6609 				expanded[ prefix + cssExpand[ i ] + suffix ] =
       
  6610 					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
       
  6611 			}
       
  6612 
       
  6613 			return expanded;
       
  6614 		}
       
  6615 	};
       
  6616 
       
  6617 	if ( !rmargin.test( prefix ) ) {
       
  6618 		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
       
  6619 	}
       
  6620 });
       
  6621 var r20 = /%20/g,
       
  6622 	rbracket = /\[\]$/,
       
  6623 	rCRLF = /\r?\n/g,
       
  6624 	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
       
  6625 	rsubmittable = /^(?:input|select|textarea|keygen)/i;
       
  6626 
       
  6627 jQuery.fn.extend({
       
  6628 	serialize: function() {
       
  6629 		return jQuery.param( this.serializeArray() );
       
  6630 	},
       
  6631 	serializeArray: function() {
       
  6632 		return this.map(function(){
       
  6633 			// Can add propHook for "elements" to filter or add form elements
       
  6634 			var elements = jQuery.prop( this, "elements" );
       
  6635 			return elements ? jQuery.makeArray( elements ) : this;
       
  6636 		})
       
  6637 		.filter(function(){
       
  6638 			var type = this.type;
       
  6639 			// Use .is(":disabled") so that fieldset[disabled] works
       
  6640 			return this.name && !jQuery( this ).is( ":disabled" ) &&
       
  6641 				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
       
  6642 				( this.checked || !manipulation_rcheckableType.test( type ) );
       
  6643 		})
       
  6644 		.map(function( i, elem ){
       
  6645 			var val = jQuery( this ).val();
       
  6646 
       
  6647 			return val == null ?
       
  6648 				null :
       
  6649 				jQuery.isArray( val ) ?
       
  6650 					jQuery.map( val, function( val ){
       
  6651 						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
       
  6652 					}) :
       
  6653 					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
       
  6654 		}).get();
       
  6655 	}
       
  6656 });
       
  6657 
       
  6658 //Serialize an array of form elements or a set of
       
  6659 //key/values into a query string
       
  6660 jQuery.param = function( a, traditional ) {
       
  6661 	var prefix,
       
  6662 		s = [],
       
  6663 		add = function( key, value ) {
       
  6664 			// If value is a function, invoke it and return its value
       
  6665 			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
       
  6666 			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
       
  6667 		};
       
  6668 
       
  6669 	// Set traditional to true for jQuery <= 1.3.2 behavior.
       
  6670 	if ( traditional === undefined ) {
       
  6671 		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
       
  6672 	}
       
  6673 
       
  6674 	// If an array was passed in, assume that it is an array of form elements.
       
  6675 	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
       
  6676 		// Serialize the form elements
       
  6677 		jQuery.each( a, function() {
       
  6678 			add( this.name, this.value );
       
  6679 		});
       
  6680 
       
  6681 	} else {
       
  6682 		// If traditional, encode the "old" way (the way 1.3.2 or older
       
  6683 		// did it), otherwise encode params recursively.
       
  6684 		for ( prefix in a ) {
       
  6685 			buildParams( prefix, a[ prefix ], traditional, add );
       
  6686 		}
       
  6687 	}
       
  6688 
       
  6689 	// Return the resulting serialization
       
  6690 	return s.join( "&" ).replace( r20, "+" );
       
  6691 };
       
  6692 
       
  6693 function buildParams( prefix, obj, traditional, add ) {
       
  6694 	var name;
       
  6695 
       
  6696 	if ( jQuery.isArray( obj ) ) {
       
  6697 		// Serialize array item.
       
  6698 		jQuery.each( obj, function( i, v ) {
       
  6699 			if ( traditional || rbracket.test( prefix ) ) {
       
  6700 				// Treat each array item as a scalar.
       
  6701 				add( prefix, v );
       
  6702 
       
  6703 			} else {
       
  6704 				// Item is non-scalar (array or object), encode its numeric index.
       
  6705 				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
       
  6706 			}
       
  6707 		});
       
  6708 
       
  6709 	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
       
  6710 		// Serialize object item.
       
  6711 		for ( name in obj ) {
       
  6712 			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
       
  6713 		}
       
  6714 
       
  6715 	} else {
       
  6716 		// Serialize scalar item.
       
  6717 		add( prefix, obj );
       
  6718 	}
       
  6719 }
       
  6720 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
  7479 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
  6721 	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
  7480 	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
  6722 	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
  7481 	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
  6723 
  7482 
  6724 	// Handle event binding
  7483 	// Handle event binding
  6747 	undelegate: function( selector, types, fn ) {
  7506 	undelegate: function( selector, types, fn ) {
  6748 		// ( namespace ) or ( selector, types [, fn] )
  7507 		// ( namespace ) or ( selector, types [, fn] )
  6749 		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
  7508 		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
  6750 	}
  7509 	}
  6751 });
  7510 });
       
  7511 
       
  7512 
       
  7513 var nonce = jQuery.now();
       
  7514 
       
  7515 var rquery = (/\?/);
       
  7516 
       
  7517 
       
  7518 
       
  7519 // Support: Android 2.3
       
  7520 // Workaround failure to string-cast null input
       
  7521 jQuery.parseJSON = function( data ) {
       
  7522 	return JSON.parse( data + "" );
       
  7523 };
       
  7524 
       
  7525 
       
  7526 // Cross-browser xml parsing
       
  7527 jQuery.parseXML = function( data ) {
       
  7528 	var xml, tmp;
       
  7529 	if ( !data || typeof data !== "string" ) {
       
  7530 		return null;
       
  7531 	}
       
  7532 
       
  7533 	// Support: IE9
       
  7534 	try {
       
  7535 		tmp = new DOMParser();
       
  7536 		xml = tmp.parseFromString( data, "text/xml" );
       
  7537 	} catch ( e ) {
       
  7538 		xml = undefined;
       
  7539 	}
       
  7540 
       
  7541 	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
       
  7542 		jQuery.error( "Invalid XML: " + data );
       
  7543 	}
       
  7544 	return xml;
       
  7545 };
       
  7546 
       
  7547 
  6752 var
  7548 var
  6753 	// Document location
       
  6754 	ajaxLocParts,
       
  6755 	ajaxLocation,
       
  6756 
       
  6757 	ajax_nonce = jQuery.now(),
       
  6758 
       
  6759 	ajax_rquery = /\?/,
       
  6760 	rhash = /#.*$/,
  7549 	rhash = /#.*$/,
  6761 	rts = /([?&])_=[^&]*/,
  7550 	rts = /([?&])_=[^&]*/,
  6762 	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
  7551 	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
  6763 	// #7653, #8125, #8152: local protocol detection
  7552 	// #7653, #8125, #8152: local protocol detection
  6764 	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
  7553 	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
  6765 	rnoContent = /^(?:GET|HEAD)$/,
  7554 	rnoContent = /^(?:GET|HEAD)$/,
  6766 	rprotocol = /^\/\//,
  7555 	rprotocol = /^\/\//,
  6767 	rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
  7556 	rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
  6768 
       
  6769 	// Keep a copy of the old load method
       
  6770 	_load = jQuery.fn.load,
       
  6771 
  7557 
  6772 	/* Prefilters
  7558 	/* Prefilters
  6773 	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
  7559 	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
  6774 	 * 2) These are called:
  7560 	 * 2) These are called:
  6775 	 *    - BEFORE asking for a transport
  7561 	 *    - BEFORE asking for a transport
  6786 	 * 3) selection will start with transport dataType and THEN go to "*" if needed
  7572 	 * 3) selection will start with transport dataType and THEN go to "*" if needed
  6787 	 */
  7573 	 */
  6788 	transports = {},
  7574 	transports = {},
  6789 
  7575 
  6790 	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
  7576 	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
  6791 	allTypes = "*/".concat("*");
  7577 	allTypes = "*/".concat( "*" ),
  6792 
  7578 
  6793 // #8138, IE may throw an exception when accessing
  7579 	// Document location
  6794 // a field from window.location if document.domain has been set
  7580 	ajaxLocation = window.location.href,
  6795 try {
  7581 
  6796 	ajaxLocation = location.href;
  7582 	// Segment location into parts
  6797 } catch( e ) {
  7583 	ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
  6798 	// Use the href attribute of an A element
       
  6799 	// since IE will modify it given document.location
       
  6800 	ajaxLocation = document.createElement( "a" );
       
  6801 	ajaxLocation.href = "";
       
  6802 	ajaxLocation = ajaxLocation.href;
       
  6803 }
       
  6804 
       
  6805 // Segment location into parts
       
  6806 ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
       
  6807 
  7584 
  6808 // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
  7585 // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
  6809 function addToPrefiltersOrTransports( structure ) {
  7586 function addToPrefiltersOrTransports( structure ) {
  6810 
  7587 
  6811 	// dataTypeExpression is optional and defaults to "*"
  7588 	// dataTypeExpression is optional and defaults to "*"
  6816 			dataTypeExpression = "*";
  7593 			dataTypeExpression = "*";
  6817 		}
  7594 		}
  6818 
  7595 
  6819 		var dataType,
  7596 		var dataType,
  6820 			i = 0,
  7597 			i = 0,
  6821 			dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
  7598 			dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
  6822 
  7599 
  6823 		if ( jQuery.isFunction( func ) ) {
  7600 		if ( jQuery.isFunction( func ) ) {
  6824 			// For each dataType in the dataTypeExpression
  7601 			// For each dataType in the dataTypeExpression
  6825 			while ( (dataType = dataTypes[i++]) ) {
  7602 			while ( (dataType = dataTypes[i++]) ) {
  6826 				// Prepend if requested
  7603 				// Prepend if requested
  6846 	function inspect( dataType ) {
  7623 	function inspect( dataType ) {
  6847 		var selected;
  7624 		var selected;
  6848 		inspected[ dataType ] = true;
  7625 		inspected[ dataType ] = true;
  6849 		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
  7626 		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
  6850 			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
  7627 			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
  6851 			if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
  7628 			if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
  6852 				options.dataTypes.unshift( dataTypeOrTransport );
  7629 				options.dataTypes.unshift( dataTypeOrTransport );
  6853 				inspect( dataTypeOrTransport );
  7630 				inspect( dataTypeOrTransport );
  6854 				return false;
  7631 				return false;
  6855 			} else if ( seekingTransport ) {
  7632 			} else if ( seekingTransport ) {
  6856 				return !( selected = dataTypeOrTransport );
  7633 				return !( selected = dataTypeOrTransport );
  6879 	}
  7656 	}
  6880 
  7657 
  6881 	return target;
  7658 	return target;
  6882 }
  7659 }
  6883 
  7660 
  6884 jQuery.fn.load = function( url, params, callback ) {
  7661 /* Handles responses to an ajax request:
  6885 	if ( typeof url !== "string" && _load ) {
  7662  * - finds the right dataType (mediates between content-type and expected dataType)
  6886 		return _load.apply( this, arguments );
  7663  * - returns the corresponding response
  6887 	}
  7664  */
  6888 
  7665 function ajaxHandleResponses( s, jqXHR, responses ) {
  6889 	var selector, type, response,
  7666 
  6890 		self = this,
  7667 	var ct, type, finalDataType, firstDataType,
  6891 		off = url.indexOf(" ");
  7668 		contents = s.contents,
  6892 
  7669 		dataTypes = s.dataTypes;
  6893 	if ( off >= 0 ) {
  7670 
  6894 		selector = url.slice( off );
  7671 	// Remove auto dataType and get content-type in the process
  6895 		url = url.slice( 0, off );
  7672 	while ( dataTypes[ 0 ] === "*" ) {
  6896 	}
  7673 		dataTypes.shift();
  6897 
  7674 		if ( ct === undefined ) {
  6898 	// If it's a function
  7675 			ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
  6899 	if ( jQuery.isFunction( params ) ) {
  7676 		}
  6900 
  7677 	}
  6901 		// We assume that it's the callback
  7678 
  6902 		callback = params;
  7679 	// Check if we're dealing with a known content-type
  6903 		params = undefined;
  7680 	if ( ct ) {
  6904 
  7681 		for ( type in contents ) {
  6905 	// Otherwise, build a param string
  7682 			if ( contents[ type ] && contents[ type ].test( ct ) ) {
  6906 	} else if ( params && typeof params === "object" ) {
  7683 				dataTypes.unshift( type );
  6907 		type = "POST";
  7684 				break;
  6908 	}
  7685 			}
  6909 
  7686 		}
  6910 	// If we have elements to modify, make the request
  7687 	}
  6911 	if ( self.length > 0 ) {
  7688 
  6912 		jQuery.ajax({
  7689 	// Check to see if we have a response for the expected dataType
  6913 			url: url,
  7690 	if ( dataTypes[ 0 ] in responses ) {
  6914 
  7691 		finalDataType = dataTypes[ 0 ];
  6915 			// if "type" variable is undefined, then "GET" method will be used
  7692 	} else {
  6916 			type: type,
  7693 		// Try convertible dataTypes
  6917 			dataType: "html",
  7694 		for ( type in responses ) {
  6918 			data: params
  7695 			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
  6919 		}).done(function( responseText ) {
  7696 				finalDataType = type;
  6920 
  7697 				break;
  6921 			// Save response for use in complete callback
  7698 			}
  6922 			response = arguments;
  7699 			if ( !firstDataType ) {
  6923 
  7700 				firstDataType = type;
  6924 			self.html( selector ?
  7701 			}
  6925 
  7702 		}
  6926 				// If a selector was specified, locate the right elements in a dummy div
  7703 		// Or just use first one
  6927 				// Exclude scripts to avoid IE 'Permission Denied' errors
  7704 		finalDataType = finalDataType || firstDataType;
  6928 				jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
  7705 	}
  6929 
  7706 
  6930 				// Otherwise use the full result
  7707 	// If we found a dataType
  6931 				responseText );
  7708 	// We add the dataType to the list if needed
  6932 
  7709 	// and return the corresponding response
  6933 		}).complete( callback && function( jqXHR, status ) {
  7710 	if ( finalDataType ) {
  6934 			self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
  7711 		if ( finalDataType !== dataTypes[ 0 ] ) {
  6935 		});
  7712 			dataTypes.unshift( finalDataType );
  6936 	}
  7713 		}
  6937 
  7714 		return responses[ finalDataType ];
  6938 	return this;
  7715 	}
  6939 };
  7716 }
  6940 
  7717 
  6941 // Attach a bunch of functions for handling common AJAX events
  7718 /* Chain conversions given the request and the original response
  6942 jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
  7719  * Also sets the responseXXX fields on the jqXHR instance
  6943 	jQuery.fn[ type ] = function( fn ){
  7720  */
  6944 		return this.on( type, fn );
  7721 function ajaxConvert( s, response, jqXHR, isSuccess ) {
  6945 	};
  7722 	var conv2, current, conv, tmp, prev,
  6946 });
  7723 		converters = {},
       
  7724 		// Work with a copy of dataTypes in case we need to modify it for conversion
       
  7725 		dataTypes = s.dataTypes.slice();
       
  7726 
       
  7727 	// Create converters map with lowercased keys
       
  7728 	if ( dataTypes[ 1 ] ) {
       
  7729 		for ( conv in s.converters ) {
       
  7730 			converters[ conv.toLowerCase() ] = s.converters[ conv ];
       
  7731 		}
       
  7732 	}
       
  7733 
       
  7734 	current = dataTypes.shift();
       
  7735 
       
  7736 	// Convert to each sequential dataType
       
  7737 	while ( current ) {
       
  7738 
       
  7739 		if ( s.responseFields[ current ] ) {
       
  7740 			jqXHR[ s.responseFields[ current ] ] = response;
       
  7741 		}
       
  7742 
       
  7743 		// Apply the dataFilter if provided
       
  7744 		if ( !prev && isSuccess && s.dataFilter ) {
       
  7745 			response = s.dataFilter( response, s.dataType );
       
  7746 		}
       
  7747 
       
  7748 		prev = current;
       
  7749 		current = dataTypes.shift();
       
  7750 
       
  7751 		if ( current ) {
       
  7752 
       
  7753 		// There's only work to do if current dataType is non-auto
       
  7754 			if ( current === "*" ) {
       
  7755 
       
  7756 				current = prev;
       
  7757 
       
  7758 			// Convert response if prev dataType is non-auto and differs from current
       
  7759 			} else if ( prev !== "*" && prev !== current ) {
       
  7760 
       
  7761 				// Seek a direct converter
       
  7762 				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
       
  7763 
       
  7764 				// If none found, seek a pair
       
  7765 				if ( !conv ) {
       
  7766 					for ( conv2 in converters ) {
       
  7767 
       
  7768 						// If conv2 outputs current
       
  7769 						tmp = conv2.split( " " );
       
  7770 						if ( tmp[ 1 ] === current ) {
       
  7771 
       
  7772 							// If prev can be converted to accepted input
       
  7773 							conv = converters[ prev + " " + tmp[ 0 ] ] ||
       
  7774 								converters[ "* " + tmp[ 0 ] ];
       
  7775 							if ( conv ) {
       
  7776 								// Condense equivalence converters
       
  7777 								if ( conv === true ) {
       
  7778 									conv = converters[ conv2 ];
       
  7779 
       
  7780 								// Otherwise, insert the intermediate dataType
       
  7781 								} else if ( converters[ conv2 ] !== true ) {
       
  7782 									current = tmp[ 0 ];
       
  7783 									dataTypes.unshift( tmp[ 1 ] );
       
  7784 								}
       
  7785 								break;
       
  7786 							}
       
  7787 						}
       
  7788 					}
       
  7789 				}
       
  7790 
       
  7791 				// Apply converter (if not an equivalence)
       
  7792 				if ( conv !== true ) {
       
  7793 
       
  7794 					// Unless errors are allowed to bubble, catch and return them
       
  7795 					if ( conv && s[ "throws" ] ) {
       
  7796 						response = conv( response );
       
  7797 					} else {
       
  7798 						try {
       
  7799 							response = conv( response );
       
  7800 						} catch ( e ) {
       
  7801 							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
       
  7802 						}
       
  7803 					}
       
  7804 				}
       
  7805 			}
       
  7806 		}
       
  7807 	}
       
  7808 
       
  7809 	return { state: "success", data: response };
       
  7810 }
  6947 
  7811 
  6948 jQuery.extend({
  7812 jQuery.extend({
  6949 
  7813 
  6950 	// Counter for holding the number of active queries
  7814 	// Counter for holding the number of active queries
  6951 	active: 0,
  7815 	active: 0,
  7167 
  8031 
  7168 		// Alias method option to type as per ticket #12004
  8032 		// Alias method option to type as per ticket #12004
  7169 		s.type = options.method || options.type || s.method || s.type;
  8033 		s.type = options.method || options.type || s.method || s.type;
  7170 
  8034 
  7171 		// Extract dataTypes list
  8035 		// Extract dataTypes list
  7172 		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
  8036 		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
  7173 
  8037 
  7174 		// A cross-domain request is in order when we have a protocol:host:port mismatch
  8038 		// A cross-domain request is in order when we have a protocol:host:port mismatch
  7175 		if ( s.crossDomain == null ) {
  8039 		if ( s.crossDomain == null ) {
  7176 			parts = rurl.exec( s.url.toLowerCase() );
  8040 			parts = rurl.exec( s.url.toLowerCase() );
  7177 			s.crossDomain = !!( parts &&
  8041 			s.crossDomain = !!( parts &&
  7193 		if ( state === 2 ) {
  8057 		if ( state === 2 ) {
  7194 			return jqXHR;
  8058 			return jqXHR;
  7195 		}
  8059 		}
  7196 
  8060 
  7197 		// We can fire global events as of now if asked to
  8061 		// We can fire global events as of now if asked to
  7198 		fireGlobals = s.global;
  8062 		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
       
  8063 		fireGlobals = jQuery.event && s.global;
  7199 
  8064 
  7200 		// Watch for a new set of requests
  8065 		// Watch for a new set of requests
  7201 		if ( fireGlobals && jQuery.active++ === 0 ) {
  8066 		if ( fireGlobals && jQuery.active++ === 0 ) {
  7202 			jQuery.event.trigger("ajaxStart");
  8067 			jQuery.event.trigger("ajaxStart");
  7203 		}
  8068 		}
  7215 		// More options handling for requests with no content
  8080 		// More options handling for requests with no content
  7216 		if ( !s.hasContent ) {
  8081 		if ( !s.hasContent ) {
  7217 
  8082 
  7218 			// If data is available, append data to url
  8083 			// If data is available, append data to url
  7219 			if ( s.data ) {
  8084 			if ( s.data ) {
  7220 				cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
  8085 				cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
  7221 				// #9682: remove data so that it's not used in an eventual retry
  8086 				// #9682: remove data so that it's not used in an eventual retry
  7222 				delete s.data;
  8087 				delete s.data;
  7223 			}
  8088 			}
  7224 
  8089 
  7225 			// Add anti-cache in url if needed
  8090 			// Add anti-cache in url if needed
  7226 			if ( s.cache === false ) {
  8091 			if ( s.cache === false ) {
  7227 				s.url = rts.test( cacheURL ) ?
  8092 				s.url = rts.test( cacheURL ) ?
  7228 
  8093 
  7229 					// If there is already a '_' parameter, set its value
  8094 					// If there is already a '_' parameter, set its value
  7230 					cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
  8095 					cacheURL.replace( rts, "$1_=" + nonce++ ) :
  7231 
  8096 
  7232 					// Otherwise add one to the end
  8097 					// Otherwise add one to the end
  7233 					cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
  8098 					cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
  7234 			}
  8099 			}
  7235 		}
  8100 		}
  7236 
  8101 
  7237 		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
  8102 		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
  7238 		if ( s.ifModified ) {
  8103 		if ( s.ifModified ) {
  7266 		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
  8131 		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
  7267 			// Abort if not done already and return
  8132 			// Abort if not done already and return
  7268 			return jqXHR.abort();
  8133 			return jqXHR.abort();
  7269 		}
  8134 		}
  7270 
  8135 
  7271 		// aborting is no longer a cancellation
  8136 		// Aborting is no longer a cancellation
  7272 		strAbort = "abort";
  8137 		strAbort = "abort";
  7273 
  8138 
  7274 		// Install callbacks on deferreds
  8139 		// Install callbacks on deferreds
  7275 		for ( i in { success: 1, error: 1, complete: 1 } ) {
  8140 		for ( i in { success: 1, error: 1, complete: 1 } ) {
  7276 			jqXHR[ i ]( s[ i ] );
  8141 			jqXHR[ i ]( s[ i ] );
  7378 					success = response.data;
  8243 					success = response.data;
  7379 					error = response.error;
  8244 					error = response.error;
  7380 					isSuccess = !error;
  8245 					isSuccess = !error;
  7381 				}
  8246 				}
  7382 			} else {
  8247 			} else {
  7383 				// We extract error from statusText
  8248 				// Extract error from statusText and normalize for non-aborts
  7384 				// then normalize statusText and status for non-aborts
       
  7385 				error = statusText;
  8249 				error = statusText;
  7386 				if ( status || !statusText ) {
  8250 				if ( status || !statusText ) {
  7387 					statusText = "error";
  8251 					statusText = "error";
  7388 					if ( status < 0 ) {
  8252 					if ( status < 0 ) {
  7389 						status = 0;
  8253 						status = 0;
  7435 	}
  8299 	}
  7436 });
  8300 });
  7437 
  8301 
  7438 jQuery.each( [ "get", "post" ], function( i, method ) {
  8302 jQuery.each( [ "get", "post" ], function( i, method ) {
  7439 	jQuery[ method ] = function( url, data, callback, type ) {
  8303 	jQuery[ method ] = function( url, data, callback, type ) {
  7440 		// shift arguments if data argument was omitted
  8304 		// Shift arguments if data argument was omitted
  7441 		if ( jQuery.isFunction( data ) ) {
  8305 		if ( jQuery.isFunction( data ) ) {
  7442 			type = type || callback;
  8306 			type = type || callback;
  7443 			callback = data;
  8307 			callback = data;
  7444 			data = undefined;
  8308 			data = undefined;
  7445 		}
  8309 		}
  7452 			success: callback
  8316 			success: callback
  7453 		});
  8317 		});
  7454 	};
  8318 	};
  7455 });
  8319 });
  7456 
  8320 
  7457 /* Handles responses to an ajax request:
  8321 
  7458  * - finds the right dataType (mediates between content-type and expected dataType)
  8322 jQuery._evalUrl = function( url ) {
  7459  * - returns the corresponding response
  8323 	return jQuery.ajax({
  7460  */
  8324 		url: url,
  7461 function ajaxHandleResponses( s, jqXHR, responses ) {
  8325 		type: "GET",
  7462 
  8326 		dataType: "script",
  7463 	var ct, type, finalDataType, firstDataType,
  8327 		async: false,
  7464 		contents = s.contents,
  8328 		global: false,
  7465 		dataTypes = s.dataTypes;
  8329 		"throws": true
  7466 
  8330 	});
  7467 	// Remove auto dataType and get content-type in the process
  8331 };
  7468 	while( dataTypes[ 0 ] === "*" ) {
  8332 
  7469 		dataTypes.shift();
  8333 
  7470 		if ( ct === undefined ) {
  8334 jQuery.fn.extend({
  7471 			ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
  8335 	wrapAll: function( html ) {
  7472 		}
  8336 		var wrap;
  7473 	}
  8337 
  7474 
  8338 		if ( jQuery.isFunction( html ) ) {
  7475 	// Check if we're dealing with a known content-type
  8339 			return this.each(function( i ) {
  7476 	if ( ct ) {
  8340 				jQuery( this ).wrapAll( html.call(this, i) );
  7477 		for ( type in contents ) {
  8341 			});
  7478 			if ( contents[ type ] && contents[ type ].test( ct ) ) {
  8342 		}
  7479 				dataTypes.unshift( type );
  8343 
  7480 				break;
  8344 		if ( this[ 0 ] ) {
  7481 			}
  8345 
  7482 		}
  8346 			// The elements to wrap the target around
  7483 	}
  8347 			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
  7484 
  8348 
  7485 	// Check to see if we have a response for the expected dataType
  8349 			if ( this[ 0 ].parentNode ) {
  7486 	if ( dataTypes[ 0 ] in responses ) {
  8350 				wrap.insertBefore( this[ 0 ] );
  7487 		finalDataType = dataTypes[ 0 ];
  8351 			}
       
  8352 
       
  8353 			wrap.map(function() {
       
  8354 				var elem = this;
       
  8355 
       
  8356 				while ( elem.firstElementChild ) {
       
  8357 					elem = elem.firstElementChild;
       
  8358 				}
       
  8359 
       
  8360 				return elem;
       
  8361 			}).append( this );
       
  8362 		}
       
  8363 
       
  8364 		return this;
       
  8365 	},
       
  8366 
       
  8367 	wrapInner: function( html ) {
       
  8368 		if ( jQuery.isFunction( html ) ) {
       
  8369 			return this.each(function( i ) {
       
  8370 				jQuery( this ).wrapInner( html.call(this, i) );
       
  8371 			});
       
  8372 		}
       
  8373 
       
  8374 		return this.each(function() {
       
  8375 			var self = jQuery( this ),
       
  8376 				contents = self.contents();
       
  8377 
       
  8378 			if ( contents.length ) {
       
  8379 				contents.wrapAll( html );
       
  8380 
       
  8381 			} else {
       
  8382 				self.append( html );
       
  8383 			}
       
  8384 		});
       
  8385 	},
       
  8386 
       
  8387 	wrap: function( html ) {
       
  8388 		var isFunction = jQuery.isFunction( html );
       
  8389 
       
  8390 		return this.each(function( i ) {
       
  8391 			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
       
  8392 		});
       
  8393 	},
       
  8394 
       
  8395 	unwrap: function() {
       
  8396 		return this.parent().each(function() {
       
  8397 			if ( !jQuery.nodeName( this, "body" ) ) {
       
  8398 				jQuery( this ).replaceWith( this.childNodes );
       
  8399 			}
       
  8400 		}).end();
       
  8401 	}
       
  8402 });
       
  8403 
       
  8404 
       
  8405 jQuery.expr.filters.hidden = function( elem ) {
       
  8406 	// Support: Opera <= 12.12
       
  8407 	// Opera reports offsetWidths and offsetHeights less than zero on some elements
       
  8408 	return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
       
  8409 };
       
  8410 jQuery.expr.filters.visible = function( elem ) {
       
  8411 	return !jQuery.expr.filters.hidden( elem );
       
  8412 };
       
  8413 
       
  8414 
       
  8415 
       
  8416 
       
  8417 var r20 = /%20/g,
       
  8418 	rbracket = /\[\]$/,
       
  8419 	rCRLF = /\r?\n/g,
       
  8420 	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
       
  8421 	rsubmittable = /^(?:input|select|textarea|keygen)/i;
       
  8422 
       
  8423 function buildParams( prefix, obj, traditional, add ) {
       
  8424 	var name;
       
  8425 
       
  8426 	if ( jQuery.isArray( obj ) ) {
       
  8427 		// Serialize array item.
       
  8428 		jQuery.each( obj, function( i, v ) {
       
  8429 			if ( traditional || rbracket.test( prefix ) ) {
       
  8430 				// Treat each array item as a scalar.
       
  8431 				add( prefix, v );
       
  8432 
       
  8433 			} else {
       
  8434 				// Item is non-scalar (array or object), encode its numeric index.
       
  8435 				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
       
  8436 			}
       
  8437 		});
       
  8438 
       
  8439 	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
       
  8440 		// Serialize object item.
       
  8441 		for ( name in obj ) {
       
  8442 			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
       
  8443 		}
       
  8444 
  7488 	} else {
  8445 	} else {
  7489 		// Try convertible dataTypes
  8446 		// Serialize scalar item.
  7490 		for ( type in responses ) {
  8447 		add( prefix, obj );
  7491 			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
       
  7492 				finalDataType = type;
       
  7493 				break;
       
  7494 			}
       
  7495 			if ( !firstDataType ) {
       
  7496 				firstDataType = type;
       
  7497 			}
       
  7498 		}
       
  7499 		// Or just use first one
       
  7500 		finalDataType = finalDataType || firstDataType;
       
  7501 	}
       
  7502 
       
  7503 	// If we found a dataType
       
  7504 	// We add the dataType to the list if needed
       
  7505 	// and return the corresponding response
       
  7506 	if ( finalDataType ) {
       
  7507 		if ( finalDataType !== dataTypes[ 0 ] ) {
       
  7508 			dataTypes.unshift( finalDataType );
       
  7509 		}
       
  7510 		return responses[ finalDataType ];
       
  7511 	}
  8448 	}
  7512 }
  8449 }
  7513 
  8450 
  7514 /* Chain conversions given the request and the original response
  8451 // Serialize an array of form elements or a set of
  7515  * Also sets the responseXXX fields on the jqXHR instance
  8452 // key/values into a query string
  7516  */
  8453 jQuery.param = function( a, traditional ) {
  7517 function ajaxConvert( s, response, jqXHR, isSuccess ) {
  8454 	var prefix,
  7518 	var conv2, current, conv, tmp, prev,
  8455 		s = [],
  7519 		converters = {},
  8456 		add = function( key, value ) {
  7520 		// Work with a copy of dataTypes in case we need to modify it for conversion
  8457 			// If value is a function, invoke it and return its value
  7521 		dataTypes = s.dataTypes.slice();
  8458 			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
  7522 
  8459 			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
  7523 	// Create converters map with lowercased keys
  8460 		};
  7524 	if ( dataTypes[ 1 ] ) {
  8461 
  7525 		for ( conv in s.converters ) {
  8462 	// Set traditional to true for jQuery <= 1.3.2 behavior.
  7526 			converters[ conv.toLowerCase() ] = s.converters[ conv ];
  8463 	if ( traditional === undefined ) {
  7527 		}
  8464 		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
  7528 	}
  8465 	}
  7529 
  8466 
  7530 	current = dataTypes.shift();
  8467 	// If an array was passed in, assume that it is an array of form elements.
  7531 
  8468 	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
  7532 	// Convert to each sequential dataType
  8469 		// Serialize the form elements
  7533 	while ( current ) {
  8470 		jQuery.each( a, function() {
  7534 
  8471 			add( this.name, this.value );
  7535 		if ( s.responseFields[ current ] ) {
  8472 		});
  7536 			jqXHR[ s.responseFields[ current ] ] = response;
  8473 
  7537 		}
  8474 	} else {
  7538 
  8475 		// If traditional, encode the "old" way (the way 1.3.2 or older
  7539 		// Apply the dataFilter if provided
  8476 		// did it), otherwise encode params recursively.
  7540 		if ( !prev && isSuccess && s.dataFilter ) {
  8477 		for ( prefix in a ) {
  7541 			response = s.dataFilter( response, s.dataType );
  8478 			buildParams( prefix, a[ prefix ], traditional, add );
  7542 		}
  8479 		}
  7543 
  8480 	}
  7544 		prev = current;
  8481 
  7545 		current = dataTypes.shift();
  8482 	// Return the resulting serialization
  7546 
  8483 	return s.join( "&" ).replace( r20, "+" );
  7547 		if ( current ) {
  8484 };
  7548 
  8485 
  7549 		// There's only work to do if current dataType is non-auto
  8486 jQuery.fn.extend({
  7550 			if ( current === "*" ) {
  8487 	serialize: function() {
  7551 
  8488 		return jQuery.param( this.serializeArray() );
  7552 				current = prev;
  8489 	},
  7553 
  8490 	serializeArray: function() {
  7554 			// Convert response if prev dataType is non-auto and differs from current
  8491 		return this.map(function() {
  7555 			} else if ( prev !== "*" && prev !== current ) {
  8492 			// Can add propHook for "elements" to filter or add form elements
  7556 
  8493 			var elements = jQuery.prop( this, "elements" );
  7557 				// Seek a direct converter
  8494 			return elements ? jQuery.makeArray( elements ) : this;
  7558 				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
  8495 		})
  7559 
  8496 		.filter(function() {
  7560 				// If none found, seek a pair
  8497 			var type = this.type;
  7561 				if ( !conv ) {
  8498 
  7562 					for ( conv2 in converters ) {
  8499 			// Use .is( ":disabled" ) so that fieldset[disabled] works
  7563 
  8500 			return this.name && !jQuery( this ).is( ":disabled" ) &&
  7564 						// If conv2 outputs current
  8501 				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
  7565 						tmp = conv2.split( " " );
  8502 				( this.checked || !rcheckableType.test( type ) );
  7566 						if ( tmp[ 1 ] === current ) {
  8503 		})
  7567 
  8504 		.map(function( i, elem ) {
  7568 							// If prev can be converted to accepted input
  8505 			var val = jQuery( this ).val();
  7569 							conv = converters[ prev + " " + tmp[ 0 ] ] ||
  8506 
  7570 								converters[ "* " + tmp[ 0 ] ];
  8507 			return val == null ?
  7571 							if ( conv ) {
  8508 				null :
  7572 								// Condense equivalence converters
  8509 				jQuery.isArray( val ) ?
  7573 								if ( conv === true ) {
  8510 					jQuery.map( val, function( val ) {
  7574 									conv = converters[ conv2 ];
  8511 						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
  7575 
  8512 					}) :
  7576 								// Otherwise, insert the intermediate dataType
  8513 					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
  7577 								} else if ( converters[ conv2 ] !== true ) {
  8514 		}).get();
  7578 									current = tmp[ 0 ];
  8515 	}
  7579 									dataTypes.unshift( tmp[ 1 ] );
  8516 });
  7580 								}
  8517 
  7581 								break;
  8518 
       
  8519 jQuery.ajaxSettings.xhr = function() {
       
  8520 	try {
       
  8521 		return new XMLHttpRequest();
       
  8522 	} catch( e ) {}
       
  8523 };
       
  8524 
       
  8525 var xhrId = 0,
       
  8526 	xhrCallbacks = {},
       
  8527 	xhrSuccessStatus = {
       
  8528 		// file protocol always yields status code 0, assume 200
       
  8529 		0: 200,
       
  8530 		// Support: IE9
       
  8531 		// #1450: sometimes IE returns 1223 when it should be 204
       
  8532 		1223: 204
       
  8533 	},
       
  8534 	xhrSupported = jQuery.ajaxSettings.xhr();
       
  8535 
       
  8536 // Support: IE9
       
  8537 // Open requests must be manually aborted on unload (#5280)
       
  8538 // See https://support.microsoft.com/kb/2856746 for more info
       
  8539 if ( window.attachEvent ) {
       
  8540 	window.attachEvent( "onunload", function() {
       
  8541 		for ( var key in xhrCallbacks ) {
       
  8542 			xhrCallbacks[ key ]();
       
  8543 		}
       
  8544 	});
       
  8545 }
       
  8546 
       
  8547 support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
       
  8548 support.ajax = xhrSupported = !!xhrSupported;
       
  8549 
       
  8550 jQuery.ajaxTransport(function( options ) {
       
  8551 	var callback;
       
  8552 
       
  8553 	// Cross domain only allowed if supported through XMLHttpRequest
       
  8554 	if ( support.cors || xhrSupported && !options.crossDomain ) {
       
  8555 		return {
       
  8556 			send: function( headers, complete ) {
       
  8557 				var i,
       
  8558 					xhr = options.xhr(),
       
  8559 					id = ++xhrId;
       
  8560 
       
  8561 				xhr.open( options.type, options.url, options.async, options.username, options.password );
       
  8562 
       
  8563 				// Apply custom fields if provided
       
  8564 				if ( options.xhrFields ) {
       
  8565 					for ( i in options.xhrFields ) {
       
  8566 						xhr[ i ] = options.xhrFields[ i ];
       
  8567 					}
       
  8568 				}
       
  8569 
       
  8570 				// Override mime type if needed
       
  8571 				if ( options.mimeType && xhr.overrideMimeType ) {
       
  8572 					xhr.overrideMimeType( options.mimeType );
       
  8573 				}
       
  8574 
       
  8575 				// X-Requested-With header
       
  8576 				// For cross-domain requests, seeing as conditions for a preflight are
       
  8577 				// akin to a jigsaw puzzle, we simply never set it to be sure.
       
  8578 				// (it can always be set on a per-request basis or even using ajaxSetup)
       
  8579 				// For same-domain requests, won't change header if already provided.
       
  8580 				if ( !options.crossDomain && !headers["X-Requested-With"] ) {
       
  8581 					headers["X-Requested-With"] = "XMLHttpRequest";
       
  8582 				}
       
  8583 
       
  8584 				// Set headers
       
  8585 				for ( i in headers ) {
       
  8586 					xhr.setRequestHeader( i, headers[ i ] );
       
  8587 				}
       
  8588 
       
  8589 				// Callback
       
  8590 				callback = function( type ) {
       
  8591 					return function() {
       
  8592 						if ( callback ) {
       
  8593 							delete xhrCallbacks[ id ];
       
  8594 							callback = xhr.onload = xhr.onerror = null;
       
  8595 
       
  8596 							if ( type === "abort" ) {
       
  8597 								xhr.abort();
       
  8598 							} else if ( type === "error" ) {
       
  8599 								complete(
       
  8600 									// file: protocol always yields status 0; see #8605, #14207
       
  8601 									xhr.status,
       
  8602 									xhr.statusText
       
  8603 								);
       
  8604 							} else {
       
  8605 								complete(
       
  8606 									xhrSuccessStatus[ xhr.status ] || xhr.status,
       
  8607 									xhr.statusText,
       
  8608 									// Support: IE9
       
  8609 									// Accessing binary-data responseText throws an exception
       
  8610 									// (#11426)
       
  8611 									typeof xhr.responseText === "string" ? {
       
  8612 										text: xhr.responseText
       
  8613 									} : undefined,
       
  8614 									xhr.getAllResponseHeaders()
       
  8615 								);
  7582 							}
  8616 							}
  7583 						}
  8617 						}
       
  8618 					};
       
  8619 				};
       
  8620 
       
  8621 				// Listen to events
       
  8622 				xhr.onload = callback();
       
  8623 				xhr.onerror = callback("error");
       
  8624 
       
  8625 				// Create the abort callback
       
  8626 				callback = xhrCallbacks[ id ] = callback("abort");
       
  8627 
       
  8628 				try {
       
  8629 					// Do send the request (this may raise an exception)
       
  8630 					xhr.send( options.hasContent && options.data || null );
       
  8631 				} catch ( e ) {
       
  8632 					// #14683: Only rethrow if this hasn't been notified as an error yet
       
  8633 					if ( callback ) {
       
  8634 						throw e;
  7584 					}
  8635 					}
  7585 				}
  8636 				}
  7586 
  8637 			},
  7587 				// Apply converter (if not an equivalence)
  8638 
  7588 				if ( conv !== true ) {
  8639 			abort: function() {
  7589 
  8640 				if ( callback ) {
  7590 					// Unless errors are allowed to bubble, catch and return them
  8641 					callback();
  7591 					if ( conv && s[ "throws" ] ) {
  8642 				}
  7592 						response = conv( response );
  8643 			}
  7593 					} else {
  8644 		};
  7594 						try {
  8645 	}
  7595 							response = conv( response );
  8646 });
  7596 						} catch ( e ) {
  8647 
  7597 							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
  8648 
  7598 						}
  8649 
  7599 					}
  8650 
  7600 				}
       
  7601 			}
       
  7602 		}
       
  7603 	}
       
  7604 
       
  7605 	return { state: "success", data: response };
       
  7606 }
       
  7607 // Install script dataType
  8651 // Install script dataType
  7608 jQuery.ajaxSetup({
  8652 jQuery.ajaxSetup({
  7609 	accepts: {
  8653 	accepts: {
  7610 		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
  8654 		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
  7611 	},
  8655 	},
  7659 				}
  8703 				}
  7660 			}
  8704 			}
  7661 		};
  8705 		};
  7662 	}
  8706 	}
  7663 });
  8707 });
       
  8708 
       
  8709 
       
  8710 
       
  8711 
  7664 var oldCallbacks = [],
  8712 var oldCallbacks = [],
  7665 	rjsonp = /(=)\?(?=&|$)|\?\?/;
  8713 	rjsonp = /(=)\?(?=&|$)|\?\?/;
  7666 
  8714 
  7667 // Default jsonp settings
  8715 // Default jsonp settings
  7668 jQuery.ajaxSetup({
  8716 jQuery.ajaxSetup({
  7669 	jsonp: "callback",
  8717 	jsonp: "callback",
  7670 	jsonpCallback: function() {
  8718 	jsonpCallback: function() {
  7671 		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
  8719 		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
  7672 		this[ callback ] = true;
  8720 		this[ callback ] = true;
  7673 		return callback;
  8721 		return callback;
  7674 	}
  8722 	}
  7675 });
  8723 });
  7676 
  8724 
  7693 
  8741 
  7694 		// Insert callback into url or form data
  8742 		// Insert callback into url or form data
  7695 		if ( jsonProp ) {
  8743 		if ( jsonProp ) {
  7696 			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
  8744 			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
  7697 		} else if ( s.jsonp !== false ) {
  8745 		} else if ( s.jsonp !== false ) {
  7698 			s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
  8746 			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
  7699 		}
  8747 		}
  7700 
  8748 
  7701 		// Use data converter to retrieve json after script execution
  8749 		// Use data converter to retrieve json after script execution
  7702 		s.converters["script json"] = function() {
  8750 		s.converters["script json"] = function() {
  7703 			if ( !responseContainer ) {
  8751 			if ( !responseContainer ) {
  7739 
  8787 
  7740 		// Delegate to script
  8788 		// Delegate to script
  7741 		return "script";
  8789 		return "script";
  7742 	}
  8790 	}
  7743 });
  8791 });
  7744 jQuery.ajaxSettings.xhr = function() {
  8792 
  7745 	try {
  8793 
  7746 		return new XMLHttpRequest();
  8794 
  7747 	} catch( e ) {}
  8795 
       
  8796 // data: string of html
       
  8797 // context (optional): If specified, the fragment will be created in this context, defaults to document
       
  8798 // keepScripts (optional): If true, will include scripts passed in the html string
       
  8799 jQuery.parseHTML = function( data, context, keepScripts ) {
       
  8800 	if ( !data || typeof data !== "string" ) {
       
  8801 		return null;
       
  8802 	}
       
  8803 	if ( typeof context === "boolean" ) {
       
  8804 		keepScripts = context;
       
  8805 		context = false;
       
  8806 	}
       
  8807 	context = context || document;
       
  8808 
       
  8809 	var parsed = rsingleTag.exec( data ),
       
  8810 		scripts = !keepScripts && [];
       
  8811 
       
  8812 	// Single tag
       
  8813 	if ( parsed ) {
       
  8814 		return [ context.createElement( parsed[1] ) ];
       
  8815 	}
       
  8816 
       
  8817 	parsed = jQuery.buildFragment( [ data ], context, scripts );
       
  8818 
       
  8819 	if ( scripts && scripts.length ) {
       
  8820 		jQuery( scripts ).remove();
       
  8821 	}
       
  8822 
       
  8823 	return jQuery.merge( [], parsed.childNodes );
  7748 };
  8824 };
  7749 
  8825 
  7750 var xhrSupported = jQuery.ajaxSettings.xhr(),
  8826 
  7751 	xhrSuccessStatus = {
  8827 // Keep a copy of the old load method
  7752 		// file protocol always yields status code 0, assume 200
  8828 var _load = jQuery.fn.load;
  7753 		0: 200,
  8829 
  7754 		// Support: IE9
  8830 /**
  7755 		// #1450: sometimes IE returns 1223 when it should be 204
  8831  * Load a url into a page
  7756 		1223: 204
  8832  */
  7757 	},
  8833 jQuery.fn.load = function( url, params, callback ) {
  7758 	// Support: IE9
  8834 	if ( typeof url !== "string" && _load ) {
  7759 	// We need to keep track of outbound xhr and abort them manually
  8835 		return _load.apply( this, arguments );
  7760 	// because IE is not smart enough to do it all by itself
  8836 	}
  7761 	xhrId = 0,
  8837 
  7762 	xhrCallbacks = {};
  8838 	var selector, type, response,
  7763 
  8839 		self = this,
  7764 if ( window.ActiveXObject ) {
  8840 		off = url.indexOf(" ");
  7765 	jQuery( window ).on( "unload", function() {
  8841 
  7766 		for( var key in xhrCallbacks ) {
  8842 	if ( off >= 0 ) {
  7767 			xhrCallbacks[ key ]();
  8843 		selector = jQuery.trim( url.slice( off ) );
  7768 		}
  8844 		url = url.slice( 0, off );
  7769 		xhrCallbacks = undefined;
  8845 	}
  7770 	});
  8846 
  7771 }
  8847 	// If it's a function
  7772 
  8848 	if ( jQuery.isFunction( params ) ) {
  7773 jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
  8849 
  7774 jQuery.support.ajax = xhrSupported = !!xhrSupported;
  8850 		// We assume that it's the callback
  7775 
  8851 		callback = params;
  7776 jQuery.ajaxTransport(function( options ) {
  8852 		params = undefined;
  7777 	var callback;
  8853 
  7778 	// Cross domain only allowed if supported through XMLHttpRequest
  8854 	// Otherwise, build a param string
  7779 	if ( jQuery.support.cors || xhrSupported && !options.crossDomain ) {
  8855 	} else if ( params && typeof params === "object" ) {
  7780 		return {
  8856 		type = "POST";
  7781 			send: function( headers, complete ) {
  8857 	}
  7782 				var i, id,
  8858 
  7783 					xhr = options.xhr();
  8859 	// If we have elements to modify, make the request
  7784 				xhr.open( options.type, options.url, options.async, options.username, options.password );
  8860 	if ( self.length > 0 ) {
  7785 				// Apply custom fields if provided
  8861 		jQuery.ajax({
  7786 				if ( options.xhrFields ) {
  8862 			url: url,
  7787 					for ( i in options.xhrFields ) {
  8863 
  7788 						xhr[ i ] = options.xhrFields[ i ];
  8864 			// if "type" variable is undefined, then "GET" method will be used
  7789 					}
  8865 			type: type,
  7790 				}
  8866 			dataType: "html",
  7791 				// Override mime type if needed
  8867 			data: params
  7792 				if ( options.mimeType && xhr.overrideMimeType ) {
  8868 		}).done(function( responseText ) {
  7793 					xhr.overrideMimeType( options.mimeType );
  8869 
  7794 				}
  8870 			// Save response for use in complete callback
  7795 				// X-Requested-With header
  8871 			response = arguments;
  7796 				// For cross-domain requests, seeing as conditions for a preflight are
  8872 
  7797 				// akin to a jigsaw puzzle, we simply never set it to be sure.
  8873 			self.html( selector ?
  7798 				// (it can always be set on a per-request basis or even using ajaxSetup)
  8874 
  7799 				// For same-domain requests, won't change header if already provided.
  8875 				// If a selector was specified, locate the right elements in a dummy div
  7800 				if ( !options.crossDomain && !headers["X-Requested-With"] ) {
  8876 				// Exclude scripts to avoid IE 'Permission Denied' errors
  7801 					headers["X-Requested-With"] = "XMLHttpRequest";
  8877 				jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
  7802 				}
  8878 
  7803 				// Set headers
  8879 				// Otherwise use the full result
  7804 				for ( i in headers ) {
  8880 				responseText );
  7805 					xhr.setRequestHeader( i, headers[ i ] );
  8881 
  7806 				}
  8882 		}).complete( callback && function( jqXHR, status ) {
  7807 				// Callback
  8883 			self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
  7808 				callback = function( type ) {
       
  7809 					return function() {
       
  7810 						if ( callback ) {
       
  7811 							delete xhrCallbacks[ id ];
       
  7812 							callback = xhr.onload = xhr.onerror = null;
       
  7813 							if ( type === "abort" ) {
       
  7814 								xhr.abort();
       
  7815 							} else if ( type === "error" ) {
       
  7816 								complete(
       
  7817 									// file protocol always yields status 0, assume 404
       
  7818 									xhr.status || 404,
       
  7819 									xhr.statusText
       
  7820 								);
       
  7821 							} else {
       
  7822 								complete(
       
  7823 									xhrSuccessStatus[ xhr.status ] || xhr.status,
       
  7824 									xhr.statusText,
       
  7825 									// Support: IE9
       
  7826 									// #11426: When requesting binary data, IE9 will throw an exception
       
  7827 									// on any attempt to access responseText
       
  7828 									typeof xhr.responseText === "string" ? {
       
  7829 										text: xhr.responseText
       
  7830 									} : undefined,
       
  7831 									xhr.getAllResponseHeaders()
       
  7832 								);
       
  7833 							}
       
  7834 						}
       
  7835 					};
       
  7836 				};
       
  7837 				// Listen to events
       
  7838 				xhr.onload = callback();
       
  7839 				xhr.onerror = callback("error");
       
  7840 				// Create the abort callback
       
  7841 				callback = xhrCallbacks[( id = xhrId++ )] = callback("abort");
       
  7842 				// Do send the request
       
  7843 				// This may raise an exception which is actually
       
  7844 				// handled in jQuery.ajax (so no try/catch here)
       
  7845 				xhr.send( options.hasContent && options.data || null );
       
  7846 			},
       
  7847 			abort: function() {
       
  7848 				if ( callback ) {
       
  7849 					callback();
       
  7850 				}
       
  7851 			}
       
  7852 		};
       
  7853 	}
       
  7854 });
       
  7855 var fxNow, timerId,
       
  7856 	rfxtypes = /^(?:toggle|show|hide)$/,
       
  7857 	rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
       
  7858 	rrun = /queueHooks$/,
       
  7859 	animationPrefilters = [ defaultPrefilter ],
       
  7860 	tweeners = {
       
  7861 		"*": [function( prop, value ) {
       
  7862 			var tween = this.createTween( prop, value ),
       
  7863 				target = tween.cur(),
       
  7864 				parts = rfxnum.exec( value ),
       
  7865 				unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
       
  7866 
       
  7867 				// Starting value computation is required for potential unit mismatches
       
  7868 				start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
       
  7869 					rfxnum.exec( jQuery.css( tween.elem, prop ) ),
       
  7870 				scale = 1,
       
  7871 				maxIterations = 20;
       
  7872 
       
  7873 			if ( start && start[ 3 ] !== unit ) {
       
  7874 				// Trust units reported by jQuery.css
       
  7875 				unit = unit || start[ 3 ];
       
  7876 
       
  7877 				// Make sure we update the tween properties later on
       
  7878 				parts = parts || [];
       
  7879 
       
  7880 				// Iteratively approximate from a nonzero starting point
       
  7881 				start = +target || 1;
       
  7882 
       
  7883 				do {
       
  7884 					// If previous iteration zeroed out, double until we get *something*
       
  7885 					// Use a string for doubling factor so we don't accidentally see scale as unchanged below
       
  7886 					scale = scale || ".5";
       
  7887 
       
  7888 					// Adjust and apply
       
  7889 					start = start / scale;
       
  7890 					jQuery.style( tween.elem, prop, start + unit );
       
  7891 
       
  7892 				// Update scale, tolerating zero or NaN from tween.cur()
       
  7893 				// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
       
  7894 				} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
       
  7895 			}
       
  7896 
       
  7897 			// Update tween properties
       
  7898 			if ( parts ) {
       
  7899 				start = tween.start = +start || +target || 0;
       
  7900 				tween.unit = unit;
       
  7901 				// If a +=/-= token was provided, we're doing a relative animation
       
  7902 				tween.end = parts[ 1 ] ?
       
  7903 					start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
       
  7904 					+parts[ 2 ];
       
  7905 			}
       
  7906 
       
  7907 			return tween;
       
  7908 		}]
       
  7909 	};
       
  7910 
       
  7911 // Animations created synchronously will run synchronously
       
  7912 function createFxNow() {
       
  7913 	setTimeout(function() {
       
  7914 		fxNow = undefined;
       
  7915 	});
       
  7916 	return ( fxNow = jQuery.now() );
       
  7917 }
       
  7918 
       
  7919 function createTween( value, prop, animation ) {
       
  7920 	var tween,
       
  7921 		collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
       
  7922 		index = 0,
       
  7923 		length = collection.length;
       
  7924 	for ( ; index < length; index++ ) {
       
  7925 		if ( (tween = collection[ index ].call( animation, prop, value )) ) {
       
  7926 
       
  7927 			// we're done with this property
       
  7928 			return tween;
       
  7929 		}
       
  7930 	}
       
  7931 }
       
  7932 
       
  7933 function Animation( elem, properties, options ) {
       
  7934 	var result,
       
  7935 		stopped,
       
  7936 		index = 0,
       
  7937 		length = animationPrefilters.length,
       
  7938 		deferred = jQuery.Deferred().always( function() {
       
  7939 			// don't match elem in the :animated selector
       
  7940 			delete tick.elem;
       
  7941 		}),
       
  7942 		tick = function() {
       
  7943 			if ( stopped ) {
       
  7944 				return false;
       
  7945 			}
       
  7946 			var currentTime = fxNow || createFxNow(),
       
  7947 				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
       
  7948 				// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
       
  7949 				temp = remaining / animation.duration || 0,
       
  7950 				percent = 1 - temp,
       
  7951 				index = 0,
       
  7952 				length = animation.tweens.length;
       
  7953 
       
  7954 			for ( ; index < length ; index++ ) {
       
  7955 				animation.tweens[ index ].run( percent );
       
  7956 			}
       
  7957 
       
  7958 			deferred.notifyWith( elem, [ animation, percent, remaining ]);
       
  7959 
       
  7960 			if ( percent < 1 && length ) {
       
  7961 				return remaining;
       
  7962 			} else {
       
  7963 				deferred.resolveWith( elem, [ animation ] );
       
  7964 				return false;
       
  7965 			}
       
  7966 		},
       
  7967 		animation = deferred.promise({
       
  7968 			elem: elem,
       
  7969 			props: jQuery.extend( {}, properties ),
       
  7970 			opts: jQuery.extend( true, { specialEasing: {} }, options ),
       
  7971 			originalProperties: properties,
       
  7972 			originalOptions: options,
       
  7973 			startTime: fxNow || createFxNow(),
       
  7974 			duration: options.duration,
       
  7975 			tweens: [],
       
  7976 			createTween: function( prop, end ) {
       
  7977 				var tween = jQuery.Tween( elem, animation.opts, prop, end,
       
  7978 						animation.opts.specialEasing[ prop ] || animation.opts.easing );
       
  7979 				animation.tweens.push( tween );
       
  7980 				return tween;
       
  7981 			},
       
  7982 			stop: function( gotoEnd ) {
       
  7983 				var index = 0,
       
  7984 					// if we are going to the end, we want to run all the tweens
       
  7985 					// otherwise we skip this part
       
  7986 					length = gotoEnd ? animation.tweens.length : 0;
       
  7987 				if ( stopped ) {
       
  7988 					return this;
       
  7989 				}
       
  7990 				stopped = true;
       
  7991 				for ( ; index < length ; index++ ) {
       
  7992 					animation.tweens[ index ].run( 1 );
       
  7993 				}
       
  7994 
       
  7995 				// resolve when we played the last frame
       
  7996 				// otherwise, reject
       
  7997 				if ( gotoEnd ) {
       
  7998 					deferred.resolveWith( elem, [ animation, gotoEnd ] );
       
  7999 				} else {
       
  8000 					deferred.rejectWith( elem, [ animation, gotoEnd ] );
       
  8001 				}
       
  8002 				return this;
       
  8003 			}
       
  8004 		}),
       
  8005 		props = animation.props;
       
  8006 
       
  8007 	propFilter( props, animation.opts.specialEasing );
       
  8008 
       
  8009 	for ( ; index < length ; index++ ) {
       
  8010 		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
       
  8011 		if ( result ) {
       
  8012 			return result;
       
  8013 		}
       
  8014 	}
       
  8015 
       
  8016 	jQuery.map( props, createTween, animation );
       
  8017 
       
  8018 	if ( jQuery.isFunction( animation.opts.start ) ) {
       
  8019 		animation.opts.start.call( elem, animation );
       
  8020 	}
       
  8021 
       
  8022 	jQuery.fx.timer(
       
  8023 		jQuery.extend( tick, {
       
  8024 			elem: elem,
       
  8025 			anim: animation,
       
  8026 			queue: animation.opts.queue
       
  8027 		})
       
  8028 	);
       
  8029 
       
  8030 	// attach callbacks from options
       
  8031 	return animation.progress( animation.opts.progress )
       
  8032 		.done( animation.opts.done, animation.opts.complete )
       
  8033 		.fail( animation.opts.fail )
       
  8034 		.always( animation.opts.always );
       
  8035 }
       
  8036 
       
  8037 function propFilter( props, specialEasing ) {
       
  8038 	var index, name, easing, value, hooks;
       
  8039 
       
  8040 	// camelCase, specialEasing and expand cssHook pass
       
  8041 	for ( index in props ) {
       
  8042 		name = jQuery.camelCase( index );
       
  8043 		easing = specialEasing[ name ];
       
  8044 		value = props[ index ];
       
  8045 		if ( jQuery.isArray( value ) ) {
       
  8046 			easing = value[ 1 ];
       
  8047 			value = props[ index ] = value[ 0 ];
       
  8048 		}
       
  8049 
       
  8050 		if ( index !== name ) {
       
  8051 			props[ name ] = value;
       
  8052 			delete props[ index ];
       
  8053 		}
       
  8054 
       
  8055 		hooks = jQuery.cssHooks[ name ];
       
  8056 		if ( hooks && "expand" in hooks ) {
       
  8057 			value = hooks.expand( value );
       
  8058 			delete props[ name ];
       
  8059 
       
  8060 			// not quite $.extend, this wont overwrite keys already present.
       
  8061 			// also - reusing 'index' from above because we have the correct "name"
       
  8062 			for ( index in value ) {
       
  8063 				if ( !( index in props ) ) {
       
  8064 					props[ index ] = value[ index ];
       
  8065 					specialEasing[ index ] = easing;
       
  8066 				}
       
  8067 			}
       
  8068 		} else {
       
  8069 			specialEasing[ name ] = easing;
       
  8070 		}
       
  8071 	}
       
  8072 }
       
  8073 
       
  8074 jQuery.Animation = jQuery.extend( Animation, {
       
  8075 
       
  8076 	tweener: function( props, callback ) {
       
  8077 		if ( jQuery.isFunction( props ) ) {
       
  8078 			callback = props;
       
  8079 			props = [ "*" ];
       
  8080 		} else {
       
  8081 			props = props.split(" ");
       
  8082 		}
       
  8083 
       
  8084 		var prop,
       
  8085 			index = 0,
       
  8086 			length = props.length;
       
  8087 
       
  8088 		for ( ; index < length ; index++ ) {
       
  8089 			prop = props[ index ];
       
  8090 			tweeners[ prop ] = tweeners[ prop ] || [];
       
  8091 			tweeners[ prop ].unshift( callback );
       
  8092 		}
       
  8093 	},
       
  8094 
       
  8095 	prefilter: function( callback, prepend ) {
       
  8096 		if ( prepend ) {
       
  8097 			animationPrefilters.unshift( callback );
       
  8098 		} else {
       
  8099 			animationPrefilters.push( callback );
       
  8100 		}
       
  8101 	}
       
  8102 });
       
  8103 
       
  8104 function defaultPrefilter( elem, props, opts ) {
       
  8105 	/* jshint validthis: true */
       
  8106 	var prop, value, toggle, tween, hooks, oldfire,
       
  8107 		anim = this,
       
  8108 		orig = {},
       
  8109 		style = elem.style,
       
  8110 		hidden = elem.nodeType && isHidden( elem ),
       
  8111 		dataShow = data_priv.get( elem, "fxshow" );
       
  8112 
       
  8113 	// handle queue: false promises
       
  8114 	if ( !opts.queue ) {
       
  8115 		hooks = jQuery._queueHooks( elem, "fx" );
       
  8116 		if ( hooks.unqueued == null ) {
       
  8117 			hooks.unqueued = 0;
       
  8118 			oldfire = hooks.empty.fire;
       
  8119 			hooks.empty.fire = function() {
       
  8120 				if ( !hooks.unqueued ) {
       
  8121 					oldfire();
       
  8122 				}
       
  8123 			};
       
  8124 		}
       
  8125 		hooks.unqueued++;
       
  8126 
       
  8127 		anim.always(function() {
       
  8128 			// doing this makes sure that the complete handler will be called
       
  8129 			// before this completes
       
  8130 			anim.always(function() {
       
  8131 				hooks.unqueued--;
       
  8132 				if ( !jQuery.queue( elem, "fx" ).length ) {
       
  8133 					hooks.empty.fire();
       
  8134 				}
       
  8135 			});
       
  8136 		});
  8884 		});
  8137 	}
  8885 	}
  8138 
  8886 
  8139 	// height/width overflow pass
  8887 	return this;
  8140 	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
       
  8141 		// Make sure that nothing sneaks out
       
  8142 		// Record all 3 overflow attributes because IE9-10 do not
       
  8143 		// change the overflow attribute when overflowX and
       
  8144 		// overflowY are set to the same value
       
  8145 		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
       
  8146 
       
  8147 		// Set display property to inline-block for height/width
       
  8148 		// animations on inline elements that are having width/height animated
       
  8149 		if ( jQuery.css( elem, "display" ) === "inline" &&
       
  8150 				jQuery.css( elem, "float" ) === "none" ) {
       
  8151 
       
  8152 			style.display = "inline-block";
       
  8153 		}
       
  8154 	}
       
  8155 
       
  8156 	if ( opts.overflow ) {
       
  8157 		style.overflow = "hidden";
       
  8158 		anim.always(function() {
       
  8159 			style.overflow = opts.overflow[ 0 ];
       
  8160 			style.overflowX = opts.overflow[ 1 ];
       
  8161 			style.overflowY = opts.overflow[ 2 ];
       
  8162 		});
       
  8163 	}
       
  8164 
       
  8165 
       
  8166 	// show/hide pass
       
  8167 	for ( prop in props ) {
       
  8168 		value = props[ prop ];
       
  8169 		if ( rfxtypes.exec( value ) ) {
       
  8170 			delete props[ prop ];
       
  8171 			toggle = toggle || value === "toggle";
       
  8172 			if ( value === ( hidden ? "hide" : "show" ) ) {
       
  8173 
       
  8174 				// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
       
  8175 				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
       
  8176 					hidden = true;
       
  8177 				} else {
       
  8178 					continue;
       
  8179 				}
       
  8180 			}
       
  8181 			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
       
  8182 		}
       
  8183 	}
       
  8184 
       
  8185 	if ( !jQuery.isEmptyObject( orig ) ) {
       
  8186 		if ( dataShow ) {
       
  8187 			if ( "hidden" in dataShow ) {
       
  8188 				hidden = dataShow.hidden;
       
  8189 			}
       
  8190 		} else {
       
  8191 			dataShow = data_priv.access( elem, "fxshow", {} );
       
  8192 		}
       
  8193 
       
  8194 		// store state if its toggle - enables .stop().toggle() to "reverse"
       
  8195 		if ( toggle ) {
       
  8196 			dataShow.hidden = !hidden;
       
  8197 		}
       
  8198 		if ( hidden ) {
       
  8199 			jQuery( elem ).show();
       
  8200 		} else {
       
  8201 			anim.done(function() {
       
  8202 				jQuery( elem ).hide();
       
  8203 			});
       
  8204 		}
       
  8205 		anim.done(function() {
       
  8206 			var prop;
       
  8207 
       
  8208 			data_priv.remove( elem, "fxshow" );
       
  8209 			for ( prop in orig ) {
       
  8210 				jQuery.style( elem, prop, orig[ prop ] );
       
  8211 			}
       
  8212 		});
       
  8213 		for ( prop in orig ) {
       
  8214 			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
       
  8215 
       
  8216 			if ( !( prop in dataShow ) ) {
       
  8217 				dataShow[ prop ] = tween.start;
       
  8218 				if ( hidden ) {
       
  8219 					tween.end = tween.start;
       
  8220 					tween.start = prop === "width" || prop === "height" ? 1 : 0;
       
  8221 				}
       
  8222 			}
       
  8223 		}
       
  8224 	}
       
  8225 }
       
  8226 
       
  8227 function Tween( elem, options, prop, end, easing ) {
       
  8228 	return new Tween.prototype.init( elem, options, prop, end, easing );
       
  8229 }
       
  8230 jQuery.Tween = Tween;
       
  8231 
       
  8232 Tween.prototype = {
       
  8233 	constructor: Tween,
       
  8234 	init: function( elem, options, prop, end, easing, unit ) {
       
  8235 		this.elem = elem;
       
  8236 		this.prop = prop;
       
  8237 		this.easing = easing || "swing";
       
  8238 		this.options = options;
       
  8239 		this.start = this.now = this.cur();
       
  8240 		this.end = end;
       
  8241 		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
       
  8242 	},
       
  8243 	cur: function() {
       
  8244 		var hooks = Tween.propHooks[ this.prop ];
       
  8245 
       
  8246 		return hooks && hooks.get ?
       
  8247 			hooks.get( this ) :
       
  8248 			Tween.propHooks._default.get( this );
       
  8249 	},
       
  8250 	run: function( percent ) {
       
  8251 		var eased,
       
  8252 			hooks = Tween.propHooks[ this.prop ];
       
  8253 
       
  8254 		if ( this.options.duration ) {
       
  8255 			this.pos = eased = jQuery.easing[ this.easing ](
       
  8256 				percent, this.options.duration * percent, 0, 1, this.options.duration
       
  8257 			);
       
  8258 		} else {
       
  8259 			this.pos = eased = percent;
       
  8260 		}
       
  8261 		this.now = ( this.end - this.start ) * eased + this.start;
       
  8262 
       
  8263 		if ( this.options.step ) {
       
  8264 			this.options.step.call( this.elem, this.now, this );
       
  8265 		}
       
  8266 
       
  8267 		if ( hooks && hooks.set ) {
       
  8268 			hooks.set( this );
       
  8269 		} else {
       
  8270 			Tween.propHooks._default.set( this );
       
  8271 		}
       
  8272 		return this;
       
  8273 	}
       
  8274 };
  8888 };
  8275 
  8889 
  8276 Tween.prototype.init.prototype = Tween.prototype;
  8890 
  8277 
  8891 
  8278 Tween.propHooks = {
  8892 
  8279 	_default: {
  8893 // Attach a bunch of functions for handling common AJAX events
  8280 		get: function( tween ) {
  8894 jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
  8281 			var result;
  8895 	jQuery.fn[ type ] = function( fn ) {
  8282 
  8896 		return this.on( type, fn );
  8283 			if ( tween.elem[ tween.prop ] != null &&
       
  8284 				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
       
  8285 				return tween.elem[ tween.prop ];
       
  8286 			}
       
  8287 
       
  8288 			// passing an empty string as a 3rd parameter to .css will automatically
       
  8289 			// attempt a parseFloat and fallback to a string if the parse fails
       
  8290 			// so, simple values such as "10px" are parsed to Float.
       
  8291 			// complex values such as "rotate(1rad)" are returned as is.
       
  8292 			result = jQuery.css( tween.elem, tween.prop, "" );
       
  8293 			// Empty strings, null, undefined and "auto" are converted to 0.
       
  8294 			return !result || result === "auto" ? 0 : result;
       
  8295 		},
       
  8296 		set: function( tween ) {
       
  8297 			// use step hook for back compat - use cssHook if its there - use .style if its
       
  8298 			// available and use plain properties where available
       
  8299 			if ( jQuery.fx.step[ tween.prop ] ) {
       
  8300 				jQuery.fx.step[ tween.prop ]( tween );
       
  8301 			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
       
  8302 				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
       
  8303 			} else {
       
  8304 				tween.elem[ tween.prop ] = tween.now;
       
  8305 			}
       
  8306 		}
       
  8307 	}
       
  8308 };
       
  8309 
       
  8310 // Support: IE9
       
  8311 // Panic based approach to setting things on disconnected nodes
       
  8312 
       
  8313 Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
       
  8314 	set: function( tween ) {
       
  8315 		if ( tween.elem.nodeType && tween.elem.parentNode ) {
       
  8316 			tween.elem[ tween.prop ] = tween.now;
       
  8317 		}
       
  8318 	}
       
  8319 };
       
  8320 
       
  8321 jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
       
  8322 	var cssFn = jQuery.fn[ name ];
       
  8323 	jQuery.fn[ name ] = function( speed, easing, callback ) {
       
  8324 		return speed == null || typeof speed === "boolean" ?
       
  8325 			cssFn.apply( this, arguments ) :
       
  8326 			this.animate( genFx( name, true ), speed, easing, callback );
       
  8327 	};
  8897 	};
  8328 });
  8898 });
  8329 
  8899 
  8330 jQuery.fn.extend({
  8900 
  8331 	fadeTo: function( speed, to, easing, callback ) {
  8901 
  8332 
  8902 
  8333 		// show any hidden elements after setting opacity to 0
  8903 jQuery.expr.filters.animated = function( elem ) {
  8334 		return this.filter( isHidden ).css( "opacity", 0 ).show()
  8904 	return jQuery.grep(jQuery.timers, function( fn ) {
  8335 
  8905 		return elem === fn.elem;
  8336 			// animate to the value specified
  8906 	}).length;
  8337 			.end().animate({ opacity: to }, speed, easing, callback );
  8907 };
  8338 	},
  8908 
  8339 	animate: function( prop, speed, easing, callback ) {
  8909 
  8340 		var empty = jQuery.isEmptyObject( prop ),
  8910 
  8341 			optall = jQuery.speed( speed, easing, callback ),
  8911 
  8342 			doAnimation = function() {
  8912 var docElem = window.document.documentElement;
  8343 				// Operate on a copy of prop so per-property easing won't be lost
  8913 
  8344 				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
  8914 /**
  8345 
  8915  * Gets a window from an element
  8346 				// Empty animations, or finishing resolves immediately
  8916  */
  8347 				if ( empty || data_priv.get( this, "finish" ) ) {
  8917 function getWindow( elem ) {
  8348 					anim.stop( true );
  8918 	return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
  8349 				}
       
  8350 			};
       
  8351 			doAnimation.finish = doAnimation;
       
  8352 
       
  8353 		return empty || optall.queue === false ?
       
  8354 			this.each( doAnimation ) :
       
  8355 			this.queue( optall.queue, doAnimation );
       
  8356 	},
       
  8357 	stop: function( type, clearQueue, gotoEnd ) {
       
  8358 		var stopQueue = function( hooks ) {
       
  8359 			var stop = hooks.stop;
       
  8360 			delete hooks.stop;
       
  8361 			stop( gotoEnd );
       
  8362 		};
       
  8363 
       
  8364 		if ( typeof type !== "string" ) {
       
  8365 			gotoEnd = clearQueue;
       
  8366 			clearQueue = type;
       
  8367 			type = undefined;
       
  8368 		}
       
  8369 		if ( clearQueue && type !== false ) {
       
  8370 			this.queue( type || "fx", [] );
       
  8371 		}
       
  8372 
       
  8373 		return this.each(function() {
       
  8374 			var dequeue = true,
       
  8375 				index = type != null && type + "queueHooks",
       
  8376 				timers = jQuery.timers,
       
  8377 				data = data_priv.get( this );
       
  8378 
       
  8379 			if ( index ) {
       
  8380 				if ( data[ index ] && data[ index ].stop ) {
       
  8381 					stopQueue( data[ index ] );
       
  8382 				}
       
  8383 			} else {
       
  8384 				for ( index in data ) {
       
  8385 					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
       
  8386 						stopQueue( data[ index ] );
       
  8387 					}
       
  8388 				}
       
  8389 			}
       
  8390 
       
  8391 			for ( index = timers.length; index--; ) {
       
  8392 				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
       
  8393 					timers[ index ].anim.stop( gotoEnd );
       
  8394 					dequeue = false;
       
  8395 					timers.splice( index, 1 );
       
  8396 				}
       
  8397 			}
       
  8398 
       
  8399 			// start the next in the queue if the last step wasn't forced
       
  8400 			// timers currently will call their complete callbacks, which will dequeue
       
  8401 			// but only if they were gotoEnd
       
  8402 			if ( dequeue || !gotoEnd ) {
       
  8403 				jQuery.dequeue( this, type );
       
  8404 			}
       
  8405 		});
       
  8406 	},
       
  8407 	finish: function( type ) {
       
  8408 		if ( type !== false ) {
       
  8409 			type = type || "fx";
       
  8410 		}
       
  8411 		return this.each(function() {
       
  8412 			var index,
       
  8413 				data = data_priv.get( this ),
       
  8414 				queue = data[ type + "queue" ],
       
  8415 				hooks = data[ type + "queueHooks" ],
       
  8416 				timers = jQuery.timers,
       
  8417 				length = queue ? queue.length : 0;
       
  8418 
       
  8419 			// enable finishing flag on private data
       
  8420 			data.finish = true;
       
  8421 
       
  8422 			// empty the queue first
       
  8423 			jQuery.queue( this, type, [] );
       
  8424 
       
  8425 			if ( hooks && hooks.stop ) {
       
  8426 				hooks.stop.call( this, true );
       
  8427 			}
       
  8428 
       
  8429 			// look for any active animations, and finish them
       
  8430 			for ( index = timers.length; index--; ) {
       
  8431 				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
       
  8432 					timers[ index ].anim.stop( true );
       
  8433 					timers.splice( index, 1 );
       
  8434 				}
       
  8435 			}
       
  8436 
       
  8437 			// look for any animations in the old queue and finish them
       
  8438 			for ( index = 0; index < length; index++ ) {
       
  8439 				if ( queue[ index ] && queue[ index ].finish ) {
       
  8440 					queue[ index ].finish.call( this );
       
  8441 				}
       
  8442 			}
       
  8443 
       
  8444 			// turn off finishing flag
       
  8445 			delete data.finish;
       
  8446 		});
       
  8447 	}
       
  8448 });
       
  8449 
       
  8450 // Generate parameters to create a standard animation
       
  8451 function genFx( type, includeWidth ) {
       
  8452 	var which,
       
  8453 		attrs = { height: type },
       
  8454 		i = 0;
       
  8455 
       
  8456 	// if we include width, step value is 1 to do all cssExpand values,
       
  8457 	// if we don't include width, step value is 2 to skip over Left and Right
       
  8458 	includeWidth = includeWidth? 1 : 0;
       
  8459 	for( ; i < 4 ; i += 2 - includeWidth ) {
       
  8460 		which = cssExpand[ i ];
       
  8461 		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
       
  8462 	}
       
  8463 
       
  8464 	if ( includeWidth ) {
       
  8465 		attrs.opacity = attrs.width = type;
       
  8466 	}
       
  8467 
       
  8468 	return attrs;
       
  8469 }
  8919 }
  8470 
  8920 
  8471 // Generate shortcuts for custom animations
       
  8472 jQuery.each({
       
  8473 	slideDown: genFx("show"),
       
  8474 	slideUp: genFx("hide"),
       
  8475 	slideToggle: genFx("toggle"),
       
  8476 	fadeIn: { opacity: "show" },
       
  8477 	fadeOut: { opacity: "hide" },
       
  8478 	fadeToggle: { opacity: "toggle" }
       
  8479 }, function( name, props ) {
       
  8480 	jQuery.fn[ name ] = function( speed, easing, callback ) {
       
  8481 		return this.animate( props, speed, easing, callback );
       
  8482 	};
       
  8483 });
       
  8484 
       
  8485 jQuery.speed = function( speed, easing, fn ) {
       
  8486 	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
       
  8487 		complete: fn || !fn && easing ||
       
  8488 			jQuery.isFunction( speed ) && speed,
       
  8489 		duration: speed,
       
  8490 		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
       
  8491 	};
       
  8492 
       
  8493 	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
       
  8494 		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
       
  8495 
       
  8496 	// normalize opt.queue - true/undefined/null -> "fx"
       
  8497 	if ( opt.queue == null || opt.queue === true ) {
       
  8498 		opt.queue = "fx";
       
  8499 	}
       
  8500 
       
  8501 	// Queueing
       
  8502 	opt.old = opt.complete;
       
  8503 
       
  8504 	opt.complete = function() {
       
  8505 		if ( jQuery.isFunction( opt.old ) ) {
       
  8506 			opt.old.call( this );
       
  8507 		}
       
  8508 
       
  8509 		if ( opt.queue ) {
       
  8510 			jQuery.dequeue( this, opt.queue );
       
  8511 		}
       
  8512 	};
       
  8513 
       
  8514 	return opt;
       
  8515 };
       
  8516 
       
  8517 jQuery.easing = {
       
  8518 	linear: function( p ) {
       
  8519 		return p;
       
  8520 	},
       
  8521 	swing: function( p ) {
       
  8522 		return 0.5 - Math.cos( p*Math.PI ) / 2;
       
  8523 	}
       
  8524 };
       
  8525 
       
  8526 jQuery.timers = [];
       
  8527 jQuery.fx = Tween.prototype.init;
       
  8528 jQuery.fx.tick = function() {
       
  8529 	var timer,
       
  8530 		timers = jQuery.timers,
       
  8531 		i = 0;
       
  8532 
       
  8533 	fxNow = jQuery.now();
       
  8534 
       
  8535 	for ( ; i < timers.length; i++ ) {
       
  8536 		timer = timers[ i ];
       
  8537 		// Checks the timer has not already been removed
       
  8538 		if ( !timer() && timers[ i ] === timer ) {
       
  8539 			timers.splice( i--, 1 );
       
  8540 		}
       
  8541 	}
       
  8542 
       
  8543 	if ( !timers.length ) {
       
  8544 		jQuery.fx.stop();
       
  8545 	}
       
  8546 	fxNow = undefined;
       
  8547 };
       
  8548 
       
  8549 jQuery.fx.timer = function( timer ) {
       
  8550 	if ( timer() && jQuery.timers.push( timer ) ) {
       
  8551 		jQuery.fx.start();
       
  8552 	}
       
  8553 };
       
  8554 
       
  8555 jQuery.fx.interval = 13;
       
  8556 
       
  8557 jQuery.fx.start = function() {
       
  8558 	if ( !timerId ) {
       
  8559 		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
       
  8560 	}
       
  8561 };
       
  8562 
       
  8563 jQuery.fx.stop = function() {
       
  8564 	clearInterval( timerId );
       
  8565 	timerId = null;
       
  8566 };
       
  8567 
       
  8568 jQuery.fx.speeds = {
       
  8569 	slow: 600,
       
  8570 	fast: 200,
       
  8571 	// Default speed
       
  8572 	_default: 400
       
  8573 };
       
  8574 
       
  8575 // Back Compat <1.8 extension point
       
  8576 jQuery.fx.step = {};
       
  8577 
       
  8578 if ( jQuery.expr && jQuery.expr.filters ) {
       
  8579 	jQuery.expr.filters.animated = function( elem ) {
       
  8580 		return jQuery.grep(jQuery.timers, function( fn ) {
       
  8581 			return elem === fn.elem;
       
  8582 		}).length;
       
  8583 	};
       
  8584 }
       
  8585 jQuery.fn.offset = function( options ) {
       
  8586 	if ( arguments.length ) {
       
  8587 		return options === undefined ?
       
  8588 			this :
       
  8589 			this.each(function( i ) {
       
  8590 				jQuery.offset.setOffset( this, options, i );
       
  8591 			});
       
  8592 	}
       
  8593 
       
  8594 	var docElem, win,
       
  8595 		elem = this[ 0 ],
       
  8596 		box = { top: 0, left: 0 },
       
  8597 		doc = elem && elem.ownerDocument;
       
  8598 
       
  8599 	if ( !doc ) {
       
  8600 		return;
       
  8601 	}
       
  8602 
       
  8603 	docElem = doc.documentElement;
       
  8604 
       
  8605 	// Make sure it's not a disconnected DOM node
       
  8606 	if ( !jQuery.contains( docElem, elem ) ) {
       
  8607 		return box;
       
  8608 	}
       
  8609 
       
  8610 	// If we don't have gBCR, just use 0,0 rather than error
       
  8611 	// BlackBerry 5, iOS 3 (original iPhone)
       
  8612 	if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
       
  8613 		box = elem.getBoundingClientRect();
       
  8614 	}
       
  8615 	win = getWindow( doc );
       
  8616 	return {
       
  8617 		top: box.top + win.pageYOffset - docElem.clientTop,
       
  8618 		left: box.left + win.pageXOffset - docElem.clientLeft
       
  8619 	};
       
  8620 };
       
  8621 
       
  8622 jQuery.offset = {
  8921 jQuery.offset = {
  8623 
       
  8624 	setOffset: function( elem, options, i ) {
  8922 	setOffset: function( elem, options, i ) {
  8625 		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
  8923 		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
  8626 			position = jQuery.css( elem, "position" ),
  8924 			position = jQuery.css( elem, "position" ),
  8627 			curElem = jQuery( elem ),
  8925 			curElem = jQuery( elem ),
  8628 			props = {};
  8926 			props = {};
  8633 		}
  8931 		}
  8634 
  8932 
  8635 		curOffset = curElem.offset();
  8933 		curOffset = curElem.offset();
  8636 		curCSSTop = jQuery.css( elem, "top" );
  8934 		curCSSTop = jQuery.css( elem, "top" );
  8637 		curCSSLeft = jQuery.css( elem, "left" );
  8935 		curCSSLeft = jQuery.css( elem, "left" );
  8638 		calculatePosition = ( position === "absolute" || position === "fixed" ) && ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
  8936 		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
  8639 
  8937 			( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
  8640 		// Need to be able to calculate position if either top or left is auto and position is either absolute or fixed
  8938 
       
  8939 		// Need to be able to calculate position if either
       
  8940 		// top or left is auto and position is either absolute or fixed
  8641 		if ( calculatePosition ) {
  8941 		if ( calculatePosition ) {
  8642 			curPosition = curElem.position();
  8942 			curPosition = curElem.position();
  8643 			curTop = curPosition.top;
  8943 			curTop = curPosition.top;
  8644 			curLeft = curPosition.left;
  8944 			curLeft = curPosition.left;
  8645 
  8945 
  8666 			curElem.css( props );
  8966 			curElem.css( props );
  8667 		}
  8967 		}
  8668 	}
  8968 	}
  8669 };
  8969 };
  8670 
  8970 
  8671 
       
  8672 jQuery.fn.extend({
  8971 jQuery.fn.extend({
       
  8972 	offset: function( options ) {
       
  8973 		if ( arguments.length ) {
       
  8974 			return options === undefined ?
       
  8975 				this :
       
  8976 				this.each(function( i ) {
       
  8977 					jQuery.offset.setOffset( this, options, i );
       
  8978 				});
       
  8979 		}
       
  8980 
       
  8981 		var docElem, win,
       
  8982 			elem = this[ 0 ],
       
  8983 			box = { top: 0, left: 0 },
       
  8984 			doc = elem && elem.ownerDocument;
       
  8985 
       
  8986 		if ( !doc ) {
       
  8987 			return;
       
  8988 		}
       
  8989 
       
  8990 		docElem = doc.documentElement;
       
  8991 
       
  8992 		// Make sure it's not a disconnected DOM node
       
  8993 		if ( !jQuery.contains( docElem, elem ) ) {
       
  8994 			return box;
       
  8995 		}
       
  8996 
       
  8997 		// Support: BlackBerry 5, iOS 3 (original iPhone)
       
  8998 		// If we don't have gBCR, just use 0,0 rather than error
       
  8999 		if ( typeof elem.getBoundingClientRect !== strundefined ) {
       
  9000 			box = elem.getBoundingClientRect();
       
  9001 		}
       
  9002 		win = getWindow( doc );
       
  9003 		return {
       
  9004 			top: box.top + win.pageYOffset - docElem.clientTop,
       
  9005 			left: box.left + win.pageXOffset - docElem.clientLeft
       
  9006 		};
       
  9007 	},
  8673 
  9008 
  8674 	position: function() {
  9009 	position: function() {
  8675 		if ( !this[ 0 ] ) {
  9010 		if ( !this[ 0 ] ) {
  8676 			return;
  9011 			return;
  8677 		}
  9012 		}
  8678 
  9013 
  8679 		var offsetParent, offset,
  9014 		var offsetParent, offset,
  8680 			elem = this[ 0 ],
  9015 			elem = this[ 0 ],
  8681 			parentOffset = { top: 0, left: 0 };
  9016 			parentOffset = { top: 0, left: 0 };
  8682 
  9017 
  8683 		// Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
  9018 		// Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
  8684 		if ( jQuery.css( elem, "position" ) === "fixed" ) {
  9019 		if ( jQuery.css( elem, "position" ) === "fixed" ) {
  8685 			// We assume that getBoundingClientRect is available when computed position is fixed
  9020 			// Assume getBoundingClientRect is there when computed position is fixed
  8686 			offset = elem.getBoundingClientRect();
  9021 			offset = elem.getBoundingClientRect();
  8687 
  9022 
  8688 		} else {
  9023 		} else {
  8689 			// Get *real* offsetParent
  9024 			// Get *real* offsetParent
  8690 			offsetParent = this.offsetParent();
  9025 			offsetParent = this.offsetParent();
  8709 
  9044 
  8710 	offsetParent: function() {
  9045 	offsetParent: function() {
  8711 		return this.map(function() {
  9046 		return this.map(function() {
  8712 			var offsetParent = this.offsetParent || docElem;
  9047 			var offsetParent = this.offsetParent || docElem;
  8713 
  9048 
  8714 			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
  9049 			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
  8715 				offsetParent = offsetParent.offsetParent;
  9050 				offsetParent = offsetParent.offsetParent;
  8716 			}
  9051 			}
  8717 
  9052 
  8718 			return offsetParent || docElem;
  9053 			return offsetParent || docElem;
  8719 		});
  9054 		});
  8720 	}
  9055 	}
  8721 });
  9056 });
  8722 
  9057 
  8723 
       
  8724 // Create scrollLeft and scrollTop methods
  9058 // Create scrollLeft and scrollTop methods
  8725 jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
  9059 jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
  8726 	var top = "pageYOffset" === prop;
  9060 	var top = "pageYOffset" === prop;
  8727 
  9061 
  8728 	jQuery.fn[ method ] = function( val ) {
  9062 	jQuery.fn[ method ] = function( val ) {
  8729 		return jQuery.access( this, function( elem, method, val ) {
  9063 		return access( this, function( elem, method, val ) {
  8730 			var win = getWindow( elem );
  9064 			var win = getWindow( elem );
  8731 
  9065 
  8732 			if ( val === undefined ) {
  9066 			if ( val === undefined ) {
  8733 				return win ? win[ prop ] : elem[ method ];
  9067 				return win ? win[ prop ] : elem[ method ];
  8734 			}
  9068 			}
  8744 			}
  9078 			}
  8745 		}, method, val, arguments.length, null );
  9079 		}, method, val, arguments.length, null );
  8746 	};
  9080 	};
  8747 });
  9081 });
  8748 
  9082 
  8749 function getWindow( elem ) {
  9083 // Support: Safari<7+, Chrome<37+
  8750 	return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
  9084 // Add the top/left cssHooks using jQuery.fn.position
  8751 }
  9085 // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
       
  9086 // Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280
       
  9087 // getComputedStyle returns percent when specified for top/left/bottom/right;
       
  9088 // rather than make the css module depend on the offset module, just check for it here
       
  9089 jQuery.each( [ "top", "left" ], function( i, prop ) {
       
  9090 	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
       
  9091 		function( elem, computed ) {
       
  9092 			if ( computed ) {
       
  9093 				computed = curCSS( elem, prop );
       
  9094 				// If curCSS returns percentage, fallback to offset
       
  9095 				return rnumnonpx.test( computed ) ?
       
  9096 					jQuery( elem ).position()[ prop ] + "px" :
       
  9097 					computed;
       
  9098 			}
       
  9099 		}
       
  9100 	);
       
  9101 });
       
  9102 
       
  9103 
  8752 // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
  9104 // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
  8753 jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
  9105 jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
  8754 	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
  9106 	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
  8755 		// margin is only for outerHeight, outerWidth
  9107 		// Margin is only for outerHeight, outerWidth
  8756 		jQuery.fn[ funcName ] = function( margin, value ) {
  9108 		jQuery.fn[ funcName ] = function( margin, value ) {
  8757 			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
  9109 			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
  8758 				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
  9110 				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
  8759 
  9111 
  8760 			return jQuery.access( this, function( elem, type, value ) {
  9112 			return access( this, function( elem, type, value ) {
  8761 				var doc;
  9113 				var doc;
  8762 
  9114 
  8763 				if ( jQuery.isWindow( elem ) ) {
  9115 				if ( jQuery.isWindow( elem ) ) {
  8764 					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
  9116 					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
  8765 					// isn't a whole lot we can do. See pull request at this URL for discussion:
  9117 					// isn't a whole lot we can do. See pull request at this URL for discussion:
  8788 					jQuery.style( elem, type, value, extra );
  9140 					jQuery.style( elem, type, value, extra );
  8789 			}, type, chainable ? margin : undefined, chainable, null );
  9141 			}, type, chainable ? margin : undefined, chainable, null );
  8790 		};
  9142 		};
  8791 	});
  9143 	});
  8792 });
  9144 });
  8793 // Limit scope pollution from any deprecated API
  9145 
  8794 // (function() {
       
  8795 
  9146 
  8796 // The number of elements contained in the matched element set
  9147 // The number of elements contained in the matched element set
  8797 jQuery.fn.size = function() {
  9148 jQuery.fn.size = function() {
  8798 	return this.length;
  9149 	return this.length;
  8799 };
  9150 };
  8800 
  9151 
  8801 jQuery.fn.andSelf = jQuery.fn.addBack;
  9152 jQuery.fn.andSelf = jQuery.fn.addBack;
  8802 
  9153 
  8803 // })();
  9154 
  8804 if ( typeof module === "object" && module && typeof module.exports === "object" ) {
  9155 
  8805 	// Expose jQuery as module.exports in loaders that implement the Node
  9156 
  8806 	// module pattern (including browserify). Do not create the global, since
  9157 // Register as a named AMD module, since jQuery can be concatenated with other
  8807 	// the user will be storing it themselves locally, and globals are frowned
  9158 // files that may use define, but not via a proper concatenation script that
  8808 	// upon in the Node module world.
  9159 // understands anonymous AMD modules. A named AMD is safest and most robust
  8809 	module.exports = jQuery;
  9160 // way to register. Lowercase jquery is used because AMD module names are
  8810 } else {
  9161 // derived from file names, and jQuery is normally delivered in a lowercase
  8811 	// Register as a named AMD module, since jQuery can be concatenated with other
  9162 // file name. Do this after creating the global so that if an AMD module wants
  8812 	// files that may use define, but not via a proper concatenation script that
  9163 // to call noConflict to hide this version of jQuery, it will work.
  8813 	// understands anonymous AMD modules. A named AMD is safest and most robust
  9164 
  8814 	// way to register. Lowercase jquery is used because AMD module names are
  9165 // Note that for maximum portability, libraries that are not jQuery should
  8815 	// derived from file names, and jQuery is normally delivered in a lowercase
  9166 // declare themselves as anonymous modules, and avoid setting a global if an
  8816 	// file name. Do this after creating the global so that if an AMD module wants
  9167 // AMD loader is present. jQuery is a special case. For more information, see
  8817 	// to call noConflict to hide this version of jQuery, it will work.
  9168 // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
  8818 	if ( typeof define === "function" && define.amd ) {
  9169 
  8819 		define( "jquery", [], function () { return jQuery; } );
  9170 if ( typeof define === "function" && define.amd ) {
  8820 	}
  9171 	define( "jquery", [], function() {
       
  9172 		return jQuery;
       
  9173 	});
  8821 }
  9174 }
  8822 
  9175 
  8823 // If there is a window object, that at least has a document property,
  9176 
  8824 // define jQuery and $ identifiers
  9177 
  8825 if ( typeof window === "object" && typeof window.document === "object" ) {
  9178 
       
  9179 var
       
  9180 	// Map over jQuery in case of overwrite
       
  9181 	_jQuery = window.jQuery,
       
  9182 
       
  9183 	// Map over the $ in case of overwrite
       
  9184 	_$ = window.$;
       
  9185 
       
  9186 jQuery.noConflict = function( deep ) {
       
  9187 	if ( window.$ === jQuery ) {
       
  9188 		window.$ = _$;
       
  9189 	}
       
  9190 
       
  9191 	if ( deep && window.jQuery === jQuery ) {
       
  9192 		window.jQuery = _jQuery;
       
  9193 	}
       
  9194 
       
  9195 	return jQuery;
       
  9196 };
       
  9197 
       
  9198 // Expose jQuery and $ identifiers, even in AMD
       
  9199 // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
       
  9200 // and CommonJS for browser emulators (#13566)
       
  9201 if ( typeof noGlobal === strundefined ) {
  8826 	window.jQuery = window.$ = jQuery;
  9202 	window.jQuery = window.$ = jQuery;
  8827 }
  9203 }
  8828 
  9204 
  8829 })( window );
  9205 
       
  9206 
       
  9207 
       
  9208 return jQuery;
       
  9209 
       
  9210 }));