Make WordPress Core

Changeset 23180


Ignore:
Timestamp:
12/17/2012 05:29:40 PM (13 years ago)
Author:
nacin
Message:

Update to jQuery 1.9 Beta 1 in trunk (3.6-alpha).

Temporarily includes jQuery in original, unminified form, for ease of testing and bug reporting.

jQuery 1.9 introduces a "migrate" script for deprecated and removed behavior. Warnings are issued for methods we should not be using, and should be fixed in core. These warnings are sent to the JavaScript console and are collected in jQuery.migrateWarnings.

See http://blog.jquery.com/2012/12/17/jquery-1-9-beta-1-released/ for more.

props ocean90, see #22975.

Location:
trunk/wp-includes
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/js/jquery/jquery.js

    r22593 r23180  
    1 /*! jQuery v1.8.3 jquery.com | jquery.org/license */
    2 (function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)v.event.add(t,n,u[n][r])}o.data&&(o.data=v.extend({},o.data))}function Ot(e,t){var n;if(t.nodeType!==1)return;t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),n==="object"?(t.parentNode&&(t.outerHTML=e.outerHTML),v.support.html5Clone&&e.innerHTML&&!v.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):n==="input"&&Et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):n==="option"?t.selected=e.defaultSelected:n==="input"||n==="textarea"?t.defaultValue=e.defaultValue:n==="script"&&t.text!==e.text&&(t.text=e.text),t.removeAttribute(v.expando)}function Mt(e){return typeof e.getElementsByTagName!="undefined"?e.getElementsByTagName("*"):typeof e.querySelectorAll!="undefined"?e.querySelectorAll("*"):[]}function _t(e){Et.test(e.type)&&(e.defaultChecked=e.checked)}function Qt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Jt.length;while(i--){t=Jt[i]+n;if(t in e)return t}return r}function Gt(e,t){return e=t||e,v.css(e,"display")==="none"||!v.contains(e.ownerDocument,e)}function Yt(e,t){var n,r,i=[],s=0,o=e.length;for(;s<o;s++){n=e[s];if(!n.style)continue;i[s]=v._data(n,"olddisplay"),t?(!i[s]&&n.style.display==="none"&&(n.style.display=""),n.style.display===""&&Gt(n)&&(i[s]=v._data(n,"olddisplay",nn(n.nodeName)))):(r=Dt(n,"display"),!i[s]&&r!=="none"&&v._data(n,"olddisplay",r))}for(s=0;s<o;s++){n=e[s];if(!n.style)continue;if(!t||n.style.display==="none"||n.style.display==="")n.style.display=t?i[s]||"":"none"}return e}function Zt(e,t,n){var r=Rt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function en(e,t,n,r){var i=n===(r?"border":"content")?4:t==="width"?1:0,s=0;for(;i<4;i+=2)n==="margin"&&(s+=v.css(e,n+$t[i],!0)),r?(n==="content"&&(s-=parseFloat(Dt(e,"padding"+$t[i]))||0),n!=="margin"&&(s-=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0)):(s+=parseFloat(Dt(e,"padding"+$t[i]))||0,n!=="padding"&&(s+=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0));return s}function tn(e,t,n){var r=t==="width"?e.offsetWidth:e.offsetHeight,i=!0,s=v.support.boxSizing&&v.css(e,"boxSizing")==="border-box";if(r<=0||r==null){r=Dt(e,t);if(r<0||r==null)r=e.style[t];if(Ut.test(r))return r;i=s&&(v.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+en(e,t,n||(s?"border":"content"),i)+"px"}function nn(e){if(Wt[e])return Wt[e];var t=v("<"+e+">").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write("<!doctype html><html><body>"),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u<a;u++)r=o[u],s=/^\+/.test(r),s&&(r=r.substr(1)||"*"),i=e[r]=e[r]||[],i[s?"unshift":"push"](n)}}function kn(e,n,r,i,s,o){s=s||n.dataTypes[0],o=o||{},o[s]=!0;var u,a=e[s],f=0,l=a?a.length:0,c=e===Sn;for(;f<l&&(c||!u);f++)u=a[f](n,r,i),typeof u=="string"&&(!c||o[u]?u=t:(n.dataTypes.unshift(u),u=kn(e,n,r,i,u,o)));return(c||!u)&&!o["*"]&&(u=kn(e,n,r,i,"*",o)),u}function Ln(e,n){var r,i,s=v.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((s[r]?e:i||(i={}))[r]=n[r]);i&&v.extend(!0,e,i)}function An(e,n,r){var i,s,o,u,a=e.contents,f=e.dataTypes,l=e.responseFields;for(s in l)s in r&&(n[l[s]]=r[s]);while(f[0]==="*")f.shift(),i===t&&(i=e.mimeType||n.getResponseHeader("content-type"));if(i)for(s in a)if(a[s]&&a[s].test(i)){f.unshift(s);break}if(f[0]in r)o=f[0];else{for(s in r){if(!f[0]||e.converters[s+" "+f[0]]){o=s;break}u||(u=s)}o=o||u}if(o)return o!==f[0]&&f.unshift(o),r[o]}function On(e,t){var n,r,i,s,o=e.dataTypes.slice(),u=o[0],a={},f=0;e.dataFilter&&(t=e.dataFilter(t,e.dataType));if(o[1])for(n in e.converters)a[n.toLowerCase()]=e.converters[n];for(;i=o[++f];)if(i!=="*"){if(u!=="*"&&u!==i){n=a[u+" "+i]||a["* "+i];if(!n)for(r in a){s=r.split(" ");if(s[1]===i){n=a[u+" "+s[0]]||a["* "+s[0]];if(n){n===!0?n=a[r]:a[r]!==!0&&(i=s[0],o.splice(f--,0,i));break}}}if(n!==!0)if(n&&e["throws"])t=n(t);else try{t=n(t)}catch(l){return{state:"parsererror",error:n?l:"No conversion from "+u+" to "+i}}}u=i}return{state:"success",data:t}}function Fn(){try{return new e.XMLHttpRequest}catch(t){}}function In(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function $n(){return setTimeout(function(){qn=t},0),qn=v.now()}function Jn(e,t){v.each(t,function(t,n){var r=(Vn[t]||[]).concat(Vn["*"]),i=0,s=r.length;for(;i<s;i++)if(r[i].call(e,t,n))return})}function Kn(e,t,n){var r,i=0,s=0,o=Xn.length,u=v.Deferred().always(function(){delete a.elem}),a=function(){var t=qn||$n(),n=Math.max(0,f.startTime+f.duration-t),r=n/f.duration||0,i=1-r,s=0,o=f.tweens.length;for(;s<o;s++)f.tweens[s].run(i);return u.notifyWith(e,[f,i,n]),i<1&&o?n:(u.resolveWith(e,[f]),!1)},f=u.promise({elem:e,props:v.extend({},t),opts:v.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:qn||$n(),duration:n.duration,tweens:[],createTween:function(t,n,r){var i=v.Tween(e,f.opts,t,n,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(i),i},stop:function(t){var n=0,r=t?f.tweens.length:0;for(;n<r;n++)f.tweens[n].run(1);return t?u.resolveWith(e,[f,t]):u.rejectWith(e,[f,t]),this}}),l=f.props;Qn(l,f.opts.specialEasing);for(;i<o;i++){r=Xn[i].call(f,e,l,f.opts);if(r)return r}return Jn(f,l),v.isFunction(f.opts.start)&&f.opts.start.call(e,f),v.fx.timer(v.extend(a,{anim:f,queue:f.opts.queue,elem:e})),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always)}function Qn(e,t){var n,r,i,s,o;for(n in e){r=v.camelCase(n),i=t[r],s=e[n],v.isArray(s)&&(i=s[1],s=e[n]=s[0]),n!==r&&(e[r]=s,delete e[n]),o=v.cssHooks[r];if(o&&"expand"in o){s=o.expand(s),delete e[r];for(n in s)n in e||(e[n]=s[n],t[n]=i)}else t[r]=i}}function Gn(e,t,n){var r,i,s,o,u,a,f,l,c,h=this,p=e.style,d={},m=[],g=e.nodeType&&Gt(e);n.queue||(l=v._queueHooks(e,"fx"),l.unqueued==null&&(l.unqueued=0,c=l.empty.fire,l.empty.fire=function(){l.unqueued||c()}),l.unqueued++,h.always(function(){h.always(function(){l.unqueued--,v.queue(e,"fx").length||l.empty.fire()})})),e.nodeType===1&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],v.css(e,"display")==="inline"&&v.css(e,"float")==="none"&&(!v.support.inlineBlockNeedsLayout||nn(e.nodeName)==="inline"?p.display="inline-block":p.zoom=1)),n.overflow&&(p.overflow="hidden",v.support.shrinkWrapBlocks||h.done(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t){s=t[r];if(Un.exec(s)){delete t[r],a=a||s==="toggle";if(s===(g?"hide":"show"))continue;m.push(r)}}o=m.length;if(o){u=v._data(e,"fxshow")||v._data(e,"fxshow",{}),"hidden"in u&&(g=u.hidden),a&&(u.hidden=!g),g?v(e).show():h.done(function(){v(e).hide()}),h.done(function(){var t;v.removeData(e,"fxshow",!0);for(t in d)v.style(e,t,d[t])});for(r=0;r<o;r++)i=m[r],f=h.createTween(i,g?u[i]:0),d[i]=u[i]||v.style(e,i),i in u||(u[i]=f.start,g&&(f.end=f.start,f.start=i==="width"||i==="height"?1:0))}}function Yn(e,t,n,r,i){return new Yn.prototype.init(e,t,n,r,i)}function Zn(e,t){var n,r={height:e},i=0;t=t?1:0;for(;i<4;i+=2-t)n=$t[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function tr(e){return v.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:!1}var n,r,i=e.document,s=e.location,o=e.navigator,u=e.jQuery,a=e.$,f=Array.prototype.push,l=Array.prototype.slice,c=Array.prototype.indexOf,h=Object.prototype.toString,p=Object.prototype.hasOwnProperty,d=String.prototype.trim,v=function(e,t){return new v.fn.init(e,t,n)},m=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,g=/\S/,y=/\s+/,b=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,w=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a<f;a++)if((e=arguments[a])!=null)for(n in e){r=u[n],i=e[n];if(u===i)continue;l&&i&&(v.isPlainObject(i)||(s=v.isArray(i)))?(s?(s=!1,o=r&&v.isArray(r)?r:[]):o=r&&v.isPlainObject(r)?r:{},u[n]=v.extend(l,o,i)):i!==t&&(u[n]=i)}return u},v.extend({noConflict:function(t){return e.$===v&&(e.$=a),t&&e.jQuery===v&&(e.jQuery=u),v},isReady:!1,readyWait:1,holdReady:function(e){e?v.readyWait++:v.ready(!0)},ready:function(e){if(e===!0?--v.readyWait:v.isReady)return;if(!i.body)return setTimeout(v.ready,1);v.isReady=!0;if(e!==!0&&--v.readyWait>0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s<o;)if(n.apply(e[s++],r)===!1)break}else if(u){for(i in e)if(n.call(e[i],i,e[i])===!1)break}else for(;s<o;)if(n.call(e[s],s,e[s++])===!1)break;return e},trim:d&&!d.call("\ufeff\u00a0")?function(e){return e==null?"":d.call(e)}:function(e){return e==null?"":(e+"").replace(b,"")},makeArray:function(e,t){var n,r=t||[];return e!=null&&(n=v.type(e),e.length==null||n==="string"||n==="function"||n==="regexp"||v.isWindow(e)?f.call(r,e):v.merge(r,e)),r},inArray:function(e,t,n){var r;if(t){if(c)return c.call(t,e,n);r=t.length,n=n?n<0?Math.max(0,r+n):n:0;for(;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,s=0;if(typeof r=="number")for(;s<r;s++)e[i++]=n[s];else while(n[s]!==t)e[i++]=n[s++];return e.length=i,e},grep:function(e,t,n){var r,i=[],s=0,o=e.length;n=!!n;for(;s<o;s++)r=!!t(e[s],s),n!==r&&i.push(e[s]);return i},map:function(e,n,r){var i,s,o=[],u=0,a=e.length,f=e instanceof v||a!==t&&typeof a=="number"&&(a>0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u<a;u++)i=n(e[u],u,r),i!=null&&(o[o.length]=i);else for(s in e)i=n(e[s],s,r),i!=null&&(o[o.length]=i);return o.concat.apply([],o)},guid:1,proxy:function(e,n){var r,i,s;return typeof n=="string"&&(r=e[n],n=e,e=r),v.isFunction(e)?(i=l.call(arguments,2),s=function(){return e.apply(n,i.concat(l.call(arguments)))},s.guid=e.guid=e.guid||v.guid++,s):t},access:function(e,n,r,i,s,o,u){var a,f=r==null,l=0,c=e.length;if(r&&typeof r=="object"){for(l in r)v.access(e,n,l,r[l],1,o,i);s=1}else if(i!==t){a=u===t&&v.isFunction(i),f&&(a?(a=n,n=function(e,t,n){return a.call(v(e),n)}):(n.call(e,i),n=null));if(n)for(;l<c;l++)n(e[l],r,a?i.call(e[l],l,n(e[l],r)):i,u);s=1}return s?e:f?n.call(e):c?n(e[0],r):o},now:function(){return(new Date).getTime()}}),v.ready.promise=function(t){if(!r){r=v.Deferred();if(i.readyState==="complete")setTimeout(v.ready,1);else if(i.addEventListener)i.addEventListener("DOMContentLoaded",A,!1),e.addEventListener("load",v.ready,!1);else{i.attachEvent("onreadystatechange",A),e.attachEvent("onload",v.ready);var n=!1;try{n=e.frameElement==null&&i.documentElement}catch(s){}n&&n.doScroll&&function o(){if(!v.isReady){try{n.doScroll("left")}catch(e){return setTimeout(o,50)}v.ready()}}()}}return r.promise(t)},v.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(e,t){O["[object "+t+"]"]=t.toLowerCase()}),n=v(i);var M={};v.Callbacks=function(e){e=typeof e=="string"?M[e]||_(e):v.extend({},e);var n,r,i,s,o,u,a=[],f=!e.once&&[],l=function(t){n=e.memory&&t,r=!0,u=s||0,s=0,o=a.length,i=!0;for(;a&&u<o;u++)if(a[u].apply(t[0],t[1])===!1&&e.stopOnFalse){n=!1;break}i=!1,a&&(f?f.length&&l(f.shift()):n?a=[]:c.disable())},c={add:function(){if(a){var t=a.length;(function r(t){v.each(t,function(t,n){var i=v.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this},remove:function(){return a&&v.each(arguments,function(e,t){var n;while((n=v.inArray(t,a,n))>-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t<r;t++)n[t]&&v.isFunction(n[t].promise)?n[t].promise().done(o(t,f,n)).fail(s.reject).progress(o(t,a,u)):--i}return i||s.resolveWith(f,n),s.promise()}}),v.support=function(){var t,n,r,s,o,u,a,f,l,c,h,p=i.createElement("div");p.setAttribute("className","t"),p.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="<table><tr><td></td><td>t</td></tr></table>",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="<div></div>",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i<s;i++)delete r[t[i]];if(!(n?B:v.isEmptyObject)(r))return}}if(!n){delete u[a].data;if(!B(u[a]))return}o?v.cleanData([e],!0):v.support.deleteExpando||u!=u.window?delete u[a]:u[a]=null},_data:function(e,t,n){return v.data(e,t,n,!0)},acceptData:function(e){var t=e.nodeName&&v.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),v.fn.extend({data:function(e,n){var r,i,s,o,u,a=this[0],f=0,l=null;if(e===t){if(this.length){l=v.data(a);if(a.nodeType===1&&!v._data(a,"parsedAttrs")){s=a.attributes;for(u=s.length;f<u;f++)o=s[f].name,o.indexOf("data-")||(o=v.camelCase(o.substring(5)),H(a,o,l[o]));v._data(a,"parsedAttrs",!0)}}return l}return typeof e=="object"?this.each(function(){v.data(this,e)}):(r=e.split(".",2),r[1]=r[1]?"."+r[1]:"",i=r[1]+"!",v.access(this,function(n){if(n===t)return l=this.triggerHandler("getData"+i,[r[0]]),l===t&&a&&(l=v.data(a,e),l=H(a,e,l)),l===t&&r[1]?this.data(r[0]):l;r[1]=n,this.each(function(){var t=v(this);t.triggerHandler("setData"+i,r),v.data(this,e,n),t.triggerHandler("changeData"+i,r)})},null,n,arguments.length>1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length<r?v.queue(this[0],e):n===t?this:this.each(function(){var t=v.queue(this,e,n);v._queueHooks(this,e),e==="fx"&&t[0]!=="inprogress"&&v.dequeue(this,e)})},dequeue:function(e){return this.each(function(){v.dequeue(this,e)})},delay:function(e,t){return e=v.fx?v.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,s=v.Deferred(),o=this,u=this.length,a=function(){--i||s.resolveWith(o,[o])};typeof e!="string"&&(n=e,e=t),e=e||"fx";while(u--)r=v._data(o[u],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(a));return a(),s.promise(n)}});var j,F,I,q=/[\t\r\n]/g,R=/\r/g,U=/^(?:button|input)$/i,z=/^(?:button|input|object|select|textarea)$/i,W=/^a(?:rea|)$/i,X=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,V=v.support.getSetAttribute;v.fn.extend({attr:function(e,t){return v.access(this,v.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n<r;n++){i=this[n];if(i.nodeType===1)if(!i.className&&t.length===1)i.className=e;else{s=" "+i.className+" ";for(o=0,u=t.length;o<u;o++)s.indexOf(" "+t[o]+" ")<0&&(s+=t[o]+" ");i.className=v.trim(s)}}}return this},removeClass:function(e){var n,r,i,s,o,u,a;if(v.isFunction(e))return this.each(function(t){v(this).removeClass(e.call(this,t,this.className))});if(e&&typeof e=="string"||e===t){n=(e||"").split(y);for(u=0,a=this.length;u<a;u++){i=this[u];if(i.nodeType===1&&i.className){r=(" "+i.className+" ").replace(q," ");for(s=0,o=n.length;s<o;s++)while(r.indexOf(" "+n[s]+" ")>=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n<r;n++)if(this[n].nodeType===1&&(" "+this[n].className+" ").replace(q," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a<u;a++){n=r[a];if((n.selected||a===i)&&(v.support.optDisabled?!n.disabled:n.getAttribute("disabled")===null)&&(!n.parentNode.disabled||!v.nodeName(n.parentNode,"optgroup"))){t=v(n).val();if(s)return t;o.push(t)}}return o},set:function(e,t){var n=v.makeArray(t);return v(e).find("option").each(function(){this.selected=v.inArray(v(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o<r.length;o++)i=r[o],i&&(n=v.propFix[i]||i,s=X.test(i),s||v.attr(e,i,""),e.removeAttribute(V?i:n),s&&n in e&&(e[n]=!1))}},attrHooks:{type:{set:function(e,t){if(U.test(e.nodeName)&&e.parentNode)v.error("type property can't be changed");else if(!v.support.radioValue&&t==="radio"&&v.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}},value:{get:function(e,t){return j&&v.nodeName(e,"button")?j.get(e,t):t in e?e.value:null},set:function(e,t,n){if(j&&v.nodeName(e,"button"))return j.set(e,t,n);e.value=t}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,s,o,u=e.nodeType;if(!e||u===3||u===8||u===2)return;return o=u!==1||!v.isXMLDoc(e),o&&(n=v.propFix[n]||n,s=v.propHooks[n]),r!==t?s&&"set"in s&&(i=s.set(e,r,n))!==t?i:e[n]=r:s&&"get"in s&&(i=s.get(e,n))!==null?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):z.test(e.nodeName)||W.test(e.nodeName)&&e.href?0:t}}}}),F={get:function(e,n){var r,i=v.prop(e,n);return i===!0||typeof i!="boolean"&&(r=e.getAttributeNode(n))&&r.nodeValue!==!1?n.toLowerCase():t},set:function(e,t,n){var r;return t===!1?v.removeAttr(e,n):(r=v.propFix[n]||n,r in e&&(e[r]=!0),e.setAttribute(n,n.toLowerCase())),n}},V||(I={name:!0,id:!0,coords:!0},j=v.valHooks.button={get:function(e,n){var r;return r=e.getAttributeNode(n),r&&(I[n]?r.value!=="":r.specified)?r.value:t},set:function(e,t,n){var r=e.getAttributeNode(n);return r||(r=i.createAttribute(n),e.setAttributeNode(r)),r.value=t+""}},v.each(["width","height"],function(e,t){v.attrHooks[t]=v.extend(v.attrHooks[t],{set:function(e,n){if(n==="")return e.setAttribute(t,"auto"),n}})}),v.attrHooks.contenteditable={get:j.get,set:function(e,t,n){t===""&&(t="false"),j.set(e,t,n)}}),v.support.hrefNormalized||v.each(["href","src","width","height"],function(e,n){v.attrHooks[n]=v.extend(v.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return r===null?t:r}})}),v.support.style||(v.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||t},set:function(e,t){return e.style.cssText=t+""}}),v.support.optSelected||(v.propHooks.selected=v.extend(v.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),v.support.enctype||(v.propFix.enctype="encoding"),v.support.checkOn||v.each(["radio","checkbox"],function(){v.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}}),v.each(["radio","checkbox"],function(){v.valHooks[this]=v.extend(v.valHooks[this],{set:function(e,t){if(v.isArray(t))return e.checked=v.inArray(v(e).val(),t)>=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f<n.length;f++){l=J.exec(n[f])||[],c=l[1],h=(l[2]||"").split(".").sort(),g=v.event.special[c]||{},c=(s?g.delegateType:g.bindType)||c,g=v.event.special[c]||{},p=v.extend({type:c,origType:l[1],data:i,handler:r,guid:r.guid,selector:s,needsContext:s&&v.expr.match.needsContext.test(s),namespace:h.join(".")},d),m=a[c];if(!m){m=a[c]=[],m.delegateCount=0;if(!g.setup||g.setup.call(e,i,h,u)===!1)e.addEventListener?e.addEventListener(c,u,!1):e.attachEvent&&e.attachEvent("on"+c,u)}g.add&&(g.add.call(e,p),p.handler.guid||(p.handler.guid=r.guid)),s?m.splice(m.delegateCount++,0,p):m.push(p),v.event.global[c]=!0}e=null},global:{},remove:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,p,d,m,g=v.hasData(e)&&v._data(e);if(!g||!(h=g.events))return;t=v.trim(Z(t||"")).split(" ");for(s=0;s<t.length;s++){o=J.exec(t[s])||[],u=a=o[1],f=o[2];if(!u){for(u in h)v.event.remove(e,u+t[s],n,r,!0);continue}p=v.event.special[u]||{},u=(r?p.delegateType:p.bindType)||u,d=h[u]||[],l=d.length,f=f?new RegExp("(^|\\.)"+f.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(c=0;c<d.length;c++)m=d[c],(i||a===m.origType)&&(!n||n.guid===m.guid)&&(!f||f.test(m.namespace))&&(!r||r===m.selector||r==="**"&&m.selector)&&(d.splice(c--,1),m.selector&&d.delegateCount--,p.remove&&p.remove.call(e,m));d.length===0&&l!==d.length&&((!p.teardown||p.teardown.call(e,f,g.handle)===!1)&&v.removeEvent(e,u,g.handle),delete h[u])}v.isEmptyObject(h)&&(delete g.handle,v.removeData(e,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(n,r,s,o){if(!s||s.nodeType!==3&&s.nodeType!==8){var u,a,f,l,c,h,p,d,m,g,y=n.type||n,b=[];if(Y.test(y+v.event.triggered))return;y.indexOf("!")>=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f<m.length&&!n.isPropagationStopped();f++)l=m[f][0],n.type=m[f][1],d=(v._data(l,"events")||{})[n.type]&&v._data(l,"handle"),d&&d.apply(l,r),d=h&&l[h],d&&v.acceptData(l)&&d.apply&&d.apply(l,r)===!1&&n.preventDefault();return n.type=y,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(s.ownerDocument,r)===!1)&&(y!=="click"||!v.nodeName(s,"a"))&&v.acceptData(s)&&h&&s[y]&&(y!=="focus"&&y!=="blur"||n.target.offsetWidth!==0)&&!v.isWindow(s)&&(c=s[h],c&&(s[h]=null),v.event.triggered=y,s[y](),v.event.triggered=t,c&&(s[h]=c)),n.result}return},dispatch:function(n){n=v.event.fix(n||e.event);var r,i,s,o,u,a,f,c,h,p,d=(v._data(this,"events")||{})[n.type]||[],m=d.delegateCount,g=l.call(arguments),y=!n.exclusive&&!n.namespace,b=v.event.special[n.type]||{},w=[];g[0]=n,n.delegateTarget=this;if(b.preDispatch&&b.preDispatch.call(this,n)===!1)return;if(m&&(!n.button||n.type!=="click"))for(s=n.target;s!=this;s=s.parentNode||this)if(s.disabled!==!0||n.type!=="click"){u={},f=[];for(r=0;r<m;r++)c=d[r],h=c.selector,u[h]===t&&(u[h]=c.needsContext?v(h,this).index(s)>=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r<w.length&&!n.isPropagationStopped();r++){a=w[r],n.currentTarget=a.elem;for(i=0;i<a.matches.length&&!n.isImmediatePropagationStopped();i++){c=a.matches[i];if(y||!n.namespace&&!c.namespace||n.namespace_re&&n.namespace_re.test(c.namespace))n.data=c.data,n.handleObj=c,o=((v.event.special[c.origType]||{}).handle||c.handler).apply(a.elem,g),o!==t&&(n.result=o,o===!1&&(n.preventDefault(),n.stopPropagation()))}}return b.postDispatch&&b.postDispatch.call(this,n),n.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return e.which==null&&(e.which=t.charCode!=null?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,s,o,u=n.button,a=n.fromElement;return e.pageX==null&&n.clientX!=null&&(r=e.target.ownerDocument||i,s=r.documentElement,o=r.body,e.pageX=n.clientX+(s&&s.scrollLeft||o&&o.scrollLeft||0)-(s&&s.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(s&&s.scrollTop||o&&o.scrollTop||0)-(s&&s.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?n.toElement:a),!e.which&&u!==t&&(e.which=u&1?1:u&2?3:u&4?2:0),e}},fix:function(e){if(e[v.expando])return e;var t,n,r=e,s=v.event.fixHooks[e.type]||{},o=s.props?this.props.concat(s.props):this.props;e=v.Event(r);for(t=o.length;t;)n=o[--t],e[n]=r[n];return e.target||(e.target=r.srcElement||i),e.target.nodeType===3&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,r):e},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(e,t,n){v.isWindow(this)&&(this.onbeforeunload=n)},teardown:function(e,t){this.onbeforeunload===t&&(this.onbeforeunload=null)}}},simulate:function(e,t,n,r){var i=v.extend(new v.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?v.event.trigger(i,null,t):v.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},v.event.handle=v.event.dispatch,v.removeEvent=i.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]=="undefined"&&(e[r]=null),e.detachEvent(r,n))},v.Event=function(e,t){if(!(this instanceof v.Event))return new v.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?tt:et):this.type=e,t&&v.extend(this,t),this.timeStamp=e&&e.timeStamp||v.now(),this[v.expando]=!0},v.Event.prototype={preventDefault:function(){this.isDefaultPrevented=tt;var e=this.originalEvent;if(!e)return;e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=tt;var e=this.originalEvent;if(!e)return;e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=tt,this.stopPropagation()},isDefaultPrevented:et,isPropagationStopped:et,isImmediatePropagationStopped:et},v.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){v.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,s=e.handleObj,o=s.selector;if(!i||i!==r&&!v.contains(r,i))e.type=s.origType,n=s.handler.apply(this,arguments),e.type=t;return n}}}),v.support.submitBubbles||(v.event.special.submit={setup:function(){if(v.nodeName(this,"form"))return!1;v.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=v.nodeName(n,"input")||v.nodeName(n,"button")?n.form:t;r&&!v._data(r,"_submit_attached")&&(v.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),v._data(r,"_submit_attached",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&v.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){if(v.nodeName(this,"form"))return!1;v.event.remove(this,"._submit")}}),v.support.changeBubbles||(v.event.special.change={setup:function(){if($.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")v.event.add(this,"propertychange._change",function(e){e.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),v.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),v.event.simulate("change",this,e,!0)});return!1}v.event.add(this,"beforeactivate._change",function(e){var t=e.target;$.test(t.nodeName)&&!v._data(t,"_change_attached")&&(v.event.add(t,"change._change",function(e){this.parentNode&&!e.isSimulated&&!e.isTrigger&&v.event.simulate("change",this.parentNode,e,!0)}),v._data(t,"_change_attached",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||t.type!=="radio"&&t.type!=="checkbox")return e.handleObj.handler.apply(this,arguments)},teardown:function(){return v.event.remove(this,"._change"),!$.test(this.nodeName)}}),v.support.focusinBubbles||v.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){v.event.simulate(t,e.target,v.event.fix(e),!0)};v.event.special[t]={setup:function(){n++===0&&i.addEventListener(e,r,!0)},teardown:function(){--n===0&&i.removeEventListener(e,r,!0)}}}),v.fn.extend({on:function(e,n,r,i,s){var o,u;if(typeof e=="object"){typeof n!="string"&&(r=r||n,n=t);for(u in e)this.on(u,n,r,e[u],s);return this}r==null&&i==null?(i=n,r=n=t):i==null&&(typeof n=="string"?(i=r,r=t):(i=r,r=n,n=t));if(i===!1)i=et;else if(!i)return this;return s===1&&(o=i,i=function(e){return v().off(e),o.apply(this,arguments)},i.guid=o.guid||(o.guid=v.guid++)),this.each(function(){v.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,s;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,v(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if(typeof e=="object"){for(s in e)this.off(s,n,e[s]);return this}if(n===!1||typeof n=="function")r=n,n=t;return r===!1&&(r=et),this.each(function(){v.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},live:function(e,t,n){return v(this.context).on(e,this.selector,t,n),this},die:function(e,t){return v(this.context).off(e,this.selector||"**",t),this},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return arguments.length===1?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){v.event.trigger(e,t,this)})},triggerHandler:function(e,t){if(this[0])return v.event.trigger(e,t,this[0],!0)},toggle:function(e){var t=arguments,n=e.guid||v.guid++,r=0,i=function(n){var i=(v._data(this,"lastToggle"+e.guid)||0)%r;return v._data(this,"lastToggle"+e.guid,i+1),n.preventDefault(),t[i].apply(this,arguments)||!1};i.guid=n;while(r<t.length)t[r++].guid=n;return this.click(i)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),v.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){v.fn[t]=function(e,n){return n==null&&(n=e,e=null),arguments.length>0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u<a;u++)if(s=e[u])if(!n||n(s,r,i))o.push(s),f&&t.push(u);return o}function ct(e,t,n,r,i,s){return r&&!r[d]&&(r=ct(r)),i&&!i[d]&&(i=ct(i,s)),N(function(s,o,u,a){var f,l,c,h=[],p=[],d=o.length,v=s||dt(t||"*",u.nodeType?[u]:u,[]),m=e&&(s||!t)?lt(v,h,e,u,a):v,g=n?i||(s?e:d||r)?[]:o:m;n&&n(m,g,u,a);if(r){f=lt(g,p),r(f,[],u,a),l=f.length;while(l--)if(c=f[l])g[p[l]]=!(m[p[l]]=c)}if(s){if(i||e){if(i){f=[],l=g.length;while(l--)(c=g[l])&&f.push(m[l]=c);i(null,g=[],f,a)}l=g.length;while(l--)(c=g[l])&&(f=i?T.call(s,c):h[l])>-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a<s;a++)if(n=i.relative[e[a].type])h=[at(ft(h),n)];else{n=i.filter[e[a].type].apply(null,e[a].matches);if(n[d]){r=++a;for(;r<s;r++)if(i.relative[e[r].type])break;return ct(a>1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a<r&&ht(e.slice(a,r)),r<s&&ht(e=e.slice(r)),r<s&&e.join(""))}h.push(n)}return ft(h)}function pt(e,t){var r=t.length>0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r<i;r++)nt(e,t[r],n);return n}function vt(e,t,n,r,s){var o,u,f,l,c,h=ut(e),p=h.length;if(!r&&h.length===1){u=h[0]=h[0].slice(0);if(u.length>2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;t<n;t++)if(this[t]===e)return t;return-1},N=function(e,t){return e[d]=t==null||t,e},C=function(){var e={},t=[];return N(function(n,r){return t.push(n)>i.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="<a name='"+d+"'></a><div name='"+d+"'></div>",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:st(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:st(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},f=y.compareDocumentPosition?function(e,t){return e===t?(l=!0,0):(!e.compareDocumentPosition||!t.compareDocumentPosition?e.compareDocumentPosition:e.compareDocumentPosition(t)&4)?-1:1}:function(e,t){if(e===t)return l=!0,0;if(e.sourceIndex&&t.sourceIndex)return e.sourceIndex-t.sourceIndex;var n,r,i=[],s=[],o=e.parentNode,u=t.parentNode,a=o;if(o===u)return ot(e,t);if(!o)return-1;if(!u)return 1;while(a)i.unshift(a),a=a.parentNode;a=u;while(a)s.unshift(a),a=a.parentNode;n=i.length,r=s.length;for(var f=0;f<n&&f<r;f++)if(i[f]!==s[f])return ot(i[f],s[f]);return f===n?ot(e,s[f],-1):ot(i[f],t,1)},[0,0].sort(f),h=!l,nt.uniqueSort=function(e){var t,n=[],r=1,i=0;l=h,e.sort(f);if(l){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e},nt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},a=nt.compile=function(e,t){var n,r=[],i=[],s=A[d][e+" "];if(!s){t||(t=ut(e)),n=t.length;while(n--)s=ht(t[n]),s[d]?r.push(s):i.push(s);s=A(e,pt(i,r))}return s},g.querySelectorAll&&function(){var e,t=vt,n=/'|\\/g,r=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,i=[":focus"],s=[":active"],u=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector||y.oMatchesSelector||y.msMatchesSelector;K(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="<p test=''></p>",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="<input type='hidden'/>",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t<n;t++)if(v.contains(u[t],this))return!0});o=this.pushStack("","find",e);for(t=0,n=this.length;t<n;t++){r=o.length,v.find(e,this[t],o);if(t>0)for(i=r;i<o.length;i++)for(s=0;s<r;s++)if(o[s]===o[i]){o.splice(i--,1);break}}return o},has:function(e){var t,n=v(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(v.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1),"not",e)},filter:function(e){return this.pushStack(ft(this,e,!0),"filter",e)},is:function(e){return!!e&&(typeof e=="string"?st.test(e)?v(e,this.context).index(this[0])>=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r<i;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&n.nodeType!==11){if(o?o.index(n)>-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/<tbody/i,gt=/<|&#?\w+;/,yt=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,wt=new RegExp("<(?:"+ct+")[\\s/>]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,Nt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X<div>","</div>"]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1></$2>");try{for(;r<i;r++)n=this[r]||{},n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),n.innerHTML=e);n=0}catch(s){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){return ut(this[0])?this.length?this.pushStack(v(v.isFunction(e)?e():e),"replaceWith",e):this:v.isFunction(e)?this.each(function(t){var n=v(this),r=n.html();n.replaceWith(e.call(this,t,r))}):(typeof e!="string"&&(e=v(e).detach()),this.each(function(){var t=this.nextSibling,n=this.parentNode;v(this).remove(),t?v(t).before(e):v(n).append(e)}))},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=[].concat.apply([],e);var i,s,o,u,a=0,f=e[0],l=[],c=this.length;if(!v.support.checkClone&&c>1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a<c;a++)r.call(n&&v.nodeName(this[a],"table")?Lt(this[a],"tbody"):this[a],a===u?o:v.clone(o,!0,!0))}o=s=null,l.length&&v.each(l,function(e,t){t.src?v.ajax?v.ajax({url:t.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):v.error("no ajax"):v.globalEval((t.text||t.textContent||t.innerHTML||"").replace(Tt,"")),t.parentNode&&t.parentNode.removeChild(t)})}return this}}),v.buildFragment=function(e,n,r){var s,o,u,a=e[0];return n=n||i,n=!n.nodeType&&n[0]||n,n=n.ownerDocument||n,e.length===1&&typeof a=="string"&&a.length<512&&n===i&&a.charAt(0)==="<"&&!bt.test(a)&&(v.support.checkClone||!St.test(a))&&(v.support.html5Clone||!wt.test(a))&&(o=!0,s=v.fragments[a],u=s!==t),s||(s=n.createDocumentFragment(),v.clean(e,n,s,r),o&&(v.fragments[a]=u&&s)),{fragment:s,cacheable:o}},v.fragments={},v.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){v.fn[e]=function(n){var r,i=0,s=[],o=v(n),u=o.length,a=this.length===1&&this[0].parentNode;if((a==null||a&&a.nodeType===11&&a.childNodes.length===1)&&u===1)return o[t](this[0]),this;for(;i<u;i++)r=(i>0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1></$2>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]==="<table>"&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("<div>").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r<i;r++)n=e[r],Vn[n]=Vn[n]||[],Vn[n].unshift(t)},prefilter:function(e,t){t?Xn.unshift(e):Xn.push(e)}}),v.Tween=Yn,Yn.prototype={constructor:Yn,init:function(e,t,n,r,i,s){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=s||(v.cssNumber[n]?"":"px")},cur:function(){var e=Yn.propHooks[this.prop];return e&&e.get?e.get(this):Yn.propHooks._default.get(this)},run:function(e){var t,n=Yn.propHooks[this.prop];return this.options.duration?this.pos=t=v.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Yn.propHooks._default.set(this),this}},Yn.prototype.init.prototype=Yn.prototype,Yn.propHooks={_default:{get:function(e){var t;return e.elem[e.prop]==null||!!e.elem.style&&e.elem.style[e.prop]!=null?(t=v.css(e.elem,e.prop,!1,""),!t||t==="auto"?0:t):e.elem[e.prop]},set:function(e){v.fx.step[e.prop]?v.fx.step[e.prop](e):e.elem.style&&(e.elem.style[v.cssProps[e.prop]]!=null||v.cssHooks[e.prop])?v.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Yn.propHooks.scrollTop=Yn.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},v.each(["toggle","show","hide"],function(e,t){var n=v.fn[t];v.fn[t]=function(r,i,s){return r==null||typeof r=="boolean"||!e&&v.isFunction(r)&&v.isFunction(i)?n.apply(this,arguments):this.animate(Zn(t,!0),r,i,s)}}),v.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Gt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=v.isEmptyObject(e),s=v.speed(t,n,r),o=function(){var t=Kn(this,v.extend({},e),s);i&&t.stop(!0)};return i||s.queue===!1?this.each(o):this.queue(s.queue,o)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return typeof e!="string"&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=e!=null&&e+"queueHooks",s=v.timers,o=v._data(this);if(n)o[n]&&o[n].stop&&i(o[n]);else for(n in o)o[n]&&o[n].stop&&Wn.test(n)&&i(o[n]);for(n=s.length;n--;)s[n].elem===this&&(e==null||s[n].queue===e)&&(s[n].anim.stop(r),t=!1,s.splice(n,1));(t||!r)&&v.dequeue(this,e)})}}),v.each({slideDown:Zn("show"),slideUp:Zn("hide"),slideToggle:Zn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){v.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),v.speed=function(e,t,n){var r=e&&typeof e=="object"?v.extend({},e):{complete:n||!n&&t||v.isFunction(e)&&e,duration:e,easing:n&&t||t&&!v.isFunction(t)&&t};r.duration=v.fx.off?0:typeof r.duration=="number"?r.duration:r.duration in v.fx.speeds?v.fx.speeds[r.duration]:v.fx.speeds._default;if(r.queue==null||r.queue===!0)r.queue="fx";return r.old=r.complete,r.complete=function(){v.isFunction(r.old)&&r.old.call(this),r.queue&&v.dequeue(this,r.queue)},r},v.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},v.timers=[],v.fx=Yn.prototype.init,v.fx.tick=function(){var e,n=v.timers,r=0;qn=v.now();for(;r<n.length;r++)e=n[r],!e()&&n[r]===e&&n.splice(r--,1);n.length||v.fx.stop(),qn=t},v.fx.timer=function(e){e()&&v.timers.push(e)&&!Rn&&(Rn=setInterval(v.fx.tick,v.fx.interval))},v.fx.interval=13,v.fx.stop=function(){clearInterval(Rn),Rn=null},v.fx.speeds={slow:600,fast:200,_default:400},v.fx.step={},v.expr&&v.expr.filters&&(v.expr.filters.animated=function(e){return v.grep(v.timers,function(t){return e===t.elem}).length});var er=/^(?:body|html)$/i;v.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){v.offset.setOffset(this,e,t)});var n,r,i,s,o,u,a,f={top:0,left:0},l=this[0],c=l&&l.ownerDocument;if(!c)return;return(r=c.body)===l?v.offset.bodyOffset(l):(n=c.documentElement,v.contains(n,l)?(typeof l.getBoundingClientRect!="undefined"&&(f=l.getBoundingClientRect()),i=tr(c),s=n.clientTop||r.clientTop||0,o=n.clientLeft||r.clientLeft||0,u=i.pageYOffset||n.scrollTop,a=i.pageXOffset||n.scrollLeft,{top:f.top+u-s,left:f.left+a-o}):f)},v.offset={bodyOffset:function(e){var t=e.offsetTop,n=e.offsetLeft;return v.support.doesNotIncludeMarginInBodyOffset&&(t+=parseFloat(v.css(e,"marginTop"))||0,n+=parseFloat(v.css(e,"marginLeft"))||0),{top:t,left:n}},setOffset:function(e,t,n){var r=v.css(e,"position");r==="static"&&(e.style.position="relative");var i=v(e),s=i.offset(),o=v.css(e,"top"),u=v.css(e,"left"),a=(r==="absolute"||r==="fixed")&&v.inArray("auto",[o,u])>-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window);
     1/*!
     2 * jQuery JavaScript Library v1.9.0b1
     3 * http://jquery.com/
     4 *
     5 * Includes Sizzle.js
     6 * http://sizzlejs.com/
     7 *
     8 * Copyright 2012 jQuery Foundation and other contributors
     9 * Released under the MIT license
     10 * http://jquery.org/license
     11 *
     12 * Date: 2012-12-16
     13 */
     14(function( window, undefined ) {
     15"use strict";
     16var
     17    // A central reference to the root jQuery(document)
     18    rootjQuery,
     19
     20    // The deferred used on DOM ready
     21    readyList,
     22
     23    // Use the correct document accordingly with window argument (sandbox)
     24    document = window.document,
     25    location = window.location,
     26
     27    // Map over jQuery in case of overwrite
     28    _jQuery = window.jQuery,
     29
     30    // Map over the $ in case of overwrite
     31    _$ = window.$,
     32
     33    // [[Class]] -> type pairs
     34    class2type = {},
     35
     36    // List of deleted data cache ids, so we can reuse them
     37    core_deletedIds = [],
     38
     39    core_version = "1.9.0b1",
     40
     41    // Save a reference to some core methods
     42    core_concat = core_deletedIds.concat,
     43    core_push = core_deletedIds.push,
     44    core_slice = core_deletedIds.slice,
     45    core_indexOf = core_deletedIds.indexOf,
     46    core_toString = class2type.toString,
     47    core_hasOwn = class2type.hasOwnProperty,
     48    core_trim = core_version.trim,
     49
     50    // Define a local copy of jQuery
     51    jQuery = function( selector, context ) {
     52        // The jQuery object is actually just the init constructor 'enhanced'
     53        return new jQuery.fn.init( selector, context, rootjQuery );
     54    },
     55
     56    // Used for matching numbers
     57    core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
     58
     59    // Used for splitting on whitespace
     60    core_rnotwhite = /\S+/g,
     61
     62    // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
     63    rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
     64
     65    // A simple way to check for HTML strings
     66    // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
     67    // Strict HTML recognition (#11290: must start with <)
     68    rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,
     69
     70    // Match a standalone tag
     71    rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
     72
     73    // JSON RegExp
     74    rvalidchars = /^[\],:{}\s]*$/,
     75    rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
     76    rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
     77    rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
     78
     79    // Matches dashed string for camelizing
     80    rmsPrefix = /^-ms-/,
     81    rdashAlpha = /-([\da-z])/gi,
     82
     83    // Used by jQuery.camelCase as callback to replace()
     84    fcamelCase = function( all, letter ) {
     85        return letter.toUpperCase();
     86    },
     87
     88    // The ready event handler and self cleanup method
     89    DOMContentLoaded = function() {
     90        if ( document.addEventListener ) {
     91            document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
     92            jQuery.ready();
     93        } else if ( document.readyState === "complete" ) {
     94            // we're here because readyState === "complete" in oldIE
     95            // which is good enough for us to call the dom ready!
     96            document.detachEvent( "onreadystatechange", DOMContentLoaded );
     97            jQuery.ready();
     98        }
     99    };
     100
     101jQuery.fn = jQuery.prototype = {
     102    // The current version of jQuery being used
     103    jquery: core_version,
     104
     105    constructor: jQuery,
     106    init: function( selector, context, rootjQuery ) {
     107        var match, elem;
     108
     109        // HANDLE: $(""), $(null), $(undefined), $(false)
     110        if ( !selector ) {
     111            return this;
     112        }
     113
     114        // HANDLE: $(DOMElement)
     115        if ( selector.nodeType ) {
     116            this.context = this[0] = selector;
     117            this.length = 1;
     118            return this;
     119        }
     120
     121        // Handle HTML strings
     122        if ( typeof selector === "string" ) {
     123            if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
     124                // Assume that strings that start and end with <> are HTML and skip the regex check
     125                match = [ null, selector, null ];
     126
     127            } else {
     128                match = rquickExpr.exec( selector );
     129            }
     130
     131            // Match html or make sure no context is specified for #id
     132            if ( match && (match[1] || !context) ) {
     133
     134                // HANDLE: $(html) -> $(array)
     135                if ( match[1] ) {
     136                    context = context instanceof jQuery ? context[0] : context;
     137
     138                    // scripts is true for back-compat
     139                    jQuery.merge( this, jQuery.parseHTML(
     140                        match[1],
     141                        context && context.nodeType ? context.ownerDocument || context : document,
     142                        true
     143                    ) );
     144
     145                    // HANDLE: $(html, props)
     146                    if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
     147                        for ( match in context ) {
     148                            // Properties of context are called as methods if possible
     149                            if ( jQuery.isFunction( this[ match ] ) ) {
     150                                this[ match ]( context[ match ] );
     151
     152                            // ...and otherwise set as attributes
     153                            } else {
     154                                this.attr( match, context[ match ] );
     155                            }
     156                        }
     157                    }
     158
     159                    return this;
     160
     161                // HANDLE: $(#id)
     162                } else {
     163                    elem = document.getElementById( match[2] );
     164
     165                    // Check parentNode to catch when Blackberry 4.6 returns
     166                    // nodes that are no longer in the document #6963
     167                    if ( elem && elem.parentNode ) {
     168                        // Handle the case where IE and Opera return items
     169                        // by name instead of ID
     170                        if ( elem.id !== match[2] ) {
     171                            return rootjQuery.find( selector );
     172                        }
     173
     174                        // Otherwise, we inject the element directly into the jQuery object
     175                        this.length = 1;
     176                        this[0] = elem;
     177                    }
     178
     179                    this.context = document;
     180                    this.selector = selector;
     181                    return this;
     182                }
     183
     184            // HANDLE: $(expr, $(...))
     185            } else if ( !context || context.jquery ) {
     186                return ( context || rootjQuery ).find( selector );
     187
     188            // HANDLE: $(expr, context)
     189            // (which is just equivalent to: $(context).find(expr)
     190            } else {
     191                return this.constructor( context ).find( selector );
     192            }
     193
     194        // HANDLE: $(function)
     195        // Shortcut for document ready
     196        } else if ( jQuery.isFunction( selector ) ) {
     197            return rootjQuery.ready( selector );
     198        }
     199
     200        if ( selector.selector !== undefined ) {
     201            this.selector = selector.selector;
     202            this.context = selector.context;
     203        }
     204
     205        return jQuery.makeArray( selector, this );
     206    },
     207
     208    // Start with an empty selector
     209    selector: "",
     210
     211    // The default length of a jQuery object is 0
     212    length: 0,
     213
     214    // The number of elements contained in the matched element set
     215    size: function() {
     216        return this.length;
     217    },
     218
     219    toArray: function() {
     220        return core_slice.call( this );
     221    },
     222
     223    // Get the Nth element in the matched element set OR
     224    // Get the whole matched element set as a clean array
     225    get: function( num ) {
     226        return num == null ?
     227
     228            // Return a 'clean' array
     229            this.toArray() :
     230
     231            // Return just the object
     232            ( num < 0 ? this[ this.length + num ] : this[ num ] );
     233    },
     234
     235    // Take an array of elements and push it onto the stack
     236    // (returning the new matched element set)
     237    pushStack: function( elems ) {
     238
     239        // Build a new jQuery matched element set
     240        var ret = jQuery.merge( this.constructor(), elems );
     241
     242        // Add the old object onto the stack (as a reference)
     243        ret.prevObject = this;
     244        ret.context = this.context;
     245
     246        // Return the newly-formed element set
     247        return ret;
     248    },
     249
     250    // Execute a callback for every element in the matched set.
     251    // (You can seed the arguments with an array of args, but this is
     252    // only used internally.)
     253    each: function( callback, args ) {
     254        return jQuery.each( this, callback, args );
     255    },
     256
     257    ready: function( fn ) {
     258        // Add the callback
     259        jQuery.ready.promise().done( fn );
     260
     261        return this;
     262    },
     263
     264    slice: function() {
     265        return this.pushStack( core_slice.apply( this, arguments ) );
     266    },
     267
     268    first: function() {
     269        return this.eq( 0 );
     270    },
     271
     272    last: function() {
     273        return this.eq( -1 );
     274    },
     275
     276    eq: function( i ) {
     277        var len = this.length,
     278            j = +i + ( i < 0 ? len : 0 );
     279        return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
     280    },
     281
     282    map: function( callback ) {
     283        return this.pushStack( jQuery.map(this, function( elem, i ) {
     284            return callback.call( elem, i, elem );
     285        }));
     286    },
     287
     288    end: function() {
     289        return this.prevObject || this.constructor(null);
     290    },
     291
     292    // For internal use only.
     293    // Behaves like an Array's method, not like a jQuery method.
     294    push: core_push,
     295    sort: [].sort,
     296    splice: [].splice
     297};
     298
     299// Give the init function the jQuery prototype for later instantiation
     300jQuery.fn.init.prototype = jQuery.fn;
     301
     302jQuery.extend = jQuery.fn.extend = function() {
     303    var options, name, src, copy, copyIsArray, clone,
     304        target = arguments[0] || {},
     305        i = 1,
     306        length = arguments.length,
     307        deep = false;
     308
     309    // Handle a deep copy situation
     310    if ( typeof target === "boolean" ) {
     311        deep = target;
     312        target = arguments[1] || {};
     313        // skip the boolean and the target
     314        i = 2;
     315    }
     316
     317    // Handle case when target is a string or something (possible in deep copy)
     318    if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
     319        target = {};
     320    }
     321
     322    // extend jQuery itself if only one argument is passed
     323    if ( length === i ) {
     324        target = this;
     325        --i;
     326    }
     327
     328    for ( ; i < length; i++ ) {
     329        // Only deal with non-null/undefined values
     330        if ( (options = arguments[ i ]) != null ) {
     331            // Extend the base object
     332            for ( name in options ) {
     333                src = target[ name ];
     334                copy = options[ name ];
     335
     336                // Prevent never-ending loop
     337                if ( target === copy ) {
     338                    continue;
     339                }
     340
     341                // Recurse if we're merging plain objects or arrays
     342                if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
     343                    if ( copyIsArray ) {
     344                        copyIsArray = false;
     345                        clone = src && jQuery.isArray(src) ? src : [];
     346
     347                    } else {
     348                        clone = src && jQuery.isPlainObject(src) ? src : {};
     349                    }
     350
     351                    // Never move original objects, clone them
     352                    target[ name ] = jQuery.extend( deep, clone, copy );
     353
     354                // Don't bring in undefined values
     355                } else if ( copy !== undefined ) {
     356                    target[ name ] = copy;
     357                }
     358            }
     359        }
     360    }
     361
     362    // Return the modified object
     363    return target;
     364};
     365
     366jQuery.extend({
     367    noConflict: function( deep ) {
     368        if ( window.$ === jQuery ) {
     369            window.$ = _$;
     370        }
     371
     372        if ( deep && window.jQuery === jQuery ) {
     373            window.jQuery = _jQuery;
     374        }
     375
     376        return jQuery;
     377    },
     378
     379    // Is the DOM ready to be used? Set to true once it occurs.
     380    isReady: false,
     381
     382    // A counter to track how many items to wait for before
     383    // the ready event fires. See #6781
     384    readyWait: 1,
     385
     386    // Hold (or release) the ready event
     387    holdReady: function( hold ) {
     388        if ( hold ) {
     389            jQuery.readyWait++;
     390        } else {
     391            jQuery.ready( true );
     392        }
     393    },
     394
     395    // Handle when the DOM is ready
     396    ready: function( wait ) {
     397
     398        // Abort if there are pending holds or we're already ready
     399        if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
     400            return;
     401        }
     402
     403        // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
     404        if ( !document.body ) {
     405            return setTimeout( jQuery.ready );
     406        }
     407
     408        // Remember that the DOM is ready
     409        jQuery.isReady = true;
     410
     411        // If a normal DOM Ready event fired, decrement, and wait if need be
     412        if ( wait !== true && --jQuery.readyWait > 0 ) {
     413            return;
     414        }
     415
     416        // If there are functions bound, to execute
     417        readyList.resolveWith( document, [ jQuery ] );
     418
     419        // Trigger any bound ready events
     420        if ( jQuery.fn.trigger ) {
     421            jQuery( document ).trigger("ready").off("ready");
     422        }
     423    },
     424
     425    // See test/unit/core.js for details concerning isFunction.
     426    // Since version 1.3, DOM methods and functions like alert
     427    // aren't supported. They return false on IE (#2968).
     428    isFunction: function( obj ) {
     429        return jQuery.type(obj) === "function";
     430    },
     431
     432    isArray: Array.isArray || function( obj ) {
     433        return jQuery.type(obj) === "array";
     434    },
     435
     436    isWindow: function( obj ) {
     437        return obj != null && obj == obj.window;
     438    },
     439
     440    isNumeric: function( obj ) {
     441        return !isNaN( parseFloat(obj) ) && isFinite( obj );
     442    },
     443
     444    type: function( obj ) {
     445        return obj == null ?
     446            String( obj ) :
     447            class2type[ core_toString.call(obj) ] || "object";
     448    },
     449
     450    isPlainObject: function( obj ) {
     451        // Must be an Object.
     452        // Because of IE, we also have to check the presence of the constructor property.
     453        // Make sure that DOM nodes and window objects don't pass through, as well
     454        if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
     455            return false;
     456        }
     457
     458        try {
     459            // Not own constructor property must be Object
     460            if ( obj.constructor &&
     461                !core_hasOwn.call(obj, "constructor") &&
     462                !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
     463                return false;
     464            }
     465        } catch ( e ) {
     466            // IE8,9 Will throw exceptions on certain host objects #9897
     467            return false;
     468        }
     469
     470        // Own properties are enumerated firstly, so to speed up,
     471        // if last one is own, then all properties are own.
     472
     473        var key;
     474        for ( key in obj ) {}
     475
     476        return key === undefined || core_hasOwn.call( obj, key );
     477    },
     478
     479    isEmptyObject: function( obj ) {
     480        var name;
     481        for ( name in obj ) {
     482            return false;
     483        }
     484        return true;
     485    },
     486
     487    error: function( msg ) {
     488        throw new Error( msg );
     489    },
     490
     491    // data: string of html
     492    // context (optional): If specified, the fragment will be created in this context, defaults to document
     493    // keepScripts (optional): If true, will include scripts passed in the html string
     494    parseHTML: function( data, context, keepScripts ) {
     495        if ( !data || typeof data !== "string" ) {
     496            return null;
     497        }
     498        if ( typeof context === "boolean" ) {
     499            keepScripts = context;
     500            context = false;
     501        }
     502        context = context || document;
     503
     504        var parsed = rsingleTag.exec( data ),
     505            scripts = !keepScripts && [];
     506
     507        // Single tag
     508        if ( parsed ) {
     509            return [ context.createElement( parsed[1] ) ];
     510        }
     511
     512        parsed = context.createDocumentFragment();
     513        jQuery.clean( [ data ], context, parsed, scripts );
     514        if ( scripts ) {
     515            jQuery( scripts ).remove();
     516        }
     517        return jQuery.merge( [], parsed.childNodes );
     518    },
     519
     520    parseJSON: function( data ) {
     521        // Attempt to parse using the native JSON parser first
     522        if ( window.JSON && window.JSON.parse ) {
     523            return window.JSON.parse( data );
     524        }
     525
     526        if ( data === null ) {
     527            return data;
     528        }
     529
     530        if ( typeof data === "string" ) {
     531
     532            // Make sure leading/trailing whitespace is removed (IE can't handle it)
     533            data = jQuery.trim( data );
     534
     535            if ( data ) {
     536                // Make sure the incoming data is actual JSON
     537                // Logic borrowed from http://json.org/json2.js
     538                if ( rvalidchars.test( data.replace( rvalidescape, "@" )
     539                    .replace( rvalidtokens, "]" )
     540                    .replace( rvalidbraces, "")) ) {
     541
     542                    return ( new Function( "return " + data ) )();
     543                }
     544            }
     545        }
     546
     547        jQuery.error( "Invalid JSON: " + data );
     548    },
     549
     550    // Cross-browser xml parsing
     551    parseXML: function( data ) {
     552        var xml, tmp;
     553        if ( !data || typeof data !== "string" ) {
     554            return null;
     555        }
     556        try {
     557            if ( window.DOMParser ) { // Standard
     558                tmp = new DOMParser();
     559                xml = tmp.parseFromString( data , "text/xml" );
     560            } else { // IE
     561                xml = new ActiveXObject( "Microsoft.XMLDOM" );
     562                xml.async = "false";
     563                xml.loadXML( data );
     564            }
     565        } catch( e ) {
     566            xml = undefined;
     567        }
     568        if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
     569            jQuery.error( "Invalid XML: " + data );
     570        }
     571        return xml;
     572    },
     573
     574    noop: function() {},
     575
     576    // Evaluates a script in a global context
     577    // Workarounds based on findings by Jim Driscoll
     578    // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
     579    globalEval: function( data ) {
     580        if ( data && jQuery.trim( data ) ) {
     581            // We use execScript on Internet Explorer
     582            // We use an anonymous function so that context is window
     583            // rather than jQuery in Firefox
     584            ( window.execScript || function( data ) {
     585                window[ "eval" ].call( window, data );
     586            } )( data );
     587        }
     588    },
     589
     590    // Convert dashed to camelCase; used by the css and data modules
     591    // Microsoft forgot to hump their vendor prefix (#9572)
     592    camelCase: function( string ) {
     593        return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
     594    },
     595
     596    nodeName: function( elem, name ) {
     597        return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
     598    },
     599
     600    // args is for internal usage only
     601    each: function( obj, callback, args ) {
     602        var value,
     603            i = 0,
     604            length = obj.length,
     605            isArray = isArraylike( obj );
     606
     607        if ( args ) {
     608            if ( isArray ) {
     609                for ( ; i < length; i++ ) {
     610                    value = callback.apply( obj[ i ], args );
     611
     612                    if ( value === false ) {
     613                        break;
     614                    }
     615                }
     616            } else {
     617                for ( i in obj ) {
     618                    value = callback.apply( obj[ i ], args );
     619
     620                    if ( value === false ) {
     621                        break;
     622                    }
     623                }
     624            }
     625
     626        // A special, fast, case for the most common use of each
     627        } else {
     628            if ( isArray ) {
     629                for ( ; i < length; i++ ) {
     630                    value = callback.call( obj[ i ], i, obj[ i ] );
     631
     632                    if ( value === false ) {
     633                        break;
     634                    }
     635                }
     636            } else {
     637                for ( i in obj ) {
     638                    value = callback.call( obj[ i ], i, obj[ i ] );
     639
     640                    if ( value === false ) {
     641                        break;
     642                    }
     643                }
     644            }
     645        }
     646
     647        return obj;
     648    },
     649
     650    // Use native String.trim function wherever possible
     651    trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
     652        function( text ) {
     653            return text == null ?
     654                "" :
     655                core_trim.call( text );
     656        } :
     657
     658        // Otherwise use our own trimming functionality
     659        function( text ) {
     660            return text == null ?
     661                "" :
     662                ( text + "" ).replace( rtrim, "" );
     663        },
     664
     665    // results is for internal usage only
     666    makeArray: function( arr, results ) {
     667        var ret = results || [];
     668
     669        if ( arr != null ) {
     670            if ( isArraylike( Object(arr) ) ) {
     671                jQuery.merge( ret,
     672                    typeof arr === "string" ?
     673                    [ arr ] : arr
     674                );
     675            } else {
     676                core_push.call( ret, arr );
     677            }
     678        }
     679
     680        return ret;
     681    },
     682
     683    inArray: function( elem, arr, i ) {
     684        var len;
     685
     686        if ( arr ) {
     687            if ( core_indexOf ) {
     688                return core_indexOf.call( arr, elem, i );
     689            }
     690
     691            len = arr.length;
     692            i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
     693
     694            for ( ; i < len; i++ ) {
     695                // Skip accessing in sparse arrays
     696                if ( i in arr && arr[ i ] === elem ) {
     697                    return i;
     698                }
     699            }
     700        }
     701
     702        return -1;
     703    },
     704
     705    merge: function( first, second ) {
     706        var l = second.length,
     707            i = first.length,
     708            j = 0;
     709
     710        if ( typeof l === "number" ) {
     711            for ( ; j < l; j++ ) {
     712                first[ i++ ] = second[ j ];
     713            }
     714        } else {
     715            while ( second[j] !== undefined ) {
     716                first[ i++ ] = second[ j++ ];
     717            }
     718        }
     719
     720        first.length = i;
     721
     722        return first;
     723    },
     724
     725    grep: function( elems, callback, inv ) {
     726        var retVal,
     727            ret = [],
     728            i = 0,
     729            length = elems.length;
     730        inv = !!inv;
     731
     732        // Go through the array, only saving the items
     733        // that pass the validator function
     734        for ( ; i < length; i++ ) {
     735            retVal = !!callback( elems[ i ], i );
     736            if ( inv !== retVal ) {
     737                ret.push( elems[ i ] );
     738            }
     739        }
     740
     741        return ret;
     742    },
     743
     744    // arg is for internal usage only
     745    map: function( elems, callback, arg ) {
     746        var value,
     747            i = 0,
     748            length = elems.length,
     749            isArray = isArraylike( elems ),
     750            ret = [];
     751
     752        // Go through the array, translating each of the items to their
     753        if ( isArray ) {
     754            for ( ; i < length; i++ ) {
     755                value = callback( elems[ i ], i, arg );
     756
     757                if ( value != null ) {
     758                    ret[ ret.length ] = value;
     759                }
     760            }
     761
     762        // Go through every key on the object,
     763        } else {
     764            for ( i in elems ) {
     765                value = callback( elems[ i ], i, arg );
     766
     767                if ( value != null ) {
     768                    ret[ ret.length ] = value;
     769                }
     770            }
     771        }
     772
     773        // Flatten any nested arrays
     774        return core_concat.apply( [], ret );
     775    },
     776
     777    // A global GUID counter for objects
     778    guid: 1,
     779
     780    // Bind a function to a context, optionally partially applying any
     781    // arguments.
     782    proxy: function( fn, context ) {
     783        var tmp, args, proxy;
     784
     785        if ( typeof context === "string" ) {
     786            tmp = fn[ context ];
     787            context = fn;
     788            fn = tmp;
     789        }
     790
     791        // Quick check to determine if target is callable, in the spec
     792        // this throws a TypeError, but we will just return undefined.
     793        if ( !jQuery.isFunction( fn ) ) {
     794            return undefined;
     795        }
     796
     797        // Simulated bind
     798        args = core_slice.call( arguments, 2 );
     799        proxy = function() {
     800            return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
     801        };
     802
     803        // Set the guid of unique handler to the same of original handler, so it can be removed
     804        proxy.guid = fn.guid = fn.guid || jQuery.guid++;
     805
     806        return proxy;
     807    },
     808
     809    // Multifunctional method to get and set values of a collection
     810    // The value/s can optionally be executed if it's a function
     811    access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
     812        var i = 0,
     813            length = elems.length,
     814            bulk = key == null;
     815
     816        // Sets many values
     817        if ( jQuery.type( key ) === "object" ) {
     818            chainable = true;
     819            for ( i in key ) {
     820                jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
     821            }
     822
     823        // Sets one value
     824        } else if ( value !== undefined ) {
     825            chainable = true;
     826
     827            if ( !jQuery.isFunction( value ) ) {
     828                raw = true;
     829            }
     830
     831            if ( bulk ) {
     832                // Bulk operations run against the entire set
     833                if ( raw ) {
     834                    fn.call( elems, value );
     835                    fn = null;
     836
     837                // ...except when executing function values
     838                } else {
     839                    bulk = fn;
     840                    fn = function( elem, key, value ) {
     841                        return bulk.call( jQuery( elem ), value );
     842                    };
     843                }
     844            }
     845
     846            if ( fn ) {
     847                for ( ; i < length; i++ ) {
     848                    fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
     849                }
     850            }
     851        }
     852
     853        return chainable ?
     854            elems :
     855
     856            // Gets
     857            bulk ?
     858                fn.call( elems ) :
     859                length ? fn( elems[0], key ) : emptyGet;
     860    },
     861
     862    now: function() {
     863        return ( new Date() ).getTime();
     864    }
     865});
     866
     867jQuery.ready.promise = function( obj ) {
     868    if ( !readyList ) {
     869
     870        readyList = jQuery.Deferred();
     871
     872        // Catch cases where $(document).ready() is called after the browser event has already occurred.
     873        // we once tried to use readyState "interactive" here, but it caused issues like the one
     874        // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
     875        if ( document.readyState === "complete" ) {
     876            // Handle it asynchronously to allow scripts the opportunity to delay ready
     877            setTimeout( jQuery.ready );
     878
     879        // Standards-based browsers support DOMContentLoaded
     880        } else if ( document.addEventListener ) {
     881            // Use the handy event callback
     882            document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
     883
     884            // A fallback to window.onload, that will always work
     885            window.addEventListener( "load", jQuery.ready, false );
     886
     887        // If IE event model is used
     888        } else {
     889            // Ensure firing before onload, maybe late but safe also for iframes
     890            document.attachEvent( "onreadystatechange", DOMContentLoaded );
     891
     892            // A fallback to window.onload, that will always work
     893            window.attachEvent( "onload", jQuery.ready );
     894
     895            // If IE and not a frame
     896            // continually check to see if the document is ready
     897            var top = false;
     898
     899            try {
     900                top = window.frameElement == null && document.documentElement;
     901            } catch(e) {}
     902
     903            if ( top && top.doScroll ) {
     904                (function doScrollCheck() {
     905                    if ( !jQuery.isReady ) {
     906
     907                        try {
     908                            // Use the trick by Diego Perini
     909                            // http://javascript.nwbox.com/IEContentLoaded/
     910                            top.doScroll("left");
     911                        } catch(e) {
     912                            return setTimeout( doScrollCheck, 50 );
     913                        }
     914
     915                        // and execute any waiting functions
     916                        jQuery.ready();
     917                    }
     918                })();
     919            }
     920        }
     921    }
     922    return readyList.promise( obj );
     923};
     924
     925// Populate the class2type map
     926jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
     927    class2type[ "[object " + name + "]" ] = name.toLowerCase();
     928});
     929
     930function isArraylike( obj ) {
     931    var length = obj.length,
     932        type = jQuery.type( obj );
     933
     934    if ( jQuery.isWindow( obj ) ) {
     935        return false;
     936    }
     937
     938    if ( obj.nodeType === 1 && length ) {
     939        return true;
     940    }
     941
     942    return type === "array" || type !== "function" &&
     943        ( length === 0 ||
     944        typeof length === "number" && length > 0 && ( length - 1 ) in obj );
     945}
     946
     947// All jQuery objects should point back to these
     948rootjQuery = jQuery(document);
     949// String to Object options format cache
     950var optionsCache = {};
     951
     952// Convert String-formatted options into Object-formatted ones and store in cache
     953function createOptions( options ) {
     954    var object = optionsCache[ options ] = {};
     955    jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
     956        object[ flag ] = true;
     957    });
     958    return object;
     959}
     960
     961/*
     962 * Create a callback list using the following parameters:
     963 *
     964 *  options: an optional list of space-separated options that will change how
     965 *          the callback list behaves or a more traditional option object
     966 *
     967 * By default a callback list will act like an event callback list and can be
     968 * "fired" multiple times.
     969 *
     970 * Possible options:
     971 *
     972 *  once:           will ensure the callback list can only be fired once (like a Deferred)
     973 *
     974 *  memory:         will keep track of previous values and will call any callback added
     975 *                  after the list has been fired right away with the latest "memorized"
     976 *                  values (like a Deferred)
     977 *
     978 *  unique:         will ensure a callback can only be added once (no duplicate in the list)
     979 *
     980 *  stopOnFalse:    interrupt callings when a callback returns false
     981 *
     982 */
     983jQuery.Callbacks = function( options ) {
     984
     985    // Convert options from String-formatted to Object-formatted if needed
     986    // (we check in cache first)
     987    options = typeof options === "string" ?
     988        ( optionsCache[ options ] || createOptions( options ) ) :
     989        jQuery.extend( {}, options );
     990
     991    var // Last fire value (for non-forgettable lists)
     992        memory,
     993        // Flag to know if list was already fired
     994        fired,
     995        // Flag to know if list is currently firing
     996        firing,
     997        // First callback to fire (used internally by add and fireWith)
     998        firingStart,
     999        // End of the loop when firing
     1000        firingLength,
     1001        // Index of currently firing callback (modified by remove if needed)
     1002        firingIndex,
     1003        // Actual callback list
     1004        list = [],
     1005        // Stack of fire calls for repeatable lists
     1006        stack = !options.once && [],
     1007        // Fire callbacks
     1008        fire = function( data ) {
     1009            memory = options.memory && data;
     1010            fired = true;
     1011            firingIndex = firingStart || 0;
     1012            firingStart = 0;
     1013            firingLength = list.length;
     1014            firing = true;
     1015            for ( ; list && firingIndex < firingLength; firingIndex++ ) {
     1016                if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
     1017                    memory = false; // To prevent further calls using add
     1018                    break;
     1019                }
     1020            }
     1021            firing = false;
     1022            if ( list ) {
     1023                if ( stack ) {
     1024                    if ( stack.length ) {
     1025                        fire( stack.shift() );
     1026                    }
     1027                } else if ( memory ) {
     1028                    list = [];
     1029                } else {
     1030                    self.disable();
     1031                }
     1032            }
     1033        },
     1034        // Actual Callbacks object
     1035        self = {
     1036            // Add a callback or a collection of callbacks to the list
     1037            add: function() {
     1038                if ( list ) {
     1039                    // First, we save the current length
     1040                    var start = list.length;
     1041                    (function add( args ) {
     1042                        jQuery.each( args, function( _, arg ) {
     1043                            var type = jQuery.type( arg );
     1044                            if ( type === "function" ) {
     1045                                if ( !options.unique || !self.has( arg ) ) {
     1046                                    list.push( arg );
     1047                                }
     1048                            } else if ( arg && arg.length && type !== "string" ) {
     1049                                // Inspect recursively
     1050                                add( arg );
     1051                            }
     1052                        });
     1053                    })( arguments );
     1054                    // Do we need to add the callbacks to the
     1055                    // current firing batch?
     1056                    if ( firing ) {
     1057                        firingLength = list.length;
     1058                    // With memory, if we're not firing then
     1059                    // we should call right away
     1060                    } else if ( memory ) {
     1061                        firingStart = start;
     1062                        fire( memory );
     1063                    }
     1064                }
     1065                return this;
     1066            },
     1067            // Remove a callback from the list
     1068            remove: function() {
     1069                if ( list ) {
     1070                    jQuery.each( arguments, function( _, arg ) {
     1071                        var index;
     1072                        while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
     1073                            list.splice( index, 1 );
     1074                            // Handle firing indexes
     1075                            if ( firing ) {
     1076                                if ( index <= firingLength ) {
     1077                                    firingLength--;
     1078                                }
     1079                                if ( index <= firingIndex ) {
     1080                                    firingIndex--;
     1081                                }
     1082                            }
     1083                        }
     1084                    });
     1085                }
     1086                return this;
     1087            },
     1088            // Control if a given callback is in the list
     1089            has: function( fn ) {
     1090                return jQuery.inArray( fn, list ) > -1;
     1091            },
     1092            // Remove all callbacks from the list
     1093            empty: function() {
     1094                list = [];
     1095                return this;
     1096            },
     1097            // Have the list do nothing anymore
     1098            disable: function() {
     1099                list = stack = memory = undefined;
     1100                return this;
     1101            },
     1102            // Is it disabled?
     1103            disabled: function() {
     1104                return !list;
     1105            },
     1106            // Lock the list in its current state
     1107            lock: function() {
     1108                stack = undefined;
     1109                if ( !memory ) {
     1110                    self.disable();
     1111                }
     1112                return this;
     1113            },
     1114            // Is it locked?
     1115            locked: function() {
     1116                return !stack;
     1117            },
     1118            // Call all callbacks with the given context and arguments
     1119            fireWith: function( context, args ) {
     1120                args = args || [];
     1121                args = [ context, args.slice ? args.slice() : args ];
     1122                if ( list && ( !fired || stack ) ) {
     1123                    if ( firing ) {
     1124                        stack.push( args );
     1125                    } else {
     1126                        fire( args );
     1127                    }
     1128                }
     1129                return this;
     1130            },
     1131            // Call all the callbacks with the given arguments
     1132            fire: function() {
     1133                self.fireWith( this, arguments );
     1134                return this;
     1135            },
     1136            // To know if the callbacks have already been called at least once
     1137            fired: function() {
     1138                return !!fired;
     1139            }
     1140        };
     1141
     1142    return self;
     1143};
     1144jQuery.extend({
     1145
     1146    Deferred: function( func ) {
     1147        var tuples = [
     1148                // action, add listener, listener list, final state
     1149                [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
     1150                [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
     1151                [ "notify", "progress", jQuery.Callbacks("memory") ]
     1152            ],
     1153            state = "pending",
     1154            promise = {
     1155                state: function() {
     1156                    return state;
     1157                },
     1158                always: function() {
     1159                    deferred.done( arguments ).fail( arguments );
     1160                    return this;
     1161                },
     1162                then: function( /* fnDone, fnFail, fnProgress */ ) {
     1163                    var fns = arguments;
     1164                    return jQuery.Deferred(function( newDefer ) {
     1165                        jQuery.each( tuples, function( i, tuple ) {
     1166                            var action = tuple[ 0 ],
     1167                                fn = fns[ i ];
     1168                            // deferred[ done | fail | progress ] for forwarding actions to newDefer
     1169                            deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
     1170                                function() {
     1171                                    var returned = fn.apply( this, arguments );
     1172                                    if ( returned && jQuery.isFunction( returned.promise ) ) {
     1173                                        returned.promise()
     1174                                            .done( newDefer.resolve )
     1175                                            .fail( newDefer.reject )
     1176                                            .progress( newDefer.notify );
     1177                                    } else {
     1178                                        newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, [ returned ] );
     1179                                    }
     1180                                } :
     1181                                newDefer[ action ]
     1182                            );
     1183                        });
     1184                        fns = null;
     1185                    }).promise();
     1186                },
     1187                // Get a promise for this deferred
     1188                // If obj is provided, the promise aspect is added to the object
     1189                promise: function( obj ) {
     1190                    return obj != null ? jQuery.extend( obj, promise ) : promise;
     1191                }
     1192            },
     1193            deferred = {};
     1194
     1195        // Keep pipe for back-compat
     1196        promise.pipe = promise.then;
     1197
     1198        // Add list-specific methods
     1199        jQuery.each( tuples, function( i, tuple ) {
     1200            var list = tuple[ 2 ],
     1201                stateString = tuple[ 3 ];
     1202
     1203            // promise[ done | fail | progress ] = list.add
     1204            promise[ tuple[1] ] = list.add;
     1205
     1206            // Handle state
     1207            if ( stateString ) {
     1208                list.add(function() {
     1209                    // state = [ resolved | rejected ]
     1210                    state = stateString;
     1211
     1212                // [ reject_list | resolve_list ].disable; progress_list.lock
     1213                }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
     1214            }
     1215
     1216            // deferred[ resolve | reject | notify ]
     1217            deferred[ tuple[0] ] = function() {
     1218                deferred[ tuple[0] + "With" ]( promise, arguments );
     1219                return this;
     1220            };
     1221            deferred[ tuple[0] + "With" ] = list.fireWith;
     1222        });
     1223
     1224        // Make the deferred a promise
     1225        promise.promise( deferred );
     1226
     1227        // Call given func if any
     1228        if ( func ) {
     1229            func.call( deferred, deferred );
     1230        }
     1231
     1232        // All done!
     1233        return deferred;
     1234    },
     1235
     1236    // Deferred helper
     1237    when: function( subordinate /* , ..., subordinateN */ ) {
     1238        var i = 0,
     1239            resolveValues = core_slice.call( arguments ),
     1240            length = resolveValues.length,
     1241
     1242            // the count of uncompleted subordinates
     1243            remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
     1244
     1245            // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
     1246            deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
     1247
     1248            // Update function for both resolve and progress values
     1249            updateFunc = function( i, contexts, values ) {
     1250                return function( value ) {
     1251                    contexts[ i ] = this;
     1252                    values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
     1253                    if( values === progressValues ) {
     1254                        deferred.notifyWith( contexts, values );
     1255                    } else if ( !( --remaining ) ) {
     1256                        deferred.resolveWith( contexts, values );
     1257                    }
     1258                };
     1259            },
     1260
     1261            progressValues, progressContexts, resolveContexts;
     1262
     1263        // add listeners to Deferred subordinates; treat others as resolved
     1264        if ( length > 1 ) {
     1265            progressValues = new Array( length );
     1266            progressContexts = new Array( length );
     1267            resolveContexts = new Array( length );
     1268            for ( ; i < length; i++ ) {
     1269                if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
     1270                    resolveValues[ i ].promise()
     1271                        .done( updateFunc( i, resolveContexts, resolveValues ) )
     1272                        .fail( deferred.reject )
     1273                        .progress( updateFunc( i, progressContexts, progressValues ) );
     1274                } else {
     1275                    --remaining;
     1276                }
     1277            }
     1278        }
     1279
     1280        // if we're not waiting on anything, resolve the master
     1281        if ( !remaining ) {
     1282            deferred.resolveWith( resolveContexts, resolveValues );
     1283        }
     1284
     1285        return deferred.promise();
     1286    }
     1287});
     1288jQuery.support = (function() {
     1289
     1290    var support,
     1291        all,
     1292        a,
     1293        select,
     1294        opt,
     1295        input,
     1296        fragment,
     1297        eventName,
     1298        i,
     1299        isSupported,
     1300        clickFn,
     1301        div = document.createElement("div");
     1302
     1303    // Setup
     1304    div.setAttribute( "className", "t" );
     1305    div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
     1306
     1307    // Support tests won't run in some limited or non-browser environments
     1308    all = div.getElementsByTagName("*");
     1309    a = div.getElementsByTagName("a")[ 0 ];
     1310    if ( !all || !a || !all.length ) {
     1311        return {};
     1312    }
     1313
     1314    // First batch of tests
     1315    select = document.createElement("select");
     1316    opt = select.appendChild( document.createElement("option") );
     1317    input = div.getElementsByTagName("input")[ 0 ];
     1318
     1319    a.style.cssText = "top:1px;float:left;opacity:.5";
     1320    support = {
     1321        // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
     1322        getSetAttribute: div.className !== "t",
     1323
     1324        // IE strips leading whitespace when .innerHTML is used
     1325        leadingWhitespace: div.firstChild.nodeType === 3,
     1326
     1327        // Make sure that tbody elements aren't automatically inserted
     1328        // IE will insert them into empty tables
     1329        tbody: !div.getElementsByTagName("tbody").length,
     1330
     1331        // Make sure that link elements get serialized correctly by innerHTML
     1332        // This requires a wrapper element in IE
     1333        htmlSerialize: !!div.getElementsByTagName("link").length,
     1334
     1335        // Get the style information from getAttribute
     1336        // (IE uses .cssText instead)
     1337        style: /top/.test( a.getAttribute("style") ),
     1338
     1339        // Make sure that URLs aren't manipulated
     1340        // (IE normalizes it by default)
     1341        hrefNormalized: a.getAttribute("href") === "/a",
     1342
     1343        // Make sure that element opacity exists
     1344        // (IE uses filter instead)
     1345        // Use a regex to work around a WebKit issue. See #5145
     1346        opacity: /^0.5/.test( a.style.opacity ),
     1347
     1348        // Verify style float existence
     1349        // (IE uses styleFloat instead of cssFloat)
     1350        cssFloat: !!a.style.cssFloat,
     1351
     1352        // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
     1353        checkOn: !!input.value,
     1354
     1355        // Make sure that a selected-by-default option has a working selected property.
     1356        // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
     1357        optSelected: opt.selected,
     1358
     1359        // Tests for enctype support on a form (#6743)
     1360        enctype: !!document.createElement("form").enctype,
     1361
     1362        // Makes sure cloning an html5 element does not cause problems
     1363        // Where outerHTML is undefined, this still works
     1364        html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
     1365
     1366        // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
     1367        boxModel: document.compatMode === "CSS1Compat",
     1368
     1369        // Will be defined later
     1370        submitBubbles: true,
     1371        changeBubbles: true,
     1372        focusinBubbles: false,
     1373        deleteExpando: true,
     1374        noCloneEvent: true,
     1375        inlineBlockNeedsLayout: false,
     1376        shrinkWrapBlocks: false,
     1377        reliableMarginRight: true,
     1378        boxSizingReliable: true,
     1379        pixelPosition: false
     1380    };
     1381
     1382    // Make sure checked status is properly cloned
     1383    input.checked = true;
     1384    support.noCloneChecked = input.cloneNode( true ).checked;
     1385
     1386    // Make sure that the options inside disabled selects aren't marked as disabled
     1387    // (WebKit marks them as disabled)
     1388    select.disabled = true;
     1389    support.optDisabled = !opt.disabled;
     1390
     1391    // Test to see if it's possible to delete an expando from an element
     1392    // Fails in Internet Explorer
     1393    try {
     1394        delete div.test;
     1395    } catch( e ) {
     1396        support.deleteExpando = false;
     1397    }
     1398
     1399    if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
     1400        div.attachEvent( "onclick", clickFn = function() {
     1401            // Cloning a node shouldn't copy over any
     1402            // bound event handlers (IE does this)
     1403            support.noCloneEvent = false;
     1404        });
     1405        div.cloneNode( true ).fireEvent("onclick");
     1406        div.detachEvent( "onclick", clickFn );
     1407    }
     1408
     1409    // Check if we can trust getAttribute("value")
     1410    input = document.createElement("input");
     1411    input.setAttribute( "value", "" );
     1412    support.input = input.getAttribute( "value" ) === "";
     1413
     1414    // Check if an input maintains its value after becoming a radio
     1415    input.value = "t";
     1416    input.setAttribute( "type", "radio" );
     1417    support.radioValue = input.value === "t";
     1418
     1419    // #11217 - WebKit loses check when the name is after the checked attribute
     1420    input.setAttribute( "checked", "checked" );
     1421    input.setAttribute( "name", "t" );
     1422
     1423    div.appendChild( input );
     1424    fragment = document.createDocumentFragment();
     1425    fragment.appendChild( div.lastChild );
     1426
     1427    // WebKit doesn't clone checked state correctly in fragments
     1428    support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
     1429
     1430    // Check if a disconnected checkbox will retain its checked
     1431    // value of true after appended to the DOM (IE6/7)
     1432    support.appendChecked = input.checked;
     1433
     1434    fragment.removeChild( input );
     1435    fragment.appendChild( div );
     1436
     1437    // Technique from Juriy Zaytsev
     1438    // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
     1439    // We only care about the case where non-standard event systems
     1440    // are used, namely in IE. Short-circuiting here helps us to
     1441    // avoid an eval call (in setAttribute) which can cause CSP
     1442    // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
     1443    if ( div.attachEvent ) {
     1444        for ( i in {
     1445            submit: true,
     1446            change: true,
     1447            focusin: true
     1448        }) {
     1449            eventName = "on" + i;
     1450            isSupported = ( eventName in div );
     1451            if ( !isSupported ) {
     1452                div.setAttribute( eventName, "return;" );
     1453                isSupported = ( typeof div[ eventName ] === "function" );
     1454            }
     1455            support[ i + "Bubbles" ] = isSupported;
     1456        }
     1457    }
     1458
     1459    // Run tests that need a body at doc ready
     1460    jQuery(function() {
     1461        var container, div, tds, marginDiv,
     1462            divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
     1463            body = document.getElementsByTagName("body")[0];
     1464
     1465        if ( !body ) {
     1466            // Return for frameset docs that don't have a body
     1467            return;
     1468        }
     1469
     1470        container = document.createElement("div");
     1471        container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
     1472        body.insertBefore( container, body.firstChild );
     1473
     1474        // Construct the test element
     1475        div = document.createElement("div");
     1476        container.appendChild( div );
     1477
     1478        // Check if table cells still have offsetWidth/Height when they are set
     1479        // to display:none and there are still other visible table cells in a
     1480        // table row; if so, offsetWidth/Height are not reliable for use when
     1481        // determining if an element has been hidden directly using
     1482        // display:none (it is still safe to use offsets if a parent element is
     1483        // hidden; don safety goggles and see bug #4512 for more information).
     1484        // (only IE 8 fails this test)
     1485        div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
     1486        tds = div.getElementsByTagName("td");
     1487        tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
     1488        isSupported = ( tds[ 0 ].offsetHeight === 0 );
     1489
     1490        tds[ 0 ].style.display = "";
     1491        tds[ 1 ].style.display = "none";
     1492
     1493        // Check if empty table cells still have offsetWidth/Height
     1494        // (IE <= 8 fail this test)
     1495        support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
     1496
     1497        // Check box-sizing and margin behavior
     1498        div.innerHTML = "";
     1499        div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
     1500        support.boxSizing = ( div.offsetWidth === 4 );
     1501        support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
     1502
     1503        // NOTE: To any future maintainer, we've window.getComputedStyle
     1504        // because jsdom on node.js will break without it.
     1505        if ( window.getComputedStyle ) {
     1506            support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
     1507            support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
     1508
     1509            // Check if div with explicit width and no margin-right incorrectly
     1510            // gets computed margin-right based on width of container. For more
     1511            // info see bug #3333
     1512            // Fails in WebKit before Feb 2011 nightlies
     1513            // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
     1514            marginDiv = document.createElement("div");
     1515            marginDiv.style.cssText = div.style.cssText = divReset;
     1516            marginDiv.style.marginRight = marginDiv.style.width = "0";
     1517            div.style.width = "1px";
     1518            div.appendChild( marginDiv );
     1519            support.reliableMarginRight =
     1520                !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
     1521        }
     1522
     1523        if ( typeof div.style.zoom !== "undefined" ) {
     1524            // Check if natively block-level elements act like inline-block
     1525            // elements when setting their display to 'inline' and giving
     1526            // them layout
     1527            // (IE < 8 does this)
     1528            div.innerHTML = "";
     1529            div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
     1530            support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
     1531
     1532            // Check if elements with layout shrink-wrap their children
     1533            // (IE 6 does this)
     1534            div.style.display = "block";
     1535            div.style.overflow = "visible";
     1536            div.innerHTML = "<div></div>";
     1537            div.firstChild.style.width = "5px";
     1538            support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
     1539
     1540            // Prevent IE 6 from affecting layout for positioned elements #11048
     1541            // Prevent IE from shrinking the body in IE 7 mode #12869
     1542            body.style.zoom = 1;
     1543        }
     1544
     1545        // Null elements to avoid leaks in IE
     1546        body.removeChild( container );
     1547        container = div = tds = marginDiv = null;
     1548    });
     1549
     1550    // Null elements to avoid leaks in IE
     1551    fragment.removeChild( div );
     1552    all = a = select = opt = input = fragment = div = null;
     1553
     1554    return support;
     1555})();
     1556var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
     1557    rmultiDash = /([A-Z])/g;
     1558
     1559function internalData( elem, name, data, pvt /* Internal Use Only */ ){
     1560    if ( !jQuery.acceptData( elem ) ) {
     1561        return;
     1562    }
     1563
     1564    var thisCache, ret,
     1565        internalKey = jQuery.expando,
     1566        getByName = typeof name === "string",
     1567
     1568        // We have to handle DOM nodes and JS objects differently because IE6-7
     1569        // can't GC object references properly across the DOM-JS boundary
     1570        isNode = elem.nodeType,
     1571
     1572        // Only DOM nodes need the global jQuery cache; JS object data is
     1573        // attached directly to the object so GC can occur automatically
     1574        cache = isNode ? jQuery.cache : elem,
     1575
     1576        // Only defining an ID for JS objects if its cache already exists allows
     1577        // the code to shortcut on the same path as a DOM node with no cache
     1578        id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
     1579
     1580    // Avoid doing any more work than we need to when trying to get data on an
     1581    // object that has no data at all
     1582    if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
     1583        return;
     1584    }
     1585
     1586    if ( !id ) {
     1587        // Only DOM nodes need a new unique ID for each element since their data
     1588        // ends up in the global cache
     1589        if ( isNode ) {
     1590            elem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++;
     1591        } else {
     1592            id = internalKey;
     1593        }
     1594    }
     1595
     1596    if ( !cache[ id ] ) {
     1597        cache[ id ] = {};
     1598
     1599        // Avoids exposing jQuery metadata on plain JS objects when the object
     1600        // is serialized using JSON.stringify
     1601        if ( !isNode ) {
     1602            cache[ id ].toJSON = jQuery.noop;
     1603        }
     1604    }
     1605
     1606    // An object can be passed to jQuery.data instead of a key/value pair; this gets
     1607    // shallow copied over onto the existing cache
     1608    if ( typeof name === "object" || typeof name === "function" ) {
     1609        if ( pvt ) {
     1610            cache[ id ] = jQuery.extend( cache[ id ], name );
     1611        } else {
     1612            cache[ id ].data = jQuery.extend( cache[ id ].data, name );
     1613        }
     1614    }
     1615
     1616    thisCache = cache[ id ];
     1617
     1618    // jQuery data() is stored in a separate object inside the object's internal data
     1619    // cache in order to avoid key collisions between internal data and user-defined
     1620    // data.
     1621    if ( !pvt ) {
     1622        if ( !thisCache.data ) {
     1623            thisCache.data = {};
     1624        }
     1625
     1626        thisCache = thisCache.data;
     1627    }
     1628
     1629    if ( data !== undefined ) {
     1630        thisCache[ jQuery.camelCase( name ) ] = data;
     1631    }
     1632
     1633    // Check for both converted-to-camel and non-converted data property names
     1634    // If a data property was specified
     1635    if ( getByName ) {
     1636
     1637        // First Try to find as-is property data
     1638        ret = thisCache[ name ];
     1639
     1640        // Test for null|undefined property data
     1641        if ( ret == null ) {
     1642
     1643            // Try to find the camelCased property
     1644            ret = thisCache[ jQuery.camelCase( name ) ];
     1645        }
     1646    } else {
     1647        ret = thisCache;
     1648    }
     1649
     1650    return ret;
     1651}
     1652
     1653function internalRemoveData( elem, name, pvt /* For internal use only */ ){
     1654    if ( !jQuery.acceptData( elem ) ) {
     1655        return;
     1656    }
     1657
     1658    var thisCache, i, l,
     1659
     1660        isNode = elem.nodeType,
     1661
     1662        // See jQuery.data for more information
     1663        cache = isNode ? jQuery.cache : elem,
     1664        id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
     1665
     1666    // If there is already no cache entry for this object, there is no
     1667    // purpose in continuing
     1668    if ( !cache[ id ] ) {
     1669        return;
     1670    }
     1671
     1672    if ( name ) {
     1673
     1674        thisCache = pvt ? cache[ id ] : cache[ id ].data;
     1675
     1676        if ( thisCache ) {
     1677
     1678            // Support array or space separated string names for data keys
     1679            if ( !jQuery.isArray( name ) ) {
     1680
     1681                // try the string as a key before any manipulation
     1682                if ( name in thisCache ) {
     1683                    name = [ name ];
     1684                } else {
     1685
     1686                    // split the camel cased version by spaces unless a key with the spaces exists
     1687                    name = jQuery.camelCase( name );
     1688                    if ( name in thisCache ) {
     1689                        name = [ name ];
     1690                    } else {
     1691                        name = name.split(" ");
     1692                    }
     1693                }
     1694            } else {
     1695                // If "name" is an array of keys...
     1696                // When data is initially created, via ("key", "val") signature,
     1697                // keys will be converted to camelCase.
     1698                // Since there is no way to tell _how_ a key was added, remove
     1699                // both plain key and camelCase key. #12786
     1700                // This will only penalize the array argument path.
     1701                name = name.concat( jQuery.map( name, jQuery.camelCase ) );
     1702            }
     1703
     1704            for ( i = 0, l = name.length; i < l; i++ ) {
     1705                delete thisCache[ name[i] ];
     1706            }
     1707
     1708            // If there is no data left in the cache, we want to continue
     1709            // and let the cache object itself get destroyed
     1710            if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
     1711                return;
     1712            }
     1713        }
     1714    }
     1715
     1716    // See jQuery.data for more information
     1717    if ( !pvt ) {
     1718        delete cache[ id ].data;
     1719
     1720        // Don't destroy the parent cache unless the internal data object
     1721        // had been the only thing left in it
     1722        if ( !isEmptyDataObject( cache[ id ] ) ) {
     1723            return;
     1724        }
     1725    }
     1726
     1727    // Destroy the cache
     1728    if ( isNode ) {
     1729        jQuery.cleanData( [ elem ], true );
     1730
     1731    // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
     1732    } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
     1733        delete cache[ id ];
     1734
     1735    // When all else fails, null
     1736    } else {
     1737        cache[ id ] = null;
     1738    }
     1739}
     1740
     1741jQuery.extend({
     1742    cache: {},
     1743
     1744    // Unique for each copy of jQuery on the page
     1745    // Non-digits removed to match rinlinejQuery
     1746    expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
     1747
     1748    // The following elements throw uncatchable exceptions if you
     1749    // attempt to add expando properties to them.
     1750    noData: {
     1751        "embed": true,
     1752        // Ban all objects except for Flash (which handle expandos)
     1753        "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
     1754        "applet": true
     1755    },
     1756
     1757    hasData: function( elem ) {
     1758        elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
     1759        return !!elem && !isEmptyDataObject( elem );
     1760    },
     1761
     1762    data: function( elem, name, data ) {
     1763        return internalData( elem, name, data, false );
     1764    },
     1765
     1766    removeData: function( elem, name ) {
     1767        return internalRemoveData( elem, name, false );
     1768    },
     1769
     1770    // For internal use only.
     1771    _data: function( elem, name, data ) {
     1772        return internalData( elem, name, data, true );
     1773    },
     1774
     1775    _removeData: function( elem, name ) {
     1776        return internalRemoveData( elem, name, true );
     1777    },
     1778
     1779    // A method for determining if a DOM node can handle the data expando
     1780    acceptData: function( elem ) {
     1781        var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
     1782
     1783        // nodes accept data unless otherwise specified; rejection can be conditional
     1784        return !noData || noData !== true && elem.getAttribute("classid") === noData;
     1785    }
     1786});
     1787
     1788jQuery.fn.extend({
     1789    data: function( key, value ) {
     1790        var attrs, name,
     1791            elem = this[0],
     1792            i = 0,
     1793            data = null;
     1794
     1795        // Gets all values
     1796        if ( key === undefined ) {
     1797            if ( this.length ) {
     1798                data = jQuery.data( elem );
     1799
     1800                if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
     1801                    attrs = elem.attributes;
     1802                    for ( ; i < attrs.length; i++ ) {
     1803                        name = attrs[i].name;
     1804
     1805                        if ( !name.indexOf( "data-" ) ) {
     1806                            name = jQuery.camelCase( name.substring(5) );
     1807
     1808                            dataAttr( elem, name, data[ name ] );
     1809                        }
     1810                    }
     1811                    jQuery._data( elem, "parsedAttrs", true );
     1812                }
     1813            }
     1814
     1815            return data;
     1816        }
     1817
     1818        // Sets multiple values
     1819        if ( typeof key === "object" ) {
     1820            return this.each(function() {
     1821                jQuery.data( this, key );
     1822            });
     1823        }
     1824
     1825        return jQuery.access( this, function( value ) {
     1826
     1827            if ( value === undefined ) {
     1828                // Try to fetch any internally stored data first
     1829                return elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
     1830            }
     1831
     1832            this.each(function() {
     1833                jQuery.data( this, key, value );
     1834            });
     1835        }, null, value, arguments.length > 1, null, true );
     1836    },
     1837
     1838    removeData: function( key ) {
     1839        return this.each(function() {
     1840            jQuery.removeData( this, key );
     1841        });
     1842    }
     1843});
     1844
     1845function dataAttr( elem, key, data ) {
     1846    // If nothing was found internally, try to fetch any
     1847    // data from the HTML5 data-* attribute
     1848    if ( data === undefined && elem.nodeType === 1 ) {
     1849
     1850        var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
     1851
     1852        data = elem.getAttribute( name );
     1853
     1854        if ( typeof data === "string" ) {
     1855            try {
     1856                data = data === "true" ? true :
     1857                data === "false" ? false :
     1858                data === "null" ? null :
     1859                // Only convert to a number if it doesn't change the string
     1860                +data + "" === data ? +data :
     1861                rbrace.test( data ) ? jQuery.parseJSON( data ) :
     1862                    data;
     1863            } catch( e ) {}
     1864
     1865            // Make sure we set the data so it isn't changed later
     1866            jQuery.data( elem, key, data );
     1867
     1868        } else {
     1869            data = undefined;
     1870        }
     1871    }
     1872
     1873    return data;
     1874}
     1875
     1876// checks a cache object for emptiness
     1877function isEmptyDataObject( obj ) {
     1878    var name;
     1879    for ( name in obj ) {
     1880
     1881        // if the public data object is empty, the private is still empty
     1882        if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
     1883            continue;
     1884        }
     1885        if ( name !== "toJSON" ) {
     1886            return false;
     1887        }
     1888    }
     1889
     1890    return true;
     1891}
     1892jQuery.extend({
     1893    queue: function( elem, type, data ) {
     1894        var queue;
     1895
     1896        if ( elem ) {
     1897            type = ( type || "fx" ) + "queue";
     1898            queue = jQuery._data( elem, type );
     1899
     1900            // Speed up dequeue by getting out quickly if this is just a lookup
     1901            if ( data ) {
     1902                if ( !queue || jQuery.isArray(data) ) {
     1903                    queue = jQuery._data( elem, type, jQuery.makeArray(data) );
     1904                } else {
     1905                    queue.push( data );
     1906                }
     1907            }
     1908            return queue || [];
     1909        }
     1910    },
     1911
     1912    dequeue: function( elem, type ) {
     1913        type = type || "fx";
     1914
     1915        var queue = jQuery.queue( elem, type ),
     1916            startLength = queue.length,
     1917            fn = queue.shift(),
     1918            hooks = jQuery._queueHooks( elem, type ),
     1919            next = function() {
     1920                jQuery.dequeue( elem, type );
     1921            };
     1922
     1923        // If the fx queue is dequeued, always remove the progress sentinel
     1924        if ( fn === "inprogress" ) {
     1925            fn = queue.shift();
     1926            startLength--;
     1927        }
     1928
     1929        if ( fn ) {
     1930
     1931            // Add a progress sentinel to prevent the fx queue from being
     1932            // automatically dequeued
     1933            if ( type === "fx" ) {
     1934                queue.unshift( "inprogress" );
     1935            }
     1936
     1937            // clear up the last queue stop function
     1938            delete hooks.stop;
     1939            fn.call( elem, next, hooks );
     1940        }
     1941
     1942        if ( !startLength && hooks ) {
     1943            hooks.empty.fire();
     1944        }
     1945    },
     1946
     1947    // not intended for public consumption - generates a queueHooks object, or returns the current one
     1948    _queueHooks: function( elem, type ) {
     1949        var key = type + "queueHooks";
     1950        return jQuery._data( elem, key ) || jQuery._data( elem, key, {
     1951            empty: jQuery.Callbacks("once memory").add(function() {
     1952                jQuery._removeData( elem, type + "queue" );
     1953                jQuery._removeData( elem, key );
     1954            })
     1955        });
     1956    }
     1957});
     1958
     1959jQuery.fn.extend({
     1960    queue: function( type, data ) {
     1961        var setter = 2;
     1962
     1963        if ( typeof type !== "string" ) {
     1964            data = type;
     1965            type = "fx";
     1966            setter--;
     1967        }
     1968
     1969        if ( arguments.length < setter ) {
     1970            return jQuery.queue( this[0], type );
     1971        }
     1972
     1973        return data === undefined ?
     1974            this :
     1975            this.each(function() {
     1976                var queue = jQuery.queue( this, type, data );
     1977
     1978                // ensure a hooks for this queue
     1979                jQuery._queueHooks( this, type );
     1980
     1981                if ( type === "fx" && queue[0] !== "inprogress" ) {
     1982                    jQuery.dequeue( this, type );
     1983                }
     1984            });
     1985    },
     1986    dequeue: function( type ) {
     1987        return this.each(function() {
     1988            jQuery.dequeue( this, type );
     1989        });
     1990    },
     1991    // Based off of the plugin by Clint Helfers, with permission.
     1992    // http://blindsignals.com/index.php/2009/07/jquery-delay/
     1993    delay: function( time, type ) {
     1994        time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
     1995        type = type || "fx";
     1996
     1997        return this.queue( type, function( next, hooks ) {
     1998            var timeout = setTimeout( next, time );
     1999            hooks.stop = function() {
     2000                clearTimeout( timeout );
     2001            };
     2002        });
     2003    },
     2004    clearQueue: function( type ) {
     2005        return this.queue( type || "fx", [] );
     2006    },
     2007    // Get a promise resolved when queues of a certain type
     2008    // are emptied (fx is the type by default)
     2009    promise: function( type, obj ) {
     2010        var tmp,
     2011            count = 1,
     2012            defer = jQuery.Deferred(),
     2013            elements = this,
     2014            i = this.length,
     2015            resolve = function() {
     2016                if ( !( --count ) ) {
     2017                    defer.resolveWith( elements, [ elements ] );
     2018                }
     2019            };
     2020
     2021        if ( typeof type !== "string" ) {
     2022            obj = type;
     2023            type = undefined;
     2024        }
     2025        type = type || "fx";
     2026
     2027        while( i-- ) {
     2028            tmp = jQuery._data( elements[ i ], type + "queueHooks" );
     2029            if ( tmp && tmp.empty ) {
     2030                count++;
     2031                tmp.empty.add( resolve );
     2032            }
     2033        }
     2034        resolve();
     2035        return defer.promise( obj );
     2036    }
     2037});
     2038var nodeHook, boolHook,
     2039    rclass = /[\t\r\n]/g,
     2040    rreturn = /\r/g,
     2041    rfocusable = /^(?:input|select|textarea|button|object)$/i,
     2042    rclickable = /^(?:a|area)$/i,
     2043    rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,
     2044    ruseDefault = /^(?:checked|selected)$/i,
     2045    getSetAttribute = jQuery.support.getSetAttribute,
     2046    getSetInput = jQuery.support.input;
     2047
     2048jQuery.fn.extend({
     2049    attr: function( name, value ) {
     2050        return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
     2051    },
     2052
     2053    removeAttr: function( name ) {
     2054        return this.each(function() {
     2055            jQuery.removeAttr( this, name );
     2056        });
     2057    },
     2058
     2059    prop: function( name, value ) {
     2060        return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
     2061    },
     2062
     2063    removeProp: function( name ) {
     2064        name = jQuery.propFix[ name ] || name;
     2065        return this.each(function() {
     2066            // try/catch handles cases where IE balks (such as removing a property on window)
     2067            try {
     2068                this[ name ] = undefined;
     2069                delete this[ name ];
     2070            } catch( e ) {}
     2071        });
     2072    },
     2073
     2074    addClass: function( value ) {
     2075        var classes, elem, cur, clazz, j,
     2076            i = 0,
     2077            len = this.length,
     2078            proceed = typeof value === "string" && value;
     2079
     2080        if ( jQuery.isFunction( value ) ) {
     2081            return this.each(function( j ) {
     2082                jQuery( this ).addClass( value.call( this, j, this.className ) );
     2083            });
     2084        }
     2085
     2086        if ( proceed ) {
     2087            // The disjunction here is for better compressibility (see removeClass)
     2088            classes = ( value || "" ).match( core_rnotwhite ) || [];
     2089
     2090            for ( ; i < len; i++ ) {
     2091                elem = this[ i ];
     2092                cur = elem.nodeType === 1 && ( elem.className ?
     2093                    ( " " + elem.className + " " ).replace( rclass, " " ) :
     2094                    " "
     2095                );
     2096
     2097                if ( cur ) {
     2098                    j = 0;
     2099                    while ( (clazz = classes[j++]) ) {
     2100                        if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
     2101                            cur += clazz + " ";
     2102                        }
     2103                    }
     2104                    elem.className = jQuery.trim( cur );
     2105
     2106                }
     2107            }
     2108        }
     2109
     2110        return this;
     2111    },
     2112
     2113    removeClass: function( value ) {
     2114        var classes, elem, cur, clazz, j,
     2115            i = 0,
     2116            len = this.length,
     2117            proceed = arguments.length === 0 || typeof value === "string" && value;
     2118
     2119        if ( jQuery.isFunction( value ) ) {
     2120            return this.each(function( j ) {
     2121                jQuery( this ).removeClass( value.call( this, j, this.className ) );
     2122            });
     2123        }
     2124        if ( proceed ) {
     2125            classes = ( value || "" ).match( core_rnotwhite ) || [];
     2126
     2127            for ( ; i < len; i++ ) {
     2128                elem = this[ i ];
     2129                // This expression is here for better compressibility (see addClass)
     2130                cur = elem.nodeType === 1 && ( elem.className ?
     2131                    ( " " + elem.className + " " ).replace( rclass, " " ) :
     2132                    ""
     2133                );
     2134
     2135                if ( cur ) {
     2136                    j = 0;
     2137                    while ( (clazz = classes[j++]) ) {
     2138                        // Remove *all* instances
     2139                        while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
     2140                            cur = cur.replace( " " + clazz + " ", " " );
     2141                        }
     2142                    }
     2143                    elem.className = value ? jQuery.trim( cur ) : "";
     2144                }
     2145            }
     2146        }
     2147
     2148        return this;
     2149    },
     2150
     2151    toggleClass: function( value, stateVal ) {
     2152        var type = typeof value,
     2153            isBool = typeof stateVal === "boolean";
     2154
     2155        if ( jQuery.isFunction( value ) ) {
     2156            return this.each(function( i ) {
     2157                jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
     2158            });
     2159        }
     2160
     2161        return this.each(function() {
     2162            if ( type === "string" ) {
     2163                // toggle individual class names
     2164                var className,
     2165                    i = 0,
     2166                    self = jQuery( this ),
     2167                    state = stateVal,
     2168                    classNames = value.match( core_rnotwhite ) || [];
     2169
     2170                while ( (className = classNames[ i++ ]) ) {
     2171                    // check each className given, space separated list
     2172                    state = isBool ? state : !self.hasClass( className );
     2173                    self[ state ? "addClass" : "removeClass" ]( className );
     2174                }
     2175
     2176            // Toggle whole class name
     2177            } else if ( type === "undefined" || type === "boolean" ) {
     2178                if ( this.className ) {
     2179                    // store className if set
     2180                    jQuery._data( this, "__className__", this.className );
     2181                }
     2182
     2183                // If the element has a class name or if we're passed "false",
     2184                // then remove the whole classname (if there was one, the above saved it).
     2185                // Otherwise bring back whatever was previously saved (if anything),
     2186                // falling back to the empty string if nothing was stored.
     2187                this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
     2188            }
     2189        });
     2190    },
     2191
     2192    hasClass: function( selector ) {
     2193        var className = " " + selector + " ",
     2194            i = 0,
     2195            l = this.length;
     2196        for ( ; i < l; i++ ) {
     2197            if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
     2198                return true;
     2199            }
     2200        }
     2201
     2202        return false;
     2203    },
     2204
     2205    val: function( value ) {
     2206        var hooks, ret, isFunction,
     2207            elem = this[0];
     2208
     2209        if ( !arguments.length ) {
     2210            if ( elem ) {
     2211                hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
     2212
     2213                if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
     2214                    return ret;
     2215                }
     2216
     2217                ret = elem.value;
     2218
     2219                return typeof ret === "string" ?
     2220                    // handle most common string cases
     2221                    ret.replace(rreturn, "") :
     2222                    // handle cases where value is null/undef or number
     2223                    ret == null ? "" : ret;
     2224            }
     2225
     2226            return;
     2227        }
     2228
     2229        isFunction = jQuery.isFunction( value );
     2230
     2231        return this.each(function( i ) {
     2232            var val,
     2233                self = jQuery(this);
     2234
     2235            if ( this.nodeType !== 1 ) {
     2236                return;
     2237            }
     2238
     2239            if ( isFunction ) {
     2240                val = value.call( this, i, self.val() );
     2241            } else {
     2242                val = value;
     2243            }
     2244
     2245            // Treat null/undefined as ""; convert numbers to string
     2246            if ( val == null ) {
     2247                val = "";
     2248            } else if ( typeof val === "number" ) {
     2249                val += "";
     2250            } else if ( jQuery.isArray( val ) ) {
     2251                val = jQuery.map(val, function ( value ) {
     2252                    return value == null ? "" : value + "";
     2253                });
     2254            }
     2255
     2256            hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
     2257
     2258            // If set returns undefined, fall back to normal setting
     2259            if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
     2260                this.value = val;
     2261            }
     2262        });
     2263    }
     2264});
     2265
     2266jQuery.extend({
     2267    valHooks: {
     2268        option: {
     2269            get: function( elem ) {
     2270                // attributes.value is undefined in Blackberry 4.7 but
     2271                // uses .value. See #6932
     2272                var val = elem.attributes.value;
     2273                return !val || val.specified ? elem.value : elem.text;
     2274            }
     2275        },
     2276        select: {
     2277            get: function( elem ) {
     2278                var value, option,
     2279                    options = elem.options,
     2280                    index = elem.selectedIndex,
     2281                    one = elem.type === "select-one" || index < 0,
     2282                    values = one ? null : [],
     2283                    max = one ? index + 1 : options.length,
     2284                    i = index < 0 ?
     2285                        max :
     2286                        one ? index : 0;
     2287
     2288                // Loop through all the selected options
     2289                for ( ; i < max; i++ ) {
     2290                    option = options[ i ];
     2291
     2292                    // oldIE doesn't update selected after form reset (#2551)
     2293                    if ( ( option.selected || i === index ) &&
     2294                            // Don't return options that are disabled or in a disabled optgroup
     2295                            ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
     2296                            ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
     2297
     2298                        // Get the specific value for the option
     2299                        value = jQuery( option ).val();
     2300
     2301                        // We don't need an array for one selects
     2302                        if ( one ) {
     2303                            return value;
     2304                        }
     2305
     2306                        // Multi-Selects return an array
     2307                        values.push( value );
     2308                    }
     2309                }
     2310
     2311                return values;
     2312            },
     2313
     2314            set: function( elem, value ) {
     2315                var values = jQuery.makeArray( value );
     2316
     2317                jQuery(elem).find("option").each(function() {
     2318                    this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
     2319                });
     2320
     2321                if ( !values.length ) {
     2322                    elem.selectedIndex = -1;
     2323                }
     2324                return values;
     2325            }
     2326        }
     2327    },
     2328
     2329    attr: function( elem, name, value ) {
     2330        var ret, hooks, notxml,
     2331            nType = elem.nodeType;
     2332
     2333        // don't get/set attributes on text, comment and attribute nodes
     2334        if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
     2335            return;
     2336        }
     2337
     2338        // Fallback to prop when attributes are not supported
     2339        if ( typeof elem.getAttribute === "undefined" ) {
     2340            return jQuery.prop( elem, name, value );
     2341        }
     2342
     2343        notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
     2344
     2345        // All attributes are lowercase
     2346        // Grab necessary hook if one is defined
     2347        if ( notxml ) {
     2348            name = name.toLowerCase();
     2349            hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
     2350        }
     2351
     2352        if ( value !== undefined ) {
     2353
     2354            if ( value === null ) {
     2355                jQuery.removeAttr( elem, name );
     2356
     2357            } else if ( hooks && notxml && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
     2358                return ret;
     2359
     2360            } else {
     2361                elem.setAttribute( name, value + "" );
     2362                return value;
     2363            }
     2364
     2365        } else if ( hooks && notxml && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
     2366            return ret;
     2367
     2368        } else {
     2369
     2370            ret = elem.getAttribute( name );
     2371
     2372            // Non-existent attributes return null, we normalize to undefined
     2373            return ret == null ?
     2374                undefined :
     2375                ret;
     2376        }
     2377    },
     2378
     2379    removeAttr: function( elem, value ) {
     2380        var name, propName,
     2381            i = 0,
     2382            attrNames = value && value.match( core_rnotwhite );
     2383
     2384        if ( attrNames && elem.nodeType === 1 ) {
     2385            while ( (name = attrNames[i++]) ) {
     2386                propName = jQuery.propFix[ name ] || name;
     2387
     2388                // Boolean attributes get special treatment (#10870)
     2389                if ( rboolean.test( name ) ) {
     2390                    // Set corresponding property to false for boolean attributes
     2391                    // Also clear defaultChecked/defaultSelected (if appropriate) for IE<8
     2392                    if ( !getSetAttribute && ruseDefault.test( name ) ) {
     2393                        elem[ jQuery.camelCase( "default-" + name ) ] =
     2394                            elem[ propName ] = false;
     2395                    } else {
     2396                        elem[ propName ] = false;
     2397                    }
     2398
     2399                // See #9699 for explanation of this approach (setting first, then removal)
     2400                } else {
     2401                    jQuery.attr( elem, name, "" );
     2402                }
     2403
     2404                elem.removeAttribute( getSetAttribute ? name : propName );
     2405            }
     2406        }
     2407    },
     2408
     2409    attrHooks: {
     2410        type: {
     2411            set: function( elem, value ) {
     2412                if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
     2413                    // Setting the type on a radio button after the value resets the value in IE6-9
     2414                    // Reset value to default in case type is set after value during creation
     2415                    var val = elem.value;
     2416                    elem.setAttribute( "type", value );
     2417                    if ( val ) {
     2418                        elem.value = val;
     2419                    }
     2420                    return value;
     2421                }
     2422            }
     2423        }
     2424    },
     2425
     2426    propFix: {
     2427        tabindex: "tabIndex",
     2428        readonly: "readOnly",
     2429        "for": "htmlFor",
     2430        "class": "className",
     2431        maxlength: "maxLength",
     2432        cellspacing: "cellSpacing",
     2433        cellpadding: "cellPadding",
     2434        rowspan: "rowSpan",
     2435        colspan: "colSpan",
     2436        usemap: "useMap",
     2437        frameborder: "frameBorder",
     2438        contenteditable: "contentEditable"
     2439    },
     2440
     2441    prop: function( elem, name, value ) {
     2442        var ret, hooks, notxml,
     2443            nType = elem.nodeType;
     2444
     2445        // don't get/set properties on text, comment and attribute nodes
     2446        if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
     2447            return;
     2448        }
     2449
     2450        notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
     2451
     2452        if ( notxml ) {
     2453            // Fix name and attach hooks
     2454            name = jQuery.propFix[ name ] || name;
     2455            hooks = jQuery.propHooks[ name ];
     2456        }
     2457
     2458        if ( value !== undefined ) {
     2459            if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
     2460                return ret;
     2461
     2462            } else {
     2463                return ( elem[ name ] = value );
     2464            }
     2465
     2466        } else {
     2467            if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
     2468                return ret;
     2469
     2470            } else {
     2471                return elem[ name ];
     2472            }
     2473        }
     2474    },
     2475
     2476    propHooks: {
     2477        tabIndex: {
     2478            get: function( elem ) {
     2479                // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
     2480                // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
     2481                var attributeNode = elem.getAttributeNode("tabindex");
     2482
     2483                return attributeNode && attributeNode.specified ?
     2484                    parseInt( attributeNode.value, 10 ) :
     2485                    rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
     2486                        0 :
     2487                        undefined;
     2488            }
     2489        }
     2490    }
     2491});
     2492
     2493// Hook for boolean attributes
     2494boolHook = {
     2495    get: function( elem, name ) {
     2496        var
     2497            // Use .prop to determine if this attribute is understood as boolean
     2498            prop = jQuery.prop( elem, name ),
     2499
     2500            // Fetch it accordingly
     2501            attr = typeof prop === "boolean" && elem.getAttribute( name ),
     2502            detail = typeof prop === "boolean" ?
     2503
     2504                getSetInput && getSetAttribute ?
     2505                    attr != null :
     2506                    // oldIE fabricates an empty string for missing boolean attributes
     2507                    // and conflates checked/selected into attroperties
     2508                    ruseDefault.test( name ) ?
     2509                        elem[ jQuery.camelCase( "default-" + name ) ] :
     2510                        !!attr :
     2511
     2512                // fetch an attribute node for properties not recognized as boolean
     2513                elem.getAttributeNode( name );
     2514
     2515        return detail && detail.value !== false ?
     2516            name.toLowerCase() :
     2517            undefined;
     2518    },
     2519    set: function( elem, value, name ) {
     2520        if ( value === false ) {
     2521            // Remove boolean attributes when set to false
     2522            jQuery.removeAttr( elem, name );
     2523        } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
     2524            // IE<8 needs the *property* name
     2525            elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
     2526
     2527        // Use defaultChecked and defaultSelected for oldIE
     2528        } else {
     2529            elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
     2530        }
     2531
     2532        return name;
     2533    }
     2534};
     2535
     2536// fix oldIE value attroperty
     2537if ( !getSetInput || !getSetAttribute ) {
     2538    jQuery.attrHooks.value = {
     2539        get: function( elem, name ) {
     2540            var ret = elem.getAttributeNode( name );
     2541            return jQuery.nodeName( elem, "input" ) ?
     2542
     2543                // Ignore the value *property* by using defaultValue
     2544                elem.defaultValue :
     2545
     2546                ret && ret.specified ? ret.value : undefined;
     2547        },
     2548        set: function( elem, value, name ) {
     2549            if ( jQuery.nodeName( elem, "input" ) ) {
     2550                // Does not return so that setAttribute is also used
     2551                elem.defaultValue = value;
     2552            } else {
     2553                // Use nodeHook if defined (#1954); otherwise setAttribute is fine
     2554                return nodeHook && nodeHook.set( elem, value, name );
     2555            }
     2556        }
     2557    };
     2558}
     2559
     2560// IE6/7 do not support getting/setting some attributes with get/setAttribute
     2561if ( !getSetAttribute ) {
     2562
     2563    // Use this for any attribute in IE6/7
     2564    // This fixes almost every IE6/7 issue
     2565    nodeHook = jQuery.valHooks.button = {
     2566        get: function( elem, name ) {
     2567            var ret = elem.getAttributeNode( name );
     2568            return ret && ( name === "id" || name === "name" || name === "coords" ? ret.value !== "" : ret.specified ) ?
     2569                ret.value :
     2570                undefined;
     2571        },
     2572        set: function( elem, value, name ) {
     2573            // Set the existing or create a new attribute node
     2574            var ret = elem.getAttributeNode( name );
     2575            if ( !ret ) {
     2576                elem.setAttributeNode(
     2577                    (ret = elem.ownerDocument.createAttribute( name ))
     2578                );
     2579            }
     2580
     2581            ret.value = value += "";
     2582
     2583            // Break association with cloned elements by also using setAttribute (#9646)
     2584            return name === "value" || value === elem.getAttribute( name ) ?
     2585                value :
     2586                undefined;
     2587        }
     2588    };
     2589
     2590    // Set contenteditable to false on removals(#10429)
     2591    // Setting to empty string throws an error as an invalid value
     2592    jQuery.attrHooks.contenteditable = {
     2593        get: nodeHook.get,
     2594        set: function( elem, value, name ) {
     2595            nodeHook.set( elem, value === "" ? false : value, name );
     2596        }
     2597    };
     2598
     2599    // Set width and height to auto instead of 0 on empty string( Bug #8150 )
     2600    // This is for removals
     2601    jQuery.each([ "width", "height" ], function( i, name ) {
     2602        jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
     2603            set: function( elem, value ) {
     2604                if ( value === "" ) {
     2605                    elem.setAttribute( name, "auto" );
     2606                    return value;
     2607                }
     2608            }
     2609        });
     2610    });
     2611}
     2612
     2613
     2614// Some attributes require a special call on IE
     2615// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
     2616if ( !jQuery.support.hrefNormalized ) {
     2617    jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
     2618        jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
     2619            get: function( elem ) {
     2620                var ret = elem.getAttribute( name, 2 );
     2621                return ret == null ? undefined : ret;
     2622            }
     2623        });
     2624    });
     2625
     2626    // href/src property should get the full normalized URL (#10299/#12915)
     2627    jQuery.each([ "href", "src" ], function( i, name ) {
     2628        jQuery.propHooks[ name ] = {
     2629            get: function( elem ) {
     2630                return elem.getAttribute( name, 4 );
     2631            }
     2632        };
     2633    });
     2634}
     2635
     2636if ( !jQuery.support.style ) {
     2637    jQuery.attrHooks.style = {
     2638        get: function( elem ) {
     2639            // Return undefined in the case of empty string
     2640            // Normalize to lowercase since IE uppercases css property names
     2641            return elem.style.cssText.toLowerCase() || undefined;
     2642        },
     2643        set: function( elem, value ) {
     2644            return ( elem.style.cssText = value + "" );
     2645        }
     2646    };
     2647}
     2648
     2649// Safari mis-reports the default selected property of an option
     2650// Accessing the parent's selectedIndex property fixes it
     2651if ( !jQuery.support.optSelected ) {
     2652    jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
     2653        get: function( elem ) {
     2654            var parent = elem.parentNode;
     2655
     2656            if ( parent ) {
     2657                parent.selectedIndex;
     2658
     2659                // Make sure that it also works with optgroups, see #5701
     2660                if ( parent.parentNode ) {
     2661                    parent.parentNode.selectedIndex;
     2662                }
     2663            }
     2664            return null;
     2665        }
     2666    });
     2667}
     2668
     2669// IE6/7 call enctype encoding
     2670if ( !jQuery.support.enctype ) {
     2671    jQuery.propFix.enctype = "encoding";
     2672}
     2673
     2674// Radios and checkboxes getter/setter
     2675if ( !jQuery.support.checkOn ) {
     2676    jQuery.each([ "radio", "checkbox" ], function() {
     2677        jQuery.valHooks[ this ] = {
     2678            get: function( elem ) {
     2679                // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
     2680                return elem.getAttribute("value") === null ? "on" : elem.value;
     2681            }
     2682        };
     2683    });
     2684}
     2685jQuery.each([ "radio", "checkbox" ], function() {
     2686    jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
     2687        set: function( elem, value ) {
     2688            if ( jQuery.isArray( value ) ) {
     2689                return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
     2690            }
     2691        }
     2692    });
     2693});
     2694var rformElems = /^(?:input|select|textarea)$/i,
     2695    rkeyEvent = /^key/,
     2696    rmouseEvent = /^(?:mouse|contextmenu)|click/,
     2697    rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
     2698    rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
     2699
     2700/*
     2701 * Helper functions for managing events -- not part of the public interface.
     2702 * Props to Dean Edwards' addEvent library for many of the ideas.
     2703 */
     2704jQuery.event = {
     2705
     2706    add: function( elem, types, handler, data, selector ) {
     2707        var elemData, eventHandle, events,
     2708            tns, type, namespaces, handleObj,
     2709            handleObjIn, handlers, special,
     2710            t = 0;
     2711
     2712        // Don't attach events to noData or text/comment nodes (allow plain objects tho)
     2713        if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
     2714            return;
     2715        }
     2716
     2717        // Caller can pass in an object of custom data in lieu of the handler
     2718        if ( handler.handler ) {
     2719            handleObjIn = handler;
     2720            handler = handleObjIn.handler;
     2721            selector = handleObjIn.selector;
     2722        }
     2723
     2724        // Make sure that the handler has a unique ID, used to find/remove it later
     2725        if ( !handler.guid ) {
     2726            handler.guid = jQuery.guid++;
     2727        }
     2728
     2729        // Init the element's event structure and main handler, if this is the first
     2730        events = elemData.events;
     2731        if ( !events ) {
     2732            elemData.events = events = {};
     2733        }
     2734        eventHandle = elemData.handle;
     2735        if ( !eventHandle ) {
     2736            elemData.handle = eventHandle = function( e ) {
     2737                // Discard the second event of a jQuery.event.trigger() and
     2738                // when an event is called after a page has unloaded
     2739                return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
     2740                    jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
     2741                    undefined;
     2742            };
     2743            // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
     2744            eventHandle.elem = elem;
     2745        }
     2746
     2747        // Handle multiple events separated by a space
     2748        // jQuery(...).bind("mouseover mouseout", fn);
     2749        types = ( types || "" ).match( core_rnotwhite ) || [""];
     2750        for ( ; t < types.length; t++ ) {
     2751
     2752            tns = rtypenamespace.exec( types[t] ) || [];
     2753            type = tns[1];
     2754            namespaces = ( tns[2] || "" ).split( "." ).sort();
     2755
     2756            // If event changes its type, use the special event handlers for the changed type
     2757            special = jQuery.event.special[ type ] || {};
     2758
     2759            // If selector defined, determine special event api type, otherwise given type
     2760            type = ( selector ? special.delegateType : special.bindType ) || type;
     2761
     2762            // Update special based on newly reset type
     2763            special = jQuery.event.special[ type ] || {};
     2764
     2765            // handleObj is passed to all event handlers
     2766            handleObj = jQuery.extend({
     2767                type: type,
     2768                origType: tns[1],
     2769                data: data,
     2770                handler: handler,
     2771                guid: handler.guid,
     2772                selector: selector,
     2773                needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
     2774                namespace: namespaces.join(".")
     2775            }, handleObjIn );
     2776
     2777            // Init the event handler queue if we're the first
     2778            handlers = events[ type ];
     2779            if ( !handlers ) {
     2780                handlers = events[ type ] = [];
     2781                handlers.delegateCount = 0;
     2782
     2783                // Only use addEventListener/attachEvent if the special events handler returns false
     2784                if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
     2785                    // Bind the global event handler to the element
     2786                    if ( elem.addEventListener ) {
     2787                        elem.addEventListener( type, eventHandle, false );
     2788
     2789                    } else if ( elem.attachEvent ) {
     2790                        elem.attachEvent( "on" + type, eventHandle );
     2791                    }
     2792                }
     2793            }
     2794
     2795            if ( special.add ) {
     2796                special.add.call( elem, handleObj );
     2797
     2798                if ( !handleObj.handler.guid ) {
     2799                    handleObj.handler.guid = handler.guid;
     2800                }
     2801            }
     2802
     2803            // Add to the element's handler list, delegates in front
     2804            if ( selector ) {
     2805                handlers.splice( handlers.delegateCount++, 0, handleObj );
     2806            } else {
     2807                handlers.push( handleObj );
     2808            }
     2809
     2810            // Keep track of which events have ever been used, for event optimization
     2811            jQuery.event.global[ type ] = true;
     2812        }
     2813
     2814        // Nullify elem to prevent memory leaks in IE
     2815        elem = null;
     2816    },
     2817
     2818    global: {},
     2819
     2820    // Detach an event or set of events from an element
     2821    remove: function( elem, types, handler, selector, mappedTypes ) {
     2822
     2823        var tns, type, origType, namespaces, origCount,
     2824            j, events, special, eventType, handleObj,
     2825            t = 0,
     2826            elemData = jQuery.hasData( elem ) && jQuery._data( elem );
     2827
     2828        if ( !elemData || !(events = elemData.events) ) {
     2829            return;
     2830        }
     2831
     2832        // Once for each type.namespace in types; type may be omitted
     2833        types = ( types || "" ).match( core_rnotwhite ) || [""];
     2834        for ( ; t < types.length; t++ ) {
     2835            tns = rtypenamespace.exec( types[t] ) || [];
     2836            type = origType = tns[1];
     2837            namespaces = tns[2];
     2838
     2839            // Unbind all events (on this namespace, if provided) for the element
     2840            if ( !type ) {
     2841                for ( type in events ) {
     2842                    jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
     2843                }
     2844                continue;
     2845            }
     2846
     2847            special = jQuery.event.special[ type ] || {};
     2848            type = ( selector? special.delegateType : special.bindType ) || type;
     2849            eventType = events[ type ] || [];
     2850            origCount = eventType.length;
     2851            namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
     2852
     2853            // Remove matching events
     2854            for ( j = 0; j < eventType.length; j++ ) {
     2855                handleObj = eventType[ j ];
     2856
     2857                if ( ( mappedTypes || origType === handleObj.origType ) &&
     2858                    ( !handler || handler.guid === handleObj.guid ) &&
     2859                    ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
     2860                    ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
     2861                    eventType.splice( j--, 1 );
     2862
     2863                    if ( handleObj.selector ) {
     2864                        eventType.delegateCount--;
     2865                    }
     2866                    if ( special.remove ) {
     2867                        special.remove.call( elem, handleObj );
     2868                    }
     2869                }
     2870            }
     2871
     2872            // Remove generic event handler if we removed something and no more handlers exist
     2873            // (avoids potential for endless recursion during removal of special event handlers)
     2874            if ( eventType.length === 0 && origCount !== eventType.length ) {
     2875                if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
     2876                    jQuery.removeEvent( elem, type, elemData.handle );
     2877                }
     2878
     2879                delete events[ type ];
     2880            }
     2881        }
     2882
     2883        // Remove the expando if it's no longer used
     2884        if ( jQuery.isEmptyObject( events ) ) {
     2885            delete elemData.handle;
     2886
     2887            // removeData also checks for emptiness and clears the expando if empty
     2888            // so use it instead of delete
     2889            jQuery._removeData( elem, "events" );
     2890        }
     2891    },
     2892
     2893    trigger: function( event, data, elem, onlyHandlers ) {
     2894
     2895        var i, cur, old, ontype, special, handle, eventPath, bubbleType,
     2896            type = event.type || event,
     2897            namespaces = event.namespace ? event.namespace.split(".") : [];
     2898
     2899        elem = elem || document;
     2900
     2901        // Don't do events on text and comment nodes
     2902        if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
     2903            return;
     2904        }
     2905
     2906        // focus/blur morphs to focusin/out; ensure we're not firing them right now
     2907        if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
     2908            return;
     2909        }
     2910
     2911        if ( type.indexOf(".") >= 0 ) {
     2912            // Namespaced trigger; create a regexp to match event type in handle()
     2913            namespaces = type.split(".");
     2914            type = namespaces.shift();
     2915            namespaces.sort();
     2916        }
     2917
     2918        // Caller can pass in an Event, Object, or just an event type string
     2919        event = typeof event === "object" ?
     2920            // jQuery.Event object
     2921            event[ jQuery.expando ] ? event :
     2922            // Object literal
     2923            new jQuery.Event( type, event ) :
     2924            // Just the event type (string)
     2925            new jQuery.Event( type );
     2926
     2927        event.type = type;
     2928        event.isTrigger = true;
     2929        event.namespace = namespaces.join(".");
     2930        event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
     2931        ontype = type.indexOf(":") < 0 ? "on" + type : "";
     2932
     2933        // Clean up the event in case it is being reused
     2934        event.result = undefined;
     2935        if ( !event.target ) {
     2936            event.target = elem;
     2937        }
     2938
     2939        // Clone any incoming data and prepend the event, creating the handler arg list
     2940        data = data != null ? jQuery.makeArray( data ) : [];
     2941        data.unshift( event );
     2942
     2943        // Allow special events to draw outside the lines
     2944        special = jQuery.event.special[ type ] || {};
     2945        if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
     2946            return;
     2947        }
     2948
     2949        // Determine event propagation path in advance, per W3C events spec (#9951)
     2950        // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
     2951        eventPath = [[ elem, special.bindType || type ]];
     2952        if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
     2953
     2954            bubbleType = special.delegateType || type;
     2955            cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
     2956            for ( old = elem; cur; cur = cur.parentNode ) {
     2957                eventPath.push([ cur, bubbleType ]);
     2958                old = cur;
     2959            }
     2960
     2961            // Only add window if we got to document (e.g., not plain obj or detached DOM)
     2962            if ( old === (elem.ownerDocument || document) ) {
     2963                eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
     2964            }
     2965        }
     2966
     2967        // Fire handlers on the event path
     2968        for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
     2969
     2970            cur = eventPath[i][0];
     2971            event.type = eventPath[i][1];
     2972
     2973            handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
     2974            if ( handle ) {
     2975                handle.apply( cur, data );
     2976            }
     2977            // Note that this is a bare JS function and not a jQuery handler
     2978            handle = ontype && cur[ ontype ];
     2979            if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
     2980                event.preventDefault();
     2981            }
     2982        }
     2983        event.type = type;
     2984
     2985        // If nobody prevented the default action, do it now
     2986        if ( !onlyHandlers && !event.isDefaultPrevented() ) {
     2987
     2988            if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
     2989                !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
     2990
     2991                // Call a native DOM method on the target with the same name name as the event.
     2992                // Can't use an .isFunction() check here because IE6/7 fails that test.
     2993                // Don't do default actions on window, that's where global variables be (#6170)
     2994                if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
     2995
     2996                    // Don't re-trigger an onFOO event when we call its FOO() method
     2997                    old = elem[ ontype ];
     2998
     2999                    if ( old ) {
     3000                        elem[ ontype ] = null;
     3001                    }
     3002
     3003                    // Prevent re-triggering of the same event, since we already bubbled it above
     3004                    jQuery.event.triggered = type;
     3005                    try {
     3006                        elem[ type ]();
     3007                    } catch ( e ) {
     3008                        // IE<9 dies on focus/blur to hidden element (#1486,#12518)
     3009                        // only reproducible on winXP IE8 native, not IE9 in IE8 mode
     3010                    }
     3011                    jQuery.event.triggered = undefined;
     3012
     3013                    if ( old ) {
     3014                        elem[ ontype ] = old;
     3015                    }
     3016                }
     3017            }
     3018        }
     3019
     3020        return event.result;
     3021    },
     3022
     3023    dispatch: function( event ) {
     3024
     3025        // Make a writable jQuery.Event from the native event object
     3026        event = jQuery.event.fix( event );
     3027
     3028        var i, j, cur, ret, selMatch, matched, matches, handleObj, sel,
     3029            handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
     3030            delegateCount = handlers.delegateCount,
     3031            args = core_slice.call( arguments ),
     3032            special = jQuery.event.special[ event.type ] || {},
     3033            handlerQueue = [];
     3034
     3035        // Use the fix-ed jQuery.Event rather than the (read-only) native event
     3036        args[0] = event;
     3037        event.delegateTarget = this;
     3038
     3039        // Call the preDispatch hook for the mapped type, and let it bail if desired
     3040        if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
     3041            return;
     3042        }
     3043
     3044        // Determine handlers that should run if there are delegated events
     3045        // Avoid non-left-click bubbling in Firefox (#3861)
     3046        if ( delegateCount && !(event.button && event.type === "click") ) {
     3047
     3048            for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
     3049
     3050                // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
     3051                if ( cur.disabled !== true || event.type !== "click" ) {
     3052                    selMatch = {};
     3053                    matches = [];
     3054                    for ( i = 0; i < delegateCount; i++ ) {
     3055                        handleObj = handlers[ i ];
     3056                        sel = handleObj.selector;
     3057
     3058                        if ( selMatch[ sel ] === undefined ) {
     3059                            selMatch[ sel ] = handleObj.needsContext ?
     3060                                jQuery( sel, this ).index( cur ) >= 0 :
     3061                                jQuery.find( sel, this, null, [ cur ] ).length;
     3062                        }
     3063                        if ( selMatch[ sel ] ) {
     3064                            matches.push( handleObj );
     3065                        }
     3066                    }
     3067                    if ( matches.length ) {
     3068                        handlerQueue.push({ elem: cur, matches: matches });
     3069                    }
     3070                }
     3071            }
     3072        }
     3073
     3074        // Add the remaining (directly-bound) handlers
     3075        if ( handlers.length > delegateCount ) {
     3076            handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
     3077        }
     3078
     3079        // Run delegates first; they may want to stop propagation beneath us
     3080        for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
     3081            matched = handlerQueue[ i ];
     3082            event.currentTarget = matched.elem;
     3083
     3084            for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
     3085                handleObj = matched.matches[ j ];
     3086
     3087                // Triggered event must either 1) have no namespace, or
     3088                // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
     3089                if ( !event.namespace || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
     3090
     3091                    event.data = handleObj.data;
     3092                    event.handleObj = handleObj;
     3093
     3094                    ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
     3095                            .apply( matched.elem, args );
     3096
     3097                    if ( ret !== undefined ) {
     3098                        event.result = ret;
     3099                        if ( ret === false ) {
     3100                            event.preventDefault();
     3101                            event.stopPropagation();
     3102                        }
     3103                    }
     3104                }
     3105            }
     3106        }
     3107
     3108        // Call the postDispatch hook for the mapped type
     3109        if ( special.postDispatch ) {
     3110            special.postDispatch.call( this, event );
     3111        }
     3112
     3113        return event.result;
     3114    },
     3115
     3116    // Includes some event props shared by KeyEvent and MouseEvent
     3117    props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
     3118
     3119    fixHooks: {},
     3120
     3121    keyHooks: {
     3122        props: "char charCode key keyCode".split(" "),
     3123        filter: function( event, original ) {
     3124
     3125            // Add which for key events
     3126            if ( event.which == null ) {
     3127                event.which = original.charCode != null ? original.charCode : original.keyCode;
     3128            }
     3129
     3130            return event;
     3131        }
     3132    },
     3133
     3134    mouseHooks: {
     3135        props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
     3136        filter: function( event, original ) {
     3137            var eventDoc, doc, body,
     3138                button = original.button,
     3139                fromElement = original.fromElement;
     3140
     3141            // Calculate pageX/Y if missing and clientX/Y available
     3142            if ( event.pageX == null && original.clientX != null ) {
     3143                eventDoc = event.target.ownerDocument || document;
     3144                doc = eventDoc.documentElement;
     3145                body = eventDoc.body;
     3146
     3147                event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
     3148                event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
     3149            }
     3150
     3151            // Add relatedTarget, if necessary
     3152            if ( !event.relatedTarget && fromElement ) {
     3153                event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
     3154            }
     3155
     3156            // Add which for click: 1 === left; 2 === middle; 3 === right
     3157            // Note: button is not normalized, so don't use it
     3158            if ( !event.which && button !== undefined ) {
     3159                event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
     3160            }
     3161
     3162            return event;
     3163        }
     3164    },
     3165
     3166    fix: function( event ) {
     3167        if ( event[ jQuery.expando ] ) {
     3168            return event;
     3169        }
     3170
     3171        // Create a writable copy of the event object and normalize some properties
     3172        var i, prop,
     3173            originalEvent = event,
     3174            fixHook = jQuery.event.fixHooks[ event.type ] || {},
     3175            copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
     3176
     3177        event = jQuery.Event( originalEvent );
     3178
     3179        for ( i = copy.length; i; ) {
     3180            prop = copy[ --i ];
     3181            event[ prop ] = originalEvent[ prop ];
     3182        }
     3183
     3184        // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
     3185        if ( !event.target ) {
     3186            event.target = originalEvent.srcElement || document;
     3187        }
     3188
     3189        // Target should not be a text node (#504, Safari)
     3190        if ( event.target.nodeType === 3 ) {
     3191            event.target = event.target.parentNode;
     3192        }
     3193
     3194        // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
     3195        event.metaKey = !!event.metaKey;
     3196
     3197        return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
     3198    },
     3199
     3200    special: {
     3201        load: {
     3202            // Prevent triggered image.load events from bubbling to window.load
     3203            noBubble: true
     3204        },
     3205        click: {
     3206            // For checkbox, fire native event so checked state will be right
     3207            trigger: function() {
     3208                if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
     3209                    this.click();
     3210                    return false;
     3211                }
     3212            }
     3213        },
     3214        focus: {
     3215            // Fire native event if possible so blur/focus sequence is correct
     3216            trigger: function() {
     3217                if ( this !== document.activeElement && this.focus ) {
     3218                    try {
     3219                        this.focus();
     3220                        return false;
     3221                    } catch ( e ) {
     3222                        // IE<9 dies on focus to hidden element (#1486,#12518)
     3223                        // If this happens, let .trigger() run the handlers
     3224                    }
     3225                }
     3226            },
     3227            delegateType: "focusin"
     3228        },
     3229        blur: {
     3230            trigger: function() {
     3231                if ( this === document.activeElement && this.blur ) {
     3232                    this.blur();
     3233                    return false;
     3234                }
     3235            },
     3236            delegateType: "focusout"
     3237        },
     3238
     3239        beforeunload: {
     3240            postDispatch: function( event ) {
     3241
     3242                // Even when returnValue equals to undefined Firefox will still show alert
     3243                if ( event.result !== undefined ) {
     3244                    event.originalEvent.returnValue = event.result;
     3245                }
     3246            }
     3247        }
     3248    },
     3249
     3250    simulate: function( type, elem, event, bubble ) {
     3251        // Piggyback on a donor event to simulate a different one.
     3252        // Fake originalEvent to avoid donor's stopPropagation, but if the
     3253        // simulated event prevents default then we do the same on the donor.
     3254        var e = jQuery.extend(
     3255            new jQuery.Event(),
     3256            event,
     3257            { type: type,
     3258                isSimulated: true,
     3259                originalEvent: {}
     3260            }
     3261        );
     3262        if ( bubble ) {
     3263            jQuery.event.trigger( e, null, elem );
     3264        } else {
     3265            jQuery.event.dispatch.call( elem, e );
     3266        }
     3267        if ( e.isDefaultPrevented() ) {
     3268            event.preventDefault();
     3269        }
     3270    }
     3271};
     3272
     3273// Some plugins are using, but it's undocumented/deprecated and will be removed.
     3274// The 1.7 special event interface should provide all the hooks needed now.
     3275jQuery.event.handle = jQuery.event.dispatch;
     3276
     3277jQuery.removeEvent = document.removeEventListener ?
     3278    function( elem, type, handle ) {
     3279        if ( elem.removeEventListener ) {
     3280            elem.removeEventListener( type, handle, false );
     3281        }
     3282    } :
     3283    function( elem, type, handle ) {
     3284        var name = "on" + type;
     3285
     3286        if ( elem.detachEvent ) {
     3287
     3288            // #8545, #7054, preventing memory leaks for custom events in IE6-8
     3289            // detachEvent needed property on element, by name of that event, to properly expose it to GC
     3290            if ( typeof elem[ name ] === "undefined" ) {
     3291                elem[ name ] = null;
     3292            }
     3293
     3294            elem.detachEvent( name, handle );
     3295        }
     3296    };
     3297
     3298jQuery.Event = function( src, props ) {
     3299    // Allow instantiation without the 'new' keyword
     3300    if ( !(this instanceof jQuery.Event) ) {
     3301        return new jQuery.Event( src, props );
     3302    }
     3303
     3304    // Event object
     3305    if ( src && src.type ) {
     3306        this.originalEvent = src;
     3307        this.type = src.type;
     3308
     3309        // Events bubbling up the document may have been marked as prevented
     3310        // by a handler lower down the tree; reflect the correct value.
     3311        this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
     3312            src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
     3313
     3314    // Event type
     3315    } else {
     3316        this.type = src;
     3317    }
     3318
     3319    // Put explicitly provided properties onto the event object
     3320    if ( props ) {
     3321        jQuery.extend( this, props );
     3322    }
     3323
     3324    // Create a timestamp if incoming event doesn't have one
     3325    this.timeStamp = src && src.timeStamp || jQuery.now();
     3326
     3327    // Mark it as fixed
     3328    this[ jQuery.expando ] = true;
     3329};
     3330
     3331function returnFalse() {
     3332    return false;
     3333}
     3334function returnTrue() {
     3335    return true;
     3336}
     3337
     3338// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
     3339// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
     3340jQuery.Event.prototype = {
     3341    preventDefault: function() {
     3342        this.isDefaultPrevented = returnTrue;
     3343
     3344        var e = this.originalEvent;
     3345        if ( !e ) {
     3346            return;
     3347        }
     3348
     3349        // if preventDefault exists run it on the original event
     3350        if ( e.preventDefault ) {
     3351            e.preventDefault();
     3352
     3353        // otherwise set the returnValue property of the original event to false (IE)
     3354        } else {
     3355            e.returnValue = false;
     3356        }
     3357    },
     3358    stopPropagation: function() {
     3359        this.isPropagationStopped = returnTrue;
     3360
     3361        var e = this.originalEvent;
     3362        if ( !e ) {
     3363            return;
     3364        }
     3365        // if stopPropagation exists run it on the original event
     3366        if ( e.stopPropagation ) {
     3367            e.stopPropagation();
     3368        }
     3369        // otherwise set the cancelBubble property of the original event to true (IE)
     3370        e.cancelBubble = true;
     3371    },
     3372    stopImmediatePropagation: function() {
     3373        this.isImmediatePropagationStopped = returnTrue;
     3374        this.stopPropagation();
     3375    },
     3376    isDefaultPrevented: returnFalse,
     3377    isPropagationStopped: returnFalse,
     3378    isImmediatePropagationStopped: returnFalse
     3379};
     3380
     3381// Create mouseenter/leave events using mouseover/out and event-time checks
     3382jQuery.each({
     3383    mouseenter: "mouseover",
     3384    mouseleave: "mouseout"
     3385}, function( orig, fix ) {
     3386    jQuery.event.special[ orig ] = {
     3387        delegateType: fix,
     3388        bindType: fix,
     3389
     3390        handle: function( event ) {
     3391            var ret,
     3392                target = this,
     3393                related = event.relatedTarget,
     3394                handleObj = event.handleObj;
     3395
     3396            // For mousenter/leave call the handler if related is outside the target.
     3397            // NB: No relatedTarget if the mouse left/entered the browser window
     3398            if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
     3399                event.type = handleObj.origType;
     3400                ret = handleObj.handler.apply( this, arguments );
     3401                event.type = fix;
     3402            }
     3403            return ret;
     3404        }
     3405    };
     3406});
     3407
     3408// IE submit delegation
     3409if ( !jQuery.support.submitBubbles ) {
     3410
     3411    jQuery.event.special.submit = {
     3412        setup: function() {
     3413            // Only need this for delegated form submit events
     3414            if ( jQuery.nodeName( this, "form" ) ) {
     3415                return false;
     3416            }
     3417
     3418            // Lazy-add a submit handler when a descendant form may potentially be submitted
     3419            jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
     3420                // Node name check avoids a VML-related crash in IE (#9807)
     3421                var elem = e.target,
     3422                    form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
     3423                if ( form && !jQuery._data( form, "_submit_attached" ) ) {
     3424                    jQuery.event.add( form, "submit._submit", function( event ) {
     3425                        event._submit_bubble = true;
     3426                    });
     3427                    jQuery._data( form, "_submit_attached", true );
     3428                }
     3429            });
     3430            // return undefined since we don't need an event listener
     3431        },
     3432
     3433        postDispatch: function( event ) {
     3434            // If form was submitted by the user, bubble the event up the tree
     3435            if ( event._submit_bubble ) {
     3436                delete event._submit_bubble;
     3437                if ( this.parentNode && !event.isTrigger ) {
     3438                    jQuery.event.simulate( "submit", this.parentNode, event, true );
     3439                }
     3440            }
     3441        },
     3442
     3443        teardown: function() {
     3444            // Only need this for delegated form submit events
     3445            if ( jQuery.nodeName( this, "form" ) ) {
     3446                return false;
     3447            }
     3448
     3449            // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
     3450            jQuery.event.remove( this, "._submit" );
     3451        }
     3452    };
     3453}
     3454
     3455// IE change delegation and checkbox/radio fix
     3456if ( !jQuery.support.changeBubbles ) {
     3457
     3458    jQuery.event.special.change = {
     3459
     3460        setup: function() {
     3461
     3462            if ( rformElems.test( this.nodeName ) ) {
     3463                // IE doesn't fire change on a check/radio until blur; trigger it on click
     3464                // after a propertychange. Eat the blur-change in special.change.handle.
     3465                // This still fires onchange a second time for check/radio after blur.
     3466                if ( this.type === "checkbox" || this.type === "radio" ) {
     3467                    jQuery.event.add( this, "propertychange._change", function( event ) {
     3468                        if ( event.originalEvent.propertyName === "checked" ) {
     3469                            this._just_changed = true;
     3470                        }
     3471                    });
     3472                    jQuery.event.add( this, "click._change", function( event ) {
     3473                        if ( this._just_changed && !event.isTrigger ) {
     3474                            this._just_changed = false;
     3475                        }
     3476                        // Allow triggered, simulated change events (#11500)
     3477                        jQuery.event.simulate( "change", this, event, true );
     3478                    });
     3479                }
     3480                return false;
     3481            }
     3482            // Delegated event; lazy-add a change handler on descendant inputs
     3483            jQuery.event.add( this, "beforeactivate._change", function( e ) {
     3484                var elem = e.target;
     3485
     3486                if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
     3487                    jQuery.event.add( elem, "change._change", function( event ) {
     3488                        if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
     3489                            jQuery.event.simulate( "change", this.parentNode, event, true );
     3490                        }
     3491                    });
     3492                    jQuery._data( elem, "_change_attached", true );
     3493                }
     3494            });
     3495        },
     3496
     3497        handle: function( event ) {
     3498            var elem = event.target;
     3499
     3500            // Swallow native change events from checkbox/radio, we already triggered them above
     3501            if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
     3502                return event.handleObj.handler.apply( this, arguments );
     3503            }
     3504        },
     3505
     3506        teardown: function() {
     3507            jQuery.event.remove( this, "._change" );
     3508
     3509            return !rformElems.test( this.nodeName );
     3510        }
     3511    };
     3512}
     3513
     3514// Create "bubbling" focus and blur events
     3515if ( !jQuery.support.focusinBubbles ) {
     3516    jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
     3517
     3518        // Attach a single capturing handler while someone wants focusin/focusout
     3519        var attaches = 0,
     3520            handler = function( event ) {
     3521                jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
     3522            };
     3523
     3524        jQuery.event.special[ fix ] = {
     3525            setup: function() {
     3526                if ( attaches++ === 0 ) {
     3527                    document.addEventListener( orig, handler, true );
     3528                }
     3529            },
     3530            teardown: function() {
     3531                if ( --attaches === 0 ) {
     3532                    document.removeEventListener( orig, handler, true );
     3533                }
     3534            }
     3535        };
     3536    });
     3537}
     3538
     3539jQuery.fn.extend({
     3540
     3541    on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
     3542        var origFn, type;
     3543
     3544        // Types can be a map of types/handlers
     3545        if ( typeof types === "object" ) {
     3546            // ( types-Object, selector, data )
     3547            if ( typeof selector !== "string" ) { // && selector != null
     3548                // ( types-Object, data )
     3549                data = data || selector;
     3550                selector = undefined;
     3551            }
     3552            for ( type in types ) {
     3553                this.on( type, selector, data, types[ type ], one );
     3554            }
     3555            return this;
     3556        }
     3557
     3558        if ( data == null && fn == null ) {
     3559            // ( types, fn )
     3560            fn = selector;
     3561            data = selector = undefined;
     3562        } else if ( fn == null ) {
     3563            if ( typeof selector === "string" ) {
     3564                // ( types, selector, fn )
     3565                fn = data;
     3566                data = undefined;
     3567            } else {
     3568                // ( types, data, fn )
     3569                fn = data;
     3570                data = selector;
     3571                selector = undefined;
     3572            }
     3573        }
     3574        if ( fn === false ) {
     3575            fn = returnFalse;
     3576        } else if ( !fn ) {
     3577            return this;
     3578        }
     3579
     3580        if ( one === 1 ) {
     3581            origFn = fn;
     3582            fn = function( event ) {
     3583                // Can use an empty set, since event contains the info
     3584                jQuery().off( event );
     3585                return origFn.apply( this, arguments );
     3586            };
     3587            // Use same guid so caller can remove using origFn
     3588            fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
     3589        }
     3590        return this.each( function() {
     3591            jQuery.event.add( this, types, fn, data, selector );
     3592        });
     3593    },
     3594    one: function( types, selector, data, fn ) {
     3595        return this.on( types, selector, data, fn, 1 );
     3596    },
     3597    off: function( types, selector, fn ) {
     3598        var handleObj, type;
     3599        if ( types && types.preventDefault && types.handleObj ) {
     3600            // ( event )  dispatched jQuery.Event
     3601            handleObj = types.handleObj;
     3602            jQuery( types.delegateTarget ).off(
     3603                handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
     3604                handleObj.selector,
     3605                handleObj.handler
     3606            );
     3607            return this;
     3608        }
     3609        if ( typeof types === "object" ) {
     3610            // ( types-object [, selector] )
     3611            for ( type in types ) {
     3612                this.off( type, selector, types[ type ] );
     3613            }
     3614            return this;
     3615        }
     3616        if ( selector === false || typeof selector === "function" ) {
     3617            // ( types [, fn] )
     3618            fn = selector;
     3619            selector = undefined;
     3620        }
     3621        if ( fn === false ) {
     3622            fn = returnFalse;
     3623        }
     3624        return this.each(function() {
     3625            jQuery.event.remove( this, types, fn, selector );
     3626        });
     3627    },
     3628
     3629    bind: function( types, data, fn ) {
     3630        return this.on( types, null, data, fn );
     3631    },
     3632    unbind: function( types, fn ) {
     3633        return this.off( types, null, fn );
     3634    },
     3635
     3636    live: function( types, data, fn ) {
     3637        jQuery( this.context ).on( types, this.selector, data, fn );
     3638        return this;
     3639    },
     3640    die: function( types, fn ) {
     3641        jQuery( this.context ).off( types, this.selector || "**", fn );
     3642        return this;
     3643    },
     3644
     3645    delegate: function( selector, types, data, fn ) {
     3646        return this.on( types, selector, data, fn );
     3647    },
     3648    undelegate: function( selector, types, fn ) {
     3649        // ( namespace ) or ( selector, types [, fn] )
     3650        return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
     3651    },
     3652
     3653    trigger: function( type, data ) {
     3654        return this.each(function() {
     3655            jQuery.event.trigger( type, data, this );
     3656        });
     3657    },
     3658    triggerHandler: function( type, data ) {
     3659        if ( this[0] ) {
     3660            return jQuery.event.trigger( type, data, this[0], true );
     3661        }
     3662    },
     3663
     3664    hover: function( fnOver, fnOut ) {
     3665        return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
     3666    }
     3667});
     3668
     3669jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
     3670    "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
     3671    "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
     3672
     3673    // Handle event binding
     3674    jQuery.fn[ name ] = function( data, fn ) {
     3675        return arguments.length > 0 ?
     3676            this.on( name, null, data, fn ) :
     3677            this.trigger( name );
     3678    };
     3679
     3680    if ( rkeyEvent.test( name ) ) {
     3681        jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
     3682    }
     3683
     3684    if ( rmouseEvent.test( name ) ) {
     3685        jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
     3686    }
     3687});
     3688/*!
     3689 * Sizzle CSS Selector Engine
     3690 * Copyright 2012 jQuery Foundation and other contributors
     3691 * Released under the MIT license
     3692 * http://sizzlejs.com/
     3693 */
     3694(function( window, undefined ) {
     3695
     3696var i,
     3697    cachedruns,
     3698    Expr,
     3699    getText,
     3700    isXML,
     3701    compile,
     3702    hasDuplicate,
     3703    outermostContext,
     3704
     3705    // Local document vars
     3706    setDocument,
     3707    document,
     3708    docElem,
     3709    documentIsXML,
     3710    rbuggyQSA,
     3711    rbuggyMatches,
     3712    matches,
     3713    contains,
     3714    sortOrder,
     3715
     3716    expando = "sizzle" + -(new Date()),
     3717
     3718    strundefined = typeof undefined,
     3719
     3720    // Used in sorting
     3721    MAX_NEGATIVE = 1 << 31,
     3722    preferredDoc = window.document,
     3723
     3724    Token = String,
     3725    dirruns = 0,
     3726    done = 0,
     3727    support = {},
     3728
     3729    // Array methods
     3730    arr = [],
     3731    pop = arr.pop,
     3732    push = arr.push,
     3733    slice = arr.slice,
     3734    // Use a stripped-down indexOf if we can't use a native one
     3735    indexOf = arr.indexOf || function( elem ) {
     3736        var i = 0,
     3737            len = this.length;
     3738        for ( ; i < len; i++ ) {
     3739            if ( this[i] === elem ) {
     3740                return i;
     3741            }
     3742        }
     3743        return -1;
     3744    },
     3745
     3746    // Augment a function for special use by Sizzle
     3747    markFunction = function( fn, value ) {
     3748        fn[ expando ] = value == null || value;
     3749        return fn;
     3750    },
     3751
     3752    createCache = function() {
     3753        var cache = {},
     3754            keys = [];
     3755
     3756        return markFunction(function( key, value ) {
     3757            // Only keep the most recent entries
     3758            if ( keys.push( key ) > Expr.cacheLength ) {
     3759                delete cache[ keys.shift() ];
     3760            }
     3761
     3762            // Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157)
     3763            return (cache[ key + " " ] = value);
     3764        }, cache );
     3765    },
     3766
     3767    classCache = createCache(),
     3768    tokenCache = createCache(),
     3769    compilerCache = createCache(),
     3770
     3771    // Regex
     3772
     3773    // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
     3774    whitespace = "[\\x20\\t\\r\\n\\f]",
     3775    // http://www.w3.org/TR/css3-syntax/#characters
     3776    characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
     3777
     3778    // Loosely modeled on CSS identifier characters
     3779    // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
     3780    // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
     3781    identifier = characterEncoding.replace( "w", "w#" ),
     3782
     3783    // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
     3784    operators = "([*^$|!~]?=)",
     3785    attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
     3786        "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
     3787
     3788    // Prefer arguments quoted,
     3789    //   then not containing pseudos/brackets,
     3790    //   then attribute selectors/non-parenthetical expressions,
     3791    //   then anything else
     3792    // These preferences are here to reduce the number of selectors
     3793    //   needing tokenize in the PSEUDO preFilter
     3794    pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
     3795
     3796    // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
     3797    rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
     3798
     3799    rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
     3800    rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
     3801    rpseudo = new RegExp( pseudos ),
     3802
     3803    // Easily-parseable/retrievable ID or TAG or CLASS selectors
     3804    rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
     3805
     3806    rsibling = /[\x20\t\r\n\f]*[+~]/,
     3807
     3808    rheader = /h\d/i,
     3809    rinputs = /input|select|textarea|button/i,
     3810
     3811    rnative = /\{\s*\[native code\]\s*\}/,
     3812
     3813    rbackslash = /\\(?!\\)/g,
     3814
     3815    rescape = /'|\\/g,
     3816    rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
     3817
     3818    matchExpr = {
     3819        "ID": new RegExp( "^#(" + characterEncoding + ")" ),
     3820        "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
     3821        "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
     3822        "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
     3823        "ATTR": new RegExp( "^" + attributes ),
     3824        "PSEUDO": new RegExp( "^" + pseudos ),
     3825        "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
     3826            "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
     3827            "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
     3828        // For use in libraries implementing .is()
     3829        // We use this for POS matching in `select`
     3830        "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
     3831            whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
     3832    },
     3833
     3834    /**
     3835     * For feature detection
     3836     * @param {Function} fn The function to test for native support
     3837     */
     3838    isNative = function( fn ) {
     3839        return rnative.test( fn + "" );
     3840    },
     3841
     3842    /**
     3843     * Support testing using an element
     3844     * @param {Function} fn Passed the created div and expects a boolean result
     3845     */
     3846    assert = function( fn ) {
     3847        var div = document.createElement("div");
     3848
     3849        try {
     3850            return fn( div );
     3851        } catch (e) {
     3852            return false;
     3853        } finally {
     3854            // release memory in IE
     3855            div = null;
     3856        }
     3857    };
     3858
     3859// Use a stripped-down slice if we can't use a native one
     3860try {
     3861    slice.call( docElem.childNodes, 0 )[0].nodeType;
     3862} catch ( e ) {
     3863    slice = function( i ) {
     3864        var elem,
     3865            results = [];
     3866        for ( ; (elem = this[i]); i++ ) {
     3867            results.push( elem );
     3868        }
     3869        return results;
     3870    };
     3871}
     3872
     3873function Sizzle( selector, context, results, seed ) {
     3874    var match, elem, m, nodeType,
     3875        // QSA vars
     3876        i, groups, old, nid, newContext, newSelector;
     3877
     3878    if ( context && (( context.ownerDocument || context ) !== document) ) {
     3879        setDocument( context );
     3880    }
     3881
     3882    context = context || document;
     3883    results = results || [];
     3884
     3885    if ( !selector || typeof selector !== "string" ) {
     3886        return results;
     3887    }
     3888
     3889    if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
     3890        return [];
     3891    }
     3892
     3893    if ( !documentIsXML && !seed ) {
     3894
     3895        // Shortcuts
     3896        if ( (match = rquickExpr.exec( selector )) ) {
     3897            // Speed-up: Sizzle("#ID")
     3898            if ( (m = match[1]) ) {
     3899                if ( nodeType === 9 ) {
     3900                    elem = context.getElementById( m );
     3901                    // Check parentNode to catch when Blackberry 4.6 returns
     3902                    // nodes that are no longer in the document #6963
     3903                    if ( elem && elem.parentNode ) {
     3904                        // Handle the case where IE, Opera, and Webkit return items
     3905                        // by name instead of ID
     3906                        if ( elem.id === m ) {
     3907                            results.push( elem );
     3908                            return results;
     3909                        }
     3910                    } else {
     3911                        return results;
     3912                    }
     3913                } else {
     3914                    // Context is not a document
     3915                    if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
     3916                        contains( context, elem ) && elem.id === m ) {
     3917                        results.push( elem );
     3918                        return results;
     3919                    }
     3920                }
     3921
     3922            // Speed-up: Sizzle("TAG")
     3923            } else if ( match[2] ) {
     3924                push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
     3925                return results;
     3926
     3927            // Speed-up: Sizzle(".CLASS")
     3928            } else if ( (m = match[3]) && support.getByClassName && context.getElementsByClassName ) {
     3929                push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
     3930                return results;
     3931            }
     3932        }
     3933
     3934        // QSA path
     3935        if ( support.qsa && !rbuggyQSA.test(selector) ) {
     3936            old = true;
     3937            nid = expando;
     3938            newContext = context;
     3939            newSelector = nodeType === 9 && selector;
     3940
     3941            // qSA works strangely on Element-rooted queries
     3942            // We can work around this by specifying an extra ID on the root
     3943            // and working up from there (Thanks to Andrew Dupont for the technique)
     3944            // IE 8 doesn't work on object elements
     3945            if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
     3946                groups = tokenize( selector );
     3947
     3948                if ( (old = context.getAttribute("id")) ) {
     3949                    nid = old.replace( rescape, "\\$&" );
     3950                } else {
     3951                    context.setAttribute( "id", nid );
     3952                }
     3953                nid = "[id='" + nid + "'] ";
     3954
     3955                i = groups.length;
     3956                while ( i-- ) {
     3957                    groups[i] = nid + groups[i].join("");
     3958                }
     3959                newContext = rsibling.test( selector ) && context.parentNode || context;
     3960                newSelector = groups.join(",");
     3961            }
     3962
     3963            if ( newSelector ) {
     3964                try {
     3965                    push.apply( results, slice.call( newContext.querySelectorAll(
     3966                        newSelector
     3967                    ), 0 ) );
     3968                    return results;
     3969                } catch(qsaError) {
     3970                } finally {
     3971                    if ( !old ) {
     3972                        context.removeAttribute("id");
     3973                    }
     3974                }
     3975            }
     3976        }
     3977    }
     3978
     3979    // All others
     3980    return select( selector.replace( rtrim, "$1" ), context, results, seed );
     3981}
     3982
     3983/**
     3984 * Detect xml
     3985 * @param {Element|Object} elem An element or a document
     3986 */
     3987isXML = Sizzle.isXML = function( elem ) {
     3988    // documentElement is verified for cases where it doesn't yet exist
     3989    // (such as loading iframes in IE - #4833)
     3990    var documentElement = elem && (elem.ownerDocument || elem).documentElement;
     3991    return documentElement ? documentElement.nodeName !== "HTML" : false;
     3992};
     3993
     3994/**
     3995 * Sets document-related variables once based on the current document
     3996 * @param {Element|Object} [doc] An element or document object to use to set the document
     3997 * @returns {Object} Returns the current document
     3998 */
     3999setDocument = Sizzle.setDocument = function( doc ) {
     4000    doc = doc && doc.ownerDocument || doc || window.document;
     4001
     4002    // If no document and documentElement is available, return
     4003    if ( !doc || doc.nodeType !== 9 || !doc.documentElement || document === doc ) {
     4004        return document;
     4005    }
     4006
     4007    // Set our document
     4008    document = doc;
     4009    docElem = doc.documentElement;
     4010
     4011    // Support tests
     4012    documentIsXML = isXML( doc );
     4013
     4014    // Check if getElementsByTagName("*") returns only elements
     4015    support.tagNameNoComments = assert(function( div ) {
     4016        div.appendChild( doc.createComment("") );
     4017        return !div.getElementsByTagName("*").length;
     4018    });
     4019
     4020    // Check if attributes should be retrieved by attribute nodes
     4021    support.attributes = assert(function( div ) {
     4022        div.innerHTML = "<select></select>";
     4023        var type = typeof div.lastChild.getAttribute("multiple");
     4024        // IE8 returns a string for some attributes even when not present
     4025        return type !== "boolean" && type !== "string";
     4026    });
     4027
     4028    // Check if getElementsByClassName can be trusted
     4029    support.getByClassName = assert(function( div ) {
     4030        // Opera can't find a second classname (in 9.6)
     4031        div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
     4032        if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
     4033            return false;
     4034        }
     4035
     4036        // Safari 3.2 caches class attributes and doesn't catch changes
     4037        div.lastChild.className = "e";
     4038        return div.getElementsByClassName("e").length === 2;
     4039    });
     4040
     4041    // Check if getElementById returns elements by name
     4042    // Check if getElementsByName privileges form controls or returns elements by ID
     4043    support.getByName = assert(function( div ) {
     4044        // Inject content
     4045        div.id = expando + 0;
     4046        div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
     4047        docElem.insertBefore( div, docElem.firstChild );
     4048
     4049        // Test
     4050        var pass = doc.getElementsByName &&
     4051            // buggy browsers will return fewer than the correct 2
     4052            doc.getElementsByName( expando ).length === 2 +
     4053            // buggy browsers will return more than the correct 0
     4054            doc.getElementsByName( expando + 0 ).length;
     4055        support.getIdNotName = !doc.getElementById( expando );
     4056
     4057        // Cleanup
     4058        docElem.removeChild( div );
     4059
     4060        return pass;
     4061    });
     4062
     4063    // IE6/7 return modified attributes
     4064    Expr.attrHandle = assert(function( div ) {
     4065        div.innerHTML = "<a href='#'></a>";
     4066        return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
     4067            div.firstChild.getAttribute("href") === "#";
     4068    }) ?
     4069        {} :
     4070        {
     4071            "href": function( elem ) {
     4072                return elem.getAttribute( "href", 2 );
     4073            },
     4074            "type": function( elem ) {
     4075                return elem.getAttribute("type");
     4076            }
     4077        };
     4078
     4079    // ID find and filter
     4080    if ( support.getIdNotName ) {
     4081        Expr.find["ID"] = function( id, context ) {
     4082            if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
     4083                var m = context.getElementById( id );
     4084                // Check parentNode to catch when Blackberry 4.6 returns
     4085                // nodes that are no longer in the document #6963
     4086                return m && m.parentNode ? [m] : [];
     4087            }
     4088        };
     4089        Expr.filter["ID"] = function( id ) {
     4090            var attrId = id.replace( rbackslash, "" );
     4091            return function( elem ) {
     4092                return elem.getAttribute("id") === attrId;
     4093            };
     4094        };
     4095    } else {
     4096        Expr.find["ID"] = function( id, context ) {
     4097            if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
     4098                var m = context.getElementById( id );
     4099
     4100                return m ?
     4101                    m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
     4102                        [m] :
     4103                        undefined :
     4104                    [];
     4105            }
     4106        };
     4107        Expr.filter["ID"] =  function( id ) {
     4108            var attrId = id.replace( rbackslash, "" );
     4109            return function( elem ) {
     4110                var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
     4111                return node && node.value === attrId;
     4112            };
     4113        };
     4114    }
     4115
     4116    // Tag
     4117    Expr.find["TAG"] = support.tagNameNoComments ?
     4118        function( tag, context ) {
     4119            if ( typeof context.getElementsByTagName !== strundefined ) {
     4120                return context.getElementsByTagName( tag );
     4121            }
     4122        } :
     4123        function( tag, context ) {
     4124            var elem,
     4125                tmp = [],
     4126                i = 0,
     4127                results = context.getElementsByTagName( tag );
     4128
     4129            // Filter out possible comments
     4130            if ( tag === "*" ) {
     4131                for ( ; (elem = results[i]); i++ ) {
     4132                    if ( elem.nodeType === 1 ) {
     4133                        tmp.push( elem );
     4134                    }
     4135                }
     4136
     4137                return tmp;
     4138            }
     4139            return results;
     4140        };
     4141
     4142    // Name
     4143    Expr.find["NAME"] = support.getByName && function( tag, context ) {
     4144        if ( typeof context.getElementsByName !== strundefined ) {
     4145            return context.getElementsByName( name );
     4146        }
     4147    };
     4148
     4149    // Class
     4150    Expr.find["CLASS"] = support.getByClassName && function( className, context ) {
     4151        if ( typeof context.getElementsByClassName !== strundefined && !documentIsXML ) {
     4152            return context.getElementsByClassName( className );
     4153        }
     4154    };
     4155
     4156    // QSA and matchesSelector support
     4157
     4158    // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
     4159    rbuggyMatches = [];
     4160
     4161    // qSa(:focus) reports false when true (Chrome 21),
     4162    // no need to also add to buggyMatches since matches checks buggyQSA
     4163    // A support test would require too much code (would include document ready)
     4164    rbuggyQSA = [ ":focus" ];
     4165
     4166    if ( (support.qsa = isNative(doc.querySelectorAll)) ) {
     4167        // Build QSA regex
     4168        // Regex strategy adopted from Diego Perini
     4169        assert(function( div ) {
     4170            // Select is set to empty string on purpose
     4171            // This is to test IE's treatment of not explictly
     4172            // setting a boolean content attribute,
     4173            // since its presence should be enough
     4174            // http://bugs.jquery.com/ticket/12359
     4175            div.innerHTML = "<select><option selected=''></option></select>";
     4176
     4177            // IE8 - Some boolean attributes are not treated correctly
     4178            if ( !div.querySelectorAll("[selected]").length ) {
     4179                rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
     4180            }
     4181
     4182            // Webkit/Opera - :checked should return selected option elements
     4183            // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
     4184            // IE8 throws error here and will not see later tests
     4185            if ( !div.querySelectorAll(":checked").length ) {
     4186                rbuggyQSA.push(":checked");
     4187            }
     4188        });
     4189
     4190        assert(function( div ) {
     4191
     4192            // Opera 10-12/IE9 - ^= $= *= and empty values
     4193            // Should not select anything
     4194            div.innerHTML = "<p test=''></p>";
     4195            if ( div.querySelectorAll("[test^='']").length ) {
     4196                rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
     4197            }
     4198
     4199            // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
     4200            // IE8 throws error here and will not see later tests
     4201            div.innerHTML = "<input type='hidden'/>";
     4202            if ( !div.querySelectorAll(":enabled").length ) {
     4203                rbuggyQSA.push( ":enabled", ":disabled" );
     4204            }
     4205
     4206            // Opera 10-11 does not throw on post-comma invalid pseudos
     4207            div.querySelectorAll("*,:x");
     4208            rbuggyQSA.push(",.*:");
     4209        });
     4210    }
     4211
     4212    if ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||
     4213        docElem.mozMatchesSelector ||
     4214        docElem.webkitMatchesSelector ||
     4215        docElem.oMatchesSelector ||
     4216        docElem.msMatchesSelector) )) ) {
     4217
     4218        assert(function( div ) {
     4219            // Check to see if it's possible to do matchesSelector
     4220            // on a disconnected node (IE 9)
     4221            support.disconnectedMatch = matches.call( div, "div" );
     4222
     4223            // This should fail with an exception
     4224            // Gecko does not error, returns false instead
     4225            matches.call( div, "[test!='']:x" );
     4226            rbuggyMatches.push( "!=", pseudos );
     4227        });
     4228    }
     4229
     4230    rbuggyQSA = new RegExp( rbuggyQSA.join("|") );
     4231    rbuggyMatches = new RegExp( rbuggyMatches.join("|") );
     4232
     4233    // Element contains another
     4234    // Purposefully does not implement inclusive descendent
     4235    // As in, an element does not contain itself
     4236    contains = isNative(docElem.contains) || docElem.compareDocumentPosition ?
     4237        function( a, b ) {
     4238            var adown = a.nodeType === 9 ? a.documentElement : a,
     4239                bup = b && b.parentNode;
     4240            return a === bup || !!( bup && bup.nodeType === 1 && (
     4241                adown.contains ?
     4242                    adown.contains( bup ) :
     4243                    a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
     4244            ));
     4245        } :
     4246        function( a, b ) {
     4247            if ( b ) {
     4248                while ( (b = b.parentNode) ) {
     4249                    if ( b === a ) {
     4250                        return true;
     4251                    }
     4252                }
     4253            }
     4254            return false;
     4255        };
     4256
     4257    // Document order sorting
     4258    sortOrder = docElem.compareDocumentPosition ?
     4259    function( a, b ) {
     4260        var compare;
     4261
     4262        if ( a === b ) {
     4263            hasDuplicate = true;
     4264            return 0;
     4265        }
     4266
     4267        if ( (compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b )) ) {
     4268            if ( compare & 1 || a.parentNode && a.parentNode.nodeType === 11 ) {
     4269                if ( a === doc || contains( preferredDoc, a ) ) {
     4270                    return -1;
     4271                }
     4272                if ( b === doc || contains( preferredDoc, b ) ) {
     4273                    return 1;
     4274                }
     4275                return 0;
     4276            }
     4277            return compare & 4 ? -1 : 1;
     4278        }
     4279
     4280        return a.compareDocumentPosition ? -1 : 1;
     4281    } :
     4282    function( a, b ) {
     4283        var cur,
     4284            i = 0,
     4285            aup = a.parentNode,
     4286            bup = b.parentNode,
     4287            ap = [ a ],
     4288            bp = [ b ];
     4289
     4290        // The nodes are identical, we can exit early
     4291        if ( a === b ) {
     4292            hasDuplicate = true;
     4293            return 0;
     4294
     4295        // Fallback to using sourceIndex (in IE) if it's available on both nodes
     4296        } else if ( a.sourceIndex && b.sourceIndex ) {
     4297            return ( ~b.sourceIndex || MAX_NEGATIVE ) - ( contains( preferredDoc, a ) && ~a.sourceIndex || MAX_NEGATIVE );
     4298
     4299        // Parentless nodes are either documents or disconnected
     4300        } else if ( !aup || !bup ) {
     4301            return a === doc ? -1 :
     4302                b === doc ? 1 :
     4303                aup ? -1 :
     4304                bup ? 1 :
     4305                0;
     4306
     4307        // If the nodes are siblings, we can do a quick check
     4308        } else if ( aup === bup ) {
     4309            return siblingCheck( a, b );
     4310        }
     4311
     4312        // Otherwise we need full lists of their ancestors for comparison
     4313        cur = a;
     4314        while ( (cur = cur.parentNode) ) {
     4315            ap.unshift( cur );
     4316        }
     4317        cur = b;
     4318        while ( (cur = cur.parentNode) ) {
     4319            bp.unshift( cur );
     4320        }
     4321
     4322        // Walk down the tree looking for a discrepancy
     4323        while ( ap[i] === bp[i] ) {
     4324            i++;
     4325        }
     4326
     4327        return i ?
     4328            // Do a sibling check if the nodes have a common ancestor
     4329            siblingCheck( ap[i], bp[i] ) :
     4330
     4331            // Otherwise nodes in our document sort first
     4332            ap[i] === preferredDoc ? -1 :
     4333            bp[i] === preferredDoc ? 1 :
     4334            0;
     4335    };
     4336
     4337    // Always assume the presence of duplicates if sort doesn't
     4338    // pass them to our comparison function (as in Google Chrome).
     4339    hasDuplicate = false;
     4340    [0, 0].sort( sortOrder );
     4341    support.detectDuplicates = hasDuplicate;
     4342
     4343    return document;
     4344};
     4345
     4346Sizzle.matches = function( expr, elements ) {
     4347    return Sizzle( expr, window.document, null, elements );
     4348};
     4349
     4350Sizzle.matchesSelector = function( elem, expr ) {
     4351    // Set document vars if needed
     4352    if ( elem && (( elem.ownerDocument || elem ) !== document) ) {
     4353        setDocument( elem );
     4354    }
     4355
     4356    // Make sure that attribute selectors are quoted
     4357    expr = expr.replace( rattributeQuotes, "='$1']" );
     4358
     4359    // rbuggyQSA always contains :focus, so no need for an existence check
     4360    if ( support.matchesSelector && !documentIsXML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {
     4361        try {
     4362            var ret = matches.call( elem, expr );
     4363
     4364            // IE 9's matchesSelector returns false on disconnected nodes
     4365            if ( ret || support.disconnectedMatch ||
     4366                    // As well, disconnected nodes are said to be in a document
     4367                    // fragment in IE 9
     4368                    elem.document && elem.document.nodeType !== 11 ) {
     4369                return ret;
     4370            }
     4371        } catch(e) {}
     4372    }
     4373
     4374    return Sizzle( expr, document, null, [elem] ).length > 0;
     4375};
     4376
     4377Sizzle.contains = function( context, elem ) {
     4378    // Set document vars if needed
     4379    if ( context && (( context.ownerDocument || context ) !== document) ) {
     4380        setDocument( context );
     4381    }
     4382    return contains( context, elem );
     4383};
     4384
     4385Sizzle.attr = function( elem, name ) {
     4386    var val;
     4387
     4388    // Set document vars if needed
     4389    if ( elem && (( elem.ownerDocument || elem ) !== document) ) {
     4390        setDocument( elem );
     4391    }
     4392
     4393    if ( !documentIsXML ) {
     4394        name = name.toLowerCase();
     4395    }
     4396    if ( (val = Expr.attrHandle[ name ]) ) {
     4397        return val( elem );
     4398    }
     4399    if ( documentIsXML || support.attributes ) {
     4400        return elem.getAttribute( name );
     4401    }
     4402    return ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?
     4403        name :
     4404        val && val.specified ? val.value : null;
     4405};
     4406
     4407Sizzle.error = function( msg ) {
     4408    throw new Error( "Syntax error, unrecognized expression: " + msg );
     4409};
     4410
     4411// Document sorting and removing duplicates
     4412Sizzle.uniqueSort = function( results ) {
     4413    var elem,
     4414        duplicates = [],
     4415        i = 1,
     4416        j = 0;
     4417
     4418    // Unless we *know* we can detect duplicates, assume their presence
     4419    hasDuplicate = !support.detectDuplicates;
     4420    results.sort( sortOrder );
     4421
     4422    if ( hasDuplicate ) {
     4423        for ( ; (elem = results[i]); i++ ) {
     4424            if ( elem === results[ i - 1 ] ) {
     4425                j = duplicates.push( i );
     4426            }
     4427        }
     4428        while ( j-- ) {
     4429            results.splice( duplicates[ j ], 1 );
     4430        }
     4431    }
     4432
     4433    return results;
     4434};
     4435
     4436function siblingCheck( a, b ) {
     4437    var cur = a && b && a.nextSibling;
     4438
     4439    for ( ; cur; cur = cur.nextSibling ) {
     4440        if ( cur === b ) {
     4441            return -1;
     4442        }
     4443    }
     4444
     4445    return a ? 1 : -1;
     4446}
     4447
     4448// Returns a function to use in pseudos for input types
     4449function createInputPseudo( type ) {
     4450    return function( elem ) {
     4451        var name = elem.nodeName.toLowerCase();
     4452        return name === "input" && elem.type === type;
     4453    };
     4454}
     4455
     4456// Returns a function to use in pseudos for buttons
     4457function createButtonPseudo( type ) {
     4458    return function( elem ) {
     4459        var name = elem.nodeName.toLowerCase();
     4460        return (name === "input" || name === "button") && elem.type === type;
     4461    };
     4462}
     4463
     4464// Returns a function to use in pseudos for positionals
     4465function createPositionalPseudo( fn ) {
     4466    return markFunction(function( argument ) {
     4467        argument = +argument;
     4468        return markFunction(function( seed, matches ) {
     4469            var j,
     4470                matchIndexes = fn( [], seed.length, argument ),
     4471                i = matchIndexes.length;
     4472
     4473            // Match elements found at the specified indexes
     4474            while ( i-- ) {
     4475                if ( seed[ (j = matchIndexes[i]) ] ) {
     4476                    seed[j] = !(matches[j] = seed[j]);
     4477                }
     4478            }
     4479        });
     4480    });
     4481}
     4482
     4483/**
     4484 * Utility function for retrieving the text value of an array of DOM nodes
     4485 * @param {Array|Element} elem
     4486 */
     4487getText = Sizzle.getText = function( elem ) {
     4488    var node,
     4489        ret = "",
     4490        i = 0,
     4491        nodeType = elem.nodeType;
     4492
     4493    if ( !nodeType ) {
     4494        // If no nodeType, this is expected to be an array
     4495        for ( ; (node = elem[i]); i++ ) {
     4496            // Do not traverse comment nodes
     4497            ret += getText( node );
     4498        }
     4499    } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
     4500        // Use textContent for elements
     4501        // innerText usage removed for consistency of new lines (see #11153)
     4502        if ( typeof elem.textContent === "string" ) {
     4503            return elem.textContent;
     4504        } else {
     4505            // Traverse its children
     4506            for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
     4507                ret += getText( elem );
     4508            }
     4509        }
     4510    } else if ( nodeType === 3 || nodeType === 4 ) {
     4511        return elem.nodeValue;
     4512    }
     4513    // Do not include comment or processing instruction nodes
     4514
     4515    return ret;
     4516};
     4517
     4518Expr = Sizzle.selectors = {
     4519
     4520    // Can be adjusted by the user
     4521    cacheLength: 50,
     4522
     4523    createPseudo: markFunction,
     4524
     4525    match: matchExpr,
     4526
     4527    find: {},
     4528
     4529    relative: {
     4530        ">": { dir: "parentNode", first: true },
     4531        " ": { dir: "parentNode" },
     4532        "+": { dir: "previousSibling", first: true },
     4533        "~": { dir: "previousSibling" }
     4534    },
     4535
     4536    preFilter: {
     4537        "ATTR": function( match ) {
     4538            match[1] = match[1].replace( rbackslash, "" );
     4539
     4540            // Move the given value to match[3] whether quoted or unquoted
     4541            match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );
     4542
     4543            if ( match[2] === "~=" ) {
     4544                match[3] = " " + match[3] + " ";
     4545            }
     4546
     4547            return match.slice( 0, 4 );
     4548        },
     4549
     4550        "CHILD": function( match ) {
     4551            /* matches from matchExpr["CHILD"]
     4552                1 type (only|nth|...)
     4553                2 what (child|of-type)
     4554                3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
     4555                4 xn-component of xn+y argument ([+-]?\d*n|)
     4556                5 sign of xn-component
     4557                6 x of xn-component
     4558                7 sign of y-component
     4559                8 y of y-component
     4560            */
     4561            match[1] = match[1].toLowerCase();
     4562
     4563            if ( match[1].slice( 0, 3 ) === "nth" ) {
     4564                // nth-* requires argument
     4565                if ( !match[3] ) {
     4566                    Sizzle.error( match[0] );
     4567                }
     4568
     4569                // numeric x and y parameters for Expr.filter.CHILD
     4570                // remember that false/true cast respectively to 0/1
     4571                match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
     4572                match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
     4573
     4574            // other types prohibit arguments
     4575            } else if ( match[3] ) {
     4576                Sizzle.error( match[0] );
     4577            }
     4578
     4579            return match;
     4580        },
     4581
     4582        "PSEUDO": function( match ) {
     4583            var excess,
     4584                unquoted = !match[5] && match[2];
     4585
     4586            if ( matchExpr["CHILD"].test( match[0] ) ) {
     4587                return null;
     4588            }
     4589
     4590            // Accept quoted arguments as-is
     4591            if ( match[4] ) {
     4592                match[2] = match[4];
     4593
     4594            // Strip excess characters from unquoted arguments
     4595            } else if ( unquoted && rpseudo.test( unquoted ) &&
     4596                // Get excess from tokenize (recursively)
     4597                (excess = tokenize( unquoted, true )) &&
     4598                // advance to the next closing parenthesis
     4599                (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
     4600
     4601                // excess is a negative index
     4602                match[0] = match[0].slice( 0, excess );
     4603                match[2] = unquoted.slice( 0, excess );
     4604            }
     4605
     4606            // Return only captures needed by the pseudo filter method (type and argument)
     4607            return match.slice( 0, 3 );
     4608        }
     4609    },
     4610
     4611    filter: {
     4612
     4613        "TAG": function( nodeName ) {
     4614            if ( nodeName === "*" ) {
     4615                return function() { return true; };
     4616            }
     4617
     4618            nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();
     4619            return function( elem ) {
     4620                return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
     4621            };
     4622        },
     4623
     4624        "CLASS": function( className ) {
     4625            var pattern = classCache[ expando ][ className + " " ];
     4626
     4627            return pattern ||
     4628                (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
     4629                classCache( className, function( elem ) {
     4630                    return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
     4631                });
     4632        },
     4633
     4634        "ATTR": function( name, operator, check ) {
     4635            return function( elem ) {
     4636                var result = Sizzle.attr( elem, name );
     4637
     4638                if ( result == null ) {
     4639                    return operator === "!=";
     4640                }
     4641                if ( !operator ) {
     4642                    return true;
     4643                }
     4644
     4645                result += "";
     4646
     4647                return operator === "=" ? result === check :
     4648                    operator === "!=" ? result !== check :
     4649                    operator === "^=" ? check && result.indexOf( check ) === 0 :
     4650                    operator === "*=" ? check && result.indexOf( check ) > -1 :
     4651                    operator === "$=" ? check && result.substr( result.length - check.length ) === check :
     4652                    operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
     4653                    operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :
     4654                    false;
     4655            };
     4656        },
     4657
     4658        "CHILD": function( type, what, argument, first, last ) {
     4659            var simple = type.slice( 0, 3 ) !== "nth",
     4660                forward = type.slice( -4 ) !== "last",
     4661                ofType = what === "of-type";
     4662
     4663            return first === 1 && last === 0 ?
     4664
     4665                // Shortcut for :nth-*(n)
     4666                function( elem ) {
     4667                    return !!elem.parentNode;
     4668                } :
     4669
     4670                function( elem, context, xml ) {
     4671                    var cache, outerCache, node, diff, nodeIndex, start,
     4672                        dir = simple !== forward ? "nextSibling" : "previousSibling",
     4673                        parent = elem.parentNode,
     4674                        name = ofType && elem.nodeName.toLowerCase(),
     4675                        useCache = !xml && !ofType;
     4676
     4677                    if ( parent ) {
     4678
     4679                        // :(first|last|only)-(child|of-type)
     4680                        if ( simple ) {
     4681                            while ( dir ) {
     4682                                node = elem;
     4683                                while ( (node = node[ dir ]) ) {
     4684                                    if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
     4685                                        return false;
     4686                                    }
     4687                                }
     4688                                // Reverse direction for :only-* (if we haven't yet done so)
     4689                                start = dir = type === "only" && !start && "nextSibling";
     4690                            }
     4691                            return true;
     4692                        }
     4693
     4694                        start = [ forward ? parent.firstChild : parent.lastChild ];
     4695
     4696                        // non-xml :nth-child(...) stores cache data on `parent`
     4697                        if ( forward && useCache ) {
     4698                            // Seek `elem` from a previously-cached index
     4699                            outerCache = parent[ expando ] || (parent[ expando ] = {});
     4700                            cache = outerCache[ type ] || [];
     4701                            nodeIndex = cache[0] === dirruns && cache[1];
     4702                            diff = cache[0] === dirruns && cache[2];
     4703                            node = nodeIndex && parent.childNodes[ nodeIndex ];
     4704
     4705                            while ( (node = ++nodeIndex && node && node[ dir ] ||
     4706
     4707                                // Fallback to seeking `elem` from the start
     4708                                (diff = nodeIndex = 0) || start.pop()) ) {
     4709
     4710                                // When found, cache indexes on `parent` and break
     4711                                if ( node.nodeType === 1 && ++diff && node === elem ) {
     4712                                    outerCache[ type ] = [ dirruns, nodeIndex, diff ];
     4713                                    break;
     4714                                }
     4715                            }
     4716
     4717                        // Use previously-cached element index if available
     4718                        } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
     4719                            diff = cache[1];
     4720
     4721                        // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
     4722                        } else {
     4723                            // Use the same loop as above to seek `elem` from the start
     4724                            while ( (node = ++nodeIndex && node && node[ dir ] ||
     4725                                (diff = nodeIndex = 0) || start.pop()) ) {
     4726
     4727                                if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
     4728                                    // Cache the index of each encountered element
     4729                                    if ( useCache ) {
     4730                                        (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
     4731                                    }
     4732
     4733                                    if ( node === elem ) {
     4734                                        break;
     4735                                    }
     4736                                }
     4737                            }
     4738                        }
     4739
     4740                        // Incorporate the offset, then check against cycle size
     4741                        diff -= last;
     4742                        return diff === first || ( diff % first === 0 && diff / first >= 0 );
     4743                    }
     4744                };
     4745        },
     4746
     4747        "PSEUDO": function( pseudo, argument ) {
     4748            // pseudo-class names are case-insensitive
     4749            // http://www.w3.org/TR/selectors/#pseudo-classes
     4750            // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
     4751            // Remember that setFilters inherits from pseudos
     4752            var args,
     4753                fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
     4754                    Sizzle.error( "unsupported pseudo: " + pseudo );
     4755
     4756            // The user may use createPseudo to indicate that
     4757            // arguments are needed to create the filter function
     4758            // just as Sizzle does
     4759            if ( fn[ expando ] ) {
     4760                return fn( argument );
     4761            }
     4762
     4763            // But maintain support for old signatures
     4764            if ( fn.length > 1 ) {
     4765                args = [ pseudo, pseudo, "", argument ];
     4766                return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
     4767                    markFunction(function( seed, matches ) {
     4768                        var idx,
     4769                            matched = fn( seed, argument ),
     4770                            i = matched.length;
     4771                        while ( i-- ) {
     4772                            idx = indexOf.call( seed, matched[i] );
     4773                            seed[ idx ] = !( matches[ idx ] = matched[i] );
     4774                        }
     4775                    }) :
     4776                    function( elem ) {
     4777                        return fn( elem, 0, args );
     4778                    };
     4779            }
     4780
     4781            return fn;
     4782        }
     4783    },
     4784
     4785    pseudos: {
     4786        // Potentially complex pseudos
     4787        "not": markFunction(function( selector ) {
     4788            // Trim the selector passed to compile
     4789            // to avoid treating leading and trailing
     4790            // spaces as combinators
     4791            var input = [],
     4792                results = [],
     4793                matcher = compile( selector.replace( rtrim, "$1" ) );
     4794
     4795            return matcher[ expando ] ?
     4796                markFunction(function( seed, matches, context, xml ) {
     4797                    var elem,
     4798                        unmatched = matcher( seed, null, xml, [] ),
     4799                        i = seed.length;
     4800
     4801                    // Match elements unmatched by `matcher`
     4802                    while ( i-- ) {
     4803                        if ( (elem = unmatched[i]) ) {
     4804                            seed[i] = !(matches[i] = elem);
     4805                        }
     4806                    }
     4807                }) :
     4808                function( elem, context, xml ) {
     4809                    input[0] = elem;
     4810                    matcher( input, null, xml, results );
     4811                    return !results.pop();
     4812                };
     4813        }),
     4814
     4815        "has": markFunction(function( selector ) {
     4816            return function( elem ) {
     4817                return Sizzle( selector, elem ).length > 0;
     4818            };
     4819        }),
     4820
     4821        "contains": markFunction(function( text ) {
     4822            return function( elem ) {
     4823                return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
     4824            };
     4825        }),
     4826
     4827        // Miscellaneous
     4828        "target": function( elem ) {
     4829            var hash = window.location && window.location.hash;
     4830            return hash && hash.slice( 1 ) === elem.id;
     4831        },
     4832
     4833        "root": function( elem ) {
     4834            return elem === docElem;
     4835        },
     4836
     4837        "focus": function( elem ) {
     4838            return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
     4839        },
     4840
     4841        // Boolean properties
     4842        "enabled": function( elem ) {
     4843            return elem.disabled === false;
     4844        },
     4845
     4846        "disabled": function( elem ) {
     4847            return elem.disabled === true;
     4848        },
     4849
     4850        "checked": function( elem ) {
     4851            // In CSS3, :checked should return both checked and selected elements
     4852            // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
     4853            var nodeName = elem.nodeName.toLowerCase();
     4854            return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
     4855        },
     4856
     4857        "selected": function( elem ) {
     4858            // Accessing this property makes selected-by-default
     4859            // options in Safari work properly
     4860            if ( elem.parentNode ) {
     4861                elem.parentNode.selectedIndex;
     4862            }
     4863
     4864            return elem.selected === true;
     4865        },
     4866
     4867        // Contents
     4868        "empty": function( elem ) {
     4869            // http://www.w3.org/TR/selectors/#empty-pseudo
     4870            // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
     4871            //   not comment, processing instructions, or others
     4872            // Thanks to Diego Perini for the nodeName shortcut
     4873            //   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
     4874            for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
     4875                if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
     4876                    return false;
     4877                }
     4878            }
     4879            return true;
     4880        },
     4881
     4882        "parent": function( elem ) {
     4883            return !Expr.pseudos["empty"]( elem );
     4884        },
     4885
     4886        // Element/input types
     4887        "header": function( elem ) {
     4888            return rheader.test( elem.nodeName );
     4889        },
     4890
     4891        "input": function( elem ) {
     4892            return rinputs.test( elem.nodeName );
     4893        },
     4894
     4895        "button": function( elem ) {
     4896            var name = elem.nodeName.toLowerCase();
     4897            return name === "input" && elem.type === "button" || name === "button";
     4898        },
     4899
     4900        "text": function( elem ) {
     4901            var attr;
     4902            // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
     4903            // use getAttribute instead to test this case
     4904            return elem.nodeName.toLowerCase() === "input" &&
     4905                elem.type === "text" &&
     4906                ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
     4907        },
     4908
     4909        // Position-in-collection
     4910        "first": createPositionalPseudo(function() {
     4911            return [ 0 ];
     4912        }),
     4913
     4914        "last": createPositionalPseudo(function( matchIndexes, length ) {
     4915            return [ length - 1 ];
     4916        }),
     4917
     4918        "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
     4919            return [ argument < 0 ? argument + length : argument ];
     4920        }),
     4921
     4922        "even": createPositionalPseudo(function( matchIndexes, length ) {
     4923            var i = 0;
     4924            for ( ; i < length; i += 2 ) {
     4925                matchIndexes.push( i );
     4926            }
     4927            return matchIndexes;
     4928        }),
     4929
     4930        "odd": createPositionalPseudo(function( matchIndexes, length ) {
     4931            var i = 1;
     4932            for ( ; i < length; i += 2 ) {
     4933                matchIndexes.push( i );
     4934            }
     4935            return matchIndexes;
     4936        }),
     4937
     4938        "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
     4939            var i = argument < 0 ? argument + length : argument;
     4940            for ( ; --i >= 0; ) {
     4941                matchIndexes.push( i );
     4942            }
     4943            return matchIndexes;
     4944        }),
     4945
     4946        "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
     4947            var i = argument < 0 ? argument + length : argument;
     4948            for ( ; ++i < length; ) {
     4949                matchIndexes.push( i );
     4950            }
     4951            return matchIndexes;
     4952        })
     4953    }
     4954};
     4955
     4956// Add button/input type pseudos
     4957for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
     4958    Expr.pseudos[ i ] = createInputPseudo( i );
     4959}
     4960for ( i in { submit: true, reset: true } ) {
     4961    Expr.pseudos[ i ] = createButtonPseudo( i );
     4962}
     4963
     4964function tokenize( selector, parseOnly ) {
     4965    var matched, match, tokens, type,
     4966        soFar, groups, preFilters,
     4967        cached = tokenCache[ expando ][ selector + " " ];
     4968
     4969    if ( cached ) {
     4970        return parseOnly ? 0 : cached.slice( 0 );
     4971    }
     4972
     4973    soFar = selector;
     4974    groups = [];
     4975    preFilters = Expr.preFilter;
     4976
     4977    while ( soFar ) {
     4978
     4979        // Comma and first run
     4980        if ( !matched || (match = rcomma.exec( soFar )) ) {
     4981            if ( match ) {
     4982                // Don't consume trailing commas as valid
     4983                soFar = soFar.slice( match[0].length ) || soFar;
     4984            }
     4985            groups.push( tokens = [] );
     4986        }
     4987
     4988        matched = false;
     4989
     4990        // Combinators
     4991        if ( (match = rcombinators.exec( soFar )) ) {
     4992            tokens.push( matched = new Token( match.shift() ) );
     4993            soFar = soFar.slice( matched.length );
     4994
     4995            // Cast descendant combinators to space
     4996            matched.type = match[0].replace( rtrim, " " );
     4997        }
     4998
     4999        // Filters
     5000        for ( type in Expr.filter ) {
     5001            if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
     5002                (match = preFilters[ type ]( match ))) ) {
     5003
     5004                tokens.push( matched = new Token( match.shift() ) );
     5005                soFar = soFar.slice( matched.length );
     5006                matched.type = type;
     5007                matched.matches = match;
     5008            }
     5009        }
     5010
     5011        if ( !matched ) {
     5012            break;
     5013        }
     5014    }
     5015
     5016    // Return the length of the invalid excess
     5017    // if we're just parsing
     5018    // Otherwise, throw an error or return tokens
     5019    return parseOnly ?
     5020        soFar.length :
     5021        soFar ?
     5022            Sizzle.error( selector ) :
     5023            // Cache the tokens
     5024            tokenCache( selector, groups ).slice( 0 );
     5025}
     5026
     5027function addCombinator( matcher, combinator, base ) {
     5028    var dir = combinator.dir,
     5029        checkNonElements = base && combinator.dir === "parentNode",
     5030        doneName = done++;
     5031
     5032    return combinator.first ?
     5033        // Check against closest ancestor/preceding element
     5034        function( elem, context, xml ) {
     5035            while ( (elem = elem[ dir ]) ) {
     5036                if ( elem.nodeType === 1 || checkNonElements ) {
     5037                    return matcher( elem, context, xml );
     5038                }
     5039            }
     5040        } :
     5041
     5042        // Check against all ancestor/preceding elements
     5043        function( elem, context, xml ) {
     5044            var data, cache, outerCache,
     5045                dirkey = dirruns + " " + doneName;
     5046
     5047            // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
     5048            if ( xml ) {
     5049                while ( (elem = elem[ dir ]) ) {
     5050                    if ( elem.nodeType === 1 || checkNonElements ) {
     5051                        if ( matcher( elem, context, xml ) ) {
     5052                            return true;
     5053                        }
     5054                    }
     5055                }
     5056            } else {
     5057                while ( (elem = elem[ dir ]) ) {
     5058                    if ( elem.nodeType === 1 || checkNonElements ) {
     5059                        outerCache = elem[ expando ] || (elem[ expando ] = {});
     5060                        if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
     5061                            if ( (data = cache[1]) === true || data === cachedruns ) {
     5062                                return data === true;
     5063                            }
     5064                        } else {
     5065                            cache = outerCache[ dir ] = [ dirkey ];
     5066                            cache[1] = matcher( elem, context, xml ) || cachedruns;
     5067                            if ( cache[1] === true ) {
     5068                                return true;
     5069                            }
     5070                        }
     5071                    }
     5072                }
     5073            }
     5074        };
     5075}
     5076
     5077function elementMatcher( matchers ) {
     5078    return matchers.length > 1 ?
     5079        function( elem, context, xml ) {
     5080            var i = matchers.length;
     5081            while ( i-- ) {
     5082                if ( !matchers[i]( elem, context, xml ) ) {
     5083                    return false;
     5084                }
     5085            }
     5086            return true;
     5087        } :
     5088        matchers[0];
     5089}
     5090
     5091function condense( unmatched, map, filter, context, xml ) {
     5092    var elem,
     5093        newUnmatched = [],
     5094        i = 0,
     5095        len = unmatched.length,
     5096        mapped = map != null;
     5097
     5098    for ( ; i < len; i++ ) {
     5099        if ( (elem = unmatched[i]) ) {
     5100            if ( !filter || filter( elem, context, xml ) ) {
     5101                newUnmatched.push( elem );
     5102                if ( mapped ) {
     5103                    map.push( i );
     5104                }
     5105            }
     5106        }
     5107    }
     5108
     5109    return newUnmatched;
     5110}
     5111
     5112function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
     5113    if ( postFilter && !postFilter[ expando ] ) {
     5114        postFilter = setMatcher( postFilter );
     5115    }
     5116    if ( postFinder && !postFinder[ expando ] ) {
     5117        postFinder = setMatcher( postFinder, postSelector );
     5118    }
     5119    return markFunction(function( seed, results, context, xml ) {
     5120        var temp, i, elem,
     5121            preMap = [],
     5122            postMap = [],
     5123            preexisting = results.length,
     5124
     5125            // Get initial elements from seed or context
     5126            elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
     5127
     5128            // Prefilter to get matcher input, preserving a map for seed-results synchronization
     5129            matcherIn = preFilter && ( seed || !selector ) ?
     5130                condense( elems, preMap, preFilter, context, xml ) :
     5131                elems,
     5132
     5133            matcherOut = matcher ?
     5134                // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
     5135                postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
     5136
     5137                    // ...intermediate processing is necessary
     5138                    [] :
     5139
     5140                    // ...otherwise use results directly
     5141                    results :
     5142                matcherIn;
     5143
     5144        // Find primary matches
     5145        if ( matcher ) {
     5146            matcher( matcherIn, matcherOut, context, xml );
     5147        }
     5148
     5149        // Apply postFilter
     5150        if ( postFilter ) {
     5151            temp = condense( matcherOut, postMap );
     5152            postFilter( temp, [], context, xml );
     5153
     5154            // Un-match failing elements by moving them back to matcherIn
     5155            i = temp.length;
     5156            while ( i-- ) {
     5157                if ( (elem = temp[i]) ) {
     5158                    matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
     5159                }
     5160            }
     5161        }
     5162
     5163        if ( seed ) {
     5164            if ( postFinder || preFilter ) {
     5165                if ( postFinder ) {
     5166                    // Get the final matcherOut by condensing this intermediate into postFinder contexts
     5167                    temp = [];
     5168                    i = matcherOut.length;
     5169                    while ( i-- ) {
     5170                        if ( (elem = matcherOut[i]) ) {
     5171                            // Restore matcherIn since elem is not yet a final match
     5172                            temp.push( (matcherIn[i] = elem) );
     5173                        }
     5174                    }
     5175                    postFinder( null, (matcherOut = []), temp, xml );
     5176                }
     5177
     5178                // Move matched elements from seed to results to keep them synchronized
     5179                i = matcherOut.length;
     5180                while ( i-- ) {
     5181                    if ( (elem = matcherOut[i]) &&
     5182                        (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
     5183
     5184                        seed[temp] = !(results[temp] = elem);
     5185                    }
     5186                }
     5187            }
     5188
     5189        // Add elements to results, through postFinder if defined
     5190        } else {
     5191            matcherOut = condense(
     5192                matcherOut === results ?
     5193                    matcherOut.splice( preexisting, matcherOut.length ) :
     5194                    matcherOut
     5195            );
     5196            if ( postFinder ) {
     5197                postFinder( null, results, matcherOut, xml );
     5198            } else {
     5199                push.apply( results, matcherOut );
     5200            }
     5201        }
     5202    });
     5203}
     5204
     5205function matcherFromTokens( tokens ) {
     5206    var checkContext, matcher, j,
     5207        len = tokens.length,
     5208        leadingRelative = Expr.relative[ tokens[0].type ],
     5209        implicitRelative = leadingRelative || Expr.relative[" "],
     5210        i = leadingRelative ? 1 : 0,
     5211
     5212        // The foundational matcher ensures that elements are reachable from top-level context(s)
     5213        matchContext = addCombinator( function( elem ) {
     5214            return elem === checkContext;
     5215        }, implicitRelative, true ),
     5216        matchAnyContext = addCombinator( function( elem ) {
     5217            return indexOf.call( checkContext, elem ) > -1;
     5218        }, implicitRelative, true ),
     5219        matchers = [ function( elem, context, xml ) {
     5220            return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
     5221                (checkContext = context).nodeType ?
     5222                    matchContext( elem, context, xml ) :
     5223                    matchAnyContext( elem, context, xml ) );
     5224        } ];
     5225
     5226    for ( ; i < len; i++ ) {
     5227        if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
     5228            matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
     5229        } else {
     5230            matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
     5231
     5232            // Return special upon seeing a positional matcher
     5233            if ( matcher[ expando ] ) {
     5234                // Find the next relative operator (if any) for proper handling
     5235                j = ++i;
     5236                for ( ; j < len; j++ ) {
     5237                    if ( Expr.relative[ tokens[j].type ] ) {
     5238                        break;
     5239                    }
     5240                }
     5241                return setMatcher(
     5242                    i > 1 && elementMatcher( matchers ),
     5243                    i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),
     5244                    matcher,
     5245                    i < j && matcherFromTokens( tokens.slice( i, j ) ),
     5246                    j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
     5247                    j < len && tokens.join("")
     5248                );
     5249            }
     5250            matchers.push( matcher );
     5251        }
     5252    }
     5253
     5254    return elementMatcher( matchers );
     5255}
     5256
     5257function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
     5258    // A counter to specify which element is currently being matched
     5259    var matcherCachedRuns = 0,
     5260        bySet = setMatchers.length > 0,
     5261        byElement = elementMatchers.length > 0,
     5262        superMatcher = function( seed, context, xml, results, expandContext ) {
     5263            var elem, j, matcher,
     5264                setMatched = [],
     5265                matchedCount = 0,
     5266                i = "0",
     5267                unmatched = seed && [],
     5268                outermost = expandContext != null,
     5269                contextBackup = outermostContext,
     5270                // We must always have either seed elements or context
     5271                elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
     5272                // Nested matchers should use non-integer dirruns
     5273                dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);
     5274
     5275            if ( outermost ) {
     5276                outermostContext = context !== document && context;
     5277                cachedruns = matcherCachedRuns;
     5278            }
     5279
     5280            // Add elements passing elementMatchers directly to results
     5281            for ( ; (elem = elems[i]) != null; i++ ) {
     5282                if ( byElement && elem ) {
     5283                    for ( j = 0; (matcher = elementMatchers[j]); j++ ) {
     5284                        if ( matcher( elem, context, xml ) ) {
     5285                            results.push( elem );
     5286                            break;
     5287                        }
     5288                    }
     5289                    if ( outermost ) {
     5290                        dirruns = dirrunsUnique;
     5291                        cachedruns = ++matcherCachedRuns;
     5292                    }
     5293                }
     5294
     5295                // Track unmatched elements for set filters
     5296                if ( bySet ) {
     5297                    // They will have gone through all possible matchers
     5298                    if ( (elem = !matcher && elem) ) {
     5299                        matchedCount--;
     5300                    }
     5301
     5302                    // Lengthen the array for every element, matched or not
     5303                    if ( seed ) {
     5304                        unmatched.push( elem );
     5305                    }
     5306                }
     5307            }
     5308
     5309            // Apply set filters to unmatched elements
     5310            // `i` starts as a string, so matchedCount would equal "00" if there are no elements
     5311            matchedCount += i;
     5312            if ( bySet && i !== matchedCount ) {
     5313                for ( j = 0; (matcher = setMatchers[j]); j++ ) {
     5314                    matcher( unmatched, setMatched, context, xml );
     5315                }
     5316
     5317                if ( seed ) {
     5318                    // Reintegrate element matches to eliminate the need for sorting
     5319                    if ( matchedCount > 0 ) {
     5320                        while ( i-- ) {
     5321                            if ( !(unmatched[i] || setMatched[i]) ) {
     5322                                setMatched[i] = pop.call( results );
     5323                            }
     5324                        }
     5325                    }
     5326
     5327                    // Discard index placeholder values to get only actual matches
     5328                    setMatched = condense( setMatched );
     5329                }
     5330
     5331                // Add matches to results
     5332                push.apply( results, setMatched );
     5333
     5334                // Seedless set matches succeeding multiple successful matchers stipulate sorting
     5335                if ( outermost && !seed && setMatched.length > 0 &&
     5336                    ( matchedCount + setMatchers.length ) > 1 ) {
     5337
     5338                    Sizzle.uniqueSort( results );
     5339                }
     5340            }
     5341
     5342            // Override manipulation of globals by nested matchers
     5343            if ( outermost ) {
     5344                dirruns = dirrunsUnique;
     5345                outermostContext = contextBackup;
     5346            }
     5347
     5348            return unmatched;
     5349        };
     5350
     5351    return bySet ?
     5352        markFunction( superMatcher ) :
     5353        superMatcher;
     5354}
     5355
     5356compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
     5357    var i,
     5358        setMatchers = [],
     5359        elementMatchers = [],
     5360        cached = compilerCache[ expando ][ selector + " " ];
     5361
     5362    if ( !cached ) {
     5363        // Generate a function of recursive functions that can be used to check each element
     5364        if ( !group ) {
     5365            group = tokenize( selector );
     5366        }
     5367        i = group.length;
     5368        while ( i-- ) {
     5369            cached = matcherFromTokens( group[i] );
     5370            if ( cached[ expando ] ) {
     5371                setMatchers.push( cached );
     5372            } else {
     5373                elementMatchers.push( cached );
     5374            }
     5375        }
     5376
     5377        // Cache the compiled function
     5378        cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
     5379    }
     5380    return cached;
     5381};
     5382
     5383function multipleContexts( selector, contexts, results ) {
     5384    var i = 0,
     5385        len = contexts.length;
     5386    for ( ; i < len; i++ ) {
     5387        Sizzle( selector, contexts[i], results );
     5388    }
     5389    return results;
     5390}
     5391
     5392function select( selector, context, results, seed ) {
     5393    var i, tokens, token, type, find,
     5394        match = tokenize( selector );
     5395
     5396    if ( !seed ) {
     5397        // Try to minimize operations if there is only one group
     5398        if ( match.length === 1 ) {
     5399
     5400            // Take a shortcut and set the context if the root selector is an ID
     5401            tokens = match[0] = match[0].slice( 0 );
     5402            if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
     5403                    context.nodeType === 9 && !documentIsXML &&
     5404                    Expr.relative[ tokens[1].type ] ) {
     5405
     5406                context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context )[0];
     5407                if ( !context ) {
     5408                    return results;
     5409                }
     5410
     5411                selector = selector.slice( tokens.shift().length );
     5412            }
     5413
     5414            // Fetch a seed set for right-to-left matching
     5415            for ( i = matchExpr["needsContext"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {
     5416                token = tokens[i];
     5417
     5418                // Abort if we hit a combinator
     5419                if ( Expr.relative[ (type = token.type) ] ) {
     5420                    break;
     5421                }
     5422                if ( (find = Expr.find[ type ]) ) {
     5423                    // Search, expanding context for leading sibling combinators
     5424                    if ( (seed = find(
     5425                        token.matches[0].replace( rbackslash, "" ),
     5426                        rsibling.test( tokens[0].type ) && context.parentNode || context
     5427                    )) ) {
     5428
     5429                        // If seed is empty or no tokens remain, we can return early
     5430                        tokens.splice( i, 1 );
     5431                        selector = seed.length && tokens.join("");
     5432                        if ( !selector ) {
     5433                            push.apply( results, slice.call( seed, 0 ) );
     5434                            return results;
     5435                        }
     5436
     5437                        break;
     5438                    }
     5439                }
     5440            }
     5441        }
     5442    }
     5443
     5444    // Compile and execute a filtering function
     5445    // Provide `match` to avoid retokenization if we modified the selector above
     5446    compile( selector, match )(
     5447        seed,
     5448        context,
     5449        documentIsXML,
     5450        results,
     5451        rsibling.test( selector )
     5452    );
     5453    return results;
     5454}
     5455
     5456// Deprecated
     5457Expr.pseudos["nth"] = Expr.pseudos["eq"];
     5458
     5459// Easy API for creating new setFilters
     5460function setFilters() {}
     5461Expr.filters = setFilters.prototype = Expr.pseudos;
     5462Expr.setFilters = new setFilters();
     5463
     5464// Initialize with the default document
     5465setDocument();
     5466
     5467// Override sizzle attribute retrieval
     5468Sizzle.attr = jQuery.attr;
     5469jQuery.find = Sizzle;
     5470jQuery.expr = Sizzle.selectors;
     5471jQuery.expr[":"] = jQuery.expr.pseudos;
     5472jQuery.unique = Sizzle.uniqueSort;
     5473jQuery.text = Sizzle.getText;
     5474jQuery.isXMLDoc = Sizzle.isXML;
     5475jQuery.contains = Sizzle.contains;
     5476
     5477
     5478})( window );
     5479var runtil = /Until$/,
     5480    rparentsprev = /^(?:parents|prev(?:Until|All))/,
     5481    isSimple = /^.[^:#\[\.,]*$/,
     5482    rneedsContext = jQuery.expr.match.needsContext,
     5483    // methods guaranteed to produce a unique set when starting from a unique set
     5484    guaranteedUnique = {
     5485        children: true,
     5486        contents: true,
     5487        next: true,
     5488        prev: true
     5489    };
     5490
     5491jQuery.fn.extend({
     5492    find: function( selector ) {
     5493        var i, ret, self;
     5494
     5495        if ( typeof selector !== "string" ) {
     5496            self = this;
     5497            return this.pushStack( jQuery( selector ).filter(function() {
     5498                for ( i = 0; i < self.length; i++ ) {
     5499                    if ( jQuery.contains( self[ i ], this ) ) {
     5500                        return true;
     5501                    }
     5502                }
     5503            }) );
     5504        }
     5505
     5506        ret = [];
     5507        for ( i = 0; i < this.length; i++ ) {
     5508            jQuery.find( selector, this[ i ], ret );
     5509        }
     5510
     5511        // Needed because $( selector, context ) becomes $( context ).find( selector )
     5512        ret = this.pushStack( jQuery.unique( ret ) );
     5513        ret.selector = ( this.selector ? this.selector + " " : "" ) + selector;
     5514        return ret;
     5515    },
     5516
     5517    has: function( target ) {
     5518        var i,
     5519            targets = jQuery( target, this ),
     5520            len = targets.length;
     5521
     5522        return this.filter(function() {
     5523            for ( i = 0; i < len; i++ ) {
     5524                if ( jQuery.contains( this, targets[i] ) ) {
     5525                    return true;
     5526                }
     5527            }
     5528        });
     5529    },
     5530
     5531    not: function( selector ) {
     5532        return this.pushStack( winnow(this, selector, false) );
     5533    },
     5534
     5535    filter: function( selector ) {
     5536        return this.pushStack( winnow(this, selector, true) );
     5537    },
     5538
     5539    is: function( selector ) {
     5540        return !!selector && (
     5541            typeof selector === "string" ?
     5542                // If this is a positional/relative selector, check membership in the returned set
     5543                // so $("p:first").is("p:last") won't return true for a doc with two "p".
     5544                rneedsContext.test( selector ) ?
     5545                    jQuery( selector, this.context ).index( this[0] ) >= 0 :
     5546                    jQuery.filter( selector, this ).length > 0 :
     5547                this.filter( selector ).length > 0 );
     5548    },
     5549
     5550    closest: function( selectors, context ) {
     5551        var cur,
     5552            i = 0,
     5553            l = this.length,
     5554            ret = [],
     5555            pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
     5556                jQuery( selectors, context || this.context ) :
     5557                0;
     5558
     5559        for ( ; i < l; i++ ) {
     5560            cur = this[i];
     5561
     5562            while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
     5563                if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
     5564                    ret.push( cur );
     5565                    break;
     5566                }
     5567                cur = cur.parentNode;
     5568            }
     5569        }
     5570
     5571        return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
     5572    },
     5573
     5574    // Determine the position of an element within
     5575    // the matched set of elements
     5576    index: function( elem ) {
     5577
     5578        // No argument, return index in parent
     5579        if ( !elem ) {
     5580            return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
     5581        }
     5582
     5583        // index in selector
     5584        if ( typeof elem === "string" ) {
     5585            return jQuery.inArray( this[0], jQuery( elem ) );
     5586        }
     5587
     5588        // Locate the position of the desired element
     5589        return jQuery.inArray(
     5590            // If it receives a jQuery object, the first element is used
     5591            elem.jquery ? elem[0] : elem, this );
     5592    },
     5593
     5594    add: function( selector, context ) {
     5595        var set = typeof selector === "string" ?
     5596                jQuery( selector, context ) :
     5597                jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
     5598            all = jQuery.merge( this.get(), set );
     5599
     5600        return this.pushStack( jQuery.unique(all) );
     5601    },
     5602
     5603    addBack: function( selector ) {
     5604        return this.add( selector == null ?
     5605            this.prevObject : this.prevObject.filter(selector)
     5606        );
     5607    }
     5608});
     5609
     5610jQuery.fn.andSelf = jQuery.fn.addBack;
     5611
     5612function sibling( cur, dir ) {
     5613    do {
     5614        cur = cur[ dir ];
     5615    } while ( cur && cur.nodeType !== 1 );
     5616
     5617    return cur;
     5618}
     5619
     5620jQuery.each({
     5621    parent: function( elem ) {
     5622        var parent = elem.parentNode;
     5623        return parent && parent.nodeType !== 11 ? parent : null;
     5624    },
     5625    parents: function( elem ) {
     5626        return jQuery.dir( elem, "parentNode" );
     5627    },
     5628    parentsUntil: function( elem, i, until ) {
     5629        return jQuery.dir( elem, "parentNode", until );
     5630    },
     5631    next: function( elem ) {
     5632        return sibling( elem, "nextSibling" );
     5633    },
     5634    prev: function( elem ) {
     5635        return sibling( elem, "previousSibling" );
     5636    },
     5637    nextAll: function( elem ) {
     5638        return jQuery.dir( elem, "nextSibling" );
     5639    },
     5640    prevAll: function( elem ) {
     5641        return jQuery.dir( elem, "previousSibling" );
     5642    },
     5643    nextUntil: function( elem, i, until ) {
     5644        return jQuery.dir( elem, "nextSibling", until );
     5645    },
     5646    prevUntil: function( elem, i, until ) {
     5647        return jQuery.dir( elem, "previousSibling", until );
     5648    },
     5649    siblings: function( elem ) {
     5650        return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
     5651    },
     5652    children: function( elem ) {
     5653        return jQuery.sibling( elem.firstChild );
     5654    },
     5655    contents: function( elem ) {
     5656        return jQuery.nodeName( elem, "iframe" ) ?
     5657            elem.contentDocument || elem.contentWindow.document :
     5658            jQuery.merge( [], elem.childNodes );
     5659    }
     5660}, function( name, fn ) {
     5661    jQuery.fn[ name ] = function( until, selector ) {
     5662        var ret = jQuery.map( this, fn, until );
     5663
     5664        if ( !runtil.test( name ) ) {
     5665            selector = until;
     5666        }
     5667
     5668        if ( selector && typeof selector === "string" ) {
     5669            ret = jQuery.filter( selector, ret );
     5670        }
     5671
     5672        ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
     5673
     5674        if ( this.length > 1 && rparentsprev.test( name ) ) {
     5675            ret = ret.reverse();
     5676        }
     5677
     5678        return this.pushStack( ret );
     5679    };
     5680});
     5681
     5682jQuery.extend({
     5683    filter: function( expr, elems, not ) {
     5684        if ( not ) {
     5685            expr = ":not(" + expr + ")";
     5686        }
     5687
     5688        return elems.length === 1 ?
     5689            jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
     5690            jQuery.find.matches(expr, elems);
     5691    },
     5692
     5693    dir: function( elem, dir, until ) {
     5694        var matched = [],
     5695            cur = elem[ dir ];
     5696
     5697        while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
     5698            if ( cur.nodeType === 1 ) {
     5699                matched.push( cur );
     5700            }
     5701            cur = cur[dir];
     5702        }
     5703        return matched;
     5704    },
     5705
     5706    sibling: function( n, elem ) {
     5707        var r = [];
     5708
     5709        for ( ; n; n = n.nextSibling ) {
     5710            if ( n.nodeType === 1 && n !== elem ) {
     5711                r.push( n );
     5712            }
     5713        }
     5714
     5715        return r;
     5716    }
     5717});
     5718
     5719// Implement the identical functionality for filter and not
     5720function winnow( elements, qualifier, keep ) {
     5721
     5722    // Can't pass null or undefined to indexOf in Firefox 4
     5723    // Set to 0 to skip string check
     5724    qualifier = qualifier || 0;
     5725
     5726    if ( jQuery.isFunction( qualifier ) ) {
     5727        return jQuery.grep(elements, function( elem, i ) {
     5728            var retVal = !!qualifier.call( elem, i, elem );
     5729            return retVal === keep;
     5730        });
     5731
     5732    } else if ( qualifier.nodeType ) {
     5733        return jQuery.grep(elements, function( elem ) {
     5734            return ( elem === qualifier ) === keep;
     5735        });
     5736
     5737    } else if ( typeof qualifier === "string" ) {
     5738        var filtered = jQuery.grep(elements, function( elem ) {
     5739            return elem.nodeType === 1;
     5740        });
     5741
     5742        if ( isSimple.test( qualifier ) ) {
     5743            return jQuery.filter(qualifier, filtered, !keep);
     5744        } else {
     5745            qualifier = jQuery.filter( qualifier, filtered );
     5746        }
     5747    }
     5748
     5749    return jQuery.grep(elements, function( elem ) {
     5750        return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
     5751    });
     5752}
     5753function createSafeFragment( document ) {
     5754    var list = nodeNames.split( "|" ),
     5755        safeFrag = document.createDocumentFragment();
     5756
     5757    if ( safeFrag.createElement ) {
     5758        while ( list.length ) {
     5759            safeFrag.createElement(
     5760                list.pop()
     5761            );
     5762        }
     5763    }
     5764    return safeFrag;
     5765}
     5766
     5767var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
     5768        "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
     5769    rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
     5770    rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
     5771    rleadingWhitespace = /^\s+/,
     5772    rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
     5773    rtagName = /<([\w:]+)/,
     5774    rtbody = /<tbody/i,
     5775    rhtml = /<|&#?\w+;/,
     5776    rnoInnerhtml = /<(?:script|style|link)/i,
     5777    manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
     5778    // checked="checked" or checked
     5779    rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
     5780    rscriptType = /^$|\/(?:java|ecma)script/i,
     5781    rscriptTypeMasked = /^true\/(.*)/,
     5782    rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
     5783    wrapMap = {
     5784        option: [ 1, "<select multiple='multiple'>" ],
     5785        legend: [ 1, "<fieldset>" ],
     5786        area: [ 1, "<map>" ],
     5787        param: [ 1, "<object>" ],
     5788        thead: [ 1, "<table>"  ],
     5789        tr: [ 2, "<table><tbody>" ],
     5790        col: [ 2, "<table><tbody></tbody><colgroup>", "</table>" ],
     5791        td: [ 3, "<table><tbody><tr>" ],
     5792
     5793        // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
     5794        // unless wrapped in a div with non-breaking characters in front of it.
     5795        _default: jQuery.support.htmlSerialize ? [ 0, "" ] : [ 1, "X<div>"  ]
     5796    },
     5797    safeFragment = createSafeFragment( document ),
     5798    fragmentDiv = safeFragment.appendChild( document.createElement("div") );
     5799
     5800wrapMap.optgroup = wrapMap.option;
     5801wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
     5802wrapMap.th = wrapMap.td;
     5803
     5804jQuery.fn.extend({
     5805    text: function( value ) {
     5806        return jQuery.access( this, function( value ) {
     5807            return value === undefined ?
     5808                jQuery.text( this ) :
     5809                this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
     5810        }, null, value, arguments.length );
     5811    },
     5812
     5813    wrapAll: function( html ) {
     5814        if ( jQuery.isFunction( html ) ) {
     5815            return this.each(function(i) {
     5816                jQuery(this).wrapAll( html.call(this, i) );
     5817            });
     5818        }
     5819
     5820        if ( this[0] ) {
     5821            // The elements to wrap the target around
     5822            var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
     5823
     5824            if ( this[0].parentNode ) {
     5825                wrap.insertBefore( this[0] );
     5826            }
     5827
     5828            wrap.map(function() {
     5829                var elem = this;
     5830
     5831                while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
     5832                    elem = elem.firstChild;
     5833                }
     5834
     5835                return elem;
     5836            }).append( this );
     5837        }
     5838
     5839        return this;
     5840    },
     5841
     5842    wrapInner: function( html ) {
     5843        if ( jQuery.isFunction( html ) ) {
     5844            return this.each(function(i) {
     5845                jQuery(this).wrapInner( html.call(this, i) );
     5846            });
     5847        }
     5848
     5849        return this.each(function() {
     5850            var self = jQuery( this ),
     5851                contents = self.contents();
     5852
     5853            if ( contents.length ) {
     5854                contents.wrapAll( html );
     5855
     5856            } else {
     5857                self.append( html );
     5858            }
     5859        });
     5860    },
     5861
     5862    wrap: function( html ) {
     5863        var isFunction = jQuery.isFunction( html );
     5864
     5865        return this.each(function(i) {
     5866            jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
     5867        });
     5868    },
     5869
     5870    unwrap: function() {
     5871        return this.parent().each(function() {
     5872            if ( !jQuery.nodeName( this, "body" ) ) {
     5873                jQuery( this ).replaceWith( this.childNodes );
     5874            }
     5875        }).end();
     5876    },
     5877
     5878    append: function() {
     5879        return this.domManip(arguments, true, function( elem ) {
     5880            if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
     5881                this.appendChild( elem );
     5882            }
     5883        });
     5884    },
     5885
     5886    prepend: function() {
     5887        return this.domManip(arguments, true, function( elem ) {
     5888            if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
     5889                this.insertBefore( elem, this.firstChild );
     5890            }
     5891        });
     5892    },
     5893
     5894    before: function() {
     5895        return this.domManip( arguments, false, function( elem ) {
     5896            if ( this.parentNode ) {
     5897                this.parentNode.insertBefore( elem, this );
     5898            }
     5899        });
     5900    },
     5901
     5902    after: function() {
     5903        return this.domManip( arguments, false, function( elem ) {
     5904            if ( this.parentNode ) {
     5905                this.parentNode.insertBefore( elem, this.nextSibling );
     5906            }
     5907        });
     5908    },
     5909
     5910    // keepData is for internal use only--do not document
     5911    remove: function( selector, keepData ) {
     5912        var elem,
     5913            i = 0;
     5914
     5915        for ( ; (elem = this[i]) != null; i++ ) {
     5916            if ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) {
     5917                if ( !keepData && elem.nodeType === 1 ) {
     5918                    jQuery.cleanData( getAll( elem ) );
     5919                }
     5920
     5921                if ( elem.parentNode ) {
     5922                    if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
     5923                        setGlobalEval( getAll( elem, "script" ) );
     5924                    }
     5925                    elem.parentNode.removeChild( elem );
     5926                }
     5927            }
     5928        }
     5929
     5930        return this;
     5931    },
     5932
     5933    empty: function() {
     5934        var elem,
     5935            i = 0;
     5936
     5937        for ( ; (elem = this[i]) != null; i++ ) {
     5938            // Remove element nodes and prevent memory leaks
     5939            if ( elem.nodeType === 1 ) {
     5940                jQuery.cleanData( getAll( elem, false ) );
     5941            }
     5942
     5943            // Remove any remaining nodes
     5944            while ( elem.firstChild ) {
     5945                elem.removeChild( elem.firstChild );
     5946            }
     5947        }
     5948
     5949        return this;
     5950    },
     5951
     5952    clone: function( dataAndEvents, deepDataAndEvents ) {
     5953        dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
     5954        deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
     5955
     5956        return this.map( function () {
     5957            return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
     5958        });
     5959    },
     5960
     5961    html: function( value ) {
     5962        return jQuery.access( this, function( value ) {
     5963            var elem = this[0] || {},
     5964                i = 0,
     5965                l = this.length;
     5966
     5967            if ( value === undefined ) {
     5968                return elem.nodeType === 1 ?
     5969                    elem.innerHTML.replace( rinlinejQuery, "" ) :
     5970                    undefined;
     5971            }
     5972
     5973            // See if we can take a shortcut and just use innerHTML
     5974            if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
     5975                ( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
     5976                ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
     5977                !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
     5978
     5979                value = value.replace( rxhtmlTag, "<$1></$2>" );
     5980
     5981                try {
     5982                    for (; i < l; i++ ) {
     5983                        // Remove element nodes and prevent memory leaks
     5984                        elem = this[i] || {};
     5985                        if ( elem.nodeType === 1 ) {
     5986                            jQuery.cleanData( getAll( elem, false ) );
     5987                            elem.innerHTML = value;
     5988                        }
     5989                    }
     5990
     5991                    elem = 0;
     5992
     5993                // If using innerHTML throws an exception, use the fallback method
     5994                } catch(e) {}
     5995            }
     5996
     5997            if ( elem ) {
     5998                this.empty().append( value );
     5999            }
     6000        }, null, value, arguments.length );
     6001    },
     6002
     6003    replaceWith: function( value ) {
     6004        var isFunc = jQuery.isFunction( value );
     6005
     6006        // Make sure that the elements are removed from the DOM before they are inserted
     6007        // this can help fix replacing a parent with child elements
     6008        if ( !isFunc && typeof value !== "string" ) {
     6009            value = jQuery( value ).not( this ).detach();
     6010        }
     6011
     6012        return this.domManip( [ value ], true, function( elem ) {
     6013            var next = this.nextSibling,
     6014                parent = this.parentNode;
     6015
     6016            if ( parent && this.nodeType === 1 || this.nodeType === 11 ) {
     6017
     6018                jQuery( this ).remove();
     6019
     6020                if ( next ) {
     6021                    next.parentNode.insertBefore( elem, next );
     6022                } else {
     6023                    parent.appendChild( elem );
     6024                }
     6025            }
     6026        });
     6027    },
     6028
     6029    detach: function( selector ) {
     6030        return this.remove( selector, true );
     6031    },
     6032
     6033    domManip: function( args, table, callback ) {
     6034
     6035        // Flatten any nested arrays
     6036        args = core_concat.apply( [], args );
     6037
     6038        var fragment, first, scripts, hasScripts, node, doc,
     6039            i = 0,
     6040            l = this.length,
     6041            iNoClone = l - 1,
     6042            value = args[0],
     6043            isFunction = jQuery.isFunction( value );
     6044
     6045        // We can't cloneNode fragments that contain checked, in WebKit
     6046        if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
     6047            return this.each(function() {
     6048                var self = jQuery( this );
     6049                if ( isFunction ) {
     6050                    args[0] = value.call( this, i, table ? self.html() : undefined );
     6051                }
     6052                self.domManip( args, table, callback );
     6053            });
     6054        }
     6055
     6056        if ( this[0] ) {
     6057            doc = this[0].ownerDocument;
     6058            fragment = doc.createDocumentFragment();
     6059            jQuery.clean( args, doc, fragment, undefined, this );
     6060            first = fragment.firstChild;
     6061
     6062            if ( fragment.childNodes.length === 1 ) {
     6063                fragment = first;
     6064            }
     6065
     6066            if ( first ) {
     6067                table = table && jQuery.nodeName( first, "tr" );
     6068                scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
     6069                hasScripts = scripts.length;
     6070
     6071                // Use the original fragment for the last item instead of the first because it can end up
     6072                // being emptied incorrectly in certain situations (#8070).
     6073                for ( ; i < l; i++ ) {
     6074                    node = fragment;
     6075
     6076                    if ( i !== iNoClone ) {
     6077                        node = jQuery.clone( node, true, true );
     6078
     6079                        // Keep references to cloned scripts for later restoration
     6080                        if ( hasScripts ) {
     6081                            jQuery.merge( scripts, getAll( node, "script" ) );
     6082                        }
     6083                    }
     6084
     6085                    callback.call(
     6086                        table && jQuery.nodeName( this[i], "table" ) ?
     6087                            findOrAppend( this[i], "tbody" ) :
     6088                            this[i],
     6089                        node,
     6090                        i
     6091                    );
     6092                }
     6093
     6094                if ( hasScripts ) {
     6095                    doc = scripts[ scripts.length - 1 ].ownerDocument;
     6096
     6097                    // Reenable scripts
     6098                    jQuery.map( scripts, restoreScript );
     6099
     6100                    // Evaluate executable scripts on first document insertion
     6101                    for ( i = 0; i < hasScripts; i++ ) {
     6102                        node = scripts[ i ];
     6103                        if ( rscriptType.test( node.type || "" ) &&
     6104                            !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
     6105
     6106                            if ( node.src ) {
     6107                                // Hope ajax is available...
     6108                                jQuery.ajax({
     6109                                    url: node.src,
     6110                                    type: "GET",
     6111                                    dataType: "script",
     6112                                    async: false,
     6113                                    global: false,
     6114                                    "throws": true
     6115                                });
     6116                            } else {
     6117                                jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
     6118                            }
     6119                        }
     6120                    }
     6121                }
     6122
     6123                // Fix #11809: Avoid leaking memory
     6124                fragment = first = null;
     6125            }
     6126        }
     6127
     6128        return this;
     6129    }
     6130});
     6131
     6132function findOrAppend( elem, tag ) {
     6133    return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
     6134}
     6135
     6136// Replace/restore the type attribute of script elements for safe DOM manipulation
     6137function disableScript( elem ) {
     6138    var attr = elem.getAttributeNode("type");
     6139    elem.type = ( attr && attr.specified ) + "/" + elem.type;
     6140    return elem;
     6141}
     6142function restoreScript( elem ) {
     6143    var match = rscriptTypeMasked.exec( elem.type );
     6144    if ( match ) {
     6145        elem.type = match[1];
     6146    } else {
     6147        elem.removeAttribute("type");
     6148    }
     6149    return elem;
     6150}
     6151
     6152// Mark scripts as having already been evaluated
     6153function setGlobalEval( elems, refElements ) {
     6154    var elem,
     6155        i = 0;
     6156    for ( ; (elem = elems[i]) != null; i++ ) {
     6157        jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
     6158    }
     6159}
     6160
     6161function cloneCopyEvent( src, dest ) {
     6162
     6163    if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
     6164        return;
     6165    }
     6166
     6167    var type, i, l,
     6168        oldData = jQuery._data( src ),
     6169        curData = jQuery._data( dest, oldData ),
     6170        events = oldData.events;
     6171
     6172    if ( events ) {
     6173        delete curData.handle;
     6174        curData.events = {};
     6175
     6176        for ( type in events ) {
     6177            for ( i = 0, l = events[ type ].length; i < l; i++ ) {
     6178                jQuery.event.add( dest, type, events[ type ][ i ] );
     6179            }
     6180        }
     6181    }
     6182
     6183    // make the cloned public data object a copy from the original
     6184    if ( curData.data ) {
     6185        curData.data = jQuery.extend( {}, curData.data );
     6186    }
     6187}
     6188
     6189function fixCloneNodeIssues( src, dest ) {
     6190    var nodeName, data, e;
     6191
     6192    // We do not need to do anything for non-Elements
     6193    if ( dest.nodeType !== 1 ) {
     6194        return;
     6195    }
     6196
     6197    nodeName = dest.nodeName.toLowerCase();
     6198
     6199    // IE6-8 copies events bound via attachEvent when using cloneNode.
     6200    if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
     6201        data = jQuery._data( dest );
     6202
     6203        for ( e in data.events ) {
     6204            jQuery.removeEvent( dest, e, data.handle );
     6205        }
     6206
     6207        // Event data gets referenced instead of copied if the expando gets copied too
     6208        dest.removeAttribute( jQuery.expando );
     6209    }
     6210
     6211    // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
     6212    if ( nodeName === "script" && dest.text !== src.text ) {
     6213        disableScript( dest ).text = src.text;
     6214        restoreScript( dest );
     6215
     6216    // IE6-10 improperly clones children of object elements using classid.
     6217    // IE10 throws NoModificationAllowedError if parent is null, #12132.
     6218    } else if ( nodeName === "object" ) {
     6219        if ( dest.parentNode ) {
     6220            dest.outerHTML = src.outerHTML;
     6221        }
     6222
     6223        // This path appears unavoidable for IE9. When cloning an object
     6224        // element in IE9, the outerHTML strategy above is not sufficient.
     6225        // If the src has innerHTML and the destination does not,
     6226        // copy the src.innerHTML into the dest.innerHTML. #10324
     6227        if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
     6228            dest.innerHTML = src.innerHTML;
     6229        }
     6230
     6231    } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
     6232        // IE6-8 fails to persist the checked state of a cloned checkbox
     6233        // or radio button. Worse, IE6-7 fail to give the cloned element
     6234        // a checked appearance if the defaultChecked value isn't also set
     6235
     6236        dest.defaultChecked = dest.checked = src.checked;
     6237
     6238        // IE6-7 get confused and end up setting the value of a cloned
     6239        // checkbox/radio button to an empty string instead of "on"
     6240        if ( dest.value !== src.value ) {
     6241            dest.value = src.value;
     6242        }
     6243
     6244    // IE6-8 fails to return the selected option to the default selected
     6245    // state when cloning options
     6246    } else if ( nodeName === "option" ) {
     6247        dest.defaultSelected = dest.selected = src.defaultSelected;
     6248
     6249    // IE6-8 fails to set the defaultValue to the correct value when
     6250    // cloning other types of input fields
     6251    } else if ( nodeName === "input" || nodeName === "textarea" ) {
     6252        dest.defaultValue = src.defaultValue;
     6253    }
     6254}
     6255
     6256jQuery.each({
     6257    appendTo: "append",
     6258    prependTo: "prepend",
     6259    insertBefore: "before",
     6260    insertAfter: "after",
     6261    replaceAll: "replaceWith"
     6262}, function( name, original ) {
     6263    jQuery.fn[ name ] = function( selector ) {
     6264        var elems,
     6265            i = 0,
     6266            ret = [],
     6267            insert = jQuery( selector ),
     6268            last = insert.length - 1;
     6269
     6270        for ( ; i <= last; i++ ) {
     6271            elems = i === last ? this : this.clone(true);
     6272            jQuery( insert[i] )[ original ]( elems );
     6273
     6274            // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
     6275            core_push.apply( ret, elems.get() );
     6276        }
     6277
     6278        return this.pushStack( ret );
     6279    };
     6280});
     6281
     6282function getAll( context, tag ) {
     6283    var elems, elem,
     6284        i = 0,
     6285        found = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName( tag || "*" ) :
     6286            typeof context.querySelectorAll !== "undefined" ? context.querySelectorAll( tag || "*" ) :
     6287            undefined;
     6288
     6289    if ( !found ) {
     6290        for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
     6291            if ( !tag || jQuery.nodeName( elem, tag ) ) {
     6292                found.push( elem );
     6293            } else {
     6294                jQuery.merge( found, getAll( elem, tag ) );
     6295            }
     6296        }
     6297    }
     6298
     6299    return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
     6300        jQuery.merge( [ context ], found ) :
     6301        found;
     6302}
     6303
     6304// Used in clean, fixes the defaultChecked property
     6305function fixDefaultChecked( elem ) {
     6306    if ( manipulation_rcheckableType.test( elem.type ) ) {
     6307        elem.defaultChecked = elem.checked;
     6308    }
     6309}
     6310
     6311jQuery.extend({
     6312    clone: function( elem, dataAndEvents, deepDataAndEvents ) {
     6313        var destElements, srcElements, node, i, clone,
     6314            inPage = jQuery.contains( elem.ownerDocument, elem );
     6315
     6316        if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
     6317            clone = elem.cloneNode( true );
     6318
     6319        // IE<=8 does not properly clone detached, unknown element nodes
     6320        } else {
     6321            fragmentDiv.innerHTML = elem.outerHTML;
     6322            fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
     6323        }
     6324
     6325        if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
     6326                (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
     6327
     6328            // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
     6329            destElements = getAll( clone );
     6330            srcElements = getAll( elem );
     6331
     6332            // Fix all IE cloning issues
     6333            for ( i = 0; (node = srcElements[i]) != null; ++i ) {
     6334                // Ensure that the destination node is not null; Fixes #9587
     6335                if ( destElements[i] ) {
     6336                    fixCloneNodeIssues( node, destElements[i] );
     6337                }
     6338            }
     6339        }
     6340
     6341        // Copy the events from the original to the clone
     6342        if ( dataAndEvents ) {
     6343            if ( deepDataAndEvents ) {
     6344                srcElements = srcElements || getAll( elem );
     6345                destElements = destElements || getAll( clone );
     6346
     6347                for ( i = 0; (node = srcElements[i]) != null; i++ ) {
     6348                    cloneCopyEvent( node, destElements[i] );
     6349                }
     6350            } else {
     6351                cloneCopyEvent( elem, clone );
     6352            }
     6353        }
     6354
     6355        // Preserve script evaluation history
     6356        destElements = getAll( clone, "script" );
     6357        if ( destElements.length > 0 ) {
     6358            setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
     6359        }
     6360
     6361        destElements = srcElements = node = null;
     6362
     6363        // Return the cloned set
     6364        return clone;
     6365    },
     6366
     6367    clean: function( elems, context, fragment, scripts, selection ) {
     6368        var elem, i, j, tmp, tag, wrap, tbody,
     6369            ret = [],
     6370            safe = context === document && safeFragment;
     6371
     6372        // Ensure that context is a document
     6373        if ( !context || typeof context.createDocumentFragment === "undefined" ) {
     6374            context = document;
     6375        }
     6376
     6377        for ( i = 0; (elem = elems[i]) != null; i++ ) {
     6378            if ( elem || elem === 0 ) {
     6379                // Add nodes directly
     6380                if ( jQuery.type( elem ) === "object" ) {
     6381                    jQuery.merge( ret, elem.nodeType ? [ elem ] : elem );
     6382
     6383                // Convert non-html into a text node
     6384                } else if ( !rhtml.test( elem ) ) {
     6385                    ret.push( context.createTextNode( elem ) );
     6386
     6387                // Convert html into DOM nodes
     6388                } else {
     6389                    // Ensure a safe container
     6390                    safe = safe || createSafeFragment( context );
     6391                    tmp = tmp || safe.appendChild( context.createElement("div") );
     6392
     6393                    // Deserialize a standard representation
     6394                    tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
     6395                    wrap = wrapMap[ tag ] || wrapMap._default;
     6396                    tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + ( wrap[2] || "" );
     6397
     6398                    // Descend through wrappers to the right content
     6399                    j = wrap[0];
     6400                    while ( j-- ) {
     6401                        tmp = tmp.lastChild;
     6402                    }
     6403
     6404                    // Manually add leading whitespace removed by IE
     6405                    if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
     6406                        ret.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
     6407                    }
     6408
     6409                    // Remove IE's autoinserted <tbody> from table fragments
     6410                    if ( !jQuery.support.tbody ) {
     6411
     6412                        // String was a <table>, *may* have spurious <tbody>
     6413                        elem = tag === "table" && !rtbody.test( elem ) ?
     6414                            tmp.firstChild :
     6415
     6416                            // String was a bare <thead> or <tfoot>
     6417                            wrap[1] === "<table>" && !rtbody.test( elem ) ?
     6418                                tmp :
     6419                                0;
     6420
     6421                        j = elem && elem.childNodes.length;
     6422                        while ( j-- ) {
     6423                            if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
     6424                                elem.removeChild( tbody );
     6425                            }
     6426                        }
     6427                    }
     6428
     6429                    jQuery.merge( ret, tmp.childNodes );
     6430
     6431                    // Fix #12392 for WebKit and IE > 9
     6432                    tmp.textContent = "";
     6433
     6434                    // Fix #12392 for oldIE
     6435                    while ( tmp.firstChild ) {
     6436                        tmp.removeChild( tmp.firstChild );
     6437                    }
     6438
     6439                    // Remember the top-level container for proper cleanup
     6440                    tmp = safe.lastChild;
     6441                }
     6442            }
     6443        }
     6444
     6445        // Fix #11356: Clear elements from safeFragment
     6446        if ( tmp ) {
     6447            safe.removeChild( tmp );
     6448        }
     6449
     6450        // Reset defaultChecked for any radios and checkboxes
     6451        // about to be appended to the DOM in IE 6/7 (#8060)
     6452        if ( !jQuery.support.appendChecked ) {
     6453            jQuery.grep( getAll( ret, "input" ), fixDefaultChecked );
     6454        }
     6455
     6456        if ( fragment ) {
     6457            for ( i = 0; (elem = ret[i]) != null; i++ ) {
     6458                safe = jQuery.contains( elem.ownerDocument, elem );
     6459
     6460                // Append to fragment
     6461                // #4087 - If origin and destination elements are the same, and this is
     6462                // that element, do not append to fragment
     6463                if ( !selection || jQuery.inArray( elem, selection ) === -1 ) {
     6464                    fragment.appendChild( elem );
     6465                }
     6466                tmp = getAll( elem, "script" );
     6467
     6468                // Preserve script evaluation history
     6469                if ( safe ) {
     6470                    setGlobalEval( tmp );
     6471                }
     6472
     6473                // Capture executables
     6474                if ( scripts ) {
     6475                    for ( j = 0; (elem = tmp[j]) != null; j++ ) {
     6476                        if ( rscriptType.test( elem.type || "" ) ) {
     6477                            scripts.push( elem );
     6478                        }
     6479                    }
     6480                }
     6481            }
     6482        }
     6483
     6484        elem = tmp = safe = null;
     6485
     6486        return ret;
     6487    },
     6488
     6489    cleanData: function( elems, /* internal */ acceptData ) {
     6490        var data, id, elem, type,
     6491            i = 0,
     6492            internalKey = jQuery.expando,
     6493            cache = jQuery.cache,
     6494            deleteExpando = jQuery.support.deleteExpando,
     6495            special = jQuery.event.special;
     6496
     6497        for ( ; (elem = elems[i]) != null; i++ ) {
     6498
     6499            if ( acceptData || jQuery.acceptData( elem ) ) {
     6500
     6501                id = elem[ internalKey ];
     6502                data = id && cache[ id ];
     6503
     6504                if ( data ) {
     6505                    if ( data.events ) {
     6506                        for ( type in data.events ) {
     6507                            if ( special[ type ] ) {
     6508                                jQuery.event.remove( elem, type );
     6509
     6510                            // This is a shortcut to avoid jQuery.event.remove's overhead
     6511                            } else {
     6512                                jQuery.removeEvent( elem, type, data.handle );
     6513                            }
     6514                        }
     6515                    }
     6516
     6517                    // Remove cache only if it was not already removed by jQuery.event.remove
     6518                    if ( cache[ id ] ) {
     6519
     6520                        delete cache[ id ];
     6521
     6522                        // IE does not allow us to delete expando properties from nodes,
     6523                        // nor does it have a removeAttribute function on Document nodes;
     6524                        // we must handle all of these cases
     6525                        if ( deleteExpando ) {
     6526                            delete elem[ internalKey ];
     6527
     6528                        } else if ( elem.removeAttribute ) {
     6529                            elem.removeAttribute( internalKey );
     6530
     6531                        } else {
     6532                            elem[ internalKey ] = null;
     6533                        }
     6534
     6535                        core_deletedIds.push( id );
     6536                    }
     6537                }
     6538            }
     6539        }
     6540    }
     6541});
     6542var curCSS, getStyles, iframe,
     6543    ralpha = /alpha\([^)]*\)/i,
     6544    ropacity = /opacity\s*=\s*([^)]*)/,
     6545    rposition = /^(top|right|bottom|left)$/,
     6546    // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
     6547    // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
     6548    rdisplayswap = /^(none|table(?!-c[ea]).+)/,
     6549    rmargin = /^margin/,
     6550    rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
     6551    rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
     6552    rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
     6553    elemdisplay = { BODY: "block" },
     6554
     6555    cssShow = { position: "absolute", visibility: "hidden", display: "block" },
     6556    cssNormalTransform = {
     6557        letterSpacing: 0,
     6558        fontWeight: 400
     6559    },
     6560
     6561    cssExpand = [ "Top", "Right", "Bottom", "Left" ],
     6562    cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
     6563
     6564// return a css property mapped to a potentially vendor prefixed property
     6565function vendorPropName( style, name ) {
     6566
     6567    // shortcut for names that are not vendor prefixed
     6568    if ( name in style ) {
     6569        return name;
     6570    }
     6571
     6572    // check for vendor prefixed names
     6573    var capName = name.charAt(0).toUpperCase() + name.slice(1),
     6574        origName = name,
     6575        i = cssPrefixes.length;
     6576
     6577    while ( i-- ) {
     6578        name = cssPrefixes[ i ] + capName;
     6579        if ( name in style ) {
     6580            return name;
     6581        }
     6582    }
     6583
     6584    return origName;
     6585}
     6586
     6587function isHidden( elem, el ) {
     6588    // isHidden might be called from jQuery#filter function;
     6589    // in that case, element will be second argument
     6590    elem = el || elem;
     6591    return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
     6592}
     6593
     6594function showHide( elements, show ) {
     6595    var elem,
     6596        values = [],
     6597        index = 0,
     6598        length = elements.length;
     6599
     6600    for ( ; index < length; index++ ) {
     6601        elem = elements[ index ];
     6602        if ( !elem.style ) {
     6603            continue;
     6604        }
     6605        values[ index ] = jQuery._data( elem, "olddisplay" );
     6606        if ( show ) {
     6607            // Reset the inline display of this element to learn if it is
     6608            // being hidden by cascaded rules or not
     6609            if ( !values[ index ] && elem.style.display === "none" ) {
     6610                elem.style.display = "";
     6611            }
     6612
     6613            // Set elements which have been overridden with display: none
     6614            // in a stylesheet to whatever the default browser style is
     6615            // for such an element
     6616            if ( elem.style.display === "" && isHidden( elem ) ) {
     6617                values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
     6618            }
     6619        } else if ( !values[ index ] && !isHidden( elem ) ) {
     6620            jQuery._data( elem, "olddisplay", jQuery.css( elem, "display" ) );
     6621        }
     6622    }
     6623
     6624    // Set the display of most of the elements in a second loop
     6625    // to avoid the constant reflow
     6626    for ( index = 0; index < length; index++ ) {
     6627        elem = elements[ index ];
     6628        if ( !elem.style ) {
     6629            continue;
     6630        }
     6631        if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
     6632            elem.style.display = show ? values[ index ] || "" : "none";
     6633        }
     6634    }
     6635
     6636    return elements;
     6637}
     6638
     6639jQuery.fn.extend({
     6640    css: function( name, value ) {
     6641        return jQuery.access( this, function( elem, name, value ) {
     6642            var styles, len,
     6643                map = {},
     6644                i = 0;
     6645
     6646            if ( jQuery.isArray( name ) ) {
     6647                styles = getStyles( elem );
     6648                len = name.length;
     6649
     6650                for ( ; i < len; i++ ) {
     6651                    map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
     6652                }
     6653
     6654                return map;
     6655            }
     6656
     6657            return value !== undefined ?
     6658                jQuery.style( elem, name, value ) :
     6659                jQuery.css( elem, name );
     6660        }, name, value, arguments.length > 1 );
     6661    },
     6662    show: function() {
     6663        return showHide( this, true );
     6664    },
     6665    hide: function() {
     6666        return showHide( this );
     6667    },
     6668    toggle: function( state ) {
     6669        var bool = typeof state === "boolean";
     6670
     6671        return this.each(function() {
     6672            if ( bool ? state : isHidden( this ) ) {
     6673                jQuery( this ).show();
     6674            } else {
     6675                jQuery( this ).hide();
     6676            }
     6677        });
     6678    }
     6679});
     6680
     6681jQuery.extend({
     6682    // Add in style property hooks for overriding the default
     6683    // behavior of getting and setting a style property
     6684    cssHooks: {
     6685        opacity: {
     6686            get: function( elem, computed ) {
     6687                if ( computed ) {
     6688                    // We should always get a number back from opacity
     6689                    var ret = curCSS( elem, "opacity" );
     6690                    return ret === "" ? "1" : ret;
     6691                }
     6692            }
     6693        }
     6694    },
     6695
     6696    // Exclude the following css properties to add px
     6697    cssNumber: {
     6698        "columnCount": true,
     6699        "fillOpacity": true,
     6700        "fontWeight": true,
     6701        "lineHeight": true,
     6702        "opacity": true,
     6703        "orphans": true,
     6704        "widows": true,
     6705        "zIndex": true,
     6706        "zoom": true
     6707    },
     6708
     6709    // Add in properties whose names you wish to fix before
     6710    // setting or getting the value
     6711    cssProps: {
     6712        // normalize float css property
     6713        "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
     6714    },
     6715
     6716    // Get and set the style property on a DOM Node
     6717    style: function( elem, name, value, extra ) {
     6718        // Don't set styles on text and comment nodes
     6719        if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
     6720            return;
     6721        }
     6722
     6723        // Make sure that we're working with the right name
     6724        var ret, type, hooks,
     6725            origName = jQuery.camelCase( name ),
     6726            style = elem.style;
     6727
     6728        name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
     6729
     6730        // gets hook for the prefixed version
     6731        // followed by the unprefixed version
     6732        hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
     6733
     6734        // Check if we're setting a value
     6735        if ( value !== undefined ) {
     6736            type = typeof value;
     6737
     6738            // convert relative number strings (+= or -=) to relative numbers. #7345
     6739            if ( type === "string" && (ret = rrelNum.exec( value )) ) {
     6740                value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
     6741                // Fixes bug #9237
     6742                type = "number";
     6743            }
     6744
     6745            // Make sure that NaN and null values aren't set. See: #7116
     6746            if ( value == null || type === "number" && isNaN( value ) ) {
     6747                return;
     6748            }
     6749
     6750            // If a number was passed in, add 'px' to the (except for certain CSS properties)
     6751            if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
     6752                value += "px";
     6753            }
     6754
     6755            // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
     6756            // but it would mean to define eight (for every problematic property) identical functions
     6757            if ( value === "" && name.indexOf("background") === 0 ) {
     6758                value = " ";
     6759            }
     6760
     6761            // If a hook was provided, use that value, otherwise just set the specified value
     6762            if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
     6763
     6764                // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
     6765                // Fixes bug #5509
     6766                try {
     6767                    style[ name ] = value;
     6768                } catch(e) {}
     6769            }
     6770
     6771        } else {
     6772            // If a hook was provided get the non-computed value from there
     6773            if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
     6774                return ret;
     6775            }
     6776
     6777            // Otherwise just get the value from the style object
     6778            return style[ name ];
     6779        }
     6780    },
     6781
     6782    css: function( elem, name, extra, styles ) {
     6783        var val, num, hooks,
     6784            origName = jQuery.camelCase( name );
     6785
     6786        // Make sure that we're working with the right name
     6787        name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
     6788
     6789        // gets hook for the prefixed version
     6790        // followed by the unprefixed version
     6791        hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
     6792
     6793        // If a hook was provided get the computed value from there
     6794        if ( hooks && "get" in hooks ) {
     6795            val = hooks.get( elem, true, extra );
     6796        }
     6797
     6798        // Otherwise, if a way to get the computed value exists, use that
     6799        if ( val === undefined ) {
     6800            val = curCSS( elem, name, styles );
     6801        }
     6802
     6803        //convert "normal" to computed value
     6804        if ( val === "normal" && name in cssNormalTransform ) {
     6805            val = cssNormalTransform[ name ];
     6806        }
     6807
     6808        // Return, converting to number if forced or a qualifier was provided and val looks numeric
     6809        if ( extra ) {
     6810            num = parseFloat( val );
     6811            return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
     6812        }
     6813        return val;
     6814    },
     6815
     6816    // A method for quickly swapping in/out CSS properties to get correct calculations
     6817    swap: function( elem, options, callback, args ) {
     6818        var ret, name,
     6819            old = {};
     6820
     6821        // Remember the old values, and insert the new ones
     6822        for ( name in options ) {
     6823            old[ name ] = elem.style[ name ];
     6824            elem.style[ name ] = options[ name ];
     6825        }
     6826
     6827        ret = callback.apply( elem, args || [] );
     6828
     6829        // Revert the old values
     6830        for ( name in options ) {
     6831            elem.style[ name ] = old[ name ];
     6832        }
     6833
     6834        return ret;
     6835    }
     6836});
     6837
     6838// NOTE: we've included the "window" in window.getComputedStyle
     6839// because jsdom on node.js will break without it.
     6840if ( window.getComputedStyle ) {
     6841    getStyles = function( elem ) {
     6842        return window.getComputedStyle( elem, null );
     6843    };
     6844
     6845    curCSS = function( elem, name, _computed ) {
     6846        var width, minWidth, maxWidth,
     6847            computed = _computed || getStyles( elem ),
     6848
     6849            // getPropertyValue is only needed for .css('filter') in IE9, see #12537
     6850            ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
     6851            style = elem.style;
     6852
     6853        if ( computed ) {
     6854
     6855            if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
     6856                ret = jQuery.style( elem, name );
     6857            }
     6858
     6859            // A tribute to the "awesome hack by Dean Edwards"
     6860            // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
     6861            // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
     6862            // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
     6863            if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
     6864
     6865                // Remember the original values
     6866                width = style.width;
     6867                minWidth = style.minWidth;
     6868                maxWidth = style.maxWidth;
     6869
     6870                // Put in the new values to get a computed value out
     6871                style.minWidth = style.maxWidth = style.width = ret;
     6872                ret = computed.width;
     6873
     6874                // Revert the changed values
     6875                style.width = width;
     6876                style.minWidth = minWidth;
     6877                style.maxWidth = maxWidth;
     6878            }
     6879        }
     6880
     6881        return ret;
     6882    };
     6883} else if ( document.documentElement.currentStyle ) {
     6884    getStyles = function( elem ) {
     6885        return elem.currentStyle;
     6886    };
     6887
     6888    curCSS = function( elem, name, _computed ) {
     6889        var left, rs, rsLeft,
     6890            computed = _computed || getStyles( elem ),
     6891            ret = computed ? computed[ name ] : undefined,
     6892            style = elem.style;
     6893
     6894        // Avoid setting ret to empty string here
     6895        // so we don't default to auto
     6896        if ( ret == null && style && style[ name ] ) {
     6897            ret = style[ name ];
     6898        }
     6899
     6900        // From the awesome hack by Dean Edwards
     6901        // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
     6902
     6903        // If we're not dealing with a regular pixel number
     6904        // but a number that has a weird ending, we need to convert it to pixels
     6905        // but not position css attributes, as those are proportional to the parent element instead
     6906        // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
     6907        if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
     6908
     6909            // Remember the original values
     6910            left = style.left;
     6911            rs = elem.runtimeStyle;
     6912            rsLeft = rs && rs.left;
     6913
     6914            // Put in the new values to get a computed value out
     6915            if ( rsLeft ) {
     6916                rs.left = elem.currentStyle.left;
     6917            }
     6918            style.left = name === "fontSize" ? "1em" : ret;
     6919            ret = style.pixelLeft + "px";
     6920
     6921            // Revert the changed values
     6922            style.left = left;
     6923            if ( rsLeft ) {
     6924                rs.left = rsLeft;
     6925            }
     6926        }
     6927
     6928        return ret === "" ? "auto" : ret;
     6929    };
     6930}
     6931
     6932function setPositiveNumber( elem, value, subtract ) {
     6933    var matches = rnumsplit.exec( value );
     6934    return matches ?
     6935        // Guard against undefined "subtract", e.g., when used as in cssHooks
     6936        Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
     6937        value;
     6938}
     6939
     6940function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
     6941    var i = extra === ( isBorderBox ? "border" : "content" ) ?
     6942        // If we already have the right measurement, avoid augmentation
     6943        4 :
     6944        // Otherwise initialize for horizontal or vertical properties
     6945        name === "width" ? 1 : 0,
     6946
     6947        val = 0;
     6948
     6949    for ( ; i < 4; i += 2 ) {
     6950        // both box models exclude margin, so add it if we want it
     6951        if ( extra === "margin" ) {
     6952            val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
     6953        }
     6954
     6955        if ( isBorderBox ) {
     6956            // border-box includes padding, so remove it if we want content
     6957            if ( extra === "content" ) {
     6958                val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
     6959            }
     6960
     6961            // at this point, extra isn't border nor margin, so remove border
     6962            if ( extra !== "margin" ) {
     6963                val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
     6964            }
     6965        } else {
     6966            // at this point, extra isn't content, so add padding
     6967            val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
     6968
     6969            // at this point, extra isn't content nor padding, so add border
     6970            if ( extra !== "padding" ) {
     6971                val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
     6972            }
     6973        }
     6974    }
     6975
     6976    return val;
     6977}
     6978
     6979function getWidthOrHeight( elem, name, extra ) {
     6980
     6981    // Start with offset property, which is equivalent to the border-box value
     6982    var valueIsBorderBox = true,
     6983        val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
     6984        styles = getStyles( elem ),
     6985        isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
     6986
     6987    // some non-html elements return undefined for offsetWidth, so check for null/undefined
     6988    // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
     6989    // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
     6990    if ( val <= 0 || val == null ) {
     6991        // Fall back to computed then uncomputed css if necessary
     6992        val = curCSS( elem, name, styles );
     6993        if ( val < 0 || val == null ) {
     6994            val = elem.style[ name ];
     6995        }
     6996
     6997        // Computed unit is not pixels. Stop here and return.
     6998        if ( rnumnonpx.test(val) ) {
     6999            return val;
     7000        }
     7001
     7002        // we need the check for style in case a browser which returns unreliable values
     7003        // for getComputedStyle silently falls back to the reliable elem.style
     7004        valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
     7005
     7006        // Normalize "", auto, and prepare for extra
     7007        val = parseFloat( val ) || 0;
     7008    }
     7009
     7010    // use the active box-sizing model to add/subtract irrelevant styles
     7011    return ( val +
     7012        augmentWidthOrHeight(
     7013            elem,
     7014            name,
     7015            extra || ( isBorderBox ? "border" : "content" ),
     7016            valueIsBorderBox,
     7017            styles
     7018        )
     7019    ) + "px";
     7020}
     7021
     7022// Try to determine the default display value of an element
     7023function css_defaultDisplay( nodeName ) {
     7024    var doc = document,
     7025        display = elemdisplay[ nodeName ];
     7026
     7027    if ( !display ) {
     7028        display = actualDisplay( nodeName, doc );
     7029
     7030        // If the simple way fails, read from inside an iframe
     7031        if ( display === "none" || !display ) {
     7032            // Use the already-created iframe if possible
     7033            iframe = ( iframe ||
     7034                jQuery("<iframe frameborder='0' width='0' height='0'/>")
     7035                .css( "cssText", "display:block !important" )
     7036            ).appendTo( doc.documentElement );
     7037
     7038            // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
     7039            doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
     7040            doc.write("<!doctype html><html><body>");
     7041            doc.close();
     7042
     7043            display = actualDisplay( nodeName, doc );
     7044            iframe.detach();
     7045        }
     7046
     7047        // Store the correct default display
     7048        elemdisplay[ nodeName ] = display;
     7049    }
     7050
     7051    return display;
     7052}
     7053
     7054// Called ONLY from within css_defaultDisplay
     7055function actualDisplay( name, doc ) {
     7056    var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
     7057        display = jQuery.css( elem[0], "display" );
     7058    elem.remove();
     7059    return display;
     7060}
     7061
     7062jQuery.each([ "height", "width" ], function( i, name ) {
     7063    jQuery.cssHooks[ name ] = {
     7064        get: function( elem, computed, extra ) {
     7065            if ( computed ) {
     7066                // certain elements can have dimension info if we invisibly show them
     7067                // however, it must have a current display style that would benefit from this
     7068                return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
     7069                    jQuery.swap( elem, cssShow, function() {
     7070                        return getWidthOrHeight( elem, name, extra );
     7071                    }) :
     7072                    getWidthOrHeight( elem, name, extra );
     7073            }
     7074        },
     7075
     7076        set: function( elem, value, extra ) {
     7077            var styles = extra && getStyles( elem );
     7078            return setPositiveNumber( elem, value, extra ?
     7079                augmentWidthOrHeight(
     7080                    elem,
     7081                    name,
     7082                    extra,
     7083                    jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
     7084                    styles
     7085                ) : 0
     7086            );
     7087        }
     7088    };
     7089});
     7090
     7091if ( !jQuery.support.opacity ) {
     7092    jQuery.cssHooks.opacity = {
     7093        get: function( elem, computed ) {
     7094            // IE uses filters for opacity
     7095            return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
     7096                ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
     7097                computed ? "1" : "";
     7098        },
     7099
     7100        set: function( elem, value ) {
     7101            var style = elem.style,
     7102                currentStyle = elem.currentStyle,
     7103                opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
     7104                filter = currentStyle && currentStyle.filter || style.filter || "";
     7105
     7106            // IE has trouble with opacity if it does not have layout
     7107            // Force it by setting the zoom level
     7108            style.zoom = 1;
     7109
     7110            // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
     7111            // if value === "", then remove inline opacity #12685
     7112            if ( ( value >= 1 || value === "" ) &&
     7113                    jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
     7114                    style.removeAttribute ) {
     7115
     7116                // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
     7117                // if "filter:" is present at all, clearType is disabled, we want to avoid this
     7118                // style.removeAttribute is IE Only, but so apparently is this code path...
     7119                style.removeAttribute( "filter" );
     7120
     7121                // if there is no filter style applied in a css rule or unset inline opacity, we are done
     7122                if ( value === "" || currentStyle && !currentStyle.filter ) {
     7123                    return;
     7124                }
     7125            }
     7126
     7127            // otherwise, set new filter values
     7128            style.filter = ralpha.test( filter ) ?
     7129                filter.replace( ralpha, opacity ) :
     7130                filter + " " + opacity;
     7131        }
     7132    };
     7133}
     7134
     7135// These hooks cannot be added until DOM ready because the support test
     7136// for it is not run until after DOM ready
     7137jQuery(function() {
     7138    if ( !jQuery.support.reliableMarginRight ) {
     7139        jQuery.cssHooks.marginRight = {
     7140            get: function( elem, computed ) {
     7141                if ( computed ) {
     7142                    // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
     7143                    // Work around by temporarily setting element display to inline-block
     7144                    return jQuery.swap( elem, { "display": "inline-block" },
     7145                        curCSS, [ elem, "marginRight" ] );
     7146                }
     7147            }
     7148        };
     7149    }
     7150
     7151    // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
     7152    // getComputedStyle returns percent when specified for top/left/bottom/right
     7153    // rather than make the css module depend on the offset module, we just check for it here
     7154    if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
     7155        jQuery.each( [ "top", "left" ], function( i, prop ) {
     7156            jQuery.cssHooks[ prop ] = {
     7157                get: function( elem, computed ) {
     7158                    if ( computed ) {
     7159                        computed = curCSS( elem, prop );
     7160                        // if curCSS returns percentage, fallback to offset
     7161                        return rnumnonpx.test( computed ) ?
     7162                            jQuery( elem ).position()[ prop ] + "px" :
     7163                            computed;
     7164                    }
     7165                }
     7166            };
     7167        });
     7168    }
     7169
     7170});
     7171
     7172if ( jQuery.expr && jQuery.expr.filters ) {
     7173    jQuery.expr.filters.hidden = function( elem ) {
     7174        return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
     7175    };
     7176
     7177    jQuery.expr.filters.visible = function( elem ) {
     7178        return !jQuery.expr.filters.hidden( elem );
     7179    };
     7180}
     7181
     7182// These hooks are used by animate to expand properties
     7183jQuery.each({
     7184    margin: "",
     7185    padding: "",
     7186    border: "Width"
     7187}, function( prefix, suffix ) {
     7188    jQuery.cssHooks[ prefix + suffix ] = {
     7189        expand: function( value ) {
     7190            var i = 0,
     7191                expanded = {},
     7192
     7193                // assumes a single number if not a string
     7194                parts = typeof value === "string" ? value.split(" ") : [ value ];
     7195
     7196            for ( ; i < 4; i++ ) {
     7197                expanded[ prefix + cssExpand[ i ] + suffix ] =
     7198                    parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
     7199            }
     7200
     7201            return expanded;
     7202        }
     7203    };
     7204
     7205    if ( !rmargin.test( prefix ) ) {
     7206        jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
     7207    }
     7208});
     7209var r20 = /%20/g,
     7210    rbracket = /\[\]$/,
     7211    rCRLF = /\r?\n/g,
     7212    rsubmitterTypes = /^(?:submit|button|image|reset)$/i,
     7213    rsubmittable = /^(?:input|select|textarea|keygen)/i;
     7214
     7215jQuery.fn.extend({
     7216    serialize: function() {
     7217        return jQuery.param( this.serializeArray() );
     7218    },
     7219    serializeArray: function() {
     7220        return this.map(function(){
     7221            // Can add propHook for "elements" to filter or add form elements
     7222            var elements = jQuery.prop( this, "elements" );
     7223            return elements ? jQuery.makeArray( elements ) : this;
     7224        })
     7225        .filter(function(){
     7226            var type = this.type;
     7227            // Use .is(":disabled") so that fieldset[disabled] works
     7228            return this.name && !jQuery( this ).is( ":disabled" ) &&
     7229                rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
     7230                ( this.checked || !manipulation_rcheckableType.test( type ) );
     7231        })
     7232        .map(function( i, elem ){
     7233            var val = jQuery( this ).val();
     7234
     7235            return val == null ?
     7236                null :
     7237                jQuery.isArray( val ) ?
     7238                    jQuery.map( val, function( val ){
     7239                        return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
     7240                    }) :
     7241                    { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
     7242        }).get();
     7243    }
     7244});
     7245
     7246//Serialize an array of form elements or a set of
     7247//key/values into a query string
     7248jQuery.param = function( a, traditional ) {
     7249    var prefix,
     7250        s = [],
     7251        add = function( key, value ) {
     7252            // If value is a function, invoke it and return its value
     7253            value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
     7254            s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
     7255        };
     7256
     7257    // Set traditional to true for jQuery <= 1.3.2 behavior.
     7258    if ( traditional === undefined ) {
     7259        traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
     7260    }
     7261
     7262    // If an array was passed in, assume that it is an array of form elements.
     7263    if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
     7264        // Serialize the form elements
     7265        jQuery.each( a, function() {
     7266            add( this.name, this.value );
     7267        });
     7268
     7269    } else {
     7270        // If traditional, encode the "old" way (the way 1.3.2 or older
     7271        // did it), otherwise encode params recursively.
     7272        for ( prefix in a ) {
     7273            buildParams( prefix, a[ prefix ], traditional, add );
     7274        }
     7275    }
     7276
     7277    // Return the resulting serialization
     7278    return s.join( "&" ).replace( r20, "+" );
     7279};
     7280
     7281function buildParams( prefix, obj, traditional, add ) {
     7282    var name;
     7283
     7284    if ( jQuery.isArray( obj ) ) {
     7285        // Serialize array item.
     7286        jQuery.each( obj, function( i, v ) {
     7287            if ( traditional || rbracket.test( prefix ) ) {
     7288                // Treat each array item as a scalar.
     7289                add( prefix, v );
     7290
     7291            } else {
     7292                // Item is non-scalar (array or object), encode its numeric index.
     7293                buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
     7294            }
     7295        });
     7296
     7297    } else if ( !traditional && jQuery.type( obj ) === "object" ) {
     7298        // Serialize object item.
     7299        for ( name in obj ) {
     7300            buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
     7301        }
     7302
     7303    } else {
     7304        // Serialize scalar item.
     7305        add( prefix, obj );
     7306    }
     7307}
     7308var
     7309    // Document location
     7310    ajaxLocParts,
     7311    ajaxLocation,
     7312
     7313    ajax_nonce = jQuery.now(),
     7314
     7315    ajax_rquery = /\?/,
     7316    rhash = /#.*$/,
     7317    rts = /([?&])_=[^&]*/,
     7318    rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
     7319    // #7653, #8125, #8152: local protocol detection
     7320    rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
     7321    rnoContent = /^(?:GET|HEAD)$/,
     7322    rprotocol = /^\/\//,
     7323    rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
     7324
     7325    // Keep a copy of the old load method
     7326    _load = jQuery.fn.load,
     7327
     7328    /* Prefilters
     7329     * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
     7330     * 2) These are called:
     7331     *    - BEFORE asking for a transport
     7332     *    - AFTER param serialization (s.data is a string if s.processData is true)
     7333     * 3) key is the dataType
     7334     * 4) the catchall symbol "*" can be used
     7335     * 5) execution will start with transport dataType and THEN continue down to "*" if needed
     7336     */
     7337    prefilters = {},
     7338
     7339    /* Transports bindings
     7340     * 1) key is the dataType
     7341     * 2) the catchall symbol "*" can be used
     7342     * 3) selection will start with transport dataType and THEN go to "*" if needed
     7343     */
     7344    transports = {},
     7345
     7346    // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
     7347    allTypes = "*/".concat("*");
     7348
     7349// #8138, IE may throw an exception when accessing
     7350// a field from window.location if document.domain has been set
     7351try {
     7352    ajaxLocation = location.href;
     7353} catch( e ) {
     7354    // Use the href attribute of an A element
     7355    // since IE will modify it given document.location
     7356    ajaxLocation = document.createElement( "a" );
     7357    ajaxLocation.href = "";
     7358    ajaxLocation = ajaxLocation.href;
     7359}
     7360
     7361// Segment location into parts
     7362ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
     7363
     7364// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
     7365function addToPrefiltersOrTransports( structure ) {
     7366
     7367    // dataTypeExpression is optional and defaults to "*"
     7368    return function( dataTypeExpression, func ) {
     7369
     7370        if ( typeof dataTypeExpression !== "string" ) {
     7371            func = dataTypeExpression;
     7372            dataTypeExpression = "*";
     7373        }
     7374
     7375        var dataType,
     7376            i = 0,
     7377            dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
     7378
     7379        if ( jQuery.isFunction( func ) ) {
     7380            // For each dataType in the dataTypeExpression
     7381            while ( (dataType = dataTypes[i++]) ) {
     7382                // Prepend if requested
     7383                if ( dataType[0] === "+" ) {
     7384                    dataType = dataType.slice( 1 ) || "*";
     7385                    (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
     7386
     7387                // Otherwise append
     7388                } else {
     7389                    (structure[ dataType ] = structure[ dataType ] || []).push( func );
     7390                }
     7391            }
     7392        }
     7393    };
     7394}
     7395
     7396// Base inspection function for prefilters and transports
     7397function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
     7398
     7399    var inspected = {},
     7400        seekingTransport = ( structure === transports );
     7401
     7402    function inspect( dataType ) {
     7403        var selected;
     7404        inspected[ dataType ] = true;
     7405        jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
     7406            var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
     7407            if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
     7408                options.dataTypes.unshift( dataTypeOrTransport );
     7409                inspect( dataTypeOrTransport );
     7410                return false;
     7411            } else if ( seekingTransport ) {
     7412                return !( selected = dataTypeOrTransport );
     7413            }
     7414        });
     7415        return selected;
     7416    }
     7417
     7418    return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
     7419}
     7420
     7421// A special extend for ajax options
     7422// that takes "flat" options (not to be deep extended)
     7423// Fixes #9887
     7424function ajaxExtend( target, src ) {
     7425    var key, deep,
     7426        flatOptions = jQuery.ajaxSettings.flatOptions || {};
     7427
     7428    for ( key in src ) {
     7429        if ( src[ key ] !== undefined ) {
     7430            ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
     7431        }
     7432    }
     7433    if ( deep ) {
     7434        jQuery.extend( true, target, deep );
     7435    }
     7436
     7437    return target;
     7438}
     7439
     7440jQuery.fn.load = function( url, params, callback ) {
     7441    if ( typeof url !== "string" && _load ) {
     7442        return _load.apply( this, arguments );
     7443    }
     7444
     7445    var selector, type, response,
     7446        self = this,
     7447        off = url.indexOf(" ");
     7448
     7449    if ( off >= 0 ) {
     7450        selector = url.slice( off, url.length );
     7451        url = url.slice( 0, off );
     7452    }
     7453
     7454    // If it's a function
     7455    if ( jQuery.isFunction( params ) ) {
     7456
     7457        // We assume that it's the callback
     7458        callback = params;
     7459        params = undefined;
     7460
     7461    // Otherwise, build a param string
     7462    } else if ( params && typeof params === "object" ) {
     7463        type = "POST";
     7464    }
     7465
     7466    // If we have elements to modify, make the request
     7467    if ( self.length > 0 ) {
     7468        jQuery.ajax({
     7469            url: url,
     7470
     7471            // if "type" variable is undefined, then "GET" method will be used
     7472            type: type,
     7473            dataType: "html",
     7474            data: params
     7475        }).done(function( responseText ) {
     7476
     7477            // Save response for use in complete callback
     7478            response = arguments;
     7479
     7480            self.html( selector ?
     7481
     7482                // If a selector was specified, locate the right elements in a dummy div
     7483                // Exclude scripts to avoid IE 'Permission Denied' errors
     7484                jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
     7485
     7486                // Otherwise use the full result
     7487                responseText );
     7488
     7489        }).complete( callback && function( jqXHR, status ) {
     7490            self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
     7491        });
     7492    }
     7493
     7494    return this;
     7495};
     7496
     7497// Attach a bunch of functions for handling common AJAX events
     7498jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
     7499    jQuery.fn[ type ] = function( fn ){
     7500        return this.on( type, fn );
     7501    };
     7502});
     7503
     7504jQuery.each( [ "get", "post" ], function( i, method ) {
     7505    jQuery[ method ] = function( url, data, callback, type ) {
     7506        // shift arguments if data argument was omitted
     7507        if ( jQuery.isFunction( data ) ) {
     7508            type = type || callback;
     7509            callback = data;
     7510            data = undefined;
     7511        }
     7512
     7513        return jQuery.ajax({
     7514            url: url,
     7515            type: method,
     7516            dataType: type,
     7517            data: data,
     7518            success: callback
     7519        });
     7520    };
     7521});
     7522
     7523jQuery.extend({
     7524
     7525    // Counter for holding the number of active queries
     7526    active: 0,
     7527
     7528    // Last-Modified header cache for next request
     7529    lastModified: {},
     7530    etag: {},
     7531
     7532    ajaxSettings: {
     7533        url: ajaxLocation,
     7534        type: "GET",
     7535        isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
     7536        global: true,
     7537        processData: true,
     7538        async: true,
     7539        contentType: "application/x-www-form-urlencoded; charset=UTF-8",
     7540        /*
     7541        timeout: 0,
     7542        data: null,
     7543        dataType: null,
     7544        username: null,
     7545        password: null,
     7546        cache: null,
     7547        throws: false,
     7548        traditional: false,
     7549        headers: {},
     7550        */
     7551
     7552        accepts: {
     7553            "*": allTypes,
     7554            text: "text/plain",
     7555            html: "text/html",
     7556            xml: "application/xml, text/xml",
     7557            json: "application/json, text/javascript"
     7558        },
     7559
     7560        contents: {
     7561            xml: /xml/,
     7562            html: /html/,
     7563            json: /json/
     7564        },
     7565
     7566        responseFields: {
     7567            xml: "responseXML",
     7568            text: "responseText"
     7569        },
     7570
     7571        // Data converters
     7572        // Keys separate source (or catchall "*") and destination types with a single space
     7573        converters: {
     7574
     7575            // Convert anything to text
     7576            "* text": window.String,
     7577
     7578            // Text to html (true = no transformation)
     7579            "text html": true,
     7580
     7581            // Evaluate text as a json expression
     7582            "text json": jQuery.parseJSON,
     7583
     7584            // Parse text as xml
     7585            "text xml": jQuery.parseXML
     7586        },
     7587
     7588        // For options that shouldn't be deep extended:
     7589        // you can add your own custom options here if
     7590        // and when you create one that shouldn't be
     7591        // deep extended (see ajaxExtend)
     7592        flatOptions: {
     7593            url: true,
     7594            context: true
     7595        }
     7596    },
     7597
     7598    // Creates a full fledged settings object into target
     7599    // with both ajaxSettings and settings fields.
     7600    // If target is omitted, writes into ajaxSettings.
     7601    ajaxSetup: function( target, settings ) {
     7602        return settings ?
     7603
     7604            // Building a settings object
     7605            ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
     7606
     7607            // Extending ajaxSettings
     7608            ajaxExtend( jQuery.ajaxSettings, target );
     7609    },
     7610
     7611    ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
     7612    ajaxTransport: addToPrefiltersOrTransports( transports ),
     7613
     7614    // Main method
     7615    ajax: function( url, options ) {
     7616
     7617        // If url is an object, simulate pre-1.5 signature
     7618        if ( typeof url === "object" ) {
     7619            options = url;
     7620            url = undefined;
     7621        }
     7622
     7623        // Force options to be an object
     7624        options = options || {};
     7625
     7626        var transport,
     7627            // URL without anti-cache param
     7628            cacheURL,
     7629            // Response headers
     7630            responseHeadersString,
     7631            responseHeaders,
     7632            // timeout handle
     7633            timeoutTimer,
     7634            // Cross-domain detection vars
     7635            parts,
     7636            // To know if global events are to be dispatched
     7637            fireGlobals,
     7638            // Loop variable
     7639            i,
     7640            // Create the final options object
     7641            s = jQuery.ajaxSetup( {}, options ),
     7642            // Callbacks context
     7643            callbackContext = s.context || s,
     7644            // Context for global events is callbackContext if it is a DOM node or jQuery collection
     7645            globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
     7646                jQuery( callbackContext ) :
     7647                jQuery.event,
     7648            // Deferreds
     7649            deferred = jQuery.Deferred(),
     7650            completeDeferred = jQuery.Callbacks("once memory"),
     7651            // Status-dependent callbacks
     7652            statusCode = s.statusCode || {},
     7653            // Headers (they are sent all at once)
     7654            requestHeaders = {},
     7655            requestHeadersNames = {},
     7656            // The jqXHR state
     7657            state = 0,
     7658            // Default abort message
     7659            strAbort = "canceled",
     7660            // Fake xhr
     7661            jqXHR = {
     7662                readyState: 0,
     7663
     7664                // Builds headers hashtable if needed
     7665                getResponseHeader: function( key ) {
     7666                    var match;
     7667                    if ( state === 2 ) {
     7668                        if ( !responseHeaders ) {
     7669                            responseHeaders = {};
     7670                            while ( (match = rheaders.exec( responseHeadersString )) ) {
     7671                                responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
     7672                            }
     7673                        }
     7674                        match = responseHeaders[ key.toLowerCase() ];
     7675                    }
     7676                    return match == null ? null : match;
     7677                },
     7678
     7679                // Raw string
     7680                getAllResponseHeaders: function() {
     7681                    return state === 2 ? responseHeadersString : null;
     7682                },
     7683
     7684                // Caches the header
     7685                setRequestHeader: function( name, value ) {
     7686                    var lname = name.toLowerCase();
     7687                    if ( !state ) {
     7688                        name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
     7689                        requestHeaders[ name ] = value;
     7690                    }
     7691                    return this;
     7692                },
     7693
     7694                // Overrides response content-type header
     7695                overrideMimeType: function( type ) {
     7696                    if ( !state ) {
     7697                        s.mimeType = type;
     7698                    }
     7699                    return this;
     7700                },
     7701
     7702                // Status-dependent callbacks
     7703                statusCode: function( map ) {
     7704                    var code;
     7705                    if ( map ) {
     7706                        if ( state < 2 ) {
     7707                            for ( code in map ) {
     7708                                // Lazy-add the new callback in a way that preserves old ones
     7709                                statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
     7710                            }
     7711                        } else {
     7712                            // Execute the appropriate callbacks
     7713                            jqXHR.always( map[ jqXHR.status ] );
     7714                        }
     7715                    }
     7716                    return this;
     7717                },
     7718
     7719                // Cancel the request
     7720                abort: function( statusText ) {
     7721                    var finalText = statusText || strAbort;
     7722                    if ( transport ) {
     7723                        transport.abort( finalText );
     7724                    }
     7725                    done( 0, finalText );
     7726                    return this;
     7727                }
     7728            };
     7729
     7730        // Attach deferreds
     7731        deferred.promise( jqXHR ).complete = completeDeferred.add;
     7732        jqXHR.success = jqXHR.done;
     7733        jqXHR.error = jqXHR.fail;
     7734
     7735        // Remove hash character (#7531: and string promotion)
     7736        // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
     7737        // Handle falsy url in the settings object (#10093: consistency with old signature)
     7738        // We also use the url parameter if available
     7739        s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
     7740
     7741        // Alias method option to type as per ticket #12004
     7742        s.type = options.method || options.type || s.method || s.type;
     7743
     7744        // Extract dataTypes list
     7745        s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
     7746
     7747        // A cross-domain request is in order when we have a protocol:host:port mismatch
     7748        if ( s.crossDomain == null ) {
     7749            parts = rurl.exec( s.url.toLowerCase() );
     7750            s.crossDomain = !!( parts &&
     7751                ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
     7752                    ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
     7753                        ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
     7754            );
     7755        }
     7756
     7757        // Convert data if not already a string
     7758        if ( s.data && s.processData && typeof s.data !== "string" ) {
     7759            s.data = jQuery.param( s.data, s.traditional );
     7760        }
     7761
     7762        // Apply prefilters
     7763        inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
     7764
     7765        // If request was aborted inside a prefilter, stop there
     7766        if ( state === 2 ) {
     7767            return jqXHR;
     7768        }
     7769
     7770        // We can fire global events as of now if asked to
     7771        fireGlobals = s.global;
     7772
     7773        // Watch for a new set of requests
     7774        if ( fireGlobals && jQuery.active++ === 0 ) {
     7775            jQuery.event.trigger("ajaxStart");
     7776        }
     7777
     7778        // Uppercase the type
     7779        s.type = s.type.toUpperCase();
     7780
     7781        // Determine if request has content
     7782        s.hasContent = !rnoContent.test( s.type );
     7783
     7784        // Save the URL in case we're toying with the If-Modified-Since
     7785        // and/or If-None-Match header later on
     7786        cacheURL = s.url;
     7787
     7788        // More options handling for requests with no content
     7789        if ( !s.hasContent ) {
     7790
     7791            // If data is available, append data to url
     7792            if ( s.data ) {
     7793                cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
     7794                // #9682: remove data so that it's not used in an eventual retry
     7795                delete s.data;
     7796            }
     7797
     7798            // Add anti-cache in url if needed
     7799            if ( s.cache === false ) {
     7800                s.url = rts.test( cacheURL ) ?
     7801
     7802                    // If there is already a '_' parameter, set its value
     7803                    cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
     7804
     7805                    // Otherwise add one to the end
     7806                    cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
     7807            }
     7808        }
     7809
     7810        // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
     7811        if ( s.ifModified ) {
     7812            if ( jQuery.lastModified[ cacheURL ] ) {
     7813                jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
     7814            }
     7815            if ( jQuery.etag[ cacheURL ] ) {
     7816                jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
     7817            }
     7818        }
     7819
     7820        // Set the correct header, if data is being sent
     7821        if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
     7822            jqXHR.setRequestHeader( "Content-Type", s.contentType );
     7823        }
     7824
     7825        // Set the Accepts header for the server, depending on the dataType
     7826        jqXHR.setRequestHeader(
     7827            "Accept",
     7828            s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
     7829                s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
     7830                s.accepts[ "*" ]
     7831        );
     7832
     7833        // Check for headers option
     7834        for ( i in s.headers ) {
     7835            jqXHR.setRequestHeader( i, s.headers[ i ] );
     7836        }
     7837
     7838        // Allow custom headers/mimetypes and early abort
     7839        if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
     7840            // Abort if not done already and return
     7841            return jqXHR.abort();
     7842        }
     7843
     7844        // aborting is no longer a cancellation
     7845        strAbort = "abort";
     7846
     7847        // Install callbacks on deferreds
     7848        for ( i in { success: 1, error: 1, complete: 1 } ) {
     7849            jqXHR[ i ]( s[ i ] );
     7850        }
     7851
     7852        // Get transport
     7853        transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
     7854
     7855        // If no transport, we auto-abort
     7856        if ( !transport ) {
     7857            done( -1, "No Transport" );
     7858        } else {
     7859            jqXHR.readyState = 1;
     7860
     7861            // Send global event
     7862            if ( fireGlobals ) {
     7863                globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
     7864            }
     7865            // Timeout
     7866            if ( s.async && s.timeout > 0 ) {
     7867                timeoutTimer = setTimeout(function() {
     7868                    jqXHR.abort("timeout");
     7869                }, s.timeout );
     7870            }
     7871
     7872            try {
     7873                state = 1;
     7874                transport.send( requestHeaders, done );
     7875            } catch ( e ) {
     7876                // Propagate exception as error if not done
     7877                if ( state < 2 ) {
     7878                    done( -1, e );
     7879                // Simply rethrow otherwise
     7880                } else {
     7881                    throw e;
     7882                }
     7883            }
     7884        }
     7885
     7886        // Callback for when everything is done
     7887        function done( status, nativeStatusText, responses, headers ) {
     7888            var isSuccess, success, error, response, modified,
     7889                statusText = nativeStatusText;
     7890
     7891            // Called once
     7892            if ( state === 2 ) {
     7893                return;
     7894            }
     7895
     7896            // State is "done" now
     7897            state = 2;
     7898
     7899            // Clear timeout if it exists
     7900            if ( timeoutTimer ) {
     7901                clearTimeout( timeoutTimer );
     7902            }
     7903
     7904            // Dereference transport for early garbage collection
     7905            // (no matter how long the jqXHR object will be used)
     7906            transport = undefined;
     7907
     7908            // Cache response headers
     7909            responseHeadersString = headers || "";
     7910
     7911            // Set readyState
     7912            jqXHR.readyState = status > 0 ? 4 : 0;
     7913
     7914            // Get response data
     7915            if ( responses ) {
     7916                response = ajaxHandleResponses( s, jqXHR, responses );
     7917            }
     7918
     7919            // If successful, handle type chaining
     7920            if ( status >= 200 && status < 300 || status === 304 ) {
     7921
     7922                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
     7923                if ( s.ifModified ) {
     7924                    modified = jqXHR.getResponseHeader("Last-Modified");
     7925                    if ( modified ) {
     7926                        jQuery.lastModified[ cacheURL ] = modified;
     7927                    }
     7928                    modified = jqXHR.getResponseHeader("etag");
     7929                    if ( modified ) {
     7930                        jQuery.etag[ cacheURL ] = modified;
     7931                    }
     7932                }
     7933
     7934                // If not modified
     7935                if ( status === 304 ) {
     7936                    isSuccess = true;
     7937                    statusText = "notmodified";
     7938
     7939                // If we have data
     7940                } else {
     7941                    isSuccess = ajaxConvert( s, response );
     7942                    statusText = isSuccess.state;
     7943                    success = isSuccess.data;
     7944                    error = isSuccess.error;
     7945                    isSuccess = !error;
     7946                }
     7947            } else {
     7948                // We extract error from statusText
     7949                // then normalize statusText and status for non-aborts
     7950                error = statusText;
     7951                if ( status || !statusText ) {
     7952                    statusText = "error";
     7953                    if ( status < 0 ) {
     7954                        status = 0;
     7955                    }
     7956                }
     7957            }
     7958
     7959            // Set data for the fake xhr object
     7960            jqXHR.status = status;
     7961            jqXHR.statusText = ( nativeStatusText || statusText ) + "";
     7962
     7963            // Success/Error
     7964            if ( isSuccess ) {
     7965                deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
     7966            } else {
     7967                deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
     7968            }
     7969
     7970            // Status-dependent callbacks
     7971            jqXHR.statusCode( statusCode );
     7972            statusCode = undefined;
     7973
     7974            if ( fireGlobals ) {
     7975                globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
     7976                    [ jqXHR, s, isSuccess ? success : error ] );
     7977            }
     7978
     7979            // Complete
     7980            completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
     7981
     7982            if ( fireGlobals ) {
     7983                globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
     7984                // Handle the global AJAX counter
     7985                if ( !( --jQuery.active ) ) {
     7986                    jQuery.event.trigger("ajaxStop");
     7987                }
     7988            }
     7989        }
     7990
     7991        return jqXHR;
     7992    },
     7993
     7994    getScript: function( url, callback ) {
     7995        return jQuery.get( url, undefined, callback, "script" );
     7996    },
     7997
     7998    getJSON: function( url, data, callback ) {
     7999        return jQuery.get( url, data, callback, "json" );
     8000    }
     8001});
     8002
     8003/* Handles responses to an ajax request:
     8004 * - sets all responseXXX fields accordingly
     8005 * - finds the right dataType (mediates between content-type and expected dataType)
     8006 * - returns the corresponding response
     8007 */
     8008function ajaxHandleResponses( s, jqXHR, responses ) {
     8009
     8010    var ct, type, finalDataType, firstDataType,
     8011        contents = s.contents,
     8012        dataTypes = s.dataTypes,
     8013        responseFields = s.responseFields;
     8014
     8015    // Fill responseXXX fields
     8016    for ( type in responseFields ) {
     8017        if ( type in responses ) {
     8018            jqXHR[ responseFields[type] ] = responses[ type ];
     8019        }
     8020    }
     8021
     8022    // Remove auto dataType and get content-type in the process
     8023    while( dataTypes[ 0 ] === "*" ) {
     8024        dataTypes.shift();
     8025        if ( ct === undefined ) {
     8026            ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
     8027        }
     8028    }
     8029
     8030    // Check if we're dealing with a known content-type
     8031    if ( ct ) {
     8032        for ( type in contents ) {
     8033            if ( contents[ type ] && contents[ type ].test( ct ) ) {
     8034                dataTypes.unshift( type );
     8035                break;
     8036            }
     8037        }
     8038    }
     8039
     8040    // Check to see if we have a response for the expected dataType
     8041    if ( dataTypes[ 0 ] in responses ) {
     8042        finalDataType = dataTypes[ 0 ];
     8043    } else {
     8044        // Try convertible dataTypes
     8045        for ( type in responses ) {
     8046            if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
     8047                finalDataType = type;
     8048                break;
     8049            }
     8050            if ( !firstDataType ) {
     8051                firstDataType = type;
     8052            }
     8053        }
     8054        // Or just use first one
     8055        finalDataType = finalDataType || firstDataType;
     8056    }
     8057
     8058    // If we found a dataType
     8059    // We add the dataType to the list if needed
     8060    // and return the corresponding response
     8061    if ( finalDataType ) {
     8062        if ( finalDataType !== dataTypes[ 0 ] ) {
     8063            dataTypes.unshift( finalDataType );
     8064        }
     8065        return responses[ finalDataType ];
     8066    }
     8067}
     8068
     8069// Chain conversions given the request and the original response
     8070function ajaxConvert( s, response ) {
     8071
     8072    var conv, conv2, current, tmp,
     8073        converters = {},
     8074        i = 0,
     8075        // Work with a copy of dataTypes in case we need to modify it for conversion
     8076        dataTypes = s.dataTypes.slice(),
     8077        prev = dataTypes[ 0 ];
     8078
     8079    // Apply the dataFilter if provided
     8080    if ( s.dataFilter ) {
     8081        response = s.dataFilter( response, s.dataType );
     8082    }
     8083
     8084    // Create converters map with lowercased keys
     8085    if ( dataTypes[ 1 ] ) {
     8086        for ( conv in s.converters ) {
     8087            converters[ conv.toLowerCase() ] = s.converters[ conv ];
     8088        }
     8089    }
     8090
     8091    // Convert to each sequential dataType, tolerating list modification
     8092    for ( ; (current = dataTypes[++i]); ) {
     8093
     8094        // There's only work to do if current dataType is non-auto
     8095        if ( current !== "*" ) {
     8096
     8097            // Convert response if prev dataType is non-auto and differs from current
     8098            if ( prev !== "*" && prev !== current ) {
     8099
     8100                // Seek a direct converter
     8101                conv = converters[ prev + " " + current ] || converters[ "* " + current ];
     8102
     8103                // If none found, seek a pair
     8104                if ( !conv ) {
     8105                    for ( conv2 in converters ) {
     8106
     8107                        // If conv2 outputs current
     8108                        tmp = conv2.split(" ");
     8109                        if ( tmp[ 1 ] === current ) {
     8110
     8111                            // If prev can be converted to accepted input
     8112                            conv = converters[ prev + " " + tmp[ 0 ] ] ||
     8113                                converters[ "* " + tmp[ 0 ] ];
     8114                            if ( conv ) {
     8115                                // Condense equivalence converters
     8116                                if ( conv === true ) {
     8117                                    conv = converters[ conv2 ];
     8118
     8119                                // Otherwise, insert the intermediate dataType
     8120                                } else if ( converters[ conv2 ] !== true ) {
     8121                                    current = tmp[ 0 ];
     8122                                    dataTypes.splice( i--, 0, current );
     8123                                }
     8124
     8125                                break;
     8126                            }
     8127                        }
     8128                    }
     8129                }
     8130
     8131                // Apply converter (if not an equivalence)
     8132                if ( conv !== true ) {
     8133
     8134                    // Unless errors are allowed to bubble, catch and return them
     8135                    if ( conv && s["throws"] ) {
     8136                        response = conv( response );
     8137                    } else {
     8138                        try {
     8139                            response = conv( response );
     8140                        } catch ( e ) {
     8141                            return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
     8142                        }
     8143                    }
     8144                }
     8145            }
     8146
     8147            // Update prev for next iteration
     8148            prev = current;
     8149        }
     8150    }
     8151
     8152    return { state: "success", data: response };
     8153}
     8154// Install script dataType
     8155jQuery.ajaxSetup({
     8156    accepts: {
     8157        script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
     8158    },
     8159    contents: {
     8160        script: /(?:java|ecma)script/
     8161    },
     8162    converters: {
     8163        "text script": function( text ) {
     8164            jQuery.globalEval( text );
     8165            return text;
     8166        }
     8167    }
     8168});
     8169
     8170// Handle cache's special case and global
     8171jQuery.ajaxPrefilter( "script", function( s ) {
     8172    if ( s.cache === undefined ) {
     8173        s.cache = false;
     8174    }
     8175    if ( s.crossDomain ) {
     8176        s.type = "GET";
     8177        s.global = false;
     8178    }
     8179});
     8180
     8181// Bind script tag hack transport
     8182jQuery.ajaxTransport( "script", function(s) {
     8183
     8184    // This transport only deals with cross domain requests
     8185    if ( s.crossDomain ) {
     8186
     8187        var script,
     8188            head = document.head || jQuery("head")[0] || document.documentElement;
     8189
     8190        return {
     8191
     8192            send: function( _, callback ) {
     8193
     8194                script = document.createElement("script");
     8195
     8196                script.async = true;
     8197
     8198                if ( s.scriptCharset ) {
     8199                    script.charset = s.scriptCharset;
     8200                }
     8201
     8202                script.src = s.url;
     8203
     8204                // Attach handlers for all browsers
     8205                script.onload = script.onreadystatechange = function( _, isAbort ) {
     8206
     8207                    if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
     8208
     8209                        // Handle memory leak in IE
     8210                        script.onload = script.onreadystatechange = null;
     8211
     8212                        // Remove the script
     8213                        if ( script.parentNode ) {
     8214                            script.parentNode.removeChild( script );
     8215                        }
     8216
     8217                        // Dereference the script
     8218                        script = null;
     8219
     8220                        // Callback if not abort
     8221                        if ( !isAbort ) {
     8222                            callback( 200, "success" );
     8223                        }
     8224                    }
     8225                };
     8226
     8227                // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
     8228                // Use native DOM manipulation to avoid our domManip AJAX trickery
     8229                head.insertBefore( script, head.firstChild );
     8230            },
     8231
     8232            abort: function() {
     8233                if ( script ) {
     8234                    script.onload( undefined, true );
     8235                }
     8236            }
     8237        };
     8238    }
     8239});
     8240var oldCallbacks = [],
     8241    rjsonp = /(=)\?(?=&|$)|\?\?/;
     8242
     8243// Default jsonp settings
     8244jQuery.ajaxSetup({
     8245    jsonp: "callback",
     8246    jsonpCallback: function() {
     8247        var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
     8248        this[ callback ] = true;
     8249        return callback;
     8250    }
     8251});
     8252
     8253// Detect, normalize options and install callbacks for jsonp requests
     8254jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
     8255
     8256    var callbackName, overwritten, responseContainer,
     8257        jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
     8258            "url" :
     8259            typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
     8260        );
     8261
     8262    // Handle iff the expected data type is "jsonp" or we have a parameter to set
     8263    if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
     8264
     8265        // Get callback name, remembering preexisting value associated with it
     8266        callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
     8267            s.jsonpCallback() :
     8268            s.jsonpCallback;
     8269
     8270        // Insert callback into url or form data
     8271        if ( jsonProp ) {
     8272            s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
     8273        } else if ( s.jsonp !== false ) {
     8274            s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
     8275        }
     8276
     8277        // Use data converter to retrieve json after script execution
     8278        s.converters["script json"] = function() {
     8279            if ( !responseContainer ) {
     8280                jQuery.error( callbackName + " was not called" );
     8281            }
     8282            return responseContainer[ 0 ];
     8283        };
     8284
     8285        // force json dataType
     8286        s.dataTypes[ 0 ] = "json";
     8287
     8288        // Install callback
     8289        overwritten = window[ callbackName ];
     8290        window[ callbackName ] = function() {
     8291            responseContainer = arguments;
     8292        };
     8293
     8294        // Clean-up function (fires after converters)
     8295        jqXHR.always(function() {
     8296            // Restore preexisting value
     8297            window[ callbackName ] = overwritten;
     8298
     8299            // Save back as free
     8300            if ( s[ callbackName ] ) {
     8301                // make sure that re-using the options doesn't screw things around
     8302                s.jsonpCallback = originalSettings.jsonpCallback;
     8303
     8304                // save the callback name for future use
     8305                oldCallbacks.push( callbackName );
     8306            }
     8307
     8308            // Call if it was a function and we have a response
     8309            if ( responseContainer && jQuery.isFunction( overwritten ) ) {
     8310                overwritten( responseContainer[ 0 ] );
     8311            }
     8312
     8313            responseContainer = overwritten = undefined;
     8314        });
     8315
     8316        // Delegate to script
     8317        return "script";
     8318    }
     8319});
     8320var xhrCallbacks, xhrSupported,
     8321    xhrId = 0,
     8322    // #5280: Internet Explorer will keep connections alive if we don't abort on unload
     8323    xhrOnUnloadAbort = window.ActiveXObject && function() {
     8324        // Abort all pending requests
     8325        var key;
     8326        for ( key in xhrCallbacks ) {
     8327            xhrCallbacks[ key ]( undefined, true );
     8328        }
     8329    };
     8330
     8331// Functions to create xhrs
     8332function createStandardXHR() {
     8333    try {
     8334        return new window.XMLHttpRequest();
     8335    } catch( e ) {}
     8336}
     8337
     8338function createActiveXHR() {
     8339    try {
     8340        return new window.ActiveXObject("Microsoft.XMLHTTP");
     8341    } catch( e ) {}
     8342}
     8343
     8344// Create the request object
     8345// (This is still attached to ajaxSettings for backward compatibility)
     8346jQuery.ajaxSettings.xhr = window.ActiveXObject ?
     8347    /* Microsoft failed to properly
     8348     * implement the XMLHttpRequest in IE7 (can't request local files),
     8349     * so we use the ActiveXObject when it is available
     8350     * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
     8351     * we need a fallback.
     8352     */
     8353    function() {
     8354        return !this.isLocal && createStandardXHR() || createActiveXHR();
     8355    } :
     8356    // For all other browsers, use the standard XMLHttpRequest object
     8357    createStandardXHR;
     8358
     8359// Determine support properties
     8360xhrSupported = jQuery.ajaxSettings.xhr();
     8361jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
     8362xhrSupported = jQuery.support.ajax = !!xhrSupported;
     8363
     8364// Create transport if the browser can provide an xhr
     8365if ( xhrSupported ) {
     8366
     8367    jQuery.ajaxTransport(function( s ) {
     8368        // Cross domain only allowed if supported through XMLHttpRequest
     8369        if ( !s.crossDomain || jQuery.support.cors ) {
     8370
     8371            var callback;
     8372
     8373            return {
     8374                send: function( headers, complete ) {
     8375
     8376                    // Get a new xhr
     8377                    var handle, i,
     8378                        xhr = s.xhr();
     8379
     8380                    // Open the socket
     8381                    // Passing null username, generates a login popup on Opera (#2865)
     8382                    if ( s.username ) {
     8383                        xhr.open( s.type, s.url, s.async, s.username, s.password );
     8384                    } else {
     8385                        xhr.open( s.type, s.url, s.async );
     8386                    }
     8387
     8388                    // Apply custom fields if provided
     8389                    if ( s.xhrFields ) {
     8390                        for ( i in s.xhrFields ) {
     8391                            xhr[ i ] = s.xhrFields[ i ];
     8392                        }
     8393                    }
     8394
     8395                    // Override mime type if needed
     8396                    if ( s.mimeType && xhr.overrideMimeType ) {
     8397                        xhr.overrideMimeType( s.mimeType );
     8398                    }
     8399
     8400                    // X-Requested-With header
     8401                    // For cross-domain requests, seeing as conditions for a preflight are
     8402                    // akin to a jigsaw puzzle, we simply never set it to be sure.
     8403                    // (it can always be set on a per-request basis or even using ajaxSetup)
     8404                    // For same-domain requests, won't change header if already provided.
     8405                    if ( !s.crossDomain && !headers["X-Requested-With"] ) {
     8406                        headers["X-Requested-With"] = "XMLHttpRequest";
     8407                    }
     8408
     8409                    // Need an extra try/catch for cross domain requests in Firefox 3
     8410                    try {
     8411                        for ( i in headers ) {
     8412                            xhr.setRequestHeader( i, headers[ i ] );
     8413                        }
     8414                    } catch( err ) {}
     8415
     8416                    // Do send the request
     8417                    // This may raise an exception which is actually
     8418                    // handled in jQuery.ajax (so no try/catch here)
     8419                    xhr.send( ( s.hasContent && s.data ) || null );
     8420
     8421                    // Listener
     8422                    callback = function( _, isAbort ) {
     8423
     8424                        var status,
     8425                            statusText,
     8426                            responseHeaders,
     8427                            responses,
     8428                            xml;
     8429
     8430                        // Firefox throws exceptions when accessing properties
     8431                        // of an xhr when a network error occurred
     8432                        // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
     8433                        try {
     8434
     8435                            // Was never called and is aborted or complete
     8436                            if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
     8437
     8438                                // Only called once
     8439                                callback = undefined;
     8440
     8441                                // Do not keep as active anymore
     8442                                if ( handle ) {
     8443                                    xhr.onreadystatechange = jQuery.noop;
     8444                                    if ( xhrOnUnloadAbort ) {
     8445                                        delete xhrCallbacks[ handle ];
     8446                                    }
     8447                                }
     8448
     8449                                // If it's an abort
     8450                                if ( isAbort ) {
     8451                                    // Abort it manually if needed
     8452                                    if ( xhr.readyState !== 4 ) {
     8453                                        xhr.abort();
     8454                                    }
     8455                                } else {
     8456                                    responses = {};
     8457                                    status = xhr.status;
     8458                                    xml = xhr.responseXML;
     8459                                    responseHeaders = xhr.getAllResponseHeaders();
     8460
     8461                                    // Construct response list
     8462                                    if ( xml && xml.documentElement /* #4958 */ ) {
     8463                                        responses.xml = xml;
     8464                                    }
     8465
     8466                                    // When requesting binary data, IE6-9 will throw an exception
     8467                                    // on any attempt to access responseText (#11426)
     8468                                    if ( typeof xhr.responseText === "string" ) {
     8469                                        responses.text = xhr.responseText;
     8470                                    }
     8471
     8472                                    // Firefox throws an exception when accessing
     8473                                    // statusText for faulty cross-domain requests
     8474                                    try {
     8475                                        statusText = xhr.statusText;
     8476                                    } catch( e ) {
     8477                                        // We normalize with Webkit giving an empty statusText
     8478                                        statusText = "";
     8479                                    }
     8480
     8481                                    // Filter status for non standard behaviors
     8482
     8483                                    // If the request is local and we have data: assume a success
     8484                                    // (success with no data won't get notified, that's the best we
     8485                                    // can do given current implementations)
     8486                                    if ( !status && s.isLocal && !s.crossDomain ) {
     8487                                        status = responses.text ? 200 : 404;
     8488                                    // IE - #1450: sometimes returns 1223 when it should be 204
     8489                                    } else if ( status === 1223 ) {
     8490                                        status = 204;
     8491                                    }
     8492                                }
     8493                            }
     8494                        } catch( firefoxAccessException ) {
     8495                            if ( !isAbort ) {
     8496                                complete( -1, firefoxAccessException );
     8497                            }
     8498                        }
     8499
     8500                        // Call complete if needed
     8501                        if ( responses ) {
     8502                            complete( status, statusText, responses, responseHeaders );
     8503                        }
     8504                    };
     8505
     8506                    if ( !s.async ) {
     8507                        // if we're in sync mode we fire the callback
     8508                        callback();
     8509                    } else if ( xhr.readyState === 4 ) {
     8510                        // (IE6 & IE7) if it's in cache and has been
     8511                        // retrieved directly we need to fire the callback
     8512                        setTimeout( callback );
     8513                    } else {
     8514                        handle = ++xhrId;
     8515                        if ( xhrOnUnloadAbort ) {
     8516                            // Create the active xhrs callbacks list if needed
     8517                            // and attach the unload handler
     8518                            if ( !xhrCallbacks ) {
     8519                                xhrCallbacks = {};
     8520                                jQuery( window ).unload( xhrOnUnloadAbort );
     8521                            }
     8522                            // Add to list of active xhrs callbacks
     8523                            xhrCallbacks[ handle ] = callback;
     8524                        }
     8525                        xhr.onreadystatechange = callback;
     8526                    }
     8527                },
     8528
     8529                abort: function() {
     8530                    if ( callback ) {
     8531                        callback( undefined, true );
     8532                    }
     8533                }
     8534            };
     8535        }
     8536    });
     8537}
     8538var fxNow, timerId,
     8539    rfxtypes = /^(?:toggle|show|hide)$/,
     8540    rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
     8541    rrun = /queueHooks$/,
     8542    animationPrefilters = [ defaultPrefilter ],
     8543    tweeners = {
     8544        "*": [function( prop, value ) {
     8545            var end, unit,
     8546                tween = this.createTween( prop, value ),
     8547                parts = rfxnum.exec( value ),
     8548                target = tween.cur(),
     8549                start = +target || 0,
     8550                scale = 1,
     8551                maxIterations = 20;
     8552
     8553            if ( parts ) {
     8554                end = +parts[2];
     8555                unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
     8556
     8557                // We need to compute starting value
     8558                if ( unit !== "px" && start ) {
     8559                    // Iteratively approximate from a nonzero starting point
     8560                    // Prefer the current property, because this process will be trivial if it uses the same units
     8561                    // Fallback to end or a simple constant
     8562                    start = jQuery.css( tween.elem, prop, true ) || end || 1;
     8563
     8564                    do {
     8565                        // If previous iteration zeroed out, double until we get *something*
     8566                        // Use a string for doubling factor so we don't accidentally see scale as unchanged below
     8567                        scale = scale || ".5";
     8568
     8569                        // Adjust and apply
     8570                        start = start / scale;
     8571                        jQuery.style( tween.elem, prop, start + unit );
     8572
     8573                    // Update scale, tolerating zero or NaN from tween.cur()
     8574                    // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
     8575                    } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
     8576                }
     8577
     8578                tween.unit = unit;
     8579                tween.start = start;
     8580                // If a +=/-= token was provided, we're doing a relative animation
     8581                tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
     8582            }
     8583            return tween;
     8584        }]
     8585    };
     8586
     8587// Animations created synchronously will run synchronously
     8588function createFxNow() {
     8589    setTimeout(function() {
     8590        fxNow = undefined;
     8591    });
     8592    return ( fxNow = jQuery.now() );
     8593}
     8594
     8595function createTweens( animation, props ) {
     8596    jQuery.each( props, function( prop, value ) {
     8597        var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
     8598            index = 0,
     8599            length = collection.length;
     8600        for ( ; index < length; index++ ) {
     8601            if ( collection[ index ].call( animation, prop, value ) ) {
     8602
     8603                // we're done with this property
     8604                return;
     8605            }
     8606        }
     8607    });
     8608}
     8609
     8610function Animation( elem, properties, options ) {
     8611    var result,
     8612        index = 0,
     8613        length = animationPrefilters.length,
     8614        deferred = jQuery.Deferred().always( function() {
     8615            // don't match elem in the :animated selector
     8616            delete tick.elem;
     8617        }),
     8618        tick = function() {
     8619            var currentTime = fxNow || createFxNow(),
     8620                remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
     8621                // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
     8622                temp = remaining / animation.duration || 0,
     8623                percent = 1 - temp,
     8624                index = 0,
     8625                length = animation.tweens.length;
     8626
     8627            for ( ; index < length ; index++ ) {
     8628                animation.tweens[ index ].run( percent );
     8629            }
     8630
     8631            deferred.notifyWith( elem, [ animation, percent, remaining ]);
     8632
     8633            if ( percent < 1 && length ) {
     8634                return remaining;
     8635            } else {
     8636                deferred.resolveWith( elem, [ animation ] );
     8637                return false;
     8638            }
     8639        },
     8640        animation = deferred.promise({
     8641            elem: elem,
     8642            props: jQuery.extend( {}, properties ),
     8643            opts: jQuery.extend( true, { specialEasing: {} }, options ),
     8644            originalProperties: properties,
     8645            originalOptions: options,
     8646            startTime: fxNow || createFxNow(),
     8647            duration: options.duration,
     8648            tweens: [],
     8649            createTween: function( prop, end ) {
     8650                var tween = jQuery.Tween( elem, animation.opts, prop, end,
     8651                        animation.opts.specialEasing[ prop ] || animation.opts.easing );
     8652                animation.tweens.push( tween );
     8653                return tween;
     8654            },
     8655            stop: function( gotoEnd ) {
     8656                var index = 0,
     8657                    // if we are going to the end, we want to run all the tweens
     8658                    // otherwise we skip this part
     8659                    length = gotoEnd ? animation.tweens.length : 0;
     8660
     8661                for ( ; index < length ; index++ ) {
     8662                    animation.tweens[ index ].run( 1 );
     8663                }
     8664
     8665                // resolve when we played the last frame
     8666                // otherwise, reject
     8667                if ( gotoEnd ) {
     8668                    deferred.resolveWith( elem, [ animation, gotoEnd ] );
     8669                } else {
     8670                    deferred.rejectWith( elem, [ animation, gotoEnd ] );
     8671                }
     8672                return this;
     8673            }
     8674        }),
     8675        props = animation.props;
     8676
     8677    propFilter( props, animation.opts.specialEasing );
     8678
     8679    for ( ; index < length ; index++ ) {
     8680        result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
     8681        if ( result ) {
     8682            return result;
     8683        }
     8684    }
     8685
     8686    createTweens( animation, props );
     8687
     8688    if ( jQuery.isFunction( animation.opts.start ) ) {
     8689        animation.opts.start.call( elem, animation );
     8690    }
     8691
     8692    jQuery.fx.timer(
     8693        jQuery.extend( tick, {
     8694            anim: animation,
     8695            queue: animation.opts.queue,
     8696            elem: elem
     8697        })
     8698    );
     8699
     8700    // attach callbacks from options
     8701    return animation.progress( animation.opts.progress )
     8702        .done( animation.opts.done, animation.opts.complete )
     8703        .fail( animation.opts.fail )
     8704        .always( animation.opts.always );
     8705}
     8706
     8707function propFilter( props, specialEasing ) {
     8708    var index, name, easing, value, hooks;
     8709
     8710    // camelCase, specialEasing and expand cssHook pass
     8711    for ( index in props ) {
     8712        name = jQuery.camelCase( index );
     8713        easing = specialEasing[ name ];
     8714        value = props[ index ];
     8715        if ( jQuery.isArray( value ) ) {
     8716            easing = value[ 1 ];
     8717            value = props[ index ] = value[ 0 ];
     8718        }
     8719
     8720        if ( index !== name ) {
     8721            props[ name ] = value;
     8722            delete props[ index ];
     8723        }
     8724
     8725        hooks = jQuery.cssHooks[ name ];
     8726        if ( hooks && "expand" in hooks ) {
     8727            value = hooks.expand( value );
     8728            delete props[ name ];
     8729
     8730            // not quite $.extend, this wont overwrite keys already present.
     8731            // also - reusing 'index' from above because we have the correct "name"
     8732            for ( index in value ) {
     8733                if ( !( index in props ) ) {
     8734                    props[ index ] = value[ index ];
     8735                    specialEasing[ index ] = easing;
     8736                }
     8737            }
     8738        } else {
     8739            specialEasing[ name ] = easing;
     8740        }
     8741    }
     8742}
     8743
     8744jQuery.Animation = jQuery.extend( Animation, {
     8745
     8746    tweener: function( props, callback ) {
     8747        if ( jQuery.isFunction( props ) ) {
     8748            callback = props;
     8749            props = [ "*" ];
     8750        } else {
     8751            props = props.split(" ");
     8752        }
     8753
     8754        var prop,
     8755            index = 0,
     8756            length = props.length;
     8757
     8758        for ( ; index < length ; index++ ) {
     8759            prop = props[ index ];
     8760            tweeners[ prop ] = tweeners[ prop ] || [];
     8761            tweeners[ prop ].unshift( callback );
     8762        }
     8763    },
     8764
     8765    prefilter: function( callback, prepend ) {
     8766        if ( prepend ) {
     8767            animationPrefilters.unshift( callback );
     8768        } else {
     8769            animationPrefilters.push( callback );
     8770        }
     8771    }
     8772});
     8773
     8774function defaultPrefilter( elem, props, opts ) {
     8775    /*jshint validthis:true */
     8776    var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,
     8777        anim = this,
     8778        style = elem.style,
     8779        orig = {},
     8780        handled = [],
     8781        hidden = elem.nodeType && isHidden( elem );
     8782
     8783    // handle queue: false promises
     8784    if ( !opts.queue ) {
     8785        hooks = jQuery._queueHooks( elem, "fx" );
     8786        if ( hooks.unqueued == null ) {
     8787            hooks.unqueued = 0;
     8788            oldfire = hooks.empty.fire;
     8789            hooks.empty.fire = function() {
     8790                if ( !hooks.unqueued ) {
     8791                    oldfire();
     8792                }
     8793            };
     8794        }
     8795        hooks.unqueued++;
     8796
     8797        anim.always(function() {
     8798            // doing this makes sure that the complete handler will be called
     8799            // before this completes
     8800            anim.always(function() {
     8801                hooks.unqueued--;
     8802                if ( !jQuery.queue( elem, "fx" ).length ) {
     8803                    hooks.empty.fire();
     8804                }
     8805            });
     8806        });
     8807    }
     8808
     8809    // height/width overflow pass
     8810    if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
     8811        // Make sure that nothing sneaks out
     8812        // Record all 3 overflow attributes because IE does not
     8813        // change the overflow attribute when overflowX and
     8814        // overflowY are set to the same value
     8815        opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
     8816
     8817        // Set display property to inline-block for height/width
     8818        // animations on inline elements that are having width/height animated
     8819        if ( jQuery.css( elem, "display" ) === "inline" &&
     8820                jQuery.css( elem, "float" ) === "none" ) {
     8821
     8822            // inline-level elements accept inline-block;
     8823            // block-level elements need to be inline with layout
     8824            if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
     8825                style.display = "inline-block";
     8826
     8827            } else {
     8828                style.zoom = 1;
     8829            }
     8830        }
     8831    }
     8832
     8833    if ( opts.overflow ) {
     8834        style.overflow = "hidden";
     8835        if ( !jQuery.support.shrinkWrapBlocks ) {
     8836            anim.done(function() {
     8837                style.overflow = opts.overflow[ 0 ];
     8838                style.overflowX = opts.overflow[ 1 ];
     8839                style.overflowY = opts.overflow[ 2 ];
     8840            });
     8841        }
     8842    }
     8843
     8844
     8845    // show/hide pass
     8846    for ( index in props ) {
     8847        value = props[ index ];
     8848        if ( rfxtypes.exec( value ) ) {
     8849            delete props[ index ];
     8850            toggle = toggle || value === "toggle";
     8851            if ( value === ( hidden ? "hide" : "show" ) ) {
     8852                continue;
     8853            }
     8854            handled.push( index );
     8855        }
     8856    }
     8857
     8858    length = handled.length;
     8859    if ( length ) {
     8860        dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
     8861        if ( "hidden" in dataShow ) {
     8862            hidden = dataShow.hidden;
     8863        }
     8864
     8865        // store state if its toggle - enables .stop().toggle() to "reverse"
     8866        if ( toggle ) {
     8867            dataShow.hidden = !hidden;
     8868        }
     8869        if ( hidden ) {
     8870            jQuery( elem ).show();
     8871        } else {
     8872            anim.done(function() {
     8873                jQuery( elem ).hide();
     8874            });
     8875        }
     8876        anim.done(function() {
     8877            var prop;
     8878            jQuery._removeData( elem, "fxshow" );
     8879            for ( prop in orig ) {
     8880                jQuery.style( elem, prop, orig[ prop ] );
     8881            }
     8882        });
     8883        for ( index = 0 ; index < length ; index++ ) {
     8884            prop = handled[ index ];
     8885            tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
     8886            orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
     8887
     8888            if ( !( prop in dataShow ) ) {
     8889                dataShow[ prop ] = tween.start;
     8890                if ( hidden ) {
     8891                    tween.end = tween.start;
     8892                    tween.start = prop === "width" || prop === "height" ? 1 : 0;
     8893                }
     8894            }
     8895        }
     8896    }
     8897}
     8898
     8899function Tween( elem, options, prop, end, easing ) {
     8900    return new Tween.prototype.init( elem, options, prop, end, easing );
     8901}
     8902jQuery.Tween = Tween;
     8903
     8904Tween.prototype = {
     8905    constructor: Tween,
     8906    init: function( elem, options, prop, end, easing, unit ) {
     8907        this.elem = elem;
     8908        this.prop = prop;
     8909        this.easing = easing || "swing";
     8910        this.options = options;
     8911        this.start = this.now = this.cur();
     8912        this.end = end;
     8913        this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
     8914    },
     8915    cur: function() {
     8916        var hooks = Tween.propHooks[ this.prop ];
     8917
     8918        return hooks && hooks.get ?
     8919            hooks.get( this ) :
     8920            Tween.propHooks._default.get( this );
     8921    },
     8922    run: function( percent ) {
     8923        var eased,
     8924            hooks = Tween.propHooks[ this.prop ];
     8925
     8926        if ( this.options.duration ) {
     8927            this.pos = eased = jQuery.easing[ this.easing ](
     8928                percent, this.options.duration * percent, 0, 1, this.options.duration
     8929            );
     8930        } else {
     8931            this.pos = eased = percent;
     8932        }
     8933        this.now = ( this.end - this.start ) * eased + this.start;
     8934
     8935        if ( this.options.step ) {
     8936            this.options.step.call( this.elem, this.now, this );
     8937        }
     8938
     8939        if ( hooks && hooks.set ) {
     8940            hooks.set( this );
     8941        } else {
     8942            Tween.propHooks._default.set( this );
     8943        }
     8944        return this;
     8945    }
     8946};
     8947
     8948Tween.prototype.init.prototype = Tween.prototype;
     8949
     8950Tween.propHooks = {
     8951    _default: {
     8952        get: function( tween ) {
     8953            var result;
     8954
     8955            if ( tween.elem[ tween.prop ] != null &&
     8956                (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
     8957                return tween.elem[ tween.prop ];
     8958            }
     8959
     8960            // passing a non empty string as a 3rd parameter to .css will automatically
     8961            // attempt a parseFloat and fallback to a string if the parse fails
     8962            // so, simple values such as "10px" are parsed to Float.
     8963            // complex values such as "rotate(1rad)" are returned as is.
     8964            result = jQuery.css( tween.elem, tween.prop, "auto" );
     8965            // Empty strings, null, undefined and "auto" are converted to 0.
     8966            return !result || result === "auto" ? 0 : result;
     8967        },
     8968        set: function( tween ) {
     8969            // use step hook for back compat - use cssHook if its there - use .style if its
     8970            // available and use plain properties where available
     8971            if ( jQuery.fx.step[ tween.prop ] ) {
     8972                jQuery.fx.step[ tween.prop ]( tween );
     8973            } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
     8974                jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
     8975            } else {
     8976                tween.elem[ tween.prop ] = tween.now;
     8977            }
     8978        }
     8979    }
     8980};
     8981
     8982// Remove in 2.0 - this supports IE8's panic based approach
     8983// to setting things on disconnected nodes
     8984
     8985Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
     8986    set: function( tween ) {
     8987        if ( tween.elem.nodeType && tween.elem.parentNode ) {
     8988            tween.elem[ tween.prop ] = tween.now;
     8989        }
     8990    }
     8991};
     8992
     8993jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
     8994    var cssFn = jQuery.fn[ name ];
     8995    jQuery.fn[ name ] = function( speed, easing, callback ) {
     8996        return speed == null || typeof speed === "boolean" ?
     8997            cssFn.apply( this, arguments ) :
     8998            this.animate( genFx( name, true ), speed, easing, callback );
     8999    };
     9000});
     9001
     9002jQuery.fn.extend({
     9003    fadeTo: function( speed, to, easing, callback ) {
     9004
     9005        // show any hidden elements after setting opacity to 0
     9006        return this.filter( isHidden ).css( "opacity", 0 ).show()
     9007
     9008            // animate to the value specified
     9009            .end().animate({ opacity: to }, speed, easing, callback );
     9010    },
     9011    animate: function( prop, speed, easing, callback ) {
     9012        var empty = jQuery.isEmptyObject( prop ),
     9013            optall = jQuery.speed( speed, easing, callback ),
     9014            doAnimation = function() {
     9015                // Operate on a copy of prop so per-property easing won't be lost
     9016                var anim = Animation( this, jQuery.extend( {}, prop ), optall );
     9017
     9018                // Empty animations resolve immediately
     9019                if ( empty ) {
     9020                    anim.stop( true );
     9021                }
     9022            };
     9023
     9024        return empty || optall.queue === false ?
     9025            this.each( doAnimation ) :
     9026            this.queue( optall.queue, doAnimation );
     9027    },
     9028    stop: function( type, clearQueue, gotoEnd ) {
     9029        var stopQueue = function( hooks ) {
     9030            var stop = hooks.stop;
     9031            delete hooks.stop;
     9032            stop( gotoEnd );
     9033        };
     9034
     9035        if ( typeof type !== "string" ) {
     9036            gotoEnd = clearQueue;
     9037            clearQueue = type;
     9038            type = undefined;
     9039        }
     9040        if ( clearQueue && type !== false ) {
     9041            this.queue( type || "fx", [] );
     9042        }
     9043
     9044        return this.each(function() {
     9045            var dequeue = true,
     9046                index = type != null && type + "queueHooks",
     9047                timers = jQuery.timers,
     9048                data = jQuery._data( this );
     9049
     9050            if ( index ) {
     9051                if ( data[ index ] && data[ index ].stop ) {
     9052                    stopQueue( data[ index ] );
     9053                }
     9054            } else {
     9055                for ( index in data ) {
     9056                    if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
     9057                        stopQueue( data[ index ] );
     9058                    }
     9059                }
     9060            }
     9061
     9062            for ( index = timers.length; index--; ) {
     9063                if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
     9064                    timers[ index ].anim.stop( gotoEnd );
     9065                    dequeue = false;
     9066                    timers.splice( index, 1 );
     9067                }
     9068            }
     9069
     9070            // start the next in the queue if the last step wasn't forced
     9071            // timers currently will call their complete callbacks, which will dequeue
     9072            // but only if they were gotoEnd
     9073            if ( dequeue || !gotoEnd ) {
     9074                jQuery.dequeue( this, type );
     9075            }
     9076        });
     9077    }
     9078});
     9079
     9080// Generate parameters to create a standard animation
     9081function genFx( type, includeWidth ) {
     9082    var which,
     9083        attrs = { height: type },
     9084        i = 0;
     9085
     9086    // if we include width, step value is 1 to do all cssExpand values,
     9087    // if we don't include width, step value is 2 to skip over Left and Right
     9088    includeWidth = includeWidth? 1 : 0;
     9089    for( ; i < 4 ; i += 2 - includeWidth ) {
     9090        which = cssExpand[ i ];
     9091        attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
     9092    }
     9093
     9094    if ( includeWidth ) {
     9095        attrs.opacity = attrs.width = type;
     9096    }
     9097
     9098    return attrs;
     9099}
     9100
     9101// Generate shortcuts for custom animations
     9102jQuery.each({
     9103    slideDown: genFx("show"),
     9104    slideUp: genFx("hide"),
     9105    slideToggle: genFx("toggle"),
     9106    fadeIn: { opacity: "show" },
     9107    fadeOut: { opacity: "hide" },
     9108    fadeToggle: { opacity: "toggle" }
     9109}, function( name, props ) {
     9110    jQuery.fn[ name ] = function( speed, easing, callback ) {
     9111        return this.animate( props, speed, easing, callback );
     9112    };
     9113});
     9114
     9115jQuery.speed = function( speed, easing, fn ) {
     9116    var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
     9117        complete: fn || !fn && easing ||
     9118            jQuery.isFunction( speed ) && speed,
     9119        duration: speed,
     9120        easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
     9121    };
     9122
     9123    opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
     9124        opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
     9125
     9126    // normalize opt.queue - true/undefined/null -> "fx"
     9127    if ( opt.queue == null || opt.queue === true ) {
     9128        opt.queue = "fx";
     9129    }
     9130
     9131    // Queueing
     9132    opt.old = opt.complete;
     9133
     9134    opt.complete = function() {
     9135        if ( jQuery.isFunction( opt.old ) ) {
     9136            opt.old.call( this );
     9137        }
     9138
     9139        if ( opt.queue ) {
     9140            jQuery.dequeue( this, opt.queue );
     9141        }
     9142    };
     9143
     9144    return opt;
     9145};
     9146
     9147jQuery.easing = {
     9148    linear: function( p ) {
     9149        return p;
     9150    },
     9151    swing: function( p ) {
     9152        return 0.5 - Math.cos( p*Math.PI ) / 2;
     9153    }
     9154};
     9155
     9156jQuery.timers = [];
     9157jQuery.fx = Tween.prototype.init;
     9158jQuery.fx.tick = function() {
     9159    var timer,
     9160        timers = jQuery.timers,
     9161        i = 0;
     9162
     9163    fxNow = jQuery.now();
     9164
     9165    for ( ; i < timers.length; i++ ) {
     9166        timer = timers[ i ];
     9167        // Checks the timer has not already been removed
     9168        if ( !timer() && timers[ i ] === timer ) {
     9169            timers.splice( i--, 1 );
     9170        }
     9171    }
     9172
     9173    if ( !timers.length ) {
     9174        jQuery.fx.stop();
     9175    }
     9176    fxNow = undefined;
     9177};
     9178
     9179jQuery.fx.timer = function( timer ) {
     9180    if ( timer() && jQuery.timers.push( timer ) ) {
     9181        jQuery.fx.start();
     9182    }
     9183};
     9184
     9185jQuery.fx.interval = 13;
     9186
     9187jQuery.fx.start = function() {
     9188    if ( !timerId ) {
     9189        timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
     9190    }
     9191};
     9192
     9193jQuery.fx.stop = function() {
     9194    clearInterval( timerId );
     9195    timerId = null;
     9196};
     9197
     9198jQuery.fx.speeds = {
     9199    slow: 600,
     9200    fast: 200,
     9201    // Default speed
     9202    _default: 400
     9203};
     9204
     9205// Back Compat <1.8 extension point
     9206jQuery.fx.step = {};
     9207
     9208if ( jQuery.expr && jQuery.expr.filters ) {
     9209    jQuery.expr.filters.animated = function( elem ) {
     9210        return jQuery.grep(jQuery.timers, function( fn ) {
     9211            return elem === fn.elem;
     9212        }).length;
     9213    };
     9214}
     9215jQuery.fn.offset = function( options ) {
     9216    if ( arguments.length ) {
     9217        return options === undefined ?
     9218            this :
     9219            this.each(function( i ) {
     9220                jQuery.offset.setOffset( this, options, i );
     9221            });
     9222    }
     9223
     9224    var docElem, win,
     9225        box = { top: 0, left: 0 },
     9226        elem = this[ 0 ],
     9227        doc = elem && elem.ownerDocument;
     9228
     9229    if ( !doc ) {
     9230        return;
     9231    }
     9232
     9233    docElem = doc.documentElement;
     9234
     9235    // Make sure it's not a disconnected DOM node
     9236    if ( !jQuery.contains( docElem, elem ) ) {
     9237        return box;
     9238    }
     9239
     9240    // If we don't have gBCR, just use 0,0 rather than error
     9241    // BlackBerry 5, iOS 3 (original iPhone)
     9242    if ( typeof elem.getBoundingClientRect !== "undefined" ) {
     9243        box = elem.getBoundingClientRect();
     9244    }
     9245    win = getWindow( doc );
     9246    return {
     9247        top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
     9248        left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
     9249    };
     9250};
     9251
     9252jQuery.offset = {
     9253
     9254    setOffset: function( elem, options, i ) {
     9255        var position = jQuery.css( elem, "position" );
     9256
     9257        // set position first, in-case top/left are set even on static elem
     9258        if ( position === "static" ) {
     9259            elem.style.position = "relative";
     9260        }
     9261
     9262        var curElem = jQuery( elem ),
     9263            curOffset = curElem.offset(),
     9264            curCSSTop = jQuery.css( elem, "top" ),
     9265            curCSSLeft = jQuery.css( elem, "left" ),
     9266            calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
     9267            props = {}, curPosition = {}, curTop, curLeft;
     9268
     9269        // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
     9270        if ( calculatePosition ) {
     9271            curPosition = curElem.position();
     9272            curTop = curPosition.top;
     9273            curLeft = curPosition.left;
     9274        } else {
     9275            curTop = parseFloat( curCSSTop ) || 0;
     9276            curLeft = parseFloat( curCSSLeft ) || 0;
     9277        }
     9278
     9279        if ( jQuery.isFunction( options ) ) {
     9280            options = options.call( elem, i, curOffset );
     9281        }
     9282
     9283        if ( options.top != null ) {
     9284            props.top = ( options.top - curOffset.top ) + curTop;
     9285        }
     9286        if ( options.left != null ) {
     9287            props.left = ( options.left - curOffset.left ) + curLeft;
     9288        }
     9289
     9290        if ( "using" in options ) {
     9291            options.using.call( elem, props );
     9292        } else {
     9293            curElem.css( props );
     9294        }
     9295    }
     9296};
     9297
     9298
     9299jQuery.fn.extend({
     9300
     9301    position: function() {
     9302        if ( !this[ 0 ] ) {
     9303            return;
     9304        }
     9305
     9306        var offsetParent, offset,
     9307            parentOffset = { top: 0, left: 0 },
     9308            elem = this[ 0 ];
     9309
     9310        // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
     9311        if ( jQuery.css( elem, "position" ) === "fixed" ) {
     9312            // we assume that getBoundingClientRect is available when computed position is fixed
     9313            offset = elem.getBoundingClientRect();
     9314        } else {
     9315            // Get *real* offsetParent
     9316            offsetParent = this.offsetParent();
     9317
     9318            // Get correct offsets
     9319            offset = this.offset();
     9320            if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
     9321                parentOffset = offsetParent.offset();
     9322            }
     9323
     9324            // Add offsetParent borders
     9325            parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
     9326            parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
     9327        }
     9328
     9329        // Subtract parent offsets and element margins
     9330        // note: when an element has margin: auto the offsetLeft and marginLeft
     9331        // are the same in Safari causing offset.left to incorrectly be 0
     9332        return {
     9333            top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
     9334            left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
     9335        };
     9336    },
     9337
     9338    offsetParent: function() {
     9339        return this.map(function() {
     9340            var offsetParent = this.offsetParent || document.documentElement;
     9341            while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
     9342                offsetParent = offsetParent.offsetParent;
     9343            }
     9344            return offsetParent || document.documentElement;
     9345        });
     9346    }
     9347});
     9348
     9349
     9350// Create scrollLeft and scrollTop methods
     9351jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
     9352    var top = /Y/.test( prop );
     9353
     9354    jQuery.fn[ method ] = function( val ) {
     9355        return jQuery.access( this, function( elem, method, val ) {
     9356            var win = getWindow( elem );
     9357
     9358            if ( val === undefined ) {
     9359                return win ? (prop in win) ? win[ prop ] :
     9360                    win.document.documentElement[ method ] :
     9361                    elem[ method ];
     9362            }
     9363
     9364            if ( win ) {
     9365                win.scrollTo(
     9366                    !top ? val : jQuery( win ).scrollLeft(),
     9367                    top ? val : jQuery( win ).scrollTop()
     9368                );
     9369
     9370            } else {
     9371                elem[ method ] = val;
     9372            }
     9373        }, method, val, arguments.length, null );
     9374    };
     9375});
     9376
     9377function getWindow( elem ) {
     9378    return jQuery.isWindow( elem ) ?
     9379        elem :
     9380        elem.nodeType === 9 ?
     9381            elem.defaultView || elem.parentWindow :
     9382            false;
     9383}
     9384// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
     9385jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
     9386    jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
     9387        // margin is only for outerHeight, outerWidth
     9388        jQuery.fn[ funcName ] = function( margin, value ) {
     9389            var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
     9390                extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
     9391
     9392            return jQuery.access( this, function( elem, type, value ) {
     9393                var doc;
     9394
     9395                if ( jQuery.isWindow( elem ) ) {
     9396                    // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
     9397                    // isn't a whole lot we can do. See pull request at this URL for discussion:
     9398                    // https://github.com/jquery/jquery/pull/764
     9399                    return elem.document.documentElement[ "client" + name ];
     9400                }
     9401
     9402                // Get document width or height
     9403                if ( elem.nodeType === 9 ) {
     9404                    doc = elem.documentElement;
     9405
     9406                    // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
     9407                    // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
     9408                    return Math.max(
     9409                        elem.body[ "scroll" + name ], doc[ "scroll" + name ],
     9410                        elem.body[ "offset" + name ], doc[ "offset" + name ],
     9411                        doc[ "client" + name ]
     9412                    );
     9413                }
     9414
     9415                return value === undefined ?
     9416                    // Get width or height on the element, requesting but not forcing parseFloat
     9417                    jQuery.css( elem, type, extra ) :
     9418
     9419                    // Set width or height on the element
     9420                    jQuery.style( elem, type, value, extra );
     9421            }, type, chainable ? margin : undefined, chainable, null );
     9422        };
     9423    });
     9424});
     9425// Limit scope pollution from any deprecated API
     9426// (function() {
     9427
     9428// })();
     9429// Expose jQuery to the global object
     9430window.jQuery = window.$ = jQuery;
     9431
     9432// Expose jQuery as an AMD module, but only for AMD loaders that
     9433// understand the issues with loading multiple versions of jQuery
     9434// in a page that all might call define(). The loader will indicate
     9435// they have special allowances for multiple jQuery versions by
     9436// specifying define.amd.jQuery = true. Register as a named module,
     9437// since jQuery can be concatenated with other files that may use define,
     9438// but not use a proper concatenation script that understands anonymous
     9439// AMD modules. A named AMD is safest and most robust way to register.
     9440// Lowercase jquery is used because AMD module names are derived from
     9441// file names, and jQuery is normally delivered in a lowercase file name.
     9442// Do this after creating the global so that if an AMD module wants to call
     9443// noConflict to hide this version of jQuery, it will work.
     9444if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
     9445    define( "jquery", [], function () { return jQuery; } );
     9446}
     9447
     9448})( window );
    39449jQuery.noConflict();
  • trunk/wp-includes/script-loader.php

    r23074 r23180  
    125125    $scripts->add( 'cropper', '/wp-includes/js/crop/cropper.js', array('scriptaculous-dragdrop') );
    126126
    127     $scripts->add( 'jquery', '/wp-includes/js/jquery/jquery.js', array(), '1.8.3' );
     127    // jQuery
     128    $scripts->add( 'jquery-migrate', '/wp-includes/js/jquery/jquery.js', array(), '1.9.0b1' );
     129    $scripts->add( 'jquery', '/wp-includes/js/jquery/jquery-migrate.js', array( 'jquery-migrate' ), '1.0.0b1' );
    128130
    129131    // full jQuery UI
Note: See TracChangeset for help on using the changeset viewer.