(function(e,p){"object"===typeof module&&"object"===typeof module.exports?module.exports=e.document?p(e,!0):function(e){if(!e.document)throw Error("jQuery requires a window with a document");return p(e)}:p(e)})("undefined"!==typeof window?window:this,function(e,p){function x(a){var b=a.length,f=d.type(a);return"function"===f||d.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===f||0===b||"number"===typeof b&&0<b&&b-1 in a}function c(a,b,f){if(d.isFunction(b))return d.grep(a,function(a,d){return!!b.call(a,
d,a)!==f});if(b.nodeType)return d.grep(a,function(a){return a===b!==f});if("string"===typeof b){if(Gb.test(b))return d.filter(b,a,f);b=d.filter(b,a)}return d.grep(a,function(a){return 0<=d.inArray(a,b)!==f})}function g(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}function h(a){var b=fb[a]={};d.each(a.match(Y)||[],function(a,d){b[d]=!0});return b}function m(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",n,!1),e.removeEventListener("load",n,!1)):(z.detachEvent("onreadystatechange",
n),e.detachEvent("onload",n))}function n(){if(z.addEventListener||"load"===event.type||"complete"===z.readyState)m(),d.ready()}function W(a,b,f){if(void 0===f&&1===a.nodeType)if(f="data-"+b.replace(Hb,"-$1").toLowerCase(),f=a.getAttribute(f),"string"===typeof f){try{f="true"===f?!0:"false"===f?!1:"null"===f?null:+f+""===f?+f:Ib.test(f)?d.parseJSON(f):f}catch(k){}d.data(a,b,f)}else f=void 0;return f}function r(a){for(var b in a)if(("data"!==b||!d.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}
function E(a,b,f,k){if(d.acceptData(a)){var l=d.expando,u=a.nodeType,c=u?d.cache:a,e=u?a[l]:a[l]&&l;if(e&&c[e]&&(k||c[e].data)||void 0!==f||"string"!==typeof b){e||(e=u?a[l]=Z.pop()||d.guid++:l);c[e]||(c[e]=u?{}:{toJSON:d.noop});if("object"===typeof b||"function"===typeof b)k?c[e]=d.extend(c[e],b):c[e].data=d.extend(c[e].data,b);a=c[e];k||(a.data||(a.data={}),a=a.data);void 0!==f&&(a[d.camelCase(b)]=f);"string"===typeof b?(f=a[b],null==f&&(f=a[d.camelCase(b)])):f=a;return f}}}function fa(a,b,f){if(d.acceptData(a)){var k,
l,u=a.nodeType,c=u?d.cache:a,e=u?a[d.expando]:d.expando;if(c[e]){if(b&&(k=f?c[e]:c[e].data)){d.isArray(b)?b=b.concat(d.map(b,d.camelCase)):b in k?b=[b]:(b=d.camelCase(b),b=b in k?[b]:b.split(" "));for(l=b.length;l--;)delete k[b[l]];if(f?!r(k):!d.isEmptyObject(k))return}if(!f&&(delete c[e].data,!r(c[e])))return;u?d.cleanData([a],!0):w.deleteExpando||c!=c.window?delete c[e]:c[e]=null}}}function aa(){return!0}function V(){return!1}function ha(){try{return z.activeElement}catch(a){}}function Aa(a){var b=
gb.split("|");a=a.createDocumentFragment();if(a.createElement)for(;b.length;)a.createElement(b.pop());return a}function N(a,b){var f,k,l=0,u="undefined"!==typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!==typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!u)for(u=[],f=a.childNodes||a;null!=(k=f[l]);l++)!b||d.nodeName(k,b)?u.push(k):d.merge(u,N(k,b));return void 0===b||b&&d.nodeName(a,b)?d.merge([a],u):u}function Ta(a){Ua.test(a.type)&&(a.defaultChecked=a.checked)}
function Ia(a,b){return d.nodeName(a,"table")&&d.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ia(a){a.type=(null!==d.find.attr(a,"type"))+"/"+a.type;return a}function A(a){var b=Jb.exec(a.type);b?a.type=b[1]:a.removeAttribute("type");return a}function R(a,b){for(var f,k=0;null!=(f=a[k]);k++)d._data(f,"globalEval",!b||d._data(b[k],"globalEval"))}function P(a,b){if(1===b.nodeType&&d.hasData(a)){var f,
k,l;k=d._data(a);a=d._data(b,k);var u=k.events;if(u)for(f in delete a.handle,a.events={},u)for(k=0,l=u[f].length;k<l;k++)d.event.add(b,f,u[f][k]);a.data&&(a.data=d.extend({},a.data))}}function I(a,b){var f;a=d(b.createElement(a)).appendTo(b.body);b=e.getDefaultComputedStyle&&(f=e.getDefaultComputedStyle(a[0]))?f.display:d.css(a[0],"display");a.detach();return b}function Ea(a){var b=z,f=hb[a];f||(f=I(a,b),"none"!==f&&f||(na=(na||d("\x3ciframe frameborder\x3d'0' width\x3d'0' height\x3d'0'/\x3e")).appendTo(b.documentElement),
b=(na[0].contentWindow||na[0].contentDocument).document,b.write(),b.close(),f=I(a,b),na.detach()),hb[a]=f);return f}function Fa(a,b){return{get:function(){var f=a();if(null!=f)if(f)delete this.get;else return(this.get=b).apply(this,arguments)}}}function Ba(a,b){if(b in a)return b;for(var f=b.charAt(0).toUpperCase()+b.slice(1),d=b,l=ib.length;l--;)if(b=ib[l]+f,b in a)return b;return d}function O(a,b){for(var f,k,l,u=[],c=0,e=a.length;c<e;c++)k=a[c],k.style&&(u[c]=d._data(k,"olddisplay"),f=k.style.display,
b?(u[c]||"none"!==f||(k.style.display=""),""===k.style.display&&Ca(k)&&(u[c]=d._data(k,"olddisplay",Ea(k.nodeName)))):(l=Ca(k),(f&&"none"!==f||!l)&&d._data(k,"olddisplay",l?f:d.css(k,"display"))));for(c=0;c<e;c++)k=a[c],!k.style||b&&"none"!==k.style.display&&""!==k.style.display||(k.style.display=b?u[c]||"":"none");return a}function va(a,b,f){return(a=Kb.exec(b))?Math.max(0,a[1]-(f||0))+(a[2]||"px"):b}function S(a,b,f,k,l){b=f===(k?"border":"content")?4:"width"===b?1:0;for(var u=0;4>b;b+=2)"margin"===
f&&(u+=d.css(a,f+oa[b],!0,l)),k?("content"===f&&(u-=d.css(a,"padding"+oa[b],!0,l)),"margin"!==f&&(u-=d.css(a,"border"+oa[b]+"Width",!0,l))):(u+=d.css(a,"padding"+oa[b],!0,l),"padding"!==f&&(u+=d.css(a,"border"+oa[b]+"Width",!0,l)));return u}function U(a,b,f){var k=!0,l="width"===b?a.offsetWidth:a.offsetHeight,u=ga(a),c=w.boxSizing&&"border-box"===d.css(a,"boxSizing",!1,u);if(0>=l||null==l){l=pa(a,b,u);if(0>l||null==l)l=a.style[b];if(Ja.test(l))return l;k=c&&(w.boxSizingReliable()||l===a.style[b]);
l=parseFloat(l)||0}return l+S(a,b,f||(c?"border":"content"),k,u)+"px"}function H(a,b,f,d,l){return new H.prototype.init(a,b,f,d,l)}function J(){setTimeout(function(){wa=void 0});return wa=d.now()}function v(a,b){var f,d={height:a},l=0;for(b=b?1:0;4>l;l+=2-b)f=oa[l],d["margin"+f]=d["padding"+f]=a;b&&(d.opacity=d.width=a);return d}function da(a,b,f){for(var d,l=(xa[b]||[]).concat(xa["*"]),c=0,e=l.length;c<e;c++)if(d=l[c].call(f,b,a))return d}function y(a,b){var f,k,l,c,e;for(f in a)if(k=d.camelCase(f),
l=b[k],c=a[f],d.isArray(c)&&(l=c[1],c=a[f]=c[0]),f!==k&&(a[k]=c,delete a[f]),(e=d.cssHooks[k])&&"expand"in e)for(f in c=e.expand(c),delete a[k],c)f in a||(a[f]=c[f],b[f]=l);else b[k]=l}function G(a,b,f){var k,l=0,c=Ka.length,e=d.Deferred().always(function(){delete g.elem}),g=function(){if(k)return!1;for(var b=wa||J(),b=Math.max(0,h.startTime+h.duration-b),f=1-(b/h.duration||0),d=0,l=h.tweens.length;d<l;d++)h.tweens[d].run(f);e.notifyWith(a,[h,f,b]);if(1>f&&l)return b;e.resolveWith(a,[h]);return!1},
h=e.promise({elem:a,props:d.extend({},b),opts:d.extend(!0,{specialEasing:{}},f),originalProperties:b,originalOptions:f,startTime:wa||J(),duration:f.duration,tweens:[],createTween:function(b,f){b=d.Tween(a,h.opts,b,f,h.opts.specialEasing[b]||h.opts.easing);h.tweens.push(b);return b},stop:function(b){var f=0,d=b?h.tweens.length:0;if(k)return this;for(k=!0;f<d;f++)h.tweens[f].run(1);b?e.resolveWith(a,[h,b]):e.rejectWith(a,[h,b]);return this}});f=h.props;for(y(f,h.opts.specialEasing);l<c;l++)if(b=Ka[l].call(h,
a,f,h.opts))return b;d.map(f,da,h);d.isFunction(h.opts.start)&&h.opts.start.call(a,h);d.fx.timer(d.extend(g,{elem:a,anim:h,queue:h.opts.queue}));return h.progress(h.opts.progress).done(h.opts.done,h.opts.complete).fail(h.opts.fail).always(h.opts.always)}function C(a){return function(b,f){"string"!==typeof b&&(f=b,b="*");var k=0,l=b.toLowerCase().match(Y)||[];if(d.isFunction(f))for(;b=l[k++];)"+"===b.charAt(0)?(b=b.slice(1)||"*",(a[b]=a[b]||[]).unshift(f)):(a[b]=a[b]||[]).push(f)}}function D(a,b,f,
k){function l(u){var g;c[u]=!0;d.each(a[u]||[],function(a,d){a=d(b,f,k);if("string"===typeof a&&!e&&!c[a])return b.dataTypes.unshift(a),l(a),!1;if(e)return!(g=a)});return g}var c={},e=a===Va;return l(b.dataTypes[0])||!c["*"]&&l("*")}function L(a,b){var f,k,l=d.ajaxSettings.flatOptions||{};for(k in b)void 0!==b[k]&&((l[k]?a:f||(f={}))[k]=b[k]);f&&d.extend(!0,a,f);return a}function ea(a,b,f,k){var l;if(d.isArray(b))d.each(b,function(b,d){f||Nb.test(a)?k(a,d):ea(a+"["+("object"===typeof d?b:"")+"]",
d,f,k)});else if(f||"object"!==d.type(b))k(a,b);else for(l in b)ea(a+"["+l+"]",b[l],f,k)}function La(){try{return new e.XMLHttpRequest}catch(a){}}function Ga(a){return d.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}var Z=[],ba=Z.slice,jb=Z.concat,Wa=Z.push,kb=Z.indexOf,Ma={},Ob=Ma.toString,ja=Ma.hasOwnProperty,w={},d=function(a,b){return new d.fn.init(a,b)},Pb=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,Qb=/^-ms-/,Rb=/-([\da-z])/gi,Sb=function(a,b){return b.toUpperCase()};d.fn=d.prototype=
{jquery:"1.11.2",constructor:d,selector:"",length:0,toArray:function(){return ba.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:ba.call(this)},pushStack:function(a){a=d.merge(this.constructor(),a);a.prevObject=this;a.context=this.context;return a},each:function(a,b){return d.each(this,a,b)},map:function(a){return this.pushStack(d.map(this,function(b,f){return a.call(b,f,b)}))},slice:function(){return this.pushStack(ba.apply(this,arguments))},first:function(){return this.eq(0)},
last:function(){return this.eq(-1)},eq:function(a){var b=this.length;a=+a+(0>a?b:0);return this.pushStack(0<=a&&a<b?[this[a]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:Wa,sort:Z.sort,splice:Z.splice};d.extend=d.fn.extend=function(){var a,b,f,k,l,c=arguments[0]||{},e=1,g=arguments.length,h=!1;"boolean"===typeof c&&(h=c,c=arguments[e]||{},e++);"object"===typeof c||d.isFunction(c)||(c={});e===g&&(c=this,e--);for(;e<g;e++)if(null!=(l=arguments[e]))for(k in l)a=c[k],f=l[k],
c!==f&&(h&&f&&(d.isPlainObject(f)||(b=d.isArray(f)))?(b?(b=!1,a=a&&d.isArray(a)?a:[]):a=a&&d.isPlainObject(a)?a:{},c[k]=d.extend(h,a,f)):void 0!==f&&(c[k]=f));return c};d.extend({expando:"jQuery"+("1.11.2"+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw Error(a);},noop:function(){},isFunction:function(a){return"function"===d.type(a)},isArray:Array.isArray||function(a){return"array"===d.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!d.isArray(a)&&
0<=a-parseFloat(a)+1},isEmptyObject:function(a){for(var b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==d.type(a)||a.nodeType||d.isWindow(a))return!1;try{if(a.constructor&&!ja.call(a,"constructor")&&!ja.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(f){return!1}if(w.ownLast)for(b in a)return ja.call(a,b);for(b in a);return void 0===b||ja.call(a,b)},type:function(a){return null==a?a+"":"object"===typeof a||"function"===typeof a?Ma[Ob.call(a)]||"object":typeof a},
globalEval:function(a){a&&d.trim(a)&&(e.execScript||function(a){e.eval.call(e,a)})(a)},camelCase:function(a){return a.replace(Qb,"ms-").replace(Rb,Sb)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,f){var d,l=0,c=a.length;d=x(a);if(f)if(d)for(;l<c&&(d=b.apply(a[l],f),!1!==d);l++);else for(l in a){if(d=b.apply(a[l],f),!1===d)break}else if(d)for(;l<c&&(d=b.call(a[l],l,a[l]),!1!==d);l++);else for(l in a)if(d=b.call(a[l],l,a[l]),!1===d)break;return a},
trim:function(a){return null==a?"":(a+"").replace(Pb,"")},makeArray:function(a,b){b=b||[];null!=a&&(x(Object(a))?d.merge(b,"string"===typeof a?[a]:a):Wa.call(b,a));return b},inArray:function(a,b,f){var d;if(b){if(kb)return kb.call(b,a,f);d=b.length;for(f=f?0>f?Math.max(0,d+f):f:0;f<d;f++)if(f in b&&b[f]===a)return f}return-1},merge:function(a,b){for(var f=+b.length,d=0,l=a.length;d<f;)a[l++]=b[d++];if(f!==f)for(;void 0!==b[d];)a[l++]=b[d++];a.length=l;return a},grep:function(a,b,d){for(var f=[],l=
0,c=a.length,e=!d;l<c;l++)d=!b(a[l],l),d!==e&&f.push(a[l]);return f},map:function(a,b,d){var f,l=0,c=a.length,e=[];if(x(a))for(;l<c;l++)f=b(a[l],l,d),null!=f&&e.push(f);else for(l in a)f=b(a[l],l,d),null!=f&&e.push(f);return jb.apply([],e)},guid:1,proxy:function(a,b){var f,k;"string"===typeof b&&(k=a[b],b=a,a=k);if(d.isFunction(a))return f=ba.call(arguments,2),k=function(){return a.apply(b||this,f.concat(ba.call(arguments)))},k.guid=a.guid=a.guid||d.guid++,k},now:function(){return+new Date},support:w});
d.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){Ma["[object "+b+"]"]=b.toLowerCase()});var ya=function(a){function b(a,b,d,f){var k,l,c,u,e;(b?b.ownerDocument||b:E)!==I&&R(b);b=b||I;d=d||[];u=b.nodeType;if("string"!==typeof a||!a||1!==u&&9!==u&&11!==u)return d;if(!f&&H){if(11!==u&&(k=Aa.exec(a)))if(c=k[1])if(9===u)if((l=b.getElementById(c))&&l.parentNode){if(l.id===c)return d.push(l),d}else return d;else{if(b.ownerDocument&&(l=b.ownerDocument.getElementById(c))&&
va(b,l)&&l.id===c)return d.push(l),d}else{if(k[2])return Y.apply(d,b.getElementsByTagName(a)),d;if((c=k[3])&&B.getElementsByClassName)return Y.apply(d,b.getElementsByClassName(c)),d}if(B.qsa&&(!r||!r.test(a))){l=k=Q;c=b;e=1!==u&&a;if(1===u&&"object"!==b.nodeName.toLowerCase()){u=L(a);(k=b.getAttribute("id"))?l=k.replace(Ca,"\\$\x26"):b.setAttribute("id",l);l="[id\x3d'"+l+"'] ";for(c=u.length;c--;)u[c]=l+v(u[c]);c=na.test(a)&&t(b.parentNode)||b;e=u.join(",")}if(e)try{return Y.apply(d,c.querySelectorAll(e)),
d}catch(Bc){}finally{k||b.removeAttribute("id")}}}return S(a.replace(ga,"$1"),b,d,f)}function d(){function a(d,f){b.push(d+" ")>F.cacheLength&&delete a[b.shift()];return a[d+" "]=f}var b=[];return a}function k(a){a[Q]=!0;return a}function l(a){var b=I.createElement("div");try{return!!a(b)}catch(ma){return!1}finally{b.parentNode&&b.parentNode.removeChild(b)}}function c(a,b){var d=a.split("|");for(a=a.length;a--;)F.attrHandle[d[a]]=b}function e(a,b){var d=b&&a,f=d&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||
-2147483648)-(~a.sourceIndex||-2147483648);if(f)return f;if(d)for(;d=d.nextSibling;)if(d===b)return-1;return a?1:-1}function g(a){return function(b){return"input"===b.nodeName.toLowerCase()&&b.type===a}}function h(a){return function(b){var d=b.nodeName.toLowerCase();return("input"===d||"button"===d)&&b.type===a}}function m(a){return k(function(b){b=+b;return k(function(d,f){for(var k,l=a([],d.length,b),c=l.length;c--;)d[k=l[c]]&&(d[k]=!(f[k]=d[k]))})})}function t(a){return a&&"undefined"!==typeof a.getElementsByTagName&&
a}function n(){}function v(a){for(var b=0,d=a.length,f="";b<d;b++)f+=a[b].value;return f}function p(a,b,d){var f=b.dir,k=d&&"parentNode"===f,l=Ea++;return b.first?function(b,d,l){for(;b=b[f];)if(1===b.nodeType||k)return a(b,d,l)}:function(b,d,c){var u,e,g=[ea,l];if(c)for(;b=b[f];){if((1===b.nodeType||k)&&a(b,d,c))return!0}else for(;b=b[f];)if(1===b.nodeType||k){e=b[Q]||(b[Q]={});if((u=e[f])&&u[0]===ea&&u[1]===l)return g[2]=u[2];e[f]=g;if(g[2]=a(b,d,c))return!0}}}function w(a){return 1<a.length?function(b,
d,f){for(var k=a.length;k--;)if(!a[k](b,d,f))return!1;return!0}:a[0]}function y(a,b,d,f,k){for(var l,c=[],u=0,e=a.length,g=null!=b;u<e;u++)if(l=a[u])if(!d||d(l,f,k))c.push(l),g&&b.push(u);return c}function C(a,d,f,l,c,u){l&&!l[Q]&&(l=C(l));c&&!c[Q]&&(c=C(c,u));return k(function(k,u,e,g){var T,h,K=[],ma=[],m=u.length,X;if(!(X=k)){X=d||"*";for(var M=e.nodeType?[e]:e,t=[],Da=0,n=M.length;Da<n;Da++)b(X,M[Da],t);X=t}X=!a||!k&&d?X:y(X,K,a,e,g);M=f?c||(k?a:m||l)?[]:u:X;f&&f(X,M,e,g);if(l)for(T=y(M,ma),l(T,
[],e,g),e=T.length;e--;)if(h=T[e])M[ma[e]]=!(X[ma[e]]=h);if(k){if(c||a){if(c){T=[];for(e=M.length;e--;)(h=M[e])&&T.push(X[e]=h);c(null,M=[],T,g)}for(e=M.length;e--;)(h=M[e])&&-1<(T=c?ba(k,h):K[e])&&(k[T]=!(u[T]=h))}}else M=y(M===u?M.splice(m,M.length):M),c?c(null,u,M,g):Y.apply(u,M)})}function A(a){var b,d,f,k=a.length,l=F.relative[a[0].type];d=l||F.relative[" "];for(var c=l?1:0,u=p(function(a){return a===b},d,!0),e=p(function(a){return-1<ba(b,a)},d,!0),g=[function(a,d,f){a=!l&&(f||d!==U)||((b=d).nodeType?
u(a,d,f):e(a,d,f));b=null;return a}];c<k;c++)if(d=F.relative[a[c].type])g=[p(w(g),d)];else{d=F.filter[a[c].type].apply(null,a[c].matches);if(d[Q]){for(f=++c;f<k&&!F.relative[a[f].type];f++);return C(1<c&&w(g),1<c&&v(a.slice(0,c-1).concat({value:" "===a[c-2].type?"*":""})).replace(ga,"$1"),d,c<f&&A(a.slice(c,f)),f<k&&A(a=a.slice(f)),f<k&&v(a))}g.push(d)}return w(g)}function z(a,d){var f=0<d.length,l=0<a.length,c=function(k,c,u,e,g){var T,h,K,ma=0,m="0",M=k&&[],X=[],t=U,n=k||l&&F.find.TAG("*",g),Da=
ea+=null==t?1:Math.random()||.1,Lb=n.length;for(g&&(U=c!==I&&c);m!==Lb&&null!=(T=n[m]);m++){if(l&&T){for(h=0;K=a[h++];)if(K(T,c,u)){e.push(T);break}g&&(ea=Da)}f&&((T=!K&&T)&&ma--,k&&M.push(T))}ma+=m;if(f&&m!==ma){for(h=0;K=d[h++];)K(M,X,c,u);if(k){if(0<ma)for(;m--;)M[m]||X[m]||(X[m]=fa.call(e));X=y(X)}Y.apply(e,X);g&&!k&&0<X.length&&1<ma+d.length&&b.uniqueSort(e)}g&&(ea=Da,U=t);return M};return f?k(c):c}var da,B,F,D,G,L,W,S,U,P,x,R,I,O,H,r,J,Ba,va,Q="sizzle"+1*new Date,E=a.document,ea=0,Ea=0,Fa=d(),
N=d(),Z=d(),ca=function(a,b){a===b&&(x=!0);return 0},aa={}.hasOwnProperty,V=[],fa=V.pop,La=V.push,Y=V.push,Ga=V.slice,ba=function(a,b){for(var d=0,f=a.length;d<f;d++)if(a[d]===b)return d;return-1},ka="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+".replace("w","w#"),la="\\[[\\x20\\t\\r\\n\\f]*((?:\\\\.|[\\w-]|[^\\x00-\\xa0])+)(?:[\\x20\\t\\r\\n\\f]*([*^$|!~]?\x3d)[\\x20\\t\\r\\n\\f]*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+ka+"))|)[\\x20\\t\\r\\n\\f]*\\]",ia=":((?:\\\\.|[\\w-]|[^\\x00-\\xa0])+)(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+
la+")*)|.*)\\)|)",oa=/[\x20\t\r\n\f]+/g,ga=/^[\x20\t\r\n\f]+|((?:^|[^\\])(?:\\.)*)[\x20\t\r\n\f]+$/g,pa=/^[\x20\t\r\n\f]*,[\x20\t\r\n\f]*/,sa=/^[\x20\t\r\n\f]*([>+~]|[\x20\t\r\n\f])[\x20\t\r\n\f]*/,ta=/=[\x20\t\r\n\f]*([^\]'"]*?)[\x20\t\r\n\f]*\]/g,ua=new RegExp(ia),wa=new RegExp("^"+ka+"$"),ja={ID:/^#((?:\\.|[\w-]|[^\x00-\xa0])+)/,CLASS:/^\.((?:\\.|[\w-]|[^\x00-\xa0])+)/,TAG:new RegExp("^("+"(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+".replace("w","w*")+")"),ATTR:new RegExp("^"+la),PSEUDO:new RegExp("^"+ia),
CHILD:/^:(only|first|last|nth|nth-last)-(child|of-type)(?:\([\x20\t\r\n\f]*(even|odd|(([+-]|)(\d*)n|)[\x20\t\r\n\f]*(?:([+-]|)[\x20\t\r\n\f]*(\d+)|))[\x20\t\r\n\f]*\)|)/i,bool:/^(?:checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$/i,needsContext:/^[\x20\t\r\n\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\([\x20\t\r\n\f]*((?:-\d)?\d*)[\x20\t\r\n\f]*\)|)(?=[^-]|$)/i},ya=/^(?:input|select|textarea|button)$/i,za=/^h\d$/i,ha=
/^[^{]+\{\s*\[native \w/,Aa=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,na=/[+~]/,Ca=/'|\\/g,qa=/\\([\da-f]{1,6}[\x20\t\r\n\f]?|([\x20\t\r\n\f])|.)/ig,ra=function(a,b,d){a="0x"+b-65536;return a!==a||d?b:0>a?String.fromCharCode(a+65536):String.fromCharCode(a>>10|55296,a&1023|56320)},xa=function(){R()};try{Y.apply(V=Ga.call(E.childNodes),E.childNodes),V[E.childNodes.length].nodeType}catch(T){Y={apply:V.length?function(a,b){La.apply(a,Ga.call(b))}:function(a,b){for(var d=a.length,f=0;a[d++]=b[f++];);a.length=
d-1}}}B=b.support={};G=b.isXML=function(a){return(a=a&&(a.ownerDocument||a).documentElement)?"HTML"!==a.nodeName:!1};R=b.setDocument=function(a){var b=a?a.ownerDocument||a:E;if(b===I||9!==b.nodeType||!b.documentElement)return I;I=b;O=b.documentElement;(a=b.defaultView)&&a!==a.top&&(a.addEventListener?a.addEventListener("unload",xa,!1):a.attachEvent&&a.attachEvent("onunload",xa));H=!G(b);B.attributes=l(function(a){a.className="i";return!a.getAttribute("className")});B.getElementsByTagName=l(function(a){a.appendChild(b.createComment(""));
return!a.getElementsByTagName("*").length});B.getElementsByClassName=ha.test(b.getElementsByClassName);B.getById=l(function(a){O.appendChild(a).id=Q;return!b.getElementsByName||!b.getElementsByName(Q).length});B.getById?(F.find.ID=function(a,b){if("undefined"!==typeof b.getElementById&&H)return(a=b.getElementById(a))&&a.parentNode?[a]:[]},F.filter.ID=function(a){var b=a.replace(qa,ra);return function(a){return a.getAttribute("id")===b}}):(delete F.find.ID,F.filter.ID=function(a){var b=a.replace(qa,
ra);return function(a){return(a="undefined"!==typeof a.getAttributeNode&&a.getAttributeNode("id"))&&a.value===b}});F.find.TAG=B.getElementsByTagName?function(a,b){if("undefined"!==typeof b.getElementsByTagName)return b.getElementsByTagName(a);if(B.qsa)return b.querySelectorAll(a)}:function(a,b){var d=[],f=0;b=b.getElementsByTagName(a);if("*"===a){for(;a=b[f++];)1===a.nodeType&&d.push(a);return d}return b};F.find.CLASS=B.getElementsByClassName&&function(a,b){if(H)return b.getElementsByClassName(a)};
J=[];r=[];if(B.qsa=ha.test(b.querySelectorAll))l(function(a){O.appendChild(a).innerHTML="\x3ca id\x3d'"+Q+"'\x3e\x3c/a\x3e\x3cselect id\x3d'"+Q+"-\f]' msallowcapture\x3d''\x3e\x3coption selected\x3d''\x3e\x3c/option\x3e\x3c/select\x3e";a.querySelectorAll("[msallowcapture^\x3d'']").length&&r.push("[*^$]\x3d[\\x20\\t\\r\\n\\f]*(?:''|\"\")");a.querySelectorAll("[selected]").length||r.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)");
a.querySelectorAll("[id~\x3d"+Q+"-]").length||r.push("~\x3d");a.querySelectorAll(":checked").length||r.push(":checked");a.querySelectorAll("a#"+Q+"+*").length||r.push(".#.+[+~]")}),l(function(a){var d=b.createElement("input");d.setAttribute("type","hidden");a.appendChild(d).setAttribute("name","D");a.querySelectorAll("[name\x3dd]").length&&r.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?\x3d");a.querySelectorAll(":enabled").length||r.push(":enabled",":disabled");a.querySelectorAll("*,:x");r.push(",.*:")});
(B.matchesSelector=ha.test(Ba=O.matches||O.webkitMatchesSelector||O.mozMatchesSelector||O.oMatchesSelector||O.msMatchesSelector))&&l(function(a){B.disconnectedMatch=Ba.call(a,"div");Ba.call(a,"[s!\x3d'']:x");J.push("!\x3d",ia)});r=r.length&&new RegExp(r.join("|"));J=J.length&&new RegExp(J.join("|"));va=(a=ha.test(O.compareDocumentPosition))||ha.test(O.contains)?function(a,b){var d=9===a.nodeType?a.documentElement:a;b=b&&b.parentNode;return a===b||!!(b&&1===b.nodeType&&(d.contains?d.contains(b):a.compareDocumentPosition&&
a.compareDocumentPosition(b)&16))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1};ca=a?function(a,d){if(a===d)return x=!0,0;var f=!a.compareDocumentPosition-!d.compareDocumentPosition;if(f)return f;f=(a.ownerDocument||a)===(d.ownerDocument||d)?a.compareDocumentPosition(d):1;return f&1||!B.sortDetached&&d.compareDocumentPosition(a)===f?a===b||a.ownerDocument===E&&va(E,a)?-1:d===b||d.ownerDocument===E&&va(E,d)?1:P?ba(P,a)-ba(P,d):0:f&4?-1:1}:function(a,d){if(a===d)return x=!0,0;
var f=0,k=a.parentNode,l=d.parentNode,c=[a],u=[d];if(!k||!l)return a===b?-1:d===b?1:k?-1:l?1:P?ba(P,a)-ba(P,d):0;if(k===l)return e(a,d);for(;a=a.parentNode;)c.unshift(a);for(a=d;a=a.parentNode;)u.unshift(a);for(;c[f]===u[f];)f++;return f?e(c[f],u[f]):c[f]===E?-1:u[f]===E?1:0};return b};b.matches=function(a,d){return b(a,null,null,d)};b.matchesSelector=function(a,d){(a.ownerDocument||a)!==I&&R(a);d=d.replace(ta,"\x3d'$1']");if(!(!B.matchesSelector||!H||J&&J.test(d)||r&&r.test(d)))try{var f=Ba.call(a,
d);if(f||B.disconnectedMatch||a.document&&11!==a.document.nodeType)return f}catch(Da){}return 0<b(d,I,null,[a]).length};b.contains=function(a,b){(a.ownerDocument||a)!==I&&R(a);return va(a,b)};b.attr=function(a,b){(a.ownerDocument||a)!==I&&R(a);var d=F.attrHandle[b.toLowerCase()],d=d&&aa.call(F.attrHandle,b.toLowerCase())?d(a,b,!H):void 0;return void 0!==d?d:B.attributes||!H?a.getAttribute(b):(d=a.getAttributeNode(b))&&d.specified?d.value:null};b.error=function(a){throw Error("Syntax error, unrecognized expression: "+
a);};b.uniqueSort=function(a){var b,d=[],f=0,k=0;x=!B.detectDuplicates;P=!B.sortStable&&a.slice(0);a.sort(ca);if(x){for(;b=a[k++];)b===a[k]&&(f=d.push(k));for(;f--;)a.splice(d[f],1)}P=null;return a};D=b.getText=function(a){var b,d="",f=0;b=a.nodeType;if(!b)for(;b=a[f++];)d+=D(b);else if(1===b||9===b||11===b){if("string"===typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)d+=D(a)}else if(3===b||4===b)return a.nodeValue;return d};F=b.selectors={cacheLength:50,createPseudo:k,
match:ja,attrHandle:{},find:{},relative:{"\x3e":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){a[1]=a[1].replace(qa,ra);a[3]=(a[3]||a[4]||a[5]||"").replace(qa,ra);"~\x3d"===a[2]&&(a[3]=" "+a[3]+" ");return a.slice(0,4)},CHILD:function(a){a[1]=a[1].toLowerCase();"nth"===a[1].slice(0,3)?(a[3]||b.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&
b.error(a[0]);return a},PSEUDO:function(a){var b,d=!a[6]&&a[2];if(ja.CHILD.test(a[0]))return null;a[3]?a[2]=a[4]||a[5]||"":d&&ua.test(d)&&(b=L(d,!0))&&(b=d.indexOf(")",d.length-b)-d.length)&&(a[0]=a[0].slice(0,b),a[2]=d.slice(0,b));return a.slice(0,3)}},filter:{TAG:function(a){var b=a.replace(qa,ra).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=Fa[a+" "];return b||(b=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+a+"([\\x20\\t\\r\\n\\f]|$)"),
Fa(a,function(a){return b.test("string"===typeof a.className&&a.className||"undefined"!==typeof a.getAttribute&&a.getAttribute("class")||"")}))},ATTR:function(a,d,f){return function(k){k=b.attr(k,a);if(null==k)return"!\x3d"===d;if(!d)return!0;k+="";return"\x3d"===d?k===f:"!\x3d"===d?k!==f:"^\x3d"===d?f&&0===k.indexOf(f):"*\x3d"===d?f&&-1<k.indexOf(f):"$\x3d"===d?f&&k.slice(-f.length)===f:"~\x3d"===d?-1<(" "+k.replace(oa," ")+" ").indexOf(f):"|\x3d"===d?k===f||k.slice(0,f.length+1)===f+"-":!1}},CHILD:function(a,
b,d,f,k){var l="nth"!==a.slice(0,3),c="last"!==a.slice(-4),u="of-type"===b;return 1===f&&0===k?function(a){return!!a.parentNode}:function(b,d,e){var g,h,K,m,M;d=l!==c?"nextSibling":"previousSibling";var t=b.parentNode,T=u&&b.nodeName.toLowerCase();e=!e&&!u;if(t){if(l){for(;d;){for(h=b;h=h[d];)if(u?h.nodeName.toLowerCase()===T:1===h.nodeType)return!1;M=d="only"===a&&!M&&"nextSibling"}return!0}M=[c?t.firstChild:t.lastChild];if(c&&e)for(e=t[Q]||(t[Q]={}),g=e[a]||[],m=g[0]===ea&&g[1],K=g[0]===ea&&g[2],
h=m&&t.childNodes[m];h=++m&&h&&h[d]||(K=m=0)||M.pop();){if(1===h.nodeType&&++K&&h===b){e[a]=[ea,m,K];break}}else if(e&&(g=(b[Q]||(b[Q]={}))[a])&&g[0]===ea)K=g[1];else for(;(h=++m&&h&&h[d]||(K=m=0)||M.pop())&&((u?h.nodeName.toLowerCase()!==T:1!==h.nodeType)||!++K||(e&&((h[Q]||(h[Q]={}))[a]=[ea,K]),h!==b)););K-=k;return K===f||0===K%f&&0<=K/f}}},PSEUDO:function(a,d){var f,l=F.pseudos[a]||F.setFilters[a.toLowerCase()]||b.error("unsupported pseudo: "+a);return l[Q]?l(d):1<l.length?(f=[a,a,"",d],F.setFilters.hasOwnProperty(a.toLowerCase())?
k(function(a,b){for(var f,k=l(a,d),c=k.length;c--;)f=ba(a,k[c]),a[f]=!(b[f]=k[c])}):function(a){return l(a,0,f)}):l}},pseudos:{not:k(function(a){var b=[],d=[],f=W(a.replace(ga,"$1"));return f[Q]?k(function(a,b,d,k){k=f(a,null,k,[]);for(var l=a.length;l--;)if(d=k[l])a[l]=!(b[l]=d)}):function(a,k,l){b[0]=a;f(b,null,l,d);b[0]=null;return!d.pop()}}),has:k(function(a){return function(d){return 0<b(a,d).length}}),contains:k(function(a){a=a.replace(qa,ra);return function(b){return-1<(b.textContent||b.innerText||
D(b)).indexOf(a)}}),lang:k(function(a){wa.test(a||"")||b.error("unsupported lang: "+a);a=a.replace(qa,ra).toLowerCase();return function(b){var d;do if(d=H?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return d=d.toLowerCase(),d===a||0===d.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var d=a.location&&a.location.hash;return d&&d.slice(1)===b.id},root:function(a){return a===O},focus:function(a){return a===I.activeElement&&(!I.hasFocus||I.hasFocus())&&
!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return!1===a.disabled},disabled:function(a){return!0===a.disabled},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return!0===a.selected},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(6>a.nodeType)return!1;return!0},parent:function(a){return!F.pseudos.empty(a)},header:function(a){return za.test(a.nodeName)},input:function(a){return ya.test(a.nodeName)},
button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:m(function(){return[0]}),last:m(function(a,b){return[b-1]}),eq:m(function(a,b,d){return[0>d?d+b:d]}),even:m(function(a,b){for(var d=0;d<b;d+=2)a.push(d);return a}),odd:m(function(a,b){for(var d=1;d<b;d+=2)a.push(d);return a}),lt:m(function(a,b,d){for(b=
0>d?d+b:d;0<=--b;)a.push(b);return a}),gt:m(function(a,b,d){for(d=0>d?d+b:d;++d<b;)a.push(d);return a})}};F.pseudos.nth=F.pseudos.eq;for(da in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})F.pseudos[da]=g(da);for(da in{submit:!0,reset:!0})F.pseudos[da]=h(da);n.prototype=F.filters=F.pseudos;F.setFilters=new n;L=b.tokenize=function(a,d){var f,k,l,c,u,e,g;if(u=N[a+" "])return d?0:u.slice(0);u=a;e=[];for(g=F.preFilter;u;){if(!f||(k=pa.exec(u)))k&&(u=u.slice(k[0].length)||u),e.push(l=[]);f=!1;if(k=
sa.exec(u))f=k.shift(),l.push({value:f,type:k[0].replace(ga," ")}),u=u.slice(f.length);for(c in F.filter)!(k=ja[c].exec(u))||g[c]&&!(k=g[c](k))||(f=k.shift(),l.push({value:f,type:c,matches:k}),u=u.slice(f.length));if(!f)break}return d?u.length:u?b.error(a):N(a,e).slice(0)};W=b.compile=function(a,b){var d,f=[],k=[],l=Z[a+" "];if(!l){b||(b=L(a));for(d=b.length;d--;)l=A(b[d]),l[Q]?f.push(l):k.push(l);l=Z(a,z(k,f));l.selector=a}return l};S=b.select=function(a,b,d,f){var k,l,c,u,e="function"===typeof a&&
a,g=!f&&L(a=e.selector||a);d=d||[];if(1===g.length){l=g[0]=g[0].slice(0);if(2<l.length&&"ID"===(c=l[0]).type&&B.getById&&9===b.nodeType&&H&&F.relative[l[1].type]){b=(F.find.ID(c.matches[0].replace(qa,ra),b)||[])[0];if(!b)return d;e&&(b=b.parentNode);a=a.slice(l.shift().value.length)}for(k=ja.needsContext.test(a)?0:l.length;k--;){c=l[k];if(F.relative[u=c.type])break;if(u=F.find[u])if(f=u(c.matches[0].replace(qa,ra),na.test(l[0].type)&&t(b.parentNode)||b)){l.splice(k,1);a=f.length&&v(l);if(!a)return Y.apply(d,
f),d;break}}}(e||W(a,g))(f,b,!H,d,na.test(a)&&t(b.parentNode)||b);return d};B.sortStable=Q.split("").sort(ca).join("")===Q;B.detectDuplicates=!!x;R();B.sortDetached=l(function(a){return a.compareDocumentPosition(I.createElement("div"))&1});l(function(a){a.innerHTML="\x3ca href\x3d'#'\x3e\x3c/a\x3e";return"#"===a.firstChild.getAttribute("href")})||c("type|href|height|width",function(a,b,d){if(!d)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)});B.attributes&&l(function(a){a.innerHTML="\x3cinput/\x3e";
a.firstChild.setAttribute("value","");return""===a.firstChild.getAttribute("value")})||c("value",function(a,b,d){if(!d&&"input"===a.nodeName.toLowerCase())return a.defaultValue});l(function(a){return null==a.getAttribute("disabled")})||c("checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",function(a,b,d){var f;if(!d)return!0===a[b]?b.toLowerCase():(f=a.getAttributeNode(b))&&f.specified?f.value:null});return b}(e);d.find=ya;d.expr=
ya.selectors;d.expr[":"]=d.expr.pseudos;d.unique=ya.uniqueSort;d.text=ya.getText;d.isXMLDoc=ya.isXML;d.contains=ya.contains;var lb=d.expr.match.needsContext,mb=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,Gb=/^.[^:#\[\.,]*$/;d.filter=function(a,b,f){var k=b[0];f&&(a=":not("+a+")");return 1===b.length&&1===k.nodeType?d.find.matchesSelector(k,a)?[k]:[]:d.find.matches(a,d.grep(b,function(a){return 1===a.nodeType}))};d.fn.extend({find:function(a){var b,f=[],k=this,l=k.length;if("string"!==typeof a)return this.pushStack(d(a).filter(function(){for(b=
0;b<l;b++)if(d.contains(k[b],this))return!0}));for(b=0;b<l;b++)d.find(a,k[b],f);f=this.pushStack(1<l?d.unique(f):f);f.selector=this.selector?this.selector+" "+a:a;return f},filter:function(a){return this.pushStack(c(this,a||[],!1))},not:function(a){return this.pushStack(c(this,a||[],!0))},is:function(a){return!!c(this,"string"===typeof a&&lb.test(a)?d(a):a||[],!1).length}});var Ha,z=e.document,Vb=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/;(d.fn.init=function(a,b){var f;if(!a)return this;if("string"===
typeof a){f="\x3c"===a.charAt(0)&&"\x3e"===a.charAt(a.length-1)&&3<=a.length?[null,a,null]:Vb.exec(a);if(!f||!f[1]&&b)return!b||b.jquery?(b||Ha).find(a):this.constructor(b).find(a);if(f[1]){if(b=b instanceof d?b[0]:b,d.merge(this,d.parseHTML(f[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),mb.test(f[1])&&d.isPlainObject(b))for(f in b)if(d.isFunction(this[f]))this[f](b[f]);else this.attr(f,b[f])}else{if((b=z.getElementById(f[2]))&&b.parentNode){if(b.id!==f[2])return Ha.find(a);this.length=1;this[0]=b}this.context=
z;this.selector=a}return this}if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(d.isFunction(a))return"undefined"!==typeof Ha.ready?Ha.ready(a):a(d);void 0!==a.selector&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)}).prototype=d.fn;Ha=d(z);var Wb=/^(?:parents|prev(?:Until|All))/,Xb={children:!0,contents:!0,next:!0,prev:!0};d.extend({dir:function(a,b,f){var k=[];for(a=a[b];a&&9!==a.nodeType&&(void 0===f||1!==a.nodeType||!d(a).is(f));)1===a.nodeType&&
k.push(a),a=a[b];return k},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&d.push(a);return d}});d.fn.extend({has:function(a){var b,f=d(a,this),k=f.length;return this.filter(function(){for(b=0;b<k;b++)if(d.contains(this,f[b]))return!0})},closest:function(a,b){for(var f,k=0,l=this.length,c=[],e=lb.test(a)||"string"!==typeof a?d(a,b||this.context):0;k<l;k++)for(f=this[k];f&&f!==b;f=f.parentNode)if(11>f.nodeType&&(e?-1<e.index(f):1===f.nodeType&&d.find.matchesSelector(f,a))){c.push(f);
break}return this.pushStack(1<c.length?d.unique(c):c)},index:function(a){return a?"string"===typeof a?d.inArray(this[0],d(a)):d.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(d.unique(d.merge(this.get(),d(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});d.each({parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},parents:function(a){return d.dir(a,"parentNode")},
parentsUntil:function(a,b,f){return d.dir(a,"parentNode",f)},next:function(a){return g(a,"nextSibling")},prev:function(a){return g(a,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,f){return d.dir(a,"nextSibling",f)},prevUntil:function(a,b,f){return d.dir(a,"previousSibling",f)},siblings:function(a){return d.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return d.sibling(a.firstChild)},
contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.merge([],a.childNodes)}},function(a,b){d.fn[a]=function(f,k){var l=d.map(this,b,f);"Until"!==a.slice(-5)&&(k=f);k&&"string"===typeof k&&(l=d.filter(k,l));1<this.length&&(Xb[a]||(l=d.unique(l)),Wb.test(a)&&(l=l.reverse()));return this.pushStack(l)}});var Y=/\S+/g,fb={};d.Callbacks=function(a){a="string"===typeof a?fb[a]||h(a):d.extend({},a);var b,f,k,l,c,e,g=[],m=!a.once&&[],n=function(d){f=a.memory&&d;
k=!0;c=e||0;e=0;l=g.length;for(b=!0;g&&c<l;c++)if(!1===g[c].apply(d[0],d[1])&&a.stopOnFalse){f=!1;break}b=!1;g&&(m?m.length&&n(m.shift()):f?g=[]:t.disable())},t={add:function(){if(g){var k=g.length;(function Ub(b){d.each(b,function(b,f){b=d.type(f);"function"===b?a.unique&&t.has(f)||g.push(f):f&&f.length&&"string"!==b&&Ub(f)})})(arguments);b?l=g.length:f&&(e=k,n(f))}return this},remove:function(){g&&d.each(arguments,function(a,f){for(var k;-1<(k=d.inArray(f,g,k));)g.splice(k,1),b&&(k<=l&&l--,k<=c&&
c--)});return this},has:function(a){return a?-1<d.inArray(a,g):!(!g||!g.length)},empty:function(){g=[];l=0;return this},disable:function(){g=m=f=void 0;return this},disabled:function(){return!g},lock:function(){m=void 0;f||t.disable();return this},locked:function(){return!m},fireWith:function(a,d){!g||k&&!m||(d=d||[],d=[a,d.slice?d.slice():d],b?m.push(d):n(d));return this},fire:function(){t.fireWith(this,arguments);return this},fired:function(){return!!k}};return t};d.extend({Deferred:function(a){var b=
[["resolve","done",d.Callbacks("once memory"),"resolved"],["reject","fail",d.Callbacks("once memory"),"rejected"],["notify","progress",d.Callbacks("memory")]],f="pending",k={state:function(){return f},always:function(){l.done(arguments).fail(arguments);return this},then:function(){var a=arguments;return d.Deferred(function(f){d.each(b,function(b,c){var e=d.isFunction(a[b])&&a[b];l[c[1]](function(){var a=e&&e.apply(this,arguments);if(a&&d.isFunction(a.promise))a.promise().done(f.resolve).fail(f.reject).progress(f.notify);
else f[c[0]+"With"](this===k?f.promise():this,e?[a]:arguments)})});a=null}).promise()},promise:function(a){return null!=a?d.extend(a,k):k}},l={};k.pipe=k.then;d.each(b,function(a,d){var c=d[2],e=d[3];k[d[1]]=c.add;e&&c.add(function(){f=e},b[a^1][2].disable,b[2][2].lock);l[d[0]]=function(){l[d[0]+"With"](this===l?k:this,arguments);return this};l[d[0]+"With"]=c.fireWith});k.promise(l);a&&a.call(l,l);return l},when:function(a){var b=0,f=ba.call(arguments),k=f.length,l=1!==k||a&&d.isFunction(a.promise)?
k:0,c=1===l?a:d.Deferred(),e=function(a,b,d){return function(f){b[a]=this;d[a]=1<arguments.length?ba.call(arguments):f;d===g?c.notifyWith(b,d):--l||c.resolveWith(b,d)}},g,h,m;if(1<k)for(g=Array(k),h=Array(k),m=Array(k);b<k;b++)f[b]&&d.isFunction(f[b].promise)?f[b].promise().done(e(b,m,f)).fail(c.reject).progress(e(b,h,g)):--l;l||c.resolveWith(m,f);return c.promise()}});var Na;d.fn.ready=function(a){d.ready.promise().done(a);return this};d.extend({isReady:!1,readyWait:1,holdReady:function(a){a?d.readyWait++:
d.ready(!0)},ready:function(a){if(!0===a?!--d.readyWait:!d.isReady){if(!z.body)return setTimeout(d.ready);d.isReady=!0;!0!==a&&0<--d.readyWait||(Na.resolveWith(z,[d]),d.fn.triggerHandler&&(d(z).triggerHandler("ready"),d(z).off("ready")))}}});d.ready.promise=function(a){if(!Na)if(Na=d.Deferred(),"complete"===z.readyState)setTimeout(d.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",n,!1),e.addEventListener("load",n,!1);else{z.attachEvent("onreadystatechange",n);e.attachEvent("onload",
n);var b=!1;try{b=null==e.frameElement&&z.documentElement}catch(f){}b&&b.doScroll&&function k(){if(!d.isReady){try{b.doScroll("left")}catch(l){return setTimeout(k,50)}m();d.ready()}}()}return Na.promise(a)};for(var Yb in d(w))break;w.ownLast="0"!==Yb;w.inlineBlockNeedsLayout=!1;d(function(){var a,b,d;(b=z.getElementsByTagName("body")[0])&&b.style&&(a=z.createElement("div"),d=z.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",b.appendChild(d).appendChild(a),
"undefined"!==typeof a.style.zoom&&(a.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",w.inlineBlockNeedsLayout=a=3===a.offsetWidth)&&(b.style.zoom=1),b.removeChild(d))});(function(){var a=z.createElement("div");if(null==w.deleteExpando){w.deleteExpando=!0;try{delete a.test}catch(b){w.deleteExpando=!1}}})();d.acceptData=function(a){var b=d.noData[(a.nodeName+" ").toLowerCase()],f=+a.nodeType||1;return 1!==f&&9!==f?!1:!b||!0!==b&&a.getAttribute("classid")===b};var Ib=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
Hb=/([A-Z])/g;d.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){a=a.nodeType?d.cache[a[d.expando]]:a[d.expando];return!!a&&!r(a)},data:function(a,b,d){return E(a,b,d)},removeData:function(a,b){return fa(a,b)},_data:function(a,b,d){return E(a,b,d,!0)},_removeData:function(a,b){return fa(a,b,!0)}});d.fn.extend({data:function(a,b){var f,k,c,e=this[0],g=e&&e.attributes;if(void 0===a){if(this.length&&(c=d.data(e),1===e.nodeType&&
!d._data(e,"parsedAttrs"))){for(f=g.length;f--;)g[f]&&(k=g[f].name,0===k.indexOf("data-")&&(k=d.camelCase(k.slice(5)),W(e,k,c[k])));d._data(e,"parsedAttrs",!0)}return c}return"object"===typeof a?this.each(function(){d.data(this,a)}):1<arguments.length?this.each(function(){d.data(this,a,b)}):e?W(e,a,d.data(e,a)):void 0},removeData:function(a){return this.each(function(){d.removeData(this,a)})}});d.extend({queue:function(a,b,f){var k;if(a)return b=(b||"fx")+"queue",k=d._data(a,b),f&&(!k||d.isArray(f)?
k=d._data(a,b,d.makeArray(f)):k.push(f)),k||[]},dequeue:function(a,b){b=b||"fx";var f=d.queue(a,b),k=f.length,c=f.shift(),e=d._queueHooks(a,b),g=function(){d.dequeue(a,b)};"inprogress"===c&&(c=f.shift(),k--);c&&("fx"===b&&f.unshift("inprogress"),delete e.stop,c.call(a,g,e));!k&&e&&e.empty.fire()},_queueHooks:function(a,b){var f=b+"queueHooks";return d._data(a,f)||d._data(a,f,{empty:d.Callbacks("once memory").add(function(){d._removeData(a,b+"queue");d._removeData(a,f)})})}});d.fn.extend({queue:function(a,
b){var f=2;"string"!==typeof a&&(b=a,a="fx",f--);return arguments.length<f?d.queue(this[0],a):void 0===b?this:this.each(function(){var f=d.queue(this,a,b);d._queueHooks(this,a);"fx"===a&&"inprogress"!==f[0]&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var f,k=1,c=d.Deferred(),e=this,g=this.length,h=function(){--k||c.resolveWith(e,[e])};"string"!==typeof a&&(b=a,a=void 0);for(a=
a||"fx";g--;)(f=d._data(e[g],a+"queueHooks"))&&f.empty&&(k++,f.empty.add(h));h();return c.promise(b)}});var Oa=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,oa=["Top","Right","Bottom","Left"],Ca=function(a,b){a=b||a;return"none"===d.css(a,"display")||!d.contains(a.ownerDocument,a)},sa=d.access=function(a,b,f,k,c,e,g){var l=0,u=a.length,h=null==f;if("object"===d.type(f))for(l in c=!0,f)d.access(a,b,l,f[l],!0,e,g);else if(void 0!==k&&(c=!0,d.isFunction(k)||(g=!0),h&&(g?(b.call(a,k),b=null):(h=b,b=function(a,
b,f){return h.call(d(a),f)})),b))for(;l<u;l++)b(a[l],f,g?k:k.call(a[l],l,b(a[l],f)));return c?a:h?b.call(a):u?b(a[0],f):e},Ua=/^(?:checkbox|radio)$/i;(function(){var a=z.createElement("input"),b=z.createElement("div"),d=z.createDocumentFragment();b.innerHTML="  \x3clink/\x3e\x3ctable\x3e\x3c/table\x3e\x3ca href\x3d'/a'\x3ea\x3c/a\x3e\x3cinput type\x3d'checkbox'/\x3e";w.leadingWhitespace=3===b.firstChild.nodeType;w.tbody=!b.getElementsByTagName("tbody").length;w.htmlSerialize=!!b.getElementsByTagName("link").length;
w.html5Clone="\x3c:nav\x3e\x3c/:nav\x3e"!==z.createElement("nav").cloneNode(!0).outerHTML;a.type="checkbox";a.checked=!0;d.appendChild(a);w.appendChecked=a.checked;b.innerHTML="\x3ctextarea\x3ex\x3c/textarea\x3e";w.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue;d.appendChild(b);b.innerHTML="\x3cinput type\x3d'radio' checked\x3d'checked' name\x3d't'/\x3e";w.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked;w.noCloneEvent=!0;b.attachEvent&&(b.attachEvent("onclick",function(){w.noCloneEvent=
!1}),b.cloneNode(!0).click());if(null==w.deleteExpando){w.deleteExpando=!0;try{delete b.test}catch(k){w.deleteExpando=!1}}})();(function(){var a,b,d=z.createElement("div");for(a in{submit:!0,change:!0,focusin:!0})b="on"+a,(w[a+"Bubbles"]=b in e)||(d.setAttribute(b,"t"),w[a+"Bubbles"]=!1===d.attributes[b].expando)})();var Xa=/^(?:input|select|textarea)$/i,Zb=/^key/,$b=/^(?:mouse|pointer|contextmenu)|click/,nb=/^(?:focusinfocus|focusoutblur)$/,ob=/^([^.]*)(?:\.(.+)|)$/;d.event={global:{},add:function(a,
b,f,k,c){var l,e,g,h,m,t,n,v,p;if(g=d._data(a)){f.handler&&(h=f,f=h.handler,c=h.selector);f.guid||(f.guid=d.guid++);(e=g.events)||(e=g.events={});(m=g.handle)||(m=g.handle=function(a){return"undefined"===typeof d||a&&d.event.triggered===a.type?void 0:d.event.dispatch.apply(m.elem,arguments)},m.elem=a);b=(b||"").match(Y)||[""];for(g=b.length;g--;)l=ob.exec(b[g])||[],v=t=l[1],p=(l[2]||"").split(".").sort(),v&&(l=d.event.special[v]||{},v=(c?l.delegateType:l.bindType)||v,l=d.event.special[v]||{},t=d.extend({type:v,
origType:t,data:k,handler:f,guid:f.guid,selector:c,needsContext:c&&d.expr.match.needsContext.test(c),namespace:p.join(".")},h),(n=e[v])||(n=e[v]=[],n.delegateCount=0,l.setup&&!1!==l.setup.call(a,k,p,m)||(a.addEventListener?a.addEventListener(v,m,!1):a.attachEvent&&a.attachEvent("on"+v,m))),l.add&&(l.add.call(a,t),t.handler.guid||(t.handler.guid=f.guid)),c?n.splice(n.delegateCount++,0,t):n.push(t),d.event.global[v]=!0);a=null}},remove:function(a,b,f,k,c){var l,e,g,h,m,t,n,v,p,y,w,C=d.hasData(a)&&d._data(a);
if(C&&(t=C.events)){b=(b||"").match(Y)||[""];for(m=b.length;m--;)if(g=ob.exec(b[m])||[],p=w=g[1],y=(g[2]||"").split(".").sort(),p){n=d.event.special[p]||{};p=(k?n.delegateType:n.bindType)||p;v=t[p]||[];g=g[2]&&new RegExp("(^|\\.)"+y.join("\\.(?:.*\\.|)")+"(\\.|$)");for(h=l=v.length;l--;)e=v[l],!c&&w!==e.origType||f&&f.guid!==e.guid||g&&!g.test(e.namespace)||k&&k!==e.selector&&("**"!==k||!e.selector)||(v.splice(l,1),e.selector&&v.delegateCount--,n.remove&&n.remove.call(a,e));h&&!v.length&&(n.teardown&&
!1!==n.teardown.call(a,y,C.handle)||d.removeEvent(a,p,C.handle),delete t[p])}else for(p in t)d.event.remove(a,p+b[m],f,k,!0);d.isEmptyObject(t)&&(delete C.handle,d._removeData(a,"events"))}},trigger:function(a,b,f,k){var c,g,h,m,n,v,t=[f||z],p=ja.call(a,"type")?a.type:a;n=ja.call(a,"namespace")?a.namespace.split("."):[];h=c=f=f||z;if(3!==f.nodeType&&8!==f.nodeType&&!nb.test(p+d.event.triggered)&&(0<=p.indexOf(".")&&(n=p.split("."),p=n.shift(),n.sort()),g=0>p.indexOf(":")&&"on"+p,a=a[d.expando]?a:
new d.Event(p,"object"===typeof a&&a),a.isTrigger=k?2:3,a.namespace=n.join("."),a.namespace_re=a.namespace?new RegExp("(^|\\.)"+n.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,a.result=void 0,a.target||(a.target=f),b=null==b?[a]:d.makeArray(b,[a]),n=d.event.special[p]||{},k||!n.trigger||!1!==n.trigger.apply(f,b))){if(!k&&!n.noBubble&&!d.isWindow(f)){m=n.delegateType||p;nb.test(m+p)||(h=h.parentNode);for(;h;h=h.parentNode)t.push(h),c=h;c===(f.ownerDocument||z)&&t.push(c.defaultView||c.parentWindow||e)}for(v=
0;(h=t[v++])&&!a.isPropagationStopped();)a.type=1<v?m:n.bindType||p,(c=(d._data(h,"events")||{})[a.type]&&d._data(h,"handle"))&&c.apply(h,b),(c=g&&h[g])&&c.apply&&d.acceptData(h)&&(a.result=c.apply(h,b),!1===a.result&&a.preventDefault());a.type=p;if(!(k||a.isDefaultPrevented()||n._default&&!1!==n._default.apply(t.pop(),b))&&d.acceptData(f)&&g&&f[p]&&!d.isWindow(f)){(c=f[g])&&(f[g]=null);d.event.triggered=p;try{f[p]()}catch(Mb){}d.event.triggered=void 0;c&&(f[g]=c)}return a.result}},dispatch:function(a){a=
d.event.fix(a);var b,f,k,c,e,g=ba.call(arguments);b=(d._data(this,"events")||{})[a.type]||[];var h=d.event.special[a.type]||{};g[0]=a;a.delegateTarget=this;if(!h.preDispatch||!1!==h.preDispatch.call(this,a)){e=d.event.handlers.call(this,a,b);for(b=0;(k=e[b++])&&!a.isPropagationStopped();)for(a.currentTarget=k.elem,c=0;(f=k.handlers[c++])&&!a.isImmediatePropagationStopped();)if(!a.namespace_re||a.namespace_re.test(f.namespace))a.handleObj=f,a.data=f.data,f=((d.event.special[f.origType]||{}).handle||
f.handler).apply(k.elem,g),void 0!==f&&!1===(a.result=f)&&(a.preventDefault(),a.stopPropagation());h.postDispatch&&h.postDispatch.call(this,a);return a.result}},handlers:function(a,b){var f,k,c,e,g=[],h=b.delegateCount,m=a.target;if(h&&m.nodeType&&(!a.button||"click"!==a.type))for(;m!=this;m=m.parentNode||this)if(1===m.nodeType&&(!0!==m.disabled||"click"!==a.type)){c=[];for(e=0;e<h;e++)k=b[e],f=k.selector+" ",void 0===c[f]&&(c[f]=k.needsContext?0<=d(f,this).index(m):d.find(f,this,null,[m]).length),
c[f]&&c.push(k);c.length&&g.push({elem:m,handlers:c})}h<b.length&&g.push({elem:this,handlers:b.slice(h)});return g},fix:function(a){if(a[d.expando])return a;var b,f,k;b=a.type;var c=a,e=this.fixHooks[b];e||(this.fixHooks[b]=e=$b.test(b)?this.mouseHooks:Zb.test(b)?this.keyHooks:{});k=e.props?this.props.concat(e.props):this.props;a=new d.Event(c);for(b=k.length;b--;)f=k[b],a[f]=c[f];a.target||(a.target=c.srcElement||z);3===a.target.nodeType&&(a.target=a.target.parentNode);a.metaKey=!!a.metaKey;return e.filter?
e.filter(a,c):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:["char","charCode","key","keyCode"],filter:function(a,b){null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var d,k,c=b.button,e=b.fromElement;null==
a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||z,k=d.documentElement,d=d.body,a.pageX=b.clientX+(k&&k.scrollLeft||d&&d.scrollLeft||0)-(k&&k.clientLeft||d&&d.clientLeft||0),a.pageY=b.clientY+(k&&k.scrollTop||d&&d.scrollTop||0)-(k&&k.clientTop||d&&d.clientTop||0));!a.relatedTarget&&e&&(a.relatedTarget=e===a.target?b.toElement:e);a.which||void 0===c||(a.which=c&1?1:c&2?3:c&4?2:0);return a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ha()&&this.focus)try{return this.focus(),
!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){if(this===ha()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if(d.nodeName(this,"input")&&"checkbox"===this.type&&this.click)return this.click(),!1},_default:function(a){return d.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,f,k){a=d.extend(new d.Event,f,{type:a,isSimulated:!0,originalEvent:{}});
k?d.event.trigger(a,null,b):d.event.dispatch.call(b,a);a.isDefaultPrevented()&&f.preventDefault()}};d.removeEvent=z.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,!1)}:function(a,b,d){b="on"+b;a.detachEvent&&("undefined"===typeof a[b]&&(a[b]=null),a.detachEvent(b,d))};d.Event=function(a,b){if(!(this instanceof d.Event))return new d.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&
!1===a.returnValue?aa:V):this.type=a;b&&d.extend(this,b);this.timeStamp=a&&a.timeStamp||d.now();this[d.expando]=!0};d.Event.prototype={isDefaultPrevented:V,isPropagationStopped:V,isImmediatePropagationStopped:V,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=aa;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=aa;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=
this.originalEvent;this.isImmediatePropagationStopped=aa;a&&a.stopImmediatePropagation&&a.stopImmediatePropagation();this.stopPropagation()}};d.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){d.event.special[a]={delegateType:b,bindType:b,handle:function(a){var f,c=a.relatedTarget,e=a.handleObj;if(!c||c!==this&&!d.contains(this,c))a.type=e.origType,f=e.handler.apply(this,arguments),a.type=b;return f}}});w.submitBubbles||(d.event.special.submit=
{setup:function(){if(d.nodeName(this,"form"))return!1;d.event.add(this,"click._submit keypress._submit",function(a){a=a.target;(a=d.nodeName(a,"input")||d.nodeName(a,"button")?a.form:void 0)&&!d._data(a,"submitBubbles")&&(d.event.add(a,"submit._submit",function(a){a._submit_bubble=!0}),d._data(a,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&d.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(d.nodeName(this,
"form"))return!1;d.event.remove(this,"._submit")}});w.changeBubbles||(d.event.special.change={setup:function(){if(Xa.test(this.nodeName)){if("checkbox"===this.type||"radio"===this.type)d.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),d.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1);d.event.simulate("change",this,a,!0)});return!1}d.event.add(this,"beforeactivate._change",function(a){a=
a.target;Xa.test(a.nodeName)&&!d._data(a,"changeBubbles")&&(d.event.add(a,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||d.event.simulate("change",this.parentNode,a,!0)}),d._data(a,"changeBubbles",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type)return a.handleObj.handler.apply(this,arguments)},teardown:function(){d.event.remove(this,"._change");return!Xa.test(this.nodeName)}});w.focusinBubbles||d.each({focus:"focusin",
blur:"focusout"},function(a,b){var f=function(a){d.event.simulate(b,a.target,d.event.fix(a),!0)};d.event.special[b]={setup:function(){var c=this.ownerDocument||this,l=d._data(c,b);l||c.addEventListener(a,f,!0);d._data(c,b,(l||0)+1)},teardown:function(){var c=this.ownerDocument||this,l=d._data(c,b)-1;l?d._data(c,b,l):(c.removeEventListener(a,f,!0),d._removeData(c,b))}}});d.fn.extend({on:function(a,b,f,c,l){var k,e;if("object"===typeof a){"string"!==typeof b&&(f=f||b,b=void 0);for(k in a)this.on(k,
b,f,a[k],l);return this}null==f&&null==c?(c=b,f=b=void 0):null==c&&("string"===typeof b?(c=f,f=void 0):(c=f,f=b,b=void 0));if(!1===c)c=V;else if(!c)return this;1===l&&(e=c,c=function(a){d().off(a);return e.apply(this,arguments)},c.guid=e.guid||(e.guid=d.guid++));return this.each(function(){d.event.add(this,a,c,f,b)})},one:function(a,b,d,c){return this.on(a,b,d,c,1)},off:function(a,b,f){var c;if(a&&a.preventDefault&&a.handleObj)return c=a.handleObj,d(a.delegateTarget).off(c.namespace?c.origType+"."+
c.namespace:c.origType,c.selector,c.handler),this;if("object"===typeof a){for(c in a)this.off(c,b,a[c]);return this}if(!1===b||"function"===typeof b)f=b,b=void 0;!1===f&&(f=V);return this.each(function(){d.event.remove(this,a,f,b)})},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){var f=this[0];if(f)return d.event.trigger(a,b,f,!0)}});var gb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
ac=/ jQuery\d+="(?:null|\d+)"/g,pb=new RegExp("\x3c(?:"+gb+")[\\s/\x3e]","i"),Ya=/^\s+/,qb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,rb=/<([\w:]+)/,sb=/<tbody/i,bc=/<|&#?\w+;/,cc=/<(?:script|style|link)/i,dc=/checked\s*(?:[^=]|=\s*.checked.)/i,tb=/^$|\/(?:java|ecma)script/i,Jb=/^true\/(.*)/,ec=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ca={option:[1,"\x3cselect multiple\x3d'multiple'\x3e","\x3c/select\x3e"],legend:[1,"\x3cfieldset\x3e","\x3c/fieldset\x3e"],area:[1,
"\x3cmap\x3e","\x3c/map\x3e"],param:[1,"\x3cobject\x3e","\x3c/object\x3e"],thead:[1,"\x3ctable\x3e","\x3c/table\x3e"],tr:[2,"\x3ctable\x3e\x3ctbody\x3e","\x3c/tbody\x3e\x3c/table\x3e"],col:[2,"\x3ctable\x3e\x3ctbody\x3e\x3c/tbody\x3e\x3ccolgroup\x3e","\x3c/colgroup\x3e\x3c/table\x3e"],td:[3,"\x3ctable\x3e\x3ctbody\x3e\x3ctr\x3e","\x3c/tr\x3e\x3c/tbody\x3e\x3c/table\x3e"],_default:w.htmlSerialize?[0,"",""]:[1,"X\x3cdiv\x3e","\x3c/div\x3e"]},Za=Aa(z).appendChild(z.createElement("div"));ca.optgroup=
ca.option;ca.tbody=ca.tfoot=ca.colgroup=ca.caption=ca.thead;ca.th=ca.td;d.extend({clone:function(a,b,f){var c,l,e,g,h,m=d.contains(a.ownerDocument,a);w.html5Clone||d.isXMLDoc(a)||!pb.test("\x3c"+a.nodeName+"\x3e")?e=a.cloneNode(!0):(Za.innerHTML=a.outerHTML,Za.removeChild(e=Za.firstChild));if(!(w.noCloneEvent&&w.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||d.isXMLDoc(a)))for(c=N(e),h=N(a),g=0;null!=(l=h[g]);++g)if(c[g]){var n=c[g],t,p=void 0,v;if(1===n.nodeType){t=n.nodeName.toLowerCase();if(!w.noCloneEvent&&
n[d.expando]){v=d._data(n);for(p in v.events)d.removeEvent(n,p,v.handle);n.removeAttribute(d.expando)}if("script"===t&&n.text!==l.text)ia(n).text=l.text,A(n);else if("object"===t)n.parentNode&&(n.outerHTML=l.outerHTML),w.html5Clone&&l.innerHTML&&!d.trim(n.innerHTML)&&(n.innerHTML=l.innerHTML);else if("input"===t&&Ua.test(l.type))n.defaultChecked=n.checked=l.checked,n.value!==l.value&&(n.value=l.value);else if("option"===t)n.defaultSelected=n.selected=l.defaultSelected;else if("input"===t||"textarea"===
t)n.defaultValue=l.defaultValue}}if(b)if(f)for(h=h||N(a),c=c||N(e),g=0;null!=(l=h[g]);g++)P(l,c[g]);else P(a,e);c=N(e,"script");0<c.length&&R(c,!m&&N(a,"script"));return e},buildFragment:function(a,b,f,c){for(var k,e,g,h,m,n,t=a.length,p=Aa(b),v=[],y=0;y<t;y++)if((e=a[y])||0===e)if("object"===d.type(e))d.merge(v,e.nodeType?[e]:e);else if(bc.test(e)){g=g||p.appendChild(b.createElement("div"));h=(rb.exec(e)||["",""])[1].toLowerCase();n=ca[h]||ca._default;g.innerHTML=n[1]+e.replace(qb,"\x3c$1\x3e\x3c/$2\x3e")+
n[2];for(k=n[0];k--;)g=g.lastChild;!w.leadingWhitespace&&Ya.test(e)&&v.push(b.createTextNode(Ya.exec(e)[0]));if(!w.tbody)for(k=(e="table"!==h||sb.test(e)?"\x3ctable\x3e"!==n[1]||sb.test(e)?0:g:g.firstChild)&&e.childNodes.length;k--;)d.nodeName(m=e.childNodes[k],"tbody")&&!m.childNodes.length&&e.removeChild(m);d.merge(v,g.childNodes);for(g.textContent="";g.firstChild;)g.removeChild(g.firstChild);g=p.lastChild}else v.push(b.createTextNode(e));g&&p.removeChild(g);w.appendChecked||d.grep(N(v,"input"),
Ta);for(y=0;e=v[y++];)if(!c||-1===d.inArray(e,c))if(a=d.contains(e.ownerDocument,e),g=N(p.appendChild(e),"script"),a&&R(g),f)for(k=0;e=g[k++];)tb.test(e.type||"")&&f.push(e);return p},cleanData:function(a,b){for(var f,c,e,g,h=0,m=d.expando,n=d.cache,p=w.deleteExpando,t=d.event.special;null!=(f=a[h]);h++)if(b||d.acceptData(f))if(g=(e=f[m])&&n[e]){if(g.events)for(c in g.events)t[c]?d.event.remove(f,c):d.removeEvent(f,c,g.handle);n[e]&&(delete n[e],p?delete f[m]:"undefined"!==typeof f.removeAttribute?
f.removeAttribute(m):f[m]=null,Z.push(e))}}});d.fn.extend({text:function(a){return sa(this,function(a){return void 0===a?d.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ia(this,a).appendChild(a)})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=
Ia(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var f=a?d.filter(a,this):this,c=0;null!=(a=f[c]);c++)b||1!==a.nodeType||d.cleanData(N(a)),a.parentNode&&(b&&d.contains(a.ownerDocument,a)&&R(N(a,"script")),a.parentNode.removeChild(a));
return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){for(1===a.nodeType&&d.cleanData(N(a,!1));a.firstChild;)a.removeChild(a.firstChild);a.options&&d.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){a=null==a?!1:a;b=null==b?a:b;return this.map(function(){return d.clone(this,a,b)})},html:function(a){return sa(this,function(a){var b=this[0]||{},c=0,e=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ac,""):void 0;if(!("string"!==typeof a||cc.test(a)||
!w.htmlSerialize&&pb.test(a)||!w.leadingWhitespace&&Ya.test(a)||ca[(rb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(qb,"\x3c$1\x3e\x3c/$2\x3e");try{for(;c<e;c++)b=this[c]||{},1===b.nodeType&&(d.cleanData(N(b,!1)),b.innerHTML=a);b=0}catch(u){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];this.domManip(arguments,function(b){a=this.parentNode;d.cleanData(N(this));a&&a.replaceChild(b,this)});return a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,
!0)},domManip:function(a,b){a=jb.apply([],a);var f,c,e,g,h=0,m=this.length,n=this,p=m-1,t=a[0],v=d.isFunction(t);if(v||1<m&&"string"===typeof t&&!w.checkClone&&dc.test(t))return this.each(function(d){var f=n.eq(d);v&&(a[0]=t.call(this,d,f.html()));f.domManip(a,b)});if(m&&(g=d.buildFragment(a,this[0].ownerDocument,!1,this),f=g.firstChild,1===g.childNodes.length&&(g=f),f)){e=d.map(N(g,"script"),ia);for(c=e.length;h<m;h++)f=g,h!==p&&(f=d.clone(f,!0,!0),c&&d.merge(e,N(f,"script"))),b.call(this[h],f,h);
if(c)for(g=e[e.length-1].ownerDocument,d.map(e,A),h=0;h<c;h++)f=e[h],tb.test(f.type||"")&&!d._data(f,"globalEval")&&d.contains(g,f)&&(f.src?d._evalUrl&&d._evalUrl(f.src):d.globalEval((f.text||f.textContent||f.innerHTML||"").replace(ec,"")));g=f=null}return this}});d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(a){for(var f=0,c=[],e=d(a),g=e.length-1;f<=g;f++)a=f===g?this:this.clone(!0),d(e[f])[b](a),
Wa.apply(c,a.get());return this.pushStack(c)}});var na,hb={};(function(){var a;w.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,d,c;if((d=z.getElementsByTagName("body")[0])&&d.style)return b=z.createElement("div"),c=z.createElement("div"),c.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",d.appendChild(c).appendChild(b),"undefined"!==typeof b.style.zoom&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",
b.appendChild(z.createElement("div")).style.width="5px",a=3!==b.offsetWidth),d.removeChild(c),a}})();var ub=/^margin/,Ja=new RegExp("^("+Oa+")(?!px)[a-z%]+$","i"),ga,pa,fc=/^(top|right|bottom|left)$/;e.getComputedStyle?(ga=function(a){return a.ownerDocument.defaultView.opener?a.ownerDocument.defaultView.getComputedStyle(a,null):e.getComputedStyle(a,null)},pa=function(a,b,f){var c,e,g=a.style;e=(f=f||ga(a))?f.getPropertyValue(b)||f[b]:void 0;f&&(""!==e||d.contains(a.ownerDocument,a)||(e=d.style(a,
b)),Ja.test(e)&&ub.test(b)&&(a=g.width,b=g.minWidth,c=g.maxWidth,g.minWidth=g.maxWidth=g.width=e,e=f.width,g.width=a,g.minWidth=b,g.maxWidth=c));return void 0===e?e:e+""}):z.documentElement.currentStyle&&(ga=function(a){return a.currentStyle},pa=function(a,b,d){var f,c,e,g=a.style;e=(d=d||ga(a))?d[b]:void 0;null==e&&g&&g[b]&&(e=g[b]);if(Ja.test(e)&&!fc.test(b)){d=g.left;if(c=(f=a.runtimeStyle)&&f.left)f.left=a.currentStyle.left;g.left="fontSize"===b?"1em":e;e=g.pixelLeft+"px";g.left=d;c&&(f.left=
c)}return void 0===e?e:e+""||"auto"});(function(){function a(){var a,b,d,f;if((b=z.getElementsByTagName("body")[0])&&b.style){a=z.createElement("div");d=z.createElement("div");d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";b.appendChild(d).appendChild(a);a.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute";c=g=!1;m=!0;e.getComputedStyle&&
(c="1%"!==(e.getComputedStyle(a,null)||{}).top,g="4px"===(e.getComputedStyle(a,null)||{width:"4px"}).width,f=a.appendChild(z.createElement("div")),f.style.cssText=a.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",f.style.marginRight=f.style.width="0",a.style.width="1px",m=!parseFloat((e.getComputedStyle(f,null)||{}).marginRight),a.removeChild(f));a.innerHTML="\x3ctable\x3e\x3ctr\x3e\x3ctd\x3e\x3c/td\x3e\x3ctd\x3et\x3c/td\x3e\x3c/tr\x3e\x3c/table\x3e";
f=a.getElementsByTagName("td");f[0].style.cssText="margin:0;border:0;padding:0;display:none";if(h=0===f[0].offsetHeight)f[0].style.display="",f[1].style.display="none",h=0===f[0].offsetHeight;b.removeChild(d)}}var b,f,c,g,h,m;b=z.createElement("div");b.innerHTML="  \x3clink/\x3e\x3ctable\x3e\x3c/table\x3e\x3ca href\x3d'/a'\x3ea\x3c/a\x3e\x3cinput type\x3d'checkbox'/\x3e";if(f=(f=b.getElementsByTagName("a")[0])&&f.style)f.cssText="float:left;opacity:.5",w.opacity="0.5"===f.opacity,w.cssFloat=!!f.cssFloat,
b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",w.clearCloneStyle="content-box"===b.style.backgroundClip,w.boxSizing=""===f.boxSizing||""===f.MozBoxSizing||""===f.WebkitBoxSizing,d.extend(w,{reliableHiddenOffsets:function(){null==h&&a();return h},boxSizingReliable:function(){null==g&&a();return g},pixelPosition:function(){null==c&&a();return c},reliableMarginRight:function(){null==m&&a();return m}})})();d.swap=function(a,b,d,c){var f,e={};for(f in b)e[f]=a.style[f],a.style[f]=
b[f];d=d.apply(a,c||[]);for(f in b)a.style[f]=e[f];return d};var $a=/alpha\([^)]*\)/i,gc=/opacity\s*=\s*([^)]*)/,hc=/^(none|table(?!-c[ea]).+)/,Kb=new RegExp("^("+Oa+")(.*)$","i"),ic=new RegExp("^([+-])\x3d("+Oa+")","i"),jc={position:"absolute",visibility:"hidden",display:"block"},vb={letterSpacing:"0",fontWeight:"400"},ib=["Webkit","O","Moz","ms"];d.extend({cssHooks:{opacity:{get:function(a,b){if(b)return a=pa(a,"opacity"),""===a?"1":a}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,
fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":w.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,f,c){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,k,g,h=d.camelCase(b),m=a.style;b=d.cssProps[h]||(d.cssProps[h]=Ba(m,h));g=d.cssHooks[b]||d.cssHooks[h];if(void 0!==f){if(k=typeof f,"string"===k&&(e=ic.exec(f))&&(f=(e[1]+1)*e[2]+parseFloat(d.css(a,b)),k="number"),null!=f&&f===f&&("number"!==k||d.cssNumber[h]||(f+="px"),w.clearCloneStyle||
""!==f||0!==b.indexOf("background")||(m[b]="inherit"),!(g&&"set"in g)||void 0!==(f=g.set(a,f,c))))try{m[b]=f}catch(Ac){}}else return g&&"get"in g&&void 0!==(e=g.get(a,!1,c))?e:m[b]}},css:function(a,b,f,c){var e,k;k=d.camelCase(b);b=d.cssProps[k]||(d.cssProps[k]=Ba(a.style,k));(k=d.cssHooks[b]||d.cssHooks[k])&&"get"in k&&(e=k.get(a,!0,f));void 0===e&&(e=pa(a,b,c));"normal"===e&&b in vb&&(e=vb[b]);return""===f||f?(a=parseFloat(e),!0===f||d.isNumeric(a)?a||0:e):e}});d.each(["height","width"],function(a,
b){d.cssHooks[b]={get:function(a,c,e){if(c)return hc.test(d.css(a,"display"))&&0===a.offsetWidth?d.swap(a,jc,function(){return U(a,b,e)}):U(a,b,e)},set:function(a,c,e){var f=e&&ga(a);return va(a,c,e?S(a,b,e,w.boxSizing&&"border-box"===d.css(a,"boxSizing",!1,f),f):0)}}});w.opacity||(d.cssHooks.opacity={get:function(a,b){return gc.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var f=a.style;a=a.currentStyle;var c=d.isNumeric(b)?
"alpha(opacity\x3d"+100*b+")":"",e=a&&a.filter||f.filter||"";f.zoom=1;if((1<=b||""===b)&&""===d.trim(e.replace($a,""))&&f.removeAttribute&&(f.removeAttribute("filter"),""===b||a&&!a.filter))return;f.filter=$a.test(e)?e.replace($a,c):e+" "+c}});d.cssHooks.marginRight=Fa(w.reliableMarginRight,function(a,b){if(b)return d.swap(a,{display:"inline-block"},pa,[a,"marginRight"])});d.each({margin:"",padding:"",border:"Width"},function(a,b){d.cssHooks[a+b]={expand:function(d){var f=0,c={};for(d="string"===
typeof d?d.split(" "):[d];4>f;f++)c[a+oa[f]+b]=d[f]||d[f-2]||d[0];return c}};ub.test(a)||(d.cssHooks[a+b].set=va)});d.fn.extend({css:function(a,b){return sa(this,function(a,b,c){var f,e={},k=0;if(d.isArray(b)){c=ga(a);for(f=b.length;k<f;k++)e[b[k]]=d.css(a,b[k],!1,c);return e}return void 0!==c?d.style(a,b,c):d.css(a,b)},a,b,1<arguments.length)},show:function(){return O(this,!0)},hide:function(){return O(this)},toggle:function(a){return"boolean"===typeof a?a?this.show():this.hide():this.each(function(){Ca(this)?
d(this).show():d(this).hide()})}});d.Tween=H;H.prototype={constructor:H,init:function(a,b,f,c,e,g){this.elem=a;this.prop=f;this.easing=e||"swing";this.options=b;this.start=this.now=this.cur();this.end=c;this.unit=g||(d.cssNumber[f]?"":"px")},cur:function(){var a=H.propHooks[this.prop];return a&&a.get?a.get(this):H.propHooks._default.get(this)},run:function(a){var b,f=H.propHooks[this.prop];this.pos=this.options.duration?b=d.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):
b=a;this.now=(this.end-this.start)*b+this.start;this.options.step&&this.options.step.call(this.elem,this.now,this);f&&f.set?f.set(this):H.propHooks._default.set(this);return this}};H.prototype.init.prototype=H.prototype;H.propHooks={_default:{get:function(a){return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(a=d.css(a.elem,a.prop,""))&&"auto"!==a?a:0:a.elem[a.prop]},set:function(a){if(d.fx.step[a.prop])d.fx.step[a.prop](a);else a.elem.style&&(null!=a.elem.style[d.cssProps[a.prop]]||
d.cssHooks[a.prop])?d.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}};H.propHooks.scrollTop=H.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}};d.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}};d.fx=H.prototype.init;d.fx.step={};var wa,Pa,kc=/^(?:toggle|show|hide)$/,wb=new RegExp("^(?:([+-])\x3d|)("+Oa+")([a-z%]*)$","i"),lc=/queueHooks$/,Ka=[function(a,b,f){var c,e,g,h,m,n,p=this,t={},v=a.style,y=a.nodeType&&
Ca(a),C=d._data(a,"fxshow");f.queue||(h=d._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,m=h.empty.fire,h.empty.fire=function(){h.unqueued||m()}),h.unqueued++,p.always(function(){p.always(function(){h.unqueued--;d.queue(a,"fx").length||h.empty.fire()})}));1===a.nodeType&&("height"in b||"width"in b)&&(f.overflow=[v.overflow,v.overflowX,v.overflowY],n=d.css(a,"display"),e="none"===n?d._data(a,"olddisplay")||Ea(a.nodeName):n,"inline"===e&&"none"===d.css(a,"float")&&(w.inlineBlockNeedsLayout&&"inline"!==
Ea(a.nodeName)?v.zoom=1:v.display="inline-block"));f.overflow&&(v.overflow="hidden",w.shrinkWrapBlocks()||p.always(function(){v.overflow=f.overflow[0];v.overflowX=f.overflow[1];v.overflowY=f.overflow[2]}));for(c in b)if(e=b[c],kc.exec(e)){delete b[c];g=g||"toggle"===e;if(e===(y?"hide":"show"))if("show"===e&&C&&void 0!==C[c])y=!0;else continue;t[c]=C&&C[c]||d.style(a,c)}else n=void 0;if(d.isEmptyObject(t))"inline"===("none"===n?Ea(a.nodeName):n)&&(v.display=n);else for(c in C?"hidden"in C&&(y=C.hidden):
C=d._data(a,"fxshow",{}),g&&(C.hidden=!y),y?d(a).show():p.done(function(){d(a).hide()}),p.done(function(){var b;d._removeData(a,"fxshow");for(b in t)d.style(a,b,t[b])}),t)b=da(y?C[c]:0,c,p),c in C||(C[c]=b.start,y&&(b.end=b.start,b.start="width"===c||"height"===c?1:0))}],xa={"*":[function(a,b){var f=this.createTween(a,b),c=f.cur(),e=(b=wb.exec(b))&&b[3]||(d.cssNumber[a]?"":"px"),g=(d.cssNumber[a]||"px"!==e&&+c)&&wb.exec(d.css(f.elem,a)),h=1,m=20;if(g&&g[3]!==e){e=e||g[3];b=b||[];g=+c||1;do h=h||".5",
g/=h,d.style(f.elem,a,g+e);while(h!==(h=f.cur()/c)&&1!==h&&--m)}b&&(g=f.start=+g||+c||0,f.unit=e,f.end=b[1]?g+(b[1]+1)*b[2]:+b[2]);return f}]};d.Animation=d.extend(G,{tweener:function(a,b){d.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var f,c=0,e=a.length;c<e;c++)f=a[c],xa[f]=xa[f]||[],xa[f].unshift(b)},prefilter:function(a,b){b?Ka.unshift(a):Ka.push(a)}});d.speed=function(a,b,f){var c=a&&"object"===typeof a?d.extend({},a):{complete:f||!f&&b||d.isFunction(a)&&a,duration:a,easing:f&&b||b&&!d.isFunction(b)&&
b};c.duration=d.fx.off?0:"number"===typeof c.duration?c.duration:c.duration in d.fx.speeds?d.fx.speeds[c.duration]:d.fx.speeds._default;if(null==c.queue||!0===c.queue)c.queue="fx";c.old=c.complete;c.complete=function(){d.isFunction(c.old)&&c.old.call(this);c.queue&&d.dequeue(this,c.queue)};return c};d.fn.extend({fadeTo:function(a,b,d,c){return this.filter(Ca).css("opacity",0).show().end().animate({opacity:b},a,d,c)},animate:function(a,b,f,c){var e=d.isEmptyObject(a),g=d.speed(b,f,c);b=function(){var b=
G(this,d.extend({},a),g);(e||d._data(this,"finish"))&&b.stop(!0)};b.finish=b;return e||!1===g.queue?this.each(b):this.queue(g.queue,b)},stop:function(a,b,f){var c=function(a){var b=a.stop;delete a.stop;b(f)};"string"!==typeof a&&(f=b,b=a,a=void 0);b&&!1!==a&&this.queue(a||"fx",[]);return this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",g=d.timers,k=d._data(this);if(e)k[e]&&k[e].stop&&c(k[e]);else for(e in k)k[e]&&k[e].stop&&lc.test(e)&&c(k[e]);for(e=g.length;e--;)g[e].elem!==this||null!=a&&
g[e].queue!==a||(g[e].anim.stop(f),b=!1,g.splice(e,1));!b&&f||d.dequeue(this,a)})},finish:function(a){!1!==a&&(a=a||"fx");return this.each(function(){var b,f=d._data(this),c=f[a+"queue"];b=f[a+"queueHooks"];var e=d.timers,g=c?c.length:0;f.finish=!0;d.queue(this,a,[]);b&&b.stop&&b.stop.call(this,!0);for(b=e.length;b--;)e[b].elem===this&&e[b].queue===a&&(e[b].anim.stop(!0),e.splice(b,1));for(b=0;b<g;b++)c[b]&&c[b].finish&&c[b].finish.call(this);delete f.finish})}});d.each(["toggle","show","hide"],function(a,
b){var f=d.fn[b];d.fn[b]=function(a,d,c){return null==a||"boolean"===typeof a?f.apply(this,arguments):this.animate(v(b,!0),a,d,c)}});d.each({slideDown:v("show"),slideUp:v("hide"),slideToggle:v("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,d,c){return this.animate(b,a,d,c)}});d.timers=[];d.fx.tick=function(){var a,b=d.timers,f=0;for(wa=d.now();f<b.length;f++)a=b[f],a()||b[f]!==a||b.splice(f--,1);b.length||d.fx.stop();wa=void 0};
d.fx.timer=function(a){d.timers.push(a);a()?d.fx.start():d.timers.pop()};d.fx.interval=13;d.fx.start=function(){Pa||(Pa=setInterval(d.fx.tick,d.fx.interval))};d.fx.stop=function(){clearInterval(Pa);Pa=null};d.fx.speeds={slow:600,fast:200,_default:400};d.fn.delay=function(a,b){a=d.fx?d.fx.speeds[a]||a:a;return this.queue(b||"fx",function(b,d){var f=setTimeout(b,a);d.stop=function(){clearTimeout(f)}})};(function(){var a,b,d,c,e;b=z.createElement("div");b.setAttribute("className","t");b.innerHTML="  \x3clink/\x3e\x3ctable\x3e\x3c/table\x3e\x3ca href\x3d'/a'\x3ea\x3c/a\x3e\x3cinput type\x3d'checkbox'/\x3e";
c=b.getElementsByTagName("a")[0];d=z.createElement("select");e=d.appendChild(z.createElement("option"));a=b.getElementsByTagName("input")[0];c.style.cssText="top:1px";w.getSetAttribute="t"!==b.className;w.style=/top/.test(c.getAttribute("style"));w.hrefNormalized="/a"===c.getAttribute("href");w.checkOn=!!a.value;w.optSelected=e.selected;w.enctype=!!z.createElement("form").enctype;d.disabled=!0;w.optDisabled=!e.disabled;a=z.createElement("input");a.setAttribute("value","");w.input=""===a.getAttribute("value");
a.value="t";a.setAttribute("type","radio");w.radioValue="t"===a.value})();var mc=/\r/g;d.fn.extend({val:function(a){var b,f,c,e=this[0];if(arguments.length)return c=d.isFunction(a),this.each(function(f){1===this.nodeType&&(f=c?a.call(this,f,d(this).val()):a,null==f?f="":"number"===typeof f?f+="":d.isArray(f)&&(f=d.map(f,function(a){return null==a?"":a+""})),b=d.valHooks[this.type]||d.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,f,"value")||(this.value=f))});if(e){if((b=
d.valHooks[e.type]||d.valHooks[e.nodeName.toLowerCase()])&&"get"in b&&void 0!==(f=b.get(e,"value")))return f;f=e.value;return"string"===typeof f?f.replace(mc,""):null==f?"":f}}});d.extend({valHooks:{option:{get:function(a){var b=d.find.attr(a,"value");return null!=b?b:d.trim(d.text(a))}},select:{get:function(a){for(var b,f=a.options,c=a.selectedIndex,e=(a="select-one"===a.type||0>c)?null:[],g=a?c+1:f.length,h=0>c?g:a?c:0;h<g;h++)if(b=f[h],!(!b.selected&&h!==c||(w.optDisabled?b.disabled:null!==b.getAttribute("disabled"))||
b.parentNode.disabled&&d.nodeName(b.parentNode,"optgroup"))){b=d(b).val();if(a)return b;e.push(b)}return e},set:function(a,b){for(var f,c=a.options,e=d.makeArray(b),g=c.length;g--;)if(b=c[g],0<=d.inArray(d.valHooks.option.get(b),e))try{b.selected=f=!0}catch(K){b.scrollHeight}else b.selected=!1;f||(a.selectedIndex=-1);return c}}}});d.each(["radio","checkbox"],function(){d.valHooks[this]={set:function(a,b){if(d.isArray(b))return a.checked=0<=d.inArray(d(a).val(),b)}};w.checkOn||(d.valHooks[this].get=
function(a){return null===a.getAttribute("value")?"on":a.value})});var za,xb,ka=d.expr.attrHandle,ab=/^(?:checked|selected)$/i,ta=w.getSetAttribute,Qa=w.input;d.fn.extend({attr:function(a,b){return sa(this,d.attr,a,b,1<arguments.length)},removeAttr:function(a){return this.each(function(){d.removeAttr(this,a)})}});d.extend({attr:function(a,b,f){var c,e,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g){if("undefined"===typeof a.getAttribute)return d.prop(a,b,f);1===g&&d.isXMLDoc(a)||(b=b.toLowerCase(),c=d.attrHooks[b]||
(d.expr.match.bool.test(b)?xb:za));if(void 0!==f)if(null===f)d.removeAttr(a,b);else{if(c&&"set"in c&&void 0!==(e=c.set(a,f,b)))return e;a.setAttribute(b,f+"");return f}else{if(c&&"get"in c&&null!==(e=c.get(a,b)))return e;e=d.find.attr(a,b);return null==e?void 0:e}}},removeAttr:function(a,b){var f,c=0,e=b&&b.match(Y);if(e&&1===a.nodeType)for(;b=e[c++];)f=d.propFix[b]||b,d.expr.match.bool.test(b)?Qa&&ta||!ab.test(b)?a[f]=!1:a[d.camelCase("default-"+b)]=a[f]=!1:d.attr(a,b,""),a.removeAttribute(ta?b:
f)},attrHooks:{type:{set:function(a,b){if(!w.radioValue&&"radio"===b&&d.nodeName(a,"input")){var f=a.value;a.setAttribute("type",b);f&&(a.value=f);return b}}}}});xb={set:function(a,b,f){!1===b?d.removeAttr(a,f):Qa&&ta||!ab.test(f)?a.setAttribute(!ta&&d.propFix[f]||f,f):a[d.camelCase("default-"+f)]=a[f]=!0;return f}};d.each(d.expr.match.bool.source.match(/\w+/g),function(a,b){var f=ka[b]||d.find.attr;ka[b]=Qa&&ta||!ab.test(b)?function(a,b,d){var c,e;d||(e=ka[b],ka[b]=c,c=null!=f(a,b,d)?b.toLowerCase():
null,ka[b]=e);return c}:function(a,b,f){if(!f)return a[d.camelCase("default-"+b)]?b.toLowerCase():null}});Qa&&ta||(d.attrHooks.value={set:function(a,b,f){if(d.nodeName(a,"input"))a.defaultValue=b;else return za&&za.set(a,b,f)}});ta||(za={set:function(a,b,d){var f=a.getAttributeNode(d);f||a.setAttributeNode(f=a.ownerDocument.createAttribute(d));f.value=b+="";if("value"===d||b===a.getAttribute(d))return b}},ka.id=ka.name=ka.coords=function(a,b,d){var f;if(!d)return(f=a.getAttributeNode(b))&&""!==f.value?
f.value:null},d.valHooks.button={get:function(a,b){if((a=a.getAttributeNode(b))&&a.specified)return a.value},set:za.set},d.attrHooks.contenteditable={set:function(a,b,d){za.set(a,""===b?!1:b,d)}},d.each(["width","height"],function(a,b){d.attrHooks[b]={set:function(a,d){if(""===d)return a.setAttribute(b,"auto"),d}}}));w.style||(d.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var nc=/^(?:input|select|textarea|button|object)$/i,oc=/^(?:a|area)$/i;
d.fn.extend({prop:function(a,b){return sa(this,d.prop,a,b,1<arguments.length)},removeProp:function(a){a=d.propFix[a]||a;return this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}});d.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,f){var c,e,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return 1===g&&d.isXMLDoc(a)||(b=d.propFix[b]||b,e=d.propHooks[b]),void 0!==f?e&&"set"in e&&void 0!==(c=e.set(a,f,b))?c:a[b]=f:e&&"get"in e&&null!==(c=e.get(a,b))?c:a[b]},propHooks:{tabIndex:{get:function(a){var b=
d.find.attr(a,"tabindex");return b?parseInt(b,10):nc.test(a.nodeName)||oc.test(a.nodeName)&&a.href?0:-1}}}});w.hrefNormalized||d.each(["href","src"],function(a,b){d.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}});w.optSelected||(d.propHooks.selected={get:function(a){if(a=a.parentNode)a.selectedIndex,a.parentNode&&a.parentNode.selectedIndex;return null}});d.each("tabIndex readOnly maxLength cellSpacing cellPadding rowSpan colSpan useMap frameBorder contentEditable".split(" "),function(){d.propFix[this.toLowerCase()]=
this});w.enctype||(d.propFix.enctype="encoding");var bb=/[\t\r\n\f]/g;d.fn.extend({addClass:function(a){var b,f,c,e,g,h=0,m=this.length;b="string"===typeof a&&a;if(d.isFunction(a))return this.each(function(b){d(this).addClass(a.call(this,b,this.className))});if(b)for(b=(a||"").match(Y)||[];h<m;h++)if(f=this[h],c=1===f.nodeType&&(f.className?(" "+f.className+" ").replace(bb," "):" ")){for(g=0;e=b[g++];)0>c.indexOf(" "+e+" ")&&(c+=e+" ");c=d.trim(c);f.className!==c&&(f.className=c)}return this},removeClass:function(a){var b,
f,c,e,g,h=0,m=this.length;b=0===arguments.length||"string"===typeof a&&a;if(d.isFunction(a))return this.each(function(b){d(this).removeClass(a.call(this,b,this.className))});if(b)for(b=(a||"").match(Y)||[];h<m;h++)if(f=this[h],c=1===f.nodeType&&(f.className?(" "+f.className+" ").replace(bb," "):"")){for(g=0;e=b[g++];)for(;0<=c.indexOf(" "+e+" ");)c=c.replace(" "+e+" "," ");c=a?d.trim(c):"";f.className!==c&&(f.className=c)}return this},toggleClass:function(a,b){var f=typeof a;return"boolean"===typeof b&&
"string"===f?b?this.addClass(a):this.removeClass(a):d.isFunction(a)?this.each(function(f){d(this).toggleClass(a.call(this,f,this.className,b),b)}):this.each(function(){if("string"===f)for(var b,c=0,e=d(this),g=a.match(Y)||[];b=g[c++];)e.hasClass(b)?e.removeClass(b):e.addClass(b);else if("undefined"===f||"boolean"===f)this.className&&d._data(this,"__className__",this.className),this.className=this.className||!1===a?"":d._data(this,"__className__")||""})},hasClass:function(a){a=" "+a+" ";for(var b=
0,d=this.length;b<d;b++)if(1===this[b].nodeType&&0<=(" "+this[b].className+" ").replace(bb," ").indexOf(a))return!0;return!1}});d.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(a,b){d.fn[b]=function(a,d){return 0<arguments.length?this.on(b,null,a,d):this.trigger(b)}});d.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||
a)},bind:function(a,b,d){return this.on(a,null,b,d)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,d,c){return this.on(b,a,d,c)},undelegate:function(a,b,d){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",d)}});var cb=d.now(),db=/\?/,pc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;d.parseJSON=function(a){if(e.JSON&&e.JSON.parse)return e.JSON.parse(a+"");var b,f=null,c=d.trim(a+
"");return c&&!d.trim(c.replace(pc,function(a,d,c,e){b&&d&&(f=0);if(0===f)return a;b=c||d;f+=!e-!c;return""}))?Function("return "+c)():d.error("Invalid JSON: "+a)};d.parseXML=function(a){var b,c;if(!a||"string"!==typeof a)return null;try{e.DOMParser?(c=new DOMParser,b=c.parseFromString(a,"text/xml")):(b=new ActiveXObject("Microsoft.XMLDOM"),b.async="false",b.loadXML(a))}catch(k){b=void 0}b&&b.documentElement&&!b.getElementsByTagName("parsererror").length||d.error("Invalid XML: "+a);return b};var ua,
la,qc=/#.*$/,yb=/([?&])_=[^&]*/,rc=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,sc=/^(?:GET|HEAD)$/,tc=/^\/\//,zb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ab={},Va={},Bb="*/".concat("*");try{la=location.href}catch(a){la=z.createElement("a"),la.href="",la=la.href}ua=zb.exec(la.toLowerCase())||[];d.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:la,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(ua[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset\x3dUTF-8",
accepts:{"*":Bb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?L(L(a,d.ajaxSettings),b):L(d.ajaxSettings,a)},ajaxPrefilter:C(Ab),ajaxTransport:C(Va),ajax:function(a,
b){function c(a,b,c,f){var e,k,l,u;u=b;if(2!==L){L=2;m&&clearTimeout(m);v=void 0;h=f||"";B.readyState=0<a?4:0;f=200<=a&&300>a||304===a;if(c){l=t;for(var p=B,I,z,r,D,G=l.contents,K=l.dataTypes;"*"===K[0];)K.shift(),void 0===z&&(z=l.mimeType||p.getResponseHeader("Content-Type"));if(z)for(D in G)if(G[D]&&G[D].test(z)){K.unshift(D);break}if(K[0]in c)r=K[0];else{for(D in c){if(!K[0]||l.converters[D+" "+K[0]]){r=D;break}I||(I=D)}r=r||I}r?(r!==K[0]&&K.unshift(r),l=c[r]):l=void 0}a:{c=t;I=l;z=B;r=f;var P,
O,F,p={},G=c.dataTypes.slice();if(G[1])for(O in c.converters)p[O.toLowerCase()]=c.converters[O];for(D=G.shift();D;)if(c.responseFields[D]&&(z[c.responseFields[D]]=I),!F&&r&&c.dataFilter&&(I=c.dataFilter(I,c.dataType)),F=D,D=G.shift())if("*"===D)D=F;else if("*"!==F&&F!==D){O=p[F+" "+D]||p["* "+D];if(!O)for(P in p)if(l=P.split(" "),l[1]===D&&(O=p[F+" "+l[0]]||p["* "+l[0]])){!0===O?O=p[P]:!0!==p[P]&&(D=l[0],G.unshift(l[1]));break}if(!0!==O)if(O&&c["throws"])I=O(I);else try{I=O(I)}catch(Tb){l={state:"parsererror",
error:O?Tb:"No conversion from "+F+" to "+D};break a}}l={state:"success",data:I}}if(f)t.ifModified&&((u=B.getResponseHeader("Last-Modified"))&&(d.lastModified[g]=u),(u=B.getResponseHeader("etag"))&&(d.etag[g]=u)),204===a||"HEAD"===t.type?u="nocontent":304===a?u="notmodified":(u=l.state,e=l.data,k=l.error,f=!k);else if(k=u,a||!u)u="error",0>a&&(a=0);B.status=a;B.statusText=(b||u)+"";f?w.resolveWith(y,[e,u,B]):w.rejectWith(y,[B,u,k]);B.statusCode(da);da=void 0;n&&C.trigger(f?"ajaxSuccess":"ajaxError",
[B,t,f?e:k]);A.fireWith(y,[B,u]);n&&(C.trigger("ajaxComplete",[B,t]),--d.active||d.event.trigger("ajaxStop"))}}"object"===typeof a&&(b=a,a=void 0);b=b||{};var e,g,h,m,n,v,p,t=d.ajaxSetup({},b),y=t.context||t,C=t.context&&(y.nodeType||y.jquery)?d(y):d.event,w=d.Deferred(),A=d.Callbacks("once memory"),da=t.statusCode||{},I={},z={},L=0,r="canceled",B={readyState:0,getResponseHeader:function(a){var b;if(2===L){if(!p)for(p={};b=rc.exec(h);)p[b[1].toLowerCase()]=b[2];b=p[a.toLowerCase()]}return null==b?
null:b},getAllResponseHeaders:function(){return 2===L?h:null},setRequestHeader:function(a,b){var d=a.toLowerCase();L||(a=z[d]=z[d]||a,I[a]=b);return this},overrideMimeType:function(a){L||(t.mimeType=a);return this},statusCode:function(a){var b;if(a)if(2>L)for(b in a)da[b]=[da[b],a[b]];else B.always(a[B.status]);return this},abort:function(a){a=a||r;v&&v.abort(a);c(0,a);return this}};w.promise(B).complete=A.add;B.success=B.done;B.error=B.fail;t.url=((a||t.url||la)+"").replace(qc,"").replace(tc,ua[1]+
"//");t.type=b.method||b.type||t.method||t.type;t.dataTypes=d.trim(t.dataType||"*").toLowerCase().match(Y)||[""];null==t.crossDomain&&(a=zb.exec(t.url.toLowerCase()),t.crossDomain=!(!a||a[1]===ua[1]&&a[2]===ua[2]&&(a[3]||("http:"===a[1]?"80":"443"))===(ua[3]||("http:"===ua[1]?"80":"443"))));t.data&&t.processData&&"string"!==typeof t.data&&(t.data=d.param(t.data,t.traditional));D(Ab,t,b,B);if(2===L)return B;(n=d.event&&t.global)&&0===d.active++&&d.event.trigger("ajaxStart");t.type=t.type.toUpperCase();
t.hasContent=!sc.test(t.type);g=t.url;t.hasContent||(t.data&&(g=t.url+=(db.test(g)?"\x26":"?")+t.data,delete t.data),!1===t.cache&&(t.url=yb.test(g)?g.replace(yb,"$1_\x3d"+cb++):g+(db.test(g)?"\x26":"?")+"_\x3d"+cb++));t.ifModified&&(d.lastModified[g]&&B.setRequestHeader("If-Modified-Since",d.lastModified[g]),d.etag[g]&&B.setRequestHeader("If-None-Match",d.etag[g]));(t.data&&t.hasContent&&!1!==t.contentType||b.contentType)&&B.setRequestHeader("Content-Type",t.contentType);B.setRequestHeader("Accept",
t.dataTypes[0]&&t.accepts[t.dataTypes[0]]?t.accepts[t.dataTypes[0]]+("*"!==t.dataTypes[0]?", "+Bb+"; q\x3d0.01":""):t.accepts["*"]);for(e in t.headers)B.setRequestHeader(e,t.headers[e]);if(t.beforeSend&&(!1===t.beforeSend.call(y,B,t)||2===L))return B.abort();r="abort";for(e in{success:1,error:1,complete:1})B[e](t[e]);if(v=D(Va,t,b,B)){B.readyState=1;n&&C.trigger("ajaxSend",[B,t]);t.async&&0<t.timeout&&(m=setTimeout(function(){B.abort("timeout")},t.timeout));try{L=1,v.send(I,c)}catch(F){if(2>L)c(-1,
F);else throw F;}}else c(-1,"No Transport");return B},getJSON:function(a,b,c){return d.get(a,b,c,"json")},getScript:function(a,b){return d.get(a,void 0,b,"script")}});d.each(["get","post"],function(a,b){d[b]=function(a,c,e,g){d.isFunction(c)&&(g=g||e,e=c,c=void 0);return d.ajax({url:a,type:b,dataType:g,data:c,success:e})}});d._evalUrl=function(a){return d.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})};d.fn.extend({wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,
b))});if(this[0]){var b=d(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var a=this;a.firstChild&&1===a.firstChild.nodeType;)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return d.isFunction(a)?this.each(function(b){d(this).wrapInner(a.call(this,b))}):this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=d.isFunction(a);return this.each(function(c){d(this).wrapAll(b?
a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)}).end()}});d.expr.filters.hidden=function(a){return 0>=a.offsetWidth&&0>=a.offsetHeight||!w.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||d.css(a,"display"))};d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)};var uc=/%20/g,Nb=/\[\]$/,Cb=/\r?\n/g,vc=/^(?:submit|button|image|reset|file)$/i,wc=/^(?:input|select|textarea|keygen)/i;d.param=
function(a,b){var c,e=[],g=function(a,b){b=d.isFunction(b)?b():null==b?"":b;e[e.length]=encodeURIComponent(a)+"\x3d"+encodeURIComponent(b)};void 0===b&&(b=d.ajaxSettings&&d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){g(this.name,this.value)});else for(c in a)ea(c,a[c],b,g);return e.join("\x26").replace(uc,"+")};d.fn.extend({serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=d.prop(this,
"elements");return a?d.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!d(this).is(":disabled")&&wc.test(this.nodeName)&&!vc.test(a)&&(this.checked||!Ua.test(a))}).map(function(a,b){a=d(this).val();return null==a?null:d.isArray(a)?d.map(a,function(a){return{name:b.name,value:a.replace(Cb,"\r\n")}}):{name:b.name,value:a.replace(Cb,"\r\n")}}).get()}});d.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){var a;if(!(a=!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&
La()))a:{try{a=new e.ActiveXObject("Microsoft.XMLHTTP");break a}catch(b){}a=void 0}return a}:La;var xc=0,Ra={},Sa=d.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var a in Ra)Ra[a](void 0,!0)});w.cors=!!Sa&&"withCredentials"in Sa;(Sa=w.ajax=!!Sa)&&d.ajaxTransport(function(a){if(!a.crossDomain||w.cors){var b;return{send:function(c,e){var f,g=a.xhr(),k=++xc;g.open(a.type,a.url,a.async,a.username,a.password);if(a.xhrFields)for(f in a.xhrFields)g[f]=a.xhrFields[f];a.mimeType&&
g.overrideMimeType&&g.overrideMimeType(a.mimeType);a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(f in c)void 0!==c[f]&&g.setRequestHeader(f,c[f]+"");g.send(a.hasContent&&a.data||null);b=function(c,f){var h,l,m;if(b&&(f||4===g.readyState))if(delete Ra[k],b=void 0,g.onreadystatechange=d.noop,f)4!==g.readyState&&g.abort();else{m={};h=g.status;"string"===typeof g.responseText&&(m.text=g.responseText);try{l=g.statusText}catch(Mb){l=""}h||!a.isLocal||a.crossDomain?1223===
h&&(h=204):h=m.text?200:404}m&&e(h,l,m,g.getAllResponseHeaders())};a.async?4===g.readyState?setTimeout(b):g.onreadystatechange=Ra[k]=b:b()},abort:function(){b&&b(void 0,!0)}}}});d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){d.globalEval(a);return a}}});d.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1);a.crossDomain&&(a.type="GET",
a.global=!1)});d.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=z.head||d("head")[0]||z.documentElement;return{send:function(d,f){b=z.createElement("script");b.async=!0;a.scriptCharset&&(b.charset=a.scriptCharset);b.src=a.url;b.onload=b.onreadystatechange=function(a,d){if(d||!b.readyState||/loaded|complete/.test(b.readyState))b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,d||f(200,"success")};c.insertBefore(b,c.firstChild)},abort:function(){if(b)b.onload(void 0,
!0)}}}});var Db=[],eb=/(=)\?(?=&|$)|\?\?/;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Db.pop()||d.expando+"_"+cb++;this[a]=!0;return a}});d.ajaxPrefilter("json jsonp",function(a,b,c){var f,g,h,m=!1!==a.jsonp&&(eb.test(a.url)?"url":"string"===typeof a.data&&!(a.contentType||"").indexOf("application/x-www-form-urlencoded")&&eb.test(a.data)&&"data");if(m||"jsonp"===a.dataTypes[0])return f=a.jsonpCallback=d.isFunction(a.jsonpCallback)?a.jsonpCallback():a.jsonpCallback,m?a[m]=a[m].replace(eb,
"$1"+f):!1!==a.jsonp&&(a.url+=(db.test(a.url)?"\x26":"?")+a.jsonp+"\x3d"+f),a.converters["script json"]=function(){h||d.error(f+" was not called");return h[0]},a.dataTypes[0]="json",g=e[f],e[f]=function(){h=arguments},c.always(function(){e[f]=g;a[f]&&(a.jsonpCallback=b.jsonpCallback,Db.push(f));h&&d.isFunction(g)&&g(h[0]);h=g=void 0}),"script"});d.parseHTML=function(a,b,c){if(!a||"string"!==typeof a)return null;"boolean"===typeof b&&(c=b,b=!1);b=b||z;var f=mb.exec(a);c=!c&&[];if(f)return[b.createElement(f[1])];
f=d.buildFragment([a],b,c);c&&c.length&&d(c).remove();return d.merge([],f.childNodes)};var Eb=d.fn.load;d.fn.load=function(a,b,c){if("string"!==typeof a&&Eb)return Eb.apply(this,arguments);var f,e,g,h=this,m=a.indexOf(" ");0<=m&&(f=d.trim(a.slice(m,a.length)),a=a.slice(0,m));d.isFunction(b)?(c=b,b=void 0):b&&"object"===typeof b&&(g="POST");0<h.length&&d.ajax({url:a,type:g,dataType:"html",data:b}).done(function(a){e=arguments;h.html(f?d("\x3cdiv\x3e").append(d.parseHTML(a)).find(f):a)}).complete(c&&
function(a,b){h.each(c,e||[a.responseText,b,a])});return this};d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.on(b,a)}});d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return a===b.elem}).length};var Fb=e.document.documentElement;d.offset={setOffset:function(a,b,c){var f,e,g,h=d.css(a,"position"),m=d(a),n={};"static"===h&&(a.style.position="relative");g=m.offset();e=d.css(a,"top");f=d.css(a,"left");
("absolute"===h||"fixed"===h)&&-1<d.inArray("auto",[e,f])?(f=m.position(),e=f.top,f=f.left):(e=parseFloat(e)||0,f=parseFloat(f)||0);d.isFunction(b)&&(b=b.call(a,c,g));null!=b.top&&(n.top=b.top-g.top+e);null!=b.left&&(n.left=b.left-g.left+f);"using"in b?b.using.call(a,n):m.css(n)}};d.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){d.offset.setOffset(this,a,b)});var b,c,e={top:0,left:0},g=(c=this[0])&&c.ownerDocument;if(g){b=g.documentElement;if(!d.contains(b,
c))return e;"undefined"!==typeof c.getBoundingClientRect&&(e=c.getBoundingClientRect());c=Ga(g);return{top:e.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:e.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}}},position:function(){if(this[0]){var a,b,c={top:0,left:0},e=this[0];"fixed"===d.css(e,"position")?b=e.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),d.nodeName(a[0],"html")||(c=a.offset()),c.top+=d.css(a[0],"borderTopWidth",!0),c.left+=d.css(a[0],"borderLeftWidth",
!0));return{top:b.top-c.top-d.css(e,"marginTop",!0),left:b.left-c.left-d.css(e,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||Fb;a&&!d.nodeName(a,"html")&&"static"===d.css(a,"position");)a=a.offsetParent;return a||Fb})}});d.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);d.fn[a]=function(f){return sa(this,function(a,f,e){var g=Ga(a);if(void 0===e)return g?b in g?g[b]:g.document.documentElement[f]:a[f];g?g.scrollTo(c?
d(g).scrollLeft():e,c?e:d(g).scrollTop()):a[f]=e},a,f,arguments.length,null)}});d.each(["top","left"],function(a,b){d.cssHooks[b]=Fa(w.pixelPosition,function(a,c){if(c)return c=pa(a,b),Ja.test(c)?d(a).position()[b]+"px":c})});d.each({Height:"height",Width:"width"},function(a,b){d.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,e){d.fn[e]=function(f,e){var g=arguments.length&&(c||"boolean"!==typeof f),h=c||(!0===f||!0===e?"margin":"border");return sa(this,function(b,c,f){return d.isWindow(b)?
b.document.documentElement["client"+a]:9===b.nodeType?(c=b.documentElement,Math.max(b.body["scroll"+a],c["scroll"+a],b.body["offset"+a],c["offset"+a],c["client"+a])):void 0===f?d.css(b,c,h):d.style(b,c,f,h)},b,g?f:void 0,g,null)}})});d.fn.size=function(){return this.length};d.fn.andSelf=d.fn.addBack;"function"===typeof define&&define.amd&&define("jquery",[],function(){return d});var yc=e.jQuery,zc=e.$;d.noConflict=function(a){e.$===d&&(e.$=zc);a&&e.jQuery===d&&(e.jQuery=yc);return d};"undefined"===
typeof p&&(e.jQuery=e.$=d);return d});!function(e){e(function(){var p=e.support,x;a:{x=document.createElement("bootstrap");var c={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},g;for(g in c)if(void 0!==x.style[g]){x=c[g];break a}x=void 0}p.transition=x&&{end:x}})}(window.jQuery);
!function(e){var p=function(c){e(c).on("click",'[data-dismiss\x3d"alert"]',this.close)};p.prototype.close=function(c){function g(){n.trigger("closed").remove()}var h=e(this),m=h.attr("data-target"),n;m||(m=(m=h.attr("href"))&&m.replace(/.*(?=#[^\s]*$)/,""));n=e(m);c&&c.preventDefault();n.length||(n=h.hasClass("alert")?h:h.parent());n.trigger(c=e.Event("close"));c.isDefaultPrevented()||(n.removeClass("in"),e.support.transition&&n.hasClass("fade")?n.on(e.support.transition.end,g):g())};var x=e.fn.alert;
e.fn.alert=function(c){return this.each(function(){var g=e(this),h=g.data("alert");h||g.data("alert",h=new p(this));"string"==typeof c&&h[c].call(g)})};e.fn.alert.Constructor=p;e.fn.alert.noConflict=function(){e.fn.alert=x;return this};e(document).on("click.alert.data-api",'[data-dismiss\x3d"alert"]',p.prototype.close)}(window.jQuery);
!function(e){var p=function(c,g){this.$element=e(c);this.options=e.extend({},e.fn.button.defaults,g)};p.prototype.setState=function(c){var e=this.$element,h=e.data(),m=e.is("input")?"val":"html";c+="Text";h.resetText||e.data("resetText",e[m]());e[m](h[c]||this.options[c]);setTimeout(function(){"loadingText"==c?e.addClass("disabled").attr("disabled","disabled"):e.removeClass("disabled").removeAttr("disabled")},0)};p.prototype.toggle=function(){var c=this.$element.closest('[data-toggle\x3d"buttons-radio"]');
c&&c.find(".active").removeClass("active");this.$element.toggleClass("active")};var x=e.fn.button;e.fn.button=function(c){return this.each(function(){var g=e(this),h=g.data("button"),m="object"==typeof c&&c;h||g.data("button",h=new p(this,m));"toggle"==c?h.toggle():c&&h.setState(c)})};e.fn.button.defaults={loadingText:"loading..."};e.fn.button.Constructor=p;e.fn.button.noConflict=function(){e.fn.button=x;return this};e(document).on("click.button.data-api","[data-toggle^\x3dbutton]",function(c){c=
e(c.target);c.hasClass("btn")||(c=c.closest(".btn"));c.button("toggle")})}(window.jQuery);
!function(e){var p=function(c,g){this.$element=e(c);this.$indicators=this.$element.find(".carousel-indicators");this.options=g;"hover"==this.options.pause&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};p.prototype={cycle:function(c){c||(this.paused=!1);this.interval&&clearInterval(this.interval);this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval));return this},getActiveIndex:function(){this.$active=
this.$element.find(".item.active");this.$items=this.$active.parent().children();return this.$items.index(this.$active)},to:function(c){var g=this.getActiveIndex(),h=this;if(!(c>this.$items.length-1||0>c))return this.sliding?this.$element.one("slid",function(){h.to(c)}):g==c?this.pause().cycle():this.slide(c>g?"next":"prev",e(this.$items[c]))},pause:function(c){c||(this.paused=!0);this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),
this.cycle(!0));clearInterval(this.interval);this.interval=null;return this},next:function(){if(!this.sliding)return this.slide("next")},prev:function(){if(!this.sliding)return this.slide("prev")},slide:function(c,g){var h=this.$element.find(".item.active"),m=g||h[c]();g=this.interval;var n="next"==c?"left":"right",p="next"==c?"first":"last",r=this;this.sliding=!0;g&&this.pause();m=m.length?m:this.$element.find(".item")[p]();p=e.Event("slide",{relatedTarget:m[0],direction:n});if(!m.hasClass("active")){this.$indicators.length&&
(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var c=e(r.$indicators.children()[r.getActiveIndex()]);c&&c.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(p);if(p.isDefaultPrevented())return;m.addClass(c);m[0].offsetWidth;h.addClass(n);m.addClass(n);this.$element.one(e.support.transition.end,function(){m.removeClass([c,n].join(" ")).addClass("active");h.removeClass(["active",n].join(" "));r.sliding=!1;
setTimeout(function(){r.$element.trigger("slid")},0)})}else{this.$element.trigger(p);if(p.isDefaultPrevented())return;h.removeClass("active");m.addClass("active");this.sliding=!1;this.$element.trigger("slid")}g&&this.cycle();return this}}};var x=e.fn.carousel;e.fn.carousel=function(c){return this.each(function(){var g=e(this),h=g.data("carousel"),m=e.extend({},e.fn.carousel.defaults,"object"==typeof c&&c),n="string"==typeof c?c:m.slide;h||g.data("carousel",h=new p(this,m));if("number"==typeof c)h.to(c);
else if(n)h[n]();else m.interval&&h.pause().cycle()})};e.fn.carousel.defaults={interval:5E3,pause:"hover"};e.fn.carousel.Constructor=p;e.fn.carousel.noConflict=function(){e.fn.carousel=x;return this};e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(c){var g=e(this),h,m=e(g.attr("data-target")||(h=g.attr("href"))&&h.replace(/.*(?=#[^\s]+$)/,""));h=e.extend({},m.data(),g.data());var n;m.carousel(h);(n=g.attr("data-slide-to"))&&m.data("carousel").pause().to(n).cycle();
c.preventDefault()})}(window.jQuery);
!function(e){var p=function(c,g){this.$element=e(c);this.options=e.extend({},e.fn.collapse.defaults,g);this.options.parent&&(this.$parent=e(this.options.parent));this.options.toggle&&this.toggle()};p.prototype={constructor:p,dimension:function(){return this.$element.hasClass("width")?"width":"height"},show:function(){var c,g,h,m;if(!this.transitioning&&!this.$element.hasClass("in")){c=this.dimension();g=e.camelCase(["scroll",c].join("-"));if((h=this.$parent&&this.$parent.find("\x3e .accordion-group \x3e .in"))&&h.length){if((m=
h.data("collapse"))&&m.transitioning)return;h.collapse("hide");m||h.data("collapse",null)}this.$element[c](0);this.transition("addClass",e.Event("show"),"shown");e.support.transition&&this.$element[c](this.$element[0][g])}},hide:function(){var c;!this.transitioning&&this.$element.hasClass("in")&&(c=this.dimension(),this.reset(this.$element[c]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[c](0))},reset:function(c){var e=this.dimension();this.$element.removeClass("collapse")[e](c||
"auto")[0].offsetWidth;this.$element[null!==c?"addClass":"removeClass"]("collapse");return this},transition:function(c,g,h){var m=this,n=function(){"show"==g.type&&m.reset();m.transitioning=0;m.$element.trigger(h)};this.$element.trigger(g);g.isDefaultPrevented()||(this.transitioning=1,this.$element[c]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,n):n())},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var x=e.fn.collapse;
e.fn.collapse=function(c){return this.each(function(){var g=e(this),h=g.data("collapse"),m=e.extend({},e.fn.collapse.defaults,g.data(),"object"==typeof c&&c);h||g.data("collapse",h=new p(this,m));if("string"==typeof c)h[c]()})};e.fn.collapse.defaults={toggle:!0};e.fn.collapse.Constructor=p;e.fn.collapse.noConflict=function(){e.fn.collapse=x;return this};e(document).on("click.collapse.data-api","[data-toggle\x3dcollapse]",function(c){var g=e(this),h;c=g.attr("data-target")||c.preventDefault()||(h=
g.attr("href"))&&h.replace(/.*(?=#[^\s]+$)/,"");h=e(c).data("collapse")?"toggle":g.data();g[e(c).hasClass("in")?"addClass":"removeClass"]("collapsed");e(c).collapse(h)})}(window.jQuery);
!function(e){function p(){e(".dropdown-backdrop").remove();e("[data-toggle\x3ddropdown]").each(function(){x(e(this)).removeClass("open")})}function x(c){var g=c.attr("data-target");g||(g=(g=c.attr("href"))&&/#/.test(g)&&g.replace(/.*(?=#[^\s]*$)/,""));(g=g&&e(g))&&g.length||(g=c.parent());return g}var c=function(c){var g=e(c).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){g.parent().removeClass("open")})};c.prototype={constructor:c,toggle:function(c){c=
e(this);var g,h;if(!c.is(".disabled, :disabled")){g=x(c);h=g.hasClass("open");p();if(!h){if("ontouchstart"in document.documentElement)e('\x3cdiv class\x3d"dropdown-backdrop"/\x3e').insertBefore(e(this)).on("click",p);g.toggleClass("open")}c.focus();return!1}},keydown:function(c){var g,h,p;if(/(38|40|27)/.test(c.keyCode)&&(g=e(this),c.preventDefault(),c.stopPropagation(),!g.is(".disabled, :disabled"))){h=x(g);p=h.hasClass("open");if(!p||p&&27==c.keyCode)return 27==c.which&&h.find("[data-toggle\x3ddropdown]").focus(),
g.click();g=e("[role\x3dmenu] li:not(.divider):visible a",h);g.length&&(h=g.index(g.filter(":focus")),38==c.keyCode&&0<h&&h--,40==c.keyCode&&h<g.length-1&&h++,~h||(h=0),g.eq(h).focus())}}};var g=e.fn.dropdown;e.fn.dropdown=function(g){return this.each(function(){var h=e(this),n=h.data("dropdown");n||h.data("dropdown",n=new c(this));"string"==typeof g&&n[g].call(h)})};e.fn.dropdown.Constructor=c;e.fn.dropdown.noConflict=function(){e.fn.dropdown=g;return this};e(document).on("click.dropdown.data-api",
p).on("click.dropdown.data-api",".dropdown form",function(c){c.stopPropagation()}).on("click.dropdown.data-api","[data-toggle\x3ddropdown]",c.prototype.toggle).on("keydown.dropdown.data-api","[data-toggle\x3ddropdown], [role\x3dmenu]",c.prototype.keydown)}(window.jQuery);
!function(e){var p=function(c,g){this.options=g;this.$element=e(c).delegate('[data-dismiss\x3d"modal"]',"click.dismiss.modal",e.proxy(this.hide,this));this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};p.prototype={constructor:p,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var c=this,g=e.Event("show");this.$element.trigger(g);this.isShown||g.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.backdrop(function(){var g=e.support.transition&&
c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body);c.$element.show();g&&c.$element[0].offsetWidth;c.$element.addClass("in").attr("aria-hidden",!1);c.enforceFocus();g?c.$element.one(e.support.transition.end,function(){c.$element.focus().trigger("shown")}):c.$element.focus().trigger("shown")}))},hide:function(c){c&&c.preventDefault();c=e.Event("hide");this.$element.trigger(c);this.isShown&&!c.isDefaultPrevented()&&(this.isShown=!1,this.escape(),e(document).off("focusin.modal"),
this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal())},enforceFocus:function(){var c=this;e(document).on("focusin.modal",function(e){c.$element[0]===e.target||c.$element.has(e.target).length||c.$element.focus()})},escape:function(){var c=this;if(this.isShown&&this.options.keyboard)this.$element.on("keyup.dismiss.modal",function(e){27==e.which&&c.hide()});else this.isShown||this.$element.off("keyup.dismiss.modal")},
hideWithTransition:function(){var c=this,g=setTimeout(function(){c.$element.off(e.support.transition.end);c.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(g);c.hideModal()})},hideModal:function(){var c=this;this.$element.hide();this.backdrop(function(){c.removeBackdrop();c.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove();this.$backdrop=null},backdrop:function(c){var g=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&
this.options.backdrop){var h=e.support.transition&&g;this.$backdrop=e('\x3cdiv class\x3d"modal-backdrop '+g+'" /\x3e').appendTo(document.body);this.$backdrop.click("static"==this.options.backdrop?e.proxy(this.$element[0].focus,this.$element[0]):e.proxy(this.hide,this));h&&this.$backdrop[0].offsetWidth;this.$backdrop.addClass("in");c&&(h?this.$backdrop.one(e.support.transition.end,c):c())}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?
this.$backdrop.one(e.support.transition.end,c):c()):c&&c()}};var x=e.fn.modal;e.fn.modal=function(c){return this.each(function(){var g=e(this),h=g.data("modal"),m=e.extend({},e.fn.modal.defaults,g.data(),"object"==typeof c&&c);h||g.data("modal",h=new p(this,m));if("string"==typeof c)h[c]();else m.show&&h.show()})};e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0};e.fn.modal.Constructor=p;e.fn.modal.noConflict=function(){e.fn.modal=x;return this};e(document).on("click.modal.data-api",'[data-toggle\x3d"modal"]',
function(c){var g=e(this),h=g.attr("href"),m=e(g.attr("data-target")||h&&h.replace(/.*(?=#[^\s]+$)/,"")),h=m.data("modal")?"toggle":e.extend({remote:!/#/.test(h)&&h},m.data(),g.data());c.preventDefault();m.modal(h).one("hide",function(){g.focus()})})}(window.jQuery);
!function(e){var p=function(c,e){this.init("tooltip",c,e)};p.prototype={constructor:p,init:function(c,g,h){var m;this.type=c;this.$element=e(g);this.options=this.getOptions(h);this.enabled=!0;g=this.options.trigger.split(" ");for(h=g.length;h--;)if(m=g[h],"click"==m)this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this));else"manual"!=m&&(c="hover"==m?"mouseenter":"focus",m="hover"==m?"mouseleave":"blur",this.$element.on(c+"."+this.type,this.options.selector,e.proxy(this.enter,
this)),this.$element.on(m+"."+this.type,this.options.selector,e.proxy(this.leave,this)));this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(c){c=e.extend({},e.fn[this.type].defaults,this.$element.data(),c);c.delay&&"number"==typeof c.delay&&(c.delay={show:c.delay,hide:c.delay});return c},enter:function(c){var g=e.fn[this.type].defaults,h={},m;this._options&&e.each(this._options,function(c,e){g[c]!=e&&(h[c]=e)},this);m=
e(c.currentTarget)[this.type](h).data(this.type);if(!m.options.delay||!m.options.delay.show)return m.show();clearTimeout(this.timeout);m.hoverState="in";this.timeout=setTimeout(function(){"in"==m.hoverState&&m.show()},m.options.delay.show)},leave:function(c){var g=e(c.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!g.options.delay||!g.options.delay.hide)return g.hide();g.hoverState="out";this.timeout=setTimeout(function(){"out"==g.hoverState&&
g.hide()},g.options.delay.hide)},show:function(){var c,g,h,m,n;g=e.Event("show");if(this.hasContent()&&this.enabled&&(this.$element.trigger(g),!g.isDefaultPrevented())){c=this.tip();this.setContent();this.options.animation&&c.addClass("fade");m="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement;c.detach().css({top:0,left:0,display:"block"});this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);g=
this.getPosition();h=c[0].offsetWidth;c=c[0].offsetHeight;switch(m){case "bottom":n={top:g.top+g.height,left:g.left+g.width/2-h/2};break;case "top":n={top:g.top-c,left:g.left+g.width/2-h/2};break;case "left":n={top:g.top+g.height/2-c/2,left:g.left-h};break;case "right":n={top:g.top+g.height/2-c/2,left:g.left+g.width}}this.applyPlacement(n,m);this.$element.trigger("shown")}},applyPlacement:function(c,e){var g=this.tip(),m=g[0].offsetWidth,n=g[0].offsetHeight,p,r,x;g.offset(c).addClass(e).addClass("in");
p=g[0].offsetWidth;r=g[0].offsetHeight;"top"==e&&r!=n&&(c.top=c.top+n-r,x=!0);"bottom"==e||"top"==e?(e=0,0>c.left&&(e=-2*c.left,c.left=0,g.offset(c),p=g[0].offsetWidth),this.replaceArrow(e-m+p,p,"left")):this.replaceArrow(r-n,r,"top");x&&g.offset(c)},replaceArrow:function(c,e,h){this.arrow().css(h,c?50*(1-c/e)+"%":"")},setContent:function(){var c=this.tip(),e=this.getTitle();c.find(".tooltip-inner")[this.options.html?"html":"text"](e);c.removeClass("fade in top bottom left right")},hide:function(){function c(){var c=
setTimeout(function(){g.off(e.support.transition.end).detach()},500);g.one(e.support.transition.end,function(){clearTimeout(c);g.detach()})}var g=this.tip(),h=e.Event("hide");this.$element.trigger(h);if(!h.isDefaultPrevented())return g.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?c():g.detach(),this.$element.trigger("hidden"),this},fixTitle:function(){var c=this.$element;(c.attr("title")||"string"!=typeof c.attr("data-original-title"))&&c.attr("data-original-title",c.attr("title")||
"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var c=this.$element[0];return e.extend({},"function"==typeof c.getBoundingClientRect?c.getBoundingClientRect():{width:c.offsetWidth,height:c.offsetHeight},this.$element.offset())},getTitle:function(){var c=this.$element,e=this.options;return c.attr("data-original-title")||("function"==typeof e.title?e.title.call(c[0]):e.title)},tip:function(){return this.$tip=this.$tip||e(this.options.template)},arrow:function(){return this.$arrow=
this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.options=this.$element=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(c){c=c?e(c.currentTarget)[this.type](this._options).data(this.type):this;c.tip().hasClass("in")?c.hide():c.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var x=e.fn.tooltip;
e.fn.tooltip=function(c){return this.each(function(){var g=e(this),h=g.data("tooltip"),m="object"==typeof c&&c;h||g.data("tooltip",h=new p(this,m));if("string"==typeof c)h[c]()})};e.fn.tooltip.Constructor=p;e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'\x3cdiv class\x3d"tooltip"\x3e\x3cdiv class\x3d"tooltip-arrow"\x3e\x3c/div\x3e\x3cdiv class\x3d"tooltip-inner"\x3e\x3c/div\x3e\x3c/div\x3e',trigger:"hover focus",title:"",delay:0,html:!1,container:!1};e.fn.tooltip.noConflict=
function(){e.fn.tooltip=x;return this}}(window.jQuery);
!function(e){var p=function(c,e){this.init("popover",c,e)};p.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:p,setContent:function(){var c=this.tip(),e=this.getTitle(),h=this.getContent();c.find(".popover-title")[this.options.html?"html":"text"](e);c.find(".popover-content")[this.options.html?"html":"text"](h);c.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var c=this.$element,e=this.options;
return("function"==typeof e.content?e.content.call(c[0]):e.content)||c.attr("data-content")},tip:function(){this.$tip||(this.$tip=e(this.options.template));return this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var x=e.fn.popover;e.fn.popover=function(c){return this.each(function(){var g=e(this),h=g.data("popover"),m="object"==typeof c&&c;h||g.data("popover",h=new p(this,m));if("string"==typeof c)h[c]()})};e.fn.popover.Constructor=p;e.fn.popover.defaults=
e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'\x3cdiv class\x3d"popover"\x3e\x3cdiv class\x3d"arrow"\x3e\x3c/div\x3e\x3ch3 class\x3d"popover-title"\x3e\x3c/h3\x3e\x3cdiv class\x3d"popover-content"\x3e\x3c/div\x3e\x3c/div\x3e'});e.fn.popover.noConflict=function(){e.fn.popover=x;return this}}(window.jQuery);
!function(e){function p(c,g){var h=e.proxy(this.process,this),m=e(c).is("body")?e(window):e(c),n;this.options=e.extend({},e.fn.scrollspy.defaults,g);this.$scrollElement=m.on("scroll.scroll-spy.data-api",h);this.selector=(this.options.target||(n=e(c).attr("href"))&&n.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li \x3e a";this.$body=e("body");this.refresh();this.process()}p.prototype={constructor:p,refresh:function(){var c=this;this.offsets=e([]);this.targets=e([]);this.$body.find(this.selector).map(function(){var g=
e(this),g=g.data("target")||g.attr("href"),h=/^#\w/.test(g)&&e(g);return h&&h.length&&[[h.position().top+(!e.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),g]]||null}).sort(function(c,e){return c[0]-e[0]}).each(function(){c.offsets.push(this[0]);c.targets.push(this[1])})},process:function(){var c=this.$scrollElement.scrollTop()+this.options.offset,e=(this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight)-this.$scrollElement.height(),h=this.offsets,m=this.targets,n=this.activeTarget,
p;if(c>=e)return n!=(p=m.last()[0])&&this.activate(p);for(p=h.length;p--;)n!=m[p]&&c>=h[p]&&(!h[p+1]||c<=h[p+1])&&this.activate(m[p])},activate:function(c){this.activeTarget=c;e(this.selector).parent(".active").removeClass("active");c=e(this.selector+'[data-target\x3d"'+c+'"],'+this.selector+'[href\x3d"'+c+'"]').parent("li").addClass("active");c.parent(".dropdown-menu").length&&(c=c.closest("li.dropdown").addClass("active"));c.trigger("activate")}};var x=e.fn.scrollspy;e.fn.scrollspy=function(c){return this.each(function(){var g=
e(this),h=g.data("scrollspy"),m="object"==typeof c&&c;h||g.data("scrollspy",h=new p(this,m));if("string"==typeof c)h[c]()})};e.fn.scrollspy.Constructor=p;e.fn.scrollspy.defaults={offset:10};e.fn.scrollspy.noConflict=function(){e.fn.scrollspy=x;return this};e(window).on("load",function(){e('[data-spy\x3d"scroll"]').each(function(){var c=e(this);c.scrollspy(c.data())})})}(window.jQuery);
!function(e){var p=function(c){this.element=e(c)};p.prototype={constructor:p,show:function(){var c=this.element,g=c.closest("ul:not(.dropdown-menu)"),h=c.attr("data-target"),m,n;h||(h=(h=c.attr("href"))&&h.replace(/.*(?=#[^\s]*$)/,""));c.parent("li").hasClass("active")||(m=g.find(".active:last a")[0],n=e.Event("show",{relatedTarget:m}),c.trigger(n),n.isDefaultPrevented()||(h=e(h),this.activate(c.parent("li"),g),this.activate(h,h.parent(),function(){c.trigger({type:"shown",relatedTarget:m})})))},activate:function(c,
g,h){function m(){n.removeClass("active").find("\x3e .dropdown-menu \x3e .active").removeClass("active");c.addClass("active");p?(c[0].offsetWidth,c.addClass("in")):c.removeClass("fade");c.parent(".dropdown-menu")&&c.closest("li.dropdown").addClass("active");h&&h()}var n=g.find("\x3e .active"),p=h&&e.support.transition&&n.hasClass("fade");p?n.one(e.support.transition.end,m):m();n.removeClass("in")}};var x=e.fn.tab;e.fn.tab=function(c){return this.each(function(){var g=e(this),h=g.data("tab");h||g.data("tab",
h=new p(this));if("string"==typeof c)h[c]()})};e.fn.tab.Constructor=p;e.fn.tab.noConflict=function(){e.fn.tab=x;return this};e(document).on("click.tab.data-api",'[data-toggle\x3d"tab"], [data-toggle\x3d"pill"]',function(c){c.preventDefault();e(this).tab("show")})}(window.jQuery);
!function(e){var p=function(c,g){this.$element=e(c);this.options=e.extend({},e.fn.typeahead.defaults,g);this.matcher=this.options.matcher||this.matcher;this.sorter=this.options.sorter||this.sorter;this.highlighter=this.options.highlighter||this.highlighter;this.updater=this.options.updater||this.updater;this.source=this.options.source;this.$menu=e(this.options.menu);this.shown=!1;this.listen()};p.prototype={constructor:p,select:function(){var c=this.$menu.find(".active").attr("data-value");this.$element.val(this.updater(c)).change();
return this.hide()},updater:function(c){return c},show:function(){var c=e.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});this.$menu.insertAfter(this.$element).css({top:c.top+c.height,left:c.left}).show();this.shown=!0;return this},hide:function(){this.$menu.hide();this.shown=!1;return this},lookup:function(c){this.query=this.$element.val();return!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(c=e.isFunction(this.source)?this.source(this.query,
e.proxy(this.process,this)):this.source)?this.process(c):this},process:function(c){var g=this;c=e.grep(c,function(c){return g.matcher(c)});c=this.sorter(c);return c.length?this.render(c.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(c){return~c.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(c){for(var e=[],h=[],m=[],n;n=c.shift();)n.toLowerCase().indexOf(this.query.toLowerCase())?~n.indexOf(this.query)?h.push(n):m.push(n):e.push(n);return e.concat(h,
m)},highlighter:function(c){var e=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$\x26");return c.replace(new RegExp("("+e+")","ig"),function(c,e){return"\x3cstrong\x3e"+e+"\x3c/strong\x3e"})},render:function(c){var g=this;c=e(c).map(function(c,m){c=e(g.options.item).attr("data-value",m);c.find("a").html(g.highlighter(m));return c[0]});c.first().addClass("active");this.$menu.html(c);return this},next:function(c){c=this.$menu.find(".active").removeClass("active").next();c.length||(c=e(this.$menu.find("li")[0]));
c.addClass("active")},prev:function(c){c=this.$menu.find(".active").removeClass("active").prev();c.length||(c=this.$menu.find("li").last());c.addClass("active")},listen:function(){this.$element.on("focus",e.proxy(this.focus,this)).on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this));if(this.eventSupported("keydown"))this.$element.on("keydown",e.proxy(this.keydown,this));this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",
e.proxy(this.mouseenter,this)).on("mouseleave","li",e.proxy(this.mouseleave,this))},eventSupported:function(c){var e=c in this.$element;e||(this.$element.setAttribute(c,"return;"),e="function"===typeof this.$element[c]);return e},move:function(c){if(this.shown){switch(c.keyCode){case 9:case 13:case 27:c.preventDefault();break;case 38:c.preventDefault();this.prev();break;case 40:c.preventDefault(),this.next()}c.stopPropagation()}},keydown:function(c){this.suppressKeyPressRepeat=~e.inArray(c.keyCode,
[40,38,9,13,27]);this.move(c)},keypress:function(c){this.suppressKeyPressRepeat||this.move(c)},keyup:function(c){switch(c.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}c.stopPropagation();c.preventDefault()},focus:function(c){this.focused=!0},blur:function(c){this.focused=!1;!this.mousedover&&this.shown&&this.hide()},click:function(c){c.stopPropagation();c.preventDefault();
this.select();this.$element.focus()},mouseenter:function(c){this.mousedover=!0;this.$menu.find(".active").removeClass("active");e(c.currentTarget).addClass("active")},mouseleave:function(c){this.mousedover=!1;!this.focused&&this.shown&&this.hide()}};var x=e.fn.typeahead;e.fn.typeahead=function(c){return this.each(function(){var g=e(this),h=g.data("typeahead"),m="object"==typeof c&&c;h||g.data("typeahead",h=new p(this,m));if("string"==typeof c)h[c]()})};e.fn.typeahead.defaults={source:[],items:8,menu:'\x3cul class\x3d"typeahead dropdown-menu"\x3e\x3c/ul\x3e',
item:'\x3cli\x3e\x3ca href\x3d"#"\x3e\x3c/a\x3e\x3c/li\x3e',minLength:1};e.fn.typeahead.Constructor=p;e.fn.typeahead.noConflict=function(){e.fn.typeahead=x;return this};e(document).on("focus.typeahead.data-api",'[data-provide\x3d"typeahead"]',function(c){c=e(this);c.data("typeahead")||c.typeahead(c.data())})}(window.jQuery);
!function(e){var p=function(c,g){this.options=e.extend({},e.fn.affix.defaults,g);this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this));this.$element=e(c);this.checkPosition()};p.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=e(document).height(),g=this.$window.scrollTop(),h=this.$element.offset(),m=this.options.offset,n=m.bottom,p=m.top;"object"!=
typeof m&&(n=p=m);"function"==typeof p&&(p=m.top());"function"==typeof n&&(n=m.bottom());c=null!=this.unpin&&g+this.unpin<=h.top?!1:null!=n&&h.top+this.$element.height()>=c-n?"bottom":null!=p&&g<=p?"top":!1;this.affixed!==c&&(this.affixed=c,this.unpin="bottom"==c?h.top-g:null,this.$element.removeClass("affix affix-top affix-bottom").addClass("affix"+(c?"-"+c:"")))}};var x=e.fn.affix;e.fn.affix=function(c){return this.each(function(){var g=e(this),h=g.data("affix"),m="object"==typeof c&&c;h||g.data("affix",
h=new p(this,m));if("string"==typeof c)h[c]()})};e.fn.affix.Constructor=p;e.fn.affix.defaults={offset:0};e.fn.affix.noConflict=function(){e.fn.affix=x;return this};e(window).on("load",function(){e('[data-spy\x3d"affix"]').each(function(){var c=e(this),g=c.data();g.offset=g.offset||{};g.offsetBottom&&(g.offset.bottom=g.offsetBottom);g.offsetTop&&(g.offset.top=g.offsetTop);c.affix(g)})})}(window.jQuery);var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
(function(){function e(c){function e(c){var e=c.charCodeAt(0);if(92!==e)return e;var g=c.charAt(1);return(e=H[g])?e:"0"<=g&&"7">=g?parseInt(c.substring(1),8):"u"===g||"x"===g?parseInt(c.substring(2),16):c.charCodeAt(1)}function g(c){if(32>c)return(16>c?"\\x0":"\\x")+c.toString(16);c=String.fromCharCode(c);if("\\"===c||"-"===c||"["===c||"]"===c)c="\\"+c;return c}function h(c){var h=c.substring(1,c.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g);c=
[];for(var m=[],n="^"===h[0],p=n?1:0,v=h.length;p<v;++p){var A=h[p];if(/\\[bdsw]/i.test(A))c.push(A);else{var A=e(A),r;p+2<v&&"-"===h[p+1]?(r=e(h[p+2]),p+=2):r=A;m.push([A,r]);65>r||122<A||(65>r||90<A||m.push([Math.max(65,A)|32,Math.min(r,90)|32]),97>r||122<A||m.push([Math.max(97,A)&-33,Math.min(r,122)&-33]))}}m.sort(function(c,e){return c[0]-e[0]||e[1]-c[1]});h=[];A=[NaN,NaN];for(p=0;p<m.length;++p)v=m[p],v[0]<=A[1]+1?A[1]=Math.max(A[1],v[1]):h.push(A=v);m=["["];n&&m.push("^");m.push.apply(m,c);
for(p=0;p<h.length;++p)v=h[p],m.push(g(v[0])),v[1]>v[0]&&(v[1]+1>v[0]&&m.push("-"),m.push(g(v[1])));m.push("]");return m.join("")}function m(c){for(var e=c.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),g=e.length,m=[],v=0,A=0;v<g;++v){var r=e[v];"("===r?++A:"\\"===r.charAt(0)&&(r=+r.substring(1))&&r<=A&&(m[r]=-1)}for(v=1;v<m.length;++v)-1===m[v]&&(m[v]=++n);for(A=v=0;v<g;++v)r=e[v],"("===r?(++A,void 0===m[A]&&(e[v]="(?:")):"\\"===
r.charAt(0)&&(r=+r.substring(1))&&r<=A&&(e[v]="\\"+m[A]);for(A=v=0;v<g;++v)"^"===e[v]&&"^"!==e[v+1]&&(e[v]="");if(c.ignoreCase&&p)for(v=0;v<g;++v)r=e[v],c=r.charAt(0),2<=r.length&&"["===c?e[v]=h(r):"\\"!==c&&(e[v]=r.replace(/[A-Za-z]/g,function(c){c=c.charCodeAt(0);return"["+String.fromCharCode(c&-33,c|32)+"]"}));return e.join("")}for(var n=0,p=!1,r=!1,A=0,x=c.length;A<x;++A){var U=c[A];if(U.ignoreCase)r=!0;else if(/[a-z]/i.test(U.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){p=!0;
r=!1;break}}for(var H={b:8,t:9,n:10,v:11,f:12,r:13},J=[],A=0,x=c.length;A<x;++A){U=c[A];if(U.global||U.multiline)throw Error(""+U);J.push("(?:"+m(U)+")")}return RegExp(J.join("|"),r?"gi":"g")}function p(c){function e(c){switch(c.nodeType){case 1:if(g.test(c.className))break;for(var r=c.firstChild;r;r=r.nextSibling)e(r);r=c.nodeName;if("BR"===r||"LI"===r)h[n]="\n",p[n<<1]=m++,p[n++<<1|1]=c;break;case 3:case 4:r=c.nodeValue,r.length&&(r=A?r.replace(/\r\n?/g,"\n"):r.replace(/[\t\n\r ]+/g," "),h[n]=r,
p[n<<1]=m,m+=r.length,p[n++<<1|1]=c)}}var g=/(?:^|\s)nocode(?:\s|$)/,h=[],m=0,p=[],n=0,r;c.currentStyle?r=c.currentStyle.whiteSpace:window.getComputedStyle&&(r=document.defaultView.getComputedStyle(c,q).getPropertyValue("white-space"));var A=r&&"pre"===r.substring(0,3);e(c);return{a:h.join("").replace(/\n$/,""),c:p}}function x(c,e,g,h){e&&(c={a:e,d:c},g(c),h.push.apply(h,c.e))}function c(c,g){function h(c){for(var e=c.d,A=[e,"pln"],I=0,P=c.a.match(p)||[],H={},J=0,v=P.length;J<v;++J){var R=P[J],y=
H[R],G=void 0,C;if("string"===typeof y)C=!1;else{var D=m[R.charAt(0)];if(D)G=R.match(D[1]),y=D[0];else{for(C=0;C<r;++C)if(D=g[C],G=R.match(D[1])){y=D[0];break}G||(y="pln")}!(C=5<=y.length&&"lang-"===y.substring(0,5))||G&&"string"===typeof G[1]||(C=!1,y="src");C||(H[R]=y)}D=I;I+=R.length;if(C){C=G[1];var L=R.indexOf(C),E=L+C.length;G[2]&&(E=R.length-G[2].length,L=E-C.length);y=y.substring(5);x(e+D,R.substring(0,L),h,A);x(e+D+L,C,n(y,C),A);x(e+D+E,R.substring(E),h,A)}else A.push(e+D,y)}c.e=A}var m=
{},p;(function(){for(var h=c.concat(g),n=[],r={},A=0,I=h.length;A<I;++A){var x=h[A],P=x[3];if(P)for(var v=P.length;0<=--v;)m[P.charAt(v)]=x;x=x[1];P=""+x;r.hasOwnProperty(P)||(n.push(x),r[P]=q)}n.push(/[\S\s]/);p=e(n)})();var r=g.length;return h}function g(e){var g=[],h=[];e.tripleQuotedStrings?g.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):e.multiLineStrings?g.push(["str",
/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,q,"'\"`"]):g.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);e.verbatimStrings&&h.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var m=e.hashComments;m&&(e.cStyleComments?(1<m?g.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):g.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),h.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,
q])):g.push(["com",/^#[^\n\r]*/,q,"#"]));e.cStyleComments&&(h.push(["com",/^\/\/[^\n\r]*/,q]),h.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));e.regexLiterals&&h.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(m=e.types)&&
h.push(["typ",m]);e=(""+e.keywords).replace(/^ | $/g,"");e.length&&h.push(["kwd",RegExp("^(?:"+e.replace(/[\s,]+/g,"|")+")\\b"),q]);g.push(["pln",/^\s+/,q," \r\n\t "]);h.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return c(g,h)}function h(c,e){function g(c){switch(c.nodeType){case 1:if(m.test(c.className))break;
if("BR"===c.nodeName)h(c),c.parentNode&&c.parentNode.removeChild(c);else for(c=c.firstChild;c;c=c.nextSibling)g(c);break;case 3:case 4:if(A){var e=c.nodeValue,r=e.match(p);if(r){var v=e.substring(0,r.index);c.nodeValue=v;(e=e.substring(r.index+r[0].length))&&c.parentNode.insertBefore(n.createTextNode(e),c.nextSibling);h(c);v||c.parentNode.removeChild(c)}}}}function h(c){function e(c,g){g=g?c.cloneNode(!1):c;var h=c.parentNode;if(h){h=e(h,1);c=c.nextSibling;h.appendChild(g);for(var m=c;m;m=c)c=m.nextSibling,
h.appendChild(m)}return g}for(;!c.nextSibling;)if(c=c.parentNode,!c)return;c=e(c.nextSibling,0);for(var g;(g=c.parentNode)&&1===g.nodeType;)c=g;x.push(c)}var m=/(?:^|\s)nocode(?:\s|$)/,p=/\r\n?|\n/,n=c.ownerDocument,r;c.currentStyle?r=c.currentStyle.whiteSpace:window.getComputedStyle&&(r=n.defaultView.getComputedStyle(c,q).getPropertyValue("white-space"));var A=r&&"pre"===r.substring(0,3);for(r=n.createElement("LI");c.firstChild;)r.appendChild(c.firstChild);for(var x=[r],E=0;E<x.length;++E)g(x[E]);
e===(e|0)&&x[0].setAttribute("value",e);var H=n.createElement("OL");H.className="linenums";e=Math.max(0,e-1|0)||0;for(var E=0,J=x.length;E<J;++E)r=x[E],r.className="L"+(E+e)%10,r.firstChild||r.appendChild(n.createTextNode(" ")),H.appendChild(r);c.appendChild(H)}function m(c,e){for(var g=e.length;0<=--g;){var h=e[g];ia.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):ia[h]=c}}function n(c,e){c&&ia.hasOwnProperty(c)||(c=/^\s*</.test(e)?"default-markup":"default-code");
return ia[c]}function W(c){var e=c.g;try{var g=p(c.h),h=g.a;c.a=h;c.c=g.c;c.d=0;n(e,h)(c);var m=/\bMSIE\b/.test(navigator.userAgent),e=/\n/g,r=c.a,x=r.length,g=0,A=c.c,E=A.length,h=0,S=c.e,U=S.length;c=0;S[U]=x;var H,J;for(J=H=0;J<U;)S[J]!==S[J+2]?(S[H++]=S[J++],S[H++]=S[J++]):J+=2;U=H;for(J=H=0;J<U;){for(var v=S[J],N=S[J+1],y=J+2;y+2<=U&&S[y+1]===N;)y+=2;S[H++]=v;S[H++]=N;J=y}for(S.length=H;h<E;){var G=A[h+2]||x,C=S[c+2]||x,y=Math.min(G,C),D=A[h+1],L;if(1!==D.nodeType&&(L=r.substring(g,y))){m&&(L=
L.replace(e,"\r"));D.nodeValue=L;var V=D.ownerDocument,W=V.createElement("SPAN");W.className=S[c+1];var aa=D.parentNode;aa.replaceChild(W,D);W.appendChild(D);g<G&&(A[h+1]=D=V.createTextNode(r.substring(y,G)),aa.insertBefore(D,W.nextSibling))}g=y;g>=G&&(h+=2);g>=C&&(c+=2)}}catch(Z){"console"in window&&console.log(Z&&Z.stack?Z.stack:Z)}}var r=["break,continue,do,else,for,if,return,while"],E=[[r,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],fa=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],aa=[E,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
V=[aa,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],ha=[r,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
Aa=[r,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],r=[r,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],N=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,Ta=/\S/,Ia=g({keywords:[fa,V,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
ha,Aa,r],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),ia={};m(Ia,["default-code"]);m(c([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
"default-markup htm html mxml xhtml xml xsl".split(" "));m(c([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);m(c([],[["atv",/^[\S\s]+/]]),["uq.val"]);m(g({keywords:fa,hashComments:!0,cStyleComments:!0,types:N}),"c cc cpp cxx cyc m".split(" "));m(g({keywords:"null,true,false"}),["json"]);m(g({keywords:V,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:N}),["cs"]);m(g({keywords:aa,cStyleComments:!0}),["java"]);m(g({keywords:r,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);m(g({keywords:ha,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
["cv","py"]);m(g({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);m(g({keywords:Aa,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);m(g({keywords:E,cStyleComments:!0,regexLiterals:!0}),["js"]);m(g({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);m(c([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(c,e,g){var m=document.createElement("PRE");m.innerHTML=c;g&&h(m,g);W({g:e,i:g,h:m});return m.innerHTML};window.prettyPrint=function(c){function e(){for(var g=window.PR_SHOULD_USE_CONTINUATION?x.now()+250:Infinity;A<m.length&&x.now()<g;A++){var n=m[A],p=n.className;if(0<=p.indexOf("prettyprint")){var p=p.match(N),r,y;if(y=
!p){y=n;for(var G=void 0,C=y.firstChild;C;C=C.nextSibling)var D=C.nodeType,G=1===D?G?y:C:3===D?Ta.test(C.nodeValue)?y:G:G;y=(r=G===y?void 0:G)&&"CODE"===r.tagName}y&&(p=r.className.match(N));p&&(p=p[1]);y=!1;for(G=n.parentNode;G;G=G.parentNode)if(("pre"===G.tagName||"code"===G.tagName||"xmp"===G.tagName)&&G.className&&0<=G.className.indexOf("prettyprint")){y=!0;break}y||((y=(y=n.className.match(/\blinenums\b(?::(\d+))?/))?y[1]&&y[1].length?+y[1]:!0:!1)&&h(n,y),E={g:p,h:n,i:y},W(E))}}A<m.length?setTimeout(e,
250):c&&c()}for(var g=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],m=[],n=0;n<g.length;++n)for(var p=0,r=g[n].length;p<r;++p)m.push(g[n][p]);var g=q,x=Date;x.now||(x={now:function(){return+new Date}});var A=0,E,N=/\blang(?:uage)?-([\w.]+)(?!\S)/;e()};window.PR={createSimpleLexer:c,registerLangHandler:m,sourceDecorator:g,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();jQuery(document).ready(function(){$(".topbar").dropdown();prettyPrint()});function asyncJs(e){var p=document.createElement("script"),x=document.getElementsByTagName("script")[0];p.type="text/javascript";p.async=!0;p.src=e;x.parentNode.insertBefore(p,x)}
(function(e,p){"function"===typeof define&&define.amd?define([],p):"object"===typeof module&&module.exports?module.exports=p():(e.AnchorJS=p(),e.anchors=new e.AnchorJS)})(this,function(){return function(e){function p(c){c.icon=c.hasOwnProperty("icon")?c.icon:"";c.visible=c.hasOwnProperty("visible")?c.visible:"hover";c.placement=c.hasOwnProperty("placement")?c.placement:"right";c.ariaLabel=c.hasOwnProperty("ariaLabel")?c.ariaLabel:"Anchor";c.class=c.hasOwnProperty("class")?c.class:"";c.base=c.hasOwnProperty("base")?
c.base:"";c.truncate=c.hasOwnProperty("truncate")?Math.floor(c.truncate):64;c.titleText=c.hasOwnProperty("titleText")?c.titleText:""}function x(c){if("string"===typeof c||c instanceof String)c=[].slice.call(document.querySelectorAll(c));else if(Array.isArray(c)||c instanceof NodeList)c=[].slice.call(c);else throw Error("The selector provided to AnchorJS was invalid.");return c}function c(){if(null===document.head.querySelector("style.anchorjs")){var c=document.createElement("style"),e;c.className=
"anchorjs";c.appendChild(document.createTextNode(""));e=document.head.querySelector('[rel\x3d"stylesheet"], style');void 0===e?document.head.appendChild(c):document.head.insertBefore(c,e);c.sheet.insertRule(" .anchorjs-link {   opacity: 0;   text-decoration: none;   -webkit-font-smoothing: antialiased;   -moz-osx-font-smoothing: grayscale; }",c.sheet.cssRules.length);c.sheet.insertRule(" *:hover \x3e .anchorjs-link, .anchorjs-link:focus  {   opacity: 1; }",c.sheet.cssRules.length);c.sheet.insertRule(" [data-anchorjs-icon]::after {   content: attr(data-anchorjs-icon); }",
c.sheet.cssRules.length);c.sheet.insertRule(' @font-face {   font-family: "anchorjs-icons";   src: url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype"); }',
c.sheet.cssRules.length)}}this.options=e||{};this.elements=[];p(this.options);this.isTouchDevice=function(){return!!("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)};this.add=function(e){var g,m,n,W,r,E,fa,aa=[];p(this.options);fa=this.options.visible;"touch"===fa&&(fa=this.isTouchDevice()?"always":"hover");e||(e="h2, h3, h4, h5, h6");e=x(e);if(0===e.length)return this;c();g=document.querySelectorAll("[id]");g=[].map.call(g,function(c){return c.id});for(n=0;n<e.length;n++)if(this.hasAnchorJSLink(e[n]))aa.push(n);
else{if(e[n].hasAttribute("id"))m=e[n].getAttribute("id");else if(e[n].hasAttribute("data-anchor-id"))m=e[n].getAttribute("data-anchor-id");else{E=r=this.urlify(e[n].textContent);m=0;do void 0!==W&&(E=r+"-"+m),W=g.indexOf(E),m+=1;while(-1!==W);W=void 0;g.push(E);e[n].setAttribute("id",E);m=E}r=document.createElement("a");r.className="anchorjs-link "+this.options.class;r.setAttribute("aria-label",this.options.ariaLabel);r.setAttribute("data-anchorjs-icon",this.options.icon);this.options.titleText&&
(r.title=this.options.titleText);E=document.querySelector("base")?window.location.pathname+window.location.search:"";E=this.options.base||E;r.href=E+"#"+m;"always"===fa&&(r.style.opacity="1");""===this.options.icon&&(r.style.font="1em/1 anchorjs-icons","left"===this.options.placement&&(r.style.lineHeight="inherit"));"left"===this.options.placement?(r.style.position="absolute",r.style.marginLeft="-1em",r.style.paddingRight="0.5em",e[n].insertBefore(r,e[n].firstChild)):(r.style.paddingLeft="0.375em",
e[n].appendChild(r))}for(n=0;n<aa.length;n++)e.splice(aa[n]-n,1);this.elements=this.elements.concat(e);return this};this.remove=function(c){for(var e,g=x(c),n=0;n<g.length;n++)if(e=g[n].querySelector(".anchorjs-link"))c=this.elements.indexOf(g[n]),-1!==c&&this.elements.splice(c,1),g[n].removeChild(e);return this};this.removeAll=function(){this.remove(this.elements)};this.urlify=function(c){this.options.truncate||p(this.options);return c.trim().replace(/\'/gi,"").replace(/[& +$,:;=?@"#{}|^~[`%!'<>\]\.\/\(\)\*\\\n\t\b\v]/g,
"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()};this.hasAnchorJSLink=function(c){var e=c.firstChild&&-1<(" "+c.firstChild.className+" ").indexOf(" anchorjs-link ");c=c.lastChild&&-1<(" "+c.lastChild.className+" ").indexOf(" anchorjs-link ");return e||c||!1}}});