PageSourceSearch

http://www.omni-interconsult.com/components/com_formmaker/views/formmaker/tmpl/wdform.js

js omni-interconsult.com collected 2026-10-07 10:07:57 UTC 266,767 bytes, 9,266 lines download raw bytes

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

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.