PageSourceSearch

https://www.helictit.info/sites/default/files/advagg_js/js__czUetr…jc6Le8qq6mHSjnrYVeVaYBSWTz_ji3Wh0YZB8yYE.js

js helictit.info collected 2026-10-02 21:21:59 UTC 240,096 bytes, 9,018 lines download raw bytes

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

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.