Difference between revisions of "Team:Cornell NY/JS"

Line 1: Line 1:
/* Modernizr 2.6.2 (Custom Build) | MIT & BSD
+
/*!
  * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load
+
* jQuery JavaScript Library v1.12.4
 +
  * http://jquery.com/
 +
*
 +
* Includes Sizzle.js
 +
* http://sizzlejs.com/
 +
*
 +
* Copyright jQuery Foundation and other contributors
 +
* Released under the MIT license
 +
* http://jquery.org/license
 +
*
 +
* Date: 2016-05-20T17:17Z
 
  */
 
  */
;window.Modernizr=function(a,b,c){function D(a){j.cssText=a}function E(a,b){return D(n.join(a+";")+(b||""))}function F(a,b){return typeof a===b}function G(a,b){return!!~(""+a).indexOf(b)}function H(a,b){for(var d in a){var e=a[d];if(!G(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function I(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:F(f,"function")?f.bind(d||b):f}return!1}function J(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return F(b,"string")||F(b,"undefined")?H(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),I(e,b,c))}function K(){e.input=function(c){for(var d=0,e=c.length;d<e;d++)u[c[d]]=c[d]in k;return u.list&&(u.list=!!b.createElement("datalist")&&!!a.HTMLDataListElement),u}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),e.inputtypes=function(a){for(var d=0,e,f,h,i=a.length;d<i;d++)k.setAttribute("type",f=a[d]),e=k.type!=="text",e&&(k.value=l,k.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(f)&&k.style.WebkitAppearance!==c?(g.appendChild(k),h=b.defaultView,e=h.getComputedStyle&&h.getComputedStyle(k,null).WebkitAppearance!=="textfield"&&k.offsetHeight!==0,g.removeChild(k)):/^(search|tel)$/.test(f)||(/^(url|email)$/.test(f)?e=k.checkValidity&&k.checkValidity()===!1:e=k.value!=l)),t[a[d]]=!!e;return t}("search tel url email datetime date month week time datetime-local number range color".split(" "))}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k=b.createElement("input"),l=":)",m={}.toString,n=" -webkit- -moz- -o- -ms- ".split(" "),o="Webkit Moz O ms",p=o.split(" "),q=o.toLowerCase().split(" "),r={svg:"http://www.w3.org/2000/svg"},s={},t={},u={},v=[],w=v.slice,x,y=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["&#173;",'<style id="s',h,'">',a,"</style>"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},z=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b).matches;var d;return y("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},A=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=F(e[d],"function"),F(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),B={}.hasOwnProperty,C;!F(B,"undefined")&&!F(B.call,"undefined")?C=function(a,b){return B.call(a,b)}:C=function(a,b){return b in a&&F(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=w.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(w.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(w.call(arguments)))};return e}),s.flexbox=function(){return J("flexWrap")},s.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},s.canvastext=function(){return!!e.canvas&&!!F(b.createElement("canvas").getContext("2d").fillText,"function")},s.webgl=function(){return!!a.WebGLRenderingContext},s.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:y(["@media (",n.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},s.geolocation=function(){return"geolocation"in navigator},s.postmessage=function(){return!!a.postMessage},s.websqldatabase=function(){return!!a.openDatabase},s.indexedDB=function(){return!!J("indexedDB",a)},s.hashchange=function(){return A("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},s.history=function(){return!!a.history&&!!history.pushState},s.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},s.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},s.rgba=function(){return D("background-color:rgba(150,255,150,.5)"),G(j.backgroundColor,"rgba")},s.hsla=function(){return D("background-color:hsla(120,40%,100%,.5)"),G(j.backgroundColor,"rgba")||G(j.backgroundColor,"hsla")},s.multiplebgs=function(){return D("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(j.background)},s.backgroundsize=function(){return J("backgroundSize")},s.borderimage=function(){return J("borderImage")},s.borderradius=function(){return J("borderRadius")},s.boxshadow=function(){return J("boxShadow")},s.textshadow=function(){return b.createElement("div").style.textShadow===""},s.opacity=function(){return E("opacity:.55"),/^0.55$/.test(j.opacity)},s.cssanimations=function(){return J("animationName")},s.csscolumns=function(){return J("columnCount")},s.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return D((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),G(j.backgroundImage,"gradient")},s.cssreflections=function(){return J("boxReflect")},s.csstransforms=function(){return!!J("transform")},s.csstransforms3d=function(){var a=!!J("perspective");return a&&"webkitPerspective"in g.style&&y("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},s.csstransitions=function(){return J("transition")},s.fontface=function(){var a;return y('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&g.indexOf(d.split(" ")[0])===0}),a},s.generatedcontent=function(){var a;return y(["#",h,"{font:0/0 a}#",h,':after{content:"',l,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},s.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c},s.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayType("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,"")}catch(d){}return c},s.localstorage=function(){try{return localStorage.setItem(h,h),localStorage.removeItem(h),!0}catch(a){return!1}},s.sessionstorage=function(){try{return sessionStorage.setItem(h,h),sessionStorage.removeItem(h),!0}catch(a){return!1}},s.webworkers=function(){return!!a.Worker},s.applicationcache=function(){return!!a.applicationCache},s.svg=function(){return!!b.createElementNS&&!!b.createElementNS(r.svg,"svg").createSVGRect},s.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="<svg/>",(a.firstChild&&a.firstChild.namespaceURI)==r.svg},s.smil=function(){return!!b.createElementNS&&/SVGAnimate/.test(m.call(b.createElementNS(r.svg,"animate")))},s.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(m.call(b.createElementNS(r.svg,"clipPath")))};for(var L in s)C(s,L)&&(x=L.toLowerCase(),e[x]=s[L](),v.push((e[x]?"":"no-")+x));return e.input||K(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)C(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},D(""),i=k=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e<g;e++)d.createElement(f[e]);return d}function p(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return r.shivMethods?n(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+l().join().replace(/\w+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(r,b.frag)}function q(a){a||(a=b);var c=m(a);return r.shivCSS&&!f&&!c.hasCSS&&(c.hasCSS=!!k(a,"article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}")),j||p(a,c),a}var c=a.html5||{},d=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,f,g="_html5shiv",h=0,i={},j;(function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.mq=z,e.hasEvent=A,e.testProp=function(a){return H([a])},e.testAllProps=J,e.testStyles=y,e.prefixed=function(a,b,c){return b?J(a,b,c):J(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+v.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
 
  
!function(a,b,c,d){function e(b,c){this.settings=null,this.options=a.extend({},e.Defaults,c),this.$element=a(b),this.drag=a.extend({},m),this.state=a.extend({},n),this.e=a.extend({},o),this._plugins={},this._supress={},this._current=null,this._speed=null,this._coordinates=[],this._breakpoint=null,this._width=null,this._items=[],this._clones=[],this._mergers=[],this._invalidated={},this._pipe=[],a.each(e.Plugins,a.proxy(function(a,b){this._plugins[a[0].toLowerCase()+a.slice(1)]=new b(this)},this)),a.each(e.Pipe,a.proxy(function(b,c){this._pipe.push({filter:c.filter,run:a.proxy(c.run,this)})},this)),this.setup(),this.initialize()}function f(a){if(a.touches!==d)return{x:a.touches[0].pageX,y:a.touches[0].pageY};if(a.touches===d){if(a.pageX!==d)return{x:a.pageX,y:a.pageY};if(a.pageX===d)return{x:a.clientX,y:a.clientY}}}function g(a){var b,d,e=c.createElement("div"),f=a;for(b in f)if(d=f[b],"undefined"!=typeof e.style[d])return e=null,[d,b];return[!1]}function h(){return g(["transition","WebkitTransition","MozTransition","OTransition"])[1]}function i(){return g(["transform","WebkitTransform","MozTransform","OTransform","msTransform"])[0]}function j(){return g(["perspective","webkitPerspective","MozPerspective","OPerspective","MsPerspective"])[0]}function k(){return"ontouchstart"in b||!!navigator.msMaxTouchPoints}function l(){return b.navigator.msPointerEnabled}var m,n,o;m={start:0,startX:0,startY:0,current:0,currentX:0,currentY:0,offsetX:0,offsetY:0,distance:null,startTime:0,endTime:0,updatedX:0,targetEl:null},n={isTouch:!1,isScrolling:!1,isSwiping:!1,direction:!1,inMotion:!1},o={_onDragStart:null,_onDragMove:null,_onDragEnd:null,_transitionEnd:null,_resizer:null,_responsiveCall:null,_goToLoop:null,_checkVisibile:null},e.Defaults={items:3,loop:!1,center:!1,mouseDrag:!0,touchDrag:!0,pullDrag:!0,freeDrag:!1,margin:0,stagePadding:0,merge:!1,mergeFit:!0,autoWidth:!1,startPosition:0,rtl:!1,smartSpeed:250,fluidSpeed:!1,dragEndSpeed:!1,responsive:{},responsiveRefreshRate:200,responsiveBaseElement:b,responsiveClass:!1,fallbackEasing:"swing",info:!1,nestedItemSelector:!1,itemElement:"div",stageElement:"div",themeClass:"owl-theme",baseClass:"owl-carousel",itemClass:"owl-item",centerClass:"center",activeClass:"active"},e.Width={Default:"default",Inner:"inner",Outer:"outer"},e.Plugins={},e.Pipe=[{filter:["width","items","settings"],run:function(a){a.current=this._items&&this._items[this.relative(this._current)]}},{filter:["items","settings"],run:function(){var a=this._clones,b=this.$stage.children(".cloned");(b.length!==a.length||!this.settings.loop&&a.length>0)&&(this.$stage.children(".cloned").remove(),this._clones=[])}},{filter:["items","settings"],run:function(){var a,b,c=this._clones,d=this._items,e=this.settings.loop?c.length-Math.max(2*this.settings.items,4):0;for(a=0,b=Math.abs(e/2);b>a;a++)e>0?(this.$stage.children().eq(d.length+c.length-1).remove(),c.pop(),this.$stage.children().eq(0).remove(),c.pop()):(c.push(c.length/2),this.$stage.append(d[c[c.length-1]].clone().addClass("cloned")),c.push(d.length-1-(c.length-1)/2),this.$stage.prepend(d[c[c.length-1]].clone().addClass("cloned")))}},{filter:["width","items","settings"],run:function(){var a,b,c,d=this.settings.rtl?1:-1,e=(this.width()/this.settings.items).toFixed(3),f=0;for(this._coordinates=[],b=0,c=this._clones.length+this._items.length;c>b;b++)a=this._mergers[this.relative(b)],a=this.settings.mergeFit&&Math.min(a,this.settings.items)||a,f+=(this.settings.autoWidth?this._items[this.relative(b)].width()+this.settings.margin:e*a)*d,this._coordinates.push(f)}},{filter:["width","items","settings"],run:function(){var b,c,d=(this.width()/this.settings.items).toFixed(3),e={width:Math.abs(this._coordinates[this._coordinates.length-1])+2*this.settings.stagePadding,"padding-left":this.settings.stagePadding||"","padding-right":this.settings.stagePadding||""};if(this.$stage.css(e),e={width:this.settings.autoWidth?"auto":d-this.settings.margin},e[this.settings.rtl?"margin-left":"margin-right"]=this.settings.margin,!this.settings.autoWidth&&a.grep(this._mergers,function(a){return a>1}).length>0)for(b=0,c=this._coordinates.length;c>b;b++)e.width=Math.abs(this._coordinates[b])-Math.abs(this._coordinates[b-1]||0)-this.settings.margin,this.$stage.children().eq(b).css(e);else this.$stage.children().css(e)}},{filter:["width","items","settings"],run:function(a){a.current&&this.reset(this.$stage.children().index(a.current))}},{filter:["position"],run:function(){this.animate(this.coordinates(this._current))}},{filter:["width","position","items","settings"],run:function(){var a,b,c,d,e=this.settings.rtl?1:-1,f=2*this.settings.stagePadding,g=this.coordinates(this.current())+f,h=g+this.width()*e,i=[];for(c=0,d=this._coordinates.length;d>c;c++)a=this._coordinates[c-1]||0,b=Math.abs(this._coordinates[c])+f*e,(this.op(a,"<=",g)&&this.op(a,">",h)||this.op(b,"<",g)&&this.op(b,">",h))&&i.push(c);this.$stage.children("."+this.settings.activeClass).removeClass(this.settings.activeClass),this.$stage.children(":eq("+i.join("), :eq(")+")").addClass(this.settings.activeClass),this.settings.center&&(this.$stage.children("."+this.settings.centerClass).removeClass(this.settings.centerClass),this.$stage.children().eq(this.current()).addClass(this.settings.centerClass))}}],e.prototype.initialize=function(){if(this.trigger("initialize"),this.$element.addClass(this.settings.baseClass).addClass(this.settings.themeClass).toggleClass("owl-rtl",this.settings.rtl),this.browserSupport(),this.settings.autoWidth&&this.state.imagesLoaded!==!0){var b,c,e;if(b=this.$element.find("img"),c=this.settings.nestedItemSelector?"."+this.settings.nestedItemSelector:d,e=this.$element.children(c).width(),b.length&&0>=e)return this.preloadAutoWidthImages(b),!1}this.$element.addClass("owl-loading"),this.$stage=a("<"+this.settings.stageElement+' class="owl-stage"/>').wrap('<div class="owl-stage-outer">'),this.$element.append(this.$stage.parent()),this.replace(this.$element.children().not(this.$stage.parent())),this._width=this.$element.width(),this.refresh(),this.$element.removeClass("owl-loading").addClass("owl-loaded"),this.eventsCall(),this.internalEvents(),this.addTriggerableEvents(),this.trigger("initialized")},e.prototype.setup=function(){var b=this.viewport(),c=this.options.responsive,d=-1,e=null;c?(a.each(c,function(a){b>=a&&a>d&&(d=Number(a))}),e=a.extend({},this.options,c[d]),delete e.responsive,e.responsiveClass&&this.$element.attr("class",function(a,b){return b.replace(/\b owl-responsive-\S+/g,"")}).addClass("owl-responsive-"+d)):e=a.extend({},this.options),(null===this.settings||this._breakpoint!==d)&&(this.trigger("change",{property:{name:"settings",value:e}}),this._breakpoint=d,this.settings=e,this.invalidate("settings"),this.trigger("changed",{property:{name:"settings",value:this.settings}}))},e.prototype.optionsLogic=function(){this.$element.toggleClass("owl-center",this.settings.center),this.settings.loop&&this._items.length<this.settings.items&&(this.settings.loop=!1),this.settings.autoWidth&&(this.settings.stagePadding=!1,this.settings.merge=!1)},e.prototype.prepare=function(b){var c=this.trigger("prepare",{content:b});return c.data||(c.data=a("<"+this.settings.itemElement+"/>").addClass(this.settings.itemClass).append(b)),this.trigger("prepared",{content:c.data}),c.data},e.prototype.update=function(){for(var b=0,c=this._pipe.length,d=a.proxy(function(a){return this[a]},this._invalidated),e={};c>b;)(this._invalidated.all||a.grep(this._pipe[b].filter,d).length>0)&&this._pipe[b].run(e),b++;this._invalidated={}},e.prototype.width=function(a){switch(a=a||e.Width.Default){case e.Width.Inner:case e.Width.Outer:return this._width;default:return this._width-2*this.settings.stagePadding+this.settings.margin}},e.prototype.refresh=function(){if(0===this._items.length)return!1;(new Date).getTime();this.trigger("refresh"),this.setup(),this.optionsLogic(),this.$stage.addClass("owl-refresh"),this.update(),this.$stage.removeClass("owl-refresh"),this.state.orientation=b.orientation,this.watchVisibility(),this.trigger("refreshed")},e.prototype.eventsCall=function(){this.e._onDragStart=a.proxy(function(a){this.onDragStart(a)},this),this.e._onDragMove=a.proxy(function(a){this.onDragMove(a)},this),this.e._onDragEnd=a.proxy(function(a){this.onDragEnd(a)},this),this.e._onResize=a.proxy(function(a){this.onResize(a)},this),this.e._transitionEnd=a.proxy(function(a){this.transitionEnd(a)},this),this.e._preventClick=a.proxy(function(a){this.preventClick(a)},this)},e.prototype.onThrottledResize=function(){b.clearTimeout(this.resizeTimer),this.resizeTimer=b.setTimeout(this.e._onResize,this.settings.responsiveRefreshRate)},e.prototype.onResize=function(){return this._items.length?this._width===this.$element.width()?!1:this.trigger("resize").isDefaultPrevented()?!1:(this._width=this.$element.width(),this.invalidate("width"),this.refresh(),void this.trigger("resized")):!1},e.prototype.eventsRouter=function(a){var b=a.type;"mousedown"===b||"touchstart"===b?this.onDragStart(a):"mousemove"===b||"touchmove"===b?this.onDragMove(a):"mouseup"===b||"touchend"===b?this.onDragEnd(a):"touchcancel"===b&&this.onDragEnd(a)},e.prototype.internalEvents=function(){var c=(k(),l());this.settings.mouseDrag?(this.$stage.on("mousedown",a.proxy(function(a){this.eventsRouter(a)},this)),this.$stage.on("dragstart",function(){return!1}),this.$stage.get(0).onselectstart=function(){return!1}):this.$element.addClass("owl-text-select-on"),this.settings.touchDrag&&!c&&this.$stage.on("touchstart touchcancel",a.proxy(function(a){this.eventsRouter(a)},this)),this.transitionEndVendor&&this.on(this.$stage.get(0),this.transitionEndVendor,this.e._transitionEnd,!1),this.settings.responsive!==!1&&this.on(b,"resize",a.proxy(this.onThrottledResize,this))},e.prototype.onDragStart=function(d){var e,g,h,i;if(e=d.originalEvent||d||b.event,3===e.which||this.state.isTouch)return!1;if("mousedown"===e.type&&this.$stage.addClass("owl-grab"),this.trigger("drag"),this.drag.startTime=(new Date).getTime(),this.speed(0),this.state.isTouch=!0,this.state.isScrolling=!1,this.state.isSwiping=!1,this.drag.distance=0,g=f(e).x,h=f(e).y,this.drag.offsetX=this.$stage.position().left,this.drag.offsetY=this.$stage.position().top,this.settings.rtl&&(this.drag.offsetX=this.$stage.position().left+this.$stage.width()-this.width()+this.settings.margin),this.state.inMotion&&this.support3d)i=this.getTransformProperty(),this.drag.offsetX=i,this.animate(i),this.state.inMotion=!0;else if(this.state.inMotion&&!this.support3d)return this.state.inMotion=!1,!1;this.drag.startX=g-this.drag.offsetX,this.drag.startY=h-this.drag.offsetY,this.drag.start=g-this.drag.startX,this.drag.targetEl=e.target||e.srcElement,this.drag.updatedX=this.drag.start,("IMG"===this.drag.targetEl.tagName||"A"===this.drag.targetEl.tagName)&&(this.drag.targetEl.draggable=!1),a(c).on("mousemove.owl.dragEvents mouseup.owl.dragEvents touchmove.owl.dragEvents touchend.owl.dragEvents",a.proxy(function(a){this.eventsRouter(a)},this))},e.prototype.onDragMove=function(a){var c,e,g,h,i,j;this.state.isTouch&&(this.state.isScrolling||(c=a.originalEvent||a||b.event,e=f(c).x,g=f(c).y,this.drag.currentX=e-this.drag.startX,this.drag.currentY=g-this.drag.startY,this.drag.distance=this.drag.currentX-this.drag.offsetX,this.drag.distance<0?this.state.direction=this.settings.rtl?"right":"left":this.drag.distance>0&&(this.state.direction=this.settings.rtl?"left":"right"),this.settings.loop?this.op(this.drag.currentX,">",this.coordinates(this.minimum()))&&"right"===this.state.direction?this.drag.currentX-=(this.settings.center&&this.coordinates(0))-this.coordinates(this._items.length):this.op(this.drag.currentX,"<",this.coordinates(this.maximum()))&&"left"===this.state.direction&&(this.drag.currentX+=(this.settings.center&&this.coordinates(0))-this.coordinates(this._items.length)):(h=this.coordinates(this.settings.rtl?this.maximum():this.minimum()),i=this.coordinates(this.settings.rtl?this.minimum():this.maximum()),j=this.settings.pullDrag?this.drag.distance/5:0,this.drag.currentX=Math.max(Math.min(this.drag.currentX,h+j),i+j)),(this.drag.distance>8||this.drag.distance<-8)&&(c.preventDefault!==d?c.preventDefault():c.returnValue=!1,this.state.isSwiping=!0),this.drag.updatedX=this.drag.currentX,(this.drag.currentY>16||this.drag.currentY<-16)&&this.state.isSwiping===!1&&(this.state.isScrolling=!0,this.drag.updatedX=this.drag.start),this.animate(this.drag.updatedX)))},e.prototype.onDragEnd=function(b){var d,e,f;if(this.state.isTouch){if("mouseup"===b.type&&this.$stage.removeClass("owl-grab"),this.trigger("dragged"),this.drag.targetEl.removeAttribute("draggable"),this.state.isTouch=!1,this.state.isScrolling=!1,this.state.isSwiping=!1,0===this.drag.distance&&this.state.inMotion!==!0)return this.state.inMotion=!1,!1;this.drag.endTime=(new Date).getTime(),d=this.drag.endTime-this.drag.startTime,e=Math.abs(this.drag.distance),(e>3||d>300)&&this.removeClick(this.drag.targetEl),f=this.closest(this.drag.updatedX),this.speed(this.settings.dragEndSpeed||this.settings.smartSpeed),this.current(f),this.invalidate("position"),this.update(),this.settings.pullDrag||this.drag.updatedX!==this.coordinates(f)||this.transitionEnd(),this.drag.distance=0,a(c).off(".owl.dragEvents")}},e.prototype.removeClick=function(c){this.drag.targetEl=c,a(c).on("click.preventClick",this.e._preventClick),b.setTimeout(function(){a(c).off("click.preventClick")},300)},e.prototype.preventClick=function(b){b.preventDefault?b.preventDefault():b.returnValue=!1,b.stopPropagation&&b.stopPropagation(),a(b.target).off("click.preventClick")},e.prototype.getTransformProperty=function(){var a,c;return a=b.getComputedStyle(this.$stage.get(0),null).getPropertyValue(this.vendorName+"transform"),a=a.replace(/matrix(3d)?\(|\)/g,"").split(","),c=16===a.length,c!==!0?a[4]:a[12]},e.prototype.closest=function(b){var c=-1,d=30,e=this.width(),f=this.coordinates();return this.settings.freeDrag||a.each(f,a.proxy(function(a,g){return b>g-d&&g+d>b?c=a:this.op(b,"<",g)&&this.op(b,">",f[a+1]||g-e)&&(c="left"===this.state.direction?a+1:a),-1===c},this)),this.settings.loop||(this.op(b,">",f[this.minimum()])?c=b=this.minimum():this.op(b,"<",f[this.maximum()])&&(c=b=this.maximum())),c},e.prototype.animate=function(b){this.trigger("translate"),this.state.inMotion=this.speed()>0,this.support3d?this.$stage.css({transform:"translate3d("+b+"px,0px, 0px)",transition:this.speed()/1e3+"s"}):this.state.isTouch?this.$stage.css({left:b+"px"}):this.$stage.animate({left:b},this.speed()/1e3,this.settings.fallbackEasing,a.proxy(function(){this.state.inMotion&&this.transitionEnd()},this))},e.prototype.current=function(a){if(a===d)return this._current;if(0===this._items.length)return d;if(a=this.normalize(a),this._current!==a){var b=this.trigger("change",{property:{name:"position",value:a}});b.data!==d&&(a=this.normalize(b.data)),this._current=a,this.invalidate("position"),this.trigger("changed",{property:{name:"position",value:this._current}})}return this._current},e.prototype.invalidate=function(a){this._invalidated[a]=!0},e.prototype.reset=function(a){a=this.normalize(a),a!==d&&(this._speed=0,this._current=a,this.suppress(["translate","translated"]),this.animate(this.coordinates(a)),this.release(["translate","translated"]))},e.prototype.normalize=function(b,c){var e=c?this._items.length:this._items.length+this._clones.length;return!a.isNumeric(b)||1>e?d:b=this._clones.length?(b%e+e)%e:Math.max(this.minimum(c),Math.min(this.maximum(c),b))},e.prototype.relative=function(a){return a=this.normalize(a),a-=this._clones.length/2,this.normalize(a,!0)},e.prototype.maximum=function(a){var b,c,d,e=0,f=this.settings;if(a)return this._items.length-1;if(!f.loop&&f.center)b=this._items.length-1;else if(f.loop||f.center)if(f.loop||f.center)b=this._items.length+f.items;else{if(!f.autoWidth&&!f.merge)throw"Can not detect maximum absolute position.";for(revert=f.rtl?1:-1,c=this.$stage.width()-this.$element.width();(d=this.coordinates(e))&&!(d*revert>=c);)b=++e}else b=this._items.length-f.items;return b},e.prototype.minimum=function(a){return a?0:this._clones.length/2},e.prototype.items=function(a){return a===d?this._items.slice():(a=this.normalize(a,!0),this._items[a])},e.prototype.mergers=function(a){return a===d?this._mergers.slice():(a=this.normalize(a,!0),this._mergers[a])},e.prototype.clones=function(b){var c=this._clones.length/2,e=c+this._items.length,f=function(a){return a%2===0?e+a/2:c-(a+1)/2};return b===d?a.map(this._clones,function(a,b){return f(b)}):a.map(this._clones,function(a,c){return a===b?f(c):null})},e.prototype.speed=function(a){return a!==d&&(this._speed=a),this._speed},e.prototype.coordinates=function(b){var c=null;return b===d?a.map(this._coordinates,a.proxy(function(a,b){return this.coordinates(b)},this)):(this.settings.center?(c=this._coordinates[b],c+=(this.width()-c+(this._coordinates[b-1]||0))/2*(this.settings.rtl?-1:1)):c=this._coordinates[b-1]||0,c)},e.prototype.duration=function(a,b,c){return Math.min(Math.max(Math.abs(b-a),1),6)*Math.abs(c||this.settings.smartSpeed)},e.prototype.to=function(c,d){if(this.settings.loop){var e=c-this.relative(this.current()),f=this.current(),g=this.current(),h=this.current()+e,i=0>g-h?!0:!1,j=this._clones.length+this._items.length;h<this.settings.items&&i===!1?(f=g+this._items.length,this.reset(f)):h>=j-this.settings.items&&i===!0&&(f=g-this._items.length,this.reset(f)),b.clearTimeout(this.e._goToLoop),this.e._goToLoop=b.setTimeout(a.proxy(function(){this.speed(this.duration(this.current(),f+e,d)),this.current(f+e),this.update()},this),30)}else this.speed(this.duration(this.current(),c,d)),this.current(c),this.update()},e.prototype.next=function(a){a=a||!1,this.to(this.relative(this.current())+1,a)},e.prototype.prev=function(a){a=a||!1,this.to(this.relative(this.current())-1,a)},e.prototype.transitionEnd=function(a){return a!==d&&(a.stopPropagation(),(a.target||a.srcElement||a.originalTarget)!==this.$stage.get(0))?!1:(this.state.inMotion=!1,void this.trigger("translated"))},e.prototype.viewport=function(){var d;if(this.options.responsiveBaseElement!==b)d=a(this.options.responsiveBaseElement).width();else if(b.innerWidth)d=b.innerWidth;else{if(!c.documentElement||!c.documentElement.clientWidth)throw"Can not detect viewport width.";d=c.documentElement.clientWidth}return d},e.prototype.replace=function(b){this.$stage.empty(),this._items=[],b&&(b=b instanceof jQuery?b:a(b)),this.settings.nestedItemSelector&&(b=b.find("."+this.settings.nestedItemSelector)),b.filter(function(){return 1===this.nodeType}).each(a.proxy(function(a,b){b=this.prepare(b),this.$stage.append(b),this._items.push(b),this._mergers.push(1*b.find("[data-merge]").andSelf("[data-merge]").attr("data-merge")||1)},this)),this.reset(a.isNumeric(this.settings.startPosition)?this.settings.startPosition:0),this.invalidate("items")},e.prototype.add=function(a,b){b=b===d?this._items.length:this.normalize(b,!0),this.trigger("add",{content:a,position:b}),0===this._items.length||b===this._items.length?(this.$stage.append(a),this._items.push(a),this._mergers.push(1*a.find("[data-merge]").andSelf("[data-merge]").attr("data-merge")||1)):(this._items[b].before(a),this._items.splice(b,0,a),this._mergers.splice(b,0,1*a.find("[data-merge]").andSelf("[data-merge]").attr("data-merge")||1)),this.invalidate("items"),this.trigger("added",{content:a,position:b})},e.prototype.remove=function(a){a=this.normalize(a,!0),a!==d&&(this.trigger("remove",{content:this._items[a],position:a}),this._items[a].remove(),this._items.splice(a,1),this._mergers.splice(a,1),this.invalidate("items"),this.trigger("removed",{content:null,position:a}))},e.prototype.addTriggerableEvents=function(){var b=a.proxy(function(b,c){return a.proxy(function(a){a.relatedTarget!==this&&(this.suppress([c]),b.apply(this,[].slice.call(arguments,1)),this.release([c]))},this)},this);a.each({next:this.next,prev:this.prev,to:this.to,destroy:this.destroy,refresh:this.refresh,replace:this.replace,add:this.add,remove:this.remove},a.proxy(function(a,c){this.$element.on(a+".owl.carousel",b(c,a+".owl.carousel"))},this))},e.prototype.watchVisibility=function(){function c(a){return a.offsetWidth>0&&a.offsetHeight>0}function d(){c(this.$element.get(0))&&(this.$element.removeClass("owl-hidden"),this.refresh(),b.clearInterval(this.e._checkVisibile))}c(this.$element.get(0))||(this.$element.addClass("owl-hidden"),b.clearInterval(this.e._checkVisibile),this.e._checkVisibile=b.setInterval(a.proxy(d,this),500))},e.prototype.preloadAutoWidthImages=function(b){var c,d,e,f;c=0,d=this,b.each(function(g,h){e=a(h),f=new Image,f.onload=function(){c++,e.attr("src",f.src),e.css("opacity",1),c>=b.length&&(d.state.imagesLoaded=!0,d.initialize())},f.src=e.attr("src")||e.attr("data-src")||e.attr("data-src-retina")})},e.prototype.destroy=function(){this.$element.hasClass(this.settings.themeClass)&&this.$element.removeClass(this.settings.themeClass),this.settings.responsive!==!1&&a(b).off("resize.owl.carousel"),this.transitionEndVendor&&this.off(this.$stage.get(0),this.transitionEndVendor,this.e._transitionEnd);for(var d in this._plugins)this._plugins[d].destroy();(this.settings.mouseDrag||this.settings.touchDrag)&&(this.$stage.off("mousedown touchstart touchcancel"),a(c).off(".owl.dragEvents"),this.$stage.get(0).onselectstart=function(){},this.$stage.off("dragstart",function(){return!1})),this.$element.off(".owl"),this.$stage.children(".cloned").remove(),this.e=null,this.$element.removeData("owlCarousel"),this.$stage.children().contents().unwrap(),this.$stage.children().unwrap(),this.$stage.unwrap()},e.prototype.op=function(a,b,c){var d=this.settings.rtl;switch(b){case"<":return d?a>c:c>a;case">":return d?c>a:a>c;case">=":return d?c>=a:a>=c;case"<=":return d?a>=c:c>=a}},e.prototype.on=function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,d):a.attachEvent&&a.attachEvent("on"+b,c)},e.prototype.off=function(a,b,c,d){a.removeEventListener?a.removeEventListener(b,c,d):a.detachEvent&&a.detachEvent("on"+b,c)},e.prototype.trigger=function(b,c,d){var e={item:{count:this._items.length,index:this.current()}},f=a.camelCase(a.grep(["on",b,d],function(a){return a}).join("-").toLowerCase()),g=a.Event([b,"owl",d||"carousel"].join(".").toLowerCase(),a.extend({relatedTarget:this},e,c));return this._supress[b]||(a.each(this._plugins,function(a,b){b.onTrigger&&b.onTrigger(g)}),this.$element.trigger(g),this.settings&&"function"==typeof this.settings[f]&&this.settings[f].apply(this,g)),g},e.prototype.suppress=function(b){a.each(b,a.proxy(function(a,b){this._supress[b]=!0},this))},e.prototype.release=function(b){a.each(b,a.proxy(function(a,b){delete this._supress[b]},this))},e.prototype.browserSupport=function(){if(this.support3d=j(),this.support3d){this.transformVendor=i();var a=["transitionend","webkitTransitionEnd","transitionend","oTransitionEnd"];this.transitionEndVendor=a[h()],this.vendorName=this.transformVendor.replace(/Transform/i,""),this.vendorName=""!==this.vendorName?"-"+this.vendorName.toLowerCase()+"-":""}this.state.orientation=b.orientation},a.fn.owlCarousel=function(b){return this.each(function(){a(this).data("owlCarousel")||a(this).data("owlCarousel",new e(this,b))})},a.fn.owlCarousel.Constructor=e}(window.Zepto||window.jQuery,window,document),function(a,b){var c=function(b){this._core=b,this._loaded=[],this._handlers={"initialized.owl.carousel change.owl.carousel":a.proxy(function(b){if(b.namespace&&this._core.settings&&this._core.settings.lazyLoad&&(b.property&&"position"==b.property.name||"initialized"==b.type))for(var c=this._core.settings,d=c.center&&Math.ceil(c.items/2)||c.items,e=c.center&&-1*d||0,f=(b.property&&b.property.value||this._core.current())+e,g=this._core.clones().length,h=a.proxy(function(a,b){this.load(b)},this);e++<d;)this.load(g/2+this._core.relative(f)),g&&a.each(this._core.clones(this._core.relative(f++)),h)},this)},this._core.options=a.extend({},c.Defaults,this._core.options),this._core.$element.on(this._handlers)};c.Defaults={lazyLoad:!1},c.prototype.load=function(c){var d=this._core.$stage.children().eq(c),e=d&&d.find(".owl-lazy");!e||a.inArray(d.get(0),this._loaded)>-1||(e.each(a.proxy(function(c,d){var e,f=a(d),g=b.devicePixelRatio>1&&f.attr("data-src-retina")||f.attr("data-src");this._core.trigger("load",{element:f,url:g},"lazy"),f.is("img")?f.one("load.owl.lazy",a.proxy(function(){f.css("opacity",1),this._core.trigger("loaded",{element:f,url:g},"lazy")},this)).attr("src",g):(e=new Image,e.onload=a.proxy(function(){f.css({"background-image":"url("+g+")",opacity:"1"}),this._core.trigger("loaded",{element:f,url:g},"lazy")},this),e.src=g)},this)),this._loaded.push(d.get(0)))},c.prototype.destroy=function(){var a,b;for(a in this.handlers)this._core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Lazy=c}(window.Zepto||window.jQuery,window,document),function(a){var b=function(c){this._core=c,this._handlers={"initialized.owl.carousel":a.proxy(function(){this._core.settings.autoHeight&&this.update()},this),"changed.owl.carousel":a.proxy(function(a){this._core.settings.autoHeight&&"position"==a.property.name&&this.update()},this),"loaded.owl.lazy":a.proxy(function(a){this._core.settings.autoHeight&&a.element.closest("."+this._core.settings.itemClass)===this._core.$stage.children().eq(this._core.current())&&this.update()},this)},this._core.options=a.extend({},b.Defaults,this._core.options),this._core.$element.on(this._handlers)};b.Defaults={autoHeight:!1,autoHeightClass:"owl-height"},b.prototype.update=function(){this._core.$stage.parent().height(this._core.$stage.children().eq(this._core.current()).height()).addClass(this._core.settings.autoHeightClass)},b.prototype.destroy=function(){var a,b;for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.AutoHeight=b}(window.Zepto||window.jQuery,window,document),function(a,b,c){var d=function(b){this._core=b,this._videos={},this._playing=null,this._fullscreen=!1,this._handlers={"resize.owl.carousel":a.proxy(function(a){this._core.settings.video&&!this.isInFullScreen()&&a.preventDefault()},this),"refresh.owl.carousel changed.owl.carousel":a.proxy(function(){this._playing&&this.stop()},this),"prepared.owl.carousel":a.proxy(function(b){var c=a(b.content).find(".owl-video");c.length&&(c.css("display","none"),this.fetch(c,a(b.content)))},this)},this._core.options=a.extend({},d.Defaults,this._core.options),this._core.$element.on(this._handlers),this._core.$element.on("click.owl.video",".owl-video-play-icon",a.proxy(function(a){this.play(a)},this))};d.Defaults={video:!1,videoHeight:!1,videoWidth:!1},d.prototype.fetch=function(a,b){var c=a.attr("data-vimeo-id")?"vimeo":"youtube",d=a.attr("data-vimeo-id")||a.attr("data-youtube-id"),e=a.attr("data-width")||this._core.settings.videoWidth,f=a.attr("data-height")||this._core.settings.videoHeight,g=a.attr("href");if(!g)throw new Error("Missing video URL.");if(d=g.match(/(http:|https:|)\/\/(player.|www.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com))\/(video\/|embed\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/),d[3].indexOf("youtu")>-1)c="youtube";else{if(!(d[3].indexOf("vimeo")>-1))throw new Error("Video URL not supported.");c="vimeo"}d=d[6],this._videos[g]={type:c,id:d,width:e,height:f},b.attr("data-video",g),this.thumbnail(a,this._videos[g])},d.prototype.thumbnail=function(b,c){var d,e,f,g=c.width&&c.height?'style="width:'+c.width+"px;height:"+c.height+'px;"':"",h=b.find("img"),i="src",j="",k=this._core.settings,l=function(a){e='<div class="owl-video-play-icon"></div>',d=k.lazyLoad?'<div class="owl-video-tn '+j+'" '+i+'="'+a+'"></div>':'<div class="owl-video-tn" style="opacity:1;background-image:url('+a+')"></div>',b.after(d),b.after(e)};return b.wrap('<div class="owl-video-wrapper"'+g+"></div>"),this._core.settings.lazyLoad&&(i="data-src",j="owl-lazy"),h.length?(l(h.attr(i)),h.remove(),!1):void("youtube"===c.type?(f="http://img.youtube.com/vi/"+c.id+"/hqdefault.jpg",l(f)):"vimeo"===c.type&&a.ajax({type:"GET",url:"http://vimeo.com/api/v2/video/"+c.id+".json",jsonp:"callback",dataType:"jsonp",success:function(a){f=a[0].thumbnail_large,l(f)}}))},d.prototype.stop=function(){this._core.trigger("stop",null,"video"),this._playing.find(".owl-video-frame").remove(),this._playing.removeClass("owl-video-playing"),this._playing=null},d.prototype.play=function(b){this._core.trigger("play",null,"video"),this._playing&&this.stop();var c,d,e=a(b.target||b.srcElement),f=e.closest("."+this._core.settings.itemClass),g=this._videos[f.attr("data-video")],h=g.width||"100%",i=g.height||this._core.$stage.height();"youtube"===g.type?c='<iframe width="'+h+'" height="'+i+'" src="http://www.youtube.com/embed/'+g.id+"?autoplay=1&v="+g.id+'" frameborder="0" allowfullscreen></iframe>':"vimeo"===g.type&&(c='<iframe src="http://player.vimeo.com/video/'+g.id+'?autoplay=1" width="'+h+'" height="'+i+'" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>'),f.addClass("owl-video-playing"),this._playing=f,d=a('<div style="height:'+i+"px; width:"+h+'px" class="owl-video-frame">'+c+"</div>"),e.after(d)},d.prototype.isInFullScreen=function(){var d=c.fullscreenElement||c.mozFullScreenElement||c.webkitFullscreenElement;return d&&a(d).parent().hasClass("owl-video-frame")&&(this._core.speed(0),this._fullscreen=!0),d&&this._fullscreen&&this._playing?!1:this._fullscreen?(this._fullscreen=!1,!1):this._playing&&this._core.state.orientation!==b.orientation?(this._core.state.orientation=b.orientation,!1):!0},d.prototype.destroy=function(){var a,b;this._core.$element.off("click.owl.video");for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Video=d}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this.core=b,this.core.options=a.extend({},e.Defaults,this.core.options),this.swapping=!0,this.previous=d,this.next=d,this.handlers={"change.owl.carousel":a.proxy(function(a){"position"==a.property.name&&(this.previous=this.core.current(),this.next=a.property.value)},this),"drag.owl.carousel dragged.owl.carousel translated.owl.carousel":a.proxy(function(a){this.swapping="translated"==a.type},this),"translate.owl.carousel":a.proxy(function(){this.swapping&&(this.core.options.animateOut||this.core.options.animateIn)&&this.swap()},this)},this.core.$element.on(this.handlers)};e.Defaults={animateOut:!1,animateIn:!1},e.prototype.swap=function(){if(1===this.core.settings.items&&this.core.support3d){this.core.speed(0);var b,c=a.proxy(this.clear,this),d=this.core.$stage.children().eq(this.previous),e=this.core.$stage.children().eq(this.next),f=this.core.settings.animateIn,g=this.core.settings.animateOut;this.core.current()!==this.previous&&(g&&(b=this.core.coordinates(this.previous)-this.core.coordinates(this.next),d.css({left:b+"px"}).addClass("animated owl-animated-out").addClass(g).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",c)),f&&e.addClass("animated owl-animated-in").addClass(f).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",c))}},e.prototype.clear=function(b){a(b.target).css({left:""}).removeClass("animated owl-animated-out owl-animated-in").removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut),this.core.transitionEnd()},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this.core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Animate=e}(window.Zepto||window.jQuery,window,document),function(a,b,c){var d=function(b){this.core=b,this.core.options=a.extend({},d.Defaults,this.core.options),this.handlers={"translated.owl.carousel refreshed.owl.carousel":a.proxy(function(){this.autoplay()
+
(function( global, factory ) {
},this),"play.owl.autoplay":a.proxy(function(a,b,c){this.play(b,c)},this),"stop.owl.autoplay":a.proxy(function(){this.stop()},this),"mouseover.owl.autoplay":a.proxy(function(){this.core.settings.autoplayHoverPause&&this.pause()},this),"mouseleave.owl.autoplay":a.proxy(function(){this.core.settings.autoplayHoverPause&&this.autoplay()},this)},this.core.$element.on(this.handlers)};d.Defaults={autoplay:!1,autoplayTimeout:5e3,autoplayHoverPause:!1,autoplaySpeed:!1},d.prototype.autoplay=function(){this.core.settings.autoplay&&!this.core.state.videoPlay?(b.clearInterval(this.interval),this.interval=b.setInterval(a.proxy(function(){this.play()},this),this.core.settings.autoplayTimeout)):b.clearInterval(this.interval)},d.prototype.play=function(){return c.hidden===!0||this.core.state.isTouch||this.core.state.isScrolling||this.core.state.isSwiping||this.core.state.inMotion?void 0:this.core.settings.autoplay===!1?void b.clearInterval(this.interval):void this.core.next(this.core.settings.autoplaySpeed)},d.prototype.stop=function(){b.clearInterval(this.interval)},d.prototype.pause=function(){b.clearInterval(this.interval)},d.prototype.destroy=function(){var a,c;b.clearInterval(this.interval);for(a in this.handlers)this.core.$element.off(a,this.handlers[a]);for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},a.fn.owlCarousel.Constructor.Plugins.autoplay=d}(window.Zepto||window.jQuery,window,document),function(a){"use strict";var b=function(c){this._core=c,this._initialized=!1,this._pages=[],this._controls={},this._templates=[],this.$element=this._core.$element,this._overrides={next:this._core.next,prev:this._core.prev,to:this._core.to},this._handlers={"prepared.owl.carousel":a.proxy(function(b){this._core.settings.dotsData&&this._templates.push(a(b.content).find("[data-dot]").andSelf("[data-dot]").attr("data-dot"))},this),"add.owl.carousel":a.proxy(function(b){this._core.settings.dotsData&&this._templates.splice(b.position,0,a(b.content).find("[data-dot]").andSelf("[data-dot]").attr("data-dot"))},this),"remove.owl.carousel prepared.owl.carousel":a.proxy(function(a){this._core.settings.dotsData&&this._templates.splice(a.position,1)},this),"change.owl.carousel":a.proxy(function(a){if("position"==a.property.name&&!this._core.state.revert&&!this._core.settings.loop&&this._core.settings.navRewind){var b=this._core.current(),c=this._core.maximum(),d=this._core.minimum();a.data=a.property.value>c?b>=c?d:c:a.property.value<d?c:a.property.value}},this),"changed.owl.carousel":a.proxy(function(a){"position"==a.property.name&&this.draw()},this),"refreshed.owl.carousel":a.proxy(function(){this._initialized||(this.initialize(),this._initialized=!0),this._core.trigger("refresh",null,"navigation"),this.update(),this.draw(),this._core.trigger("refreshed",null,"navigation")},this)},this._core.options=a.extend({},b.Defaults,this._core.options),this.$element.on(this._handlers)};b.Defaults={nav:!1,navRewind:!0,navText:["prev","next"],navSpeed:!1,navElement:"div",navContainer:!1,navContainerClass:"owl-nav",navClass:["owl-prev","owl-next"],slideBy:1,dotClass:"owl-dot",dotsClass:"owl-dots",dots:!0,dotsEach:!1,dotData:!1,dotsSpeed:!1,dotsContainer:!1,controlsClass:"owl-controls"},b.prototype.initialize=function(){var b,c,d=this._core.settings;d.dotsData||(this._templates=[a("<div>").addClass(d.dotClass).append(a("<span>")).prop("outerHTML")]),d.navContainer&&d.dotsContainer||(this._controls.$container=a("<div>").addClass(d.controlsClass).appendTo(this.$element)),this._controls.$indicators=d.dotsContainer?a(d.dotsContainer):a("<div>").hide().addClass(d.dotsClass).appendTo(this._controls.$container),this._controls.$indicators.on("click","div",a.proxy(function(b){var c=a(b.target).parent().is(this._controls.$indicators)?a(b.target).index():a(b.target).parent().index();b.preventDefault(),this.to(c,d.dotsSpeed)},this)),b=d.navContainer?a(d.navContainer):a("<div>").addClass(d.navContainerClass).prependTo(this._controls.$container),this._controls.$next=a("<"+d.navElement+">"),this._controls.$previous=this._controls.$next.clone(),this._controls.$previous.addClass(d.navClass[0]).html(d.navText[0]).hide().prependTo(b).on("click",a.proxy(function(){this.prev(d.navSpeed)},this)),this._controls.$next.addClass(d.navClass[1]).html(d.navText[1]).hide().appendTo(b).on("click",a.proxy(function(){this.next(d.navSpeed)},this));for(c in this._overrides)this._core[c]=a.proxy(this[c],this)},b.prototype.destroy=function(){var a,b,c,d;for(a in this._handlers)this.$element.off(a,this._handlers[a]);for(b in this._controls)this._controls[b].remove();for(d in this.overides)this._core[d]=this._overrides[d];for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},b.prototype.update=function(){var a,b,c,d=this._core.settings,e=this._core.clones().length/2,f=e+this._core.items().length,g=d.center||d.autoWidth||d.dotData?1:d.dotsEach||d.items;if("page"!==d.slideBy&&(d.slideBy=Math.min(d.slideBy,d.items)),d.dots||"page"==d.slideBy)for(this._pages=[],a=e,b=0,c=0;f>a;a++)(b>=g||0===b)&&(this._pages.push({start:a-e,end:a-e+g-1}),b=0,++c),b+=this._core.mergers(this._core.relative(a))},b.prototype.draw=function(){var b,c,d="",e=this._core.settings,f=(this._core.$stage.children(),this._core.relative(this._core.current()));if(!e.nav||e.loop||e.navRewind||(this._controls.$previous.toggleClass("disabled",0>=f),this._controls.$next.toggleClass("disabled",f>=this._core.maximum())),this._controls.$previous.toggle(e.nav),this._controls.$next.toggle(e.nav),e.dots){if(b=this._pages.length-this._controls.$indicators.children().length,e.dotData&&0!==b){for(c=0;c<this._controls.$indicators.children().length;c++)d+=this._templates[this._core.relative(c)];this._controls.$indicators.html(d)}else b>0?(d=new Array(b+1).join(this._templates[0]),this._controls.$indicators.append(d)):0>b&&this._controls.$indicators.children().slice(b).remove();this._controls.$indicators.find(".active").removeClass("active"),this._controls.$indicators.children().eq(a.inArray(this.current(),this._pages)).addClass("active")}this._controls.$indicators.toggle(e.dots)},b.prototype.onTrigger=function(b){var c=this._core.settings;b.page={index:a.inArray(this.current(),this._pages),count:this._pages.length,size:c&&(c.center||c.autoWidth||c.dotData?1:c.dotsEach||c.items)}},b.prototype.current=function(){var b=this._core.relative(this._core.current());return a.grep(this._pages,function(a){return a.start<=b&&a.end>=b}).pop()},b.prototype.getPosition=function(b){var c,d,e=this._core.settings;return"page"==e.slideBy?(c=a.inArray(this.current(),this._pages),d=this._pages.length,b?++c:--c,c=this._pages[(c%d+d)%d].start):(c=this._core.relative(this._core.current()),d=this._core.items().length,b?c+=e.slideBy:c-=e.slideBy),c},b.prototype.next=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!0),b)},b.prototype.prev=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!1),b)},b.prototype.to=function(b,c,d){var e;d?a.proxy(this._overrides.to,this._core)(b,c):(e=this._pages.length,a.proxy(this._overrides.to,this._core)(this._pages[(b%e+e)%e].start,c))},a.fn.owlCarousel.Constructor.Plugins.Navigation=b}(window.Zepto||window.jQuery,window,document),function(a,b){"use strict";var c=function(d){this._core=d,this._hashes={},this.$element=this._core.$element,this._handlers={"initialized.owl.carousel":a.proxy(function(){"URLHash"==this._core.settings.startPosition&&a(b).trigger("hashchange.owl.navigation")},this),"prepared.owl.carousel":a.proxy(function(b){var c=a(b.content).find("[data-hash]").andSelf("[data-hash]").attr("data-hash");this._hashes[c]=b.content},this)},this._core.options=a.extend({},c.Defaults,this._core.options),this.$element.on(this._handlers),a(b).on("hashchange.owl.navigation",a.proxy(function(){var a=b.location.hash.substring(1),c=this._core.$stage.children(),d=this._hashes[a]&&c.index(this._hashes[a])||0;return a?void this._core.to(d,!1,!0):!1},this))};c.Defaults={URLhashListener:!1},c.prototype.destroy=function(){var c,d;a(b).off("hashchange.owl.navigation");for(c in this._handlers)this._core.$element.off(c,this._handlers[c]);for(d in Object.getOwnPropertyNames(this))"function"!=typeof this[d]&&(this[d]=null)},a.fn.owlCarousel.Constructor.Plugins.Hash=c}(window.Zepto||window.jQuery,window,document);
+
  
(function (factory) {
+
if ( typeof module === "object" && typeof module.exports === "object" ) {
    if (typeof define === 'function' && define.amd) {
+
// For CommonJS and CommonJS-like environments where a proper `window`
        // AMD
+
// is present, execute the factory and get jQuery.
        define(['jquery'], factory);
+
// For environments that do not have a `window` with a `document`
    } else if (typeof exports === 'object') {
+
// (such as Node.js), expose a factory as module.exports.
        // CommonJS
+
// This accentuates the need for the creation of a real `window`.
        factory(require('jquery'));
+
// e.g. var jQuery = require("jquery")(window);
    } else {
+
// See ticket #14549 for more info.
        // Browser globals
+
module.exports = global.document ?
        factory(jQuery);
+
factory( global, true ) :
    }
+
function( w ) {
}(function ($) {
+
if ( !w.document ) {
  var CountTo = function (element, options) {
+
throw new Error( "jQuery requires a window with a document" );
    this.$element = $(element);
+
}
    this.options  = $.extend({}, CountTo.DEFAULTS, this.dataOptions(), options);
+
return factory( w );
    this.init();
+
};
  };
+
} else {
 +
factory( global );
 +
}
  
  CountTo.DEFAULTS = {
+
// Pass this if window is not defined yet
    from: 0,              // the number the element should start at
+
}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
    to: 0,                 // the number the element should end at
+
    speed: 1000,           // how long it should take to count between the target numbers
+
    refreshInterval: 100,  // how often the element should be updated
+
    decimals: 0,          // the number of decimal places to show
+
    formatter: formatter,  // handler for formatting the value before rendering
+
    onUpdate: null,        // callback method for every time the element is updated
+
    onComplete: null      // callback method for when the element finishes updating
+
  };
+
  
  CountTo.prototype.init = function () {
+
// Support: Firefox 18+
    this.value    = this.options.from;
+
// Can't be in strict mode, several libs including ASP.NET trace
    this.loops    = Math.ceil(this.options.speed / this.options.refreshInterval);
+
// the stack via arguments.caller.callee and Firefox dies if
    this.loopCount = 0;
+
// you try to trace through "use strict" call chains. (#13335)
    this.increment = (this.options.to - this.options.from) / this.loops;
+
//"use strict";
  };
+
var deletedIds = [];
  
  CountTo.prototype.dataOptions = function () {
+
var document = window.document;
    var options = {
+
      from:            this.$element.data('from'),
+
      to:              this.$element.data('to'),
+
      speed:          this.$element.data('speed'),
+
      refreshInterval: this.$element.data('refresh-interval'),
+
      decimals:        this.$element.data('decimals')
+
    };
+
  
    var keys = Object.keys(options);
+
var slice = deletedIds.slice;
  
    for (var i in keys) {
+
var concat = deletedIds.concat;
      var key = keys[i];
+
  
      if (typeof(options[key]) === 'undefined') {
+
var push = deletedIds.push;
        delete options[key];
+
      }
+
    }
+
  
    return options;
+
var indexOf = deletedIds.indexOf;
  };
+
  
  CountTo.prototype.update = function () {
+
var class2type = {};
    this.value += this.increment;
+
    this.loopCount++;
+
  
    this.render();
+
var toString = class2type.toString;
  
    if (typeof(this.options.onUpdate) == 'function') {
+
var hasOwn = class2type.hasOwnProperty;
      this.options.onUpdate.call(this.$element, this.value);
+
    }
+
  
    if (this.loopCount >= this.loops) {
+
var support = {};
      clearInterval(this.interval);
+
      this.value = this.options.to;
+
  
      if (typeof(this.options.onComplete) == 'function') {
 
        this.options.onComplete.call(this.$element, this.value);
 
      }
 
    }
 
  };
 
  
  CountTo.prototype.render = function () {
 
    var formattedValue = this.options.formatter.call(this.$element, this.value, this.options);
 
    this.$element.text(formattedValue);
 
  };
 
  
  CountTo.prototype.restart = function () {
+
var
    this.stop();
+
version = "1.12.4",
    this.init();
+
    this.start();
+
  };
+
  
  CountTo.prototype.start = function () {
+
// Define a local copy of jQuery
    this.stop();
+
jQuery = function( selector, context ) {
    this.render();
+
    this.interval = setInterval(this.update.bind(this), this.options.refreshInterval);
+
  };
+
  
  CountTo.prototype.stop = function () {
+
// The jQuery object is actually just the init constructor 'enhanced'
    if (this.interval) {
+
// Need init if jQuery is called (just allow error to be thrown if not included)
      clearInterval(this.interval);
+
return new jQuery.fn.init( selector, context );
    }
+
},
  };
+
  
  CountTo.prototype.toggle = function () {
+
// Support: Android<4.1, IE<9
    if (this.interval) {
+
// Make sure we trim BOM and NBSP
      this.stop();
+
rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
    } else {
+
      this.start();
+
    }
+
  };
+
  
  function formatter(value, options) {
+
// Matches dashed string for camelizing
    return value.toFixed(options.decimals);
+
rmsPrefix = /^-ms-/,
  }
+
rdashAlpha = /-([\da-z])/gi,
  
  $.fn.countTo = function (option) {
+
// Used by jQuery.camelCase as callback to replace()
    return this.each(function () {
+
fcamelCase = function( all, letter ) {
      var $this  = $(this);
+
return letter.toUpperCase();
      var data    = $this.data('countTo');
+
};
      var init    = !data || typeof(option) === 'object';
+
      var options = typeof(option) === 'object' ? option : {};
+
      var method  = typeof(option) === 'string' ? option : 'start';
+
  
      if (init) {
+
jQuery.fn = jQuery.prototype = {
        if (data) data.stop();
+
        $this.data('countTo', data = new CountTo(this, options));
+
      }
+
  
      data[method].call(data);
+
// The current version of jQuery being used
    });
+
jquery: version,
  };
+
}));
+
  
/*
+
constructor: jQuery,
* jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
+
*
+
* Uses the built in easing capabilities added In jQuery 1.1
+
* to offer multiple easing options
+
*
+
* TERMS OF USE - jQuery Easing
+
*
+
* Open source under the BSD License.
+
*
+
* Copyright © 2008 George McGinley Smith
+
* All rights reserved.
+
*
+
* Redistribution and use in source and binary forms, with or without modification,
+
* are permitted provided that the following conditions are met:
+
*
+
* Redistributions of source code must retain the above copyright notice, this list of
+
* conditions and the following disclaimer.
+
* Redistributions in binary form must reproduce the above copyright notice, this list
+
* of conditions and the following disclaimer in the documentation and/or other materials
+
* provided with the distribution.
+
*
+
* Neither the name of the author nor the names of contributors may be used to endorse
+
* or promote products derived from this software without specific prior written permission.
+
*
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+
*  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+
*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+
*  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+
*  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+
* OF THE POSSIBILITY OF SUCH DAMAGE.
+
*
+
*/
+
  
// t: current time, b: begInnIng value, c: change In value, d: duration
+
// Start with an empty selector
jQuery.easing['jswing'] = jQuery.easing['swing'];
+
selector: "",
  
jQuery.extend( jQuery.easing,
+
// The default length of a jQuery object is 0
{
+
length: 0,
def: 'easeOutQuad',
+
 
swing: function (x, t, b, c, d) {
+
toArray: function() {
//alert(jQuery.easing.default);
+
return slice.call( this );
return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
+
 
},
 
},
easeInQuad: function (x, t, b, c, d) {
+
 
return c*(t/=d)*t + b;
+
// Get the Nth element in the matched element set OR
 +
// Get the whole matched element set as a clean array
 +
get: function( num ) {
 +
return num != null ?
 +
 
 +
// Return just the one element from the set
 +
( num < 0 ? this[ num + this.length ] : this[ num ] ) :
 +
 
 +
// Return all the elements in a clean array
 +
slice.call( this );
 
},
 
},
easeOutQuad: function (x, t, b, c, d) {
+
 
return -c *(t/=d)*(t-2) + b;
+
// Take an array of elements and push it onto the stack
 +
// (returning the new matched element set)
 +
pushStack: function( elems ) {
 +
 
 +
// Build a new jQuery matched element set
 +
var ret = jQuery.merge( this.constructor(), elems );
 +
 
 +
// Add the old object onto the stack (as a reference)
 +
ret.prevObject = this;
 +
ret.context = this.context;
 +
 
 +
// Return the newly-formed element set
 +
return ret;
 
},
 
},
easeInOutQuad: function (x, t, b, c, d) {
+
 
if ((t/=d/2) < 1) return c/2*t*t + b;
+
// Execute a callback for every element in the matched set.
return -c/2 * ((--t)*(t-2) - 1) + b;
+
each: function( callback ) {
 +
return jQuery.each( this, callback );
 
},
 
},
easeInCubic: function (x, t, b, c, d) {
+
 
return c*(t/=d)*t*t + b;
+
map: function( callback ) {
 +
return this.pushStack( jQuery.map( this, function( elem, i ) {
 +
return callback.call( elem, i, elem );
 +
} ) );
 
},
 
},
easeOutCubic: function (x, t, b, c, d) {
+
 
return c*((t=t/d-1)*t*t + 1) + b;
+
slice: function() {
 +
return this.pushStack( slice.apply( this, arguments ) );
 
},
 
},
easeInOutCubic: function (x, t, b, c, d) {
+
 
if ((t/=d/2) < 1) return c/2*t*t*t + b;
+
first: function() {
return c/2*((t-=2)*t*t + 2) + b;
+
return this.eq( 0 );
 
},
 
},
easeInQuart: function (x, t, b, c, d) {
+
 
return c*(t/=d)*t*t*t + b;
+
last: function() {
 +
return this.eq( -1 );
 
},
 
},
easeOutQuart: function (x, t, b, c, d) {
+
 
return -c * ((t=t/d-1)*t*t*t - 1) + b;
+
eq: function( i ) {
 +
var len = this.length,
 +
j = +i + ( i < 0 ? len : 0 );
 +
return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
 
},
 
},
easeInOutQuart: function (x, t, b, c, d) {
+
 
if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
+
end: function() {
return -c/2 * ((t-=2)*t*t*t - 2) + b;
+
return this.prevObject || this.constructor();
 
},
 
},
easeInQuint: function (x, t, b, c, d) {
+
 
return c*(t/=d)*t*t*t*t + b;
+
// For internal use only.
 +
// Behaves like an Array's method, not like a jQuery method.
 +
push: push,
 +
sort: deletedIds.sort,
 +
splice: deletedIds.splice
 +
};
 +
 
 +
jQuery.extend = jQuery.fn.extend = function() {
 +
var src, copyIsArray, copy, name, options, clone,
 +
target = arguments[ 0 ] || {},
 +
i = 1,
 +
length = arguments.length,
 +
deep = false;
 +
 
 +
// Handle a deep copy situation
 +
if ( typeof target === "boolean" ) {
 +
deep = target;
 +
 
 +
// skip the boolean and the target
 +
target = arguments[ i ] || {};
 +
i++;
 +
}
 +
 
 +
// Handle case when target is a string or something (possible in deep copy)
 +
if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
 +
target = {};
 +
}
 +
 
 +
// extend jQuery itself if only one argument is passed
 +
if ( i === length ) {
 +
target = this;
 +
i--;
 +
}
 +
 
 +
for ( ; i < length; i++ ) {
 +
 
 +
// Only deal with non-null/undefined values
 +
if ( ( options = arguments[ i ] ) != null ) {
 +
 
 +
// Extend the base object
 +
for ( name in options ) {
 +
src = target[ name ];
 +
copy = options[ name ];
 +
 
 +
// Prevent never-ending loop
 +
if ( target === copy ) {
 +
continue;
 +
}
 +
 
 +
// Recurse if we're merging plain objects or arrays
 +
if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
 +
( copyIsArray = jQuery.isArray( copy ) ) ) ) {
 +
 
 +
if ( copyIsArray ) {
 +
copyIsArray = false;
 +
clone = src && jQuery.isArray( src ) ? src : [];
 +
 
 +
} else {
 +
clone = src && jQuery.isPlainObject( src ) ? src : {};
 +
}
 +
 
 +
// Never move original objects, clone them
 +
target[ name ] = jQuery.extend( deep, clone, copy );
 +
 
 +
// Don't bring in undefined values
 +
} else if ( copy !== undefined ) {
 +
target[ name ] = copy;
 +
}
 +
}
 +
}
 +
}
 +
 
 +
// Return the modified object
 +
return target;
 +
};
 +
 
 +
jQuery.extend( {
 +
 
 +
// Unique for each copy of jQuery on the page
 +
expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
 +
 
 +
// Assume jQuery is ready without the ready module
 +
isReady: true,
 +
 
 +
error: function( msg ) {
 +
throw new Error( msg );
 
},
 
},
easeOutQuint: function (x, t, b, c, d) {
+
 
return c*((t=t/d-1)*t*t*t*t + 1) + b;
+
noop: function() {},
 +
 
 +
// See test/unit/core.js for details concerning isFunction.
 +
// Since version 1.3, DOM methods and functions like alert
 +
// aren't supported. They return false on IE (#2968).
 +
isFunction: function( obj ) {
 +
return jQuery.type( obj ) === "function";
 
},
 
},
easeInOutQuint: function (x, t, b, c, d) {
+
 
if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
+
isArray: Array.isArray || function( obj ) {
return c/2*((t-=2)*t*t*t*t + 2) + b;
+
return jQuery.type( obj ) === "array";
 
},
 
},
easeInSine: function (x, t, b, c, d) {
+
 
return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
+
isWindow: function( obj ) {
 +
/* jshint eqeqeq: false */
 +
return obj != null && obj == obj.window;
 
},
 
},
easeOutSine: function (x, t, b, c, d) {
+
 
return c * Math.sin(t/d * (Math.PI/2)) + b;
+
isNumeric: function( obj ) {
 +
 
 +
// parseFloat NaNs numeric-cast false positives (null|true|false|"")
 +
// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
 +
// subtraction forces infinities to NaN
 +
// adding 1 corrects loss of precision from parseFloat (#15100)
 +
var realStringObj = obj && obj.toString();
 +
return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
 
},
 
},
easeInOutSine: function (x, t, b, c, d) {
+
 
return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
+
isEmptyObject: function( obj ) {
 +
var name;
 +
for ( name in obj ) {
 +
return false;
 +
}
 +
return true;
 
},
 
},
easeInExpo: function (x, t, b, c, d) {
+
 
return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
+
isPlainObject: function( obj ) {
 +
var key;
 +
 
 +
// Must be an Object.
 +
// Because of IE, we also have to check the presence of the constructor property.
 +
// Make sure that DOM nodes and window objects don't pass through, as well
 +
if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
 +
return false;
 +
}
 +
 
 +
try {
 +
 
 +
// Not own constructor property must be Object
 +
if ( obj.constructor &&
 +
!hasOwn.call( obj, "constructor" ) &&
 +
!hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
 +
return false;
 +
}
 +
} catch ( e ) {
 +
 
 +
// IE8,9 Will throw exceptions on certain host objects #9897
 +
return false;
 +
}
 +
 
 +
// Support: IE<9
 +
// Handle iteration over inherited properties before own properties.
 +
if ( !support.ownFirst ) {
 +
for ( key in obj ) {
 +
return hasOwn.call( obj, key );
 +
}
 +
}
 +
 
 +
// Own properties are enumerated firstly, so to speed up,
 +
// if last one is own, then all properties are own.
 +
for ( key in obj ) {}
 +
 
 +
return key === undefined || hasOwn.call( obj, key );
 
},
 
},
easeOutExpo: function (x, t, b, c, d) {
+
 
return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+
type: function( obj ) {
 +
if ( obj == null ) {
 +
return obj + "";
 +
}
 +
return typeof obj === "object" || typeof obj === "function" ?
 +
class2type[ toString.call( obj ) ] || "object" :
 +
typeof obj;
 
},
 
},
easeInOutExpo: function (x, t, b, c, d) {
+
 
if (t==0) return b;
+
// Workarounds based on findings by Jim Driscoll
if (t==d) return b+c;
+
// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
+
globalEval: function( data ) {
return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
+
if ( data && jQuery.trim( data ) ) {
 +
 
 +
// We use execScript on Internet Explorer
 +
// We use an anonymous function so that context is window
 +
// rather than jQuery in Firefox
 +
( window.execScript || function( data ) {
 +
window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation
 +
} )( data );
 +
}
 
},
 
},
easeInCirc: function (x, t, b, c, d) {
+
 
return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
+
// Convert dashed to camelCase; used by the css and data modules
 +
// Microsoft forgot to hump their vendor prefix (#9572)
 +
camelCase: function( string ) {
 +
return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
 
},
 
},
easeOutCirc: function (x, t, b, c, d) {
+
 
return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
+
nodeName: function( elem, name ) {
 +
return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
 
},
 
},
easeInOutCirc: function (x, t, b, c, d) {
+
 
if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
+
each: function( obj, callback ) {
return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
+
var length, i = 0;
 +
 
 +
if ( isArrayLike( obj ) ) {
 +
length = obj.length;
 +
for ( ; i < length; i++ ) {
 +
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
 +
break;
 +
}
 +
}
 +
} else {
 +
for ( i in obj ) {
 +
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
 +
break;
 +
}
 +
}
 +
}
 +
 
 +
return obj;
 
},
 
},
easeInElastic: function (x, t, b, c, d) {
+
 
var s=1.70158;var p=0;var a=c;
+
// Support: Android<4.1, IE<9
if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
+
trim: function( text ) {
if (a < Math.abs(c)) { a=c; var s=p/4; }
+
return text == null ?
else var s = p/(2*Math.PI) * Math.asin (c/a);
+
"" :
return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+
( text + "" ).replace( rtrim, "" );
 
},
 
},
easeOutElastic: function (x, t, b, c, d) {
+
 
var s=1.70158;var p=0;var a=c;
+
// results is for internal usage only
if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
+
makeArray: function( arr, results ) {
if (a < Math.abs(c)) { a=c; var s=p/4; }
+
var ret = results || [];
else var s = p/(2*Math.PI) * Math.asin (c/a);
+
 
return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
+
if ( arr != null ) {
 +
if ( isArrayLike( Object( arr ) ) ) {
 +
jQuery.merge( ret,
 +
typeof arr === "string" ?
 +
[ arr ] : arr
 +
);
 +
} else {
 +
push.call( ret, arr );
 +
}
 +
}
 +
 
 +
return ret;
 
},
 
},
easeInOutElastic: function (x, t, b, c, d) {
+
 
var s=1.70158;var p=0;var a=c;
+
inArray: function( elem, arr, i ) {
if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
+
var len;
if (a < Math.abs(c)) { a=c; var s=p/4; }
+
 
else var s = p/(2*Math.PI) * Math.asin (c/a);
+
if ( arr ) {
if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+
if ( indexOf ) {
return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
+
return indexOf.call( arr, elem, i );
 +
}
 +
 
 +
len = arr.length;
 +
i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
 +
 
 +
for ( ; i < len; i++ ) {
 +
 
 +
// Skip accessing in sparse arrays
 +
if ( i in arr && arr[ i ] === elem ) {
 +
return i;
 +
}
 +
}
 +
}
 +
 
 +
return -1;
 
},
 
},
easeInBack: function (x, t, b, c, d, s) {
+
 
if (s == undefined) s = 1.70158;
+
merge: function( first, second ) {
return c*(t/=d)*t*((s+1)*t - s) + b;
+
var len = +second.length,
 +
j = 0,
 +
i = first.length;
 +
 
 +
while ( j < len ) {
 +
first[ i++ ] = second[ j++ ];
 +
}
 +
 
 +
// Support: IE<9
 +
// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
 +
if ( len !== len ) {
 +
while ( second[ j ] !== undefined ) {
 +
first[ i++ ] = second[ j++ ];
 +
}
 +
}
 +
 
 +
first.length = i;
 +
 
 +
return first;
 
},
 
},
easeOutBack: function (x, t, b, c, d, s) {
+
 
if (s == undefined) s = 1.70158;
+
grep: function( elems, callback, invert ) {
return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+
var callbackInverse,
 +
matches = [],
 +
i = 0,
 +
length = elems.length,
 +
callbackExpect = !invert;
 +
 
 +
// Go through the array, only saving the items
 +
// that pass the validator function
 +
for ( ; i < length; i++ ) {
 +
callbackInverse = !callback( elems[ i ], i );
 +
if ( callbackInverse !== callbackExpect ) {
 +
matches.push( elems[ i ] );
 +
}
 +
}
 +
 
 +
return matches;
 
},
 
},
easeInOutBack: function (x, t, b, c, d, s) {
+
 
if (s == undefined) s = 1.70158;  
+
// arg is for internal usage only
if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
+
map: function( elems, callback, arg ) {
return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+
var length, value,
 +
i = 0,
 +
ret = [];
 +
 
 +
// Go through the array, translating each of the items to their new values
 +
if ( isArrayLike( elems ) ) {
 +
length = elems.length;
 +
for ( ; i < length; i++ ) {
 +
value = callback( elems[ i ], i, arg );
 +
 
 +
if ( value != null ) {
 +
ret.push( value );
 +
}
 +
}
 +
 
 +
// Go through every key on the object,
 +
} else {
 +
for ( i in elems ) {
 +
value = callback( elems[ i ], i, arg );
 +
 
 +
if ( value != null ) {
 +
ret.push( value );
 +
}
 +
}
 +
}
 +
 
 +
// Flatten any nested arrays
 +
return concat.apply( [], ret );
 
},
 
},
easeInBounce: function (x, t, b, c, d) {
+
 
return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
+
// A global GUID counter for objects
 +
guid: 1,
 +
 
 +
// Bind a function to a context, optionally partially applying any
 +
// arguments.
 +
proxy: function( fn, context ) {
 +
var args, proxy, tmp;
 +
 
 +
if ( typeof context === "string" ) {
 +
tmp = fn[ context ];
 +
context = fn;
 +
fn = tmp;
 +
}
 +
 
 +
// Quick check to determine if target is callable, in the spec
 +
// this throws a TypeError, but we will just return undefined.
 +
if ( !jQuery.isFunction( fn ) ) {
 +
return undefined;
 +
}
 +
 
 +
// Simulated bind
 +
args = slice.call( arguments, 2 );
 +
proxy = function() {
 +
return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
 +
};
 +
 
 +
// Set the guid of unique handler to the same of original handler, so it can be removed
 +
proxy.guid = fn.guid = fn.guid || jQuery.guid++;
 +
 
 +
return proxy;
 
},
 
},
easeOutBounce: function (x, t, b, c, d) {
+
 
if ((t/=d) < (1/2.75)) {
+
now: function() {
return c*(7.5625*t*t) + b;
+
return +( new Date() );
} else if (t < (2/2.75)) {
+
},
return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+
 
} else if (t < (2.5/2.75)) {
+
// jQuery.support is not used in Core but other projects attach their
return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+
// properties to it so it needs to exist.
 +
support: support
 +
} );
 +
 
 +
// JSHint would error on this code due to the Symbol not being defined in ES5.
 +
// Defining this global in .jshintrc would create a danger of using the global
 +
// unguarded in another place, it seems safer to just disable JSHint for these
 +
// three lines.
 +
/* jshint ignore: start */
 +
if ( typeof Symbol === "function" ) {
 +
jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ];
 +
}
 +
/* jshint ignore: end */
 +
 
 +
// Populate the class2type map
 +
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
 +
function( i, name ) {
 +
class2type[ "[object " + name + "]" ] = name.toLowerCase();
 +
} );
 +
 
 +
function isArrayLike( obj ) {
 +
 
 +
// Support: iOS 8.2 (not reproducible in simulator)
 +
// `in` check used to prevent JIT error (gh-2145)
 +
// hasOwn isn't used here due to false negatives
 +
// regarding Nodelist length in IE
 +
var length = !!obj && "length" in obj && obj.length,
 +
type = jQuery.type( obj );
 +
 
 +
if ( type === "function" || jQuery.isWindow( obj ) ) {
 +
return false;
 +
}
 +
 
 +
return type === "array" || length === 0 ||
 +
typeof length === "number" && length > 0 && ( length - 1 ) in obj;
 +
}
 +
var Sizzle =
 +
/*!
 +
* Sizzle CSS Selector Engine v2.2.1
 +
* http://sizzlejs.com/
 +
*
 +
* Copyright jQuery Foundation and other contributors
 +
* Released under the MIT license
 +
* http://jquery.org/license
 +
*
 +
* Date: 2015-10-17
 +
*/
 +
(function( window ) {
 +
 
 +
var i,
 +
support,
 +
Expr,
 +
getText,
 +
isXML,
 +
tokenize,
 +
compile,
 +
select,
 +
outermostContext,
 +
sortInput,
 +
hasDuplicate,
 +
 
 +
// Local document vars
 +
setDocument,
 +
document,
 +
docElem,
 +
documentIsHTML,
 +
rbuggyQSA,
 +
rbuggyMatches,
 +
matches,
 +
contains,
 +
 
 +
// Instance-specific data
 +
expando = "sizzle" + 1 * new Date(),
 +
preferredDoc = window.document,
 +
dirruns = 0,
 +
done = 0,
 +
classCache = createCache(),
 +
tokenCache = createCache(),
 +
compilerCache = createCache(),
 +
sortOrder = function( a, b ) {
 +
if ( a === b ) {
 +
hasDuplicate = true;
 +
}
 +
return 0;
 +
},
 +
 
 +
// General-purpose constants
 +
MAX_NEGATIVE = 1 << 31,
 +
 
 +
// Instance methods
 +
hasOwn = ({}).hasOwnProperty,
 +
arr = [],
 +
pop = arr.pop,
 +
push_native = arr.push,
 +
push = arr.push,
 +
slice = arr.slice,
 +
// Use a stripped-down indexOf as it's faster than native
 +
// http://jsperf.com/thor-indexof-vs-for/5
 +
indexOf = function( list, elem ) {
 +
var i = 0,
 +
len = list.length;
 +
for ( ; i < len; i++ ) {
 +
if ( list[i] === elem ) {
 +
return i;
 +
}
 +
}
 +
return -1;
 +
},
 +
 
 +
booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
 +
 
 +
// Regular expressions
 +
 
 +
// http://www.w3.org/TR/css3-selectors/#whitespace
 +
whitespace = "[\\x20\\t\\r\\n\\f]",
 +
 
 +
// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
 +
identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
 +
 
 +
// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
 +
attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
 +
// Operator (capture 2)
 +
"*([*^$|!~]?=)" + whitespace +
 +
// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
 +
"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
 +
"*\\]",
 +
 
 +
pseudos = ":(" + identifier + ")(?:\\((" +
 +
// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
 +
// 1. quoted (capture 3; capture 4 or capture 5)
 +
"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
 +
// 2. simple (capture 6)
 +
"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
 +
// 3. anything else (capture 2)
 +
".*" +
 +
")\\)|)",
 +
 
 +
// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
 +
rwhitespace = new RegExp( whitespace + "+", "g" ),
 +
rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
 +
 
 +
rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
 +
rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
 +
 
 +
rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
 +
 
 +
rpseudo = new RegExp( pseudos ),
 +
ridentifier = new RegExp( "^" + identifier + "$" ),
 +
 
 +
matchExpr = {
 +
"ID": new RegExp( "^#(" + identifier + ")" ),
 +
"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
 +
"TAG": new RegExp( "^(" + identifier + "|[*])" ),
 +
"ATTR": new RegExp( "^" + attributes ),
 +
"PSEUDO": new RegExp( "^" + pseudos ),
 +
"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
 +
"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
 +
"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
 +
"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
 +
// For use in libraries implementing .is()
 +
// We use this for POS matching in `select`
 +
"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
 +
whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
 +
},
 +
 
 +
rinputs = /^(?:input|select|textarea|button)$/i,
 +
rheader = /^h\d$/i,
 +
 
 +
rnative = /^[^{]+\{\s*\[native \w/,
 +
 
 +
// Easily-parseable/retrievable ID or TAG or CLASS selectors
 +
rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
 +
 
 +
rsibling = /[+~]/,
 +
rescape = /'|\\/g,
 +
 
 +
// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
 +
runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
 +
funescape = function( _, escaped, escapedWhitespace ) {
 +
var high = "0x" + escaped - 0x10000;
 +
// NaN means non-codepoint
 +
// Support: Firefox<24
 +
// Workaround erroneous numeric interpretation of +"0x"
 +
return high !== high || escapedWhitespace ?
 +
escaped :
 +
high < 0 ?
 +
// BMP codepoint
 +
String.fromCharCode( high + 0x10000 ) :
 +
// Supplemental Plane codepoint (surrogate pair)
 +
String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
 +
},
 +
 
 +
// Used for iframes
 +
// See setDocument()
 +
// Removing the function wrapper causes a "Permission Denied"
 +
// error in IE
 +
unloadHandler = function() {
 +
setDocument();
 +
};
 +
 
 +
// Optimize for push.apply( _, NodeList )
 +
try {
 +
push.apply(
 +
(arr = slice.call( preferredDoc.childNodes )),
 +
preferredDoc.childNodes
 +
);
 +
// Support: Android<4.0
 +
// Detect silently failing push.apply
 +
arr[ preferredDoc.childNodes.length ].nodeType;
 +
} catch ( e ) {
 +
push = { apply: arr.length ?
 +
 
 +
// Leverage slice if possible
 +
function( target, els ) {
 +
push_native.apply( target, slice.call(els) );
 +
} :
 +
 
 +
// Support: IE<9
 +
// Otherwise append directly
 +
function( target, els ) {
 +
var j = target.length,
 +
i = 0;
 +
// Can't trust NodeList.length
 +
while ( (target[j++] = els[i++]) ) {}
 +
target.length = j - 1;
 +
}
 +
};
 +
}
 +
 
 +
function Sizzle( selector, context, results, seed ) {
 +
var m, i, elem, nid, nidselect, match, groups, newSelector,
 +
newContext = context && context.ownerDocument,
 +
 
 +
// nodeType defaults to 9, since context defaults to document
 +
nodeType = context ? context.nodeType : 9;
 +
 
 +
results = results || [];
 +
 
 +
// Return early from calls with invalid selector or context
 +
if ( typeof selector !== "string" || !selector ||
 +
nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
 +
 
 +
return results;
 +
}
 +
 
 +
// Try to shortcut find operations (as opposed to filters) in HTML documents
 +
if ( !seed ) {
 +
 
 +
if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
 +
setDocument( context );
 +
}
 +
context = context || document;
 +
 
 +
if ( documentIsHTML ) {
 +
 
 +
// If the selector is sufficiently simple, try using a "get*By*" DOM method
 +
// (excepting DocumentFragment context, where the methods don't exist)
 +
if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
 +
 
 +
// ID selector
 +
if ( (m = match[1]) ) {
 +
 
 +
// Document context
 +
if ( nodeType === 9 ) {
 +
if ( (elem = context.getElementById( m )) ) {
 +
 
 +
// Support: IE, Opera, Webkit
 +
// TODO: identify versions
 +
// getElementById can match elements by name instead of ID
 +
if ( elem.id === m ) {
 +
results.push( elem );
 +
return results;
 +
}
 +
} else {
 +
return results;
 +
}
 +
 
 +
// Element context
 +
} else {
 +
 
 +
// Support: IE, Opera, Webkit
 +
// TODO: identify versions
 +
// getElementById can match elements by name instead of ID
 +
if ( newContext && (elem = newContext.getElementById( m )) &&
 +
contains( context, elem ) &&
 +
elem.id === m ) {
 +
 
 +
results.push( elem );
 +
return results;
 +
}
 +
}
 +
 
 +
// Type selector
 +
} else if ( match[2] ) {
 +
push.apply( results, context.getElementsByTagName( selector ) );
 +
return results;
 +
 
 +
// Class selector
 +
} else if ( (m = match[3]) && support.getElementsByClassName &&
 +
context.getElementsByClassName ) {
 +
 
 +
push.apply( results, context.getElementsByClassName( m ) );
 +
return results;
 +
}
 +
}
 +
 
 +
// Take advantage of querySelectorAll
 +
if ( support.qsa &&
 +
!compilerCache[ selector + " " ] &&
 +
(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
 +
 
 +
if ( nodeType !== 1 ) {
 +
newContext = context;
 +
newSelector = selector;
 +
 
 +
// qSA looks outside Element context, which is not what we want
 +
// Thanks to Andrew Dupont for this workaround technique
 +
// Support: IE <=8
 +
// Exclude object elements
 +
} else if ( context.nodeName.toLowerCase() !== "object" ) {
 +
 
 +
// Capture the context ID, setting it first if necessary
 +
if ( (nid = context.getAttribute( "id" )) ) {
 +
nid = nid.replace( rescape, "\\$&" );
 +
} else {
 +
context.setAttribute( "id", (nid = expando) );
 +
}
 +
 
 +
// Prefix every selector in the list
 +
groups = tokenize( selector );
 +
i = groups.length;
 +
nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']";
 +
while ( i-- ) {
 +
groups[i] = nidselect + " " + toSelector( groups[i] );
 +
}
 +
newSelector = groups.join( "," );
 +
 
 +
// Expand context for sibling selectors
 +
newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
 +
context;
 +
}
 +
 
 +
if ( newSelector ) {
 +
try {
 +
push.apply( results,
 +
newContext.querySelectorAll( newSelector )
 +
);
 +
return results;
 +
} catch ( qsaError ) {
 +
} finally {
 +
if ( nid === expando ) {
 +
context.removeAttribute( "id" );
 +
}
 +
}
 +
}
 +
}
 +
}
 +
}
 +
 
 +
// All others
 +
return select( selector.replace( rtrim, "$1" ), context, results, seed );
 +
}
 +
 
 +
/**
 +
* Create key-value caches of limited size
 +
* @returns {function(string, object)} Returns the Object data after storing it on itself with
 +
* property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
 +
* deleting the oldest entry
 +
*/
 +
function createCache() {
 +
var keys = [];
 +
 
 +
function cache( key, value ) {
 +
// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
 +
if ( keys.push( key + " " ) > Expr.cacheLength ) {
 +
// Only keep the most recent entries
 +
delete cache[ keys.shift() ];
 +
}
 +
return (cache[ key + " " ] = value);
 +
}
 +
return cache;
 +
}
 +
 
 +
/**
 +
* Mark a function for special use by Sizzle
 +
* @param {Function} fn The function to mark
 +
*/
 +
function markFunction( fn ) {
 +
fn[ expando ] = true;
 +
return fn;
 +
}
 +
 
 +
/**
 +
* Support testing using an element
 +
* @param {Function} fn Passed the created div and expects a boolean result
 +
*/
 +
function assert( fn ) {
 +
var div = document.createElement("div");
 +
 
 +
try {
 +
return !!fn( div );
 +
} catch (e) {
 +
return false;
 +
} finally {
 +
// Remove from its parent by default
 +
if ( div.parentNode ) {
 +
div.parentNode.removeChild( div );
 +
}
 +
// release memory in IE
 +
div = null;
 +
}
 +
}
 +
 
 +
/**
 +
* Adds the same handler for all of the specified attrs
 +
* @param {String} attrs Pipe-separated list of attributes
 +
* @param {Function} handler The method that will be applied
 +
*/
 +
function addHandle( attrs, handler ) {
 +
var arr = attrs.split("|"),
 +
i = arr.length;
 +
 
 +
while ( i-- ) {
 +
Expr.attrHandle[ arr[i] ] = handler;
 +
}
 +
}
 +
 
 +
/**
 +
* Checks document order of two siblings
 +
* @param {Element} a
 +
* @param {Element} b
 +
* @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
 +
*/
 +
function siblingCheck( a, b ) {
 +
var cur = b && a,
 +
diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
 +
( ~b.sourceIndex || MAX_NEGATIVE ) -
 +
( ~a.sourceIndex || MAX_NEGATIVE );
 +
 
 +
// Use IE sourceIndex if available on both nodes
 +
if ( diff ) {
 +
return diff;
 +
}
 +
 
 +
// Check if b follows a
 +
if ( cur ) {
 +
while ( (cur = cur.nextSibling) ) {
 +
if ( cur === b ) {
 +
return -1;
 +
}
 +
}
 +
}
 +
 
 +
return a ? 1 : -1;
 +
}
 +
 
 +
/**
 +
* Returns a function to use in pseudos for input types
 +
* @param {String} type
 +
*/
 +
function createInputPseudo( type ) {
 +
return function( elem ) {
 +
var name = elem.nodeName.toLowerCase();
 +
return name === "input" && elem.type === type;
 +
};
 +
}
 +
 
 +
/**
 +
* Returns a function to use in pseudos for buttons
 +
* @param {String} type
 +
*/
 +
function createButtonPseudo( type ) {
 +
return function( elem ) {
 +
var name = elem.nodeName.toLowerCase();
 +
return (name === "input" || name === "button") && elem.type === type;
 +
};
 +
}
 +
 
 +
/**
 +
* Returns a function to use in pseudos for positionals
 +
* @param {Function} fn
 +
*/
 +
function createPositionalPseudo( fn ) {
 +
return markFunction(function( argument ) {
 +
argument = +argument;
 +
return markFunction(function( seed, matches ) {
 +
var j,
 +
matchIndexes = fn( [], seed.length, argument ),
 +
i = matchIndexes.length;
 +
 
 +
// Match elements found at the specified indexes
 +
while ( i-- ) {
 +
if ( seed[ (j = matchIndexes[i]) ] ) {
 +
seed[j] = !(matches[j] = seed[j]);
 +
}
 +
}
 +
});
 +
});
 +
}
 +
 
 +
/**
 +
* Checks a node for validity as a Sizzle context
 +
* @param {Element|Object=} context
 +
* @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
 +
*/
 +
function testContext( context ) {
 +
return context && typeof context.getElementsByTagName !== "undefined" && context;
 +
}
 +
 
 +
// Expose support vars for convenience
 +
support = Sizzle.support = {};
 +
 
 +
/**
 +
* Detects XML nodes
 +
* @param {Element|Object} elem An element or a document
 +
* @returns {Boolean} True iff elem is a non-HTML XML node
 +
*/
 +
isXML = Sizzle.isXML = function( elem ) {
 +
// documentElement is verified for cases where it doesn't yet exist
 +
// (such as loading iframes in IE - #4833)
 +
var documentElement = elem && (elem.ownerDocument || elem).documentElement;
 +
return documentElement ? documentElement.nodeName !== "HTML" : false;
 +
};
 +
 
 +
/**
 +
* Sets document-related variables once based on the current document
 +
* @param {Element|Object} [doc] An element or document object to use to set the document
 +
* @returns {Object} Returns the current document
 +
*/
 +
setDocument = Sizzle.setDocument = function( node ) {
 +
var hasCompare, parent,
 +
doc = node ? node.ownerDocument || node : preferredDoc;
 +
 
 +
// Return early if doc is invalid or already selected
 +
if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
 +
return document;
 +
}
 +
 
 +
// Update global variables
 +
document = doc;
 +
docElem = document.documentElement;
 +
documentIsHTML = !isXML( document );
 +
 
 +
// Support: IE 9-11, Edge
 +
// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
 +
if ( (parent = document.defaultView) && parent.top !== parent ) {
 +
// Support: IE 11
 +
if ( parent.addEventListener ) {
 +
parent.addEventListener( "unload", unloadHandler, false );
 +
 
 +
// Support: IE 9 - 10 only
 +
} else if ( parent.attachEvent ) {
 +
parent.attachEvent( "onunload", unloadHandler );
 +
}
 +
}
 +
 
 +
/* Attributes
 +
---------------------------------------------------------------------- */
 +
 
 +
// Support: IE<8
 +
// Verify that getAttribute really returns attributes and not properties
 +
// (excepting IE8 booleans)
 +
support.attributes = assert(function( div ) {
 +
div.className = "i";
 +
return !div.getAttribute("className");
 +
});
 +
 
 +
/* getElement(s)By*
 +
---------------------------------------------------------------------- */
 +
 
 +
// Check if getElementsByTagName("*") returns only elements
 +
support.getElementsByTagName = assert(function( div ) {
 +
div.appendChild( document.createComment("") );
 +
return !div.getElementsByTagName("*").length;
 +
});
 +
 
 +
// Support: IE<9
 +
support.getElementsByClassName = rnative.test( document.getElementsByClassName );
 +
 
 +
// Support: IE<10
 +
// Check if getElementById returns elements by name
 +
// The broken getElementById methods don't pick up programatically-set names,
 +
// so use a roundabout getElementsByName test
 +
support.getById = assert(function( div ) {
 +
docElem.appendChild( div ).id = expando;
 +
return !document.getElementsByName || !document.getElementsByName( expando ).length;
 +
});
 +
 
 +
// ID find and filter
 +
if ( support.getById ) {
 +
Expr.find["ID"] = function( id, context ) {
 +
if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
 +
var m = context.getElementById( id );
 +
return m ? [ m ] : [];
 +
}
 +
};
 +
Expr.filter["ID"] = function( id ) {
 +
var attrId = id.replace( runescape, funescape );
 +
return function( elem ) {
 +
return elem.getAttribute("id") === attrId;
 +
};
 +
};
 +
} else {
 +
// Support: IE6/7
 +
// getElementById is not reliable as a find shortcut
 +
delete Expr.find["ID"];
 +
 
 +
Expr.filter["ID"] =  function( id ) {
 +
var attrId = id.replace( runescape, funescape );
 +
return function( elem ) {
 +
var node = typeof elem.getAttributeNode !== "undefined" &&
 +
elem.getAttributeNode("id");
 +
return node && node.value === attrId;
 +
};
 +
};
 +
}
 +
 
 +
// Tag
 +
Expr.find["TAG"] = support.getElementsByTagName ?
 +
function( tag, context ) {
 +
if ( typeof context.getElementsByTagName !== "undefined" ) {
 +
return context.getElementsByTagName( tag );
 +
 
 +
// DocumentFragment nodes don't have gEBTN
 +
} else if ( support.qsa ) {
 +
return context.querySelectorAll( tag );
 +
}
 +
} :
 +
 
 +
function( tag, context ) {
 +
var elem,
 +
tmp = [],
 +
i = 0,
 +
// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
 +
results = context.getElementsByTagName( tag );
 +
 
 +
// Filter out possible comments
 +
if ( tag === "*" ) {
 +
while ( (elem = results[i++]) ) {
 +
if ( elem.nodeType === 1 ) {
 +
tmp.push( elem );
 +
}
 +
}
 +
 
 +
return tmp;
 +
}
 +
return results;
 +
};
 +
 
 +
// Class
 +
Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
 +
if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
 +
return context.getElementsByClassName( className );
 +
}
 +
};
 +
 
 +
/* QSA/matchesSelector
 +
---------------------------------------------------------------------- */
 +
 
 +
// QSA and matchesSelector support
 +
 
 +
// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
 +
rbuggyMatches = [];
 +
 
 +
// qSa(:focus) reports false when true (Chrome 21)
 +
// We allow this because of a bug in IE8/9 that throws an error
 +
// whenever `document.activeElement` is accessed on an iframe
 +
// So, we allow :focus to pass through QSA all the time to avoid the IE error
 +
// See http://bugs.jquery.com/ticket/13378
 +
rbuggyQSA = [];
 +
 
 +
if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
 +
// Build QSA regex
 +
// Regex strategy adopted from Diego Perini
 +
assert(function( div ) {
 +
// Select is set to empty string on purpose
 +
// This is to test IE's treatment of not explicitly
 +
// setting a boolean content attribute,
 +
// since its presence should be enough
 +
// http://bugs.jquery.com/ticket/12359
 +
docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
 +
"<select id='" + expando + "-\r\\' msallowcapture=''>" +
 +
"<option selected=''></option></select>";
 +
 
 +
// Support: IE8, Opera 11-12.16
 +
// Nothing should be selected when empty strings follow ^= or $= or *=
 +
// The test attribute must be unknown in Opera but "safe" for WinRT
 +
// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
 +
if ( div.querySelectorAll("[msallowcapture^='']").length ) {
 +
rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
 +
}
 +
 
 +
// Support: IE8
 +
// Boolean attributes and "value" are not treated correctly
 +
if ( !div.querySelectorAll("[selected]").length ) {
 +
rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
 +
}
 +
 
 +
// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
 +
if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
 +
rbuggyQSA.push("~=");
 +
}
 +
 
 +
// Webkit/Opera - :checked should return selected option elements
 +
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
 +
// IE8 throws error here and will not see later tests
 +
if ( !div.querySelectorAll(":checked").length ) {
 +
rbuggyQSA.push(":checked");
 +
}
 +
 
 +
// Support: Safari 8+, iOS 8+
 +
// https://bugs.webkit.org/show_bug.cgi?id=136851
 +
// In-page `selector#id sibing-combinator selector` fails
 +
if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
 +
rbuggyQSA.push(".#.+[+~]");
 +
}
 +
});
 +
 
 +
assert(function( div ) {
 +
// Support: Windows 8 Native Apps
 +
// The type and name attributes are restricted during .innerHTML assignment
 +
var input = document.createElement("input");
 +
input.setAttribute( "type", "hidden" );
 +
div.appendChild( input ).setAttribute( "name", "D" );
 +
 
 +
// Support: IE8
 +
// Enforce case-sensitivity of name attribute
 +
if ( div.querySelectorAll("[name=d]").length ) {
 +
rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
 +
}
 +
 
 +
// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
 +
// IE8 throws error here and will not see later tests
 +
if ( !div.querySelectorAll(":enabled").length ) {
 +
rbuggyQSA.push( ":enabled", ":disabled" );
 +
}
 +
 
 +
// Opera 10-11 does not throw on post-comma invalid pseudos
 +
div.querySelectorAll("*,:x");
 +
rbuggyQSA.push(",.*:");
 +
});
 +
}
 +
 
 +
if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
 +
docElem.webkitMatchesSelector ||
 +
docElem.mozMatchesSelector ||
 +
docElem.oMatchesSelector ||
 +
docElem.msMatchesSelector) )) ) {
 +
 
 +
assert(function( div ) {
 +
// Check to see if it's possible to do matchesSelector
 +
// on a disconnected node (IE 9)
 +
support.disconnectedMatch = matches.call( div, "div" );
 +
 
 +
// This should fail with an exception
 +
// Gecko does not error, returns false instead
 +
matches.call( div, "[s!='']:x" );
 +
rbuggyMatches.push( "!=", pseudos );
 +
});
 +
}
 +
 
 +
rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
 +
rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
 +
 
 +
/* Contains
 +
---------------------------------------------------------------------- */
 +
hasCompare = rnative.test( docElem.compareDocumentPosition );
 +
 
 +
// Element contains another
 +
// Purposefully self-exclusive
 +
// As in, an element does not contain itself
 +
contains = hasCompare || rnative.test( docElem.contains ) ?
 +
function( a, b ) {
 +
var adown = a.nodeType === 9 ? a.documentElement : a,
 +
bup = b && b.parentNode;
 +
return a === bup || !!( bup && bup.nodeType === 1 && (
 +
adown.contains ?
 +
adown.contains( bup ) :
 +
a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
 +
));
 +
} :
 +
function( a, b ) {
 +
if ( b ) {
 +
while ( (b = b.parentNode) ) {
 +
if ( b === a ) {
 +
return true;
 +
}
 +
}
 +
}
 +
return false;
 +
};
 +
 
 +
/* Sorting
 +
---------------------------------------------------------------------- */
 +
 
 +
// Document order sorting
 +
sortOrder = hasCompare ?
 +
function( a, b ) {
 +
 
 +
// Flag for duplicate removal
 +
if ( a === b ) {
 +
hasDuplicate = true;
 +
return 0;
 +
}
 +
 
 +
// Sort on method existence if only one input has compareDocumentPosition
 +
var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
 +
if ( compare ) {
 +
return compare;
 +
}
 +
 
 +
// Calculate position if both inputs belong to the same document
 +
compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
 +
a.compareDocumentPosition( b ) :
 +
 
 +
// Otherwise we know they are disconnected
 +
1;
 +
 
 +
// Disconnected nodes
 +
if ( compare & 1 ||
 +
(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
 +
 
 +
// Choose the first element that is related to our preferred document
 +
if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
 +
return -1;
 +
}
 +
if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
 +
return 1;
 +
}
 +
 
 +
// Maintain original order
 +
return sortInput ?
 +
( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
 +
0;
 +
}
 +
 
 +
return compare & 4 ? -1 : 1;
 +
} :
 +
function( a, b ) {
 +
// Exit early if the nodes are identical
 +
if ( a === b ) {
 +
hasDuplicate = true;
 +
return 0;
 +
}
 +
 
 +
var cur,
 +
i = 0,
 +
aup = a.parentNode,
 +
bup = b.parentNode,
 +
ap = [ a ],
 +
bp = [ b ];
 +
 
 +
// Parentless nodes are either documents or disconnected
 +
if ( !aup || !bup ) {
 +
return a === document ? -1 :
 +
b === document ? 1 :
 +
aup ? -1 :
 +
bup ? 1 :
 +
sortInput ?
 +
( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
 +
0;
 +
 
 +
// If the nodes are siblings, we can do a quick check
 +
} else if ( aup === bup ) {
 +
return siblingCheck( a, b );
 +
}
 +
 
 +
// Otherwise we need full lists of their ancestors for comparison
 +
cur = a;
 +
while ( (cur = cur.parentNode) ) {
 +
ap.unshift( cur );
 +
}
 +
cur = b;
 +
while ( (cur = cur.parentNode) ) {
 +
bp.unshift( cur );
 +
}
 +
 
 +
// Walk down the tree looking for a discrepancy
 +
while ( ap[i] === bp[i] ) {
 +
i++;
 +
}
 +
 
 +
return i ?
 +
// Do a sibling check if the nodes have a common ancestor
 +
siblingCheck( ap[i], bp[i] ) :
 +
 
 +
// Otherwise nodes in our document sort first
 +
ap[i] === preferredDoc ? -1 :
 +
bp[i] === preferredDoc ? 1 :
 +
0;
 +
};
 +
 
 +
return document;
 +
};
 +
 
 +
Sizzle.matches = function( expr, elements ) {
 +
return Sizzle( expr, null, null, elements );
 +
};
 +
 
 +
Sizzle.matchesSelector = function( elem, expr ) {
 +
// Set document vars if needed
 +
if ( ( elem.ownerDocument || elem ) !== document ) {
 +
setDocument( elem );
 +
}
 +
 
 +
// Make sure that attribute selectors are quoted
 +
expr = expr.replace( rattributeQuotes, "='$1']" );
 +
 
 +
if ( support.matchesSelector && documentIsHTML &&
 +
!compilerCache[ expr + " " ] &&
 +
( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
 +
( !rbuggyQSA    || !rbuggyQSA.test( expr ) ) ) {
 +
 
 +
try {
 +
var ret = matches.call( elem, expr );
 +
 
 +
// IE 9's matchesSelector returns false on disconnected nodes
 +
if ( ret || support.disconnectedMatch ||
 +
// As well, disconnected nodes are said to be in a document
 +
// fragment in IE 9
 +
elem.document && elem.document.nodeType !== 11 ) {
 +
return ret;
 +
}
 +
} catch (e) {}
 +
}
 +
 
 +
return Sizzle( expr, document, null, [ elem ] ).length > 0;
 +
};
 +
 
 +
Sizzle.contains = function( context, elem ) {
 +
// Set document vars if needed
 +
if ( ( context.ownerDocument || context ) !== document ) {
 +
setDocument( context );
 +
}
 +
return contains( context, elem );
 +
};
 +
 
 +
Sizzle.attr = function( elem, name ) {
 +
// Set document vars if needed
 +
if ( ( elem.ownerDocument || elem ) !== document ) {
 +
setDocument( elem );
 +
}
 +
 
 +
var fn = Expr.attrHandle[ name.toLowerCase() ],
 +
// Don't get fooled by Object.prototype properties (jQuery #13807)
 +
val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
 +
fn( elem, name, !documentIsHTML ) :
 +
undefined;
 +
 
 +
return val !== undefined ?
 +
val :
 +
support.attributes || !documentIsHTML ?
 +
elem.getAttribute( name ) :
 +
(val = elem.getAttributeNode(name)) && val.specified ?
 +
val.value :
 +
null;
 +
};
 +
 
 +
Sizzle.error = function( msg ) {
 +
throw new Error( "Syntax error, unrecognized expression: " + msg );
 +
};
 +
 
 +
/**
 +
* Document sorting and removing duplicates
 +
* @param {ArrayLike} results
 +
*/
 +
Sizzle.uniqueSort = function( results ) {
 +
var elem,
 +
duplicates = [],
 +
j = 0,
 +
i = 0;
 +
 
 +
// Unless we *know* we can detect duplicates, assume their presence
 +
hasDuplicate = !support.detectDuplicates;
 +
sortInput = !support.sortStable && results.slice( 0 );
 +
results.sort( sortOrder );
 +
 
 +
if ( hasDuplicate ) {
 +
while ( (elem = results[i++]) ) {
 +
if ( elem === results[ i ] ) {
 +
j = duplicates.push( i );
 +
}
 +
}
 +
while ( j-- ) {
 +
results.splice( duplicates[ j ], 1 );
 +
}
 +
}
 +
 
 +
// Clear input after sorting to release objects
 +
// See https://github.com/jquery/sizzle/pull/225
 +
sortInput = null;
 +
 
 +
return results;
 +
};
 +
 
 +
/**
 +
* Utility function for retrieving the text value of an array of DOM nodes
 +
* @param {Array|Element} elem
 +
*/
 +
getText = Sizzle.getText = function( elem ) {
 +
var node,
 +
ret = "",
 +
i = 0,
 +
nodeType = elem.nodeType;
 +
 
 +
if ( !nodeType ) {
 +
// If no nodeType, this is expected to be an array
 +
while ( (node = elem[i++]) ) {
 +
// Do not traverse comment nodes
 +
ret += getText( node );
 +
}
 +
} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
 +
// Use textContent for elements
 +
// innerText usage removed for consistency of new lines (jQuery #11153)
 +
if ( typeof elem.textContent === "string" ) {
 +
return elem.textContent;
 
} else {
 
} else {
return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+
// Traverse its children
 +
for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
 +
ret += getText( elem );
 +
}
 
}
 
}
 +
} else if ( nodeType === 3 || nodeType === 4 ) {
 +
return elem.nodeValue;
 +
}
 +
// Do not include comment or processing instruction nodes
 +
 +
return ret;
 +
};
 +
 +
Expr = Sizzle.selectors = {
 +
 +
// Can be adjusted by the user
 +
cacheLength: 50,
 +
 +
createPseudo: markFunction,
 +
 +
match: matchExpr,
 +
 +
attrHandle: {},
 +
 +
find: {},
 +
 +
relative: {
 +
">": { dir: "parentNode", first: true },
 +
" ": { dir: "parentNode" },
 +
"+": { dir: "previousSibling", first: true },
 +
"~": { dir: "previousSibling" }
 
},
 
},
easeInOutBounce: function (x, t, b, c, d) {
+
 
if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
+
preFilter: {
return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
+
"ATTR": function( match ) {
 +
match[1] = match[1].replace( runescape, funescape );
 +
 
 +
// Move the given value to match[3] whether quoted or unquoted
 +
match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
 +
 
 +
if ( match[2] === "~=" ) {
 +
match[3] = " " + match[3] + " ";
 +
}
 +
 
 +
return match.slice( 0, 4 );
 +
},
 +
 
 +
"CHILD": function( match ) {
 +
/* matches from matchExpr["CHILD"]
 +
1 type (only|nth|...)
 +
2 what (child|of-type)
 +
3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
 +
4 xn-component of xn+y argument ([+-]?\d*n|)
 +
5 sign of xn-component
 +
6 x of xn-component
 +
7 sign of y-component
 +
8 y of y-component
 +
*/
 +
match[1] = match[1].toLowerCase();
 +
 
 +
if ( match[1].slice( 0, 3 ) === "nth" ) {
 +
// nth-* requires argument
 +
if ( !match[3] ) {
 +
Sizzle.error( match[0] );
 +
}
 +
 
 +
// numeric x and y parameters for Expr.filter.CHILD
 +
// remember that false/true cast respectively to 0/1
 +
match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
 +
match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
 +
 
 +
// other types prohibit arguments
 +
} else if ( match[3] ) {
 +
Sizzle.error( match[0] );
 +
}
 +
 
 +
return match;
 +
},
 +
 
 +
"PSEUDO": function( match ) {
 +
var excess,
 +
unquoted = !match[6] && match[2];
 +
 
 +
if ( matchExpr["CHILD"].test( match[0] ) ) {
 +
return null;
 +
}
 +
 
 +
// Accept quoted arguments as-is
 +
if ( match[3] ) {
 +
match[2] = match[4] || match[5] || "";
 +
 
 +
// Strip excess characters from unquoted arguments
 +
} else if ( unquoted && rpseudo.test( unquoted ) &&
 +
// Get excess from tokenize (recursively)
 +
(excess = tokenize( unquoted, true )) &&
 +
// advance to the next closing parenthesis
 +
(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
 +
 
 +
// excess is a negative index
 +
match[0] = match[0].slice( 0, excess );
 +
match[2] = unquoted.slice( 0, excess );
 +
}
 +
 
 +
// Return only captures needed by the pseudo filter method (type and argument)
 +
return match.slice( 0, 3 );
 +
}
 +
},
 +
 
 +
filter: {
 +
 
 +
"TAG": function( nodeNameSelector ) {
 +
var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
 +
return nodeNameSelector === "*" ?
 +
function() { return true; } :
 +
function( elem ) {
 +
return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
 +
};
 +
},
 +
 
 +
"CLASS": function( className ) {
 +
var pattern = classCache[ className + " " ];
 +
 
 +
return pattern ||
 +
(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
 +
classCache( className, function( elem ) {
 +
return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
 +
});
 +
},
 +
 
 +
"ATTR": function( name, operator, check ) {
 +
return function( elem ) {
 +
var result = Sizzle.attr( elem, name );
 +
 
 +
if ( result == null ) {
 +
return operator === "!=";
 +
}
 +
if ( !operator ) {
 +
return true;
 +
}
 +
 
 +
result += "";
 +
 
 +
return operator === "=" ? result === check :
 +
operator === "!=" ? result !== check :
 +
operator === "^=" ? check && result.indexOf( check ) === 0 :
 +
operator === "*=" ? check && result.indexOf( check ) > -1 :
 +
operator === "$=" ? check && result.slice( -check.length ) === check :
 +
operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
 +
operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
 +
false;
 +
};
 +
},
 +
 
 +
"CHILD": function( type, what, argument, first, last ) {
 +
var simple = type.slice( 0, 3 ) !== "nth",
 +
forward = type.slice( -4 ) !== "last",
 +
ofType = what === "of-type";
 +
 
 +
return first === 1 && last === 0 ?
 +
 
 +
// Shortcut for :nth-*(n)
 +
function( elem ) {
 +
return !!elem.parentNode;
 +
} :
 +
 
 +
function( elem, context, xml ) {
 +
var cache, uniqueCache, outerCache, node, nodeIndex, start,
 +
dir = simple !== forward ? "nextSibling" : "previousSibling",
 +
parent = elem.parentNode,
 +
name = ofType && elem.nodeName.toLowerCase(),
 +
useCache = !xml && !ofType,
 +
diff = false;
 +
 
 +
if ( parent ) {
 +
 
 +
// :(first|last|only)-(child|of-type)
 +
if ( simple ) {
 +
while ( dir ) {
 +
node = elem;
 +
while ( (node = node[ dir ]) ) {
 +
if ( ofType ?
 +
node.nodeName.toLowerCase() === name :
 +
node.nodeType === 1 ) {
 +
 
 +
return false;
 +
}
 +
}
 +
// Reverse direction for :only-* (if we haven't yet done so)
 +
start = dir = type === "only" && !start && "nextSibling";
 +
}
 +
return true;
 +
}
 +
 
 +
start = [ forward ? parent.firstChild : parent.lastChild ];
 +
 
 +
// non-xml :nth-child(...) stores cache data on `parent`
 +
if ( forward && useCache ) {
 +
 
 +
// Seek `elem` from a previously-cached index
 +
 
 +
// ...in a gzip-friendly way
 +
node = parent;
 +
outerCache = node[ expando ] || (node[ expando ] = {});
 +
 
 +
// Support: IE <9 only
 +
// Defend against cloned attroperties (jQuery gh-1709)
 +
uniqueCache = outerCache[ node.uniqueID ] ||
 +
(outerCache[ node.uniqueID ] = {});
 +
 
 +
cache = uniqueCache[ type ] || [];
 +
nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
 +
diff = nodeIndex && cache[ 2 ];
 +
node = nodeIndex && parent.childNodes[ nodeIndex ];
 +
 
 +
while ( (node = ++nodeIndex && node && node[ dir ] ||
 +
 
 +
// Fallback to seeking `elem` from the start
 +
(diff = nodeIndex = 0) || start.pop()) ) {
 +
 
 +
// When found, cache indexes on `parent` and break
 +
if ( node.nodeType === 1 && ++diff && node === elem ) {
 +
uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
 +
break;
 +
}
 +
}
 +
 
 +
} else {
 +
// Use previously-cached element index if available
 +
if ( useCache ) {
 +
// ...in a gzip-friendly way
 +
node = elem;
 +
outerCache = node[ expando ] || (node[ expando ] = {});
 +
 
 +
// Support: IE <9 only
 +
// Defend against cloned attroperties (jQuery gh-1709)
 +
uniqueCache = outerCache[ node.uniqueID ] ||
 +
(outerCache[ node.uniqueID ] = {});
 +
 
 +
cache = uniqueCache[ type ] || [];
 +
nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
 +
diff = nodeIndex;
 +
}
 +
 
 +
// xml :nth-child(...)
 +
// or :nth-last-child(...) or :nth(-last)?-of-type(...)
 +
if ( diff === false ) {
 +
// Use the same loop as above to seek `elem` from the start
 +
while ( (node = ++nodeIndex && node && node[ dir ] ||
 +
(diff = nodeIndex = 0) || start.pop()) ) {
 +
 
 +
if ( ( ofType ?
 +
node.nodeName.toLowerCase() === name :
 +
node.nodeType === 1 ) &&
 +
++diff ) {
 +
 
 +
// Cache the index of each encountered element
 +
if ( useCache ) {
 +
outerCache = node[ expando ] || (node[ expando ] = {});
 +
 
 +
// Support: IE <9 only
 +
// Defend against cloned attroperties (jQuery gh-1709)
 +
uniqueCache = outerCache[ node.uniqueID ] ||
 +
(outerCache[ node.uniqueID ] = {});
 +
 
 +
uniqueCache[ type ] = [ dirruns, diff ];
 +
}
 +
 
 +
if ( node === elem ) {
 +
break;
 +
}
 +
}
 +
}
 +
}
 +
}
 +
 
 +
// Incorporate the offset, then check against cycle size
 +
diff -= last;
 +
return diff === first || ( diff % first === 0 && diff / first >= 0 );
 +
}
 +
};
 +
},
 +
 
 +
"PSEUDO": function( pseudo, argument ) {
 +
// pseudo-class names are case-insensitive
 +
// http://www.w3.org/TR/selectors/#pseudo-classes
 +
// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
 +
// Remember that setFilters inherits from pseudos
 +
var args,
 +
fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
 +
Sizzle.error( "unsupported pseudo: " + pseudo );
 +
 
 +
// The user may use createPseudo to indicate that
 +
// arguments are needed to create the filter function
 +
// just as Sizzle does
 +
if ( fn[ expando ] ) {
 +
return fn( argument );
 +
}
 +
 
 +
// But maintain support for old signatures
 +
if ( fn.length > 1 ) {
 +
args = [ pseudo, pseudo, "", argument ];
 +
return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
 +
markFunction(function( seed, matches ) {
 +
var idx,
 +
matched = fn( seed, argument ),
 +
i = matched.length;
 +
while ( i-- ) {
 +
idx = indexOf( seed, matched[i] );
 +
seed[ idx ] = !( matches[ idx ] = matched[i] );
 +
}
 +
}) :
 +
function( elem ) {
 +
return fn( elem, 0, args );
 +
};
 +
}
 +
 
 +
return fn;
 +
}
 +
},
 +
 
 +
pseudos: {
 +
// Potentially complex pseudos
 +
"not": markFunction(function( selector ) {
 +
// Trim the selector passed to compile
 +
// to avoid treating leading and trailing
 +
// spaces as combinators
 +
var input = [],
 +
results = [],
 +
matcher = compile( selector.replace( rtrim, "$1" ) );
 +
 
 +
return matcher[ expando ] ?
 +
markFunction(function( seed, matches, context, xml ) {
 +
var elem,
 +
unmatched = matcher( seed, null, xml, [] ),
 +
i = seed.length;
 +
 
 +
// Match elements unmatched by `matcher`
 +
while ( i-- ) {
 +
if ( (elem = unmatched[i]) ) {
 +
seed[i] = !(matches[i] = elem);
 +
}
 +
}
 +
}) :
 +
function( elem, context, xml ) {
 +
input[0] = elem;
 +
matcher( input, null, xml, results );
 +
// Don't keep the element (issue #299)
 +
input[0] = null;
 +
return !results.pop();
 +
};
 +
}),
 +
 
 +
"has": markFunction(function( selector ) {
 +
return function( elem ) {
 +
return Sizzle( selector, elem ).length > 0;
 +
};
 +
}),
 +
 
 +
"contains": markFunction(function( text ) {
 +
text = text.replace( runescape, funescape );
 +
return function( elem ) {
 +
return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
 +
};
 +
}),
 +
 
 +
// "Whether an element is represented by a :lang() selector
 +
// is based solely on the element's language value
 +
// being equal to the identifier C,
 +
// or beginning with the identifier C immediately followed by "-".
 +
// The matching of C against the element's language value is performed case-insensitively.
 +
// The identifier C does not have to be a valid language name."
 +
// http://www.w3.org/TR/selectors/#lang-pseudo
 +
"lang": markFunction( function( lang ) {
 +
// lang value must be a valid identifier
 +
if ( !ridentifier.test(lang || "") ) {
 +
Sizzle.error( "unsupported lang: " + lang );
 +
}
 +
lang = lang.replace( runescape, funescape ).toLowerCase();
 +
return function( elem ) {
 +
var elemLang;
 +
do {
 +
if ( (elemLang = documentIsHTML ?
 +
elem.lang :
 +
elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
 +
 
 +
elemLang = elemLang.toLowerCase();
 +
return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
 +
}
 +
} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
 +
return false;
 +
};
 +
}),
 +
 
 +
// Miscellaneous
 +
"target": function( elem ) {
 +
var hash = window.location && window.location.hash;
 +
return hash && hash.slice( 1 ) === elem.id;
 +
},
 +
 
 +
"root": function( elem ) {
 +
return elem === docElem;
 +
},
 +
 
 +
"focus": function( elem ) {
 +
return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
 +
},
 +
 
 +
// Boolean properties
 +
"enabled": function( elem ) {
 +
return elem.disabled === false;
 +
},
 +
 
 +
"disabled": function( elem ) {
 +
return elem.disabled === true;
 +
},
 +
 
 +
"checked": function( elem ) {
 +
// In CSS3, :checked should return both checked and selected elements
 +
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
 +
var nodeName = elem.nodeName.toLowerCase();
 +
return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
 +
},
 +
 
 +
"selected": function( elem ) {
 +
// Accessing this property makes selected-by-default
 +
// options in Safari work properly
 +
if ( elem.parentNode ) {
 +
elem.parentNode.selectedIndex;
 +
}
 +
 
 +
return elem.selected === true;
 +
},
 +
 
 +
// Contents
 +
"empty": function( elem ) {
 +
// http://www.w3.org/TR/selectors/#empty-pseudo
 +
// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
 +
//  but not by others (comment: 8; processing instruction: 7; etc.)
 +
// nodeType < 6 works because attributes (2) do not appear as children
 +
for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
 +
if ( elem.nodeType < 6 ) {
 +
return false;
 +
}
 +
}
 +
return true;
 +
},
 +
 
 +
"parent": function( elem ) {
 +
return !Expr.pseudos["empty"]( elem );
 +
},
 +
 
 +
// Element/input types
 +
"header": function( elem ) {
 +
return rheader.test( elem.nodeName );
 +
},
 +
 
 +
"input": function( elem ) {
 +
return rinputs.test( elem.nodeName );
 +
},
 +
 
 +
"button": function( elem ) {
 +
var name = elem.nodeName.toLowerCase();
 +
return name === "input" && elem.type === "button" || name === "button";
 +
},
 +
 
 +
"text": function( elem ) {
 +
var attr;
 +
return elem.nodeName.toLowerCase() === "input" &&
 +
elem.type === "text" &&
 +
 
 +
// Support: IE<8
 +
// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
 +
( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
 +
},
 +
 
 +
// Position-in-collection
 +
"first": createPositionalPseudo(function() {
 +
return [ 0 ];
 +
}),
 +
 
 +
"last": createPositionalPseudo(function( matchIndexes, length ) {
 +
return [ length - 1 ];
 +
}),
 +
 
 +
"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
 +
return [ argument < 0 ? argument + length : argument ];
 +
}),
 +
 
 +
"even": createPositionalPseudo(function( matchIndexes, length ) {
 +
var i = 0;
 +
for ( ; i < length; i += 2 ) {
 +
matchIndexes.push( i );
 +
}
 +
return matchIndexes;
 +
}),
 +
 
 +
"odd": createPositionalPseudo(function( matchIndexes, length ) {
 +
var i = 1;
 +
for ( ; i < length; i += 2 ) {
 +
matchIndexes.push( i );
 +
}
 +
return matchIndexes;
 +
}),
 +
 
 +
"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
 +
var i = argument < 0 ? argument + length : argument;
 +
for ( ; --i >= 0; ) {
 +
matchIndexes.push( i );
 +
}
 +
return matchIndexes;
 +
}),
 +
 
 +
"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
 +
var i = argument < 0 ? argument + length : argument;
 +
for ( ; ++i < length; ) {
 +
matchIndexes.push( i );
 +
}
 +
return matchIndexes;
 +
})
 
}
 
}
 +
};
 +
 +
Expr.pseudos["nth"] = Expr.pseudos["eq"];
 +
 +
// Add button/input type pseudos
 +
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
 +
Expr.pseudos[ i ] = createInputPseudo( i );
 +
}
 +
for ( i in { submit: true, reset: true } ) {
 +
Expr.pseudos[ i ] = createButtonPseudo( i );
 +
}
 +
 +
// Easy API for creating new setFilters
 +
function setFilters() {}
 +
setFilters.prototype = Expr.filters = Expr.pseudos;
 +
Expr.setFilters = new setFilters();
 +
 +
tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
 +
var matched, match, tokens, type,
 +
soFar, groups, preFilters,
 +
cached = tokenCache[ selector + " " ];
 +
 +
if ( cached ) {
 +
return parseOnly ? 0 : cached.slice( 0 );
 +
}
 +
 +
soFar = selector;
 +
groups = [];
 +
preFilters = Expr.preFilter;
 +
 +
while ( soFar ) {
 +
 +
// Comma and first run
 +
if ( !matched || (match = rcomma.exec( soFar )) ) {
 +
if ( match ) {
 +
// Don't consume trailing commas as valid
 +
soFar = soFar.slice( match[0].length ) || soFar;
 +
}
 +
groups.push( (tokens = []) );
 +
}
 +
 +
matched = false;
 +
 +
// Combinators
 +
if ( (match = rcombinators.exec( soFar )) ) {
 +
matched = match.shift();
 +
tokens.push({
 +
value: matched,
 +
// Cast descendant combinators to space
 +
type: match[0].replace( rtrim, " " )
 +
});
 +
soFar = soFar.slice( matched.length );
 +
}
 +
 +
// Filters
 +
for ( type in Expr.filter ) {
 +
if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
 +
(match = preFilters[ type ]( match ))) ) {
 +
matched = match.shift();
 +
tokens.push({
 +
value: matched,
 +
type: type,
 +
matches: match
 +
});
 +
soFar = soFar.slice( matched.length );
 +
}
 +
}
 +
 +
if ( !matched ) {
 +
break;
 +
}
 +
}
 +
 +
// Return the length of the invalid excess
 +
// if we're just parsing
 +
// Otherwise, throw an error or return tokens
 +
return parseOnly ?
 +
soFar.length :
 +
soFar ?
 +
Sizzle.error( selector ) :
 +
// Cache the tokens
 +
tokenCache( selector, groups ).slice( 0 );
 +
};
 +
 +
function toSelector( tokens ) {
 +
var i = 0,
 +
len = tokens.length,
 +
selector = "";
 +
for ( ; i < len; i++ ) {
 +
selector += tokens[i].value;
 +
}
 +
return selector;
 +
}
 +
 +
function addCombinator( matcher, combinator, base ) {
 +
var dir = combinator.dir,
 +
checkNonElements = base && dir === "parentNode",
 +
doneName = done++;
 +
 +
return combinator.first ?
 +
// Check against closest ancestor/preceding element
 +
function( elem, context, xml ) {
 +
while ( (elem = elem[ dir ]) ) {
 +
if ( elem.nodeType === 1 || checkNonElements ) {
 +
return matcher( elem, context, xml );
 +
}
 +
}
 +
} :
 +
 +
// Check against all ancestor/preceding elements
 +
function( elem, context, xml ) {
 +
var oldCache, uniqueCache, outerCache,
 +
newCache = [ dirruns, doneName ];
 +
 +
// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
 +
if ( xml ) {
 +
while ( (elem = elem[ dir ]) ) {
 +
if ( elem.nodeType === 1 || checkNonElements ) {
 +
if ( matcher( elem, context, xml ) ) {
 +
return true;
 +
}
 +
}
 +
}
 +
} else {
 +
while ( (elem = elem[ dir ]) ) {
 +
if ( elem.nodeType === 1 || checkNonElements ) {
 +
outerCache = elem[ expando ] || (elem[ expando ] = {});
 +
 +
// Support: IE <9 only
 +
// Defend against cloned attroperties (jQuery gh-1709)
 +
uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
 +
 +
if ( (oldCache = uniqueCache[ dir ]) &&
 +
oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
 +
 +
// Assign to newCache so results back-propagate to previous elements
 +
return (newCache[ 2 ] = oldCache[ 2 ]);
 +
} else {
 +
// Reuse newcache so results back-propagate to previous elements
 +
uniqueCache[ dir ] = newCache;
 +
 +
// A match means we're done; a fail means we have to keep checking
 +
if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
 +
return true;
 +
}
 +
}
 +
}
 +
}
 +
}
 +
};
 +
}
 +
 +
function elementMatcher( matchers ) {
 +
return matchers.length > 1 ?
 +
function( elem, context, xml ) {
 +
var i = matchers.length;
 +
while ( i-- ) {
 +
if ( !matchers[i]( elem, context, xml ) ) {
 +
return false;
 +
}
 +
}
 +
return true;
 +
} :
 +
matchers[0];
 +
}
 +
 +
function multipleContexts( selector, contexts, results ) {
 +
var i = 0,
 +
len = contexts.length;
 +
for ( ; i < len; i++ ) {
 +
Sizzle( selector, contexts[i], results );
 +
}
 +
return results;
 +
}
 +
 +
function condense( unmatched, map, filter, context, xml ) {
 +
var elem,
 +
newUnmatched = [],
 +
i = 0,
 +
len = unmatched.length,
 +
mapped = map != null;
 +
 +
for ( ; i < len; i++ ) {
 +
if ( (elem = unmatched[i]) ) {
 +
if ( !filter || filter( elem, context, xml ) ) {
 +
newUnmatched.push( elem );
 +
if ( mapped ) {
 +
map.push( i );
 +
}
 +
}
 +
}
 +
}
 +
 +
return newUnmatched;
 +
}
 +
 +
function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
 +
if ( postFilter && !postFilter[ expando ] ) {
 +
postFilter = setMatcher( postFilter );
 +
}
 +
if ( postFinder && !postFinder[ expando ] ) {
 +
postFinder = setMatcher( postFinder, postSelector );
 +
}
 +
return markFunction(function( seed, results, context, xml ) {
 +
var temp, i, elem,
 +
preMap = [],
 +
postMap = [],
 +
preexisting = results.length,
 +
 +
// Get initial elements from seed or context
 +
elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
 +
 +
// Prefilter to get matcher input, preserving a map for seed-results synchronization
 +
matcherIn = preFilter && ( seed || !selector ) ?
 +
condense( elems, preMap, preFilter, context, xml ) :
 +
elems,
 +
 +
matcherOut = matcher ?
 +
// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
 +
postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
 +
 +
// ...intermediate processing is necessary
 +
[] :
 +
 +
// ...otherwise use results directly
 +
results :
 +
matcherIn;
 +
 +
// Find primary matches
 +
if ( matcher ) {
 +
matcher( matcherIn, matcherOut, context, xml );
 +
}
 +
 +
// Apply postFilter
 +
if ( postFilter ) {
 +
temp = condense( matcherOut, postMap );
 +
postFilter( temp, [], context, xml );
 +
 +
// Un-match failing elements by moving them back to matcherIn
 +
i = temp.length;
 +
while ( i-- ) {
 +
if ( (elem = temp[i]) ) {
 +
matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
 +
}
 +
}
 +
}
 +
 +
if ( seed ) {
 +
if ( postFinder || preFilter ) {
 +
if ( postFinder ) {
 +
// Get the final matcherOut by condensing this intermediate into postFinder contexts
 +
temp = [];
 +
i = matcherOut.length;
 +
while ( i-- ) {
 +
if ( (elem = matcherOut[i]) ) {
 +
// Restore matcherIn since elem is not yet a final match
 +
temp.push( (matcherIn[i] = elem) );
 +
}
 +
}
 +
postFinder( null, (matcherOut = []), temp, xml );
 +
}
 +
 +
// Move matched elements from seed to results to keep them synchronized
 +
i = matcherOut.length;
 +
while ( i-- ) {
 +
if ( (elem = matcherOut[i]) &&
 +
(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
 +
 +
seed[temp] = !(results[temp] = elem);
 +
}
 +
}
 +
}
 +
 +
// Add elements to results, through postFinder if defined
 +
} else {
 +
matcherOut = condense(
 +
matcherOut === results ?
 +
matcherOut.splice( preexisting, matcherOut.length ) :
 +
matcherOut
 +
);
 +
if ( postFinder ) {
 +
postFinder( null, results, matcherOut, xml );
 +
} else {
 +
push.apply( results, matcherOut );
 +
}
 +
}
 +
});
 +
}
 +
 +
function matcherFromTokens( tokens ) {
 +
var checkContext, matcher, j,
 +
len = tokens.length,
 +
leadingRelative = Expr.relative[ tokens[0].type ],
 +
implicitRelative = leadingRelative || Expr.relative[" "],
 +
i = leadingRelative ? 1 : 0,
 +
 +
// The foundational matcher ensures that elements are reachable from top-level context(s)
 +
matchContext = addCombinator( function( elem ) {
 +
return elem === checkContext;
 +
}, implicitRelative, true ),
 +
matchAnyContext = addCombinator( function( elem ) {
 +
return indexOf( checkContext, elem ) > -1;
 +
}, implicitRelative, true ),
 +
matchers = [ function( elem, context, xml ) {
 +
var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
 +
(checkContext = context).nodeType ?
 +
matchContext( elem, context, xml ) :
 +
matchAnyContext( elem, context, xml ) );
 +
// Avoid hanging onto element (issue #299)
 +
checkContext = null;
 +
return ret;
 +
} ];
 +
 +
for ( ; i < len; i++ ) {
 +
if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
 +
matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
 +
} else {
 +
matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
 +
 +
// Return special upon seeing a positional matcher
 +
if ( matcher[ expando ] ) {
 +
// Find the next relative operator (if any) for proper handling
 +
j = ++i;
 +
for ( ; j < len; j++ ) {
 +
if ( Expr.relative[ tokens[j].type ] ) {
 +
break;
 +
}
 +
}
 +
return setMatcher(
 +
i > 1 && elementMatcher( matchers ),
 +
i > 1 && toSelector(
 +
// If the preceding token was a descendant combinator, insert an implicit any-element `*`
 +
tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
 +
).replace( rtrim, "$1" ),
 +
matcher,
 +
i < j && matcherFromTokens( tokens.slice( i, j ) ),
 +
j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
 +
j < len && toSelector( tokens )
 +
);
 +
}
 +
matchers.push( matcher );
 +
}
 +
}
 +
 +
return elementMatcher( matchers );
 +
}
 +
 +
function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
 +
var bySet = setMatchers.length > 0,
 +
byElement = elementMatchers.length > 0,
 +
superMatcher = function( seed, context, xml, results, outermost ) {
 +
var elem, j, matcher,
 +
matchedCount = 0,
 +
i = "0",
 +
unmatched = seed && [],
 +
setMatched = [],
 +
contextBackup = outermostContext,
 +
// We must always have either seed elements or outermost context
 +
elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
 +
// Use integer dirruns iff this is the outermost matcher
 +
dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
 +
len = elems.length;
 +
 +
if ( outermost ) {
 +
outermostContext = context === document || context || outermost;
 +
}
 +
 +
// Add elements passing elementMatchers directly to results
 +
// Support: IE<9, Safari
 +
// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
 +
for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
 +
if ( byElement && elem ) {
 +
j = 0;
 +
if ( !context && elem.ownerDocument !== document ) {
 +
setDocument( elem );
 +
xml = !documentIsHTML;
 +
}
 +
while ( (matcher = elementMatchers[j++]) ) {
 +
if ( matcher( elem, context || document, xml) ) {
 +
results.push( elem );
 +
break;
 +
}
 +
}
 +
if ( outermost ) {
 +
dirruns = dirrunsUnique;
 +
}
 +
}
 +
 +
// Track unmatched elements for set filters
 +
if ( bySet ) {
 +
// They will have gone through all possible matchers
 +
if ( (elem = !matcher && elem) ) {
 +
matchedCount--;
 +
}
 +
 +
// Lengthen the array for every element, matched or not
 +
if ( seed ) {
 +
unmatched.push( elem );
 +
}
 +
}
 +
}
 +
 +
// `i` is now the count of elements visited above, and adding it to `matchedCount`
 +
// makes the latter nonnegative.
 +
matchedCount += i;
 +
 +
// Apply set filters to unmatched elements
 +
// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
 +
// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
 +
// no element matchers and no seed.
 +
// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
 +
// case, which will result in a "00" `matchedCount` that differs from `i` but is also
 +
// numerically zero.
 +
if ( bySet && i !== matchedCount ) {
 +
j = 0;
 +
while ( (matcher = setMatchers[j++]) ) {
 +
matcher( unmatched, setMatched, context, xml );
 +
}
 +
 +
if ( seed ) {
 +
// Reintegrate element matches to eliminate the need for sorting
 +
if ( matchedCount > 0 ) {
 +
while ( i-- ) {
 +
if ( !(unmatched[i] || setMatched[i]) ) {
 +
setMatched[i] = pop.call( results );
 +
}
 +
}
 +
}
 +
 +
// Discard index placeholder values to get only actual matches
 +
setMatched = condense( setMatched );
 +
}
 +
 +
// Add matches to results
 +
push.apply( results, setMatched );
 +
 +
// Seedless set matches succeeding multiple successful matchers stipulate sorting
 +
if ( outermost && !seed && setMatched.length > 0 &&
 +
( matchedCount + setMatchers.length ) > 1 ) {
 +
 +
Sizzle.uniqueSort( results );
 +
}
 +
}
 +
 +
// Override manipulation of globals by nested matchers
 +
if ( outermost ) {
 +
dirruns = dirrunsUnique;
 +
outermostContext = contextBackup;
 +
}
 +
 +
return unmatched;
 +
};
 +
 +
return bySet ?
 +
markFunction( superMatcher ) :
 +
superMatcher;
 +
}
 +
 +
compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
 +
var i,
 +
setMatchers = [],
 +
elementMatchers = [],
 +
cached = compilerCache[ selector + " " ];
 +
 +
if ( !cached ) {
 +
// Generate a function of recursive functions that can be used to check each element
 +
if ( !match ) {
 +
match = tokenize( selector );
 +
}
 +
i = match.length;
 +
while ( i-- ) {
 +
cached = matcherFromTokens( match[i] );
 +
if ( cached[ expando ] ) {
 +
setMatchers.push( cached );
 +
} else {
 +
elementMatchers.push( cached );
 +
}
 +
}
 +
 +
// Cache the compiled function
 +
cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
 +
 +
// Save selector and tokenization
 +
cached.selector = selector;
 +
}
 +
return cached;
 +
};
 +
 +
/**
 +
* A low-level selection function that works with Sizzle's compiled
 +
*  selector functions
 +
* @param {String|Function} selector A selector or a pre-compiled
 +
*  selector function built with Sizzle.compile
 +
* @param {Element} context
 +
* @param {Array} [results]
 +
* @param {Array} [seed] A set of elements to match against
 +
*/
 +
select = Sizzle.select = function( selector, context, results, seed ) {
 +
var i, tokens, token, type, find,
 +
compiled = typeof selector === "function" && selector,
 +
match = !seed && tokenize( (selector = compiled.selector || selector) );
 +
 +
results = results || [];
 +
 +
// Try to minimize operations if there is only one selector in the list and no seed
 +
// (the latter of which guarantees us context)
 +
if ( match.length === 1 ) {
 +
 +
// Reduce context if the leading compound selector is an ID
 +
tokens = match[0] = match[0].slice( 0 );
 +
if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
 +
support.getById && context.nodeType === 9 && documentIsHTML &&
 +
Expr.relative[ tokens[1].type ] ) {
 +
 +
context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
 +
if ( !context ) {
 +
return results;
 +
 +
// Precompiled matchers will still verify ancestry, so step up a level
 +
} else if ( compiled ) {
 +
context = context.parentNode;
 +
}
 +
 +
selector = selector.slice( tokens.shift().value.length );
 +
}
 +
 +
// Fetch a seed set for right-to-left matching
 +
i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
 +
while ( i-- ) {
 +
token = tokens[i];
 +
 +
// Abort if we hit a combinator
 +
if ( Expr.relative[ (type = token.type) ] ) {
 +
break;
 +
}
 +
if ( (find = Expr.find[ type ]) ) {
 +
// Search, expanding context for leading sibling combinators
 +
if ( (seed = find(
 +
token.matches[0].replace( runescape, funescape ),
 +
rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
 +
)) ) {
 +
 +
// If seed is empty or no tokens remain, we can return early
 +
tokens.splice( i, 1 );
 +
selector = seed.length && toSelector( tokens );
 +
if ( !selector ) {
 +
push.apply( results, seed );
 +
return results;
 +
}
 +
 +
break;
 +
}
 +
}
 +
}
 +
}
 +
 +
// Compile and execute a filtering function if one is not provided
 +
// Provide `match` to avoid retokenization if we modified the selector above
 +
( compiled || compile( selector, match ) )(
 +
seed,
 +
context,
 +
!documentIsHTML,
 +
results,
 +
!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
 +
);
 +
return results;
 +
};
 +
 +
// One-time assignments
 +
 +
// Sort stability
 +
support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
 +
 +
// Support: Chrome 14-35+
 +
// Always assume duplicates if they aren't passed to the comparison function
 +
support.detectDuplicates = !!hasDuplicate;
 +
 +
// Initialize against the default document
 +
setDocument();
 +
 +
// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
 +
// Detached nodes confoundingly follow *each other*
 +
support.sortDetached = assert(function( div1 ) {
 +
// Should return 1, but returns 4 (following)
 +
return div1.compareDocumentPosition( document.createElement("div") ) & 1;
 
});
 
});
 +
 +
// Support: IE<8
 +
// Prevent attribute/property "interpolation"
 +
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
 +
if ( !assert(function( div ) {
 +
div.innerHTML = "<a href='#'></a>";
 +
return div.firstChild.getAttribute("href") === "#" ;
 +
}) ) {
 +
addHandle( "type|href|height|width", function( elem, name, isXML ) {
 +
if ( !isXML ) {
 +
return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
 +
}
 +
});
 +
}
 +
 +
// Support: IE<9
 +
// Use defaultValue in place of getAttribute("value")
 +
if ( !support.attributes || !assert(function( div ) {
 +
div.innerHTML = "<input/>";
 +
div.firstChild.setAttribute( "value", "" );
 +
return div.firstChild.getAttribute( "value" ) === "";
 +
}) ) {
 +
addHandle( "value", function( elem, name, isXML ) {
 +
if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
 +
return elem.defaultValue;
 +
}
 +
});
 +
}
 +
 +
// Support: IE<9
 +
// Use getAttributeNode to fetch booleans when getAttribute lies
 +
if ( !assert(function( div ) {
 +
return div.getAttribute("disabled") == null;
 +
}) ) {
 +
addHandle( booleans, function( elem, name, isXML ) {
 +
var val;
 +
if ( !isXML ) {
 +
return elem[ name ] === true ? name.toLowerCase() :
 +
(val = elem.getAttributeNode( name )) && val.specified ?
 +
val.value :
 +
null;
 +
}
 +
});
 +
}
 +
 +
return Sizzle;
 +
 +
})( window );
 +
 +
 +
 +
jQuery.find = Sizzle;
 +
jQuery.expr = Sizzle.selectors;
 +
jQuery.expr[ ":" ] = jQuery.expr.pseudos;
 +
jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
 +
jQuery.text = Sizzle.getText;
 +
jQuery.isXMLDoc = Sizzle.isXML;
 +
jQuery.contains = Sizzle.contains;
 +
 +
 +
 +
var dir = function( elem, dir, until ) {
 +
var matched = [],
 +
truncate = until !== undefined;
 +
 +
while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
 +
if ( elem.nodeType === 1 ) {
 +
if ( truncate && jQuery( elem ).is( until ) ) {
 +
break;
 +
}
 +
matched.push( elem );
 +
}
 +
}
 +
return matched;
 +
};
 +
 +
 +
var siblings = function( n, elem ) {
 +
var matched = [];
 +
 +
for ( ; n; n = n.nextSibling ) {
 +
if ( n.nodeType === 1 && n !== elem ) {
 +
matched.push( n );
 +
}
 +
}
 +
 +
return matched;
 +
};
 +
 +
 +
var rneedsContext = jQuery.expr.match.needsContext;
 +
 +
var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
 +
 +
 +
 +
var risSimple = /^.[^:#\[\.,]*$/;
 +
 +
// Implement the identical functionality for filter and not
 +
function winnow( elements, qualifier, not ) {
 +
if ( jQuery.isFunction( qualifier ) ) {
 +
return jQuery.grep( elements, function( elem, i ) {
 +
/* jshint -W018 */
 +
return !!qualifier.call( elem, i, elem ) !== not;
 +
} );
 +
 +
}
 +
 +
if ( qualifier.nodeType ) {
 +
return jQuery.grep( elements, function( elem ) {
 +
return ( elem === qualifier ) !== not;
 +
} );
 +
 +
}
 +
 +
if ( typeof qualifier === "string" ) {
 +
if ( risSimple.test( qualifier ) ) {
 +
return jQuery.filter( qualifier, elements, not );
 +
}
 +
 +
qualifier = jQuery.filter( qualifier, elements );
 +
}
 +
 +
return jQuery.grep( elements, function( elem ) {
 +
return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not;
 +
} );
 +
}
 +
 +
jQuery.filter = function( expr, elems, not ) {
 +
var elem = elems[ 0 ];
 +
 +
if ( not ) {
 +
expr = ":not(" + expr + ")";
 +
}
 +
 +
return elems.length === 1 && elem.nodeType === 1 ?
 +
jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
 +
jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
 +
return elem.nodeType === 1;
 +
} ) );
 +
};
 +
 +
jQuery.fn.extend( {
 +
find: function( selector ) {
 +
var i,
 +
ret = [],
 +
self = this,
 +
len = self.length;
 +
 +
if ( typeof selector !== "string" ) {
 +
return this.pushStack( jQuery( selector ).filter( function() {
 +
for ( i = 0; i < len; i++ ) {
 +
if ( jQuery.contains( self[ i ], this ) ) {
 +
return true;
 +
}
 +
}
 +
} ) );
 +
}
 +
 +
for ( i = 0; i < len; i++ ) {
 +
jQuery.find( selector, self[ i ], ret );
 +
}
 +
 +
// Needed because $( selector, context ) becomes $( context ).find( selector )
 +
ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
 +
ret.selector = this.selector ? this.selector + " " + selector : selector;
 +
return ret;
 +
},
 +
filter: function( selector ) {
 +
return this.pushStack( winnow( this, selector || [], false ) );
 +
},
 +
not: function( selector ) {
 +
return this.pushStack( winnow( this, selector || [], true ) );
 +
},
 +
is: function( selector ) {
 +
return !!winnow(
 +
this,
 +
 +
// If this is a positional/relative selector, check membership in the returned set
 +
// so $("p:first").is("p:last") won't return true for a doc with two "p".
 +
typeof selector === "string" && rneedsContext.test( selector ) ?
 +
jQuery( selector ) :
 +
selector || [],
 +
false
 +
).length;
 +
}
 +
} );
 +
 +
 +
// Initialize a jQuery object
 +
 +
 +
// A central reference to the root jQuery(document)
 +
var rootjQuery,
 +
 +
// A simple way to check for HTML strings
 +
// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
 +
// Strict HTML recognition (#11290: must start with <)
 +
rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
 +
 +
init = jQuery.fn.init = function( selector, context, root ) {
 +
var match, elem;
 +
 +
// HANDLE: $(""), $(null), $(undefined), $(false)
 +
if ( !selector ) {
 +
return this;
 +
}
 +
 +
// init accepts an alternate rootjQuery
 +
// so migrate can support jQuery.sub (gh-2101)
 +
root = root || rootjQuery;
 +
 +
// Handle HTML strings
 +
if ( typeof selector === "string" ) {
 +
if ( selector.charAt( 0 ) === "<" &&
 +
selector.charAt( selector.length - 1 ) === ">" &&
 +
selector.length >= 3 ) {
 +
 +
// Assume that strings that start and end with <> are HTML and skip the regex check
 +
match = [ null, selector, null ];
 +
 +
} else {
 +
match = rquickExpr.exec( selector );
 +
}
 +
 +
// Match html or make sure no context is specified for #id
 +
if ( match && ( match[ 1 ] || !context ) ) {
 +
 +
// HANDLE: $(html) -> $(array)
 +
if ( match[ 1 ] ) {
 +
context = context instanceof jQuery ? context[ 0 ] : context;
 +
 +
// scripts is true for back-compat
 +
// Intentionally let the error be thrown if parseHTML is not present
 +
jQuery.merge( this, jQuery.parseHTML(
 +
match[ 1 ],
 +
context && context.nodeType ? context.ownerDocument || context : document,
 +
true
 +
) );
 +
 +
// HANDLE: $(html, props)
 +
if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
 +
for ( match in context ) {
 +
 +
// Properties of context are called as methods if possible
 +
if ( jQuery.isFunction( this[ match ] ) ) {
 +
this[ match ]( context[ match ] );
 +
 +
// ...and otherwise set as attributes
 +
} else {
 +
this.attr( match, context[ match ] );
 +
}
 +
}
 +
}
 +
 +
return this;
 +
 +
// HANDLE: $(#id)
 +
} else {
 +
elem = document.getElementById( match[ 2 ] );
 +
 +
// Check parentNode to catch when Blackberry 4.6 returns
 +
// nodes that are no longer in the document #6963
 +
if ( elem && elem.parentNode ) {
 +
 +
// Handle the case where IE and Opera return items
 +
// by name instead of ID
 +
if ( elem.id !== match[ 2 ] ) {
 +
return rootjQuery.find( selector );
 +
}
 +
 +
// Otherwise, we inject the element directly into the jQuery object
 +
this.length = 1;
 +
this[ 0 ] = elem;
 +
}
 +
 +
this.context = document;
 +
this.selector = selector;
 +
return this;
 +
}
 +
 +
// HANDLE: $(expr, $(...))
 +
} else if ( !context || context.jquery ) {
 +
return ( context || root ).find( selector );
 +
 +
// HANDLE: $(expr, context)
 +
// (which is just equivalent to: $(context).find(expr)
 +
} else {
 +
return this.constructor( context ).find( selector );
 +
}
 +
 +
// HANDLE: $(DOMElement)
 +
} else if ( selector.nodeType ) {
 +
this.context = this[ 0 ] = selector;
 +
this.length = 1;
 +
return this;
 +
 +
// HANDLE: $(function)
 +
// Shortcut for document ready
 +
} else if ( jQuery.isFunction( selector ) ) {
 +
return typeof root.ready !== "undefined" ?
 +
root.ready( selector ) :
 +
 +
// Execute immediately if ready is not present
 +
selector( jQuery );
 +
}
 +
 +
if ( selector.selector !== undefined ) {
 +
this.selector = selector.selector;
 +
this.context = selector.context;
 +
}
 +
 +
return jQuery.makeArray( selector, this );
 +
};
 +
 +
// Give the init function the jQuery prototype for later instantiation
 +
init.prototype = jQuery.fn;
 +
 +
// Initialize central reference
 +
rootjQuery = jQuery( document );
 +
 +
 +
var rparentsprev = /^(?:parents|prev(?:Until|All))/,
 +
 +
// methods guaranteed to produce a unique set when starting from a unique set
 +
guaranteedUnique = {
 +
children: true,
 +
contents: true,
 +
next: true,
 +
prev: true
 +
};
 +
 +
jQuery.fn.extend( {
 +
has: function( target ) {
 +
var i,
 +
targets = jQuery( target, this ),
 +
len = targets.length;
 +
 +
return this.filter( function() {
 +
for ( i = 0; i < len; i++ ) {
 +
if ( jQuery.contains( this, targets[ i ] ) ) {
 +
return true;
 +
}
 +
}
 +
} );
 +
},
 +
 +
closest: function( selectors, context ) {
 +
var cur,
 +
i = 0,
 +
l = this.length,
 +
matched = [],
 +
pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
 +
jQuery( selectors, context || this.context ) :
 +
0;
 +
 +
for ( ; i < l; i++ ) {
 +
for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
 +
 +
// Always skip document fragments
 +
if ( cur.nodeType < 11 && ( pos ?
 +
pos.index( cur ) > -1 :
 +
 +
// Don't pass non-elements to Sizzle
 +
cur.nodeType === 1 &&
 +
jQuery.find.matchesSelector( cur, selectors ) ) ) {
 +
 +
matched.push( cur );
 +
break;
 +
}
 +
}
 +
}
 +
 +
return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
 +
},
 +
 +
// Determine the position of an element within
 +
// the matched set of elements
 +
index: function( elem ) {
 +
 +
// No argument, return index in parent
 +
if ( !elem ) {
 +
return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
 +
}
 +
 +
// index in selector
 +
if ( typeof elem === "string" ) {
 +
return jQuery.inArray( this[ 0 ], jQuery( elem ) );
 +
}
 +
 +
// Locate the position of the desired element
 +
return jQuery.inArray(
 +
 +
// If it receives a jQuery object, the first element is used
 +
elem.jquery ? elem[ 0 ] : elem, this );
 +
},
 +
 +
add: function( selector, context ) {
 +
return this.pushStack(
 +
jQuery.uniqueSort(
 +
jQuery.merge( this.get(), jQuery( selector, context ) )
 +
)
 +
);
 +
},
 +
 +
addBack: function( selector ) {
 +
return this.add( selector == null ?
 +
this.prevObject : this.prevObject.filter( selector )
 +
);
 +
}
 +
} );
 +
 +
function sibling( cur, dir ) {
 +
do {
 +
cur = cur[ dir ];
 +
} while ( cur && cur.nodeType !== 1 );
 +
 +
return cur;
 +
}
 +
 +
jQuery.each( {
 +
parent: function( elem ) {
 +
var parent = elem.parentNode;
 +
return parent && parent.nodeType !== 11 ? parent : null;
 +
},
 +
parents: function( elem ) {
 +
return dir( elem, "parentNode" );
 +
},
 +
parentsUntil: function( elem, i, until ) {
 +
return dir( elem, "parentNode", until );
 +
},
 +
next: function( elem ) {
 +
return sibling( elem, "nextSibling" );
 +
},
 +
prev: function( elem ) {
 +
return sibling( elem, "previousSibling" );
 +
},
 +
nextAll: function( elem ) {
 +
return dir( elem, "nextSibling" );
 +
},
 +
prevAll: function( elem ) {
 +
return dir( elem, "previousSibling" );
 +
},
 +
nextUntil: function( elem, i, until ) {
 +
return dir( elem, "nextSibling", until );
 +
},
 +
prevUntil: function( elem, i, until ) {
 +
return dir( elem, "previousSibling", until );
 +
},
 +
siblings: function( elem ) {
 +
return siblings( ( elem.parentNode || {} ).firstChild, elem );
 +
},
 +
children: function( elem ) {
 +
return siblings( elem.firstChild );
 +
},
 +
contents: function( elem ) {
 +
return jQuery.nodeName( elem, "iframe" ) ?
 +
elem.contentDocument || elem.contentWindow.document :
 +
jQuery.merge( [], elem.childNodes );
 +
}
 +
}, function( name, fn ) {
 +
jQuery.fn[ name ] = function( until, selector ) {
 +
var ret = jQuery.map( this, fn, until );
 +
 +
if ( name.slice( -5 ) !== "Until" ) {
 +
selector = until;
 +
}
 +
 +
if ( selector && typeof selector === "string" ) {
 +
ret = jQuery.filter( selector, ret );
 +
}
 +
 +
if ( this.length > 1 ) {
 +
 +
// Remove duplicates
 +
if ( !guaranteedUnique[ name ] ) {
 +
ret = jQuery.uniqueSort( ret );
 +
}
 +
 +
// Reverse order for parents* and prev-derivatives
 +
if ( rparentsprev.test( name ) ) {
 +
ret = ret.reverse();
 +
}
 +
}
 +
 +
return this.pushStack( ret );
 +
};
 +
} );
 +
var rnotwhite = ( /\S+/g );
 +
 +
 +
 +
// Convert String-formatted options into Object-formatted ones
 +
function createOptions( options ) {
 +
var object = {};
 +
jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
 +
object[ flag ] = true;
 +
} );
 +
return object;
 +
}
  
 
/*
 
/*
 +
* Create a callback list using the following parameters:
 
  *
 
  *
  * TERMS OF USE - EASING EQUATIONS
+
  * options: an optional list of space-separated options that will change how
  *  
+
  * the callback list behaves or a more traditional option object
* Open source under the BSD License.
+
  *
  *  
+
  * By default a callback list will act like an event callback list and can be
  * Copyright © 2001 Robert Penner
+
  * "fired" multiple times.
  * All rights reserved.
+
  *
  *  
+
  * Possible options:
  * Redistribution and use in source and binary forms, with or without modification,
+
  *
* are permitted provided that the following conditions are met:
+
  * once: will ensure the callback list can only be fired once (like a Deferred)
  *  
+
  *
  * Redistributions of source code must retain the above copyright notice, this list of
+
  * memory: will keep track of previous values and will call any callback added
  * conditions and the following disclaimer.
+
  * after the list has been fired right away with the latest "memorized"
* Redistributions in binary form must reproduce the above copyright notice, this list
+
  * values (like a Deferred)
  * of conditions and the following disclaimer in the documentation and/or other materials
+
  *
  * provided with the distribution.
+
  * unique: will ensure a callback can only be added once (no duplicate in the list)
*
+
  *
* Neither the name of the author nor the names of contributors may be used to endorse
+
  * stopOnFalse: interrupt callings when a callback returns false
* or promote products derived from this software without specific prior written permission.
+
*
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+
  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+
  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+
*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+
*  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+
  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+
* OF THE POSSIBILITY OF SUCH DAMAGE.
+
 
  *
 
  *
 
  */
 
  */
 +
jQuery.Callbacks = function( options ) {
  
/*! Magnific Popup - v0.9.9 - 2014-09-06
+
// Convert options from String-formatted to Object-formatted if needed
* http://dimsemenov.com/plugins/magnific-popup/
+
// (we check in cache first)
* Copyright (c) 2014 Dmitry Semenov; */
+
options = typeof options === "string" ?
(function(e){var t,n,i,o,r,a,s,l="Close",c="BeforeClose",d="AfterClose",u="BeforeAppend",p="MarkupParse",f="Open",m="Change",g="mfp",h="."+g,v="mfp-ready",C="mfp-removing",y="mfp-prevent-close",w=function(){},b=!!window.jQuery,I=e(window),x=function(e,n){t.ev.on(g+e+h,n)},k=function(t,n,i,o){var r=document.createElement("div");return r.className="mfp-"+t,i&&(r.innerHTML=i),o?n&&n.appendChild(r):(r=e(r),n&&r.appendTo(n)),r},T=function(n,i){t.ev.triggerHandler(g+n,i),t.st.callbacks&&(n=n.charAt(0).toLowerCase()+n.slice(1),t.st.callbacks[n]&&t.st.callbacks[n].apply(t,e.isArray(i)?i:[i]))},E=function(n){return n===s&&t.currTemplate.closeBtn||(t.currTemplate.closeBtn=e(t.st.closeMarkup.replace("%title%",t.st.tClose)),s=n),t.currTemplate.closeBtn},_=function(){e.magnificPopup.instance||(t=new w,t.init(),e.magnificPopup.instance=t)},S=function(){var e=document.createElement("p").style,t=["ms","O","Moz","Webkit"];if(void 0!==e.transition)return!0;for(;t.length;)if(t.pop()+"Transition"in e)return!0;return!1};w.prototype={constructor:w,init:function(){var n=navigator.appVersion;t.isIE7=-1!==n.indexOf("MSIE 7."),t.isIE8=-1!==n.indexOf("MSIE 8."),t.isLowIE=t.isIE7||t.isIE8,t.isAndroid=/android/gi.test(n),t.isIOS=/iphone|ipad|ipod/gi.test(n),t.supportsTransition=S(),t.probablyMobile=t.isAndroid||t.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),o=e(document),t.popupsCache={}},open:function(n){i||(i=e(document.body));var r;if(n.isObj===!1){t.items=n.items.toArray(),t.index=0;var s,l=n.items;for(r=0;l.length>r;r++)if(s=l[r],s.parsed&&(s=s.el[0]),s===n.el[0]){t.index=r;break}}else t.items=e.isArray(n.items)?n.items:[n.items],t.index=n.index||0;if(t.isOpen)return t.updateItemHTML(),void 0;t.types=[],a="",t.ev=n.mainEl&&n.mainEl.length?n.mainEl.eq(0):o,n.key?(t.popupsCache[n.key]||(t.popupsCache[n.key]={}),t.currTemplate=t.popupsCache[n.key]):t.currTemplate={},t.st=e.extend(!0,{},e.magnificPopup.defaults,n),t.fixedContentPos="auto"===t.st.fixedContentPos?!t.probablyMobile:t.st.fixedContentPos,t.st.modal&&(t.st.closeOnContentClick=!1,t.st.closeOnBgClick=!1,t.st.showCloseBtn=!1,t.st.enableEscapeKey=!1),t.bgOverlay||(t.bgOverlay=k("bg").on("click"+h,function(){t.close()}),t.wrap=k("wrap").attr("tabindex",-1).on("click"+h,function(e){t._checkIfClose(e.target)&&t.close()}),t.container=k("container",t.wrap)),t.contentContainer=k("content"),t.st.preloader&&(t.preloader=k("preloader",t.container,t.st.tLoading));var c=e.magnificPopup.modules;for(r=0;c.length>r;r++){var d=c[r];d=d.charAt(0).toUpperCase()+d.slice(1),t["init"+d].call(t)}T("BeforeOpen"),t.st.showCloseBtn&&(t.st.closeBtnInside?(x(p,function(e,t,n,i){n.close_replaceWith=E(i.type)}),a+=" mfp-close-btn-in"):t.wrap.append(E())),t.st.alignTop&&(a+=" mfp-align-top"),t.fixedContentPos?t.wrap.css({overflow:t.st.overflowY,overflowX:"hidden",overflowY:t.st.overflowY}):t.wrap.css({top:I.scrollTop(),position:"absolute"}),(t.st.fixedBgPos===!1||"auto"===t.st.fixedBgPos&&!t.fixedContentPos)&&t.bgOverlay.css({height:o.height(),position:"absolute"}),t.st.enableEscapeKey&&o.on("keyup"+h,function(e){27===e.keyCode&&t.close()}),I.on("resize"+h,function(){t.updateSize()}),t.st.closeOnContentClick||(a+=" mfp-auto-cursor"),a&&t.wrap.addClass(a);var u=t.wH=I.height(),m={};if(t.fixedContentPos&&t._hasScrollBar(u)){var g=t._getScrollbarSize();g&&(m.marginRight=g)}t.fixedContentPos&&(t.isIE7?e("body, html").css("overflow","hidden"):m.overflow="hidden");var C=t.st.mainClass;return t.isIE7&&(C+=" mfp-ie7"),C&&t._addClassToMFP(C),t.updateItemHTML(),T("BuildControls"),e("html").css(m),t.bgOverlay.add(t.wrap).prependTo(t.st.prependTo||i),t._lastFocusedEl=document.activeElement,setTimeout(function(){t.content?(t._addClassToMFP(v),t._setFocus()):t.bgOverlay.addClass(v),o.on("focusin"+h,t._onFocusIn)},16),t.isOpen=!0,t.updateSize(u),T(f),n},close:function(){t.isOpen&&(T(c),t.isOpen=!1,t.st.removalDelay&&!t.isLowIE&&t.supportsTransition?(t._addClassToMFP(C),setTimeout(function(){t._close()},t.st.removalDelay)):t._close())},_close:function(){T(l);var n=C+" "+v+" ";if(t.bgOverlay.detach(),t.wrap.detach(),t.container.empty(),t.st.mainClass&&(n+=t.st.mainClass+" "),t._removeClassFromMFP(n),t.fixedContentPos){var i={marginRight:""};t.isIE7?e("body, html").css("overflow",""):i.overflow="",e("html").css(i)}o.off("keyup"+h+" focusin"+h),t.ev.off(h),t.wrap.attr("class","mfp-wrap").removeAttr("style"),t.bgOverlay.attr("class","mfp-bg"),t.container.attr("class","mfp-container"),!t.st.showCloseBtn||t.st.closeBtnInside&&t.currTemplate[t.currItem.type]!==!0||t.currTemplate.closeBtn&&t.currTemplate.closeBtn.detach(),t._lastFocusedEl&&e(t._lastFocusedEl).focus(),t.currItem=null,t.content=null,t.currTemplate=null,t.prevHeight=0,T(d)},updateSize:function(e){if(t.isIOS){var n=document.documentElement.clientWidth/window.innerWidth,i=window.innerHeight*n;t.wrap.css("height",i),t.wH=i}else t.wH=e||I.height();t.fixedContentPos||t.wrap.css("height",t.wH),T("Resize")},updateItemHTML:function(){var n=t.items[t.index];t.contentContainer.detach(),t.content&&t.content.detach(),n.parsed||(n=t.parseEl(t.index));var i=n.type;if(T("BeforeChange",[t.currItem?t.currItem.type:"",i]),t.currItem=n,!t.currTemplate[i]){var o=t.st[i]?t.st[i].markup:!1;T("FirstMarkupParse",o),t.currTemplate[i]=o?e(o):!0}r&&r!==n.type&&t.container.removeClass("mfp-"+r+"-holder");var a=t["get"+i.charAt(0).toUpperCase()+i.slice(1)](n,t.currTemplate[i]);t.appendContent(a,i),n.preloaded=!0,T(m,n),r=n.type,t.container.prepend(t.contentContainer),T("AfterChange")},appendContent:function(e,n){t.content=e,e?t.st.showCloseBtn&&t.st.closeBtnInside&&t.currTemplate[n]===!0?t.content.find(".mfp-close").length||t.content.append(E()):t.content=e:t.content="",T(u),t.container.addClass("mfp-"+n+"-holder"),t.contentContainer.append(t.content)},parseEl:function(n){var i,o=t.items[n];if(o.tagName?o={el:e(o)}:(i=o.type,o={data:o,src:o.src}),o.el){for(var r=t.types,a=0;r.length>a;a++)if(o.el.hasClass("mfp-"+r[a])){i=r[a];break}o.src=o.el.attr("data-mfp-src"),o.src||(o.src=o.el.attr("href"))}return o.type=i||t.st.type||"inline",o.index=n,o.parsed=!0,t.items[n]=o,T("ElementParse",o),t.items[n]},addGroup:function(e,n){var i=function(i){i.mfpEl=this,t._openClick(i,e,n)};n||(n={});var o="click.magnificPopup";n.mainEl=e,n.items?(n.isObj=!0,e.off(o).on(o,i)):(n.isObj=!1,n.delegate?e.off(o).on(o,n.delegate,i):(n.items=e,e.off(o).on(o,i)))},_openClick:function(n,i,o){var r=void 0!==o.midClick?o.midClick:e.magnificPopup.defaults.midClick;if(r||2!==n.which&&!n.ctrlKey&&!n.metaKey){var a=void 0!==o.disableOn?o.disableOn:e.magnificPopup.defaults.disableOn;if(a)if(e.isFunction(a)){if(!a.call(t))return!0}else if(a>I.width())return!0;n.type&&(n.preventDefault(),t.isOpen&&n.stopPropagation()),o.el=e(n.mfpEl),o.delegate&&(o.items=i.find(o.delegate)),t.open(o)}},updateStatus:function(e,i){if(t.preloader){n!==e&&t.container.removeClass("mfp-s-"+n),i||"loading"!==e||(i=t.st.tLoading);var o={status:e,text:i};T("UpdateStatus",o),e=o.status,i=o.text,t.preloader.html(i),t.preloader.find("a").on("click",function(e){e.stopImmediatePropagation()}),t.container.addClass("mfp-s-"+e),n=e}},_checkIfClose:function(n){if(!e(n).hasClass(y)){var i=t.st.closeOnContentClick,o=t.st.closeOnBgClick;if(i&&o)return!0;if(!t.content||e(n).hasClass("mfp-close")||t.preloader&&n===t.preloader[0])return!0;if(n===t.content[0]||e.contains(t.content[0],n)){if(i)return!0}else if(o&&e.contains(document,n))return!0;return!1}},_addClassToMFP:function(e){t.bgOverlay.addClass(e),t.wrap.addClass(e)},_removeClassFromMFP:function(e){this.bgOverlay.removeClass(e),t.wrap.removeClass(e)},_hasScrollBar:function(e){return(t.isIE7?o.height():document.body.scrollHeight)>(e||I.height())},_setFocus:function(){(t.st.focus?t.content.find(t.st.focus).eq(0):t.wrap).focus()},_onFocusIn:function(n){return n.target===t.wrap[0]||e.contains(t.wrap[0],n.target)?void 0:(t._setFocus(),!1)},_parseMarkup:function(t,n,i){var o;i.data&&(n=e.extend(i.data,n)),T(p,[t,n,i]),e.each(n,function(e,n){if(void 0===n||n===!1)return!0;if(o=e.split("_"),o.length>1){var i=t.find(h+"-"+o[0]);if(i.length>0){var r=o[1];"replaceWith"===r?i[0]!==n[0]&&i.replaceWith(n):"img"===r?i.is("img")?i.attr("src",n):i.replaceWith('<img src="'+n+'" class="'+i.attr("class")+'" />'):i.attr(o[1],n)}}else t.find(h+"-"+e).html(n)})},_getScrollbarSize:function(){if(void 0===t.scrollbarSize){var e=document.createElement("div");e.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(e),t.scrollbarSize=e.offsetWidth-e.clientWidth,document.body.removeChild(e)}return t.scrollbarSize}},e.magnificPopup={instance:null,proto:w.prototype,modules:[],open:function(t,n){return _(),t=t?e.extend(!0,{},t):{},t.isObj=!0,t.index=n||0,this.instance.open(t)},close:function(){return e.magnificPopup.instance&&e.magnificPopup.instance.close()},registerModule:function(t,n){n.options&&(e.magnificPopup.defaults[t]=n.options),e.extend(this.proto,n.proto),this.modules.push(t)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'<button title="%title%" type="button" class="mfp-close">&times;</button>',tClose:"Close (Esc)",tLoading:"Loading..."}},e.fn.magnificPopup=function(n){_();var i=e(this);if("string"==typeof n)if("open"===n){var o,r=b?i.data("magnificPopup"):i[0].magnificPopup,a=parseInt(arguments[1],10)||0;r.items?o=r.items[a]:(o=i,r.delegate&&(o=o.find(r.delegate)),o=o.eq(a)),t._openClick({mfpEl:o},i,r)}else t.isOpen&&t[n].apply(t,Array.prototype.slice.call(arguments,1));else n=e.extend(!0,{},n),b?i.data("magnificPopup",n):i[0].magnificPopup=n,t.addGroup(i,n);return i};var P,O,z,M="inline",B=function(){z&&(O.after(z.addClass(P)).detach(),z=null)};e.magnificPopup.registerModule(M,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){t.types.push(M),x(l+"."+M,function(){B()})},getInline:function(n,i){if(B(),n.src){var o=t.st.inline,r=e(n.src);if(r.length){var a=r[0].parentNode;a&&a.tagName&&(O||(P=o.hiddenClass,O=k(P),P="mfp-"+P),z=r.after(O).detach().removeClass(P)),t.updateStatus("ready")}else t.updateStatus("error",o.tNotFound),r=e("<div>");return n.inlineElement=r,r}return t.updateStatus("ready"),t._parseMarkup(i,{},n),i}}});var F,H="ajax",L=function(){F&&i.removeClass(F)},A=function(){L(),t.req&&t.req.abort()};e.magnificPopup.registerModule(H,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'<a href="%url%">The content</a> could not be loaded.'},proto:{initAjax:function(){t.types.push(H),F=t.st.ajax.cursor,x(l+"."+H,A),x("BeforeChange."+H,A)},getAjax:function(n){F&&i.addClass(F),t.updateStatus("loading");var o=e.extend({url:n.src,success:function(i,o,r){var a={data:i,xhr:r};T("ParseAjax",a),t.appendContent(e(a.data),H),n.finished=!0,L(),t._setFocus(),setTimeout(function(){t.wrap.addClass(v)},16),t.updateStatus("ready"),T("AjaxContentAdded")},error:function(){L(),n.finished=n.loadError=!0,t.updateStatus("error",t.st.ajax.tError.replace("%url%",n.src))}},t.st.ajax.settings);return t.req=e.ajax(o),""}}});var j,N=function(n){if(n.data&&void 0!==n.data.title)return n.data.title;var i=t.st.image.titleSrc;if(i){if(e.isFunction(i))return i.call(t,n);if(n.el)return n.el.attr(i)||""}return""};e.magnificPopup.registerModule("image",{options:{markup:'<div class="mfp-figure"><div class="mfp-close"></div><figure><div class="mfp-img"></div><figcaption><div class="mfp-bottom-bar"><div class="mfp-title"></div><div class="mfp-counter"></div></div></figcaption></figure></div>',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'<a href="%url%">The image</a> could not be loaded.'},proto:{initImage:function(){var e=t.st.image,n=".image";t.types.push("image"),x(f+n,function(){"image"===t.currItem.type&&e.cursor&&i.addClass(e.cursor)}),x(l+n,function(){e.cursor&&i.removeClass(e.cursor),I.off("resize"+h)}),x("Resize"+n,t.resizeImage),t.isLowIE&&x("AfterChange",t.resizeImage)},resizeImage:function(){var e=t.currItem;if(e&&e.img&&t.st.image.verticalFit){var n=0;t.isLowIE&&(n=parseInt(e.img.css("padding-top"),10)+parseInt(e.img.css("padding-bottom"),10)),e.img.css("max-height",t.wH-n)}},_onImageHasSize:function(e){e.img&&(e.hasSize=!0,j&&clearInterval(j),e.isCheckingImgSize=!1,T("ImageHasSize",e),e.imgHidden&&(t.content&&t.content.removeClass("mfp-loading"),e.imgHidden=!1))},findImageSize:function(e){var n=0,i=e.img[0],o=function(r){j&&clearInterval(j),j=setInterval(function(){return i.naturalWidth>0?(t._onImageHasSize(e),void 0):(n>200&&clearInterval(j),n++,3===n?o(10):40===n?o(50):100===n&&o(500),void 0)},r)};o(1)},getImage:function(n,i){var o=0,r=function(){n&&(n.img[0].complete?(n.img.off(".mfploader"),n===t.currItem&&(t._onImageHasSize(n),t.updateStatus("ready")),n.hasSize=!0,n.loaded=!0,T("ImageLoadComplete")):(o++,200>o?setTimeout(r,100):a()))},a=function(){n&&(n.img.off(".mfploader"),n===t.currItem&&(t._onImageHasSize(n),t.updateStatus("error",s.tError.replace("%url%",n.src))),n.hasSize=!0,n.loaded=!0,n.loadError=!0)},s=t.st.image,l=i.find(".mfp-img");if(l.length){var c=document.createElement("img");c.className="mfp-img",n.img=e(c).on("load.mfploader",r).on("error.mfploader",a),c.src=n.src,l.is("img")&&(n.img=n.img.clone()),c=n.img[0],c.naturalWidth>0?n.hasSize=!0:c.width||(n.hasSize=!1)}return t._parseMarkup(i,{title:N(n),img_replaceWith:n.img},n),t.resizeImage(),n.hasSize?(j&&clearInterval(j),n.loadError?(i.addClass("mfp-loading"),t.updateStatus("error",s.tError.replace("%url%",n.src))):(i.removeClass("mfp-loading"),t.updateStatus("ready")),i):(t.updateStatus("loading"),n.loading=!0,n.hasSize||(n.imgHidden=!0,i.addClass("mfp-loading"),t.findImageSize(n)),i)}}});var W,R=function(){return void 0===W&&(W=void 0!==document.createElement("p").style.MozTransform),W};e.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(e){return e.is("img")?e:e.find("img")}},proto:{initZoom:function(){var e,n=t.st.zoom,i=".zoom";if(n.enabled&&t.supportsTransition){var o,r,a=n.duration,s=function(e){var t=e.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),i="all "+n.duration/1e3+"s "+n.easing,o={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},r="transition";return o["-webkit-"+r]=o["-moz-"+r]=o["-o-"+r]=o[r]=i,t.css(o),t},d=function(){t.content.css("visibility","visible")};x("BuildControls"+i,function(){if(t._allowZoom()){if(clearTimeout(o),t.content.css("visibility","hidden"),e=t._getItemToZoom(),!e)return d(),void 0;r=s(e),r.css(t._getOffset()),t.wrap.append(r),o=setTimeout(function(){r.css(t._getOffset(!0)),o=setTimeout(function(){d(),setTimeout(function(){r.remove(),e=r=null,T("ZoomAnimationEnded")},16)},a)},16)}}),x(c+i,function(){if(t._allowZoom()){if(clearTimeout(o),t.st.removalDelay=a,!e){if(e=t._getItemToZoom(),!e)return;r=s(e)}r.css(t._getOffset(!0)),t.wrap.append(r),t.content.css("visibility","hidden"),setTimeout(function(){r.css(t._getOffset())},16)}}),x(l+i,function(){t._allowZoom()&&(d(),r&&r.remove(),e=null)})}},_allowZoom:function(){return"image"===t.currItem.type},_getItemToZoom:function(){return t.currItem.hasSize?t.currItem.img:!1},_getOffset:function(n){var i;i=n?t.currItem.img:t.st.zoom.opener(t.currItem.el||t.currItem);var o=i.offset(),r=parseInt(i.css("padding-top"),10),a=parseInt(i.css("padding-bottom"),10);o.top-=e(window).scrollTop()-r;var s={width:i.width(),height:(b?i.innerHeight():i[0].offsetHeight)-a-r};return R()?s["-moz-transform"]=s.transform="translate("+o.left+"px,"+o.top+"px)":(s.left=o.left,s.top=o.top),s}}});var Z="iframe",q="//about:blank",D=function(e){if(t.currTemplate[Z]){var n=t.currTemplate[Z].find("iframe");n.length&&(e||(n[0].src=q),t.isIE8&&n.css("display",e?"block":"none"))}};e.magnificPopup.registerModule(Z,{options:{markup:'<div class="mfp-iframe-scaler"><div class="mfp-close"></div><iframe class="mfp-iframe" src="//about:blank" frameborder="0" allowfullscreen></iframe></div>',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){t.types.push(Z),x("BeforeChange",function(e,t,n){t!==n&&(t===Z?D():n===Z&&D(!0))}),x(l+"."+Z,function(){D()})},getIframe:function(n,i){var o=n.src,r=t.st.iframe;e.each(r.patterns,function(){return o.indexOf(this.index)>-1?(this.id&&(o="string"==typeof this.id?o.substr(o.lastIndexOf(this.id)+this.id.length,o.length):this.id.call(this,o)),o=this.src.replace("%id%",o),!1):void 0});var a={};return r.srcAction&&(a[r.srcAction]=o),t._parseMarkup(i,a,n),t.updateStatus("ready"),i}}});var K=function(e){var n=t.items.length;return e>n-1?e-n:0>e?n+e:e},Y=function(e,t,n){return e.replace(/%curr%/gi,t+1).replace(/%total%/gi,n)};e.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'<button title="%title%" type="button" class="mfp-arrow mfp-arrow-%dir%"></button>',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var n=t.st.gallery,i=".mfp-gallery",r=Boolean(e.fn.mfpFastClick);return t.direction=!0,n&&n.enabled?(a+=" mfp-gallery",x(f+i,function(){n.navigateByImgClick&&t.wrap.on("click"+i,".mfp-img",function(){return t.items.length>1?(t.next(),!1):void 0}),o.on("keydown"+i,function(e){37===e.keyCode?t.prev():39===e.keyCode&&t.next()})}),x("UpdateStatus"+i,function(e,n){n.text&&(n.text=Y(n.text,t.currItem.index,t.items.length))}),x(p+i,function(e,i,o,r){var a=t.items.length;o.counter=a>1?Y(n.tCounter,r.index,a):""}),x("BuildControls"+i,function(){if(t.items.length>1&&n.arrows&&!t.arrowLeft){var i=n.arrowMarkup,o=t.arrowLeft=e(i.replace(/%title%/gi,n.tPrev).replace(/%dir%/gi,"left")).addClass(y),a=t.arrowRight=e(i.replace(/%title%/gi,n.tNext).replace(/%dir%/gi,"right")).addClass(y),s=r?"mfpFastClick":"click";o[s](function(){t.prev()}),a[s](function(){t.next()}),t.isIE7&&(k("b",o[0],!1,!0),k("a",o[0],!1,!0),k("b",a[0],!1,!0),k("a",a[0],!1,!0)),t.container.append(o.add(a))}}),x(m+i,function(){t._preloadTimeout&&clearTimeout(t._preloadTimeout),t._preloadTimeout=setTimeout(function(){t.preloadNearbyImages(),t._preloadTimeout=null},16)}),x(l+i,function(){o.off(i),t.wrap.off("click"+i),t.arrowLeft&&r&&t.arrowLeft.add(t.arrowRight).destroyMfpFastClick(),t.arrowRight=t.arrowLeft=null}),void 0):!1},next:function(){t.direction=!0,t.index=K(t.index+1),t.updateItemHTML()},prev:function(){t.direction=!1,t.index=K(t.index-1),t.updateItemHTML()},goTo:function(e){t.direction=e>=t.index,t.index=e,t.updateItemHTML()},preloadNearbyImages:function(){var e,n=t.st.gallery.preload,i=Math.min(n[0],t.items.length),o=Math.min(n[1],t.items.length);for(e=1;(t.direction?o:i)>=e;e++)t._preloadItem(t.index+e);for(e=1;(t.direction?i:o)>=e;e++)t._preloadItem(t.index-e)},_preloadItem:function(n){if(n=K(n),!t.items[n].preloaded){var i=t.items[n];i.parsed||(i=t.parseEl(n)),T("LazyLoad",i),"image"===i.type&&(i.img=e('<img class="mfp-img" />').on("load.mfploader",function(){i.hasSize=!0}).on("error.mfploader",function(){i.hasSize=!0,i.loadError=!0,T("LazyLoadError",i)}).attr("src",i.src)),i.preloaded=!0}}}});var U="retina";e.magnificPopup.registerModule(U,{options:{replaceSrc:function(e){return e.src.replace(/\.\w+$/,function(e){return"@2x"+e})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var e=t.st.retina,n=e.ratio;n=isNaN(n)?n():n,n>1&&(x("ImageHasSize."+U,function(e,t){t.img.css({"max-width":t.img[0].naturalWidth/n,width:"100%"})}),x("ElementParse."+U,function(t,i){i.src=e.replaceSrc(i,n)}))}}}}),function(){var t=1e3,n="ontouchstart"in window,i=function(){I.off("touchmove"+r+" touchend"+r)},o="mfpFastClick",r="."+o;e.fn.mfpFastClick=function(o){return e(this).each(function(){var a,s=e(this);if(n){var l,c,d,u,p,f;s.on("touchstart"+r,function(e){u=!1,f=1,p=e.originalEvent?e.originalEvent.touches[0]:e.touches[0],c=p.clientX,d=p.clientY,I.on("touchmove"+r,function(e){p=e.originalEvent?e.originalEvent.touches:e.touches,f=p.length,p=p[0],(Math.abs(p.clientX-c)>10||Math.abs(p.clientY-d)>10)&&(u=!0,i())}).on("touchend"+r,function(e){i(),u||f>1||(a=!0,e.preventDefault(),clearTimeout(l),l=setTimeout(function(){a=!1},t),o())})})}s.on("click"+r,function(){a||o()})})},e.fn.destroyMfpFastClick=function(){e(this).off("touchstart"+r+" click"+r),n&&I.off("touchmove"+r+" touchend"+r)}}(),_()})(window.jQuery||window.Zepto);
+
createOptions( options ) :
 +
jQuery.extend( {}, options );
  
/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
+
var // Flag to know if list is currently firing
!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.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]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.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:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){
+
firing,
return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ia={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(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 c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qa[0].contentDocument,b.write(),b.close(),c=sa(a,b),qa.detach()),ra[a]=c),c}var ua=/^margin/,va=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wa=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xa(a,b,c){var d,e,f,g,h=a.style;return c=c||wa(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),va.test(g)&&ua.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function ya(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.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",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var za=/^(none|table(?!-c[ea]).+)/,Aa=new RegExp("^("+Q+")(.*)$","i"),Ba=new RegExp("^([+-])=("+Q+")","i"),Ca={position:"absolute",visibility:"hidden",display:"block"},Da={letterSpacing:"0",fontWeight:"400"},Ea=["Webkit","O","Moz","ms"];function Fa(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Ea.length;while(e--)if(b=Ea[e]+c,b in a)return b;return d}function Ga(a,b,c){var d=Aa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Ha(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ia(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wa(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xa(a,b,f),(0>e||null==e)&&(e=a.style[b]),va.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Ha(a,b,c||(g?"border":"content"),d,f)+"px"}function Ja(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",ta(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xa(a,"opacity");return""===c?"1":c}}}},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":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fa(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ba.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fa(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xa(a,b,d)),"normal"===e&&b in Da&&(e=Da[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?za.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Ca,function(){return Ia(a,b,d)}):Ia(a,b,d):void 0},set:function(a,c,d){var e=d&&wa(a);return Ga(a,c,d?Ha(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=ya(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ua.test(a)||(n.cssHooks[a+b].set=Ga)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wa(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Ja(this,!0)},hide:function(){return Ja(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Ka(a,b,c,d,e){return new Ka.prototype.init(a,b,c,d,e)}n.Tween=Ka,Ka.prototype={constructor:Ka,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ka.propHooks[this.prop];return a&&a.get?a.get(this):Ka.propHooks._default.get(this)},run:function(a){var b,c=Ka.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ka.propHooks._default.set(this),this}},Ka.prototype.init.prototype=Ka.prototype,Ka.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Ka.propHooks.scrollTop=Ka.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Ka.prototype.init,n.fx.step={};var La,Ma,Na=/^(?:toggle|show|hide)$/,Oa=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pa=/queueHooks$/,Qa=[Va],Ra={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Oa.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Oa.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sa(){return setTimeout(function(){La=void 0}),La=n.now()}function Ta(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ua(a,b,c){for(var d,e=(Ra[b]||[]).concat(Ra["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Va(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||ta(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Na.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?ta(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ua(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wa(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xa(a,b,c){var d,e,f=0,g=Qa.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=La||Sa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:La||Sa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wa(k,j.opts.specialEasing);g>f;f++)if(d=Qa[f].call(j,a,k,j.opts))return d;return n.map(k,Ua,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xa,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Ra[c]=Ra[c]||[],Ra[c].unshift(b)},prefilter:function(a,b){b?Qa.unshift(a):Qa.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xa(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Ta(b,!0),a,d,e)}}),n.each({slideDown:Ta("show"),slideUp:Ta("hide"),slideToggle:Ta("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(La=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),La=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ma||(Ma=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Ma),Ma=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Ya,Za,$a=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Za:Ya)),
+
void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Za={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$a[b]||n.find.attr;$a[b]=function(a,b,d){var e,f;return d||(f=$a[b],$a[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$a[b]=f),e}});var _a=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_a.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ab=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ab," ").indexOf(b)>=0)return!0;return!1}});var bb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.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){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cb=n.now(),db=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var eb=/#.*$/,fb=/([?&])_=[^&]*/,gb=/^(.*?):[ \t]*([^\r\n]*)$/gm,hb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ib=/^(?:GET|HEAD)$/,jb=/^\/\//,kb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,lb={},mb={},nb="*/".concat("*"),ob=a.location.href,pb=kb.exec(ob.toLowerCase())||[];function qb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rb(a,b,c,d){var e={},f=a===mb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function sb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function ub(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ob,type:"GET",isLocal:hb.test(pb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":nb,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":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sb(sb(a,n.ajaxSettings),b):sb(n.ajaxSettings,a)},ajaxPrefilter:qb(lb),ajaxTransport:qb(mb),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gb.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||ob)+"").replace(eb,"").replace(jb,pb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=kb.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pb[1]&&h[2]===pb[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(pb[3]||("http:"===pb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rb(lb,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!ib.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(db.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=fb.test(d)?d.replace(fb,"$1_="+cb++):d+(db.test(d)?"&":"?")+"_="+cb++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+nb+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rb(mb,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tb(k,v,f)),u=ub(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vb=/%20/g,wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&").replace(vb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bb=0,Cb={},Db={0:200,1223:204},Eb=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Cb)Cb[a]()}),k.cors=!!Eb&&"withCredentials"in Eb,k.ajax=Eb=!!Eb,n.ajaxTransport(function(a){var b;return k.cors||Eb&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cb[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Db[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Cb[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Fb=[],Gb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Fb.pop()||n.expando+"_"+cb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Gb.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Gb,"$1"+e):b.jsonp!==!1&&(b.url+=(db.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Fb.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Hb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Hb)return Hb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Ib=a.document.documentElement;function Jb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Jb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Ib;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ib})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Jb(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=ya(k.pixelPosition,function(a,c){return c?(c=xa(a,b),va.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Kb=a.jQuery,Lb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Lb),b&&a.jQuery===n&&(a.jQuery=Kb),n},typeof b===U&&(a.jQuery=a.$=n),n});
+
//# sourceMappingURL=jquery.min.map
+
  
/*!
+
// Last fire value for non-forgettable lists
Waypoints - 4.0.0
+
memory,
Copyright © 2011-2015 Caleb Troughton
+
Licensed under the MIT license.
+
https://github.com/imakewebthings/waypoints/blog/master/licenses.txt
+
*/
+
!function(){"use strict";function t(o){if(!o)throw new Error("No options passed to Waypoint constructor");if(!o.element)throw new Error("No element option passed to Waypoint constructor");if(!o.handler)throw new Error("No handler option passed to Waypoint constructor");this.key="waypoint-"+e,this.options=t.Adapter.extend({},t.defaults,o),this.element=this.options.element,this.adapter=new t.Adapter(this.element),this.callback=o.handler,this.axis=this.options.horizontal?"horizontal":"vertical",this.enabled=this.options.enabled,this.triggerPoint=null,this.group=t.Group.findOrCreate({name:this.options.group,axis:this.axis}),this.context=t.Context.findOrCreateByElement(this.options.context),t.offsetAliases[this.options.offset]&&(this.options.offset=t.offsetAliases[this.options.offset]),this.group.add(this),this.context.add(this),i[this.key]=this,e+=1}var e=0,i={};t.prototype.queueTrigger=function(t){this.group.queueTrigger(this,t)},t.prototype.trigger=function(t){this.enabled&&this.callback&&this.callback.apply(this,t)},t.prototype.destroy=function(){this.context.remove(this),this.group.remove(this),delete i[this.key]},t.prototype.disable=function(){return this.enabled=!1,this},t.prototype.enable=function(){return this.context.refresh(),this.enabled=!0,this},t.prototype.next=function(){return this.group.next(this)},t.prototype.previous=function(){return this.group.previous(this)},t.invokeAll=function(t){var e=[];for(var o in i)e.push(i[o]);for(var n=0,r=e.length;r>n;n++)e[n][t]()},t.destroyAll=function(){t.invokeAll("destroy")},t.disableAll=function(){t.invokeAll("disable")},t.enableAll=function(){t.invokeAll("enable")},t.refreshAll=function(){t.Context.refreshAll()},t.viewportHeight=function(){return window.innerHeight||document.documentElement.clientHeight},t.viewportWidth=function(){return document.documentElement.clientWidth},t.adapters=[],t.defaults={context:window,continuous:!0,enabled:!0,group:"default",horizontal:!1,offset:0},t.offsetAliases={"bottom-in-view":function(){return this.context.innerHeight()-this.adapter.outerHeight()},"right-in-view":function(){return this.context.innerWidth()-this.adapter.outerWidth()}},window.Waypoint=t}(),function(){"use strict";function t(t){window.setTimeout(t,1e3/60)}function e(t){this.element=t,this.Adapter=n.Adapter,this.adapter=new this.Adapter(t),this.key="waypoint-context-"+i,this.didScroll=!1,this.didResize=!1,this.oldScroll={x:this.adapter.scrollLeft(),y:this.adapter.scrollTop()},this.waypoints={vertical:{},horizontal:{}},t.waypointContextKey=this.key,o[t.waypointContextKey]=this,i+=1,this.createThrottledScrollHandler(),this.createThrottledResizeHandler()}var i=0,o={},n=window.Waypoint,r=window.onload;e.prototype.add=function(t){var e=t.options.horizontal?"horizontal":"vertical";this.waypoints[e][t.key]=t,this.refresh()},e.prototype.checkEmpty=function(){var t=this.Adapter.isEmptyObject(this.waypoints.horizontal),e=this.Adapter.isEmptyObject(this.waypoints.vertical);t&&e&&(this.adapter.off(".waypoints"),delete o[this.key])},e.prototype.createThrottledResizeHandler=function(){function t(){e.handleResize(),e.didResize=!1}var e=this;this.adapter.on("resize.waypoints",function(){e.didResize||(e.didResize=!0,n.requestAnimationFrame(t))})},e.prototype.createThrottledScrollHandler=function(){function t(){e.handleScroll(),e.didScroll=!1}var e=this;this.adapter.on("scroll.waypoints",function(){(!e.didScroll||n.isTouch)&&(e.didScroll=!0,n.requestAnimationFrame(t))})},e.prototype.handleResize=function(){n.Context.refreshAll()},e.prototype.handleScroll=function(){var t={},e={horizontal:{newScroll:this.adapter.scrollLeft(),oldScroll:this.oldScroll.x,forward:"right",backward:"left"},vertical:{newScroll:this.adapter.scrollTop(),oldScroll:this.oldScroll.y,forward:"down",backward:"up"}};for(var i in e){var o=e[i],n=o.newScroll>o.oldScroll,r=n?o.forward:o.backward;for(var s in this.waypoints[i]){var a=this.waypoints[i][s],l=o.oldScroll<a.triggerPoint,h=o.newScroll>=a.triggerPoint,p=l&&h,u=!l&&!h;(p||u)&&(a.queueTrigger(r),t[a.group.id]=a.group)}}for(var c in t)t[c].flushTriggers();this.oldScroll={x:e.horizontal.newScroll,y:e.vertical.newScroll}},e.prototype.innerHeight=function(){return this.element==this.element.window?n.viewportHeight():this.adapter.innerHeight()},e.prototype.remove=function(t){delete this.waypoints[t.axis][t.key],this.checkEmpty()},e.prototype.innerWidth=function(){return this.element==this.element.window?n.viewportWidth():this.adapter.innerWidth()},e.prototype.destroy=function(){var t=[];for(var e in this.waypoints)for(var i in this.waypoints[e])t.push(this.waypoints[e][i]);for(var o=0,n=t.length;n>o;o++)t[o].destroy()},e.prototype.refresh=function(){var t,e=this.element==this.element.window,i=e?void 0:this.adapter.offset(),o={};this.handleScroll(),t={horizontal:{contextOffset:e?0:i.left,contextScroll:e?0:this.oldScroll.x,contextDimension:this.innerWidth(),oldScroll:this.oldScroll.x,forward:"right",backward:"left",offsetProp:"left"},vertical:{contextOffset:e?0:i.top,contextScroll:e?0:this.oldScroll.y,contextDimension:this.innerHeight(),oldScroll:this.oldScroll.y,forward:"down",backward:"up",offsetProp:"top"}};for(var r in t){var s=t[r];for(var a in this.waypoints[r]){var l,h,p,u,c,d=this.waypoints[r][a],f=d.options.offset,w=d.triggerPoint,y=0,g=null==w;d.element!==d.element.window&&(y=d.adapter.offset()[s.offsetProp]),"function"==typeof f?f=f.apply(d):"string"==typeof f&&(f=parseFloat(f),d.options.offset.indexOf("%")>-1&&(f=Math.ceil(s.contextDimension*f/100))),l=s.contextScroll-s.contextOffset,d.triggerPoint=y+l-f,h=w<s.oldScroll,p=d.triggerPoint>=s.oldScroll,u=h&&p,c=!h&&!p,!g&&u?(d.queueTrigger(s.backward),o[d.group.id]=d.group):!g&&c?(d.queueTrigger(s.forward),o[d.group.id]=d.group):g&&s.oldScroll>=d.triggerPoint&&(d.queueTrigger(s.forward),o[d.group.id]=d.group)}}return n.requestAnimationFrame(function(){for(var t in o)o[t].flushTriggers()}),this},e.findOrCreateByElement=function(t){return e.findByElement(t)||new e(t)},e.refreshAll=function(){for(var t in o)o[t].refresh()},e.findByElement=function(t){return o[t.waypointContextKey]},window.onload=function(){r&&r(),e.refreshAll()},n.requestAnimationFrame=function(e){var i=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||t;i.call(window,e)},n.Context=e}(),function(){"use strict";function t(t,e){return t.triggerPoint-e.triggerPoint}function e(t,e){return e.triggerPoint-t.triggerPoint}function i(t){this.name=t.name,this.axis=t.axis,this.id=this.name+"-"+this.axis,this.waypoints=[],this.clearTriggerQueues(),o[this.axis][this.name]=this}var o={vertical:{},horizontal:{}},n=window.Waypoint;i.prototype.add=function(t){this.waypoints.push(t)},i.prototype.clearTriggerQueues=function(){this.triggerQueues={up:[],down:[],left:[],right:[]}},i.prototype.flushTriggers=function(){for(var i in this.triggerQueues){var o=this.triggerQueues[i],n="up"===i||"left"===i;o.sort(n?e:t);for(var r=0,s=o.length;s>r;r+=1){var a=o[r];(a.options.continuous||r===o.length-1)&&a.trigger([i])}}this.clearTriggerQueues()},i.prototype.next=function(e){this.waypoints.sort(t);var i=n.Adapter.inArray(e,this.waypoints),o=i===this.waypoints.length-1;return o?null:this.waypoints[i+1]},i.prototype.previous=function(e){this.waypoints.sort(t);var i=n.Adapter.inArray(e,this.waypoints);return i?this.waypoints[i-1]:null},i.prototype.queueTrigger=function(t,e){this.triggerQueues[e].push(t)},i.prototype.remove=function(t){var e=n.Adapter.inArray(t,this.waypoints);e>-1&&this.waypoints.splice(e,1)},i.prototype.first=function(){return this.waypoints[0]},i.prototype.last=function(){return this.waypoints[this.waypoints.length-1]},i.findOrCreate=function(t){return o[t.axis][t.name]||new i(t)},n.Group=i}(),function(){"use strict";function t(t){this.$element=e(t)}var e=window.jQuery,i=window.Waypoint;e.each(["innerHeight","innerWidth","off","offset","on","outerHeight","outerWidth","scrollLeft","scrollTop"],function(e,i){t.prototype[i]=function(){var t=Array.prototype.slice.call(arguments);return this.$element[i].apply(this.$element,t)}}),e.each(["extend","inArray","isEmptyObject"],function(i,o){t[o]=e[o]}),i.adapters.push({name:"jquery",Adapter:t}),i.Adapter=t}(),function(){"use strict";function t(t){return function(){var i=[],o=arguments[0];return t.isFunction(arguments[0])&&(o=t.extend({},arguments[1]),o.handler=arguments[0]),this.each(function(){var n=t.extend({},o,{element:this});"string"==typeof n.context&&(n.context=t(this).closest(n.context)[0]),i.push(new e(n))}),i}}var e=window.Waypoint;window.jQuery&&(window.jQuery.fn.waypoint=t(window.jQuery)),window.Zepto&&(window.Zepto.fn.waypoint=t(window.Zepto))}();
+
  
$(document).ready(function() {
+
// Flag to know if list was already fired
  // MagnificPopup
+
fired,
var magnifPopup = function() {
+
 
$('.image-popup').magnificPopup({
+
// Flag to prevent firing
type: 'image',
+
locked,
removalDelay: 300,
+
 
mainClass: 'mfp-with-zoom',
+
// Actual callback list
gallery:{
+
list = [],
enabled:true
+
 
 +
// Queue of execution data for repeatable lists
 +
queue = [],
 +
 
 +
// Index of currently firing callback (modified by add/remove as needed)
 +
firingIndex = -1,
 +
 
 +
// Fire callbacks
 +
fire = function() {
 +
 
 +
// Enforce single-firing
 +
locked = options.once;
 +
 
 +
// Execute callbacks for all pending executions,
 +
// respecting firingIndex overrides and runtime changes
 +
fired = firing = true;
 +
for ( ; queue.length; firingIndex = -1 ) {
 +
memory = queue.shift();
 +
while ( ++firingIndex < list.length ) {
 +
 
 +
// Run callback and check for early termination
 +
if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
 +
options.stopOnFalse ) {
 +
 
 +
// Jump to end and forget the data so .add doesn't re-fire
 +
firingIndex = list.length;
 +
memory = false;
 +
}
 +
}
 +
}
 +
 
 +
// Forget the data if we're done with it
 +
if ( !options.memory ) {
 +
memory = false;
 +
}
 +
 
 +
firing = false;
 +
 
 +
// Clean up if we're done firing for good
 +
if ( locked ) {
 +
 
 +
// Keep an empty list if we have data for future add calls
 +
if ( memory ) {
 +
list = [];
 +
 
 +
// Otherwise, this object is spent
 +
} else {
 +
list = "";
 +
}
 +
}
 +
},
 +
 
 +
// Actual Callbacks object
 +
self = {
 +
 
 +
// Add a callback or a collection of callbacks to the list
 +
add: function() {
 +
if ( list ) {
 +
 
 +
// If we have memory from a past run, we should fire after adding
 +
if ( memory && !firing ) {
 +
firingIndex = list.length - 1;
 +
queue.push( memory );
 +
}
 +
 
 +
( function add( args ) {
 +
jQuery.each( args, function( _, arg ) {
 +
if ( jQuery.isFunction( arg ) ) {
 +
if ( !options.unique || !self.has( arg ) ) {
 +
list.push( arg );
 +
}
 +
} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
 +
 
 +
// Inspect recursively
 +
add( arg );
 +
}
 +
} );
 +
} )( arguments );
 +
 
 +
if ( memory && !firing ) {
 +
fire();
 +
}
 +
}
 +
return this;
 
},
 
},
zoom: {
 
enabled: true, // By default it's false, so don't forget to enable it
 
  
duration: 300, // duration of the effect, in milliseconds
+
// Remove a callback from the list
easing: 'ease-in-out', // CSS transition easing function
+
remove: function() {
 +
jQuery.each( arguments, function( _, arg ) {
 +
var index;
 +
while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
 +
list.splice( index, 1 );
  
// The "opener" function should return the element from which popup will be zoomed in
+
// Handle firing indexes
// and to which popup will be scaled down
+
if ( index <= firingIndex ) {
// By defailt it looks for an image tag:
+
firingIndex--;
opener: function(openerElement) {
+
}
// openerElement is the element on which popup was initialized, in this case its <a> tag
+
}
// you don't need to add "opener" option if this code matches your needs, it's defailt one.
+
} );
return openerElement.is('img') ? openerElement : openerElement.find('img');
+
return this;
 +
},
 +
 
 +
// Check if a given callback is in the list.
 +
// If no argument is given, return whether or not list has callbacks attached.
 +
has: function( fn ) {
 +
return fn ?
 +
jQuery.inArray( fn, list ) > -1 :
 +
list.length > 0;
 +
},
 +
 
 +
// Remove all callbacks from the list
 +
empty: function() {
 +
if ( list ) {
 +
list = [];
 
}
 
}
 +
return this;
 +
},
 +
 +
// Disable .fire and .add
 +
// Abort any current/pending executions
 +
// Clear all callbacks and values
 +
disable: function() {
 +
locked = queue = [];
 +
list = memory = "";
 +
return this;
 +
},
 +
disabled: function() {
 +
return !list;
 +
},
 +
 +
// Disable .fire
 +
// Also disable .add unless we have memory (since it would have no effect)
 +
// Abort any pending executions
 +
lock: function() {
 +
locked = true;
 +
if ( !memory ) {
 +
self.disable();
 +
}
 +
return this;
 +
},
 +
locked: function() {
 +
return !!locked;
 +
},
 +
 +
// Call all callbacks with the given context and arguments
 +
fireWith: function( context, args ) {
 +
if ( !locked ) {
 +
args = args || [];
 +
args = [ context, args.slice ? args.slice() : args ];
 +
queue.push( args );
 +
if ( !firing ) {
 +
fire();
 +
}
 +
}
 +
return this;
 +
},
 +
 +
// Call all the callbacks with the given arguments
 +
fire: function() {
 +
self.fireWith( this, arguments );
 +
return this;
 +
},
 +
 +
// To know if the callbacks have already been called at least once
 +
fired: function() {
 +
return !!fired;
 
}
 
}
});
+
};
 +
 
 +
return self;
 +
};
 +
 
 +
 
 +
jQuery.extend( {
 +
 
 +
Deferred: function( func ) {
 +
var tuples = [
 +
 
 +
// action, add listener, listener list, final state
 +
[ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ],
 +
[ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ],
 +
[ "notify", "progress", jQuery.Callbacks( "memory" ) ]
 +
],
 +
state = "pending",
 +
promise = {
 +
state: function() {
 +
return state;
 +
},
 +
always: function() {
 +
deferred.done( arguments ).fail( arguments );
 +
return this;
 +
},
 +
then: function( /* fnDone, fnFail, fnProgress */ ) {
 +
var fns = arguments;
 +
return jQuery.Deferred( function( newDefer ) {
 +
jQuery.each( tuples, function( i, tuple ) {
 +
var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
 +
 
 +
// deferred[ done | fail | progress ] for forwarding actions to newDefer
 +
deferred[ tuple[ 1 ] ]( function() {
 +
var returned = fn && fn.apply( this, arguments );
 +
if ( returned && jQuery.isFunction( returned.promise ) ) {
 +
returned.promise()
 +
.progress( newDefer.notify )
 +
.done( newDefer.resolve )
 +
.fail( newDefer.reject );
 +
} else {
 +
newDefer[ tuple[ 0 ] + "With" ](
 +
this === promise ? newDefer.promise() : this,
 +
fn ? [ returned ] : arguments
 +
);
 +
}
 +
} );
 +
} );
 +
fns = null;
 +
} ).promise();
 +
},
 +
 
 +
// Get a promise for this deferred
 +
// If obj is provided, the promise aspect is added to the object
 +
promise: function( obj ) {
 +
return obj != null ? jQuery.extend( obj, promise ) : promise;
 +
}
 +
},
 +
deferred = {};
 +
 
 +
// Keep pipe for back-compat
 +
promise.pipe = promise.then;
 +
 
 +
// Add list-specific methods
 +
jQuery.each( tuples, function( i, tuple ) {
 +
var list = tuple[ 2 ],
 +
stateString = tuple[ 3 ];
 +
 
 +
// promise[ done | fail | progress ] = list.add
 +
promise[ tuple[ 1 ] ] = list.add;
 +
 
 +
// Handle state
 +
if ( stateString ) {
 +
list.add( function() {
 +
 
 +
// state = [ resolved | rejected ]
 +
state = stateString;
 +
 
 +
// [ reject_list | resolve_list ].disable; progress_list.lock
 +
}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
 +
}
 +
 
 +
// deferred[ resolve | reject | notify ]
 +
deferred[ tuple[ 0 ] ] = function() {
 +
deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments );
 +
return this;
 +
};
 +
deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
 +
} );
 +
 
 +
// Make the deferred a promise
 +
promise.promise( deferred );
 +
 
 +
// Call given func if any
 +
if ( func ) {
 +
func.call( deferred, deferred );
 +
}
 +
 
 +
// All done!
 +
return deferred;
 +
},
 +
 
 +
// Deferred helper
 +
when: function( subordinate /* , ..., subordinateN */ ) {
 +
var i = 0,
 +
resolveValues = slice.call( arguments ),
 +
length = resolveValues.length,
 +
 
 +
// the count of uncompleted subordinates
 +
remaining = length !== 1 ||
 +
( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
 +
 
 +
// the master Deferred.
 +
// If resolveValues consist of only a single Deferred, just use that.
 +
deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
 +
 
 +
// Update function for both resolve and progress values
 +
updateFunc = function( i, contexts, values ) {
 +
return function( value ) {
 +
contexts[ i ] = this;
 +
values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
 +
if ( values === progressValues ) {
 +
deferred.notifyWith( contexts, values );
 +
 
 +
} else if ( !( --remaining ) ) {
 +
deferred.resolveWith( contexts, values );
 +
}
 +
};
 +
},
 +
 
 +
progressValues, progressContexts, resolveContexts;
 +
 
 +
// add listeners to Deferred subordinates; treat others as resolved
 +
if ( length > 1 ) {
 +
progressValues = new Array( length );
 +
progressContexts = new Array( length );
 +
resolveContexts = new Array( length );
 +
for ( ; i < length; i++ ) {
 +
if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
 +
resolveValues[ i ].promise()
 +
.progress( updateFunc( i, progressContexts, progressValues ) )
 +
.done( updateFunc( i, resolveContexts, resolveValues ) )
 +
.fail( deferred.reject );
 +
} else {
 +
--remaining;
 +
}
 +
}
 +
}
 +
 
 +
// if we're not waiting on anything, resolve the master
 +
if ( !remaining ) {
 +
deferred.resolveWith( resolveContexts, resolveValues );
 +
}
 +
 
 +
return deferred.promise();
 +
}
 +
} );
 +
 
 +
 
 +
// The deferred used on DOM ready
 +
var readyList;
 +
 
 +
jQuery.fn.ready = function( fn ) {
 +
 
 +
// Add the callback
 +
jQuery.ready.promise().done( fn );
 +
 
 +
return this;
 +
};
 +
 
 +
jQuery.extend( {
 +
 
 +
// Is the DOM ready to be used? Set to true once it occurs.
 +
isReady: false,
 +
 
 +
// A counter to track how many items to wait for before
 +
// the ready event fires. See #6781
 +
readyWait: 1,
 +
 
 +
// Hold (or release) the ready event
 +
holdReady: function( hold ) {
 +
if ( hold ) {
 +
jQuery.readyWait++;
 +
} else {
 +
jQuery.ready( true );
 +
}
 +
},
 +
 
 +
// Handle when the DOM is ready
 +
ready: function( wait ) {
 +
 
 +
// Abort if there are pending holds or we're already ready
 +
if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
 +
return;
 +
}
 +
 
 +
// Remember that the DOM is ready
 +
jQuery.isReady = true;
 +
 
 +
// If a normal DOM Ready event fired, decrement, and wait if need be
 +
if ( wait !== true && --jQuery.readyWait > 0 ) {
 +
return;
 +
}
 +
 
 +
// If there are functions bound, to execute
 +
readyList.resolveWith( document, [ jQuery ] );
 +
 
 +
// Trigger any bound ready events
 +
if ( jQuery.fn.triggerHandler ) {
 +
jQuery( document ).triggerHandler( "ready" );
 +
jQuery( document ).off( "ready" );
 +
}
 +
}
 +
} );
 +
 
 +
/**
 +
* Clean-up method for dom ready events
 +
*/
 +
function detach() {
 +
if ( document.addEventListener ) {
 +
document.removeEventListener( "DOMContentLoaded", completed );
 +
window.removeEventListener( "load", completed );
 +
 
 +
} else {
 +
document.detachEvent( "onreadystatechange", completed );
 +
window.detachEvent( "onload", completed );
 +
}
 +
}
 +
 
 +
/**
 +
* The ready event handler and self cleanup method
 +
*/
 +
function completed() {
 +
 
 +
// readyState === "complete" is good enough for us to call the dom ready in oldIE
 +
if ( document.addEventListener ||
 +
window.event.type === "load" ||
 +
document.readyState === "complete" ) {
 +
 
 +
detach();
 +
jQuery.ready();
 +
}
 +
}
 +
 
 +
jQuery.ready.promise = function( obj ) {
 +
if ( !readyList ) {
 +
 
 +
readyList = jQuery.Deferred();
 +
 
 +
// Catch cases where $(document).ready() is called
 +
// after the browser event has already occurred.
 +
// Support: IE6-10
 +
// Older IE sometimes signals "interactive" too soon
 +
if ( document.readyState === "complete" ||
 +
( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
 +
 
 +
// Handle it asynchronously to allow scripts the opportunity to delay ready
 +
window.setTimeout( jQuery.ready );
 +
 
 +
// Standards-based browsers support DOMContentLoaded
 +
} else if ( document.addEventListener ) {
 +
 
 +
// Use the handy event callback
 +
document.addEventListener( "DOMContentLoaded", completed );
 +
 
 +
// A fallback to window.onload, that will always work
 +
window.addEventListener( "load", completed );
 +
 
 +
// If IE event model is used
 +
} else {
 +
 
 +
// Ensure firing before onload, maybe late but safe also for iframes
 +
document.attachEvent( "onreadystatechange", completed );
 +
 
 +
// A fallback to window.onload, that will always work
 +
window.attachEvent( "onload", completed );
 +
 
 +
// If IE and not a frame
 +
// continually check to see if the document is ready
 +
var top = false;
 +
 
 +
try {
 +
top = window.frameElement == null && document.documentElement;
 +
} catch ( e ) {}
 +
 
 +
if ( top && top.doScroll ) {
 +
( function doScrollCheck() {
 +
if ( !jQuery.isReady ) {
 +
 
 +
try {
 +
 
 +
// Use the trick by Diego Perini
 +
// http://javascript.nwbox.com/IEContentLoaded/
 +
top.doScroll( "left" );
 +
} catch ( e ) {
 +
return window.setTimeout( doScrollCheck, 50 );
 +
}
 +
 
 +
// detach all dom ready events
 +
detach();
 +
 
 +
// and execute any waiting functions
 +
jQuery.ready();
 +
}
 +
} )();
 +
}
 +
}
 +
}
 +
return readyList.promise( obj );
 +
};
 +
 
 +
// Kick off the DOM ready check even if the user does not
 +
jQuery.ready.promise();
 +
 
 +
 
 +
 
 +
 
 +
// Support: IE<9
 +
// Iteration over object's inherited properties before its own
 +
var i;
 +
for ( i in jQuery( support ) ) {
 +
break;
 +
}
 +
support.ownFirst = i === "0";
 +
 
 +
// Note: most support tests are defined in their respective modules.
 +
// false until the test is run
 +
support.inlineBlockNeedsLayout = false;
 +
 
 +
// Execute ASAP in case we need to set body.style.zoom
 +
jQuery( function() {
 +
 
 +
// Minified: var a,b,c,d
 +
var val, div, body, container;
 +
 
 +
body = document.getElementsByTagName( "body" )[ 0 ];
 +
if ( !body || !body.style ) {
 +
 
 +
// Return for frameset docs that don't have a body
 +
return;
 +
}
 +
 
 +
// Setup
 +
div = document.createElement( "div" );
 +
container = document.createElement( "div" );
 +
container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
 +
body.appendChild( container ).appendChild( div );
 +
 
 +
if ( typeof div.style.zoom !== "undefined" ) {
 +
 
 +
// Support: IE<8
 +
// Check if natively block-level elements act like inline-block
 +
// elements when setting their display to 'inline' and giving
 +
// them layout
 +
div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";
 +
 
 +
support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
 +
if ( val ) {
 +
 
 +
// Prevent IE 6 from affecting layout for positioned elements #11048
 +
// Prevent IE from shrinking the body in IE 7 mode #12869
 +
// Support: IE<8
 +
body.style.zoom = 1;
 +
}
 +
}
 +
 
 +
body.removeChild( container );
 +
} );
 +
 
 +
 
 +
( function() {
 +
var div = document.createElement( "div" );
 +
 
 +
// Support: IE<9
 +
support.deleteExpando = true;
 +
try {
 +
delete div.test;
 +
} catch ( e ) {
 +
support.deleteExpando = false;
 +
}
 +
 
 +
// Null elements to avoid leaks in IE.
 +
div = null;
 +
} )();
 +
var acceptData = function( elem ) {
 +
var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ],
 +
nodeType = +elem.nodeType || 1;
 +
 
 +
// Do not set data on non-element DOM nodes because it will not be cleared (#8335).
 +
return nodeType !== 1 && nodeType !== 9 ?
 +
false :
 +
 
 +
// Nodes accept data unless otherwise specified; rejection can be conditional
 +
!noData || noData !== true && elem.getAttribute( "classid" ) === noData;
 +
};
 +
 
 +
 
 +
 
 +
 
 +
var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
 +
rmultiDash = /([A-Z])/g;
 +
 
 +
function dataAttr( elem, key, data ) {
 +
 
 +
// If nothing was found internally, try to fetch any
 +
// data from the HTML5 data-* attribute
 +
if ( data === undefined && elem.nodeType === 1 ) {
 +
 
 +
var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
 +
 
 +
data = elem.getAttribute( name );
 +
 
 +
if ( typeof data === "string" ) {
 +
try {
 +
data = data === "true" ? true :
 +
data === "false" ? false :
 +
data === "null" ? null :
 +
 
 +
// Only convert to a number if it doesn't change the string
 +
+data + "" === data ? +data :
 +
rbrace.test( data ) ? jQuery.parseJSON( data ) :
 +
data;
 +
} catch ( e ) {}
 +
 
 +
// Make sure we set the data so it isn't changed later
 +
jQuery.data( elem, key, data );
 +
 
 +
} else {
 +
data = undefined;
 +
}
 +
}
 +
 
 +
return data;
 +
}
 +
 
 +
// checks a cache object for emptiness
 +
function isEmptyDataObject( obj ) {
 +
var name;
 +
for ( name in obj ) {
 +
 
 +
// if the public data object is empty, the private is still empty
 +
if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) {
 +
continue;
 +
}
 +
if ( name !== "toJSON" ) {
 +
return false;
 +
}
 +
}
 +
 
 +
return true;
 +
}
 +
 
 +
function internalData( elem, name, data, pvt /* Internal Use Only */ ) {
 +
if ( !acceptData( elem ) ) {
 +
return;
 +
}
 +
 
 +
var ret, thisCache,
 +
internalKey = jQuery.expando,
 +
 
 +
// We have to handle DOM nodes and JS objects differently because IE6-7
 +
// can't GC object references properly across the DOM-JS boundary
 +
isNode = elem.nodeType,
 +
 
 +
// Only DOM nodes need the global jQuery cache; JS object data is
 +
// attached directly to the object so GC can occur automatically
 +
cache = isNode ? jQuery.cache : elem,
 +
 
 +
// Only defining an ID for JS objects if its cache already exists allows
 +
// the code to shortcut on the same path as a DOM node with no cache
 +
id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
 +
 
 +
// Avoid doing any more work than we need to when trying to get data on an
 +
// object that has no data at all
 +
if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) &&
 +
data === undefined && typeof name === "string" ) {
 +
return;
 +
}
 +
 
 +
if ( !id ) {
 +
 
 +
// Only DOM nodes need a new unique ID for each element since their data
 +
// ends up in the global cache
 +
if ( isNode ) {
 +
id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;
 +
} else {
 +
id = internalKey;
 +
}
 +
}
 +
 
 +
if ( !cache[ id ] ) {
 +
 
 +
// Avoid exposing jQuery metadata on plain JS objects when the object
 +
// is serialized using JSON.stringify
 +
cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
 +
}
 +
 
 +
// An object can be passed to jQuery.data instead of a key/value pair; this gets
 +
// shallow copied over onto the existing cache
 +
if ( typeof name === "object" || typeof name === "function" ) {
 +
if ( pvt ) {
 +
cache[ id ] = jQuery.extend( cache[ id ], name );
 +
} else {
 +
cache[ id ].data = jQuery.extend( cache[ id ].data, name );
 +
}
 +
}
 +
 
 +
thisCache = cache[ id ];
 +
 
 +
// jQuery data() is stored in a separate object inside the object's internal data
 +
// cache in order to avoid key collisions between internal data and user-defined
 +
// data.
 +
if ( !pvt ) {
 +
if ( !thisCache.data ) {
 +
thisCache.data = {};
 +
}
 +
 
 +
thisCache = thisCache.data;
 +
}
 +
 
 +
if ( data !== undefined ) {
 +
thisCache[ jQuery.camelCase( name ) ] = data;
 +
}
 +
 
 +
// Check for both converted-to-camel and non-converted data property names
 +
// If a data property was specified
 +
if ( typeof name === "string" ) {
 +
 
 +
// First Try to find as-is property data
 +
ret = thisCache[ name ];
 +
 
 +
// Test for null|undefined property data
 +
if ( ret == null ) {
 +
 
 +
// Try to find the camelCased property
 +
ret = thisCache[ jQuery.camelCase( name ) ];
 +
}
 +
} else {
 +
ret = thisCache;
 +
}
 +
 
 +
return ret;
 +
}
 +
 
 +
function internalRemoveData( elem, name, pvt ) {
 +
if ( !acceptData( elem ) ) {
 +
return;
 +
}
 +
 
 +
var thisCache, i,
 +
isNode = elem.nodeType,
 +
 
 +
// See jQuery.data for more information
 +
cache = isNode ? jQuery.cache : elem,
 +
id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
 +
 
 +
// If there is already no cache entry for this object, there is no
 +
// purpose in continuing
 +
if ( !cache[ id ] ) {
 +
return;
 +
}
 +
 
 +
if ( name ) {
 +
 
 +
thisCache = pvt ? cache[ id ] : cache[ id ].data;
 +
 
 +
if ( thisCache ) {
 +
 
 +
// Support array or space separated string names for data keys
 +
if ( !jQuery.isArray( name ) ) {
 +
 
 +
// try the string as a key before any manipulation
 +
if ( name in thisCache ) {
 +
name = [ name ];
 +
} else {
 +
 
 +
// split the camel cased version by spaces unless a key with the spaces exists
 +
name = jQuery.camelCase( name );
 +
if ( name in thisCache ) {
 +
name = [ name ];
 +
} else {
 +
name = name.split( " " );
 +
}
 +
}
 +
} else {
 +
 
 +
// If "name" is an array of keys...
 +
// When data is initially created, via ("key", "val") signature,
 +
// keys will be converted to camelCase.
 +
// Since there is no way to tell _how_ a key was added, remove
 +
// both plain key and camelCase key. #12786
 +
// This will only penalize the array argument path.
 +
name = name.concat( jQuery.map( name, jQuery.camelCase ) );
 +
}
 +
 
 +
i = name.length;
 +
while ( i-- ) {
 +
delete thisCache[ name[ i ] ];
 +
}
 +
 
 +
// If there is no data left in the cache, we want to continue
 +
// and let the cache object itself get destroyed
 +
if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) {
 +
return;
 +
}
 +
}
 +
}
 +
 
 +
// See jQuery.data for more information
 +
if ( !pvt ) {
 +
delete cache[ id ].data;
 +
 
 +
// Don't destroy the parent cache unless the internal data object
 +
// had been the only thing left in it
 +
if ( !isEmptyDataObject( cache[ id ] ) ) {
 +
return;
 +
}
 +
}
 +
 
 +
// Destroy the cache
 +
if ( isNode ) {
 +
jQuery.cleanData( [ elem ], true );
 +
 
 +
// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
 +
/* jshint eqeqeq: false */
 +
} else if ( support.deleteExpando || cache != cache.window ) {
 +
/* jshint eqeqeq: true */
 +
delete cache[ id ];
 +
 
 +
// When all else fails, undefined
 +
} else {
 +
cache[ id ] = undefined;
 +
}
 +
}
 +
 
 +
jQuery.extend( {
 +
cache: {},
 +
 
 +
// The following elements (space-suffixed to avoid Object.prototype collisions)
 +
// throw uncatchable exceptions if you attempt to set expando properties
 +
noData: {
 +
"applet ": true,
 +
"embed ": true,
 +
 
 +
// ...but Flash objects (which have this classid) *can* handle expandos
 +
"object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
 +
},
 +
 
 +
hasData: function( elem ) {
 +
elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ];
 +
return !!elem && !isEmptyDataObject( elem );
 +
},
 +
 
 +
data: function( elem, name, data ) {
 +
return internalData( elem, name, data );
 +
},
 +
 
 +
removeData: function( elem, name ) {
 +
return internalRemoveData( elem, name );
 +
},
 +
 
 +
// For internal use only.
 +
_data: function( elem, name, data ) {
 +
return internalData( elem, name, data, true );
 +
},
 +
 
 +
_removeData: function( elem, name ) {
 +
return internalRemoveData( elem, name, true );
 +
}
 +
} );
 +
 
 +
jQuery.fn.extend( {
 +
data: function( key, value ) {
 +
var i, name, data,
 +
elem = this[ 0 ],
 +
attrs = elem && elem.attributes;
 +
 
 +
// Special expections of .data basically thwart jQuery.access,
 +
// so implement the relevant behavior ourselves
 +
 
 +
// Gets all values
 +
if ( key === undefined ) {
 +
if ( this.length ) {
 +
data = jQuery.data( elem );
 +
 
 +
if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
 +
i = attrs.length;
 +
while ( i-- ) {
 +
 
 +
// Support: IE11+
 +
// The attrs elements can be null (#14894)
 +
if ( attrs[ i ] ) {
 +
name = attrs[ i ].name;
 +
if ( name.indexOf( "data-" ) === 0 ) {
 +
name = jQuery.camelCase( name.slice( 5 ) );
 +
dataAttr( elem, name, data[ name ] );
 +
}
 +
}
 +
}
 +
jQuery._data( elem, "parsedAttrs", true );
 +
}
 +
}
 +
 
 +
return data;
 +
}
 +
 
 +
// Sets multiple values
 +
if ( typeof key === "object" ) {
 +
return this.each( function() {
 +
jQuery.data( this, key );
 +
} );
 +
}
 +
 
 +
return arguments.length > 1 ?
 +
 
 +
// Sets one value
 +
this.each( function() {
 +
jQuery.data( this, key, value );
 +
} ) :
 +
 
 +
// Gets one value
 +
// Try to fetch any internally stored data first
 +
elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;
 +
},
 +
 
 +
removeData: function( key ) {
 +
return this.each( function() {
 +
jQuery.removeData( this, key );
 +
} );
 +
}
 +
} );
 +
 
 +
 
 +
jQuery.extend( {
 +
queue: function( elem, type, data ) {
 +
var queue;
 +
 
 +
if ( elem ) {
 +
type = ( type || "fx" ) + "queue";
 +
queue = jQuery._data( elem, type );
 +
 
 +
// Speed up dequeue by getting out quickly if this is just a lookup
 +
if ( data ) {
 +
if ( !queue || jQuery.isArray( data ) ) {
 +
queue = jQuery._data( elem, type, jQuery.makeArray( data ) );
 +
} else {
 +
queue.push( data );
 +
}
 +
}
 +
return queue || [];
 +
}
 +
},
 +
 
 +
dequeue: function( elem, type ) {
 +
type = type || "fx";
 +
 
 +
var queue = jQuery.queue( elem, type ),
 +
startLength = queue.length,
 +
fn = queue.shift(),
 +
hooks = jQuery._queueHooks( elem, type ),
 +
next = function() {
 +
jQuery.dequeue( elem, type );
 +
};
 +
 
 +
// If the fx queue is dequeued, always remove the progress sentinel
 +
if ( fn === "inprogress" ) {
 +
fn = queue.shift();
 +
startLength--;
 +
}
 +
 
 +
if ( fn ) {
 +
 
 +
// Add a progress sentinel to prevent the fx queue from being
 +
// automatically dequeued
 +
if ( type === "fx" ) {
 +
queue.unshift( "inprogress" );
 +
}
 +
 
 +
// clear up the last queue stop function
 +
delete hooks.stop;
 +
fn.call( elem, next, hooks );
 +
}
 +
 
 +
if ( !startLength && hooks ) {
 +
hooks.empty.fire();
 +
}
 +
},
 +
 
 +
// not intended for public consumption - generates a queueHooks object,
 +
// or returns the current one
 +
_queueHooks: function( elem, type ) {
 +
var key = type + "queueHooks";
 +
return jQuery._data( elem, key ) || jQuery._data( elem, key, {
 +
empty: jQuery.Callbacks( "once memory" ).add( function() {
 +
jQuery._removeData( elem, type + "queue" );
 +
jQuery._removeData( elem, key );
 +
} )
 +
} );
 +
}
 +
} );
 +
 
 +
jQuery.fn.extend( {
 +
queue: function( type, data ) {
 +
var setter = 2;
 +
 
 +
if ( typeof type !== "string" ) {
 +
data = type;
 +
type = "fx";
 +
setter--;
 +
}
 +
 
 +
if ( arguments.length < setter ) {
 +
return jQuery.queue( this[ 0 ], type );
 +
}
 +
 
 +
return data === undefined ?
 +
this :
 +
this.each( function() {
 +
var queue = jQuery.queue( this, type, data );
 +
 
 +
// ensure a hooks for this queue
 +
jQuery._queueHooks( this, type );
 +
 
 +
if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
 +
jQuery.dequeue( this, type );
 +
}
 +
} );
 +
},
 +
dequeue: function( type ) {
 +
return this.each( function() {
 +
jQuery.dequeue( this, type );
 +
} );
 +
},
 +
clearQueue: function( type ) {
 +
return this.queue( type || "fx", [] );
 +
},
 +
 
 +
// Get a promise resolved when queues of a certain type
 +
// are emptied (fx is the type by default)
 +
promise: function( type, obj ) {
 +
var tmp,
 +
count = 1,
 +
defer = jQuery.Deferred(),
 +
elements = this,
 +
i = this.length,
 +
resolve = function() {
 +
if ( !( --count ) ) {
 +
defer.resolveWith( elements, [ elements ] );
 +
}
 +
};
 +
 
 +
if ( typeof type !== "string" ) {
 +
obj = type;
 +
type = undefined;
 +
}
 +
type = type || "fx";
 +
 
 +
while ( i-- ) {
 +
tmp = jQuery._data( elements[ i ], type + "queueHooks" );
 +
if ( tmp && tmp.empty ) {
 +
count++;
 +
tmp.empty.add( resolve );
 +
}
 +
}
 +
resolve();
 +
return defer.promise( obj );
 +
}
 +
} );
 +
 
 +
 
 +
( function() {
 +
var shrinkWrapBlocksVal;
 +
 
 +
support.shrinkWrapBlocks = function() {
 +
if ( shrinkWrapBlocksVal != null ) {
 +
return shrinkWrapBlocksVal;
 +
}
 +
 
 +
// Will be changed later if needed.
 +
shrinkWrapBlocksVal = false;
 +
 
 +
// Minified: var b,c,d
 +
var div, body, container;
 +
 
 +
body = document.getElementsByTagName( "body" )[ 0 ];
 +
if ( !body || !body.style ) {
 +
 
 +
// Test fired too early or in an unsupported environment, exit.
 +
return;
 +
}
 +
 
 +
// Setup
 +
div = document.createElement( "div" );
 +
container = document.createElement( "div" );
 +
container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
 +
body.appendChild( container ).appendChild( div );
 +
 
 +
// Support: IE6
 +
// Check if elements with layout shrink-wrap their children
 +
if ( typeof div.style.zoom !== "undefined" ) {
 +
 
 +
// Reset CSS: box-sizing; display; margin; border
 +
div.style.cssText =
 +
 
 +
// Support: Firefox<29, Android 2.3
 +
// Vendor-prefix box-sizing
 +
"-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";
 +
div.appendChild( document.createElement( "div" ) ).style.width = "5px";
 +
shrinkWrapBlocksVal = div.offsetWidth !== 3;
 +
}
 +
 
 +
body.removeChild( container );
 +
 
 +
return shrinkWrapBlocksVal;
 
};
 
};
  
var magnifVideo = function() {
+
} )();
$('.popup-youtube, .popup-vimeo, .popup-gmaps').magnificPopup({
+
var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
        disableOn: 700,
+
        type: 'iframe',
+
        mainClass: 'mfp-fade',
+
        removalDelay: 160,
+
        preloader: false,
+
  
        fixedContentPos: false
+
var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
    });
+
 
 +
 
 +
var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
 +
 
 +
var isHidden = function( elem, el ) {
 +
 
 +
// isHidden might be called from jQuery#filter function;
 +
// in that case, element will be second argument
 +
elem = el || elem;
 +
return jQuery.css( elem, "display" ) === "none" ||
 +
!jQuery.contains( elem.ownerDocument, elem );
 
};
 
};
  
 
  
  
// Call the functions
+
function adjustCSS( elem, prop, valueParts, tween ) {
magnifPopup();
+
var adjusted,
magnifVideo();
+
scale = 1,
 +
maxIterations = 20,
 +
currentValue = tween ?
 +
function() { return tween.cur(); } :
 +
function() { return jQuery.css( elem, prop, "" ); },
 +
initial = currentValue(),
 +
unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
  
});
+
// Starting value computation is required for potential unit mismatches
 +
initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
 +
rcssNum.exec( jQuery.css( elem, prop ) );
  
;(function () {
+
if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
'use strict';
+
  
var mobileMenuOutsideClick = function() {
+
// Trust units reported by jQuery.css
 +
unit = unit || initialInUnit[ 3 ];
  
$(document).click(function (e) {
+
// Make sure we update the tween properties later on
    var container = $("#gtco-offcanvas, .js-gtco-nav-toggle");
+
valueParts = valueParts || [];
    if (!container.is(e.target) && container.has(e.target).length === 0) {
+
    $('.js-gtco-nav-toggle').addClass('gtco-nav-white');
+
  
    if ( $('body').hasClass('offcanvas') ) {
+
// Iteratively approximate from a nonzero starting point
 +
initialInUnit = +initial || 1;
  
    $('body').removeClass('offcanvas');
+
do {
    $('.js-gtco-nav-toggle').removeClass('active');
+
+
    }
+
   
+
   
+
    }
+
});
+
  
 +
// If previous iteration zeroed out, double until we get *something*.
 +
// Use string for doubling so we don't accidentally see scale as unchanged below
 +
scale = scale || ".5";
 +
 +
// Adjust and apply
 +
initialInUnit = initialInUnit / scale;
 +
jQuery.style( elem, prop, initialInUnit + unit );
 +
 +
// Update scale, tolerating zero or NaN from tween.cur()
 +
// Break the loop if scale is unchanged or perfect, or if we've just had enough.
 +
} while (
 +
scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
 +
);
 +
}
 +
 +
if ( valueParts ) {
 +
initialInUnit = +initialInUnit || +initial || 0;
 +
 +
// Apply relative offset (+=/-=) if specified
 +
adjusted = valueParts[ 1 ] ?
 +
initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
 +
+valueParts[ 2 ];
 +
if ( tween ) {
 +
tween.unit = unit;
 +
tween.start = initialInUnit;
 +
tween.end = adjusted;
 +
}
 +
}
 +
return adjusted;
 +
}
 +
 +
 +
// Multifunctional method to get and set values of a collection
 +
// The value/s can optionally be executed if it's a function
 +
var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
 +
var i = 0,
 +
length = elems.length,
 +
bulk = key == null;
 +
 +
// Sets many values
 +
if ( jQuery.type( key ) === "object" ) {
 +
chainable = true;
 +
for ( i in key ) {
 +
access( elems, fn, i, key[ i ], true, emptyGet, raw );
 +
}
 +
 +
// Sets one value
 +
} else if ( value !== undefined ) {
 +
chainable = true;
 +
 +
if ( !jQuery.isFunction( value ) ) {
 +
raw = true;
 +
}
 +
 +
if ( bulk ) {
 +
 +
// Bulk operations run against the entire set
 +
if ( raw ) {
 +
fn.call( elems, value );
 +
fn = null;
 +
 +
// ...except when executing function values
 +
} else {
 +
bulk = fn;
 +
fn = function( elem, key, value ) {
 +
return bulk.call( jQuery( elem ), value );
 +
};
 +
}
 +
}
 +
 +
if ( fn ) {
 +
for ( ; i < length; i++ ) {
 +
fn(
 +
elems[ i ],
 +
key,
 +
raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) )
 +
);
 +
}
 +
}
 +
}
 +
 +
return chainable ?
 +
elems :
 +
 +
// Gets
 +
bulk ?
 +
fn.call( elems ) :
 +
length ? fn( elems[ 0 ], key ) : emptyGet;
 +
};
 +
var rcheckableType = ( /^(?:checkbox|radio)$/i );
 +
 +
var rtagName = ( /<([\w:-]+)/ );
 +
 +
var rscriptType = ( /^$|\/(?:java|ecma)script/i );
 +
 +
var rleadingWhitespace = ( /^\s+/ );
 +
 +
var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" +
 +
"details|dialog|figcaption|figure|footer|header|hgroup|main|" +
 +
"mark|meter|nav|output|picture|progress|section|summary|template|time|video";
 +
 +
 +
 +
function createSafeFragment( document ) {
 +
var list = nodeNames.split( "|" ),
 +
safeFrag = document.createDocumentFragment();
 +
 +
if ( safeFrag.createElement ) {
 +
while ( list.length ) {
 +
safeFrag.createElement(
 +
list.pop()
 +
);
 +
}
 +
}
 +
return safeFrag;
 +
}
 +
 +
 +
( function() {
 +
var div = document.createElement( "div" ),
 +
fragment = document.createDocumentFragment(),
 +
input = document.createElement( "input" );
 +
 +
// Setup
 +
div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
 +
 +
// IE strips leading whitespace when .innerHTML is used
 +
support.leadingWhitespace = div.firstChild.nodeType === 3;
 +
 +
// Make sure that tbody elements aren't automatically inserted
 +
// IE will insert them into empty tables
 +
support.tbody = !div.getElementsByTagName( "tbody" ).length;
 +
 +
// Make sure that link elements get serialized correctly by innerHTML
 +
// This requires a wrapper element in IE
 +
support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;
 +
 +
// Makes sure cloning an html5 element does not cause problems
 +
// Where outerHTML is undefined, this still works
 +
support.html5Clone =
 +
document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>";
 +
 +
// Check if a disconnected checkbox will retain its checked
 +
// value of true after appended to the DOM (IE6/7)
 +
input.type = "checkbox";
 +
input.checked = true;
 +
fragment.appendChild( input );
 +
support.appendChecked = input.checked;
 +
 +
// Make sure textarea (and checkbox) defaultValue is properly cloned
 +
// Support: IE6-IE11+
 +
div.innerHTML = "<textarea>x</textarea>";
 +
support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
 +
 +
// #11217 - WebKit loses check when the name is after the checked attribute
 +
fragment.appendChild( div );
 +
 +
// Support: Windows Web Apps (WWA)
 +
// `name` and `type` must use .setAttribute for WWA (#14901)
 +
input = document.createElement( "input" );
 +
input.setAttribute( "type", "radio" );
 +
input.setAttribute( "checked", "checked" );
 +
input.setAttribute( "name", "t" );
 +
 +
div.appendChild( input );
 +
 +
// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
 +
// old WebKit doesn't clone checked state correctly in fragments
 +
support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
 +
 +
// Support: IE<9
 +
// Cloned elements keep attachEvent handlers, we use addEventListener on IE9+
 +
support.noCloneEvent = !!div.addEventListener;
 +
 +
// Support: IE<9
 +
// Since attributes and properties are the same in IE,
 +
// cleanData must set properties to undefined rather than use removeAttribute
 +
div[ jQuery.expando ] = 1;
 +
support.attributes = !div.getAttribute( jQuery.expando );
 +
} )();
 +
 +
 +
// We have to close these tags to support XHTML (#13200)
 +
var wrapMap = {
 +
option: [ 1, "<select multiple='multiple'>", "</select>" ],
 +
legend: [ 1, "<fieldset>", "</fieldset>" ],
 +
area: [ 1, "<map>", "</map>" ],
 +
 +
// Support: IE8
 +
param: [ 1, "<object>", "</object>" ],
 +
thead: [ 1, "<table>", "</table>" ],
 +
tr: [ 2, "<table><tbody>", "</tbody></table>" ],
 +
col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
 +
td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
 +
 +
// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
 +
// unless wrapped in a div with non-breaking characters in front of it.
 +
_default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ]
 +
};
 +
 +
// Support: IE8-IE9
 +
wrapMap.optgroup = wrapMap.option;
 +
 +
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
 +
wrapMap.th = wrapMap.td;
 +
 +
 +
function getAll( context, tag ) {
 +
var elems, elem,
 +
i = 0,
 +
found = typeof context.getElementsByTagName !== "undefined" ?
 +
context.getElementsByTagName( tag || "*" ) :
 +
typeof context.querySelectorAll !== "undefined" ?
 +
context.querySelectorAll( tag || "*" ) :
 +
undefined;
 +
 +
if ( !found ) {
 +
for ( found = [], elems = context.childNodes || context;
 +
( elem = elems[ i ] ) != null;
 +
i++
 +
) {
 +
if ( !tag || jQuery.nodeName( elem, tag ) ) {
 +
found.push( elem );
 +
} else {
 +
jQuery.merge( found, getAll( elem, tag ) );
 +
}
 +
}
 +
}
 +
 +
return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
 +
jQuery.merge( [ context ], found ) :
 +
found;
 +
}
 +
 +
 +
// Mark scripts as having already been evaluated
 +
function setGlobalEval( elems, refElements ) {
 +
var elem,
 +
i = 0;
 +
for ( ; ( elem = elems[ i ] ) != null; i++ ) {
 +
jQuery._data(
 +
elem,
 +
"globalEval",
 +
!refElements || jQuery._data( refElements[ i ], "globalEval" )
 +
);
 +
}
 +
}
 +
 +
 +
var rhtml = /<|&#?\w+;/,
 +
rtbody = /<tbody/i;
 +
 +
function fixDefaultChecked( elem ) {
 +
if ( rcheckableType.test( elem.type ) ) {
 +
elem.defaultChecked = elem.checked;
 +
}
 +
}
 +
 +
function buildFragment( elems, context, scripts, selection, ignored ) {
 +
var j, elem, contains,
 +
tmp, tag, tbody, wrap,
 +
l = elems.length,
 +
 +
// Ensure a safe fragment
 +
safe = createSafeFragment( context ),
 +
 +
nodes = [],
 +
i = 0;
 +
 +
for ( ; i < l; i++ ) {
 +
elem = elems[ i ];
 +
 +
if ( elem || elem === 0 ) {
 +
 +
// Add nodes directly
 +
if ( jQuery.type( elem ) === "object" ) {
 +
jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
 +
 +
// Convert non-html into a text node
 +
} else if ( !rhtml.test( elem ) ) {
 +
nodes.push( context.createTextNode( elem ) );
 +
 +
// Convert html into DOM nodes
 +
} else {
 +
tmp = tmp || safe.appendChild( context.createElement( "div" ) );
 +
 +
// Deserialize a standard representation
 +
tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
 +
wrap = wrapMap[ tag ] || wrapMap._default;
 +
 +
tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
 +
 +
// Descend through wrappers to the right content
 +
j = wrap[ 0 ];
 +
while ( j-- ) {
 +
tmp = tmp.lastChild;
 +
}
 +
 +
// Manually add leading whitespace removed by IE
 +
if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
 +
nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[ 0 ] ) );
 +
}
 +
 +
// Remove IE's autoinserted <tbody> from table fragments
 +
if ( !support.tbody ) {
 +
 +
// String was a <table>, *may* have spurious <tbody>
 +
elem = tag === "table" && !rtbody.test( elem ) ?
 +
tmp.firstChild :
 +
 +
// String was a bare <thead> or <tfoot>
 +
wrap[ 1 ] === "<table>" && !rtbody.test( elem ) ?
 +
tmp :
 +
0;
 +
 +
j = elem && elem.childNodes.length;
 +
while ( j-- ) {
 +
if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) &&
 +
!tbody.childNodes.length ) {
 +
 +
elem.removeChild( tbody );
 +
}
 +
}
 +
}
 +
 +
jQuery.merge( nodes, tmp.childNodes );
 +
 +
// Fix #12392 for WebKit and IE > 9
 +
tmp.textContent = "";
 +
 +
// Fix #12392 for oldIE
 +
while ( tmp.firstChild ) {
 +
tmp.removeChild( tmp.firstChild );
 +
}
 +
 +
// Remember the top-level container for proper cleanup
 +
tmp = safe.lastChild;
 +
}
 +
}
 +
}
 +
 +
// Fix #11356: Clear elements from fragment
 +
if ( tmp ) {
 +
safe.removeChild( tmp );
 +
}
 +
 +
// Reset defaultChecked for any radios and checkboxes
 +
// about to be appended to the DOM in IE 6/7 (#8060)
 +
if ( !support.appendChecked ) {
 +
jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
 +
}
 +
 +
i = 0;
 +
while ( ( elem = nodes[ i++ ] ) ) {
 +
 +
// Skip elements already in the context collection (trac-4087)
 +
if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
 +
if ( ignored ) {
 +
ignored.push( elem );
 +
}
 +
 +
continue;
 +
}
 +
 +
contains = jQuery.contains( elem.ownerDocument, elem );
 +
 +
// Append to fragment
 +
tmp = getAll( safe.appendChild( elem ), "script" );
 +
 +
// Preserve script evaluation history
 +
if ( contains ) {
 +
setGlobalEval( tmp );
 +
}
 +
 +
// Capture executables
 +
if ( scripts ) {
 +
j = 0;
 +
while ( ( elem = tmp[ j++ ] ) ) {
 +
if ( rscriptType.test( elem.type || "" ) ) {
 +
scripts.push( elem );
 +
}
 +
}
 +
}
 +
}
 +
 +
tmp = null;
 +
 +
return safe;
 +
}
 +
 +
 +
( function() {
 +
var i, eventName,
 +
div = document.createElement( "div" );
 +
 +
// Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events)
 +
for ( i in { submit: true, change: true, focusin: true } ) {
 +
eventName = "on" + i;
 +
 +
if ( !( support[ i ] = eventName in window ) ) {
 +
 +
// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
 +
div.setAttribute( eventName, "t" );
 +
support[ i ] = div.attributes[ eventName ].expando === false;
 +
}
 +
}
 +
 +
// Null elements to avoid leaks in IE.
 +
div = null;
 +
} )();
 +
 +
 +
var rformElems = /^(?:input|select|textarea)$/i,
 +
rkeyEvent = /^key/,
 +
rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
 +
rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
 +
rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
 +
 +
function returnTrue() {
 +
return true;
 +
}
 +
 +
function returnFalse() {
 +
return false;
 +
}
 +
 +
// Support: IE9
 +
// See #13393 for more info
 +
function safeActiveElement() {
 +
try {
 +
return document.activeElement;
 +
} catch ( err ) { }
 +
}
 +
 +
function on( elem, types, selector, data, fn, one ) {
 +
var origFn, type;
 +
 +
// Types can be a map of types/handlers
 +
if ( typeof types === "object" ) {
 +
 +
// ( types-Object, selector, data )
 +
if ( typeof selector !== "string" ) {
 +
 +
// ( types-Object, data )
 +
data = data || selector;
 +
selector = undefined;
 +
}
 +
for ( type in types ) {
 +
on( elem, type, selector, data, types[ type ], one );
 +
}
 +
return elem;
 +
}
 +
 +
if ( data == null && fn == null ) {
 +
 +
// ( types, fn )
 +
fn = selector;
 +
data = selector = undefined;
 +
} else if ( fn == null ) {
 +
if ( typeof selector === "string" ) {
 +
 +
// ( types, selector, fn )
 +
fn = data;
 +
data = undefined;
 +
} else {
 +
 +
// ( types, data, fn )
 +
fn = data;
 +
data = selector;
 +
selector = undefined;
 +
}
 +
}
 +
if ( fn === false ) {
 +
fn = returnFalse;
 +
} else if ( !fn ) {
 +
return elem;
 +
}
 +
 +
if ( one === 1 ) {
 +
origFn = fn;
 +
fn = function( event ) {
 +
 +
// Can use an empty set, since event contains the info
 +
jQuery().off( event );
 +
return origFn.apply( this, arguments );
 +
};
 +
 +
// Use same guid so caller can remove using origFn
 +
fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
 +
}
 +
return elem.each( function() {
 +
jQuery.event.add( this, types, fn, data, selector );
 +
} );
 +
}
 +
 +
/*
 +
* Helper functions for managing events -- not part of the public interface.
 +
* Props to Dean Edwards' addEvent library for many of the ideas.
 +
*/
 +
jQuery.event = {
 +
 +
global: {},
 +
 +
add: function( elem, types, handler, data, selector ) {
 +
var tmp, events, t, handleObjIn,
 +
special, eventHandle, handleObj,
 +
handlers, type, namespaces, origType,
 +
elemData = jQuery._data( elem );
 +
 +
// Don't attach events to noData or text/comment nodes (but allow plain objects)
 +
if ( !elemData ) {
 +
return;
 +
}
 +
 +
// Caller can pass in an object of custom data in lieu of the handler
 +
if ( handler.handler ) {
 +
handleObjIn = handler;
 +
handler = handleObjIn.handler;
 +
selector = handleObjIn.selector;
 +
}
 +
 +
// Make sure that the handler has a unique ID, used to find/remove it later
 +
if ( !handler.guid ) {
 +
handler.guid = jQuery.guid++;
 +
}
 +
 +
// Init the element's event structure and main handler, if this is the first
 +
if ( !( events = elemData.events ) ) {
 +
events = elemData.events = {};
 +
}
 +
if ( !( eventHandle = elemData.handle ) ) {
 +
eventHandle = elemData.handle = function( e ) {
 +
 +
// Discard the second event of a jQuery.event.trigger() and
 +
// when an event is called after a page has unloaded
 +
return typeof jQuery !== "undefined" &&
 +
( !e || jQuery.event.triggered !== e.type ) ?
 +
jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
 +
undefined;
 +
};
 +
 +
// Add elem as a property of the handle fn to prevent a memory leak
 +
// with IE non-native events
 +
eventHandle.elem = elem;
 +
}
 +
 +
// Handle multiple events separated by a space
 +
types = ( types || "" ).match( rnotwhite ) || [ "" ];
 +
t = types.length;
 +
while ( t-- ) {
 +
tmp = rtypenamespace.exec( types[ t ] ) || [];
 +
type = origType = tmp[ 1 ];
 +
namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
 +
 +
// There *must* be a type, no attaching namespace-only handlers
 +
if ( !type ) {
 +
continue;
 +
}
 +
 +
// If event changes its type, use the special event handlers for the changed type
 +
special = jQuery.event.special[ type ] || {};
 +
 +
// If selector defined, determine special event api type, otherwise given type
 +
type = ( selector ? special.delegateType : special.bindType ) || type;
 +
 +
// Update special based on newly reset type
 +
special = jQuery.event.special[ type ] || {};
 +
 +
// handleObj is passed to all event handlers
 +
handleObj = jQuery.extend( {
 +
type: type,
 +
origType: origType,
 +
data: data,
 +
handler: handler,
 +
guid: handler.guid,
 +
selector: selector,
 +
needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
 +
namespace: namespaces.join( "." )
 +
}, handleObjIn );
 +
 +
// Init the event handler queue if we're the first
 +
if ( !( handlers = events[ type ] ) ) {
 +
handlers = events[ type ] = [];
 +
handlers.delegateCount = 0;
 +
 +
// Only use addEventListener/attachEvent if the special events handler returns false
 +
if ( !special.setup ||
 +
special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
 +
 +
// Bind the global event handler to the element
 +
if ( elem.addEventListener ) {
 +
elem.addEventListener( type, eventHandle, false );
 +
 +
} else if ( elem.attachEvent ) {
 +
elem.attachEvent( "on" + type, eventHandle );
 +
}
 +
}
 +
}
 +
 +
if ( special.add ) {
 +
special.add.call( elem, handleObj );
 +
 +
if ( !handleObj.handler.guid ) {
 +
handleObj.handler.guid = handler.guid;
 +
}
 +
}
 +
 +
// Add to the element's handler list, delegates in front
 +
if ( selector ) {
 +
handlers.splice( handlers.delegateCount++, 0, handleObj );
 +
} else {
 +
handlers.push( handleObj );
 +
}
 +
 +
// Keep track of which events have ever been used, for event optimization
 +
jQuery.event.global[ type ] = true;
 +
}
 +
 +
// Nullify elem to prevent memory leaks in IE
 +
elem = null;
 +
},
 +
 +
// Detach an event or set of events from an element
 +
remove: function( elem, types, handler, selector, mappedTypes ) {
 +
var j, handleObj, tmp,
 +
origCount, t, events,
 +
special, handlers, type,
 +
namespaces, origType,
 +
elemData = jQuery.hasData( elem ) && jQuery._data( elem );
 +
 +
if ( !elemData || !( events = elemData.events ) ) {
 +
return;
 +
}
 +
 +
// Once for each type.namespace in types; type may be omitted
 +
types = ( types || "" ).match( rnotwhite ) || [ "" ];
 +
t = types.length;
 +
while ( t-- ) {
 +
tmp = rtypenamespace.exec( types[ t ] ) || [];
 +
type = origType = tmp[ 1 ];
 +
namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
 +
 +
// Unbind all events (on this namespace, if provided) for the element
 +
if ( !type ) {
 +
for ( type in events ) {
 +
jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
 +
}
 +
continue;
 +
}
 +
 +
special = jQuery.event.special[ type ] || {};
 +
type = ( selector ? special.delegateType : special.bindType ) || type;
 +
handlers = events[ type ] || [];
 +
tmp = tmp[ 2 ] &&
 +
new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
 +
 +
// Remove matching events
 +
origCount = j = handlers.length;
 +
while ( j-- ) {
 +
handleObj = handlers[ j ];
 +
 +
if ( ( mappedTypes || origType === handleObj.origType ) &&
 +
( !handler || handler.guid === handleObj.guid ) &&
 +
( !tmp || tmp.test( handleObj.namespace ) ) &&
 +
( !selector || selector === handleObj.selector ||
 +
selector === "**" && handleObj.selector ) ) {
 +
handlers.splice( j, 1 );
 +
 +
if ( handleObj.selector ) {
 +
handlers.delegateCount--;
 +
}
 +
if ( special.remove ) {
 +
special.remove.call( elem, handleObj );
 +
}
 +
}
 +
}
 +
 +
// Remove generic event handler if we removed something and no more handlers exist
 +
// (avoids potential for endless recursion during removal of special event handlers)
 +
if ( origCount && !handlers.length ) {
 +
if ( !special.teardown ||
 +
special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
 +
 +
jQuery.removeEvent( elem, type, elemData.handle );
 +
}
 +
 +
delete events[ type ];
 +
}
 +
}
 +
 +
// Remove the expando if it's no longer used
 +
if ( jQuery.isEmptyObject( events ) ) {
 +
delete elemData.handle;
 +
 +
// removeData also checks for emptiness and clears the expando if empty
 +
// so use it instead of delete
 +
jQuery._removeData( elem, "events" );
 +
}
 +
},
 +
 +
trigger: function( event, data, elem, onlyHandlers ) {
 +
var handle, ontype, cur,
 +
bubbleType, special, tmp, i,
 +
eventPath = [ elem || document ],
 +
type = hasOwn.call( event, "type" ) ? event.type : event,
 +
namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
 +
 +
cur = tmp = elem = elem || document;
 +
 +
// Don't do events on text and comment nodes
 +
if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
 +
return;
 +
}
 +
 +
// focus/blur morphs to focusin/out; ensure we're not firing them right now
 +
if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
 +
return;
 +
}
 +
 +
if ( type.indexOf( "." ) > -1 ) {
 +
 +
// Namespaced trigger; create a regexp to match event type in handle()
 +
namespaces = type.split( "." );
 +
type = namespaces.shift();
 +
namespaces.sort();
 +
}
 +
ontype = type.indexOf( ":" ) < 0 && "on" + type;
 +
 +
// Caller can pass in a jQuery.Event object, Object, or just an event type string
 +
event = event[ jQuery.expando ] ?
 +
event :
 +
new jQuery.Event( type, typeof event === "object" && event );
 +
 +
// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
 +
event.isTrigger = onlyHandlers ? 2 : 3;
 +
event.namespace = namespaces.join( "." );
 +
event.rnamespace = event.namespace ?
 +
new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
 +
null;
 +
 +
// Clean up the event in case it is being reused
 +
event.result = undefined;
 +
if ( !event.target ) {
 +
event.target = elem;
 +
}
 +
 +
// Clone any incoming data and prepend the event, creating the handler arg list
 +
data = data == null ?
 +
[ event ] :
 +
jQuery.makeArray( data, [ event ] );
 +
 +
// Allow special events to draw outside the lines
 +
special = jQuery.event.special[ type ] || {};
 +
if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
 +
return;
 +
}
 +
 +
// Determine event propagation path in advance, per W3C events spec (#9951)
 +
// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
 +
if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
 +
 +
bubbleType = special.delegateType || type;
 +
if ( !rfocusMorph.test( bubbleType + type ) ) {
 +
cur = cur.parentNode;
 +
}
 +
for ( ; cur; cur = cur.parentNode ) {
 +
eventPath.push( cur );
 +
tmp = cur;
 +
}
 +
 +
// Only add window if we got to document (e.g., not plain obj or detached DOM)
 +
if ( tmp === ( elem.ownerDocument || document ) ) {
 +
eventPath.push( tmp.defaultView || tmp.parentWindow || window );
 +
}
 +
}
 +
 +
// Fire handlers on the event path
 +
i = 0;
 +
while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
 +
 +
event.type = i > 1 ?
 +
bubbleType :
 +
special.bindType || type;
 +
 +
// jQuery handler
 +
handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] &&
 +
jQuery._data( cur, "handle" );
 +
 +
if ( handle ) {
 +
handle.apply( cur, data );
 +
}
 +
 +
// Native handler
 +
handle = ontype && cur[ ontype ];
 +
if ( handle && handle.apply && acceptData( cur ) ) {
 +
event.result = handle.apply( cur, data );
 +
if ( event.result === false ) {
 +
event.preventDefault();
 +
}
 +
}
 +
}
 +
event.type = type;
 +
 +
// If nobody prevented the default action, do it now
 +
if ( !onlyHandlers && !event.isDefaultPrevented() ) {
 +
 +
if (
 +
( !special._default ||
 +
special._default.apply( eventPath.pop(), data ) === false
 +
) && acceptData( elem )
 +
) {
 +
 +
// Call a native DOM method on the target with the same name name as the event.
 +
// Can't use an .isFunction() check here because IE6/7 fails that test.
 +
// Don't do default actions on window, that's where global variables be (#6170)
 +
if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
 +
 +
// Don't re-trigger an onFOO event when we call its FOO() method
 +
tmp = elem[ ontype ];
 +
 +
if ( tmp ) {
 +
elem[ ontype ] = null;
 +
}
 +
 +
// Prevent re-triggering of the same event, since we already bubbled it above
 +
jQuery.event.triggered = type;
 +
try {
 +
elem[ type ]();
 +
} catch ( e ) {
 +
 +
// IE<9 dies on focus/blur to hidden element (#1486,#12518)
 +
// only reproducible on winXP IE8 native, not IE9 in IE8 mode
 +
}
 +
jQuery.event.triggered = undefined;
 +
 +
if ( tmp ) {
 +
elem[ ontype ] = tmp;
 +
}
 +
}
 +
}
 +
}
 +
 +
return event.result;
 +
},
 +
 +
dispatch: function( event ) {
 +
 +
// Make a writable jQuery.Event from the native event object
 +
event = jQuery.event.fix( event );
 +
 +
var i, j, ret, matched, handleObj,
 +
handlerQueue = [],
 +
args = slice.call( arguments ),
 +
handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
 +
special = jQuery.event.special[ event.type ] || {};
 +
 +
// Use the fix-ed jQuery.Event rather than the (read-only) native event
 +
args[ 0 ] = event;
 +
event.delegateTarget = this;
 +
 +
// Call the preDispatch hook for the mapped type, and let it bail if desired
 +
if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
 +
return;
 +
}
 +
 +
// Determine handlers
 +
handlerQueue = jQuery.event.handlers.call( this, event, handlers );
 +
 +
// Run delegates first; they may want to stop propagation beneath us
 +
i = 0;
 +
while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
 +
event.currentTarget = matched.elem;
 +
 +
j = 0;
 +
while ( ( handleObj = matched.handlers[ j++ ] ) &&
 +
!event.isImmediatePropagationStopped() ) {
 +
 +
// Triggered event must either 1) have no namespace, or 2) have namespace(s)
 +
// a subset or equal to those in the bound event (both can have no namespace).
 +
if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
 +
 +
event.handleObj = handleObj;
 +
event.data = handleObj.data;
 +
 +
ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
 +
handleObj.handler ).apply( matched.elem, args );
 +
 +
if ( ret !== undefined ) {
 +
if ( ( event.result = ret ) === false ) {
 +
event.preventDefault();
 +
event.stopPropagation();
 +
}
 +
}
 +
}
 +
}
 +
}
 +
 +
// Call the postDispatch hook for the mapped type
 +
if ( special.postDispatch ) {
 +
special.postDispatch.call( this, event );
 +
}
 +
 +
return event.result;
 +
},
 +
 +
handlers: function( event, handlers ) {
 +
var i, matches, sel, handleObj,
 +
handlerQueue = [],
 +
delegateCount = handlers.delegateCount,
 +
cur = event.target;
 +
 +
// Support (at least): Chrome, IE9
 +
// Find delegate handlers
 +
// Black-hole SVG <use> instance trees (#13180)
 +
//
 +
// Support: Firefox<=42+
 +
// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
 +
if ( delegateCount && cur.nodeType &&
 +
( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {
 +
 +
/* jshint eqeqeq: false */
 +
for ( ; cur != this; cur = cur.parentNode || this ) {
 +
/* jshint eqeqeq: true */
 +
 +
// Don't check non-elements (#13208)
 +
// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
 +
if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
 +
matches = [];
 +
for ( i = 0; i < delegateCount; i++ ) {
 +
handleObj = handlers[ i ];
 +
 +
// Don't conflict with Object.prototype properties (#13203)
 +
sel = handleObj.selector + " ";
 +
 +
if ( matches[ sel ] === undefined ) {
 +
matches[ sel ] = handleObj.needsContext ?
 +
jQuery( sel, this ).index( cur ) > -1 :
 +
jQuery.find( sel, this, null, [ cur ] ).length;
 +
}
 +
if ( matches[ sel ] ) {
 +
matches.push( handleObj );
 +
}
 +
}
 +
if ( matches.length ) {
 +
handlerQueue.push( { elem: cur, handlers: matches } );
 +
}
 +
}
 +
}
 +
}
 +
 +
// Add the remaining (directly-bound) handlers
 +
if ( delegateCount < handlers.length ) {
 +
handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
 +
}
 +
 +
return handlerQueue;
 +
},
 +
 +
fix: function( event ) {
 +
if ( event[ jQuery.expando ] ) {
 +
return event;
 +
}
 +
 +
// Create a writable copy of the event object and normalize some properties
 +
var i, prop, copy,
 +
type = event.type,
 +
originalEvent = event,
 +
fixHook = this.fixHooks[ type ];
 +
 +
if ( !fixHook ) {
 +
this.fixHooks[ type ] = fixHook =
 +
rmouseEvent.test( type ) ? this.mouseHooks :
 +
rkeyEvent.test( type ) ? this.keyHooks :
 +
{};
 +
}
 +
copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
 +
 +
event = new jQuery.Event( originalEvent );
 +
 +
i = copy.length;
 +
while ( i-- ) {
 +
prop = copy[ i ];
 +
event[ prop ] = originalEvent[ prop ];
 +
}
 +
 +
// Support: IE<9
 +
// Fix target property (#1925)
 +
if ( !event.target ) {
 +
event.target = originalEvent.srcElement || document;
 +
}
 +
 +
// Support: Safari 6-8+
 +
// Target should not be a text node (#504, #13143)
 +
if ( event.target.nodeType === 3 ) {
 +
event.target = event.target.parentNode;
 +
}
 +
 +
// Support: IE<9
 +
// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
 +
event.metaKey = !!event.metaKey;
 +
 +
return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
 +
},
 +
 +
// Includes some event props shared by KeyEvent and MouseEvent
 +
props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " +
 +
"metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ),
 +
 +
fixHooks: {},
 +
 +
keyHooks: {
 +
props: "char charCode key keyCode".split( " " ),
 +
filter: function( event, original ) {
 +
 +
// Add which for key events
 +
if ( event.which == null ) {
 +
event.which = original.charCode != null ? original.charCode : original.keyCode;
 +
}
 +
 +
return event;
 +
}
 +
},
 +
 +
mouseHooks: {
 +
props: ( "button buttons clientX clientY fromElement offsetX offsetY " +
 +
"pageX pageY screenX screenY toElement" ).split( " " ),
 +
filter: function( event, original ) {
 +
var body, eventDoc, doc,
 +
button = original.button,
 +
fromElement = original.fromElement;
 +
 +
// Calculate pageX/Y if missing and clientX/Y available
 +
if ( event.pageX == null && original.clientX != null ) {
 +
eventDoc = event.target.ownerDocument || document;
 +
doc = eventDoc.documentElement;
 +
body = eventDoc.body;
 +
 +
event.pageX = original.clientX +
 +
( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
 +
( doc && doc.clientLeft || body && body.clientLeft || 0 );
 +
event.pageY = original.clientY +
 +
( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) -
 +
( doc && doc.clientTop  || body && body.clientTop  || 0 );
 +
}
 +
 +
// Add relatedTarget, if necessary
 +
if ( !event.relatedTarget && fromElement ) {
 +
event.relatedTarget = fromElement === event.target ?
 +
original.toElement :
 +
fromElement;
 +
}
 +
 +
// Add which for click: 1 === left; 2 === middle; 3 === right
 +
// Note: button is not normalized, so don't use it
 +
if ( !event.which && button !== undefined ) {
 +
event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
 +
}
 +
 +
return event;
 +
}
 +
},
 +
 +
special: {
 +
load: {
 +
 +
// Prevent triggered image.load events from bubbling to window.load
 +
noBubble: true
 +
},
 +
focus: {
 +
 +
// Fire native event if possible so blur/focus sequence is correct
 +
trigger: function() {
 +
if ( this !== safeActiveElement() && this.focus ) {
 +
try {
 +
this.focus();
 +
return false;
 +
} catch ( e ) {
 +
 +
// Support: IE<9
 +
// If we error on focus to hidden element (#1486, #12518),
 +
// let .trigger() run the handlers
 +
}
 +
}
 +
},
 +
delegateType: "focusin"
 +
},
 +
blur: {
 +
trigger: function() {
 +
if ( this === safeActiveElement() && this.blur ) {
 +
this.blur();
 +
return false;
 +
}
 +
},
 +
delegateType: "focusout"
 +
},
 +
click: {
 +
 +
// For checkbox, fire native event so checked state will be right
 +
trigger: function() {
 +
if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
 +
this.click();
 +
return false;
 +
}
 +
},
 +
 +
// For cross-browser consistency, don't fire native .click() on links
 +
_default: function( event ) {
 +
return jQuery.nodeName( event.target, "a" );
 +
}
 +
},
 +
 +
beforeunload: {
 +
postDispatch: function( event ) {
 +
 +
// Support: Firefox 20+
 +
// Firefox doesn't alert if the returnValue field is not set.
 +
if ( event.result !== undefined && event.originalEvent ) {
 +
event.originalEvent.returnValue = event.result;
 +
}
 +
}
 +
}
 +
},
 +
 +
// Piggyback on a donor event to simulate a different one
 +
simulate: function( type, elem, event ) {
 +
var e = jQuery.extend(
 +
new jQuery.Event(),
 +
event,
 +
{
 +
type: type,
 +
isSimulated: true
 +
 +
// Previously, `originalEvent: {}` was set here, so stopPropagation call
 +
// would not be triggered on donor event, since in our own
 +
// jQuery.event.stopPropagation function we had a check for existence of
 +
// originalEvent.stopPropagation method, so, consequently it would be a noop.
 +
//
 +
// Guard for simulated events was moved to jQuery.event.stopPropagation function
 +
// since `originalEvent` should point to the original event for the
 +
// constancy with other events and for more focused logic
 +
}
 +
);
 +
 +
jQuery.event.trigger( e, null, elem );
 +
 +
if ( e.isDefaultPrevented() ) {
 +
event.preventDefault();
 +
}
 +
}
 +
};
 +
 +
jQuery.removeEvent = document.removeEventListener ?
 +
function( elem, type, handle ) {
 +
 +
// This "if" is needed for plain objects
 +
if ( elem.removeEventListener ) {
 +
elem.removeEventListener( type, handle );
 +
}
 +
} :
 +
function( elem, type, handle ) {
 +
var name = "on" + type;
 +
 +
if ( elem.detachEvent ) {
 +
 +
// #8545, #7054, preventing memory leaks for custom events in IE6-8
 +
// detachEvent needed property on element, by name of that event,
 +
// to properly expose it to GC
 +
if ( typeof elem[ name ] === "undefined" ) {
 +
elem[ name ] = null;
 +
}
 +
 +
elem.detachEvent( name, handle );
 +
}
 
};
 
};
  
 +
jQuery.Event = function( src, props ) {
  
var offcanvasMenu = function() {
+
// Allow instantiation without the 'new' keyword
 +
if ( !( this instanceof jQuery.Event ) ) {
 +
return new jQuery.Event( src, props );
 +
}
  
$('#page').prepend('<div id="gtco-offcanvas" />');
+
// Event object
$('#page').prepend('<a href="#" class="js-gtco-nav-toggle gtco-nav-toggle gtco-nav-white"><i></i></a>');
+
if ( src && src.type ) {
var clone1 = $('.menu-1 > ul').clone();
+
this.originalEvent = src;
$('#gtco-offcanvas').append(clone1);
+
this.type = src.type;
var clone2 = $('.menu-2 > ul').clone();
+
$('#gtco-offcanvas').append(clone2);
+
  
$('#gtco-offcanvas .has-dropdown').addClass('offcanvas-has-dropdown');
+
// Events bubbling up the document may have been marked as prevented
$('#gtco-offcanvas')
+
// by a handler lower down the tree; reflect the correct value.
.find('li')
+
this.isDefaultPrevented = src.defaultPrevented ||
.removeClass('has-dropdown');
+
src.defaultPrevented === undefined &&
  
// Hover dropdown menu on mobile
+
// Support: IE < 9, Android < 4.0
$('.offcanvas-has-dropdown').mouseenter(function(){
+
src.returnValue === false ?
var $this = $(this);
+
returnTrue :
 +
returnFalse;
  
$this
+
// Event type
.addClass('active')
+
} else {
.find('ul')
+
this.type = src;
.slideDown(500, 'easeOutExpo');
+
}
}).mouseleave(function(){
+
  
var $this = $(this);
+
// Put explicitly provided properties onto the event object
$this
+
if ( props ) {
.removeClass('active')
+
jQuery.extend( this, props );
.find('ul')
+
}
.slideUp(500, 'easeOutExpo');
+
});
+
  
 +
// Create a timestamp if incoming event doesn't have one
 +
this.timeStamp = src && src.timeStamp || jQuery.now();
  
$(window).resize(function(){
+
// Mark it as fixed
 +
this[ jQuery.expando ] = true;
 +
};
  
if ( $('body').hasClass('offcanvas') ) {
+
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
 +
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
 +
jQuery.Event.prototype = {
 +
constructor: jQuery.Event,
 +
isDefaultPrevented: returnFalse,
 +
isPropagationStopped: returnFalse,
 +
isImmediatePropagationStopped: returnFalse,
  
    $('body').removeClass('offcanvas');
+
preventDefault: function() {
    $('.js-gtco-nav-toggle').removeClass('active');
+
var e = this.originalEvent;
+
 
    }
+
this.isDefaultPrevented = returnTrue;
});
+
if ( !e ) {
 +
return;
 +
}
 +
 
 +
// If preventDefault exists, run it on the original event
 +
if ( e.preventDefault ) {
 +
e.preventDefault();
 +
 
 +
// Support: IE
 +
// Otherwise set the returnValue property of the original event to false
 +
} else {
 +
e.returnValue = false;
 +
}
 +
},
 +
stopPropagation: function() {
 +
var e = this.originalEvent;
 +
 
 +
this.isPropagationStopped = returnTrue;
 +
 
 +
if ( !e || this.isSimulated ) {
 +
return;
 +
}
 +
 
 +
// If stopPropagation exists, run it on the original event
 +
if ( e.stopPropagation ) {
 +
e.stopPropagation();
 +
}
 +
 
 +
// Support: IE
 +
// Set the cancelBubble property of the original event to true
 +
e.cancelBubble = true;
 +
},
 +
stopImmediatePropagation: function() {
 +
var e = this.originalEvent;
 +
 
 +
this.isImmediatePropagationStopped = returnTrue;
 +
 
 +
if ( e && e.stopImmediatePropagation ) {
 +
e.stopImmediatePropagation();
 +
}
 +
 
 +
this.stopPropagation();
 +
}
 +
};
 +
 
 +
// Create mouseenter/leave events using mouseover/out and event-time checks
 +
// so that event delegation works in jQuery.
 +
// Do the same for pointerenter/pointerleave and pointerover/pointerout
 +
//
 +
// Support: Safari 7 only
 +
// Safari sends mouseenter too often; see:
 +
// https://code.google.com/p/chromium/issues/detail?id=470258
 +
// for the description of the bug (it existed in older Chrome versions as well).
 +
jQuery.each( {
 +
mouseenter: "mouseover",
 +
mouseleave: "mouseout",
 +
pointerenter: "pointerover",
 +
pointerleave: "pointerout"
 +
}, function( orig, fix ) {
 +
jQuery.event.special[ orig ] = {
 +
delegateType: fix,
 +
bindType: fix,
 +
 
 +
handle: function( event ) {
 +
var ret,
 +
target = this,
 +
related = event.relatedTarget,
 +
handleObj = event.handleObj;
 +
 
 +
// For mouseenter/leave call the handler if related is outside the target.
 +
// NB: No relatedTarget if the mouse left/entered the browser window
 +
if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
 +
event.type = handleObj.origType;
 +
ret = handleObj.handler.apply( this, arguments );
 +
event.type = fix;
 +
}
 +
return ret;
 +
}
 
};
 
};
 +
} );
  
 +
// IE submit delegation
 +
if ( !support.submit ) {
  
var burgerMenu = function() {
+
jQuery.event.special.submit = {
 +
setup: function() {
  
$('body').on('click', '.js-gtco-nav-toggle', function(event){
+
// Only need this for delegated form submit events
var $this = $(this);
+
if ( jQuery.nodeName( this, "form" ) ) {
 +
return false;
 +
}
  
 +
// Lazy-add a submit handler when a descendant form may potentially be submitted
 +
jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
  
if ( $('body').hasClass('overflow offcanvas') ) {
+
// Node name check avoids a VML-related crash in IE (#9807)
$('body').removeClass('overflow offcanvas');
+
var elem = e.target,
 +
form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ?
 +
 
 +
// Support: IE <=8
 +
// We use jQuery.prop instead of elem.form
 +
// to allow fixing the IE8 delegated submit issue (gh-2332)
 +
// by 3rd party polyfills/workarounds.
 +
jQuery.prop( elem, "form" ) :
 +
undefined;
 +
 
 +
if ( form && !jQuery._data( form, "submit" ) ) {
 +
jQuery.event.add( form, "submit._submit", function( event ) {
 +
event._submitBubble = true;
 +
} );
 +
jQuery._data( form, "submit", true );
 +
}
 +
} );
 +
 
 +
// return undefined since we don't need an event listener
 +
},
 +
 
 +
postDispatch: function( event ) {
 +
 
 +
// If form was submitted by the user, bubble the event up the tree
 +
if ( event._submitBubble ) {
 +
delete event._submitBubble;
 +
if ( this.parentNode && !event.isTrigger ) {
 +
jQuery.event.simulate( "submit", this.parentNode, event );
 +
}
 +
}
 +
},
 +
 
 +
teardown: function() {
 +
 
 +
// Only need this for delegated form submit events
 +
if ( jQuery.nodeName( this, "form" ) ) {
 +
return false;
 +
}
 +
 
 +
// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
 +
jQuery.event.remove( this, "._submit" );
 +
}
 +
};
 +
}
 +
 
 +
// IE change delegation and checkbox/radio fix
 +
if ( !support.change ) {
 +
 
 +
jQuery.event.special.change = {
 +
 
 +
setup: function() {
 +
 
 +
if ( rformElems.test( this.nodeName ) ) {
 +
 
 +
// IE doesn't fire change on a check/radio until blur; trigger it on click
 +
// after a propertychange. Eat the blur-change in special.change.handle.
 +
// This still fires onchange a second time for check/radio after blur.
 +
if ( this.type === "checkbox" || this.type === "radio" ) {
 +
jQuery.event.add( this, "propertychange._change", function( event ) {
 +
if ( event.originalEvent.propertyName === "checked" ) {
 +
this._justChanged = true;
 +
}
 +
} );
 +
jQuery.event.add( this, "click._change", function( event ) {
 +
if ( this._justChanged && !event.isTrigger ) {
 +
this._justChanged = false;
 +
}
 +
 
 +
// Allow triggered, simulated change events (#11500)
 +
jQuery.event.simulate( "change", this, event );
 +
} );
 +
}
 +
return false;
 +
}
 +
 
 +
// Delegated event; lazy-add a change handler on descendant inputs
 +
jQuery.event.add( this, "beforeactivate._change", function( e ) {
 +
var elem = e.target;
 +
 
 +
if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) {
 +
jQuery.event.add( elem, "change._change", function( event ) {
 +
if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
 +
jQuery.event.simulate( "change", this.parentNode, event );
 +
}
 +
} );
 +
jQuery._data( elem, "change", true );
 +
}
 +
} );
 +
},
 +
 
 +
handle: function( event ) {
 +
var elem = event.target;
 +
 
 +
// Swallow native change events from checkbox/radio, we already triggered them above
 +
if ( this !== elem || event.isSimulated || event.isTrigger ||
 +
( elem.type !== "radio" && elem.type !== "checkbox" ) ) {
 +
 
 +
return event.handleObj.handler.apply( this, arguments );
 +
}
 +
},
 +
 
 +
teardown: function() {
 +
jQuery.event.remove( this, "._change" );
 +
 
 +
return !rformElems.test( this.nodeName );
 +
}
 +
};
 +
}
 +
 
 +
// Support: Firefox
 +
// Firefox doesn't have focus(in | out) events
 +
// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
 +
//
 +
// Support: Chrome, Safari
 +
// focus(in | out) events fire after focus & blur events,
 +
// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
 +
// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857
 +
if ( !support.focusin ) {
 +
jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
 +
 
 +
// Attach a single capturing handler on the document while someone wants focusin/focusout
 +
var handler = function( event ) {
 +
jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
 +
};
 +
 
 +
jQuery.event.special[ fix ] = {
 +
setup: function() {
 +
var doc = this.ownerDocument || this,
 +
attaches = jQuery._data( doc, fix );
 +
 
 +
if ( !attaches ) {
 +
doc.addEventListener( orig, handler, true );
 +
}
 +
jQuery._data( doc, fix, ( attaches || 0 ) + 1 );
 +
},
 +
teardown: function() {
 +
var doc = this.ownerDocument || this,
 +
attaches = jQuery._data( doc, fix ) - 1;
 +
 
 +
if ( !attaches ) {
 +
doc.removeEventListener( orig, handler, true );
 +
jQuery._removeData( doc, fix );
 +
} else {
 +
jQuery._data( doc, fix, attaches );
 +
}
 +
}
 +
};
 +
} );
 +
}
 +
 
 +
jQuery.fn.extend( {
 +
 
 +
on: function( types, selector, data, fn ) {
 +
return on( this, types, selector, data, fn );
 +
},
 +
one: function( types, selector, data, fn ) {
 +
return on( this, types, selector, data, fn, 1 );
 +
},
 +
off: function( types, selector, fn ) {
 +
var handleObj, type;
 +
if ( types && types.preventDefault && types.handleObj ) {
 +
 
 +
// ( event )  dispatched jQuery.Event
 +
handleObj = types.handleObj;
 +
jQuery( types.delegateTarget ).off(
 +
handleObj.namespace ?
 +
handleObj.origType + "." + handleObj.namespace :
 +
handleObj.origType,
 +
handleObj.selector,
 +
handleObj.handler
 +
);
 +
return this;
 +
}
 +
if ( typeof types === "object" ) {
 +
 
 +
// ( types-object [, selector] )
 +
for ( type in types ) {
 +
this.off( type, selector, types[ type ] );
 +
}
 +
return this;
 +
}
 +
if ( selector === false || typeof selector === "function" ) {
 +
 
 +
// ( types [, fn] )
 +
fn = selector;
 +
selector = undefined;
 +
}
 +
if ( fn === false ) {
 +
fn = returnFalse;
 +
}
 +
return this.each( function() {
 +
jQuery.event.remove( this, types, fn, selector );
 +
} );
 +
},
 +
 
 +
trigger: function( type, data ) {
 +
return this.each( function() {
 +
jQuery.event.trigger( type, data, this );
 +
} );
 +
},
 +
triggerHandler: function( type, data ) {
 +
var elem = this[ 0 ];
 +
if ( elem ) {
 +
return jQuery.event.trigger( type, data, elem, true );
 +
}
 +
}
 +
} );
 +
 
 +
 
 +
var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
 +
rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ),
 +
rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
 +
 
 +
// Support: IE 10-11, Edge 10240+
 +
// In IE/Edge using regex groups here causes severe slowdowns.
 +
// See https://connect.microsoft.com/IE/feedback/details/1736512/
 +
rnoInnerhtml = /<script|<style|<link/i,
 +
 
 +
// checked="checked" or checked
 +
rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
 +
rscriptTypeMasked = /^true\/(.*)/,
 +
rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
 +
safeFragment = createSafeFragment( document ),
 +
fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) );
 +
 
 +
// Support: IE<8
 +
// Manipulating tables requires a tbody
 +
function manipulationTarget( elem, content ) {
 +
return jQuery.nodeName( elem, "table" ) &&
 +
jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
 +
 
 +
elem.getElementsByTagName( "tbody" )[ 0 ] ||
 +
elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) :
 +
elem;
 +
}
 +
 
 +
// Replace/restore the type attribute of script elements for safe DOM manipulation
 +
function disableScript( elem ) {
 +
elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type;
 +
return elem;
 +
}
 +
function restoreScript( elem ) {
 +
var match = rscriptTypeMasked.exec( elem.type );
 +
if ( match ) {
 +
elem.type = match[ 1 ];
 +
} else {
 +
elem.removeAttribute( "type" );
 +
}
 +
return elem;
 +
}
 +
 
 +
function cloneCopyEvent( src, dest ) {
 +
if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
 +
return;
 +
}
 +
 
 +
var type, i, l,
 +
oldData = jQuery._data( src ),
 +
curData = jQuery._data( dest, oldData ),
 +
events = oldData.events;
 +
 
 +
if ( events ) {
 +
delete curData.handle;
 +
curData.events = {};
 +
 
 +
for ( type in events ) {
 +
for ( i = 0, l = events[ type ].length; i < l; i++ ) {
 +
jQuery.event.add( dest, type, events[ type ][ i ] );
 +
}
 +
}
 +
}
 +
 
 +
// make the cloned public data object a copy from the original
 +
if ( curData.data ) {
 +
curData.data = jQuery.extend( {}, curData.data );
 +
}
 +
}
 +
 
 +
function fixCloneNodeIssues( src, dest ) {
 +
var nodeName, e, data;
 +
 
 +
// We do not need to do anything for non-Elements
 +
if ( dest.nodeType !== 1 ) {
 +
return;
 +
}
 +
 
 +
nodeName = dest.nodeName.toLowerCase();
 +
 
 +
// IE6-8 copies events bound via attachEvent when using cloneNode.
 +
if ( !support.noCloneEvent && dest[ jQuery.expando ] ) {
 +
data = jQuery._data( dest );
 +
 
 +
for ( e in data.events ) {
 +
jQuery.removeEvent( dest, e, data.handle );
 +
}
 +
 
 +
// Event data gets referenced instead of copied if the expando gets copied too
 +
dest.removeAttribute( jQuery.expando );
 +
}
 +
 
 +
// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
 +
if ( nodeName === "script" && dest.text !== src.text ) {
 +
disableScript( dest ).text = src.text;
 +
restoreScript( dest );
 +
 
 +
// IE6-10 improperly clones children of object elements using classid.
 +
// IE10 throws NoModificationAllowedError if parent is null, #12132.
 +
} else if ( nodeName === "object" ) {
 +
if ( dest.parentNode ) {
 +
dest.outerHTML = src.outerHTML;
 +
}
 +
 
 +
// This path appears unavoidable for IE9. When cloning an object
 +
// element in IE9, the outerHTML strategy above is not sufficient.
 +
// If the src has innerHTML and the destination does not,
 +
// copy the src.innerHTML into the dest.innerHTML. #10324
 +
if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) {
 +
dest.innerHTML = src.innerHTML;
 +
}
 +
 
 +
} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
 +
 
 +
// IE6-8 fails to persist the checked state of a cloned checkbox
 +
// or radio button. Worse, IE6-7 fail to give the cloned element
 +
// a checked appearance if the defaultChecked value isn't also set
 +
 
 +
dest.defaultChecked = dest.checked = src.checked;
 +
 
 +
// IE6-7 get confused and end up setting the value of a cloned
 +
// checkbox/radio button to an empty string instead of "on"
 +
if ( dest.value !== src.value ) {
 +
dest.value = src.value;
 +
}
 +
 
 +
// IE6-8 fails to return the selected option to the default selected
 +
// state when cloning options
 +
} else if ( nodeName === "option" ) {
 +
dest.defaultSelected = dest.selected = src.defaultSelected;
 +
 
 +
// IE6-8 fails to set the defaultValue to the correct value when
 +
// cloning other types of input fields
 +
} else if ( nodeName === "input" || nodeName === "textarea" ) {
 +
dest.defaultValue = src.defaultValue;
 +
}
 +
}
 +
 
 +
function domManip( collection, args, callback, ignored ) {
 +
 
 +
// Flatten any nested arrays
 +
args = concat.apply( [], args );
 +
 
 +
var first, node, hasScripts,
 +
scripts, doc, fragment,
 +
i = 0,
 +
l = collection.length,
 +
iNoClone = l - 1,
 +
value = args[ 0 ],
 +
isFunction = jQuery.isFunction( value );
 +
 
 +
// We can't cloneNode fragments that contain checked, in WebKit
 +
if ( isFunction ||
 +
( l > 1 && typeof value === "string" &&
 +
!support.checkClone && rchecked.test( value ) ) ) {
 +
return collection.each( function( index ) {
 +
var self = collection.eq( index );
 +
if ( isFunction ) {
 +
args[ 0 ] = value.call( this, index, self.html() );
 +
}
 +
domManip( self, args, callback, ignored );
 +
} );
 +
}
 +
 
 +
if ( l ) {
 +
fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
 +
first = fragment.firstChild;
 +
 
 +
if ( fragment.childNodes.length === 1 ) {
 +
fragment = first;
 +
}
 +
 
 +
// Require either new content or an interest in ignored elements to invoke the callback
 +
if ( first || ignored ) {
 +
scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
 +
hasScripts = scripts.length;
 +
 
 +
// Use the original fragment for the last item
 +
// instead of the first because it can end up
 +
// being emptied incorrectly in certain situations (#8070).
 +
for ( ; i < l; i++ ) {
 +
node = fragment;
 +
 
 +
if ( i !== iNoClone ) {
 +
node = jQuery.clone( node, true, true );
 +
 
 +
// Keep references to cloned scripts for later restoration
 +
if ( hasScripts ) {
 +
 
 +
// Support: Android<4.1, PhantomJS<2
 +
// push.apply(_, arraylike) throws on ancient WebKit
 +
jQuery.merge( scripts, getAll( node, "script" ) );
 +
}
 +
}
 +
 
 +
callback.call( collection[ i ], node, i );
 +
}
 +
 
 +
if ( hasScripts ) {
 +
doc = scripts[ scripts.length - 1 ].ownerDocument;
 +
 
 +
// Reenable scripts
 +
jQuery.map( scripts, restoreScript );
 +
 
 +
// Evaluate executable scripts on first document insertion
 +
for ( i = 0; i < hasScripts; i++ ) {
 +
node = scripts[ i ];
 +
if ( rscriptType.test( node.type || "" ) &&
 +
!jQuery._data( node, "globalEval" ) &&
 +
jQuery.contains( doc, node ) ) {
 +
 
 +
if ( node.src ) {
 +
 
 +
// Optional AJAX dependency, but won't run scripts if not present
 +
if ( jQuery._evalUrl ) {
 +
jQuery._evalUrl( node.src );
 +
}
 +
} else {
 +
jQuery.globalEval(
 +
( node.text || node.textContent || node.innerHTML || "" )
 +
.replace( rcleanScript, "" )
 +
);
 +
}
 +
}
 +
}
 +
}
 +
 
 +
// Fix #11809: Avoid leaking memory
 +
fragment = first = null;
 +
}
 +
}
 +
 
 +
return collection;
 +
}
 +
 
 +
function remove( elem, selector, keepData ) {
 +
var node,
 +
elems = selector ? jQuery.filter( selector, elem ) : elem,
 +
i = 0;
 +
 
 +
for ( ; ( node = elems[ i ] ) != null; i++ ) {
 +
 
 +
if ( !keepData && node.nodeType === 1 ) {
 +
jQuery.cleanData( getAll( node ) );
 +
}
 +
 
 +
if ( node.parentNode ) {
 +
if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
 +
setGlobalEval( getAll( node, "script" ) );
 +
}
 +
node.parentNode.removeChild( node );
 +
}
 +
}
 +
 
 +
return elem;
 +
}
 +
 
 +
jQuery.extend( {
 +
htmlPrefilter: function( html ) {
 +
return html.replace( rxhtmlTag, "<$1></$2>" );
 +
},
 +
 
 +
clone: function( elem, dataAndEvents, deepDataAndEvents ) {
 +
var destElements, node, clone, i, srcElements,
 +
inPage = jQuery.contains( elem.ownerDocument, elem );
 +
 
 +
if ( support.html5Clone || jQuery.isXMLDoc( elem ) ||
 +
!rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
 +
 
 +
clone = elem.cloneNode( true );
 +
 
 +
// IE<=8 does not properly clone detached, unknown element nodes
 +
} else {
 +
fragmentDiv.innerHTML = elem.outerHTML;
 +
fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
 +
}
 +
 
 +
if ( ( !support.noCloneEvent || !support.noCloneChecked ) &&
 +
( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) {
 +
 
 +
// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
 +
destElements = getAll( clone );
 +
srcElements = getAll( elem );
 +
 
 +
// Fix all IE cloning issues
 +
for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) {
 +
 
 +
// Ensure that the destination node is not null; Fixes #9587
 +
if ( destElements[ i ] ) {
 +
fixCloneNodeIssues( node, destElements[ i ] );
 +
}
 +
}
 +
}
 +
 
 +
// Copy the events from the original to the clone
 +
if ( dataAndEvents ) {
 +
if ( deepDataAndEvents ) {
 +
srcElements = srcElements || getAll( elem );
 +
destElements = destElements || getAll( clone );
 +
 
 +
for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) {
 +
cloneCopyEvent( node, destElements[ i ] );
 +
}
 
} else {
 
} else {
$('body').addClass('overflow offcanvas');
+
cloneCopyEvent( elem, clone );
 
}
 
}
$this.toggleClass('active');
+
}
event.preventDefault();
+
  
});
+
// Preserve script evaluation history
 +
destElements = getAll( clone, "script" );
 +
if ( destElements.length > 0 ) {
 +
setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
 +
}
 +
 
 +
destElements = srcElements = node = null;
 +
 
 +
// Return the cloned set
 +
return clone;
 +
},
 +
 
 +
cleanData: function( elems, /* internal */ forceAcceptData ) {
 +
var elem, type, id, data,
 +
i = 0,
 +
internalKey = jQuery.expando,
 +
cache = jQuery.cache,
 +
attributes = support.attributes,
 +
special = jQuery.event.special;
 +
 
 +
for ( ; ( elem = elems[ i ] ) != null; i++ ) {
 +
if ( forceAcceptData || acceptData( elem ) ) {
 +
 
 +
id = elem[ internalKey ];
 +
data = id && cache[ id ];
 +
 
 +
if ( data ) {
 +
if ( data.events ) {
 +
for ( type in data.events ) {
 +
if ( special[ type ] ) {
 +
jQuery.event.remove( elem, type );
 +
 
 +
// This is a shortcut to avoid jQuery.event.remove's overhead
 +
} else {
 +
jQuery.removeEvent( elem, type, data.handle );
 +
}
 +
}
 +
}
 +
 
 +
// Remove cache only if it was not already removed by jQuery.event.remove
 +
if ( cache[ id ] ) {
 +
 
 +
delete cache[ id ];
 +
 
 +
// Support: IE<9
 +
// IE does not allow us to delete expando properties from nodes
 +
// IE creates expando attributes along with the property
 +
// IE does not have a removeAttribute function on Document nodes
 +
if ( !attributes && typeof elem.removeAttribute !== "undefined" ) {
 +
elem.removeAttribute( internalKey );
 +
 
 +
// Webkit & Blink performance suffers when deleting properties
 +
// from DOM nodes, so set to undefined instead
 +
// https://code.google.com/p/chromium/issues/detail?id=378607
 +
} else {
 +
elem[ internalKey ] = undefined;
 +
}
 +
 
 +
deletedIds.push( id );
 +
}
 +
}
 +
}
 +
}
 +
}
 +
} );
 +
 
 +
jQuery.fn.extend( {
 +
 
 +
// Keep domManip exposed until 3.0 (gh-2225)
 +
domManip: domManip,
 +
 
 +
detach: function( selector ) {
 +
return remove( this, selector, true );
 +
},
 +
 
 +
remove: function( selector ) {
 +
return remove( this, selector );
 +
},
 +
 
 +
text: function( value ) {
 +
return access( this, function( value ) {
 +
return value === undefined ?
 +
jQuery.text( this ) :
 +
this.empty().append(
 +
( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value )
 +
);
 +
}, null, value, arguments.length );
 +
},
 +
 
 +
append: function() {
 +
return domManip( this, arguments, function( elem ) {
 +
if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
 +
var target = manipulationTarget( this, elem );
 +
target.appendChild( elem );
 +
}
 +
} );
 +
},
 +
 
 +
prepend: function() {
 +
return domManip( this, arguments, function( elem ) {
 +
if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
 +
var target = manipulationTarget( this, elem );
 +
target.insertBefore( elem, target.firstChild );
 +
}
 +
} );
 +
},
 +
 
 +
before: function() {
 +
return domManip( this, arguments, function( elem ) {
 +
if ( this.parentNode ) {
 +
this.parentNode.insertBefore( elem, this );
 +
}
 +
} );
 +
},
 +
 
 +
after: function() {
 +
return domManip( this, arguments, function( elem ) {
 +
if ( this.parentNode ) {
 +
this.parentNode.insertBefore( elem, this.nextSibling );
 +
}
 +
} );
 +
},
 +
 
 +
empty: function() {
 +
var elem,
 +
i = 0;
 +
 
 +
for ( ; ( elem = this[ i ] ) != null; i++ ) {
 +
 
 +
// Remove element nodes and prevent memory leaks
 +
if ( elem.nodeType === 1 ) {
 +
jQuery.cleanData( getAll( elem, false ) );
 +
}
 +
 
 +
// Remove any remaining nodes
 +
while ( elem.firstChild ) {
 +
elem.removeChild( elem.firstChild );
 +
}
 +
 
 +
// If this is a select, ensure that it displays empty (#12336)
 +
// Support: IE<9
 +
if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
 +
elem.options.length = 0;
 +
}
 +
}
 +
 
 +
return this;
 +
},
 +
 
 +
clone: function( dataAndEvents, deepDataAndEvents ) {
 +
dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
 +
deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
 +
 
 +
return this.map( function() {
 +
return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
 +
} );
 +
},
 +
 
 +
html: function( value ) {
 +
return access( this, function( value ) {
 +
var elem = this[ 0 ] || {},
 +
i = 0,
 +
l = this.length;
 +
 
 +
if ( value === undefined ) {
 +
return elem.nodeType === 1 ?
 +
elem.innerHTML.replace( rinlinejQuery, "" ) :
 +
undefined;
 +
}
 +
 
 +
// See if we can take a shortcut and just use innerHTML
 +
if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
 +
( support.htmlSerialize || !rnoshimcache.test( value )  ) &&
 +
( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
 +
!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
 +
 
 +
value = jQuery.htmlPrefilter( value );
 +
 
 +
try {
 +
for ( ; i < l; i++ ) {
 +
 
 +
// Remove element nodes and prevent memory leaks
 +
elem = this[ i ] || {};
 +
if ( elem.nodeType === 1 ) {
 +
jQuery.cleanData( getAll( elem, false ) );
 +
elem.innerHTML = value;
 +
}
 +
}
 +
 
 +
elem = 0;
 +
 
 +
// If using innerHTML throws an exception, use the fallback method
 +
} catch ( e ) {}
 +
}
 +
 
 +
if ( elem ) {
 +
this.empty().append( value );
 +
}
 +
}, null, value, arguments.length );
 +
},
 +
 
 +
replaceWith: function() {
 +
var ignored = [];
 +
 
 +
// Make the changes, replacing each non-ignored context element with the new content
 +
return domManip( this, arguments, function( elem ) {
 +
var parent = this.parentNode;
 +
 
 +
if ( jQuery.inArray( this, ignored ) < 0 ) {
 +
jQuery.cleanData( getAll( this ) );
 +
if ( parent ) {
 +
parent.replaceChild( elem, this );
 +
}
 +
}
 +
 
 +
// Force callback invocation
 +
}, ignored );
 +
}
 +
} );
 +
 
 +
jQuery.each( {
 +
appendTo: "append",
 +
prependTo: "prepend",
 +
insertBefore: "before",
 +
insertAfter: "after",
 +
replaceAll: "replaceWith"
 +
}, function( name, original ) {
 +
jQuery.fn[ name ] = function( selector ) {
 +
var elems,
 +
i = 0,
 +
ret = [],
 +
insert = jQuery( selector ),
 +
last = insert.length - 1;
 +
 
 +
for ( ; i <= last; i++ ) {
 +
elems = i === last ? this : this.clone( true );
 +
jQuery( insert[ i ] )[ original ]( elems );
 +
 
 +
// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
 +
push.apply( ret, elems.get() );
 +
}
 +
 
 +
return this.pushStack( ret );
 
};
 
};
 +
} );
  
  
 +
var iframe,
 +
elemdisplay = {
  
var contentWayPoint = function() {
+
// Support: Firefox
var i = 0;
+
// We have to pre-define these values for FF (#10227)
 +
HTML: "block",
 +
BODY: "block"
 +
};
  
// $('.gtco-section').waypoint( function( direction ) {
+
/**
 +
* Retrieve the actual display of a element
 +
* @param {String} name nodeName of the element
 +
* @param {Object} doc Document object
 +
*/
  
 +
// Called only from within defaultDisplay
 +
function actualDisplay( name, doc ) {
 +
var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
  
$('.animate-box').waypoint( function( direction ) {
+
display = jQuery.css( elem[ 0 ], "display" );
  
if( direction === 'down' && !$(this.element).hasClass('animated-fast') ) {
+
// We don't have any data stored on the element,
+
// so use "detach" method as fast way to get rid of the element
i++;
+
elem.detach();
  
$(this.element).addClass('item-animate');
+
return display;
setTimeout(function(){
+
}
  
$('body .animate-box.item-animate').each(function(k){
+
/**
var el = $(this);
+
* Try to determine the default display value of an element
setTimeout( function () {
+
* @param {String} nodeName
var effect = el.data('animate-effect');
+
*/
if ( effect === 'fadeIn') {
+
function defaultDisplay( nodeName ) {
el.addClass('fadeIn animated-fast');
+
var doc = document,
} else if ( effect === 'fadeInLeft') {
+
display = elemdisplay[ nodeName ];
el.addClass('fadeInLeft animated-fast');
+
 
} else if ( effect === 'fadeInRight') {
+
if ( !display ) {
el.addClass('fadeInRight animated-fast');
+
display = actualDisplay( nodeName, doc );
} else {
+
 
el.addClass('fadeInUp animated-fast');
+
// If the simple way fails, read from inside an iframe
 +
if ( display === "none" || !display ) {
 +
 
 +
// Use the already-created iframe if possible
 +
iframe = ( iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" ) )
 +
.appendTo( doc.documentElement );
 +
 
 +
// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
 +
doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;
 +
 
 +
// Support: IE
 +
doc.write();
 +
doc.close();
 +
 
 +
display = actualDisplay( nodeName, doc );
 +
iframe.detach();
 +
}
 +
 
 +
// Store the correct default display
 +
elemdisplay[ nodeName ] = display;
 +
}
 +
 
 +
return display;
 +
}
 +
var rmargin = ( /^margin/ );
 +
 
 +
var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
 +
 
 +
var swap = function( elem, options, callback, args ) {
 +
var ret, name,
 +
old = {};
 +
 
 +
// Remember the old values, and insert the new ones
 +
for ( name in options ) {
 +
old[ name ] = elem.style[ name ];
 +
elem.style[ name ] = options[ name ];
 +
}
 +
 
 +
ret = callback.apply( elem, args || [] );
 +
 
 +
// Revert the old values
 +
for ( name in options ) {
 +
elem.style[ name ] = old[ name ];
 +
}
 +
 
 +
return ret;
 +
};
 +
 
 +
 
 +
var documentElement = document.documentElement;
 +
 
 +
 
 +
 
 +
( function() {
 +
var pixelPositionVal, pixelMarginRightVal, boxSizingReliableVal,
 +
reliableHiddenOffsetsVal, reliableMarginRightVal, reliableMarginLeftVal,
 +
container = document.createElement( "div" ),
 +
div = document.createElement( "div" );
 +
 
 +
// Finish early in limited (non-browser) environments
 +
if ( !div.style ) {
 +
return;
 +
}
 +
 
 +
div.style.cssText = "float:left;opacity:.5";
 +
 
 +
// Support: IE<9
 +
// Make sure that element opacity exists (as opposed to filter)
 +
support.opacity = div.style.opacity === "0.5";
 +
 
 +
// Verify style float existence
 +
// (IE uses styleFloat instead of cssFloat)
 +
support.cssFloat = !!div.style.cssFloat;
 +
 
 +
div.style.backgroundClip = "content-box";
 +
div.cloneNode( true ).style.backgroundClip = "";
 +
support.clearCloneStyle = div.style.backgroundClip === "content-box";
 +
 
 +
container = document.createElement( "div" );
 +
container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
 +
"padding:0;margin-top:1px;position:absolute";
 +
div.innerHTML = "";
 +
container.appendChild( div );
 +
 
 +
// Support: Firefox<29, Android 2.3
 +
// Vendor-prefix box-sizing
 +
support.boxSizing = div.style.boxSizing === "" || div.style.MozBoxSizing === "" ||
 +
div.style.WebkitBoxSizing === "";
 +
 
 +
jQuery.extend( support, {
 +
reliableHiddenOffsets: function() {
 +
if ( pixelPositionVal == null ) {
 +
computeStyleTests();
 +
}
 +
return reliableHiddenOffsetsVal;
 +
},
 +
 
 +
boxSizingReliable: function() {
 +
 
 +
// We're checking for pixelPositionVal here instead of boxSizingReliableVal
 +
// since that compresses better and they're computed together anyway.
 +
if ( pixelPositionVal == null ) {
 +
computeStyleTests();
 +
}
 +
return boxSizingReliableVal;
 +
},
 +
 
 +
pixelMarginRight: function() {
 +
 
 +
// Support: Android 4.0-4.3
 +
if ( pixelPositionVal == null ) {
 +
computeStyleTests();
 +
}
 +
return pixelMarginRightVal;
 +
},
 +
 
 +
pixelPosition: function() {
 +
if ( pixelPositionVal == null ) {
 +
computeStyleTests();
 +
}
 +
return pixelPositionVal;
 +
},
 +
 
 +
reliableMarginRight: function() {
 +
 
 +
// Support: Android 2.3
 +
if ( pixelPositionVal == null ) {
 +
computeStyleTests();
 +
}
 +
return reliableMarginRightVal;
 +
},
 +
 
 +
reliableMarginLeft: function() {
 +
 
 +
// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
 +
if ( pixelPositionVal == null ) {
 +
computeStyleTests();
 +
}
 +
return reliableMarginLeftVal;
 +
}
 +
} );
 +
 
 +
function computeStyleTests() {
 +
var contents, divStyle,
 +
documentElement = document.documentElement;
 +
 
 +
// Setup
 +
documentElement.appendChild( container );
 +
 
 +
div.style.cssText =
 +
 
 +
// Support: Android 2.3
 +
// Vendor-prefix box-sizing
 +
"-webkit-box-sizing:border-box;box-sizing:border-box;" +
 +
"position:relative;display:block;" +
 +
"margin:auto;border:1px;padding:1px;" +
 +
"top:1%;width:50%";
 +
 
 +
// Support: IE<9
 +
// Assume reasonable values in the absence of getComputedStyle
 +
pixelPositionVal = boxSizingReliableVal = reliableMarginLeftVal = false;
 +
pixelMarginRightVal = reliableMarginRightVal = true;
 +
 
 +
// Check for getComputedStyle so that this code is not run in IE<9.
 +
if ( window.getComputedStyle ) {
 +
divStyle = window.getComputedStyle( div );
 +
pixelPositionVal = ( divStyle || {} ).top !== "1%";
 +
reliableMarginLeftVal = ( divStyle || {} ).marginLeft === "2px";
 +
boxSizingReliableVal = ( divStyle || { width: "4px" } ).width === "4px";
 +
 
 +
// Support: Android 4.0 - 4.3 only
 +
// Some styles come back with percentage values, even though they shouldn't
 +
div.style.marginRight = "50%";
 +
pixelMarginRightVal = ( divStyle || { marginRight: "4px" } ).marginRight === "4px";
 +
 
 +
// Support: Android 2.3 only
 +
// Div with explicit width and no margin-right incorrectly
 +
// gets computed margin-right based on width of container (#3333)
 +
// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
 +
contents = div.appendChild( document.createElement( "div" ) );
 +
 
 +
// Reset CSS: box-sizing; display; margin; border; padding
 +
contents.style.cssText = div.style.cssText =
 +
 
 +
// Support: Android 2.3
 +
// Vendor-prefix box-sizing
 +
"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
 +
"box-sizing:content-box;display:block;margin:0;border:0;padding:0";
 +
contents.style.marginRight = contents.style.width = "0";
 +
div.style.width = "1px";
 +
 
 +
reliableMarginRightVal =
 +
!parseFloat( ( window.getComputedStyle( contents ) || {} ).marginRight );
 +
 
 +
div.removeChild( contents );
 +
}
 +
 
 +
// Support: IE6-8
 +
// First check that getClientRects works as expected
 +
// Check if table cells still have offsetWidth/Height when they are set
 +
// to display:none and there are still other visible table cells in a
 +
// table row; if so, offsetWidth/Height are not reliable for use when
 +
// determining if an element has been hidden directly using
 +
// display:none (it is still safe to use offsets if a parent element is
 +
// hidden; don safety goggles and see bug #4512 for more information).
 +
div.style.display = "none";
 +
reliableHiddenOffsetsVal = div.getClientRects().length === 0;
 +
if ( reliableHiddenOffsetsVal ) {
 +
div.style.display = "";
 +
div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
 +
div.childNodes[ 0 ].style.borderCollapse = "separate";
 +
contents = div.getElementsByTagName( "td" );
 +
contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none";
 +
reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
 +
if ( reliableHiddenOffsetsVal ) {
 +
contents[ 0 ].style.display = "";
 +
contents[ 1 ].style.display = "none";
 +
reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
 +
}
 +
}
 +
 
 +
// Teardown
 +
documentElement.removeChild( container );
 +
}
 +
 
 +
} )();
 +
 
 +
 
 +
var getStyles, curCSS,
 +
rposition = /^(top|right|bottom|left)$/;
 +
 
 +
if ( window.getComputedStyle ) {
 +
getStyles = function( elem ) {
 +
 
 +
// Support: IE<=11+, Firefox<=30+ (#15098, #14150)
 +
// IE throws on elements created in popups
 +
// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
 +
var view = elem.ownerDocument.defaultView;
 +
 
 +
if ( !view || !view.opener ) {
 +
view = window;
 +
}
 +
 
 +
return view.getComputedStyle( elem );
 +
};
 +
 
 +
curCSS = function( elem, name, computed ) {
 +
var width, minWidth, maxWidth, ret,
 +
style = elem.style;
 +
 
 +
computed = computed || getStyles( elem );
 +
 
 +
// getPropertyValue is only needed for .css('filter') in IE9, see #12537
 +
ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
 +
 
 +
// Support: Opera 12.1x only
 +
// Fall back to style even without computed
 +
// computed is undefined for elems on document fragments
 +
if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {
 +
ret = jQuery.style( elem, name );
 +
}
 +
 
 +
if ( computed ) {
 +
 
 +
// A tribute to the "awesome hack by Dean Edwards"
 +
// Chrome < 17 and Safari 5.0 uses "computed value"
 +
// instead of "used value" for margin-right
 +
// Safari 5.1.7 (at least) returns percentage for a larger set of values,
 +
// but width seems to be reliably pixels
 +
// this is against the CSSOM draft spec:
 +
// http://dev.w3.org/csswg/cssom/#resolved-values
 +
if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
 +
 
 +
// Remember the original values
 +
width = style.width;
 +
minWidth = style.minWidth;
 +
maxWidth = style.maxWidth;
 +
 
 +
// Put in the new values to get a computed value out
 +
style.minWidth = style.maxWidth = style.width = ret;
 +
ret = computed.width;
 +
 
 +
// Revert the changed values
 +
style.width = width;
 +
style.minWidth = minWidth;
 +
style.maxWidth = maxWidth;
 +
}
 +
}
 +
 
 +
// Support: IE
 +
// IE returns zIndex value as an integer.
 +
return ret === undefined ?
 +
ret :
 +
ret + "";
 +
};
 +
} else if ( documentElement.currentStyle ) {
 +
getStyles = function( elem ) {
 +
return elem.currentStyle;
 +
};
 +
 
 +
curCSS = function( elem, name, computed ) {
 +
var left, rs, rsLeft, ret,
 +
style = elem.style;
 +
 
 +
computed = computed || getStyles( elem );
 +
ret = computed ? computed[ name ] : undefined;
 +
 
 +
// Avoid setting ret to empty string here
 +
// so we don't default to auto
 +
if ( ret == null && style && style[ name ] ) {
 +
ret = style[ name ];
 +
}
 +
 
 +
// From the awesome hack by Dean Edwards
 +
// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
 +
 
 +
// If we're not dealing with a regular pixel number
 +
// but a number that has a weird ending, we need to convert it to pixels
 +
// but not position css attributes, as those are
 +
// proportional to the parent element instead
 +
// and we can't measure the parent instead because it
 +
// might trigger a "stacking dolls" problem
 +
if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
 +
 
 +
// Remember the original values
 +
left = style.left;
 +
rs = elem.runtimeStyle;
 +
rsLeft = rs && rs.left;
 +
 
 +
// Put in the new values to get a computed value out
 +
if ( rsLeft ) {
 +
rs.left = elem.currentStyle.left;
 +
}
 +
style.left = name === "fontSize" ? "1em" : ret;
 +
ret = style.pixelLeft + "px";
 +
 
 +
// Revert the changed values
 +
style.left = left;
 +
if ( rsLeft ) {
 +
rs.left = rsLeft;
 +
}
 +
}
 +
 
 +
// Support: IE
 +
// IE returns zIndex value as an integer.
 +
return ret === undefined ?
 +
ret :
 +
ret + "" || "auto";
 +
};
 +
}
 +
 
 +
 
 +
 
 +
 
 +
function addGetHookIf( conditionFn, hookFn ) {
 +
 
 +
// Define the hook, we'll check on the first run if it's really needed.
 +
return {
 +
get: function() {
 +
if ( conditionFn() ) {
 +
 
 +
// Hook not needed (or it's not possible to use it due
 +
// to missing dependency), remove it.
 +
delete this.get;
 +
return;
 +
}
 +
 
 +
// Hook needed; redefine it so that the support test is not executed again.
 +
return ( this.get = hookFn ).apply( this, arguments );
 +
}
 +
};
 +
}
 +
 
 +
 
 +
var
 +
 
 +
ralpha = /alpha\([^)]*\)/i,
 +
ropacity = /opacity\s*=\s*([^)]*)/i,
 +
 
 +
// swappable if display is none or starts with table except
 +
// "table", "table-cell", or "table-caption"
 +
// see here for display values:
 +
// https://developer.mozilla.org/en-US/docs/CSS/display
 +
rdisplayswap = /^(none|table(?!-c[ea]).+)/,
 +
rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
 +
 
 +
cssShow = { position: "absolute", visibility: "hidden", display: "block" },
 +
cssNormalTransform = {
 +
letterSpacing: "0",
 +
fontWeight: "400"
 +
},
 +
 
 +
cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
 +
emptyStyle = document.createElement( "div" ).style;
 +
 
 +
 
 +
// return a css property mapped to a potentially vendor prefixed property
 +
function vendorPropName( name ) {
 +
 
 +
// shortcut for names that are not vendor prefixed
 +
if ( name in emptyStyle ) {
 +
return name;
 +
}
 +
 
 +
// check for vendor prefixed names
 +
var capName = name.charAt( 0 ).toUpperCase() + name.slice( 1 ),
 +
i = cssPrefixes.length;
 +
 
 +
while ( i-- ) {
 +
name = cssPrefixes[ i ] + capName;
 +
if ( name in emptyStyle ) {
 +
return name;
 +
}
 +
}
 +
}
 +
 
 +
function showHide( elements, show ) {
 +
var display, elem, hidden,
 +
values = [],
 +
index = 0,
 +
length = elements.length;
 +
 
 +
for ( ; index < length; index++ ) {
 +
elem = elements[ index ];
 +
if ( !elem.style ) {
 +
continue;
 +
}
 +
 
 +
values[ index ] = jQuery._data( elem, "olddisplay" );
 +
display = elem.style.display;
 +
if ( show ) {
 +
 
 +
// Reset the inline display of this element to learn if it is
 +
// being hidden by cascaded rules or not
 +
if ( !values[ index ] && display === "none" ) {
 +
elem.style.display = "";
 +
}
 +
 
 +
// Set elements which have been overridden with display: none
 +
// in a stylesheet to whatever the default browser style is
 +
// for such an element
 +
if ( elem.style.display === "" && isHidden( elem ) ) {
 +
values[ index ] =
 +
jQuery._data( elem, "olddisplay", defaultDisplay( elem.nodeName ) );
 +
}
 +
} else {
 +
hidden = isHidden( elem );
 +
 
 +
if ( display && display !== "none" || !hidden ) {
 +
jQuery._data(
 +
elem,
 +
"olddisplay",
 +
hidden ? display : jQuery.css( elem, "display" )
 +
);
 +
}
 +
}
 +
}
 +
 
 +
// Set the display of most of the elements in a second loop
 +
// to avoid the constant reflow
 +
for ( index = 0; index < length; index++ ) {
 +
elem = elements[ index ];
 +
if ( !elem.style ) {
 +
continue;
 +
}
 +
if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
 +
elem.style.display = show ? values[ index ] || "" : "none";
 +
}
 +
}
 +
 
 +
return elements;
 +
}
 +
 
 +
function setPositiveNumber( elem, value, subtract ) {
 +
var matches = rnumsplit.exec( value );
 +
return matches ?
 +
 
 +
// Guard against undefined "subtract", e.g., when used as in cssHooks
 +
Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
 +
value;
 +
}
 +
 
 +
function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
 +
var i = extra === ( isBorderBox ? "border" : "content" ) ?
 +
 
 +
// If we already have the right measurement, avoid augmentation
 +
4 :
 +
 
 +
// Otherwise initialize for horizontal or vertical properties
 +
name === "width" ? 1 : 0,
 +
 
 +
val = 0;
 +
 
 +
for ( ; i < 4; i += 2 ) {
 +
 
 +
// both box models exclude margin, so add it if we want it
 +
if ( extra === "margin" ) {
 +
val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
 +
}
 +
 
 +
if ( isBorderBox ) {
 +
 
 +
// border-box includes padding, so remove it if we want content
 +
if ( extra === "content" ) {
 +
val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
 +
}
 +
 
 +
// at this point, extra isn't border nor margin, so remove border
 +
if ( extra !== "margin" ) {
 +
val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
 +
}
 +
} else {
 +
 
 +
// at this point, extra isn't content, so add padding
 +
val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
 +
 
 +
// at this point, extra isn't content nor padding, so add border
 +
if ( extra !== "padding" ) {
 +
val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
 +
}
 +
}
 +
}
 +
 
 +
return val;
 +
}
 +
 
 +
function getWidthOrHeight( elem, name, extra ) {
 +
 
 +
// Start with offset property, which is equivalent to the border-box value
 +
var valueIsBorderBox = true,
 +
val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
 +
styles = getStyles( elem ),
 +
isBorderBox = support.boxSizing &&
 +
jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
 +
 
 +
// some non-html elements return undefined for offsetWidth, so check for null/undefined
 +
// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
 +
// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
 +
if ( val <= 0 || val == null ) {
 +
 
 +
// Fall back to computed then uncomputed css if necessary
 +
val = curCSS( elem, name, styles );
 +
if ( val < 0 || val == null ) {
 +
val = elem.style[ name ];
 +
}
 +
 
 +
// Computed unit is not pixels. Stop here and return.
 +
if ( rnumnonpx.test( val ) ) {
 +
return val;
 +
}
 +
 
 +
// we need the check for style in case a browser which returns unreliable values
 +
// for getComputedStyle silently falls back to the reliable elem.style
 +
valueIsBorderBox = isBorderBox &&
 +
( support.boxSizingReliable() || val === elem.style[ name ] );
 +
 
 +
// Normalize "", auto, and prepare for extra
 +
val = parseFloat( val ) || 0;
 +
}
 +
 
 +
// use the active box-sizing model to add/subtract irrelevant styles
 +
return ( val +
 +
augmentWidthOrHeight(
 +
elem,
 +
name,
 +
extra || ( isBorderBox ? "border" : "content" ),
 +
valueIsBorderBox,
 +
styles
 +
)
 +
) + "px";
 +
}
 +
 
 +
jQuery.extend( {
 +
 
 +
// Add in style property hooks for overriding the default
 +
// behavior of getting and setting a style property
 +
cssHooks: {
 +
opacity: {
 +
get: function( elem, computed ) {
 +
if ( computed ) {
 +
 
 +
// We should always get a number back from opacity
 +
var ret = curCSS( elem, "opacity" );
 +
return ret === "" ? "1" : ret;
 +
}
 +
}
 +
}
 +
},
 +
 
 +
// Don't automatically add "px" to these possibly-unitless properties
 +
cssNumber: {
 +
"animationIterationCount": true,
 +
"columnCount": true,
 +
"fillOpacity": true,
 +
"flexGrow": true,
 +
"flexShrink": true,
 +
"fontWeight": true,
 +
"lineHeight": true,
 +
"opacity": true,
 +
"order": true,
 +
"orphans": true,
 +
"widows": true,
 +
"zIndex": true,
 +
"zoom": true
 +
},
 +
 
 +
// Add in properties whose names you wish to fix before
 +
// setting or getting the value
 +
cssProps: {
 +
 
 +
// normalize float css property
 +
"float": support.cssFloat ? "cssFloat" : "styleFloat"
 +
},
 +
 
 +
// Get and set the style property on a DOM Node
 +
style: function( elem, name, value, extra ) {
 +
 
 +
// Don't set styles on text and comment nodes
 +
if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
 +
return;
 +
}
 +
 
 +
// Make sure that we're working with the right name
 +
var ret, type, hooks,
 +
origName = jQuery.camelCase( name ),
 +
style = elem.style;
 +
 
 +
name = jQuery.cssProps[ origName ] ||
 +
( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
 +
 
 +
// gets hook for the prefixed version
 +
// followed by the unprefixed version
 +
hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
 +
 
 +
// Check if we're setting a value
 +
if ( value !== undefined ) {
 +
type = typeof value;
 +
 
 +
// Convert "+=" or "-=" to relative numbers (#7345)
 +
if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
 +
value = adjustCSS( elem, name, ret );
 +
 
 +
// Fixes bug #9237
 +
type = "number";
 +
}
 +
 
 +
// Make sure that null and NaN values aren't set. See: #7116
 +
if ( value == null || value !== value ) {
 +
return;
 +
}
 +
 
 +
// If a number was passed in, add the unit (except for certain CSS properties)
 +
if ( type === "number" ) {
 +
value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
 +
}
 +
 
 +
// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
 +
// but it would mean to define eight
 +
// (for every problematic property) identical functions
 +
if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
 +
style[ name ] = "inherit";
 +
}
 +
 
 +
// If a hook was provided, use that value, otherwise just set the specified value
 +
if ( !hooks || !( "set" in hooks ) ||
 +
( value = hooks.set( elem, value, extra ) ) !== undefined ) {
 +
 
 +
// Support: IE
 +
// Swallow errors from 'invalid' CSS values (#5509)
 +
try {
 +
style[ name ] = value;
 +
} catch ( e ) {}
 +
}
 +
 
 +
} else {
 +
 
 +
// If a hook was provided get the non-computed value from there
 +
if ( hooks && "get" in hooks &&
 +
( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
 +
 
 +
return ret;
 +
}
 +
 
 +
// Otherwise just get the value from the style object
 +
return style[ name ];
 +
}
 +
},
 +
 
 +
css: function( elem, name, extra, styles ) {
 +
var num, val, hooks,
 +
origName = jQuery.camelCase( name );
 +
 
 +
// Make sure that we're working with the right name
 +
name = jQuery.cssProps[ origName ] ||
 +
( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
 +
 
 +
// gets hook for the prefixed version
 +
// followed by the unprefixed version
 +
hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
 +
 
 +
// If a hook was provided get the computed value from there
 +
if ( hooks && "get" in hooks ) {
 +
val = hooks.get( elem, true, extra );
 +
}
 +
 
 +
// Otherwise, if a way to get the computed value exists, use that
 +
if ( val === undefined ) {
 +
val = curCSS( elem, name, styles );
 +
}
 +
 
 +
//convert "normal" to computed value
 +
if ( val === "normal" && name in cssNormalTransform ) {
 +
val = cssNormalTransform[ name ];
 +
}
 +
 
 +
// Return, converting to number if forced or a qualifier was provided and val looks numeric
 +
if ( extra === "" || extra ) {
 +
num = parseFloat( val );
 +
return extra === true || isFinite( num ) ? num || 0 : val;
 +
}
 +
return val;
 +
}
 +
} );
 +
 
 +
jQuery.each( [ "height", "width" ], function( i, name ) {
 +
jQuery.cssHooks[ name ] = {
 +
get: function( elem, computed, extra ) {
 +
if ( computed ) {
 +
 
 +
// certain elements can have dimension info if we invisibly show them
 +
// however, it must have a current display style that would benefit from this
 +
return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
 +
elem.offsetWidth === 0 ?
 +
swap( elem, cssShow, function() {
 +
return getWidthOrHeight( elem, name, extra );
 +
} ) :
 +
getWidthOrHeight( elem, name, extra );
 +
}
 +
},
 +
 
 +
set: function( elem, value, extra ) {
 +
var styles = extra && getStyles( elem );
 +
return setPositiveNumber( elem, value, extra ?
 +
augmentWidthOrHeight(
 +
elem,
 +
name,
 +
extra,
 +
support.boxSizing &&
 +
jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
 +
styles
 +
) : 0
 +
);
 +
}
 +
};
 +
} );
 +
 
 +
if ( !support.opacity ) {
 +
jQuery.cssHooks.opacity = {
 +
get: function( elem, computed ) {
 +
 
 +
// IE uses filters for opacity
 +
return ropacity.test( ( computed && elem.currentStyle ?
 +
elem.currentStyle.filter :
 +
elem.style.filter ) || "" ) ?
 +
( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
 +
computed ? "1" : "";
 +
},
 +
 
 +
set: function( elem, value ) {
 +
var style = elem.style,
 +
currentStyle = elem.currentStyle,
 +
opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
 +
filter = currentStyle && currentStyle.filter || style.filter || "";
 +
 
 +
// IE has trouble with opacity if it does not have layout
 +
// Force it by setting the zoom level
 +
style.zoom = 1;
 +
 
 +
// if setting opacity to 1, and no other filters exist -
 +
// attempt to remove filter attribute #6652
 +
// if value === "", then remove inline opacity #12685
 +
if ( ( value >= 1 || value === "" ) &&
 +
jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
 +
style.removeAttribute ) {
 +
 
 +
// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
 +
// if "filter:" is present at all, clearType is disabled, we want to avoid this
 +
// style.removeAttribute is IE Only, but so apparently is this code path...
 +
style.removeAttribute( "filter" );
 +
 
 +
// if there is no filter style applied in a css rule
 +
// or unset inline opacity, we are done
 +
if ( value === "" || currentStyle && !currentStyle.filter ) {
 +
return;
 +
}
 +
}
 +
 
 +
// otherwise, set new filter values
 +
style.filter = ralpha.test( filter ) ?
 +
filter.replace( ralpha, opacity ) :
 +
filter + " " + opacity;
 +
}
 +
};
 +
}
 +
 
 +
jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
 +
function( elem, computed ) {
 +
if ( computed ) {
 +
return swap( elem, { "display": "inline-block" },
 +
curCSS, [ elem, "marginRight" ] );
 +
}
 +
}
 +
);
 +
 
 +
jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
 +
function( elem, computed ) {
 +
if ( computed ) {
 +
return (
 +
parseFloat( curCSS( elem, "marginLeft" ) ) ||
 +
 
 +
// Support: IE<=11+
 +
// Running getBoundingClientRect on a disconnected node in IE throws an error
 +
// Support: IE8 only
 +
// getClientRects() errors on disconnected elems
 +
( jQuery.contains( elem.ownerDocument, elem ) ?
 +
elem.getBoundingClientRect().left -
 +
swap( elem, { marginLeft: 0 }, function() {
 +
return elem.getBoundingClientRect().left;
 +
} ) :
 +
0
 +
)
 +
) + "px";
 +
}
 +
}
 +
);
 +
 
 +
// These hooks are used by animate to expand properties
 +
jQuery.each( {
 +
margin: "",
 +
padding: "",
 +
border: "Width"
 +
}, function( prefix, suffix ) {
 +
jQuery.cssHooks[ prefix + suffix ] = {
 +
expand: function( value ) {
 +
var i = 0,
 +
expanded = {},
 +
 
 +
// assumes a single number if not a string
 +
parts = typeof value === "string" ? value.split( " " ) : [ value ];
 +
 
 +
for ( ; i < 4; i++ ) {
 +
expanded[ prefix + cssExpand[ i ] + suffix ] =
 +
parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
 +
}
 +
 
 +
return expanded;
 +
}
 +
};
 +
 
 +
if ( !rmargin.test( prefix ) ) {
 +
jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
 +
}
 +
} );
 +
 
 +
jQuery.fn.extend( {
 +
css: function( name, value ) {
 +
return access( this, function( elem, name, value ) {
 +
var styles, len,
 +
map = {},
 +
i = 0;
 +
 
 +
if ( jQuery.isArray( name ) ) {
 +
styles = getStyles( elem );
 +
len = name.length;
 +
 
 +
for ( ; i < len; i++ ) {
 +
map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
 +
}
 +
 
 +
return map;
 +
}
 +
 
 +
return value !== undefined ?
 +
jQuery.style( elem, name, value ) :
 +
jQuery.css( elem, name );
 +
}, name, value, arguments.length > 1 );
 +
},
 +
show: function() {
 +
return showHide( this, true );
 +
},
 +
hide: function() {
 +
return showHide( this );
 +
},
 +
toggle: function( state ) {
 +
if ( typeof state === "boolean" ) {
 +
return state ? this.show() : this.hide();
 +
}
 +
 
 +
return this.each( function() {
 +
if ( isHidden( this ) ) {
 +
jQuery( this ).show();
 +
} else {
 +
jQuery( this ).hide();
 +
}
 +
} );
 +
}
 +
} );
 +
 
 +
 
 +
function Tween( elem, options, prop, end, easing ) {
 +
return new Tween.prototype.init( elem, options, prop, end, easing );
 +
}
 +
jQuery.Tween = Tween;
 +
 
 +
Tween.prototype = {
 +
constructor: Tween,
 +
init: function( elem, options, prop, end, easing, unit ) {
 +
this.elem = elem;
 +
this.prop = prop;
 +
this.easing = easing || jQuery.easing._default;
 +
this.options = options;
 +
this.start = this.now = this.cur();
 +
this.end = end;
 +
this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
 +
},
 +
cur: function() {
 +
var hooks = Tween.propHooks[ this.prop ];
 +
 
 +
return hooks && hooks.get ?
 +
hooks.get( this ) :
 +
Tween.propHooks._default.get( this );
 +
},
 +
run: function( percent ) {
 +
var eased,
 +
hooks = Tween.propHooks[ this.prop ];
 +
 
 +
if ( this.options.duration ) {
 +
this.pos = eased = jQuery.easing[ this.easing ](
 +
percent, this.options.duration * percent, 0, 1, this.options.duration
 +
);
 +
} else {
 +
this.pos = eased = percent;
 +
}
 +
this.now = ( this.end - this.start ) * eased + this.start;
 +
 
 +
if ( this.options.step ) {
 +
this.options.step.call( this.elem, this.now, this );
 +
}
 +
 
 +
if ( hooks && hooks.set ) {
 +
hooks.set( this );
 +
} else {
 +
Tween.propHooks._default.set( this );
 +
}
 +
return this;
 +
}
 +
};
 +
 
 +
Tween.prototype.init.prototype = Tween.prototype;
 +
 
 +
Tween.propHooks = {
 +
_default: {
 +
get: function( tween ) {
 +
var result;
 +
 
 +
// Use a property on the element directly when it is not a DOM element,
 +
// or when there is no matching style property that exists.
 +
if ( tween.elem.nodeType !== 1 ||
 +
tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
 +
return tween.elem[ tween.prop ];
 +
}
 +
 
 +
// passing an empty string as a 3rd parameter to .css will automatically
 +
// attempt a parseFloat and fallback to a string if the parse fails
 +
// so, simple values such as "10px" are parsed to Float.
 +
// complex values such as "rotate(1rad)" are returned as is.
 +
result = jQuery.css( tween.elem, tween.prop, "" );
 +
 
 +
// Empty strings, null, undefined and "auto" are converted to 0.
 +
return !result || result === "auto" ? 0 : result;
 +
},
 +
set: function( tween ) {
 +
 
 +
// use step hook for back compat - use cssHook if its there - use .style if its
 +
// available and use plain properties where available
 +
if ( jQuery.fx.step[ tween.prop ] ) {
 +
jQuery.fx.step[ tween.prop ]( tween );
 +
} else if ( tween.elem.nodeType === 1 &&
 +
( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
 +
jQuery.cssHooks[ tween.prop ] ) ) {
 +
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
 +
} else {
 +
tween.elem[ tween.prop ] = tween.now;
 +
}
 +
}
 +
}
 +
};
 +
 
 +
// Support: IE <=9
 +
// Panic based approach to setting things on disconnected nodes
 +
 
 +
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
 +
set: function( tween ) {
 +
if ( tween.elem.nodeType && tween.elem.parentNode ) {
 +
tween.elem[ tween.prop ] = tween.now;
 +
}
 +
}
 +
};
 +
 
 +
jQuery.easing = {
 +
linear: function( p ) {
 +
return p;
 +
},
 +
swing: function( p ) {
 +
return 0.5 - Math.cos( p * Math.PI ) / 2;
 +
},
 +
_default: "swing"
 +
};
 +
 
 +
jQuery.fx = Tween.prototype.init;
 +
 
 +
// Back Compat <1.8 extension point
 +
jQuery.fx.step = {};
 +
 
 +
 
 +
 
 +
 
 +
var
 +
fxNow, timerId,
 +
rfxtypes = /^(?:toggle|show|hide)$/,
 +
rrun = /queueHooks$/;
 +
 
 +
// Animations created synchronously will run synchronously
 +
function createFxNow() {
 +
window.setTimeout( function() {
 +
fxNow = undefined;
 +
} );
 +
return ( fxNow = jQuery.now() );
 +
}
 +
 
 +
// Generate parameters to create a standard animation
 +
function genFx( type, includeWidth ) {
 +
var which,
 +
attrs = { height: type },
 +
i = 0;
 +
 
 +
// if we include width, step value is 1 to do all cssExpand values,
 +
// if we don't include width, step value is 2 to skip over Left and Right
 +
includeWidth = includeWidth ? 1 : 0;
 +
for ( ; i < 4 ; i += 2 - includeWidth ) {
 +
which = cssExpand[ i ];
 +
attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
 +
}
 +
 
 +
if ( includeWidth ) {
 +
attrs.opacity = attrs.width = type;
 +
}
 +
 
 +
return attrs;
 +
}
 +
 
 +
function createTween( value, prop, animation ) {
 +
var tween,
 +
collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
 +
index = 0,
 +
length = collection.length;
 +
for ( ; index < length; index++ ) {
 +
if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
 +
 
 +
// we're done with this property
 +
return tween;
 +
}
 +
}
 +
}
 +
 
 +
function defaultPrefilter( elem, props, opts ) {
 +
/* jshint validthis: true */
 +
var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
 +
anim = this,
 +
orig = {},
 +
style = elem.style,
 +
hidden = elem.nodeType && isHidden( elem ),
 +
dataShow = jQuery._data( elem, "fxshow" );
 +
 
 +
// handle queue: false promises
 +
if ( !opts.queue ) {
 +
hooks = jQuery._queueHooks( elem, "fx" );
 +
if ( hooks.unqueued == null ) {
 +
hooks.unqueued = 0;
 +
oldfire = hooks.empty.fire;
 +
hooks.empty.fire = function() {
 +
if ( !hooks.unqueued ) {
 +
oldfire();
 +
}
 +
};
 +
}
 +
hooks.unqueued++;
 +
 
 +
anim.always( function() {
 +
 
 +
// doing this makes sure that the complete handler will be called
 +
// before this completes
 +
anim.always( function() {
 +
hooks.unqueued--;
 +
if ( !jQuery.queue( elem, "fx" ).length ) {
 +
hooks.empty.fire();
 +
}
 +
} );
 +
} );
 +
}
 +
 
 +
// height/width overflow pass
 +
if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
 +
 
 +
// Make sure that nothing sneaks out
 +
// Record all 3 overflow attributes because IE does not
 +
// change the overflow attribute when overflowX and
 +
// overflowY are set to the same value
 +
opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
 +
 
 +
// Set display property to inline-block for height/width
 +
// animations on inline elements that are having width/height animated
 +
display = jQuery.css( elem, "display" );
 +
 
 +
// Test default display if display is currently "none"
 +
checkDisplay = display === "none" ?
 +
jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
 +
 
 +
if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
 +
 
 +
// inline-level elements accept inline-block;
 +
// block-level elements need to be inline with layout
 +
if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) {
 +
style.display = "inline-block";
 +
} else {
 +
style.zoom = 1;
 +
}
 +
}
 +
}
 +
 
 +
if ( opts.overflow ) {
 +
style.overflow = "hidden";
 +
if ( !support.shrinkWrapBlocks() ) {
 +
anim.always( function() {
 +
style.overflow = opts.overflow[ 0 ];
 +
style.overflowX = opts.overflow[ 1 ];
 +
style.overflowY = opts.overflow[ 2 ];
 +
} );
 +
}
 +
}
 +
 
 +
// show/hide pass
 +
for ( prop in props ) {
 +
value = props[ prop ];
 +
if ( rfxtypes.exec( value ) ) {
 +
delete props[ prop ];
 +
toggle = toggle || value === "toggle";
 +
if ( value === ( hidden ? "hide" : "show" ) ) {
 +
 
 +
// If there is dataShow left over from a stopped hide or show
 +
// and we are going to proceed with show, we should pretend to be hidden
 +
if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
 +
hidden = true;
 +
} else {
 +
continue;
 +
}
 +
}
 +
orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
 +
 
 +
// Any non-fx value stops us from restoring the original display value
 +
} else {
 +
display = undefined;
 +
}
 +
}
 +
 
 +
if ( !jQuery.isEmptyObject( orig ) ) {
 +
if ( dataShow ) {
 +
if ( "hidden" in dataShow ) {
 +
hidden = dataShow.hidden;
 +
}
 +
} else {
 +
dataShow = jQuery._data( elem, "fxshow", {} );
 +
}
 +
 
 +
// store state if its toggle - enables .stop().toggle() to "reverse"
 +
if ( toggle ) {
 +
dataShow.hidden = !hidden;
 +
}
 +
if ( hidden ) {
 +
jQuery( elem ).show();
 +
} else {
 +
anim.done( function() {
 +
jQuery( elem ).hide();
 +
} );
 +
}
 +
anim.done( function() {
 +
var prop;
 +
jQuery._removeData( elem, "fxshow" );
 +
for ( prop in orig ) {
 +
jQuery.style( elem, prop, orig[ prop ] );
 +
}
 +
} );
 +
for ( prop in orig ) {
 +
tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
 +
 
 +
if ( !( prop in dataShow ) ) {
 +
dataShow[ prop ] = tween.start;
 +
if ( hidden ) {
 +
tween.end = tween.start;
 +
tween.start = prop === "width" || prop === "height" ? 1 : 0;
 +
}
 +
}
 +
}
 +
 
 +
// If this is a noop like .hide().hide(), restore an overwritten display value
 +
} else if ( ( display === "none" ? defaultDisplay( elem.nodeName ) : display ) === "inline" ) {
 +
style.display = display;
 +
}
 +
}
 +
 
 +
function propFilter( props, specialEasing ) {
 +
var index, name, easing, value, hooks;
 +
 
 +
// camelCase, specialEasing and expand cssHook pass
 +
for ( index in props ) {
 +
name = jQuery.camelCase( index );
 +
easing = specialEasing[ name ];
 +
value = props[ index ];
 +
if ( jQuery.isArray( value ) ) {
 +
easing = value[ 1 ];
 +
value = props[ index ] = value[ 0 ];
 +
}
 +
 
 +
if ( index !== name ) {
 +
props[ name ] = value;
 +
delete props[ index ];
 +
}
 +
 
 +
hooks = jQuery.cssHooks[ name ];
 +
if ( hooks && "expand" in hooks ) {
 +
value = hooks.expand( value );
 +
delete props[ name ];
 +
 
 +
// not quite $.extend, this wont overwrite keys already present.
 +
// also - reusing 'index' from above because we have the correct "name"
 +
for ( index in value ) {
 +
if ( !( index in props ) ) {
 +
props[ index ] = value[ index ];
 +
specialEasing[ index ] = easing;
 +
}
 +
}
 +
} else {
 +
specialEasing[ name ] = easing;
 +
}
 +
}
 +
}
 +
 
 +
function Animation( elem, properties, options ) {
 +
var result,
 +
stopped,
 +
index = 0,
 +
length = Animation.prefilters.length,
 +
deferred = jQuery.Deferred().always( function() {
 +
 
 +
// don't match elem in the :animated selector
 +
delete tick.elem;
 +
} ),
 +
tick = function() {
 +
if ( stopped ) {
 +
return false;
 +
}
 +
var currentTime = fxNow || createFxNow(),
 +
remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
 +
 
 +
// Support: Android 2.3
 +
// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
 +
temp = remaining / animation.duration || 0,
 +
percent = 1 - temp,
 +
index = 0,
 +
length = animation.tweens.length;
 +
 
 +
for ( ; index < length ; index++ ) {
 +
animation.tweens[ index ].run( percent );
 +
}
 +
 
 +
deferred.notifyWith( elem, [ animation, percent, remaining ] );
 +
 
 +
if ( percent < 1 && length ) {
 +
return remaining;
 +
} else {
 +
deferred.resolveWith( elem, [ animation ] );
 +
return false;
 +
}
 +
},
 +
animation = deferred.promise( {
 +
elem: elem,
 +
props: jQuery.extend( {}, properties ),
 +
opts: jQuery.extend( true, {
 +
specialEasing: {},
 +
easing: jQuery.easing._default
 +
}, options ),
 +
originalProperties: properties,
 +
originalOptions: options,
 +
startTime: fxNow || createFxNow(),
 +
duration: options.duration,
 +
tweens: [],
 +
createTween: function( prop, end ) {
 +
var tween = jQuery.Tween( elem, animation.opts, prop, end,
 +
animation.opts.specialEasing[ prop ] || animation.opts.easing );
 +
animation.tweens.push( tween );
 +
return tween;
 +
},
 +
stop: function( gotoEnd ) {
 +
var index = 0,
 +
 
 +
// if we are going to the end, we want to run all the tweens
 +
// otherwise we skip this part
 +
length = gotoEnd ? animation.tweens.length : 0;
 +
if ( stopped ) {
 +
return this;
 +
}
 +
stopped = true;
 +
for ( ; index < length ; index++ ) {
 +
animation.tweens[ index ].run( 1 );
 +
}
 +
 
 +
// resolve when we played the last frame
 +
// otherwise, reject
 +
if ( gotoEnd ) {
 +
deferred.notifyWith( elem, [ animation, 1, 0 ] );
 +
deferred.resolveWith( elem, [ animation, gotoEnd ] );
 +
} else {
 +
deferred.rejectWith( elem, [ animation, gotoEnd ] );
 +
}
 +
return this;
 +
}
 +
} ),
 +
props = animation.props;
 +
 
 +
propFilter( props, animation.opts.specialEasing );
 +
 
 +
for ( ; index < length ; index++ ) {
 +
result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
 +
if ( result ) {
 +
if ( jQuery.isFunction( result.stop ) ) {
 +
jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
 +
jQuery.proxy( result.stop, result );
 +
}
 +
return result;
 +
}
 +
}
 +
 
 +
jQuery.map( props, createTween, animation );
 +
 
 +
if ( jQuery.isFunction( animation.opts.start ) ) {
 +
animation.opts.start.call( elem, animation );
 +
}
 +
 
 +
jQuery.fx.timer(
 +
jQuery.extend( tick, {
 +
elem: elem,
 +
anim: animation,
 +
queue: animation.opts.queue
 +
} )
 +
);
 +
 
 +
// attach callbacks from options
 +
return animation.progress( animation.opts.progress )
 +
.done( animation.opts.done, animation.opts.complete )
 +
.fail( animation.opts.fail )
 +
.always( animation.opts.always );
 +
}
 +
 
 +
jQuery.Animation = jQuery.extend( Animation, {
 +
 
 +
tweeners: {
 +
"*": [ function( prop, value ) {
 +
var tween = this.createTween( prop, value );
 +
adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
 +
return tween;
 +
} ]
 +
},
 +
 
 +
tweener: function( props, callback ) {
 +
if ( jQuery.isFunction( props ) ) {
 +
callback = props;
 +
props = [ "*" ];
 +
} else {
 +
props = props.match( rnotwhite );
 +
}
 +
 
 +
var prop,
 +
index = 0,
 +
length = props.length;
 +
 
 +
for ( ; index < length ; index++ ) {
 +
prop = props[ index ];
 +
Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
 +
Animation.tweeners[ prop ].unshift( callback );
 +
}
 +
},
 +
 
 +
prefilters: [ defaultPrefilter ],
 +
 
 +
prefilter: function( callback, prepend ) {
 +
if ( prepend ) {
 +
Animation.prefilters.unshift( callback );
 +
} else {
 +
Animation.prefilters.push( callback );
 +
}
 +
}
 +
} );
 +
 
 +
jQuery.speed = function( speed, easing, fn ) {
 +
var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
 +
complete: fn || !fn && easing ||
 +
jQuery.isFunction( speed ) && speed,
 +
duration: speed,
 +
easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
 +
};
 +
 
 +
opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
 +
opt.duration in jQuery.fx.speeds ?
 +
jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
 +
 
 +
// normalize opt.queue - true/undefined/null -> "fx"
 +
if ( opt.queue == null || opt.queue === true ) {
 +
opt.queue = "fx";
 +
}
 +
 
 +
// Queueing
 +
opt.old = opt.complete;
 +
 
 +
opt.complete = function() {
 +
if ( jQuery.isFunction( opt.old ) ) {
 +
opt.old.call( this );
 +
}
 +
 
 +
if ( opt.queue ) {
 +
jQuery.dequeue( this, opt.queue );
 +
}
 +
};
 +
 
 +
return opt;
 +
};
 +
 
 +
jQuery.fn.extend( {
 +
fadeTo: function( speed, to, easing, callback ) {
 +
 
 +
// show any hidden elements after setting opacity to 0
 +
return this.filter( isHidden ).css( "opacity", 0 ).show()
 +
 
 +
// animate to the value specified
 +
.end().animate( { opacity: to }, speed, easing, callback );
 +
},
 +
animate: function( prop, speed, easing, callback ) {
 +
var empty = jQuery.isEmptyObject( prop ),
 +
optall = jQuery.speed( speed, easing, callback ),
 +
doAnimation = function() {
 +
 
 +
// Operate on a copy of prop so per-property easing won't be lost
 +
var anim = Animation( this, jQuery.extend( {}, prop ), optall );
 +
 
 +
// Empty animations, or finishing resolves immediately
 +
if ( empty || jQuery._data( this, "finish" ) ) {
 +
anim.stop( true );
 +
}
 +
};
 +
doAnimation.finish = doAnimation;
 +
 
 +
return empty || optall.queue === false ?
 +
this.each( doAnimation ) :
 +
this.queue( optall.queue, doAnimation );
 +
},
 +
stop: function( type, clearQueue, gotoEnd ) {
 +
var stopQueue = function( hooks ) {
 +
var stop = hooks.stop;
 +
delete hooks.stop;
 +
stop( gotoEnd );
 +
};
 +
 
 +
if ( typeof type !== "string" ) {
 +
gotoEnd = clearQueue;
 +
clearQueue = type;
 +
type = undefined;
 +
}
 +
if ( clearQueue && type !== false ) {
 +
this.queue( type || "fx", [] );
 +
}
 +
 
 +
return this.each( function() {
 +
var dequeue = true,
 +
index = type != null && type + "queueHooks",
 +
timers = jQuery.timers,
 +
data = jQuery._data( this );
 +
 
 +
if ( index ) {
 +
if ( data[ index ] && data[ index ].stop ) {
 +
stopQueue( data[ index ] );
 +
}
 +
} else {
 +
for ( index in data ) {
 +
if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
 +
stopQueue( data[ index ] );
 +
}
 +
}
 +
}
 +
 
 +
for ( index = timers.length; index--; ) {
 +
if ( timers[ index ].elem === this &&
 +
( type == null || timers[ index ].queue === type ) ) {
 +
 
 +
timers[ index ].anim.stop( gotoEnd );
 +
dequeue = false;
 +
timers.splice( index, 1 );
 +
}
 +
}
 +
 
 +
// start the next in the queue if the last step wasn't forced
 +
// timers currently will call their complete callbacks, which will dequeue
 +
// but only if they were gotoEnd
 +
if ( dequeue || !gotoEnd ) {
 +
jQuery.dequeue( this, type );
 +
}
 +
} );
 +
},
 +
finish: function( type ) {
 +
if ( type !== false ) {
 +
type = type || "fx";
 +
}
 +
return this.each( function() {
 +
var index,
 +
data = jQuery._data( this ),
 +
queue = data[ type + "queue" ],
 +
hooks = data[ type + "queueHooks" ],
 +
timers = jQuery.timers,
 +
length = queue ? queue.length : 0;
 +
 
 +
// enable finishing flag on private data
 +
data.finish = true;
 +
 
 +
// empty the queue first
 +
jQuery.queue( this, type, [] );
 +
 
 +
if ( hooks && hooks.stop ) {
 +
hooks.stop.call( this, true );
 +
}
 +
 
 +
// look for any active animations, and finish them
 +
for ( index = timers.length; index--; ) {
 +
if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
 +
timers[ index ].anim.stop( true );
 +
timers.splice( index, 1 );
 +
}
 +
}
 +
 
 +
// look for any animations in the old queue and finish them
 +
for ( index = 0; index < length; index++ ) {
 +
if ( queue[ index ] && queue[ index ].finish ) {
 +
queue[ index ].finish.call( this );
 +
}
 +
}
 +
 
 +
// turn off finishing flag
 +
delete data.finish;
 +
} );
 +
}
 +
} );
 +
 
 +
jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
 +
var cssFn = jQuery.fn[ name ];
 +
jQuery.fn[ name ] = function( speed, easing, callback ) {
 +
return speed == null || typeof speed === "boolean" ?
 +
cssFn.apply( this, arguments ) :
 +
this.animate( genFx( name, true ), speed, easing, callback );
 +
};
 +
} );
 +
 
 +
// Generate shortcuts for custom animations
 +
jQuery.each( {
 +
slideDown: genFx( "show" ),
 +
slideUp: genFx( "hide" ),
 +
slideToggle: genFx( "toggle" ),
 +
fadeIn: { opacity: "show" },
 +
fadeOut: { opacity: "hide" },
 +
fadeToggle: { opacity: "toggle" }
 +
}, function( name, props ) {
 +
jQuery.fn[ name ] = function( speed, easing, callback ) {
 +
return this.animate( props, speed, easing, callback );
 +
};
 +
} );
 +
 
 +
jQuery.timers = [];
 +
jQuery.fx.tick = function() {
 +
var timer,
 +
timers = jQuery.timers,
 +
i = 0;
 +
 
 +
fxNow = jQuery.now();
 +
 
 +
for ( ; i < timers.length; i++ ) {
 +
timer = timers[ i ];
 +
 
 +
// Checks the timer has not already been removed
 +
if ( !timer() && timers[ i ] === timer ) {
 +
timers.splice( i--, 1 );
 +
}
 +
}
 +
 
 +
if ( !timers.length ) {
 +
jQuery.fx.stop();
 +
}
 +
fxNow = undefined;
 +
};
 +
 
 +
jQuery.fx.timer = function( timer ) {
 +
jQuery.timers.push( timer );
 +
if ( timer() ) {
 +
jQuery.fx.start();
 +
} else {
 +
jQuery.timers.pop();
 +
}
 +
};
 +
 
 +
jQuery.fx.interval = 13;
 +
 
 +
jQuery.fx.start = function() {
 +
if ( !timerId ) {
 +
timerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
 +
}
 +
};
 +
 
 +
jQuery.fx.stop = function() {
 +
window.clearInterval( timerId );
 +
timerId = null;
 +
};
 +
 
 +
jQuery.fx.speeds = {
 +
slow: 600,
 +
fast: 200,
 +
 
 +
// Default speed
 +
_default: 400
 +
};
 +
 
 +
 
 +
// Based off of the plugin by Clint Helfers, with permission.
 +
// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
 +
jQuery.fn.delay = function( time, type ) {
 +
time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
 +
type = type || "fx";
 +
 
 +
return this.queue( type, function( next, hooks ) {
 +
var timeout = window.setTimeout( next, time );
 +
hooks.stop = function() {
 +
window.clearTimeout( timeout );
 +
};
 +
} );
 +
};
 +
 
 +
 
 +
( function() {
 +
var a,
 +
input = document.createElement( "input" ),
 +
div = document.createElement( "div" ),
 +
select = document.createElement( "select" ),
 +
opt = select.appendChild( document.createElement( "option" ) );
 +
 
 +
// Setup
 +
div = document.createElement( "div" );
 +
div.setAttribute( "className", "t" );
 +
div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
 +
a = div.getElementsByTagName( "a" )[ 0 ];
 +
 
 +
// Support: Windows Web Apps (WWA)
 +
// `type` must use .setAttribute for WWA (#14901)
 +
input.setAttribute( "type", "checkbox" );
 +
div.appendChild( input );
 +
 
 +
a = div.getElementsByTagName( "a" )[ 0 ];
 +
 
 +
// First batch of tests.
 +
a.style.cssText = "top:1px";
 +
 
 +
// Test setAttribute on camelCase class.
 +
// If it works, we need attrFixes when doing get/setAttribute (ie6/7)
 +
support.getSetAttribute = div.className !== "t";
 +
 
 +
// Get the style information from getAttribute
 +
// (IE uses .cssText instead)
 +
support.style = /top/.test( a.getAttribute( "style" ) );
 +
 
 +
// Make sure that URLs aren't manipulated
 +
// (IE normalizes it by default)
 +
support.hrefNormalized = a.getAttribute( "href" ) === "/a";
 +
 
 +
// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
 +
support.checkOn = !!input.value;
 +
 
 +
// Make sure that a selected-by-default option has a working selected property.
 +
// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
 +
support.optSelected = opt.selected;
 +
 
 +
// Tests for enctype support on a form (#6743)
 +
support.enctype = !!document.createElement( "form" ).enctype;
 +
 
 +
// Make sure that the options inside disabled selects aren't marked as disabled
 +
// (WebKit marks them as disabled)
 +
select.disabled = true;
 +
support.optDisabled = !opt.disabled;
 +
 
 +
// Support: IE8 only
 +
// Check if we can trust getAttribute("value")
 +
input = document.createElement( "input" );
 +
input.setAttribute( "value", "" );
 +
support.input = input.getAttribute( "value" ) === "";
 +
 
 +
// Check if an input maintains its value after becoming a radio
 +
input.value = "t";
 +
input.setAttribute( "type", "radio" );
 +
support.radioValue = input.value === "t";
 +
} )();
 +
 
 +
 
 +
var rreturn = /\r/g,
 +
rspaces = /[\x20\t\r\n\f]+/g;
 +
 
 +
jQuery.fn.extend( {
 +
val: function( value ) {
 +
var hooks, ret, isFunction,
 +
elem = this[ 0 ];
 +
 
 +
if ( !arguments.length ) {
 +
if ( elem ) {
 +
hooks = jQuery.valHooks[ elem.type ] ||
 +
jQuery.valHooks[ elem.nodeName.toLowerCase() ];
 +
 
 +
if (
 +
hooks &&
 +
"get" in hooks &&
 +
( ret = hooks.get( elem, "value" ) ) !== undefined
 +
) {
 +
return ret;
 +
}
 +
 
 +
ret = elem.value;
 +
 
 +
return typeof ret === "string" ?
 +
 
 +
// handle most common string cases
 +
ret.replace( rreturn, "" ) :
 +
 
 +
// handle cases where value is null/undef or number
 +
ret == null ? "" : ret;
 +
}
 +
 
 +
return;
 +
}
 +
 
 +
isFunction = jQuery.isFunction( value );
 +
 
 +
return this.each( function( i ) {
 +
var val;
 +
 
 +
if ( this.nodeType !== 1 ) {
 +
return;
 +
}
 +
 
 +
if ( isFunction ) {
 +
val = value.call( this, i, jQuery( this ).val() );
 +
} else {
 +
val = value;
 +
}
 +
 
 +
// Treat null/undefined as ""; convert numbers to string
 +
if ( val == null ) {
 +
val = "";
 +
} else if ( typeof val === "number" ) {
 +
val += "";
 +
} else if ( jQuery.isArray( val ) ) {
 +
val = jQuery.map( val, function( value ) {
 +
return value == null ? "" : value + "";
 +
} );
 +
}
 +
 
 +
hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
 +
 
 +
// If set returns undefined, fall back to normal setting
 +
if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
 +
this.value = val;
 +
}
 +
} );
 +
}
 +
} );
 +
 
 +
jQuery.extend( {
 +
valHooks: {
 +
option: {
 +
get: function( elem ) {
 +
var val = jQuery.find.attr( elem, "value" );
 +
return val != null ?
 +
val :
 +
 
 +
// Support: IE10-11+
 +
// option.text throws exceptions (#14686, #14858)
 +
// Strip and collapse whitespace
 +
// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
 +
jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " );
 +
}
 +
},
 +
select: {
 +
get: function( elem ) {
 +
var value, option,
 +
options = elem.options,
 +
index = elem.selectedIndex,
 +
one = elem.type === "select-one" || index < 0,
 +
values = one ? null : [],
 +
max = one ? index + 1 : options.length,
 +
i = index < 0 ?
 +
max :
 +
one ? index : 0;
 +
 
 +
// Loop through all the selected options
 +
for ( ; i < max; i++ ) {
 +
option = options[ i ];
 +
 
 +
// oldIE doesn't update selected after form reset (#2551)
 +
if ( ( option.selected || i === index ) &&
 +
 
 +
// Don't return options that are disabled or in a disabled optgroup
 +
( support.optDisabled ?
 +
!option.disabled :
 +
option.getAttribute( "disabled" ) === null ) &&
 +
( !option.parentNode.disabled ||
 +
!jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
 +
 
 +
// Get the specific value for the option
 +
value = jQuery( option ).val();
 +
 
 +
// We don't need an array for one selects
 +
if ( one ) {
 +
return value;
 +
}
 +
 
 +
// Multi-Selects return an array
 +
values.push( value );
 +
}
 +
}
 +
 
 +
return values;
 +
},
 +
 
 +
set: function( elem, value ) {
 +
var optionSet, option,
 +
options = elem.options,
 +
values = jQuery.makeArray( value ),
 +
i = options.length;
 +
 
 +
while ( i-- ) {
 +
option = options[ i ];
 +
 
 +
if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) {
 +
 
 +
// Support: IE6
 +
// When new option element is added to select box we need to
 +
// force reflow of newly added node in order to workaround delay
 +
// of initialization properties
 +
try {
 +
option.selected = optionSet = true;
 +
 
 +
} catch ( _ ) {
 +
 
 +
// Will be executed only in IE6
 +
option.scrollHeight;
 +
}
 +
 
 +
} else {
 +
option.selected = false;
 +
}
 +
}
 +
 
 +
// Force browsers to behave consistently when non-matching value is set
 +
if ( !optionSet ) {
 +
elem.selectedIndex = -1;
 +
}
 +
 
 +
return options;
 +
}
 +
}
 +
}
 +
} );
 +
 
 +
// Radios and checkboxes getter/setter
 +
jQuery.each( [ "radio", "checkbox" ], function() {
 +
jQuery.valHooks[ this ] = {
 +
set: function( elem, value ) {
 +
if ( jQuery.isArray( value ) ) {
 +
return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
 +
}
 +
}
 +
};
 +
if ( !support.checkOn ) {
 +
jQuery.valHooks[ this ].get = function( elem ) {
 +
return elem.getAttribute( "value" ) === null ? "on" : elem.value;
 +
};
 +
}
 +
} );
 +
 
 +
 
 +
 
 +
 
 +
var nodeHook, boolHook,
 +
attrHandle = jQuery.expr.attrHandle,
 +
ruseDefault = /^(?:checked|selected)$/i,
 +
getSetAttribute = support.getSetAttribute,
 +
getSetInput = support.input;
 +
 
 +
jQuery.fn.extend( {
 +
attr: function( name, value ) {
 +
return access( this, jQuery.attr, name, value, arguments.length > 1 );
 +
},
 +
 
 +
removeAttr: function( name ) {
 +
return this.each( function() {
 +
jQuery.removeAttr( this, name );
 +
} );
 +
}
 +
} );
 +
 
 +
jQuery.extend( {
 +
attr: function( elem, name, value ) {
 +
var ret, hooks,
 +
nType = elem.nodeType;
 +
 
 +
// Don't get/set attributes on text, comment and attribute nodes
 +
if ( nType === 3 || nType === 8 || nType === 2 ) {
 +
return;
 +
}
 +
 
 +
// Fallback to prop when attributes are not supported
 +
if ( typeof elem.getAttribute === "undefined" ) {
 +
return jQuery.prop( elem, name, value );
 +
}
 +
 
 +
// All attributes are lowercase
 +
// Grab necessary hook if one is defined
 +
if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
 +
name = name.toLowerCase();
 +
hooks = jQuery.attrHooks[ name ] ||
 +
( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
 +
}
 +
 
 +
if ( value !== undefined ) {
 +
if ( value === null ) {
 +
jQuery.removeAttr( elem, name );
 +
return;
 +
}
 +
 
 +
if ( hooks && "set" in hooks &&
 +
( ret = hooks.set( elem, value, name ) ) !== undefined ) {
 +
return ret;
 +
}
 +
 
 +
elem.setAttribute( name, value + "" );
 +
return value;
 +
}
 +
 
 +
if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
 +
return ret;
 +
}
 +
 
 +
ret = jQuery.find.attr( elem, name );
 +
 
 +
// Non-existent attributes return null, we normalize to undefined
 +
return ret == null ? undefined : ret;
 +
},
 +
 
 +
attrHooks: {
 +
type: {
 +
set: function( elem, value ) {
 +
if ( !support.radioValue && value === "radio" &&
 +
jQuery.nodeName( elem, "input" ) ) {
 +
 
 +
// Setting the type on a radio button after the value resets the value in IE8-9
 +
// Reset value to default in case type is set after value during creation
 +
var val = elem.value;
 +
elem.setAttribute( "type", value );
 +
if ( val ) {
 +
elem.value = val;
 +
}
 +
return value;
 +
}
 +
}
 +
}
 +
},
 +
 
 +
removeAttr: function( elem, value ) {
 +
var name, propName,
 +
i = 0,
 +
attrNames = value && value.match( rnotwhite );
 +
 
 +
if ( attrNames && elem.nodeType === 1 ) {
 +
while ( ( name = attrNames[ i++ ] ) ) {
 +
propName = jQuery.propFix[ name ] || name;
 +
 
 +
// Boolean attributes get special treatment (#10870)
 +
if ( jQuery.expr.match.bool.test( name ) ) {
 +
 
 +
// Set corresponding property to false
 +
if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
 +
elem[ propName ] = false;
 +
 
 +
// Support: IE<9
 +
// Also clear defaultChecked/defaultSelected (if appropriate)
 +
} else {
 +
elem[ jQuery.camelCase( "default-" + name ) ] =
 +
elem[ propName ] = false;
 +
}
 +
 
 +
// See #9699 for explanation of this approach (setting first, then removal)
 +
} else {
 +
jQuery.attr( elem, name, "" );
 +
}
 +
 
 +
elem.removeAttribute( getSetAttribute ? name : propName );
 +
}
 +
}
 +
}
 +
} );
 +
 
 +
// Hooks for boolean attributes
 +
boolHook = {
 +
set: function( elem, value, name ) {
 +
if ( value === false ) {
 +
 
 +
// Remove boolean attributes when set to false
 +
jQuery.removeAttr( elem, name );
 +
} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
 +
 
 +
// IE<8 needs the *property* name
 +
elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
 +
 
 +
} else {
 +
 
 +
// Support: IE<9
 +
// Use defaultChecked and defaultSelected for oldIE
 +
elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
 +
}
 +
return name;
 +
}
 +
};
 +
 
 +
jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
 +
var getter = attrHandle[ name ] || jQuery.find.attr;
 +
 
 +
if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
 +
attrHandle[ name ] = function( elem, name, isXML ) {
 +
var ret, handle;
 +
if ( !isXML ) {
 +
 
 +
// Avoid an infinite loop by temporarily removing this function from the getter
 +
handle = attrHandle[ name ];
 +
attrHandle[ name ] = ret;
 +
ret = getter( elem, name, isXML ) != null ?
 +
name.toLowerCase() :
 +
null;
 +
attrHandle[ name ] = handle;
 +
}
 +
return ret;
 +
};
 +
} else {
 +
attrHandle[ name ] = function( elem, name, isXML ) {
 +
if ( !isXML ) {
 +
return elem[ jQuery.camelCase( "default-" + name ) ] ?
 +
name.toLowerCase() :
 +
null;
 +
}
 +
};
 +
}
 +
} );
 +
 
 +
// fix oldIE attroperties
 +
if ( !getSetInput || !getSetAttribute ) {
 +
jQuery.attrHooks.value = {
 +
set: function( elem, value, name ) {
 +
if ( jQuery.nodeName( elem, "input" ) ) {
 +
 
 +
// Does not return so that setAttribute is also used
 +
elem.defaultValue = value;
 +
} else {
 +
 
 +
// Use nodeHook if defined (#1954); otherwise setAttribute is fine
 +
return nodeHook && nodeHook.set( elem, value, name );
 +
}
 +
}
 +
};
 +
}
 +
 
 +
// IE6/7 do not support getting/setting some attributes with get/setAttribute
 +
if ( !getSetAttribute ) {
 +
 
 +
// Use this for any attribute in IE6/7
 +
// This fixes almost every IE6/7 issue
 +
nodeHook = {
 +
set: function( elem, value, name ) {
 +
 
 +
// Set the existing or create a new attribute node
 +
var ret = elem.getAttributeNode( name );
 +
if ( !ret ) {
 +
elem.setAttributeNode(
 +
( ret = elem.ownerDocument.createAttribute( name ) )
 +
);
 +
}
 +
 
 +
ret.value = value += "";
 +
 
 +
// Break association with cloned elements by also using setAttribute (#9646)
 +
if ( name === "value" || value === elem.getAttribute( name ) ) {
 +
return value;
 +
}
 +
}
 +
};
 +
 
 +
// Some attributes are constructed with empty-string values when not defined
 +
attrHandle.id = attrHandle.name = attrHandle.coords =
 +
function( elem, name, isXML ) {
 +
var ret;
 +
if ( !isXML ) {
 +
return ( ret = elem.getAttributeNode( name ) ) && ret.value !== "" ?
 +
ret.value :
 +
null;
 +
}
 +
};
 +
 
 +
// Fixing value retrieval on a button requires this module
 +
jQuery.valHooks.button = {
 +
get: function( elem, name ) {
 +
var ret = elem.getAttributeNode( name );
 +
if ( ret && ret.specified ) {
 +
return ret.value;
 +
}
 +
},
 +
set: nodeHook.set
 +
};
 +
 
 +
// Set contenteditable to false on removals(#10429)
 +
// Setting to empty string throws an error as an invalid value
 +
jQuery.attrHooks.contenteditable = {
 +
set: function( elem, value, name ) {
 +
nodeHook.set( elem, value === "" ? false : value, name );
 +
}
 +
};
 +
 
 +
// Set width and height to auto instead of 0 on empty string( Bug #8150 )
 +
// This is for removals
 +
jQuery.each( [ "width", "height" ], function( i, name ) {
 +
jQuery.attrHooks[ name ] = {
 +
set: function( elem, value ) {
 +
if ( value === "" ) {
 +
elem.setAttribute( name, "auto" );
 +
return value;
 +
}
 +
}
 +
};
 +
} );
 +
}
 +
 
 +
if ( !support.style ) {
 +
jQuery.attrHooks.style = {
 +
get: function( elem ) {
 +
 
 +
// Return undefined in the case of empty string
 +
// Note: IE uppercases css property names, but if we were to .toLowerCase()
 +
// .cssText, that would destroy case sensitivity in URL's, like in "background"
 +
return elem.style.cssText || undefined;
 +
},
 +
set: function( elem, value ) {
 +
return ( elem.style.cssText = value + "" );
 +
}
 +
};
 +
}
 +
 
 +
 
 +
 
 +
 
 +
var rfocusable = /^(?:input|select|textarea|button|object)$/i,
 +
rclickable = /^(?:a|area)$/i;
 +
 
 +
jQuery.fn.extend( {
 +
prop: function( name, value ) {
 +
return access( this, jQuery.prop, name, value, arguments.length > 1 );
 +
},
 +
 
 +
removeProp: function( name ) {
 +
name = jQuery.propFix[ name ] || name;
 +
return this.each( function() {
 +
 
 +
// try/catch handles cases where IE balks (such as removing a property on window)
 +
try {
 +
this[ name ] = undefined;
 +
delete this[ name ];
 +
} catch ( e ) {}
 +
} );
 +
}
 +
} );
 +
 
 +
jQuery.extend( {
 +
prop: function( elem, name, value ) {
 +
var ret, hooks,
 +
nType = elem.nodeType;
 +
 
 +
// Don't get/set properties on text, comment and attribute nodes
 +
if ( nType === 3 || nType === 8 || nType === 2 ) {
 +
return;
 +
}
 +
 
 +
if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
 +
 
 +
// Fix name and attach hooks
 +
name = jQuery.propFix[ name ] || name;
 +
hooks = jQuery.propHooks[ name ];
 +
}
 +
 
 +
if ( value !== undefined ) {
 +
if ( hooks && "set" in hooks &&
 +
( ret = hooks.set( elem, value, name ) ) !== undefined ) {
 +
return ret;
 +
}
 +
 
 +
return ( elem[ name ] = value );
 +
}
 +
 
 +
if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
 +
return ret;
 +
}
 +
 
 +
return elem[ name ];
 +
},
 +
 
 +
propHooks: {
 +
tabIndex: {
 +
get: function( elem ) {
 +
 
 +
// elem.tabIndex doesn't always return the
 +
// correct value when it hasn't been explicitly set
 +
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
 +
// Use proper attribute retrieval(#12072)
 +
var tabindex = jQuery.find.attr( elem, "tabindex" );
 +
 
 +
return tabindex ?
 +
parseInt( tabindex, 10 ) :
 +
rfocusable.test( elem.nodeName ) ||
 +
rclickable.test( elem.nodeName ) && elem.href ?
 +
0 :
 +
-1;
 +
}
 +
}
 +
},
 +
 
 +
propFix: {
 +
"for": "htmlFor",
 +
"class": "className"
 +
}
 +
} );
 +
 
 +
// Some attributes require a special call on IE
 +
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
 +
if ( !support.hrefNormalized ) {
 +
 
 +
// href/src property should get the full normalized URL (#10299/#12915)
 +
jQuery.each( [ "href", "src" ], function( i, name ) {
 +
jQuery.propHooks[ name ] = {
 +
get: function( elem ) {
 +
return elem.getAttribute( name, 4 );
 +
}
 +
};
 +
} );
 +
}
 +
 
 +
// Support: Safari, IE9+
 +
// Accessing the selectedIndex property
 +
// forces the browser to respect setting selected
 +
// on the option
 +
// The getter ensures a default option is selected
 +
// when in an optgroup
 +
if ( !support.optSelected ) {
 +
jQuery.propHooks.selected = {
 +
get: function( elem ) {
 +
var parent = elem.parentNode;
 +
 
 +
if ( parent ) {
 +
parent.selectedIndex;
 +
 
 +
// Make sure that it also works with optgroups, see #5701
 +
if ( parent.parentNode ) {
 +
parent.parentNode.selectedIndex;
 +
}
 +
}
 +
return null;
 +
},
 +
set: function( elem ) {
 +
var parent = elem.parentNode;
 +
if ( parent ) {
 +
parent.selectedIndex;
 +
 
 +
if ( parent.parentNode ) {
 +
parent.parentNode.selectedIndex;
 +
}
 +
}
 +
}
 +
};
 +
}
 +
 
 +
jQuery.each( [
 +
"tabIndex",
 +
"readOnly",
 +
"maxLength",
 +
"cellSpacing",
 +
"cellPadding",
 +
"rowSpan",
 +
"colSpan",
 +
"useMap",
 +
"frameBorder",
 +
"contentEditable"
 +
], function() {
 +
jQuery.propFix[ this.toLowerCase() ] = this;
 +
} );
 +
 
 +
// IE6/7 call enctype encoding
 +
if ( !support.enctype ) {
 +
jQuery.propFix.enctype = "encoding";
 +
}
 +
 
 +
 
 +
 
 +
 
 +
var rclass = /[\t\r\n\f]/g;
 +
 
 +
function getClass( elem ) {
 +
return jQuery.attr( elem, "class" ) || "";
 +
}
 +
 
 +
jQuery.fn.extend( {
 +
addClass: function( value ) {
 +
var classes, elem, cur, curValue, clazz, j, finalValue,
 +
i = 0;
 +
 
 +
if ( jQuery.isFunction( value ) ) {
 +
return this.each( function( j ) {
 +
jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
 +
} );
 +
}
 +
 
 +
if ( typeof value === "string" && value ) {
 +
classes = value.match( rnotwhite ) || [];
 +
 
 +
while ( ( elem = this[ i++ ] ) ) {
 +
curValue = getClass( elem );
 +
cur = elem.nodeType === 1 &&
 +
( " " + curValue + " " ).replace( rclass, " " );
 +
 
 +
if ( cur ) {
 +
j = 0;
 +
while ( ( clazz = classes[ j++ ] ) ) {
 +
if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
 +
cur += clazz + " ";
 +
}
 +
}
 +
 
 +
// only assign if different to avoid unneeded rendering.
 +
finalValue = jQuery.trim( cur );
 +
if ( curValue !== finalValue ) {
 +
jQuery.attr( elem, "class", finalValue );
 +
}
 +
}
 +
}
 +
}
 +
 
 +
return this;
 +
},
 +
 
 +
removeClass: function( value ) {
 +
var classes, elem, cur, curValue, clazz, j, finalValue,
 +
i = 0;
 +
 
 +
if ( jQuery.isFunction( value ) ) {
 +
return this.each( function( j ) {
 +
jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
 +
} );
 +
}
 +
 
 +
if ( !arguments.length ) {
 +
return this.attr( "class", "" );
 +
}
 +
 
 +
if ( typeof value === "string" && value ) {
 +
classes = value.match( rnotwhite ) || [];
 +
 
 +
while ( ( elem = this[ i++ ] ) ) {
 +
curValue = getClass( elem );
 +
 
 +
// This expression is here for better compressibility (see addClass)
 +
cur = elem.nodeType === 1 &&
 +
( " " + curValue + " " ).replace( rclass, " " );
 +
 
 +
if ( cur ) {
 +
j = 0;
 +
while ( ( clazz = classes[ j++ ] ) ) {
 +
 
 +
// Remove *all* instances
 +
while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
 +
cur = cur.replace( " " + clazz + " ", " " );
 +
}
 +
}
 +
 
 +
// Only assign if different to avoid unneeded rendering.
 +
finalValue = jQuery.trim( cur );
 +
if ( curValue !== finalValue ) {
 +
jQuery.attr( elem, "class", finalValue );
 +
}
 +
}
 +
}
 +
}
 +
 
 +
return this;
 +
},
 +
 
 +
toggleClass: function( value, stateVal ) {
 +
var type = typeof value;
 +
 
 +
if ( typeof stateVal === "boolean" && type === "string" ) {
 +
return stateVal ? this.addClass( value ) : this.removeClass( value );
 +
}
 +
 
 +
if ( jQuery.isFunction( value ) ) {
 +
return this.each( function( i ) {
 +
jQuery( this ).toggleClass(
 +
value.call( this, i, getClass( this ), stateVal ),
 +
stateVal
 +
);
 +
} );
 +
}
 +
 
 +
return this.each( function() {
 +
var className, i, self, classNames;
 +
 
 +
if ( type === "string" ) {
 +
 
 +
// Toggle individual class names
 +
i = 0;
 +
self = jQuery( this );
 +
classNames = value.match( rnotwhite ) || [];
 +
 
 +
while ( ( className = classNames[ i++ ] ) ) {
 +
 
 +
// Check each className given, space separated list
 +
if ( self.hasClass( className ) ) {
 +
self.removeClass( className );
 +
} else {
 +
self.addClass( className );
 +
}
 +
}
 +
 
 +
// Toggle whole class name
 +
} else if ( value === undefined || type === "boolean" ) {
 +
className = getClass( this );
 +
if ( className ) {
 +
 
 +
// store className if set
 +
jQuery._data( this, "__className__", className );
 +
}
 +
 
 +
// If the element has a class name or if we're passed "false",
 +
// then remove the whole classname (if there was one, the above saved it).
 +
// Otherwise bring back whatever was previously saved (if anything),
 +
// falling back to the empty string if nothing was stored.
 +
jQuery.attr( this, "class",
 +
className || value === false ?
 +
"" :
 +
jQuery._data( this, "__className__" ) || ""
 +
);
 +
}
 +
} );
 +
},
 +
 
 +
hasClass: function( selector ) {
 +
var className, elem,
 +
i = 0;
 +
 
 +
className = " " + selector + " ";
 +
while ( ( elem = this[ i++ ] ) ) {
 +
if ( elem.nodeType === 1 &&
 +
( " " + getClass( elem ) + " " ).replace( rclass, " " )
 +
.indexOf( className ) > -1
 +
) {
 +
return true;
 +
}
 +
}
 +
 
 +
return false;
 +
}
 +
} );
 +
 
 +
 
 +
 
 +
 
 +
// Return jQuery for attributes-only inclusion
 +
 
 +
 
 +
jQuery.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( i, name ) {
 +
 
 +
// Handle event binding
 +
jQuery.fn[ name ] = function( data, fn ) {
 +
return arguments.length > 0 ?
 +
this.on( name, null, data, fn ) :
 +
this.trigger( name );
 +
};
 +
} );
 +
 
 +
jQuery.fn.extend( {
 +
hover: function( fnOver, fnOut ) {
 +
return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
 +
}
 +
} );
 +
 
 +
 
 +
var location = window.location;
 +
 
 +
var nonce = jQuery.now();
 +
 
 +
var rquery = ( /\?/ );
 +
 
 +
 
 +
 
 +
var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
 +
 
 +
jQuery.parseJSON = function( data ) {
 +
 
 +
// Attempt to parse using the native JSON parser first
 +
if ( window.JSON && window.JSON.parse ) {
 +
 
 +
// Support: Android 2.3
 +
// Workaround failure to string-cast null input
 +
return window.JSON.parse( data + "" );
 +
}
 +
 
 +
var requireNonComma,
 +
depth = null,
 +
str = jQuery.trim( data + "" );
 +
 
 +
// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
 +
// after removing valid tokens
 +
return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {
 +
 
 +
// Force termination if we see a misplaced comma
 +
if ( requireNonComma && comma ) {
 +
depth = 0;
 +
}
 +
 
 +
// Perform no more replacements after returning to outermost depth
 +
if ( depth === 0 ) {
 +
return token;
 +
}
 +
 
 +
// Commas must not follow "[", "{", or ","
 +
requireNonComma = open || comma;
 +
 
 +
// Determine new depth
 +
// array/object open ("[" or "{"): depth += true - false (increment)
 +
// array/object close ("]" or "}"): depth += false - true (decrement)
 +
// other cases ("," or primitive): depth += true - true (numeric cast)
 +
depth += !close - !open;
 +
 
 +
// Remove this token
 +
return "";
 +
} ) ) ?
 +
( Function( "return " + str ) )() :
 +
jQuery.error( "Invalid JSON: " + data );
 +
};
 +
 
 +
 
 +
// Cross-browser xml parsing
 +
jQuery.parseXML = function( data ) {
 +
var xml, tmp;
 +
if ( !data || typeof data !== "string" ) {
 +
return null;
 +
}
 +
try {
 +
if ( window.DOMParser ) { // Standard
 +
tmp = new window.DOMParser();
 +
xml = tmp.parseFromString( data, "text/xml" );
 +
} else { // IE
 +
xml = new window.ActiveXObject( "Microsoft.XMLDOM" );
 +
xml.async = "false";
 +
xml.loadXML( data );
 +
}
 +
} catch ( e ) {
 +
xml = undefined;
 +
}
 +
if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
 +
jQuery.error( "Invalid XML: " + data );
 +
}
 +
return xml;
 +
};
 +
 
 +
 
 +
var
 +
rhash = /#.*$/,
 +
rts = /([?&])_=[^&]*/,
 +
 
 +
// IE leaves an \r character at EOL
 +
rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg,
 +
 
 +
// #7653, #8125, #8152: local protocol detection
 +
rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
 +
rnoContent = /^(?:GET|HEAD)$/,
 +
rprotocol = /^\/\//,
 +
rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
 +
 
 +
/* Prefilters
 +
* 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
 +
* 2) These are called:
 +
*    - BEFORE asking for a transport
 +
*    - AFTER param serialization (s.data is a string if s.processData is true)
 +
* 3) key is the dataType
 +
* 4) the catchall symbol "*" can be used
 +
* 5) execution will start with transport dataType and THEN continue down to "*" if needed
 +
*/
 +
prefilters = {},
 +
 
 +
/* Transports bindings
 +
* 1) key is the dataType
 +
* 2) the catchall symbol "*" can be used
 +
* 3) selection will start with transport dataType and THEN go to "*" if needed
 +
*/
 +
transports = {},
 +
 
 +
// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
 +
allTypes = "*/".concat( "*" ),
 +
 
 +
// Document location
 +
ajaxLocation = location.href,
 +
 
 +
// Segment location into parts
 +
ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
 +
 
 +
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
 +
function addToPrefiltersOrTransports( structure ) {
 +
 
 +
// dataTypeExpression is optional and defaults to "*"
 +
return function( dataTypeExpression, func ) {
 +
 
 +
if ( typeof dataTypeExpression !== "string" ) {
 +
func = dataTypeExpression;
 +
dataTypeExpression = "*";
 +
}
 +
 
 +
var dataType,
 +
i = 0,
 +
dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
 +
 
 +
if ( jQuery.isFunction( func ) ) {
 +
 
 +
// For each dataType in the dataTypeExpression
 +
while ( ( dataType = dataTypes[ i++ ] ) ) {
 +
 
 +
// Prepend if requested
 +
if ( dataType.charAt( 0 ) === "+" ) {
 +
dataType = dataType.slice( 1 ) || "*";
 +
( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
 +
 
 +
// Otherwise append
 +
} else {
 +
( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
 +
}
 +
}
 +
}
 +
};
 +
}
 +
 
 +
// Base inspection function for prefilters and transports
 +
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
 +
 
 +
var inspected = {},
 +
seekingTransport = ( structure === transports );
 +
 
 +
function inspect( dataType ) {
 +
var selected;
 +
inspected[ dataType ] = true;
 +
jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
 +
var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
 +
if ( typeof dataTypeOrTransport === "string" &&
 +
!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
 +
 
 +
options.dataTypes.unshift( dataTypeOrTransport );
 +
inspect( dataTypeOrTransport );
 +
return false;
 +
} else if ( seekingTransport ) {
 +
return !( selected = dataTypeOrTransport );
 +
}
 +
} );
 +
return selected;
 +
}
 +
 
 +
return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
 +
}
 +
 
 +
// A special extend for ajax options
 +
// that takes "flat" options (not to be deep extended)
 +
// Fixes #9887
 +
function ajaxExtend( target, src ) {
 +
var deep, key,
 +
flatOptions = jQuery.ajaxSettings.flatOptions || {};
 +
 
 +
for ( key in src ) {
 +
if ( src[ key ] !== undefined ) {
 +
( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
 +
}
 +
}
 +
if ( deep ) {
 +
jQuery.extend( true, target, deep );
 +
}
 +
 
 +
return target;
 +
}
 +
 
 +
/* Handles responses to an ajax request:
 +
* - finds the right dataType (mediates between content-type and expected dataType)
 +
* - returns the corresponding response
 +
*/
 +
function ajaxHandleResponses( s, jqXHR, responses ) {
 +
var firstDataType, ct, finalDataType, type,
 +
contents = s.contents,
 +
dataTypes = s.dataTypes;
 +
 
 +
// Remove auto dataType and get content-type in the process
 +
while ( dataTypes[ 0 ] === "*" ) {
 +
dataTypes.shift();
 +
if ( ct === undefined ) {
 +
ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
 +
}
 +
}
 +
 
 +
// Check if we're dealing with a known content-type
 +
if ( ct ) {
 +
for ( type in contents ) {
 +
if ( contents[ type ] && contents[ type ].test( ct ) ) {
 +
dataTypes.unshift( type );
 +
break;
 +
}
 +
}
 +
}
 +
 
 +
// Check to see if we have a response for the expected dataType
 +
if ( dataTypes[ 0 ] in responses ) {
 +
finalDataType = dataTypes[ 0 ];
 +
} else {
 +
 
 +
// Try convertible dataTypes
 +
for ( type in responses ) {
 +
if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
 +
finalDataType = type;
 +
break;
 +
}
 +
if ( !firstDataType ) {
 +
firstDataType = type;
 +
}
 +
}
 +
 
 +
// Or just use first one
 +
finalDataType = finalDataType || firstDataType;
 +
}
 +
 
 +
// If we found a dataType
 +
// We add the dataType to the list if needed
 +
// and return the corresponding response
 +
if ( finalDataType ) {
 +
if ( finalDataType !== dataTypes[ 0 ] ) {
 +
dataTypes.unshift( finalDataType );
 +
}
 +
return responses[ finalDataType ];
 +
}
 +
}
 +
 
 +
/* Chain conversions given the request and the original response
 +
* Also sets the responseXXX fields on the jqXHR instance
 +
*/
 +
function ajaxConvert( s, response, jqXHR, isSuccess ) {
 +
var conv2, current, conv, tmp, prev,
 +
converters = {},
 +
 
 +
// Work with a copy of dataTypes in case we need to modify it for conversion
 +
dataTypes = s.dataTypes.slice();
 +
 
 +
// Create converters map with lowercased keys
 +
if ( dataTypes[ 1 ] ) {
 +
for ( conv in s.converters ) {
 +
converters[ conv.toLowerCase() ] = s.converters[ conv ];
 +
}
 +
}
 +
 
 +
current = dataTypes.shift();
 +
 
 +
// Convert to each sequential dataType
 +
while ( current ) {
 +
 
 +
if ( s.responseFields[ current ] ) {
 +
jqXHR[ s.responseFields[ current ] ] = response;
 +
}
 +
 
 +
// Apply the dataFilter if provided
 +
if ( !prev && isSuccess && s.dataFilter ) {
 +
response = s.dataFilter( response, s.dataType );
 +
}
 +
 
 +
prev = current;
 +
current = dataTypes.shift();
 +
 
 +
if ( current ) {
 +
 
 +
// There's only work to do if current dataType is non-auto
 +
if ( current === "*" ) {
 +
 
 +
current = prev;
 +
 
 +
// Convert response if prev dataType is non-auto and differs from current
 +
} else if ( prev !== "*" && prev !== current ) {
 +
 
 +
// Seek a direct converter
 +
conv = converters[ prev + " " + current ] || converters[ "* " + current ];
 +
 
 +
// If none found, seek a pair
 +
if ( !conv ) {
 +
for ( conv2 in converters ) {
 +
 
 +
// If conv2 outputs current
 +
tmp = conv2.split( " " );
 +
if ( tmp[ 1 ] === current ) {
 +
 
 +
// If prev can be converted to accepted input
 +
conv = converters[ prev + " " + tmp[ 0 ] ] ||
 +
converters[ "* " + tmp[ 0 ] ];
 +
if ( conv ) {
 +
 
 +
// Condense equivalence converters
 +
if ( conv === true ) {
 +
conv = converters[ conv2 ];
 +
 
 +
// Otherwise, insert the intermediate dataType
 +
} else if ( converters[ conv2 ] !== true ) {
 +
current = tmp[ 0 ];
 +
dataTypes.unshift( tmp[ 1 ] );
 
}
 
}
 +
break;
 +
}
 +
}
 +
}
 +
}
  
el.removeClass('item-animate');
+
// Apply converter (if not an equivalence)
}, k * 200, 'easeInOutExpo' );
+
if ( conv !== true ) {
});
+
 
+
// Unless errors are allowed to bubble, catch and return them
}, 100);
+
if ( conv && s[ "throws" ] ) { // jscs:ignore requireDotNotation
+
response = conv( response );
 +
} else {
 +
try {
 +
response = conv( response );
 +
} catch ( e ) {
 +
return {
 +
state: "parsererror",
 +
error: conv ? e : "No conversion from " + prev + " to " + current
 +
};
 +
}
 +
}
 
}
 
}
 +
}
 +
}
 +
}
 +
 +
return { state: "success", data: response };
 +
}
 +
 +
jQuery.extend( {
 +
 +
// Counter for holding the number of active queries
 +
active: 0,
 +
 +
// Last-Modified header cache for next request
 +
lastModified: {},
 +
etag: {},
 +
 +
ajaxSettings: {
 +
url: ajaxLocation,
 +
type: "GET",
 +
isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
 +
global: true,
 +
processData: true,
 +
async: true,
 +
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
 +
/*
 +
timeout: 0,
 +
data: null,
 +
dataType: null,
 +
username: null,
 +
password: null,
 +
cache: null,
 +
throws: false,
 +
traditional: false,
 +
headers: {},
 +
*/
 +
 +
accepts: {
 +
"*": allTypes,
 +
text: "text/plain",
 +
html: "text/html",
 +
xml: "application/xml, text/xml",
 +
json: "application/json, text/javascript"
 +
},
 +
 +
contents: {
 +
xml: /\bxml\b/,
 +
html: /\bhtml/,
 +
json: /\bjson\b/
 +
},
 +
 +
responseFields: {
 +
xml: "responseXML",
 +
text: "responseText",
 +
json: "responseJSON"
 +
},
 +
 +
// Data converters
 +
// Keys separate source (or catchall "*") and destination types with a single space
 +
converters: {
 +
 +
// Convert anything to text
 +
"* text": String,
 +
 +
// Text to html (true = no transformation)
 +
"text html": true,
 +
 +
// Evaluate text as a json expression
 +
"text json": jQuery.parseJSON,
 +
 +
// Parse text as xml
 +
"text xml": jQuery.parseXML
 +
},
 +
 +
// For options that shouldn't be deep extended:
 +
// you can add your own custom options here if
 +
// and when you create one that shouldn't be
 +
// deep extended (see ajaxExtend)
 +
flatOptions: {
 +
url: true,
 +
context: true
 +
}
 +
},
 +
 +
// Creates a full fledged settings object into target
 +
// with both ajaxSettings and settings fields.
 +
// If target is omitted, writes into ajaxSettings.
 +
ajaxSetup: function( target, settings ) {
 +
return settings ?
 +
 +
// Building a settings object
 +
ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
 +
 +
// Extending ajaxSettings
 +
ajaxExtend( jQuery.ajaxSettings, target );
 +
},
 +
 +
ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
 +
ajaxTransport: addToPrefiltersOrTransports( transports ),
 +
 +
// Main method
 +
ajax: function( url, options ) {
 +
 +
// If url is an object, simulate pre-1.5 signature
 +
if ( typeof url === "object" ) {
 +
options = url;
 +
url = undefined;
 +
}
 +
 +
// Force options to be an object
 +
options = options || {};
 +
 +
var
 +
 +
// Cross-domain detection vars
 +
parts,
 +
 +
// Loop variable
 +
i,
 +
 +
// URL without anti-cache param
 +
cacheURL,
 +
 +
// Response headers as string
 +
responseHeadersString,
 +
 +
// timeout handle
 +
timeoutTimer,
 +
 +
// To know if global events are to be dispatched
 +
fireGlobals,
 +
 +
transport,
 +
 +
// Response headers
 +
responseHeaders,
 +
 +
// Create the final options object
 +
s = jQuery.ajaxSetup( {}, options ),
 +
 +
// Callbacks context
 +
callbackContext = s.context || s,
 +
 +
// Context for global events is callbackContext if it is a DOM node or jQuery collection
 +
globalEventContext = s.context &&
 +
( callbackContext.nodeType || callbackContext.jquery ) ?
 +
jQuery( callbackContext ) :
 +
jQuery.event,
 +
 +
// Deferreds
 +
deferred = jQuery.Deferred(),
 +
completeDeferred = jQuery.Callbacks( "once memory" ),
 +
 +
// Status-dependent callbacks
 +
statusCode = s.statusCode || {},
 +
 +
// Headers (they are sent all at once)
 +
requestHeaders = {},
 +
requestHeadersNames = {},
 +
 +
// The jqXHR state
 +
state = 0,
 +
 +
// Default abort message
 +
strAbort = "canceled",
 +
 +
// Fake xhr
 +
jqXHR = {
 +
readyState: 0,
 +
 +
// Builds headers hashtable if needed
 +
getResponseHeader: function( key ) {
 +
var match;
 +
if ( state === 2 ) {
 +
if ( !responseHeaders ) {
 +
responseHeaders = {};
 +
while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
 +
responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
 +
}
 +
}
 +
match = responseHeaders[ key.toLowerCase() ];
 +
}
 +
return match == null ? null : match;
 +
},
 +
 +
// Raw string
 +
getAllResponseHeaders: function() {
 +
return state === 2 ? responseHeadersString : null;
 +
},
 +
 +
// Caches the header
 +
setRequestHeader: function( name, value ) {
 +
var lname = name.toLowerCase();
 +
if ( !state ) {
 +
name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
 +
requestHeaders[ name ] = value;
 +
}
 +
return this;
 +
},
 +
 +
// Overrides response content-type header
 +
overrideMimeType: function( type ) {
 +
if ( !state ) {
 +
s.mimeType = type;
 +
}
 +
return this;
 +
},
 +
 +
// Status-dependent callbacks
 +
statusCode: function( map ) {
 +
var code;
 +
if ( map ) {
 +
if ( state < 2 ) {
 +
for ( code in map ) {
 +
 +
// Lazy-add the new callback in a way that preserves old ones
 +
statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
 +
}
 +
} else {
 +
 +
// Execute the appropriate callbacks
 +
jqXHR.always( map[ jqXHR.status ] );
 +
}
 +
}
 +
return this;
 +
},
 +
 +
// Cancel the request
 +
abort: function( statusText ) {
 +
var finalText = statusText || strAbort;
 +
if ( transport ) {
 +
transport.abort( finalText );
 +
}
 +
done( 0, finalText );
 +
return this;
 +
}
 +
};
 +
 +
// Attach deferreds
 +
deferred.promise( jqXHR ).complete = completeDeferred.add;
 +
jqXHR.success = jqXHR.done;
 +
jqXHR.error = jqXHR.fail;
 +
 +
// Remove hash character (#7531: and string promotion)
 +
// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
 +
// Handle falsy url in the settings object (#10093: consistency with old signature)
 +
// We also use the url parameter if available
 +
s.url = ( ( url || s.url || ajaxLocation ) + "" )
 +
.replace( rhash, "" )
 +
.replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
 +
 +
// Alias method option to type as per ticket #12004
 +
s.type = options.method || options.type || s.method || s.type;
 +
 +
// Extract dataTypes list
 +
s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
 +
 +
// A cross-domain request is in order when we have a protocol:host:port mismatch
 +
if ( s.crossDomain == null ) {
 +
parts = rurl.exec( s.url.toLowerCase() );
 +
s.crossDomain = !!( parts &&
 +
( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
 +
( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
 +
( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
 +
);
 +
}
 +
 +
// Convert data if not already a string
 +
if ( s.data && s.processData && typeof s.data !== "string" ) {
 +
s.data = jQuery.param( s.data, s.traditional );
 +
}
 +
 +
// Apply prefilters
 +
inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
 +
 +
// If request was aborted inside a prefilter, stop there
 +
if ( state === 2 ) {
 +
return jqXHR;
 +
}
 +
 +
// We can fire global events as of now if asked to
 +
// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
 +
fireGlobals = jQuery.event && s.global;
 +
 +
// Watch for a new set of requests
 +
if ( fireGlobals && jQuery.active++ === 0 ) {
 +
jQuery.event.trigger( "ajaxStart" );
 +
}
 +
 +
// Uppercase the type
 +
s.type = s.type.toUpperCase();
 +
 +
// Determine if request has content
 +
s.hasContent = !rnoContent.test( s.type );
 +
 +
// Save the URL in case we're toying with the If-Modified-Since
 +
// and/or If-None-Match header later on
 +
cacheURL = s.url;
 +
 +
// More options handling for requests with no content
 +
if ( !s.hasContent ) {
 +
 +
// If data is available, append data to url
 +
if ( s.data ) {
 +
cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
 +
 +
// #9682: remove data so that it's not used in an eventual retry
 +
delete s.data;
 +
}
 +
 +
// Add anti-cache in url if needed
 +
if ( s.cache === false ) {
 +
s.url = rts.test( cacheURL ) ?
 +
 +
// If there is already a '_' parameter, set its value
 +
cacheURL.replace( rts, "$1_=" + nonce++ ) :
 +
 +
// Otherwise add one to the end
 +
cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
 +
}
 +
}
 +
 +
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
 +
if ( s.ifModified ) {
 +
if ( jQuery.lastModified[ cacheURL ] ) {
 +
jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
 +
}
 +
if ( jQuery.etag[ cacheURL ] ) {
 +
jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
 +
}
 +
}
 +
 +
// Set the correct header, if data is being sent
 +
if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
 +
jqXHR.setRequestHeader( "Content-Type", s.contentType );
 +
}
 +
 +
// Set the Accepts header for the server, depending on the dataType
 +
jqXHR.setRequestHeader(
 +
"Accept",
 +
s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
 +
s.accepts[ s.dataTypes[ 0 ] ] +
 +
( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
 +
s.accepts[ "*" ]
 +
);
 +
 +
// Check for headers option
 +
for ( i in s.headers ) {
 +
jqXHR.setRequestHeader( i, s.headers[ i ] );
 +
}
 +
 +
// Allow custom headers/mimetypes and early abort
 +
if ( s.beforeSend &&
 +
( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
 +
 +
// Abort if not done already and return
 +
return jqXHR.abort();
 +
}
 +
 +
// aborting is no longer a cancellation
 +
strAbort = "abort";
 +
 +
// Install callbacks on deferreds
 +
for ( i in { success: 1, error: 1, complete: 1 } ) {
 +
jqXHR[ i ]( s[ i ] );
 +
}
 +
 +
// Get transport
 +
transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
 +
 +
// If no transport, we auto-abort
 +
if ( !transport ) {
 +
done( -1, "No Transport" );
 +
} else {
 +
jqXHR.readyState = 1;
 +
 +
// Send global event
 +
if ( fireGlobals ) {
 +
globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
 +
}
 +
 +
// If request was aborted inside ajaxSend, stop there
 +
if ( state === 2 ) {
 +
return jqXHR;
 +
}
 +
 +
// Timeout
 +
if ( s.async && s.timeout > 0 ) {
 +
timeoutTimer = window.setTimeout( function() {
 +
jqXHR.abort( "timeout" );
 +
}, s.timeout );
 +
}
 +
 +
try {
 +
state = 1;
 +
transport.send( requestHeaders, done );
 +
} catch ( e ) {
 +
 +
// Propagate exception as error if not done
 +
if ( state < 2 ) {
 +
done( -1, e );
 +
 +
// Simply rethrow otherwise
 +
} else {
 +
throw e;
 +
}
 +
}
 +
}
 +
 +
// Callback for when everything is done
 +
function done( status, nativeStatusText, responses, headers ) {
 +
var isSuccess, success, error, response, modified,
 +
statusText = nativeStatusText;
 +
 +
// Called once
 +
if ( state === 2 ) {
 +
return;
 +
}
 +
 +
// State is "done" now
 +
state = 2;
 +
 +
// Clear timeout if it exists
 +
if ( timeoutTimer ) {
 +
window.clearTimeout( timeoutTimer );
 +
}
 +
 +
// Dereference transport for early garbage collection
 +
// (no matter how long the jqXHR object will be used)
 +
transport = undefined;
 +
 +
// Cache response headers
 +
responseHeadersString = headers || "";
 +
 +
// Set readyState
 +
jqXHR.readyState = status > 0 ? 4 : 0;
 +
 +
// Determine if successful
 +
isSuccess = status >= 200 && status < 300 || status === 304;
 +
 +
// Get response data
 +
if ( responses ) {
 +
response = ajaxHandleResponses( s, jqXHR, responses );
 +
}
 +
 +
// Convert no matter what (that way responseXXX fields are always set)
 +
response = ajaxConvert( s, response, jqXHR, isSuccess );
 +
 +
// If successful, handle type chaining
 +
if ( isSuccess ) {
 +
 +
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
 +
if ( s.ifModified ) {
 +
modified = jqXHR.getResponseHeader( "Last-Modified" );
 +
if ( modified ) {
 +
jQuery.lastModified[ cacheURL ] = modified;
 +
}
 +
modified = jqXHR.getResponseHeader( "etag" );
 +
if ( modified ) {
 +
jQuery.etag[ cacheURL ] = modified;
 +
}
 +
}
 +
 +
// if no content
 +
if ( status === 204 || s.type === "HEAD" ) {
 +
statusText = "nocontent";
 +
 +
// if not modified
 +
} else if ( status === 304 ) {
 +
statusText = "notmodified";
 +
 +
// If we have data, let's convert it
 +
} else {
 +
statusText = response.state;
 +
success = response.data;
 +
error = response.error;
 +
isSuccess = !error;
 +
}
 +
} else {
 +
 +
// We extract error from statusText
 +
// then normalize statusText and status for non-aborts
 +
error = statusText;
 +
if ( status || !statusText ) {
 +
statusText = "error";
 +
if ( status < 0 ) {
 +
status = 0;
 +
}
 +
}
 +
}
 +
 +
// Set data for the fake xhr object
 +
jqXHR.status = status;
 +
jqXHR.statusText = ( nativeStatusText || statusText ) + "";
 +
 +
// Success/Error
 +
if ( isSuccess ) {
 +
deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
 +
} else {
 +
deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
 +
}
 +
 +
// Status-dependent callbacks
 +
jqXHR.statusCode( statusCode );
 +
statusCode = undefined;
 +
 +
if ( fireGlobals ) {
 +
globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
 +
[ jqXHR, s, isSuccess ? success : error ] );
 +
}
 +
 +
// Complete
 +
completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
 +
 +
if ( fireGlobals ) {
 +
globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
 +
 +
// Handle the global AJAX counter
 +
if ( !( --jQuery.active ) ) {
 +
jQuery.event.trigger( "ajaxStop" );
 +
}
 +
}
 +
}
 +
 +
return jqXHR;
 +
},
 +
 +
getJSON: function( url, data, callback ) {
 +
return jQuery.get( url, data, callback, "json" );
 +
},
 +
 +
getScript: function( url, callback ) {
 +
return jQuery.get( url, undefined, callback, "script" );
 +
}
 +
} );
 +
 +
jQuery.each( [ "get", "post" ], function( i, method ) {
 +
jQuery[ method ] = function( url, data, callback, type ) {
 +
 +
// shift arguments if data argument was omitted
 +
if ( jQuery.isFunction( data ) ) {
 +
type = type || callback;
 +
callback = data;
 +
data = undefined;
 +
}
  
} , { offset: '85%' } );
+
// The url can be an options object (which then must have .url)
// }, { offset: '90%'} );
+
return jQuery.ajax( jQuery.extend( {
 +
url: url,
 +
type: method,
 +
dataType: type,
 +
data: data,
 +
success: callback
 +
}, jQuery.isPlainObject( url ) && url ) );
 
};
 
};
 +
} );
  
  
var dropdown = function() {
+
jQuery._evalUrl = function( url ) {
 +
return jQuery.ajax( {
 +
url: url,
  
$('.has-dropdown').mouseenter(function(){
+
// Make this explicit, since user can override this through ajaxSetup (#11264)
 +
type: "GET",
 +
dataType: "script",
 +
cache: true,
 +
async: false,
 +
global: false,
 +
"throws": true
 +
} );
 +
};
 +
 
 +
 
 +
jQuery.fn.extend( {
 +
wrapAll: function( html ) {
 +
if ( jQuery.isFunction( html ) ) {
 +
return this.each( function( i ) {
 +
jQuery( this ).wrapAll( html.call( this, i ) );
 +
} );
 +
}
 +
 
 +
if ( this[ 0 ] ) {
 +
 
 +
// The elements to wrap the target around
 +
var wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
 +
 
 +
if ( this[ 0 ].parentNode ) {
 +
wrap.insertBefore( this[ 0 ] );
 +
}
 +
 
 +
wrap.map( function() {
 +
var elem = this;
 +
 
 +
while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
 +
elem = elem.firstChild;
 +
}
 +
 
 +
return elem;
 +
} ).append( this );
 +
}
 +
 
 +
return this;
 +
},
 +
 
 +
wrapInner: function( html ) {
 +
if ( jQuery.isFunction( html ) ) {
 +
return this.each( function( i ) {
 +
jQuery( this ).wrapInner( html.call( this, i ) );
 +
} );
 +
}
 +
 
 +
return this.each( function() {
 +
var self = jQuery( this ),
 +
contents = self.contents();
 +
 
 +
if ( contents.length ) {
 +
contents.wrapAll( html );
 +
 
 +
} else {
 +
self.append( html );
 +
}
 +
} );
 +
},
 +
 
 +
wrap: function( html ) {
 +
var isFunction = jQuery.isFunction( html );
 +
 
 +
return this.each( function( i ) {
 +
jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
 +
} );
 +
},
 +
 
 +
unwrap: function() {
 +
return this.parent().each( function() {
 +
if ( !jQuery.nodeName( this, "body" ) ) {
 +
jQuery( this ).replaceWith( this.childNodes );
 +
}
 +
} ).end();
 +
}
 +
} );
 +
 
 +
 
 +
function getDisplay( elem ) {
 +
return elem.style && elem.style.display || jQuery.css( elem, "display" );
 +
}
 +
 
 +
function filterHidden( elem ) {
 +
 
 +
// Disconnected elements are considered hidden
 +
if ( !jQuery.contains( elem.ownerDocument || document, elem ) ) {
 +
return true;
 +
}
 +
while ( elem && elem.nodeType === 1 ) {
 +
if ( getDisplay( elem ) === "none" || elem.type === "hidden" ) {
 +
return true;
 +
}
 +
elem = elem.parentNode;
 +
}
 +
return false;
 +
}
 +
 
 +
jQuery.expr.filters.hidden = function( elem ) {
 +
 
 +
// Support: Opera <= 12.12
 +
// Opera reports offsetWidths and offsetHeights less than zero on some elements
 +
return support.reliableHiddenOffsets() ?
 +
( elem.offsetWidth <= 0 && elem.offsetHeight <= 0 &&
 +
!elem.getClientRects().length ) :
 +
filterHidden( elem );
 +
};
 +
 
 +
jQuery.expr.filters.visible = function( elem ) {
 +
return !jQuery.expr.filters.hidden( elem );
 +
};
 +
 
 +
 
 +
 
 +
 
 +
var r20 = /%20/g,
 +
rbracket = /\[\]$/,
 +
rCRLF = /\r?\n/g,
 +
rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
 +
rsubmittable = /^(?:input|select|textarea|keygen)/i;
 +
 
 +
function buildParams( prefix, obj, traditional, add ) {
 +
var name;
 +
 
 +
if ( jQuery.isArray( obj ) ) {
 +
 
 +
// Serialize array item.
 +
jQuery.each( obj, function( i, v ) {
 +
if ( traditional || rbracket.test( prefix ) ) {
 +
 
 +
// Treat each array item as a scalar.
 +
add( prefix, v );
 +
 
 +
} else {
 +
 
 +
// Item is non-scalar (array or object), encode its numeric index.
 +
buildParams(
 +
prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
 +
v,
 +
traditional,
 +
add
 +
);
 +
}
 +
} );
 +
 
 +
} else if ( !traditional && jQuery.type( obj ) === "object" ) {
 +
 
 +
// Serialize object item.
 +
for ( name in obj ) {
 +
buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
 +
}
 +
 
 +
} else {
 +
 
 +
// Serialize scalar item.
 +
add( prefix, obj );
 +
}
 +
}
 +
 
 +
// Serialize an array of form elements or a set of
 +
// key/values into a query string
 +
jQuery.param = function( a, traditional ) {
 +
var prefix,
 +
s = [],
 +
add = function( key, value ) {
 +
 
 +
// If value is a function, invoke it and return its value
 +
value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
 +
s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
 +
};
 +
 
 +
// Set traditional to true for jQuery <= 1.3.2 behavior.
 +
if ( traditional === undefined ) {
 +
traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
 +
}
 +
 
 +
// If an array was passed in, assume that it is an array of form elements.
 +
if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
 +
 
 +
// Serialize the form elements
 +
jQuery.each( a, function() {
 +
add( this.name, this.value );
 +
} );
 +
 
 +
} else {
 +
 
 +
// If traditional, encode the "old" way (the way 1.3.2 or older
 +
// did it), otherwise encode params recursively.
 +
for ( prefix in a ) {
 +
buildParams( prefix, a[ prefix ], traditional, add );
 +
}
 +
}
 +
 
 +
// Return the resulting serialization
 +
return s.join( "&" ).replace( r20, "+" );
 +
};
 +
 
 +
jQuery.fn.extend( {
 +
serialize: function() {
 +
return jQuery.param( this.serializeArray() );
 +
},
 +
serializeArray: function() {
 +
return this.map( function() {
 +
 
 +
// Can add propHook for "elements" to filter or add form elements
 +
var elements = jQuery.prop( this, "elements" );
 +
return elements ? jQuery.makeArray( elements ) : this;
 +
} )
 +
.filter( function() {
 +
var type = this.type;
 +
 
 +
// Use .is(":disabled") so that fieldset[disabled] works
 +
return this.name && !jQuery( this ).is( ":disabled" ) &&
 +
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
 +
( this.checked || !rcheckableType.test( type ) );
 +
} )
 +
.map( function( i, elem ) {
 +
var val = jQuery( this ).val();
 +
 
 +
return val == null ?
 +
null :
 +
jQuery.isArray( val ) ?
 +
jQuery.map( val, function( val ) {
 +
return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
 +
} ) :
 +
{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
 +
} ).get();
 +
}
 +
} );
 +
 
 +
 
 +
// Create the request object
 +
// (This is still attached to ajaxSettings for backward compatibility)
 +
jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?
 +
 
 +
// Support: IE6-IE8
 +
function() {
 +
 
 +
// XHR cannot access local files, always use ActiveX for that case
 +
if ( this.isLocal ) {
 +
return createActiveXHR();
 +
}
 +
 
 +
// Support: IE 9-11
 +
// IE seems to error on cross-domain PATCH requests when ActiveX XHR
 +
// is used. In IE 9+ always use the native XHR.
 +
// Note: this condition won't catch Edge as it doesn't define
 +
// document.documentMode but it also doesn't support ActiveX so it won't
 +
// reach this code.
 +
if ( document.documentMode > 8 ) {
 +
return createStandardXHR();
 +
}
 +
 
 +
// Support: IE<9
 +
// oldIE XHR does not support non-RFC2616 methods (#13240)
 +
// See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx
 +
// and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9
 +
// Although this check for six methods instead of eight
 +
// since IE also does not support "trace" and "connect"
 +
return /^(get|post|head|put|delete|options)$/i.test( this.type ) &&
 +
createStandardXHR() || createActiveXHR();
 +
} :
 +
 
 +
// For all other browsers, use the standard XMLHttpRequest object
 +
createStandardXHR;
 +
 
 +
var xhrId = 0,
 +
xhrCallbacks = {},
 +
xhrSupported = jQuery.ajaxSettings.xhr();
 +
 
 +
// Support: IE<10
 +
// Open requests must be manually aborted on unload (#5280)
 +
// See https://support.microsoft.com/kb/2856746 for more info
 +
if ( window.attachEvent ) {
 +
window.attachEvent( "onunload", function() {
 +
for ( var key in xhrCallbacks ) {
 +
xhrCallbacks[ key ]( undefined, true );
 +
}
 +
} );
 +
}
 +
 
 +
// Determine support properties
 +
support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
 +
xhrSupported = support.ajax = !!xhrSupported;
 +
 
 +
// Create transport if the browser can provide an xhr
 +
if ( xhrSupported ) {
 +
 
 +
jQuery.ajaxTransport( function( options ) {
 +
 
 +
// Cross domain only allowed if supported through XMLHttpRequest
 +
if ( !options.crossDomain || support.cors ) {
 +
 
 +
var callback;
 +
 
 +
return {
 +
send: function( headers, complete ) {
 +
var i,
 +
xhr = options.xhr(),
 +
id = ++xhrId;
 +
 
 +
// Open the socket
 +
xhr.open(
 +
options.type,
 +
options.url,
 +
options.async,
 +
options.username,
 +
options.password
 +
);
 +
 
 +
// Apply custom fields if provided
 +
if ( options.xhrFields ) {
 +
for ( i in options.xhrFields ) {
 +
xhr[ i ] = options.xhrFields[ i ];
 +
}
 +
}
 +
 
 +
// Override mime type if needed
 +
if ( options.mimeType && xhr.overrideMimeType ) {
 +
xhr.overrideMimeType( options.mimeType );
 +
}
 +
 
 +
// X-Requested-With header
 +
// For cross-domain requests, seeing as conditions for a preflight are
 +
// akin to a jigsaw puzzle, we simply never set it to be sure.
 +
// (it can always be set on a per-request basis or even using ajaxSetup)
 +
// For same-domain requests, won't change header if already provided.
 +
if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
 +
headers[ "X-Requested-With" ] = "XMLHttpRequest";
 +
}
 +
 
 +
// Set headers
 +
for ( i in headers ) {
 +
 
 +
// Support: IE<9
 +
// IE's ActiveXObject throws a 'Type Mismatch' exception when setting
 +
// request header to a null-value.
 +
//
 +
// To keep consistent with other XHR implementations, cast the value
 +
// to string and ignore `undefined`.
 +
if ( headers[ i ] !== undefined ) {
 +
xhr.setRequestHeader( i, headers[ i ] + "" );
 +
}
 +
}
 +
 
 +
// Do send the request
 +
// This may raise an exception which is actually
 +
// handled in jQuery.ajax (so no try/catch here)
 +
xhr.send( ( options.hasContent && options.data ) || null );
 +
 
 +
// Listener
 +
callback = function( _, isAbort ) {
 +
var status, statusText, responses;
 +
 
 +
// Was never called and is aborted or complete
 +
if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
 +
 
 +
// Clean up
 +
delete xhrCallbacks[ id ];
 +
callback = undefined;
 +
xhr.onreadystatechange = jQuery.noop;
 +
 
 +
// Abort manually if needed
 +
if ( isAbort ) {
 +
if ( xhr.readyState !== 4 ) {
 +
xhr.abort();
 +
}
 +
} else {
 +
responses = {};
 +
status = xhr.status;
 +
 
 +
// Support: IE<10
 +
// Accessing binary-data responseText throws an exception
 +
// (#11426)
 +
if ( typeof xhr.responseText === "string" ) {
 +
responses.text = xhr.responseText;
 +
}
 +
 
 +
// Firefox throws an exception when accessing
 +
// statusText for faulty cross-domain requests
 +
try {
 +
statusText = xhr.statusText;
 +
} catch ( e ) {
 +
 
 +
// We normalize with Webkit giving an empty statusText
 +
statusText = "";
 +
}
 +
 
 +
// Filter status for non standard behaviors
 +
 
 +
// If the request is local and we have data: assume a success
 +
// (success with no data won't get notified, that's the best we
 +
// can do given current implementations)
 +
if ( !status && options.isLocal && !options.crossDomain ) {
 +
status = responses.text ? 200 : 404;
 +
 
 +
// IE - #1450: sometimes returns 1223 when it should be 204
 +
} else if ( status === 1223 ) {
 +
status = 204;
 +
}
 +
}
 +
}
 +
 
 +
// Call complete if needed
 +
if ( responses ) {
 +
complete( status, statusText, responses, xhr.getAllResponseHeaders() );
 +
}
 +
};
 +
 
 +
// Do send the request
 +
// `xhr.send` may raise an exception, but it will be
 +
// handled in jQuery.ajax (so no try/catch here)
 +
if ( !options.async ) {
 +
 
 +
// If we're in sync mode we fire the callback
 +
callback();
 +
} else if ( xhr.readyState === 4 ) {
 +
 
 +
// (IE6 & IE7) if it's in cache and has been
 +
// retrieved directly we need to fire the callback
 +
window.setTimeout( callback );
 +
} else {
 +
 
 +
// Register the callback, but delay it in case `xhr.send` throws
 +
// Add to the list of active xhr callbacks
 +
xhr.onreadystatechange = xhrCallbacks[ id ] = callback;
 +
}
 +
},
 +
 
 +
abort: function() {
 +
if ( callback ) {
 +
callback( undefined, true );
 +
}
 +
}
 +
};
 +
}
 +
} );
 +
}
 +
 
 +
// Functions to create xhrs
 +
function createStandardXHR() {
 +
try {
 +
return new window.XMLHttpRequest();
 +
} catch ( e ) {}
 +
}
 +
 
 +
function createActiveXHR() {
 +
try {
 +
return new window.ActiveXObject( "Microsoft.XMLHTTP" );
 +
} catch ( e ) {}
 +
}
 +
 
 +
 
 +
 
 +
 
 +
// Install script dataType
 +
jQuery.ajaxSetup( {
 +
accepts: {
 +
script: "text/javascript, application/javascript, " +
 +
"application/ecmascript, application/x-ecmascript"
 +
},
 +
contents: {
 +
script: /\b(?:java|ecma)script\b/
 +
},
 +
converters: {
 +
"text script": function( text ) {
 +
jQuery.globalEval( text );
 +
return text;
 +
}
 +
}
 +
} );
 +
 
 +
// Handle cache's special case and global
 +
jQuery.ajaxPrefilter( "script", function( s ) {
 +
if ( s.cache === undefined ) {
 +
s.cache = false;
 +
}
 +
if ( s.crossDomain ) {
 +
s.type = "GET";
 +
s.global = false;
 +
}
 +
} );
 +
 
 +
// Bind script tag hack transport
 +
jQuery.ajaxTransport( "script", function( s ) {
 +
 
 +
// This transport only deals with cross domain requests
 +
if ( s.crossDomain ) {
 +
 
 +
var script,
 +
head = document.head || jQuery( "head" )[ 0 ] || document.documentElement;
 +
 
 +
return {
 +
 
 +
send: function( _, callback ) {
 +
 
 +
script = document.createElement( "script" );
 +
 
 +
script.async = true;
 +
 
 +
if ( s.scriptCharset ) {
 +
script.charset = s.scriptCharset;
 +
}
 +
 
 +
script.src = s.url;
 +
 
 +
// Attach handlers for all browsers
 +
script.onload = script.onreadystatechange = function( _, isAbort ) {
 +
 
 +
if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
 +
 
 +
// Handle memory leak in IE
 +
script.onload = script.onreadystatechange = null;
 +
 
 +
// Remove the script
 +
if ( script.parentNode ) {
 +
script.parentNode.removeChild( script );
 +
}
 +
 
 +
// Dereference the script
 +
script = null;
 +
 
 +
// Callback if not abort
 +
if ( !isAbort ) {
 +
callback( 200, "success" );
 +
}
 +
}
 +
};
 +
 
 +
// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
 +
// Use native DOM manipulation to avoid our domManip AJAX trickery
 +
head.insertBefore( script, head.firstChild );
 +
},
 +
 
 +
abort: function() {
 +
if ( script ) {
 +
script.onload( undefined, true );
 +
}
 +
}
 +
};
 +
}
 +
} );
 +
 
 +
 
 +
 
 +
 
 +
var oldCallbacks = [],
 +
rjsonp = /(=)\?(?=&|$)|\?\?/;
 +
 
 +
// Default jsonp settings
 +
jQuery.ajaxSetup( {
 +
jsonp: "callback",
 +
jsonpCallback: function() {
 +
var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
 +
this[ callback ] = true;
 +
return callback;
 +
}
 +
} );
 +
 
 +
// Detect, normalize options and install callbacks for jsonp requests
 +
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
 +
 
 +
var callbackName, overwritten, responseContainer,
 +
jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
 +
"url" :
 +
typeof s.data === "string" &&
 +
( s.contentType || "" )
 +
.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
 +
rjsonp.test( s.data ) && "data"
 +
);
 +
 
 +
// Handle iff the expected data type is "jsonp" or we have a parameter to set
 +
if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
 +
 
 +
// Get callback name, remembering preexisting value associated with it
 +
callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
 +
s.jsonpCallback() :
 +
s.jsonpCallback;
 +
 
 +
// Insert callback into url or form data
 +
if ( jsonProp ) {
 +
s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
 +
} else if ( s.jsonp !== false ) {
 +
s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
 +
}
 +
 
 +
// Use data converter to retrieve json after script execution
 +
s.converters[ "script json" ] = function() {
 +
if ( !responseContainer ) {
 +
jQuery.error( callbackName + " was not called" );
 +
}
 +
return responseContainer[ 0 ];
 +
};
 +
 
 +
// force json dataType
 +
s.dataTypes[ 0 ] = "json";
 +
 
 +
// Install callback
 +
overwritten = window[ callbackName ];
 +
window[ callbackName ] = function() {
 +
responseContainer = arguments;
 +
};
 +
 
 +
// Clean-up function (fires after converters)
 +
jqXHR.always( function() {
 +
 
 +
// If previous value didn't exist - remove it
 +
if ( overwritten === undefined ) {
 +
jQuery( window ).removeProp( callbackName );
 +
 
 +
// Otherwise restore preexisting value
 +
} else {
 +
window[ callbackName ] = overwritten;
 +
}
 +
 
 +
// Save back as free
 +
if ( s[ callbackName ] ) {
 +
 
 +
// make sure that re-using the options doesn't screw things around
 +
s.jsonpCallback = originalSettings.jsonpCallback;
 +
 
 +
// save the callback name for future use
 +
oldCallbacks.push( callbackName );
 +
}
 +
 
 +
// Call if it was a function and we have a response
 +
if ( responseContainer && jQuery.isFunction( overwritten ) ) {
 +
overwritten( responseContainer[ 0 ] );
 +
}
 +
 
 +
responseContainer = overwritten = undefined;
 +
} );
 +
 
 +
// Delegate to script
 +
return "script";
 +
}
 +
} );
 +
 
 +
 
 +
 
 +
 
 +
// data: string of html
 +
// context (optional): If specified, the fragment will be created in this context,
 +
// defaults to document
 +
// keepScripts (optional): If true, will include scripts passed in the html string
 +
jQuery.parseHTML = function( data, context, keepScripts ) {
 +
if ( !data || typeof data !== "string" ) {
 +
return null;
 +
}
 +
if ( typeof context === "boolean" ) {
 +
keepScripts = context;
 +
context = false;
 +
}
 +
context = context || document;
 +
 
 +
var parsed = rsingleTag.exec( data ),
 +
scripts = !keepScripts && [];
 +
 
 +
// Single tag
 +
if ( parsed ) {
 +
return [ context.createElement( parsed[ 1 ] ) ];
 +
}
 +
 
 +
parsed = buildFragment( [ data ], context, scripts );
 +
 
 +
if ( scripts && scripts.length ) {
 +
jQuery( scripts ).remove();
 +
}
 +
 
 +
return jQuery.merge( [], parsed.childNodes );
 +
};
 +
 
 +
 
 +
// Keep a copy of the old load method
 +
var _load = jQuery.fn.load;
 +
 
 +
/**
 +
* Load a url into a page
 +
*/
 +
jQuery.fn.load = function( url, params, callback ) {
 +
if ( typeof url !== "string" && _load ) {
 +
return _load.apply( this, arguments );
 +
}
 +
 
 +
var selector, type, response,
 +
self = this,
 +
off = url.indexOf( " " );
 +
 
 +
if ( off > -1 ) {
 +
selector = jQuery.trim( url.slice( off, url.length ) );
 +
url = url.slice( 0, off );
 +
}
 +
 
 +
// If it's a function
 +
if ( jQuery.isFunction( params ) ) {
 +
 
 +
// We assume that it's the callback
 +
callback = params;
 +
params = undefined;
 +
 
 +
// Otherwise, build a param string
 +
} else if ( params && typeof params === "object" ) {
 +
type = "POST";
 +
}
 +
 
 +
// If we have elements to modify, make the request
 +
if ( self.length > 0 ) {
 +
jQuery.ajax( {
 +
url: url,
 +
 
 +
// If "type" variable is undefined, then "GET" method will be used.
 +
// Make value of this field explicit since
 +
// user can override it through ajaxSetup method
 +
type: type || "GET",
 +
dataType: "html",
 +
data: params
 +
} ).done( function( responseText ) {
 +
 
 +
// Save response for use in complete callback
 +
response = arguments;
 +
 
 +
self.html( selector ?
 +
 
 +
// If a selector was specified, locate the right elements in a dummy div
 +
// Exclude scripts to avoid IE 'Permission Denied' errors
 +
jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
 +
 
 +
// Otherwise use the full result
 +
responseText );
 +
 
 +
// If the request succeeds, this function gets "data", "status", "jqXHR"
 +
// but they are ignored because response was set above.
 +
// If it fails, this function gets "jqXHR", "status", "error"
 +
} ).always( callback && function( jqXHR, status ) {
 +
self.each( function() {
 +
callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
 +
} );
 +
} );
 +
}
 +
 
 +
return this;
 +
};
  
var $this = $(this);
 
$this
 
.find('.dropdown')
 
.css('display', 'block')
 
.addClass('animated-fast fadeInUpMenu');
 
  
}).mouseleave(function(){
 
var $this = $(this);
 
  
$this
 
.find('.dropdown')
 
.css('display', 'none')
 
.removeClass('animated-fast fadeInUpMenu');
 
});
 
  
 +
// Attach a bunch of functions for handling common AJAX events
 +
jQuery.each( [
 +
"ajaxStart",
 +
"ajaxStop",
 +
"ajaxComplete",
 +
"ajaxError",
 +
"ajaxSuccess",
 +
"ajaxSend"
 +
], function( i, type ) {
 +
jQuery.fn[ type ] = function( fn ) {
 +
return this.on( type, fn );
 
};
 
};
 +
} );
  
  
var owlCarousel = function(){
+
 
 +
 
 +
jQuery.expr.filters.animated = function( elem ) {
 +
return jQuery.grep( jQuery.timers, function( fn ) {
 +
return elem === fn.elem;
 +
} ).length;
 +
};
 +
 
 +
 
 +
 
 +
 
 +
 
 +
/**
 +
* Gets a window from an element
 +
*/
 +
function getWindow( elem ) {
 +
return jQuery.isWindow( elem ) ?
 +
elem :
 +
elem.nodeType === 9 ?
 +
elem.defaultView || elem.parentWindow :
 +
false;
 +
}
 +
 
 +
jQuery.offset = {
 +
setOffset: function( elem, options, i ) {
 +
var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
 +
position = jQuery.css( elem, "position" ),
 +
curElem = jQuery( elem ),
 +
props = {};
 +
 
 +
// set position first, in-case top/left are set even on static elem
 +
if ( position === "static" ) {
 +
elem.style.position = "relative";
 +
}
 +
 
 +
curOffset = curElem.offset();
 +
curCSSTop = jQuery.css( elem, "top" );
 +
curCSSLeft = jQuery.css( elem, "left" );
 +
calculatePosition = ( position === "absolute" || position === "fixed" ) &&
 +
jQuery.inArray( "auto", [ curCSSTop, curCSSLeft ] ) > -1;
 +
 
 +
// need to be able to calculate position if either top or left
 +
// is auto and position is either absolute or fixed
 +
if ( calculatePosition ) {
 +
curPosition = curElem.position();
 +
curTop = curPosition.top;
 +
curLeft = curPosition.left;
 +
} else {
 +
curTop = parseFloat( curCSSTop ) || 0;
 +
curLeft = parseFloat( curCSSLeft ) || 0;
 +
}
 +
 
 +
if ( jQuery.isFunction( options ) ) {
 +
 
 +
// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
 +
options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
 +
}
 +
 
 +
if ( options.top != null ) {
 +
props.top = ( options.top - curOffset.top ) + curTop;
 +
}
 +
if ( options.left != null ) {
 +
props.left = ( options.left - curOffset.left ) + curLeft;
 +
}
 +
 
 +
if ( "using" in options ) {
 +
options.using.call( elem, props );
 +
} else {
 +
curElem.css( props );
 +
}
 +
}
 +
};
 +
 
 +
jQuery.fn.extend( {
 +
offset: function( options ) {
 +
if ( arguments.length ) {
 +
return options === undefined ?
 +
this :
 +
this.each( function( i ) {
 +
jQuery.offset.setOffset( this, options, i );
 +
} );
 +
}
 +
 
 +
var docElem, win,
 +
box = { top: 0, left: 0 },
 +
elem = this[ 0 ],
 +
doc = elem && elem.ownerDocument;
 +
 
 +
if ( !doc ) {
 +
return;
 +
}
 +
 
 +
docElem = doc.documentElement;
 +
 
 +
// Make sure it's not a disconnected DOM node
 +
if ( !jQuery.contains( docElem, elem ) ) {
 +
return box;
 +
}
 +
 
 +
// If we don't have gBCR, just use 0,0 rather than error
 +
// BlackBerry 5, iOS 3 (original iPhone)
 +
if ( typeof elem.getBoundingClientRect !== "undefined" ) {
 +
box = elem.getBoundingClientRect();
 +
}
 +
win = getWindow( doc );
 +
return {
 +
top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
 +
left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
 +
};
 +
},
 +
 
 +
position: function() {
 +
if ( !this[ 0 ] ) {
 +
return;
 +
}
 +
 
 +
var offsetParent, offset,
 +
parentOffset = { top: 0, left: 0 },
 +
elem = this[ 0 ];
 +
 
 +
// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
 +
// because it is its only offset parent
 +
if ( jQuery.css( elem, "position" ) === "fixed" ) {
 +
 
 +
// we assume that getBoundingClientRect is available when computed position is fixed
 +
offset = elem.getBoundingClientRect();
 +
} else {
 +
 
 +
// Get *real* offsetParent
 +
offsetParent = this.offsetParent();
 +
 
 +
// Get correct offsets
 +
offset = this.offset();
 +
if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
 +
parentOffset = offsetParent.offset();
 +
}
 +
 
 +
// Add offsetParent borders
 +
parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
 +
parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
 +
}
 +
 
 +
// Subtract parent offsets and element margins
 +
// note: when an element has margin: auto the offsetLeft and marginLeft
 +
// are the same in Safari causing offset.left to incorrectly be 0
 +
return {
 +
top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
 +
left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
 +
};
 +
},
 +
 
 +
offsetParent: function() {
 +
return this.map( function() {
 +
var offsetParent = this.offsetParent;
 +
 
 +
while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) &&
 +
jQuery.css( offsetParent, "position" ) === "static" ) ) {
 +
offsetParent = offsetParent.offsetParent;
 +
}
 +
return offsetParent || documentElement;
 +
} );
 +
}
 +
} );
 +
 
 +
// Create scrollLeft and scrollTop methods
 +
jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
 +
var top = /Y/.test( prop );
 +
 
 +
jQuery.fn[ method ] = function( val ) {
 +
return access( this, function( elem, method, val ) {
 +
var win = getWindow( elem );
 +
 
 +
if ( val === undefined ) {
 +
return win ? ( prop in win ) ? win[ prop ] :
 +
win.document.documentElement[ method ] :
 +
elem[ method ];
 +
}
 +
 
 +
if ( win ) {
 +
win.scrollTo(
 +
!top ? val : jQuery( win ).scrollLeft(),
 +
top ? val : jQuery( win ).scrollTop()
 +
);
 +
 
 +
} else {
 +
elem[ method ] = val;
 +
}
 +
}, method, val, arguments.length, null );
 +
};
 +
} );
 +
 
 +
// Support: Safari<7-8+, Chrome<37-44+
 +
// Add the top/left cssHooks using jQuery.fn.position
 +
// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
 +
// getComputedStyle returns percent when specified for top/left/bottom/right
 +
// rather than make the css module depend on the offset module, we just check for it here
 +
jQuery.each( [ "top", "left" ], function( i, prop ) {
 +
jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
 +
function( elem, computed ) {
 +
if ( computed ) {
 +
computed = curCSS( elem, prop );
 +
 
 +
// if curCSS returns percentage, fallback to offset
 +
return rnumnonpx.test( computed ) ?
 +
jQuery( elem ).position()[ prop ] + "px" :
 +
computed;
 +
}
 +
}
 +
);
 +
} );
 +
 
 +
 
 +
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
 +
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
 +
jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
 +
function( defaultExtra, funcName ) {
 +
 
 +
// margin is only for outerHeight, outerWidth
 +
jQuery.fn[ funcName ] = function( margin, value ) {
 +
var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
 +
extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
 +
 
 +
return access( this, function( elem, type, value ) {
 +
var doc;
 +
 
 +
if ( jQuery.isWindow( elem ) ) {
 +
 
 +
// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
 +
// isn't a whole lot we can do. See pull request at this URL for discussion:
 +
// https://github.com/jquery/jquery/pull/764
 +
return elem.document.documentElement[ "client" + name ];
 +
}
 +
 
 +
// Get document width or height
 +
if ( elem.nodeType === 9 ) {
 +
doc = elem.documentElement;
 +
 
 +
// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
 +
// whichever is greatest
 +
// unfortunately, this causes bug #3838 in IE6/8 only,
 +
// but there is currently no good, small way to fix it.
 +
return Math.max(
 +
elem.body[ "scroll" + name ], doc[ "scroll" + name ],
 +
elem.body[ "offset" + name ], doc[ "offset" + name ],
 +
doc[ "client" + name ]
 +
);
 +
}
 +
 
 +
return value === undefined ?
 +
 
 +
// Get width or height on the element, requesting but not forcing parseFloat
 +
jQuery.css( elem, type, extra ) :
 +
 
 +
// Set width or height on the element
 +
jQuery.style( elem, type, value, extra );
 +
}, type, chainable ? margin : undefined, chainable, null );
 +
};
 +
} );
 +
} );
 +
 
 +
 
 +
jQuery.fn.extend( {
 +
 
 +
bind: function( types, data, fn ) {
 +
return this.on( types, null, data, fn );
 +
},
 +
unbind: function( types, fn ) {
 +
return this.off( types, null, fn );
 +
},
 +
 
 +
delegate: function( selector, types, data, fn ) {
 +
return this.on( types, selector, data, fn );
 +
},
 +
undelegate: function( selector, types, fn ) {
 +
 
 +
// ( namespace ) or ( selector, types [, fn] )
 +
return arguments.length === 1 ?
 +
this.off( selector, "**" ) :
 +
this.off( types, selector || "**", fn );
 +
}
 +
} );
 +
 
 +
// The number of elements contained in the matched element set
 +
jQuery.fn.size = function() {
 +
return this.length;
 +
};
 +
 
 +
jQuery.fn.andSelf = jQuery.fn.addBack;
 +
 
 +
 
 +
 
 +
 
 +
// Register as a named AMD module, since jQuery can be concatenated with other
 +
// files that may use define, but not via a proper concatenation script that
 +
// understands anonymous AMD modules. A named AMD is safest and most robust
 +
// way to register. Lowercase jquery is used because AMD module names are
 +
// derived from file names, and jQuery is normally delivered in a lowercase
 +
// file name. Do this after creating the global so that if an AMD module wants
 +
// to call noConflict to hide this version of jQuery, it will work.
 +
 
 +
// Note that for maximum portability, libraries that are not jQuery should
 +
// declare themselves as anonymous modules, and avoid setting a global if an
 +
// AMD loader is present. jQuery is a special case. For more information, see
 +
// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
 +
 
 +
if ( typeof define === "function" && define.amd ) {
 +
define( "jquery", [], function() {
 +
return jQuery;
 +
} );
 +
}
 +
 
 +
 
 +
 
 +
var
 +
 
 +
// Map over jQuery in case of overwrite
 +
_jQuery = window.jQuery,
 +
 
 +
// Map over the $ in case of overwrite
 +
_$ = window.$;
 +
 
 +
jQuery.noConflict = function( deep ) {
 +
if ( window.$ === jQuery ) {
 +
window.$ = _$;
 +
}
 +
 
 +
if ( deep && window.jQuery === jQuery ) {
 +
window.jQuery = _jQuery;
 +
}
 +
 
 +
return jQuery;
 +
};
 +
 
 +
// Expose jQuery and $ identifiers, even in
 +
// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
 +
// and CommonJS for browser emulators (#13566)
 +
if ( !noGlobal ) {
 +
window.jQuery = window.$ = jQuery;
 +
}
 +
 
 +
return jQuery;
 +
}));
 +
 
 +
 
 +
/*!
 +
* Bootstrap v3.3.7 (http://getbootstrap.com)
 +
* Copyright 2011-2016 Twitter, Inc.
 +
* Licensed under the MIT license
 +
*/
 +
 
 +
if (typeof jQuery === 'undefined') {
 +
  throw new Error('Bootstrap\'s JavaScript requires jQuery')
 +
}
 +
 
 +
+function ($) {
 +
  'use strict';
 +
  var version = $.fn.jquery.split(' ')[0].split('.')
 +
  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {
 +
    throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')
 +
  }
 +
}(jQuery);
 +
 
 +
/* ========================================================================
 +
* Bootstrap: transition.js v3.3.7
 +
* http://getbootstrap.com/javascript/#transitions
 +
* ========================================================================
 +
* Copyright 2011-2016 Twitter, Inc.
 +
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 +
* ======================================================================== */
 +
 
 +
 
 +
+function ($) {
 +
  'use strict';
 +
 
 +
  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
 +
  // ============================================================
 +
 
 +
  function transitionEnd() {
 +
    var el = document.createElement('bootstrap')
 +
 
 +
    var transEndEventNames = {
 +
      WebkitTransition : 'webkitTransitionEnd',
 +
      MozTransition    : 'transitionend',
 +
      OTransition      : 'oTransitionEnd otransitionend',
 +
      transition      : 'transitionend'
 +
    }
 +
 
 +
    for (var name in transEndEventNames) {
 +
      if (el.style[name] !== undefined) {
 +
        return { end: transEndEventNames[name] }
 +
      }
 +
    }
 +
 
 +
    return false // explicit for ie8 (  ._.)
 +
  }
 +
 
 +
  // http://blog.alexmaccaw.com/css-transitions
 +
  $.fn.emulateTransitionEnd = function (duration) {
 +
    var called = false
 +
    var $el = this
 +
    $(this).one('bsTransitionEnd', function () { called = true })
 +
    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
 +
    setTimeout(callback, duration)
 +
    return this
 +
  }
 +
 
 +
  $(function () {
 +
    $.support.transition = transitionEnd()
 +
 
 +
    if (!$.support.transition) return
 +
 
 +
    $.event.special.bsTransitionEnd = {
 +
      bindType: $.support.transition.end,
 +
      delegateType: $.support.transition.end,
 +
      handle: function (e) {
 +
        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
 +
      }
 +
    }
 +
  })
 +
 
 +
}(jQuery);
 +
 
 +
/* ========================================================================
 +
* Bootstrap: alert.js v3.3.7
 +
* http://getbootstrap.com/javascript/#alerts
 +
* ========================================================================
 +
* Copyright 2011-2016 Twitter, Inc.
 +
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 +
* ======================================================================== */
 +
 
 +
 
 +
+function ($) {
 +
  'use strict';
 +
 
 +
  // ALERT CLASS DEFINITION
 +
  // ======================
 +
 
 +
  var dismiss = '[data-dismiss="alert"]'
 +
  var Alert  = function (el) {
 +
    $(el).on('click', dismiss, this.close)
 +
  }
 +
 
 +
  Alert.VERSION = '3.3.7'
 +
 
 +
  Alert.TRANSITION_DURATION = 150
 +
 
 +
  Alert.prototype.close = function (e) {
 +
    var $this    = $(this)
 +
    var selector = $this.attr('data-target')
 +
 
 +
    if (!selector) {
 +
      selector = $this.attr('href')
 +
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
 +
    }
 +
 
 +
    var $parent = $(selector === '#' ? [] : selector)
 +
 
 +
    if (e) e.preventDefault()
 +
 
 +
    if (!$parent.length) {
 +
      $parent = $this.closest('.alert')
 +
    }
 +
 
 +
    $parent.trigger(e = $.Event('close.bs.alert'))
 +
 
 +
    if (e.isDefaultPrevented()) return
 +
 
 +
    $parent.removeClass('in')
 +
 
 +
    function removeElement() {
 +
      // detach from parent, fire event then clean up data
 +
      $parent.detach().trigger('closed.bs.alert').remove()
 +
    }
 +
 
 +
    $.support.transition && $parent.hasClass('fade') ?
 +
      $parent
 +
        .one('bsTransitionEnd', removeElement)
 +
        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
 +
      removeElement()
 +
  }
 +
 
 +
 
 +
  // ALERT PLUGIN DEFINITION
 +
  // =======================
 +
 
 +
  function Plugin(option) {
 +
    return this.each(function () {
 +
      var $this = $(this)
 +
      var data  = $this.data('bs.alert')
 +
 
 +
      if (!data) $this.data('bs.alert', (data = new Alert(this)))
 +
      if (typeof option == 'string') data[option].call($this)
 +
    })
 +
  }
 +
 
 +
  var old = $.fn.alert
 +
 
 +
  $.fn.alert            = Plugin
 +
  $.fn.alert.Constructor = Alert
 +
 
 +
 
 +
  // ALERT NO CONFLICT
 +
  // =================
 +
 
 +
  $.fn.alert.noConflict = function () {
 +
    $.fn.alert = old
 +
    return this
 +
  }
 +
 
 +
 
 +
  // ALERT DATA-API
 +
  // ==============
 +
 
 +
  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
 +
 
 +
}(jQuery);
 +
 
 +
/* ========================================================================
 +
* Bootstrap: button.js v3.3.7
 +
* http://getbootstrap.com/javascript/#buttons
 +
* ========================================================================
 +
* Copyright 2011-2016 Twitter, Inc.
 +
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 +
* ======================================================================== */
 +
 
 +
 
 +
+function ($) {
 +
  'use strict';
 +
 
 +
  // BUTTON PUBLIC CLASS DEFINITION
 +
  // ==============================
 +
 
 +
  var Button = function (element, options) {
 +
    this.$element  = $(element)
 +
    this.options  = $.extend({}, Button.DEFAULTS, options)
 +
    this.isLoading = false
 +
  }
 +
 
 +
  Button.VERSION  = '3.3.7'
 +
 
 +
  Button.DEFAULTS = {
 +
    loadingText: 'loading...'
 +
  }
 +
 
 +
  Button.prototype.setState = function (state) {
 +
    var d    = 'disabled'
 +
    var $el  = this.$element
 +
    var val  = $el.is('input') ? 'val' : 'html'
 +
    var data = $el.data()
 +
 
 +
    state += 'Text'
 +
 
 +
    if (data.resetText == null) $el.data('resetText', $el[val]())
 +
 
 +
    // push to event loop to allow forms to submit
 +
    setTimeout($.proxy(function () {
 +
      $el[val](data[state] == null ? this.options[state] : data[state])
 +
 
 +
      if (state == 'loadingText') {
 +
        this.isLoading = true
 +
        $el.addClass(d).attr(d, d).prop(d, true)
 +
      } else if (this.isLoading) {
 +
        this.isLoading = false
 +
        $el.removeClass(d).removeAttr(d).prop(d, false)
 +
      }
 +
    }, this), 0)
 +
  }
 +
 
 +
  Button.prototype.toggle = function () {
 +
    var changed = true
 +
    var $parent = this.$element.closest('[data-toggle="buttons"]')
 +
 
 +
    if ($parent.length) {
 +
      var $input = this.$element.find('input')
 +
      if ($input.prop('type') == 'radio') {
 +
        if ($input.prop('checked')) changed = false
 +
        $parent.find('.active').removeClass('active')
 +
        this.$element.addClass('active')
 +
      } else if ($input.prop('type') == 'checkbox') {
 +
        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
 +
        this.$element.toggleClass('active')
 +
      }
 +
      $input.prop('checked', this.$element.hasClass('active'))
 +
      if (changed) $input.trigger('change')
 +
    } else {
 +
      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
 +
      this.$element.toggleClass('active')
 +
    }
 +
  }
 +
 
 +
 
 +
  // BUTTON PLUGIN DEFINITION
 +
  // ========================
 +
 
 +
  function Plugin(option) {
 +
    return this.each(function () {
 +
      var $this  = $(this)
 +
      var data    = $this.data('bs.button')
 +
      var options = typeof option == 'object' && option
 +
 
 +
      if (!data) $this.data('bs.button', (data = new Button(this, options)))
 +
 
 +
      if (option == 'toggle') data.toggle()
 +
      else if (option) data.setState(option)
 +
    })
 +
  }
 +
 
 +
  var old = $.fn.button
 +
 
 +
  $.fn.button            = Plugin
 +
  $.fn.button.Constructor = Button
 +
 
 +
 
 +
  // BUTTON NO CONFLICT
 +
  // ==================
 +
 
 +
  $.fn.button.noConflict = function () {
 +
    $.fn.button = old
 +
    return this
 +
  }
 +
 
 +
 
 +
  // BUTTON DATA-API
 +
  // ===============
 +
 
 +
  $(document)
 +
    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
 +
      var $btn = $(e.target).closest('.btn')
 +
      Plugin.call($btn, 'toggle')
 +
      if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
 +
        // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
 +
        e.preventDefault()
 +
        // The target component still receive the focus
 +
        if ($btn.is('input,button')) $btn.trigger('focus')
 +
        else $btn.find('input:visible,button:visible').first().trigger('focus')
 +
      }
 +
    })
 +
    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
 +
      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
 +
    })
 +
 
 +
}(jQuery);
 +
 
 +
/* ========================================================================
 +
* Bootstrap: carousel.js v3.3.7
 +
* http://getbootstrap.com/javascript/#carousel
 +
* ========================================================================
 +
* Copyright 2011-2016 Twitter, Inc.
 +
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 +
* ======================================================================== */
 +
 
 +
 
 +
+function ($) {
 +
  'use strict';
 +
 
 +
  // CAROUSEL CLASS DEFINITION
 +
  // =========================
 +
 
 +
  var Carousel = function (element, options) {
 +
    this.$element    = $(element)
 +
    this.$indicators = this.$element.find('.carousel-indicators')
 +
    this.options    = options
 +
    this.paused      = null
 +
    this.sliding    = null
 +
    this.interval    = null
 +
    this.$active    = null
 +
    this.$items      = null
 +
 
 +
    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
 +
 
 +
    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
 +
      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
 +
      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
 +
  }
 +
 
 +
  Carousel.VERSION  = '3.3.7'
 +
 
 +
  Carousel.TRANSITION_DURATION = 600
 +
 
 +
  Carousel.DEFAULTS = {
 +
    interval: 5000,
 +
    pause: 'hover',
 +
    wrap: true,
 +
    keyboard: true
 +
  }
 +
 
 +
  Carousel.prototype.keydown = function (e) {
 +
    if (/input|textarea/i.test(e.target.tagName)) return
 +
    switch (e.which) {
 +
      case 37: this.prev(); break
 +
      case 39: this.next(); break
 +
      default: return
 +
    }
 +
 
 +
    e.preventDefault()
 +
  }
 +
 
 +
  Carousel.prototype.cycle = function (e) {
 +
    e || (this.paused = false)
 +
 
 +
    this.interval && clearInterval(this.interval)
 +
 
 +
    this.options.interval
 +
      && !this.paused
 +
      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
 +
 
 +
    return this
 +
  }
 +
 
 +
  Carousel.prototype.getItemIndex = function (item) {
 +
    this.$items = item.parent().children('.item')
 +
    return this.$items.index(item || this.$active)
 +
  }
 +
 
 +
  Carousel.prototype.getItemForDirection = function (direction, active) {
 +
    var activeIndex = this.getItemIndex(active)
 +
    var willWrap = (direction == 'prev' && activeIndex === 0)
 +
                || (direction == 'next' && activeIndex == (this.$items.length - 1))
 +
    if (willWrap && !this.options.wrap) return active
 +
    var delta = direction == 'prev' ? -1 : 1
 +
    var itemIndex = (activeIndex + delta) % this.$items.length
 +
    return this.$items.eq(itemIndex)
 +
  }
 +
 
 +
  Carousel.prototype.to = function (pos) {
 +
    var that        = this
 +
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
 +
 
 +
    if (pos > (this.$items.length - 1) || pos < 0) return
 +
 
 +
    if (this.sliding)      return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
 +
    if (activeIndex == pos) return this.pause().cycle()
 +
 
 +
    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
 +
  }
 +
 
 +
  Carousel.prototype.pause = function (e) {
 +
    e || (this.paused = true)
 +
 
 +
    if (this.$element.find('.next, .prev').length && $.support.transition) {
 +
      this.$element.trigger($.support.transition.end)
 +
      this.cycle(true)
 +
    }
 +
 
 +
    this.interval = clearInterval(this.interval)
 +
 
 +
    return this
 +
  }
 +
 
 +
  Carousel.prototype.next = function () {
 +
    if (this.sliding) return
 +
    return this.slide('next')
 +
  }
 +
 
 +
  Carousel.prototype.prev = function () {
 +
    if (this.sliding) return
 +
    return this.slide('prev')
 +
  }
 +
 
 +
  Carousel.prototype.slide = function (type, next) {
 +
    var $active  = this.$element.find('.item.active')
 +
    var $next    = next || this.getItemForDirection(type, $active)
 +
    var isCycling = this.interval
 +
    var direction = type == 'next' ? 'left' : 'right'
 +
    var that      = this
 +
 
 +
    if ($next.hasClass('active')) return (this.sliding = false)
 +
 
 +
    var relatedTarget = $next[0]
 +
    var slideEvent = $.Event('slide.bs.carousel', {
 +
      relatedTarget: relatedTarget,
 +
      direction: direction
 +
    })
 +
    this.$element.trigger(slideEvent)
 +
    if (slideEvent.isDefaultPrevented()) return
 +
 
 +
    this.sliding = true
 +
 
 +
    isCycling && this.pause()
 +
 
 +
    if (this.$indicators.length) {
 +
      this.$indicators.find('.active').removeClass('active')
 +
      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
 +
      $nextIndicator && $nextIndicator.addClass('active')
 +
    }
 +
 
 +
    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
 +
    if ($.support.transition && this.$element.hasClass('slide')) {
 +
      $next.addClass(type)
 +
      $next[0].offsetWidth // force reflow
 +
      $active.addClass(direction)
 +
      $next.addClass(direction)
 +
      $active
 +
        .one('bsTransitionEnd', function () {
 +
          $next.removeClass([type, direction].join(' ')).addClass('active')
 +
          $active.removeClass(['active', direction].join(' '))
 +
          that.sliding = false
 +
          setTimeout(function () {
 +
            that.$element.trigger(slidEvent)
 +
          }, 0)
 +
        })
 +
        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
 +
    } else {
 +
      $active.removeClass('active')
 +
      $next.addClass('active')
 +
      this.sliding = false
 +
      this.$element.trigger(slidEvent)
 +
    }
 +
 
 +
    isCycling && this.cycle()
 +
 
 +
    return this
 +
  }
 +
 
 +
 
 +
  // CAROUSEL PLUGIN DEFINITION
 +
  // ==========================
 +
 
 +
  function Plugin(option) {
 +
    return this.each(function () {
 +
      var $this  = $(this)
 +
      var data    = $this.data('bs.carousel')
 +
      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
 +
      var action  = typeof option == 'string' ? option : options.slide
 +
 
 +
      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
 +
      if (typeof option == 'number') data.to(option)
 +
      else if (action) data[action]()
 +
      else if (options.interval) data.pause().cycle()
 +
    })
 +
  }
 +
 
 +
  var old = $.fn.carousel
 +
 
 +
  $.fn.carousel            = Plugin
 +
  $.fn.carousel.Constructor = Carousel
 +
 
 +
 
 +
  // CAROUSEL NO CONFLICT
 +
  // ====================
 +
 
 +
  $.fn.carousel.noConflict = function () {
 +
    $.fn.carousel = old
 +
    return this
 +
  }
 +
 
 +
 
 +
  // CAROUSEL DATA-API
 +
  // =================
 +
 
 +
  var clickHandler = function (e) {
 +
    var href
 +
    var $this  = $(this)
 +
    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
 +
    if (!$target.hasClass('carousel')) return
 +
    var options = $.extend({}, $target.data(), $this.data())
 +
    var slideIndex = $this.attr('data-slide-to')
 +
    if (slideIndex) options.interval = false
 +
 
 +
    Plugin.call($target, options)
 +
 
 +
    if (slideIndex) {
 +
      $target.data('bs.carousel').to(slideIndex)
 +
    }
 +
 
 +
    e.preventDefault()
 +
  }
 +
 
 +
  $(document)
 +
    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
 +
    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
 +
 
 +
  $(window).on('load', function () {
 +
    $('[data-ride="carousel"]').each(function () {
 +
      var $carousel = $(this)
 +
      Plugin.call($carousel, $carousel.data())
 +
    })
 +
  })
 +
 
 +
}(jQuery);
 +
 
 +
/* ========================================================================
 +
* Bootstrap: collapse.js v3.3.7
 +
* http://getbootstrap.com/javascript/#collapse
 +
* ========================================================================
 +
* Copyright 2011-2016 Twitter, Inc.
 +
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 +
* ======================================================================== */
 +
 
 +
/* jshint latedef: false */
 +
 
 +
+function ($) {
 +
  'use strict';
 +
 
 +
  // COLLAPSE PUBLIC CLASS DEFINITION
 +
  // ================================
 +
 
 +
  var Collapse = function (element, options) {
 +
    this.$element      = $(element)
 +
    this.options      = $.extend({}, Collapse.DEFAULTS, options)
 +
    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
 +
                          '[data-toggle="collapse"][data-target="#' + element.id + '"]')
 +
    this.transitioning = null
 +
 
 +
    if (this.options.parent) {
 +
      this.$parent = this.getParent()
 +
    } else {
 +
      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
 +
    }
 +
 
 +
    if (this.options.toggle) this.toggle()
 +
  }
 +
 
 +
  Collapse.VERSION  = '3.3.7'
 +
 
 +
  Collapse.TRANSITION_DURATION = 350
 +
 
 +
  Collapse.DEFAULTS = {
 +
    toggle: true
 +
  }
 +
 
 +
  Collapse.prototype.dimension = function () {
 +
    var hasWidth = this.$element.hasClass('width')
 +
    return hasWidth ? 'width' : 'height'
 +
  }
 +
 
 +
  Collapse.prototype.show = function () {
 +
    if (this.transitioning || this.$element.hasClass('in')) return
 +
 
 +
    var activesData
 +
    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
 +
 
 +
    if (actives && actives.length) {
 +
      activesData = actives.data('bs.collapse')
 +
      if (activesData && activesData.transitioning) return
 +
    }
 +
 
 +
    var startEvent = $.Event('show.bs.collapse')
 +
    this.$element.trigger(startEvent)
 +
    if (startEvent.isDefaultPrevented()) return
 +
 
 +
    if (actives && actives.length) {
 +
      Plugin.call(actives, 'hide')
 +
      activesData || actives.data('bs.collapse', null)
 +
    }
 +
 
 +
    var dimension = this.dimension()
 +
 
 +
    this.$element
 +
      .removeClass('collapse')
 +
      .addClass('collapsing')[dimension](0)
 +
      .attr('aria-expanded', true)
 +
 
 +
    this.$trigger
 +
      .removeClass('collapsed')
 +
      .attr('aria-expanded', true)
 +
 
 +
    this.transitioning = 1
 +
 
 +
    var complete = function () {
 +
      this.$element
 +
        .removeClass('collapsing')
 +
        .addClass('collapse in')[dimension]('')
 +
      this.transitioning = 0
 +
      this.$element
 +
        .trigger('shown.bs.collapse')
 +
    }
 +
 
 +
    if (!$.support.transition) return complete.call(this)
 +
 
 +
    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
 +
 
 +
    this.$element
 +
      .one('bsTransitionEnd', $.proxy(complete, this))
 +
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
 +
  }
 +
 
 +
  Collapse.prototype.hide = function () {
 +
    if (this.transitioning || !this.$element.hasClass('in')) return
 +
 
 +
    var startEvent = $.Event('hide.bs.collapse')
 +
    this.$element.trigger(startEvent)
 +
    if (startEvent.isDefaultPrevented()) return
 +
 
 +
    var dimension = this.dimension()
 +
 
 +
    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
 +
 
 +
    this.$element
 +
      .addClass('collapsing')
 +
      .removeClass('collapse in')
 +
      .attr('aria-expanded', false)
 +
 
 +
    this.$trigger
 +
      .addClass('collapsed')
 +
      .attr('aria-expanded', false)
 +
 
 +
    this.transitioning = 1
 +
 
 +
    var complete = function () {
 +
      this.transitioning = 0
 +
      this.$element
 +
        .removeClass('collapsing')
 +
        .addClass('collapse')
 +
        .trigger('hidden.bs.collapse')
 +
    }
 +
 
 +
    if (!$.support.transition) return complete.call(this)
 +
 
 +
    this.$element
 +
      [dimension](0)
 +
      .one('bsTransitionEnd', $.proxy(complete, this))
 +
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
 +
  }
 +
 
 +
  Collapse.prototype.toggle = function () {
 +
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
 +
  }
 +
 
 +
  Collapse.prototype.getParent = function () {
 +
    return $(this.options.parent)
 +
      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
 +
      .each($.proxy(function (i, element) {
 +
        var $element = $(element)
 +
        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
 +
      }, this))
 +
      .end()
 +
  }
 +
 
 +
  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
 +
    var isOpen = $element.hasClass('in')
 +
 
 +
    $element.attr('aria-expanded', isOpen)
 +
    $trigger
 +
      .toggleClass('collapsed', !isOpen)
 +
      .attr('aria-expanded', isOpen)
 +
  }
 +
 
 +
  function getTargetFromTrigger($trigger) {
 +
    var href
 +
    var target = $trigger.attr('data-target')
 +
      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
 +
 
 +
    return $(target)
 +
  }
 +
 
 +
 
 +
  // COLLAPSE PLUGIN DEFINITION
 +
  // ==========================
 +
 
 +
  function Plugin(option) {
 +
    return this.each(function () {
 +
      var $this  = $(this)
 +
      var data    = $this.data('bs.collapse')
 +
      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
 +
 
 +
      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
 +
      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
 +
      if (typeof option == 'string') data[option]()
 +
    })
 +
  }
 +
 
 +
  var old = $.fn.collapse
 +
 
 +
  $.fn.collapse            = Plugin
 +
  $.fn.collapse.Constructor = Collapse
 +
 
 +
 
 +
  // COLLAPSE NO CONFLICT
 +
  // ====================
 +
 
 +
  $.fn.collapse.noConflict = function () {
 +
    $.fn.collapse = old
 +
    return this
 +
  }
 +
 
 +
 
 +
  // COLLAPSE DATA-API
 +
  // =================
 +
 
 +
  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
 +
    var $this  = $(this)
 +
 
 +
    if (!$this.attr('data-target')) e.preventDefault()
 +
 
 +
    var $target = getTargetFromTrigger($this)
 +
    var data    = $target.data('bs.collapse')
 +
    var option  = data ? 'toggle' : $this.data()
 +
 
 +
    Plugin.call($target, option)
 +
  })
 +
 
 +
}(jQuery);
 +
 
 +
/* ========================================================================
 +
* Bootstrap: dropdown.js v3.3.7
 +
* http://getbootstrap.com/javascript/#dropdowns
 +
* ========================================================================
 +
* Copyright 2011-2016 Twitter, Inc.
 +
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 +
* ======================================================================== */
 +
 
 +
 
 +
+function ($) {
 +
  'use strict';
 +
 
 +
  // DROPDOWN CLASS DEFINITION
 +
  // =========================
 +
 
 +
  var backdrop = '.dropdown-backdrop'
 +
  var toggle  = '[data-toggle="dropdown"]'
 +
  var Dropdown = function (element) {
 +
    $(element).on('click.bs.dropdown', this.toggle)
 +
  }
 +
 
 +
  Dropdown.VERSION = '3.3.7'
 +
 
 +
  function getParent($this) {
 +
    var selector = $this.attr('data-target')
 +
 
 +
    if (!selector) {
 +
      selector = $this.attr('href')
 +
      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
 +
    }
 +
 
 +
    var $parent = selector && $(selector)
 +
 
 +
    return $parent && $parent.length ? $parent : $this.parent()
 +
  }
 +
 
 +
  function clearMenus(e) {
 +
    if (e && e.which === 3) return
 +
    $(backdrop).remove()
 +
    $(toggle).each(function () {
 +
      var $this        = $(this)
 +
      var $parent      = getParent($this)
 +
      var relatedTarget = { relatedTarget: this }
 +
 
 +
      if (!$parent.hasClass('open')) return
 +
 
 +
      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
 +
 
 +
      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
 +
 
 +
      if (e.isDefaultPrevented()) return
 +
 
 +
      $this.attr('aria-expanded', 'false')
 +
      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
 +
    })
 +
  }
 +
 
 +
  Dropdown.prototype.toggle = function (e) {
 +
    var $this = $(this)
 +
 
 +
    if ($this.is('.disabled, :disabled')) return
 +
 
 +
    var $parent  = getParent($this)
 +
    var isActive = $parent.hasClass('open')
 +
 
 +
    clearMenus()
 +
 
 +
    if (!isActive) {
 +
      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
 +
        // if mobile we use a backdrop because click events don't delegate
 +
        $(document.createElement('div'))
 +
          .addClass('dropdown-backdrop')
 +
          .insertAfter($(this))
 +
          .on('click', clearMenus)
 +
      }
 +
 
 +
      var relatedTarget = { relatedTarget: this }
 +
      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
 +
 
 +
      if (e.isDefaultPrevented()) return
 +
 
 +
      $this
 +
        .trigger('focus')
 +
        .attr('aria-expanded', 'true')
 +
 
 +
      $parent
 +
        .toggleClass('open')
 +
        .trigger($.Event('shown.bs.dropdown', relatedTarget))
 +
    }
 +
 
 +
    return false
 +
  }
 +
 
 +
  Dropdown.prototype.keydown = function (e) {
 +
    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
 +
 
 +
    var $this = $(this)
 +
 
 +
    e.preventDefault()
 +
    e.stopPropagation()
 +
 
 +
    if ($this.is('.disabled, :disabled')) return
 +
 
 +
    var $parent  = getParent($this)
 +
    var isActive = $parent.hasClass('open')
 +
 
 +
    if (!isActive && e.which != 27 || isActive && e.which == 27) {
 +
      if (e.which == 27) $parent.find(toggle).trigger('focus')
 +
      return $this.trigger('click')
 +
    }
 +
 
 +
    var desc = ' li:not(.disabled):visible a'
 +
    var $items = $parent.find('.dropdown-menu' + desc)
 +
 
 +
    if (!$items.length) return
 +
 
 +
    var index = $items.index(e.target)
 +
 
 +
    if (e.which == 38 && index > 0)                index--        // up
 +
    if (e.which == 40 && index < $items.length - 1) index++        // down
 +
    if (!~index)                                    index = 0
 +
 
 +
    $items.eq(index).trigger('focus')
 +
  }
 +
 
 +
 
 +
  // DROPDOWN PLUGIN DEFINITION
 +
  // ==========================
 +
 
 +
  function Plugin(option) {
 +
    return this.each(function () {
 +
      var $this = $(this)
 +
      var data  = $this.data('bs.dropdown')
 +
 
 +
      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
 +
      if (typeof option == 'string') data[option].call($this)
 +
    })
 +
  }
 +
 
 +
  var old = $.fn.dropdown
 +
 
 +
  $.fn.dropdown            = Plugin
 +
  $.fn.dropdown.Constructor = Dropdown
 +
 
 +
 
 +
  // DROPDOWN NO CONFLICT
 +
  // ====================
 +
 
 +
  $.fn.dropdown.noConflict = function () {
 +
    $.fn.dropdown = old
 +
    return this
 +
  }
 +
 
 +
 
 +
  // APPLY TO STANDARD DROPDOWN ELEMENTS
 +
  // ===================================
 +
 
 +
  $(document)
 +
    .on('click.bs.dropdown.data-api', clearMenus)
 +
    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
 +
    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
 +
    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
 +
    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
 +
 
 +
}(jQuery);
 +
 
 +
/* ========================================================================
 +
* Bootstrap: modal.js v3.3.7
 +
* http://getbootstrap.com/javascript/#modals
 +
* ========================================================================
 +
* Copyright 2011-2016 Twitter, Inc.
 +
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 +
* ======================================================================== */
 +
 
 +
 
 +
+function ($) {
 +
  'use strict';
 +
 
 +
  // MODAL CLASS DEFINITION
 +
  // ======================
 +
 
 +
  var Modal = function (element, options) {
 +
    this.options            = options
 +
    this.$body              = $(document.body)
 +
    this.$element            = $(element)
 +
    this.$dialog            = this.$element.find('.modal-dialog')
 +
    this.$backdrop          = null
 +
    this.isShown            = null
 +
    this.originalBodyPad    = null
 +
    this.scrollbarWidth      = 0
 +
    this.ignoreBackdropClick = false
 +
 
 +
    if (this.options.remote) {
 +
      this.$element
 +
        .find('.modal-content')
 +
        .load(this.options.remote, $.proxy(function () {
 +
          this.$element.trigger('loaded.bs.modal')
 +
        }, this))
 +
    }
 +
  }
 +
 
 +
  Modal.VERSION  = '3.3.7'
 +
 
 +
  Modal.TRANSITION_DURATION = 300
 +
  Modal.BACKDROP_TRANSITION_DURATION = 150
 +
 
 +
  Modal.DEFAULTS = {
 +
    backdrop: true,
 +
    keyboard: true,
 +
    show: true
 +
  }
 +
 
 +
  Modal.prototype.toggle = function (_relatedTarget) {
 +
    return this.isShown ? this.hide() : this.show(_relatedTarget)
 +
  }
 +
 
 +
  Modal.prototype.show = function (_relatedTarget) {
 +
    var that = this
 +
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
 +
 
 +
    this.$element.trigger(e)
 +
 
 +
    if (this.isShown || e.isDefaultPrevented()) return
 +
 
 +
    this.isShown = true
 +
 
 +
    this.checkScrollbar()
 +
    this.setScrollbar()
 +
    this.$body.addClass('modal-open')
 +
 
 +
    this.escape()
 +
    this.resize()
 +
 
 +
    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
 +
 
 +
    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
 +
      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
 +
        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
 +
      })
 +
    })
 +
 
 +
    this.backdrop(function () {
 +
      var transition = $.support.transition && that.$element.hasClass('fade')
 +
 
 +
      if (!that.$element.parent().length) {
 +
        that.$element.appendTo(that.$body) // don't move modals dom position
 +
      }
 +
 
 +
      that.$element
 +
        .show()
 +
        .scrollTop(0)
 +
 
 +
      that.adjustDialog()
 +
 
 +
      if (transition) {
 +
        that.$element[0].offsetWidth // force reflow
 +
      }
 +
 
 +
      that.$element.addClass('in')
 +
 
 +
      that.enforceFocus()
 +
 
 +
      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
 +
 
 +
      transition ?
 +
        that.$dialog // wait for modal to slide in
 +
          .one('bsTransitionEnd', function () {
 +
            that.$element.trigger('focus').trigger(e)
 +
          })
 +
          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
 +
        that.$element.trigger('focus').trigger(e)
 +
    })
 +
  }
 +
 
 +
  Modal.prototype.hide = function (e) {
 +
    if (e) e.preventDefault()
 +
 
 +
    e = $.Event('hide.bs.modal')
 +
 
 +
    this.$element.trigger(e)
 +
 
 +
    if (!this.isShown || e.isDefaultPrevented()) return
 +
 
 +
    this.isShown = false
 +
 
 +
    this.escape()
 +
    this.resize()
 +
 
 +
    $(document).off('focusin.bs.modal')
 +
 
 +
    this.$element
 +
      .removeClass('in')
 +
      .off('click.dismiss.bs.modal')
 +
      .off('mouseup.dismiss.bs.modal')
 +
 
 +
    this.$dialog.off('mousedown.dismiss.bs.modal')
 +
 
 +
    $.support.transition && this.$element.hasClass('fade') ?
 +
      this.$element
 +
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
 +
        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
 +
      this.hideModal()
 +
  }
 +
 
 +
  Modal.prototype.enforceFocus = function () {
 +
    $(document)
 +
      .off('focusin.bs.modal') // guard against infinite focus loop
 +
      .on('focusin.bs.modal', $.proxy(function (e) {
 +
        if (document !== e.target &&
 +
            this.$element[0] !== e.target &&
 +
            !this.$element.has(e.target).length) {
 +
          this.$element.trigger('focus')
 +
        }
 +
      }, this))
 +
  }
 +
 
 +
  Modal.prototype.escape = function () {
 +
    if (this.isShown && this.options.keyboard) {
 +
      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
 +
        e.which == 27 && this.hide()
 +
      }, this))
 +
    } else if (!this.isShown) {
 +
      this.$element.off('keydown.dismiss.bs.modal')
 +
    }
 +
  }
 +
 
 +
  Modal.prototype.resize = function () {
 +
    if (this.isShown) {
 +
      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
 +
    } else {
 +
      $(window).off('resize.bs.modal')
 +
    }
 +
  }
 +
 
 +
  Modal.prototype.hideModal = function () {
 +
    var that = this
 +
    this.$element.hide()
 +
    this.backdrop(function () {
 +
      that.$body.removeClass('modal-open')
 +
      that.resetAdjustments()
 +
      that.resetScrollbar()
 +
      that.$element.trigger('hidden.bs.modal')
 +
    })
 +
  }
 +
 
 +
  Modal.prototype.removeBackdrop = function () {
 +
    this.$backdrop && this.$backdrop.remove()
 +
    this.$backdrop = null
 +
  }
 +
 
 +
  Modal.prototype.backdrop = function (callback) {
 +
    var that = this
 +
    var animate = this.$element.hasClass('fade') ? 'fade' : ''
 +
 
 +
    if (this.isShown && this.options.backdrop) {
 +
      var doAnimate = $.support.transition && animate
 +
 
 +
      this.$backdrop = $(document.createElement('div'))
 +
        .addClass('modal-backdrop ' + animate)
 +
        .appendTo(this.$body)
 +
 
 +
      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
 +
        if (this.ignoreBackdropClick) {
 +
          this.ignoreBackdropClick = false
 +
          return
 +
        }
 +
        if (e.target !== e.currentTarget) return
 +
        this.options.backdrop == 'static'
 +
          ? this.$element[0].focus()
 +
          : this.hide()
 +
      }, this))
 +
 
 +
      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
 +
 
 +
      this.$backdrop.addClass('in')
 +
 
 +
      if (!callback) return
 +
 
 +
      doAnimate ?
 +
        this.$backdrop
 +
          .one('bsTransitionEnd', callback)
 +
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
 +
        callback()
 +
 
 +
    } else if (!this.isShown && this.$backdrop) {
 +
      this.$backdrop.removeClass('in')
 +
 
 +
      var callbackRemove = function () {
 +
        that.removeBackdrop()
 +
        callback && callback()
 +
      }
 +
      $.support.transition && this.$element.hasClass('fade') ?
 +
        this.$backdrop
 +
          .one('bsTransitionEnd', callbackRemove)
 +
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
 +
        callbackRemove()
 +
 
 +
    } else if (callback) {
 +
      callback()
 +
    }
 +
  }
 +
 
 +
  // these following methods are used to handle overflowing modals
 +
 
 +
  Modal.prototype.handleUpdate = function () {
 +
    this.adjustDialog()
 +
  }
 +
 
 +
  Modal.prototype.adjustDialog = function () {
 +
    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
 +
 
 +
    this.$element.css({
 +
      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
 +
      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
 +
    })
 +
  }
 +
 
 +
  Modal.prototype.resetAdjustments = function () {
 +
    this.$element.css({
 +
      paddingLeft: '',
 +
      paddingRight: ''
 +
    })
 +
  }
 +
 
 +
  Modal.prototype.checkScrollbar = function () {
 +
    var fullWindowWidth = window.innerWidth
 +
    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
 +
      var documentElementRect = document.documentElement.getBoundingClientRect()
 +
      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
 +
    }
 +
    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
 +
    this.scrollbarWidth = this.measureScrollbar()
 +
  }
 +
 
 +
  Modal.prototype.setScrollbar = function () {
 +
    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
 +
    this.originalBodyPad = document.body.style.paddingRight || ''
 +
    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
 +
  }
 +
 
 +
  Modal.prototype.resetScrollbar = function () {
 +
    this.$body.css('padding-right', this.originalBodyPad)
 +
  }
 +
 
 +
  Modal.prototype.measureScrollbar = function () { // thx walsh
 +
    var scrollDiv = document.createElement('div')
 +
    scrollDiv.className = 'modal-scrollbar-measure'
 +
    this.$body.append(scrollDiv)
 +
    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
 +
    this.$body[0].removeChild(scrollDiv)
 +
    return scrollbarWidth
 +
  }
 +
 
 +
 
 +
  // MODAL PLUGIN DEFINITION
 +
  // =======================
 +
 
 +
  function Plugin(option, _relatedTarget) {
 +
    return this.each(function () {
 +
      var $this  = $(this)
 +
      var data    = $this.data('bs.modal')
 +
      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
 +
 
 +
      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
 +
      if (typeof option == 'string') data[option](_relatedTarget)
 +
      else if (options.show) data.show(_relatedTarget)
 +
    })
 +
  }
 +
 
 +
  var old = $.fn.modal
 +
 
 +
  $.fn.modal            = Plugin
 +
  $.fn.modal.Constructor = Modal
 +
 
 +
 
 +
  // MODAL NO CONFLICT
 +
  // =================
 +
 
 +
  $.fn.modal.noConflict = function () {
 +
    $.fn.modal = old
 +
    return this
 +
  }
 +
 
 +
 
 +
  // MODAL DATA-API
 +
  // ==============
 +
 
 +
  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
 +
    var $this  = $(this)
 +
    var href    = $this.attr('href')
 +
    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
 +
    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
 +
 
 +
    if ($this.is('a')) e.preventDefault()
 +
 
 +
    $target.one('show.bs.modal', function (showEvent) {
 +
      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
 +
      $target.one('hidden.bs.modal', function () {
 +
        $this.is(':visible') && $this.trigger('focus')
 +
      })
 +
    })
 +
    Plugin.call($target, option, this)
 +
  })
 +
 
 +
}(jQuery);
 +
 
 +
/* ========================================================================
 +
* Bootstrap: tooltip.js v3.3.7
 +
* http://getbootstrap.com/javascript/#tooltip
 +
* Inspired by the original jQuery.tipsy by Jason Frame
 +
* ========================================================================
 +
* Copyright 2011-2016 Twitter, Inc.
 +
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 +
* ======================================================================== */
 +
 
 +
 
 +
+function ($) {
 +
  'use strict';
 +
 
 +
  // TOOLTIP PUBLIC CLASS DEFINITION
 +
  // ===============================
 +
 
 +
  var Tooltip = function (element, options) {
 +
    this.type      = null
 +
    this.options    = null
 +
    this.enabled    = null
 +
    this.timeout    = null
 +
    this.hoverState = null
 +
    this.$element  = null
 +
    this.inState    = null
 +
 
 +
    this.init('tooltip', element, options)
 +
  }
 +
 
 +
  Tooltip.VERSION  = '3.3.7'
 +
 
 +
  Tooltip.TRANSITION_DURATION = 150
 +
 
 +
  Tooltip.DEFAULTS = {
 +
    animation: true,
 +
    placement: 'top',
 +
    selector: false,
 +
    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
 +
    trigger: 'hover focus',
 +
    title: '',
 +
    delay: 0,
 +
    html: false,
 +
    container: false,
 +
    viewport: {
 +
      selector: 'body',
 +
      padding: 0
 +
    }
 +
  }
 +
 
 +
  Tooltip.prototype.init = function (type, element, options) {
 +
    this.enabled  = true
 +
    this.type      = type
 +
    this.$element  = $(element)
 +
    this.options  = this.getOptions(options)
 +
    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
 +
    this.inState  = { click: false, hover: false, focus: false }
 +
 
 +
    if (this.$element[0] instanceof document.constructor && !this.options.selector) {
 +
      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
 +
    }
 +
 
 +
    var triggers = this.options.trigger.split(' ')
 +
 
 +
    for (var i = triggers.length; i--;) {
 +
      var trigger = triggers[i]
 +
 
 +
      if (trigger == 'click') {
 +
        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
 +
      } else if (trigger != 'manual') {
 +
        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
 +
        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
 +
 
 +
        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
 +
        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
 +
      }
 +
    }
 +
 
 +
    this.options.selector ?
 +
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
 +
      this.fixTitle()
 +
  }
 +
 
 +
  Tooltip.prototype.getDefaults = function () {
 +
    return Tooltip.DEFAULTS
 +
  }
 +
 
 +
  Tooltip.prototype.getOptions = function (options) {
 +
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
 +
 
 +
    if (options.delay && typeof options.delay == 'number') {
 +
      options.delay = {
 +
        show: options.delay,
 +
        hide: options.delay
 +
      }
 +
    }
 +
 
 +
    return options
 +
  }
 +
 
 +
  Tooltip.prototype.getDelegateOptions = function () {
 +
    var options  = {}
 +
    var defaults = this.getDefaults()
 +
 
 +
    this._options && $.each(this._options, function (key, value) {
 +
      if (defaults[key] != value) options[key] = value
 +
    })
 +
 
 +
    return options
 +
  }
 +
 
 +
  Tooltip.prototype.enter = function (obj) {
 +
    var self = obj instanceof this.constructor ?
 +
      obj : $(obj.currentTarget).data('bs.' + this.type)
 +
 
 +
    if (!self) {
 +
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
 +
      $(obj.currentTarget).data('bs.' + this.type, self)
 +
    }
 +
 
 +
    if (obj instanceof $.Event) {
 +
      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
 +
    }
 +
 
 +
    if (self.tip().hasClass('in') || self.hoverState == 'in') {
 +
      self.hoverState = 'in'
 +
      return
 +
    }
 +
 
 +
    clearTimeout(self.timeout)
 +
 
 +
    self.hoverState = 'in'
 +
 
 +
    if (!self.options.delay || !self.options.delay.show) return self.show()
 +
 
 +
    self.timeout = setTimeout(function () {
 +
      if (self.hoverState == 'in') self.show()
 +
    }, self.options.delay.show)
 +
  }
 +
 
 +
  Tooltip.prototype.isInStateTrue = function () {
 +
    for (var key in this.inState) {
 +
      if (this.inState[key]) return true
 +
    }
 +
 
 +
    return false
 +
  }
 +
 
 +
  Tooltip.prototype.leave = function (obj) {
 +
    var self = obj instanceof this.constructor ?
 +
      obj : $(obj.currentTarget).data('bs.' + this.type)
 +
 
 +
    if (!self) {
 +
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
 +
      $(obj.currentTarget).data('bs.' + this.type, self)
 +
    }
 +
 
 +
    if (obj instanceof $.Event) {
 +
      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
 +
    }
 +
 
 +
    if (self.isInStateTrue()) return
 +
 
 +
    clearTimeout(self.timeout)
 +
 
 +
    self.hoverState = 'out'
 +
 
 +
    if (!self.options.delay || !self.options.delay.hide) return self.hide()
 +
 
 +
    self.timeout = setTimeout(function () {
 +
      if (self.hoverState == 'out') self.hide()
 +
    }, self.options.delay.hide)
 +
  }
 +
 
 +
  Tooltip.prototype.show = function () {
 +
    var e = $.Event('show.bs.' + this.type)
 +
 
 +
    if (this.hasContent() && this.enabled) {
 +
      this.$element.trigger(e)
 +
 
 +
      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
 +
      if (e.isDefaultPrevented() || !inDom) return
 +
      var that = this
 +
 
 +
      var $tip = this.tip()
 +
 
 +
      var tipId = this.getUID(this.type)
 +
 
 +
      this.setContent()
 +
      $tip.attr('id', tipId)
 +
      this.$element.attr('aria-describedby', tipId)
 +
 
 +
      if (this.options.animation) $tip.addClass('fade')
 +
 
 +
      var placement = typeof this.options.placement == 'function' ?
 +
        this.options.placement.call(this, $tip[0], this.$element[0]) :
 +
        this.options.placement
 +
 
 +
      var autoToken = /\s?auto?\s?/i
 +
      var autoPlace = autoToken.test(placement)
 +
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
 +
 
 +
      $tip
 +
        .detach()
 +
        .css({ top: 0, left: 0, display: 'block' })
 +
        .addClass(placement)
 +
        .data('bs.' + this.type, this)
 +
 
 +
      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
 +
      this.$element.trigger('inserted.bs.' + this.type)
 +
 
 +
      var pos          = this.getPosition()
 +
      var actualWidth  = $tip[0].offsetWidth
 +
      var actualHeight = $tip[0].offsetHeight
 +
 
 +
      if (autoPlace) {
 +
        var orgPlacement = placement
 +
        var viewportDim = this.getPosition(this.$viewport)
 +
 
 +
        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
 +
                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
 +
                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'  :
 +
                    placement == 'left'  && pos.left  - actualWidth  < viewportDim.left  ? 'right'  :
 +
                    placement
 +
 
 +
        $tip
 +
          .removeClass(orgPlacement)
 +
          .addClass(placement)
 +
      }
 +
 
 +
      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
 +
 
 +
      this.applyPlacement(calculatedOffset, placement)
 +
 
 +
      var complete = function () {
 +
        var prevHoverState = that.hoverState
 +
        that.$element.trigger('shown.bs.' + that.type)
 +
        that.hoverState = null
 +
 
 +
        if (prevHoverState == 'out') that.leave(that)
 +
      }
 +
 
 +
      $.support.transition && this.$tip.hasClass('fade') ?
 +
        $tip
 +
          .one('bsTransitionEnd', complete)
 +
          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
 +
        complete()
 +
    }
 +
  }
 +
 
 +
  Tooltip.prototype.applyPlacement = function (offset, placement) {
 +
    var $tip  = this.tip()
 +
    var width  = $tip[0].offsetWidth
 +
    var height = $tip[0].offsetHeight
 +
 
 +
    // manually read margins because getBoundingClientRect includes difference
 +
    var marginTop = parseInt($tip.css('margin-top'), 10)
 +
    var marginLeft = parseInt($tip.css('margin-left'), 10)
 +
 
 +
    // we must check for NaN for ie 8/9
 +
    if (isNaN(marginTop))  marginTop  = 0
 +
    if (isNaN(marginLeft)) marginLeft = 0
 +
 
 +
    offset.top  += marginTop
 +
    offset.left += marginLeft
 +
 
 +
    // $.fn.offset doesn't round pixel values
 +
    // so we use setOffset directly with our own function B-0
 +
    $.offset.setOffset($tip[0], $.extend({
 +
      using: function (props) {
 +
        $tip.css({
 +
          top: Math.round(props.top),
 +
          left: Math.round(props.left)
 +
        })
 +
      }
 +
    }, offset), 0)
 +
 
 +
    $tip.addClass('in')
 +
 
 +
    // check to see if placing tip in new offset caused the tip to resize itself
 +
    var actualWidth  = $tip[0].offsetWidth
 +
    var actualHeight = $tip[0].offsetHeight
 +
 
 +
    if (placement == 'top' && actualHeight != height) {
 +
      offset.top = offset.top + height - actualHeight
 +
    }
 +
 
 +
    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
 +
 
 +
    if (delta.left) offset.left += delta.left
 +
    else offset.top += delta.top
 +
 
 +
    var isVertical          = /top|bottom/.test(placement)
 +
    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
 +
    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
 +
 
 +
    $tip.offset(offset)
 +
    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
 +
  }
 +
 
 +
  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
 +
    this.arrow()
 +
      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
 +
      .css(isVertical ? 'top' : 'left', '')
 +
  }
 +
 
 +
  Tooltip.prototype.setContent = function () {
 +
    var $tip  = this.tip()
 +
    var title = this.getTitle()
 +
 
 +
    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
 +
    $tip.removeClass('fade in top bottom left right')
 +
  }
 +
 
 +
  Tooltip.prototype.hide = function (callback) {
 +
    var that = this
 +
    var $tip = $(this.$tip)
 +
    var e    = $.Event('hide.bs.' + this.type)
 +
 
 +
    function complete() {
 +
      if (that.hoverState != 'in') $tip.detach()
 +
      if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
 +
        that.$element
 +
          .removeAttr('aria-describedby')
 +
          .trigger('hidden.bs.' + that.type)
 +
      }
 +
      callback && callback()
 +
    }
 +
 
 +
    this.$element.trigger(e)
 +
 
 +
    if (e.isDefaultPrevented()) return
 +
 
 +
    $tip.removeClass('in')
 +
 
 +
    $.support.transition && $tip.hasClass('fade') ?
 +
      $tip
 +
        .one('bsTransitionEnd', complete)
 +
        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
 +
      complete()
 +
 
 +
    this.hoverState = null
 +
 
 +
    return this
 +
  }
 +
 
 +
  Tooltip.prototype.fixTitle = function () {
 +
    var $e = this.$element
 +
    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
 +
      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
 +
    }
 +
  }
 +
 
 +
  Tooltip.prototype.hasContent = function () {
 +
    return this.getTitle()
 +
  }
 +
 
 +
  Tooltip.prototype.getPosition = function ($element) {
 +
    $element  = $element || this.$element
 +
 
 +
    var el    = $element[0]
 +
    var isBody = el.tagName == 'BODY'
 +
 
 +
    var elRect    = el.getBoundingClientRect()
 +
    if (elRect.width == null) {
 +
      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
 +
      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
 +
    }
 +
    var isSvg = window.SVGElement && el instanceof window.SVGElement
 +
    // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
 +
    // See https://github.com/twbs/bootstrap/issues/20280
 +
    var elOffset  = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
 +
    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
 +
    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
 +
 
 +
    return $.extend({}, elRect, scroll, outerDims, elOffset)
 +
  }
 +
 
 +
  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
 +
    return placement == 'bottom' ? { top: pos.top + pos.height,  left: pos.left + pos.width / 2 - actualWidth / 2 } :
 +
          placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
 +
          placement == 'left'  ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
 +
        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
 +
 
 +
  }
 +
 
 +
  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
 +
    var delta = { top: 0, left: 0 }
 +
    if (!this.$viewport) return delta
 +
 
 +
    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
 +
    var viewportDimensions = this.getPosition(this.$viewport)
 +
 
 +
    if (/right|left/.test(placement)) {
 +
      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
 +
      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
 +
      if (topEdgeOffset < viewportDimensions.top) { // top overflow
 +
        delta.top = viewportDimensions.top - topEdgeOffset
 +
      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
 +
        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
 +
      }
 +
    } else {
 +
      var leftEdgeOffset  = pos.left - viewportPadding
 +
      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
 +
      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
 +
        delta.left = viewportDimensions.left - leftEdgeOffset
 +
      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
 +
        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
 +
      }
 +
    }
 +
 
 +
    return delta
 +
  }
 +
 
 +
  Tooltip.prototype.getTitle = function () {
 +
    var title
 +
    var $e = this.$element
 +
    var o  = this.options
 +
 
 +
    title = $e.attr('data-original-title')
 +
      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
 +
 
 +
    return title
 +
  }
 +
 
 +
  Tooltip.prototype.getUID = function (prefix) {
 +
    do prefix += ~~(Math.random() * 1000000)
 +
    while (document.getElementById(prefix))
 +
    return prefix
 +
  }
 +
 
 +
  Tooltip.prototype.tip = function () {
 +
    if (!this.$tip) {
 +
      this.$tip = $(this.options.template)
 +
      if (this.$tip.length != 1) {
 +
        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
 +
      }
 +
    }
 +
    return this.$tip
 +
  }
 +
 
 +
  Tooltip.prototype.arrow = function () {
 +
    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
 +
  }
 +
 
 +
  Tooltip.prototype.enable = function () {
 +
    this.enabled = true
 +
  }
 +
 
 +
  Tooltip.prototype.disable = function () {
 +
    this.enabled = false
 +
  }
 +
 
 +
  Tooltip.prototype.toggleEnabled = function () {
 +
    this.enabled = !this.enabled
 +
  }
 +
 
 +
  Tooltip.prototype.toggle = function (e) {
 +
    var self = this
 +
    if (e) {
 +
      self = $(e.currentTarget).data('bs.' + this.type)
 +
      if (!self) {
 +
        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
 +
        $(e.currentTarget).data('bs.' + this.type, self)
 +
      }
 +
    }
 +
 
 +
    if (e) {
 +
      self.inState.click = !self.inState.click
 +
      if (self.isInStateTrue()) self.enter(self)
 +
      else self.leave(self)
 +
    } else {
 +
      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
 +
    }
 +
  }
 +
 
 +
  Tooltip.prototype.destroy = function () {
 +
    var that = this
 +
    clearTimeout(this.timeout)
 +
    this.hide(function () {
 +
      that.$element.off('.' + that.type).removeData('bs.' + that.type)
 +
      if (that.$tip) {
 +
        that.$tip.detach()
 +
      }
 +
      that.$tip = null
 +
      that.$arrow = null
 +
      that.$viewport = null
 +
      that.$element = null
 +
    })
 +
  }
 +
 
 +
 
 +
  // TOOLTIP PLUGIN DEFINITION
 +
  // =========================
 +
 
 +
  function Plugin(option) {
 +
    return this.each(function () {
 +
      var $this  = $(this)
 +
      var data    = $this.data('bs.tooltip')
 +
      var options = typeof option == 'object' && option
 +
 
 +
      if (!data && /destroy|hide/.test(option)) return
 +
      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
 +
      if (typeof option == 'string') data[option]()
 +
    })
 +
  }
 +
 
 +
  var old = $.fn.tooltip
 +
 
 +
  $.fn.tooltip            = Plugin
 +
  $.fn.tooltip.Constructor = Tooltip
 +
 
 +
 
 +
  // TOOLTIP NO CONFLICT
 +
  // ===================
 +
 
 +
  $.fn.tooltip.noConflict = function () {
 +
    $.fn.tooltip = old
 +
    return this
 +
  }
 +
 
 +
}(jQuery);
 +
 
 +
/* ========================================================================
 +
* Bootstrap: popover.js v3.3.7
 +
* http://getbootstrap.com/javascript/#popovers
 +
* ========================================================================
 +
* Copyright 2011-2016 Twitter, Inc.
 +
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 +
* ======================================================================== */
 +
 
 +
 
 +
+function ($) {
 +
  'use strict';
 +
 
 +
  // POPOVER PUBLIC CLASS DEFINITION
 +
  // ===============================
 +
 
 +
  var Popover = function (element, options) {
 +
    this.init('popover', element, options)
 +
  }
 +
 
 +
  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
 +
 
 +
  Popover.VERSION  = '3.3.7'
 +
 
 +
  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
 +
    placement: 'right',
 +
    trigger: 'click',
 +
    content: '',
 +
    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
 +
  })
 +
 
 +
 
 +
  // NOTE: POPOVER EXTENDS tooltip.js
 +
  // ================================
 +
 
 +
  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
 +
 
 +
  Popover.prototype.constructor = Popover
 +
 
 +
  Popover.prototype.getDefaults = function () {
 +
    return Popover.DEFAULTS
 +
  }
 +
 
 +
  Popover.prototype.setContent = function () {
 +
    var $tip    = this.tip()
 +
    var title  = this.getTitle()
 +
    var content = this.getContent()
 +
 
 +
    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
 +
    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
 +
      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
 +
    ](content)
 +
 
 +
    $tip.removeClass('fade top bottom left right in')
 +
 
 +
    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
 +
    // this manually by checking the contents.
 +
    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
 +
  }
 +
 
 +
  Popover.prototype.hasContent = function () {
 +
    return this.getTitle() || this.getContent()
 +
  }
 +
 
 +
  Popover.prototype.getContent = function () {
 +
    var $e = this.$element
 +
    var o  = this.options
 +
 
 +
    return $e.attr('data-content')
 +
      || (typeof o.content == 'function' ?
 +
            o.content.call($e[0]) :
 +
            o.content)
 +
  }
 +
 
 +
  Popover.prototype.arrow = function () {
 +
    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
 +
  }
 +
 
 +
 
 +
  // POPOVER PLUGIN DEFINITION
 +
  // =========================
 +
 
 +
  function Plugin(option) {
 +
    return this.each(function () {
 +
      var $this  = $(this)
 +
      var data    = $this.data('bs.popover')
 +
      var options = typeof option == 'object' && option
 +
 
 +
      if (!data && /destroy|hide/.test(option)) return
 +
      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
 +
      if (typeof option == 'string') data[option]()
 +
    })
 +
  }
 +
 
 +
  var old = $.fn.popover
 +
 
 +
  $.fn.popover            = Plugin
 +
  $.fn.popover.Constructor = Popover
 +
 
 +
 
 +
  // POPOVER NO CONFLICT
 +
  // ===================
 +
 
 +
  $.fn.popover.noConflict = function () {
 +
    $.fn.popover = old
 +
    return this
 +
  }
 +
 
 +
}(jQuery);
 +
 
 +
/* ========================================================================
 +
* Bootstrap: scrollspy.js v3.3.7
 +
* http://getbootstrap.com/javascript/#scrollspy
 +
* ========================================================================
 +
* Copyright 2011-2016 Twitter, Inc.
 +
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 +
* ======================================================================== */
 +
 
 +
 
 +
+function ($) {
 +
  'use strict';
 +
 
 +
  // SCROLLSPY CLASS DEFINITION
 +
  // ==========================
 +
 
 +
  function ScrollSpy(element, options) {
 +
    this.$body          = $(document.body)
 +
    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
 +
    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
 +
    this.selector      = (this.options.target || '') + ' .nav li > a'
 +
    this.offsets        = []
 +
    this.targets        = []
 +
    this.activeTarget  = null
 +
    this.scrollHeight  = 0
 +
 
 +
    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
 +
    this.refresh()
 +
    this.process()
 +
  }
 +
 
 +
  ScrollSpy.VERSION  = '3.3.7'
 +
 
 +
  ScrollSpy.DEFAULTS = {
 +
    offset: 10
 +
  }
 +
 
 +
  ScrollSpy.prototype.getScrollHeight = function () {
 +
    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
 +
  }
 +
 
 +
  ScrollSpy.prototype.refresh = function () {
 +
    var that          = this
 +
    var offsetMethod  = 'offset'
 +
    var offsetBase    = 0
 +
 
 +
    this.offsets      = []
 +
    this.targets      = []
 +
    this.scrollHeight = this.getScrollHeight()
 +
 
 +
    if (!$.isWindow(this.$scrollElement[0])) {
 +
      offsetMethod = 'position'
 +
      offsetBase  = this.$scrollElement.scrollTop()
 +
    }
 +
 
 +
    this.$body
 +
      .find(this.selector)
 +
      .map(function () {
 +
        var $el  = $(this)
 +
        var href  = $el.data('target') || $el.attr('href')
 +
        var $href = /^#./.test(href) && $(href)
 +
 
 +
        return ($href
 +
          && $href.length
 +
          && $href.is(':visible')
 +
          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
 +
      })
 +
      .sort(function (a, b) { return a[0] - b[0] })
 +
      .each(function () {
 +
        that.offsets.push(this[0])
 +
        that.targets.push(this[1])
 +
      })
 +
  }
 +
 
 +
  ScrollSpy.prototype.process = function () {
 +
    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
 +
    var scrollHeight = this.getScrollHeight()
 +
    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
 +
    var offsets      = this.offsets
 +
    var targets      = this.targets
 +
    var activeTarget = this.activeTarget
 +
    var i
 +
 
 +
    if (this.scrollHeight != scrollHeight) {
 +
      this.refresh()
 +
    }
 +
 
 +
    if (scrollTop >= maxScroll) {
 +
      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
 +
    }
 +
 
 +
    if (activeTarget && scrollTop < offsets[0]) {
 +
      this.activeTarget = null
 +
      return this.clear()
 +
    }
 +
 
 +
    for (i = offsets.length; i--;) {
 +
      activeTarget != targets[i]
 +
        && scrollTop >= offsets[i]
 +
        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
 +
        && this.activate(targets[i])
 +
    }
 +
  }
 +
 
 +
  ScrollSpy.prototype.activate = function (target) {
 +
    this.activeTarget = target
 +
 
 +
    this.clear()
 +
 
 +
    var selector = this.selector +
 +
      '[data-target="' + target + '"],' +
 +
      this.selector + '[href="' + target + '"]'
 +
 
 +
    var active = $(selector)
 +
      .parents('li')
 +
      .addClass('active')
 +
 
 +
    if (active.parent('.dropdown-menu').length) {
 +
      active = active
 +
        .closest('li.dropdown')
 +
        .addClass('active')
 +
    }
 +
 
 +
    active.trigger('activate.bs.scrollspy')
 +
  }
 +
 
 +
  ScrollSpy.prototype.clear = function () {
 +
    $(this.selector)
 +
      .parentsUntil(this.options.target, '.active')
 +
      .removeClass('active')
 +
  }
 +
 
 +
 
 +
  // SCROLLSPY PLUGIN DEFINITION
 +
  // ===========================
 +
 
 +
  function Plugin(option) {
 +
    return this.each(function () {
 +
      var $this  = $(this)
 +
      var data    = $this.data('bs.scrollspy')
 +
      var options = typeof option == 'object' && option
 +
 
 +
      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
 +
      if (typeof option == 'string') data[option]()
 +
    })
 +
  }
 +
 
 +
  var old = $.fn.scrollspy
 +
 
 +
  $.fn.scrollspy            = Plugin
 +
  $.fn.scrollspy.Constructor = ScrollSpy
 +
 
 +
 
 +
  // SCROLLSPY NO CONFLICT
 +
  // =====================
 +
 
 +
  $.fn.scrollspy.noConflict = function () {
 +
    $.fn.scrollspy = old
 +
    return this
 +
  }
 +
 
 +
 
 +
  // SCROLLSPY DATA-API
 +
  // ==================
 +
 
 +
  $(window).on('load.bs.scrollspy.data-api', function () {
 +
    $('[data-spy="scroll"]').each(function () {
 +
      var $spy = $(this)
 +
      Plugin.call($spy, $spy.data())
 +
    })
 +
  })
 +
 
 +
}(jQuery);
 +
 
 +
/* ========================================================================
 +
* Bootstrap: tab.js v3.3.7
 +
* http://getbootstrap.com/javascript/#tabs
 +
* ========================================================================
 +
* Copyright 2011-2016 Twitter, Inc.
 +
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 +
* ======================================================================== */
 +
 
 +
 
 +
+function ($) {
 +
  'use strict';
 +
 
 +
  // TAB CLASS DEFINITION
 +
  // ====================
 +
 
 +
  var Tab = function (element) {
 +
    // jscs:disable requireDollarBeforejQueryAssignment
 +
    this.element = $(element)
 +
    // jscs:enable requireDollarBeforejQueryAssignment
 +
  }
 +
 
 +
  Tab.VERSION = '3.3.7'
 +
 
 +
  Tab.TRANSITION_DURATION = 150
 +
 
 +
  Tab.prototype.show = function () {
 +
    var $this    = this.element
 +
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
 +
    var selector = $this.data('target')
 +
 
 +
    if (!selector) {
 +
      selector = $this.attr('href')
 +
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
 +
    }
 +
 
 +
    if ($this.parent('li').hasClass('active')) return
 +
 
 +
    var $previous = $ul.find('.active:last a')
 +
    var hideEvent = $.Event('hide.bs.tab', {
 +
      relatedTarget: $this[0]
 +
    })
 +
    var showEvent = $.Event('show.bs.tab', {
 +
      relatedTarget: $previous[0]
 +
    })
 +
 
 +
    $previous.trigger(hideEvent)
 +
    $this.trigger(showEvent)
 +
 
 +
    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
 +
 
 +
    var $target = $(selector)
 +
 
 +
    this.activate($this.closest('li'), $ul)
 +
    this.activate($target, $target.parent(), function () {
 +
      $previous.trigger({
 +
        type: 'hidden.bs.tab',
 +
        relatedTarget: $this[0]
 +
      })
 +
      $this.trigger({
 +
        type: 'shown.bs.tab',
 +
        relatedTarget: $previous[0]
 +
      })
 +
    })
 +
  }
 +
 
 +
  Tab.prototype.activate = function (element, container, callback) {
 +
    var $active    = container.find('> .active')
 +
    var transition = callback
 +
      && $.support.transition
 +
      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
 +
 
 +
    function next() {
 +
      $active
 +
        .removeClass('active')
 +
        .find('> .dropdown-menu > .active')
 +
          .removeClass('active')
 +
        .end()
 +
        .find('[data-toggle="tab"]')
 +
          .attr('aria-expanded', false)
 +
 
 +
      element
 +
        .addClass('active')
 +
        .find('[data-toggle="tab"]')
 +
          .attr('aria-expanded', true)
 +
 
 +
      if (transition) {
 +
        element[0].offsetWidth // reflow for transition
 +
        element.addClass('in')
 +
      } else {
 +
        element.removeClass('fade')
 +
      }
 +
 
 +
      if (element.parent('.dropdown-menu').length) {
 +
        element
 +
          .closest('li.dropdown')
 +
            .addClass('active')
 +
          .end()
 +
          .find('[data-toggle="tab"]')
 +
            .attr('aria-expanded', true)
 +
      }
 +
 
 +
      callback && callback()
 +
    }
 +
 
 +
    $active.length && transition ?
 +
      $active
 +
        .one('bsTransitionEnd', next)
 +
        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
 +
      next()
 +
 
 +
    $active.removeClass('in')
 +
  }
 +
 
 +
 
 +
  // TAB PLUGIN DEFINITION
 +
  // =====================
 +
 
 +
  function Plugin(option) {
 +
    return this.each(function () {
 +
      var $this = $(this)
 +
      var data  = $this.data('bs.tab')
 +
 
 +
      if (!data) $this.data('bs.tab', (data = new Tab(this)))
 +
      if (typeof option == 'string') data[option]()
 +
    })
 +
  }
 +
 
 +
  var old = $.fn.tab
 +
 
 +
  $.fn.tab            = Plugin
 +
  $.fn.tab.Constructor = Tab
 +
 
 +
 
 +
  // TAB NO CONFLICT
 +
  // ===============
 +
 
 +
  $.fn.tab.noConflict = function () {
 +
    $.fn.tab = old
 +
    return this
 +
  }
 +
 
 +
 
 +
  // TAB DATA-API
 +
  // ============
 +
 
 +
  var clickHandler = function (e) {
 +
    e.preventDefault()
 +
    Plugin.call($(this), 'show')
 +
  }
 +
 
 +
  $(document)
 +
    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
 +
    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
 +
 
 +
}(jQuery);
 +
 
 +
/* ========================================================================
 +
* Bootstrap: affix.js v3.3.7
 +
* http://getbootstrap.com/javascript/#affix
 +
* ========================================================================
 +
* Copyright 2011-2016 Twitter, Inc.
 +
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 +
* ======================================================================== */
 +
 
 +
 
 +
+function ($) {
 +
  'use strict';
 +
 
 +
  // AFFIX CLASS DEFINITION
 +
  // ======================
 +
 
 +
  var Affix = function (element, options) {
 +
    this.options = $.extend({}, Affix.DEFAULTS, options)
 +
 
 +
    this.$target = $(this.options.target)
 +
      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
 +
      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
 +
 
 +
    this.$element    = $(element)
 +
    this.affixed      = null
 +
    this.unpin        = null
 +
    this.pinnedOffset = null
 +
 
 +
    this.checkPosition()
 +
  }
 +
 
 +
  Affix.VERSION  = '3.3.7'
 +
 
 +
  Affix.RESET    = 'affix affix-top affix-bottom'
 +
 
 +
  Affix.DEFAULTS = {
 +
    offset: 0,
 +
    target: window
 +
  }
 +
 
 +
  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
 +
    var scrollTop    = this.$target.scrollTop()
 +
    var position    = this.$element.offset()
 +
    var targetHeight = this.$target.height()
 +
 
 +
    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
 +
 
 +
    if (this.affixed == 'bottom') {
 +
      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
 +
      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
 +
    }
 +
 
 +
    var initializing  = this.affixed == null
 +
    var colliderTop    = initializing ? scrollTop : position.top
 +
    var colliderHeight = initializing ? targetHeight : height
 +
 
 +
    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
 +
    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
 +
 
 +
    return false
 +
  }
 +
 
 +
  Affix.prototype.getPinnedOffset = function () {
 +
    if (this.pinnedOffset) return this.pinnedOffset
 +
    this.$element.removeClass(Affix.RESET).addClass('affix')
 +
    var scrollTop = this.$target.scrollTop()
 +
    var position  = this.$element.offset()
 +
    return (this.pinnedOffset = position.top - scrollTop)
 +
  }
 +
 
 +
  Affix.prototype.checkPositionWithEventLoop = function () {
 +
    setTimeout($.proxy(this.checkPosition, this), 1)
 +
  }
 +
 
 +
  Affix.prototype.checkPosition = function () {
 +
    if (!this.$element.is(':visible')) return
 +
 
 +
    var height      = this.$element.height()
 +
    var offset      = this.options.offset
 +
    var offsetTop    = offset.top
 +
    var offsetBottom = offset.bottom
 +
    var scrollHeight = Math.max($(document).height(), $(document.body).height())
 +
 
 +
    if (typeof offset != 'object')        offsetBottom = offsetTop = offset
 +
    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
 +
    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
 +
 
 +
    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
 +
 
 +
    if (this.affixed != affix) {
 +
      if (this.unpin != null) this.$element.css('top', '')
 +
 
 +
      var affixType = 'affix' + (affix ? '-' + affix : '')
 +
      var e        = $.Event(affixType + '.bs.affix')
 +
 
 +
      this.$element.trigger(e)
 +
 
 +
      if (e.isDefaultPrevented()) return
 +
 
 +
      this.affixed = affix
 +
      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
 +
 
 +
      this.$element
 +
        .removeClass(Affix.RESET)
 +
        .addClass(affixType)
 +
        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
 +
    }
 +
 
 +
    if (affix == 'bottom') {
 +
      this.$element.offset({
 +
        top: scrollHeight - height - offsetBottom
 +
      })
 +
    }
 +
  }
 +
 
 +
 
 +
  // AFFIX PLUGIN DEFINITION
 +
  // =======================
 +
 
 +
  function Plugin(option) {
 +
    return this.each(function () {
 +
      var $this  = $(this)
 +
      var data    = $this.data('bs.affix')
 +
      var options = typeof option == 'object' && option
 +
 
 +
      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
 +
      if (typeof option == 'string') data[option]()
 +
    })
 +
  }
 +
 
 +
  var old = $.fn.affix
 +
 
 +
  $.fn.affix            = Plugin
 +
  $.fn.affix.Constructor = Affix
 +
 
 +
 
 +
  // AFFIX NO CONFLICT
 +
  // =================
 +
 
 +
  $.fn.affix.noConflict = function () {
 +
    $.fn.affix = old
 +
    return this
 +
  }
 +
 
 +
 
 +
  // AFFIX DATA-API
 +
  // ==============
 +
 
 +
  $(window).on('load', function () {
 +
    $('[data-spy="affix"]').each(function () {
 +
      var $spy = $(this)
 +
      var data = $spy.data()
 +
 
 +
      data.offset = data.offset || {}
 +
 
 +
      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
 +
      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
 +
 
 +
      Plugin.call($spy, data)
 +
    })
 +
  })
 +
 
 +
}(jQuery);
 +
 
 +
 
 +
(function(root, factory) {
 +
  if (typeof define === 'function' && define.amd) {
 +
    define(factory);
 +
  } else if (typeof exports === 'object') {
 +
    module.exports = factory(require, exports, module);
 +
  } else {
 +
    root.ScrollReveal = factory();
 +
  }
 +
}(this, function(require, exports, module) {
 +
 
 +
 
 +
/////    /////    /////    /////
 +
/////    /////    /////    /////
 +
/////    /////    /////    /////
 +
/////    /////    /////    /////
 +
/////            /////    /////
 +
/////            /////    /////
 +
/////    /////    /////    /////
 +
/////    /////    /////    /////
 +
        /////    /////
 +
        /////    /////
 +
/////    /////    /////    /////
 +
/////    /////    /////    /////
 +
/////    /////    /////    /////
 +
/////    /////    /////    /////
 +
 
 +
/**
 +
* ScrollReveal
 +
* ------------
 +
* Version : 3.1.4
 +
* Website : scrollrevealjs.org
 +
* Repo    : github.com/jlmakes/scrollreveal.js
 +
* Author  : Julian Lloyd (@jlmakes)
 +
*/
 +
 
 +
;(function() {
 +
    'use strict';
 +
 
 +
    var
 +
        sr,
 +
        Tools,
 +
        _requestAnimationFrame;
 +
 
 +
    this.ScrollReveal = (function() {
 +
 
 +
        /**
 +
        * Configuration
 +
        * -------------
 +
        * This object signature can be passed directly to the ScrollReveal constructor,
 +
        * or as the second argument of the `reveal()` method.
 +
        */
 +
 
 +
        ScrollReveal.prototype.defaults = {
 +
 
 +
            //            'bottom', 'left', 'top', 'right'
 +
            origin      : 'bottom',
 +
 
 +
            //            Can be any valid CSS distance, e.g. '5rem', '10%', '20vw', etc.
 +
            distance    : '20px',
 +
 
 +
            //            Time in milliseconds.
 +
            duration    : 500,
 +
            delay      : 0,
 +
 
 +
            //            Starting angles in degrees, will transition from these values to 0 in all axes.
 +
            rotate      : { x: 0, y: 0, z: 0 },
 +
 
 +
            //            Starting opacity value, before transitioning to the computed opacity.
 +
            opacity    : 0,
 +
 
 +
            //            Starting scale value, will transition from this value to 1
 +
            scale      : 0.9,
 +
 
 +
            //            Accepts any valid CSS easing, e.g. 'ease', 'ease-in-out', 'linear', etc.
 +
            easing      : 'cubic-bezier(0.6, 0.2, 0.1, 1)',
 +
 
 +
            //            When null, `<html>` is assumed to be the reveal container. You can pass a
 +
            //            DOM node as a custom container, e.g. document.querySelector('.fooContainer')
 +
            //            or a selector, e.g. '.fooContainer'
 +
            container  : null,
 +
 
 +
            //            true/false to control reveal animations on mobile.
 +
            mobile      : true,
 +
 
 +
            //            true:  reveals occur every time elements become visible
 +
            //            false: reveals occur once as elements become visible
 +
            reset      : false,
 +
 
 +
            //            'always' — delay for all reveal animations
 +
            //            'once'  — delay only the first time reveals occur
 +
            //            'onload' - delay only for animations triggered by first load
 +
            useDelay    : 'always',
 +
 
 +
            //            Change when an element is considered in the viewport. The default value
 +
            //            of 0.20 means 20% of an element must be visible for its reveal to occur.
 +
            viewFactor  : 0.2,
 +
 
 +
            //            Pixel values that alter the container boundaries.
 +
            //            e.g. Set `{ top: 48 }`, if you have a 48px tall fixed toolbar.
 +
            //            --
 +
            //            Visual Aid: https://scrollrevealjs.org/assets/viewoffset.png
 +
            viewOffset  : { top: 0, right: 0, bottom: 0, left: 0 },
 +
 
 +
            //            Callbacks that fire for each completed element reveal, and if
 +
            //            `config.reset = true`, for each completed element reset. When creating your
 +
            //            callbacks, remember they are passed the element’s DOM node that triggered
 +
            //            it as the first argument.
 +
            afterReveal : function(domEl) {},
 +
            afterReset  : function(domEl) {}
 +
        };
 +
 
 +
 
 +
 
 +
        function ScrollReveal(config) {
 +
 
 +
            // Support instantiation without the `new` keyword.
 +
            if (typeof this == 'undefined' || Object.getPrototypeOf(this) !== ScrollReveal.prototype) {
 +
                return new ScrollReveal(config)
 +
            }
 +
 
 +
            sr = this; // Save reference to instance.
 +
            sr.tools = new Tools(); // *required utilities
 +
 
 +
            if (sr.isSupported()) {
 +
 
 +
                sr.tools.extend(sr.defaults, config || {});
 +
 
 +
                _resolveContainer(sr.defaults);
 +
 
 +
                sr.store = {
 +
                    elements  : {},
 +
                    containers : []
 +
                };
 +
 
 +
                sr.sequences  = {};
 +
                sr.history    = [];
 +
                sr.uid        = 0;
 +
                sr.initialized = false;
 +
            }
 +
 
 +
            // Note: IE9 only supports console if devtools are open.
 +
            else if (typeof console !== 'undefined' && console !== null) {
 +
                console.log('ScrollReveal is not supported in this browser.');
 +
            }
 +
 
 +
            return sr
 +
        }
 +
 
 +
 
 +
 
 +
        /**
 +
        * Check if client supports CSS Transform and CSS Transition.
 +
        * @return {boolean}
 +
        */
 +
        ScrollReveal.prototype.isSupported = function() {
 +
            var style = document.documentElement.style;
 +
            return 'WebkitTransition' in style && 'WebkitTransform' in style
 +
                || 'transition' in style && 'transform' in style
 +
        };
 +
 
 +
 
 +
 
 +
        /**
 +
        * Creates a reveal set, a group of elements that will animate when they
 +
        * become visible. If [interval] is provided, a new sequence is created
 +
        * that will ensure elements reveal in the order they appear in the DOM.
 +
        *
 +
        * @param {string|Node} [selector] The element (node) or elements (selector) to animate.
 +
        * @param {Object}      [config]  Override the defaults for this reveal set.
 +
        * @param {number}      [interval] Time between sequenced element animations (milliseconds).
 +
        * @param {boolean}    [sync]    Used internally when updating reveals for async content.
 +
        *
 +
        * @return {Object} The current ScrollReveal instance.
 +
        */
 +
        ScrollReveal.prototype.reveal = function(selector, config, interval, sync) {
 +
 
 +
            var
 +
                container,
 +
                elements,
 +
                elem,
 +
                elemId,
 +
                sequence,
 +
                sequenceId;
 +
 
 +
            // Resolve container.
 +
            if (config && config.container) {
 +
                container = _resolveContainer(config);
 +
            } else {
 +
                container = sr.defaults.container;
 +
            }
 +
 
 +
            // Let’s check to see if a DOM node was passed in as the first argument,
 +
            // otherwise query the container for all elements matching the selector.
 +
            if (sr.tools.isNode(selector)) {
 +
                elements = [selector];
 +
            } else {
 +
                elements = Array.prototype.slice.call(container.querySelectorAll(selector));
 +
            }
 +
 
 +
            if (!elements.length) {
 +
                console.log('ScrollReveal: reveal on "'+ selector + '" failed, no elements found.');
 +
                return sr
 +
            }
 +
 
 +
            // No custom configuration was passed, but a sequence interval instead.
 +
            // let’s shuffle things around to make sure everything works.
 +
            if (config && typeof config == 'number') {
 +
                interval = config;
 +
                config = {};
 +
            }
 +
 
 +
            // Prepare a new sequence if an interval is passed.
 +
            if (interval && typeof interval == 'number') {
 +
                sequenceId = _nextUid();
 +
 
 +
                sequence = sr.sequences[sequenceId] = {
 +
                    id      : sequenceId,
 +
                    interval : interval,
 +
                    elemIds  : [],
 +
                    active  : false
 +
                }
 +
            }
 +
 
 +
            // Begin main loop to configure ScrollReveal elements.
 +
            for (var i = 0; i < elements.length; i++) {
 +
 
 +
                // Check if the element has already been configured and grab it from the store.
 +
                elemId = elements[i].getAttribute('data-sr-id');
 +
                if (elemId) {
 +
                    elem = sr.store.elements[elemId];
 +
                }
 +
 
 +
                // Otherwise, let’s do some basic setup.
 +
                else {
 +
                    elem = {
 +
                        id        : _nextUid(),
 +
                        domEl    : elements[i],
 +
                        seen      : false,
 +
                        revealing : false
 +
                    };
 +
                    elem.domEl.setAttribute('data-sr-id', elem.id);
 +
                }
 +
 
 +
                // Sequence only setup
 +
                if (sequence) {
 +
 
 +
                    elem.sequence = {
 +
                        id    : sequence.id,
 +
                        index : sequence.elemIds.length
 +
                    };
 +
 
 +
                    sequence.elemIds.push(elem.id);
 +
                }
 +
 
 +
                // New or existing element, it’s time to update its configuration, styles,
 +
                // and send the updates to our store.
 +
                _configure(elem, config || {});
 +
                _style(elem);
 +
                _updateStore(elem);
 +
 
 +
                // We need to make sure elements are set to visibility: visible, even when
 +
                // on mobile and `config.mobile == false`, or if unsupported.
 +
                if (sr.tools.isMobile() && !elem.config.mobile || !sr.isSupported()) {
 +
                    elem.domEl.setAttribute('style', elem.styles.inline);
 +
                    elem.disabled = true;
 +
                }
 +
 
 +
                // Otherwise, proceed normally.
 +
                else if (!elem.revealing) {
 +
                    elem.domEl.setAttribute('style',
 +
                        elem.styles.inline
 +
                      + elem.styles.transform.initial
 +
                    );
 +
                }
 +
            }
 +
 
 +
            // Each `reveal()` is recorded so that when calling `sync()` while working
 +
            // with asynchronously loaded content, it can re-trace your steps but with
 +
            // all your new elements now in the DOM.
 +
 
 +
            // Since `reveal()` is called internally by `sync()`, we don’t want to
 +
            // record or intiialize each reveal during syncing.
 +
            if (!sync && sr.isSupported()) {
 +
                _record(selector, config);
 +
 
 +
                // We push initialization to the event queue using setTimeout, so that we can
 +
                // give ScrollReveal room to process all reveal calls before putting things into motion.
 +
                // --
 +
                // Philip Roberts - What the heck is the event loop anyway? (JSConf EU 2014)
 +
                // https://www.youtube.com/watch?v=8aGhZQkoFbQ
 +
                if (sr.initTimeout) {
 +
                    window.clearTimeout(sr.initTimeout);
 +
                }
 +
                sr.initTimeout = window.setTimeout(_init, 0);
 +
            }
 +
 
 +
            return sr
 +
        };
 +
 
 +
 
 +
 
 +
        /**
 +
        * Re-runs `reveal()` for each record stored in history, effectively capturing
 +
        * any content loaded asynchronously that matches existing reveal set selectors.
 +
        *
 +
        * @return {Object} The current ScrollReveal instance.
 +
        */
 +
        ScrollReveal.prototype.sync = function() {
 +
            if (sr.history.length && sr.isSupported()) {
 +
                for (var i = 0; i < sr.history.length; i++) {
 +
                    var record = sr.history[i];
 +
                    sr.reveal(record.selector, record.config, record.interval, true);
 +
                };
 +
                _init();
 +
            } else {
 +
                console.log('ScrollReveal: sync failed, no reveals found.');
 +
            }
 +
            return sr
 +
        };
 +
 
 +
 
 +
 
 +
        /**
 +
        * Private Methods
 +
        * ---------------
 +
        * These methods remain accessible only to the ScrollReveal instance, even
 +
        * though they only "exist" during instantiation outside of the constructors scope.
 +
        * --
 +
        * http://stackoverflow.com/questions/111102/how-do-javascript-closures-work
 +
        */
 +
 
 +
        function _resolveContainer(config) {
 +
            var container = config.container;
 +
 
 +
            // Check if our container is defined by a selector.
 +
            if (container && typeof container == 'string') {
 +
                return config.container = window.document.querySelector(container);
 +
            }
 +
 
 +
            // Check if our container is defined by a node.
 +
            else if (container && !sr.tools.isNode(container)) {
 +
                console.log('ScrollReveal: Invalid container provided, using <html> instead.');
 +
                config.container = null;
 +
            }
 +
 
 +
            // Otherwise use <html> by default.
 +
            if (container == null) {
 +
                config.container = window.document.documentElement;
 +
            }
 +
 
 +
            return config.container
 +
        }
 +
 
 +
 
 +
 
 +
        /**
 +
        * A consistent way of creating unique IDs.
 +
        * @returns {number}
 +
        */
 +
        function _nextUid() {
 +
            return ++sr.uid;
 +
        }
 +
 
 +
 
 +
 
 +
        function _configure(elem, config) {
 +
 
 +
            // If the element hasn’t already been configured, let’s use a clone of the
 +
            // defaults extended by the configuration passed as the second argument.
 +
            if (!elem.config) {
 +
                elem.config = sr.tools.extendClone(sr.defaults, config);
 +
            }
 +
 
 +
            // Otherwise, let’s use a clone of the existing element configuration extended
 +
            // by the configuration passed as the second argument.
 +
            else {
 +
                elem.config = sr.tools.extendClone(elem.config, config);
 +
            }
 +
 
 +
            // Infer CSS Transform axis from origin string.
 +
            if (elem.config.origin === 'top' || elem.config.origin === 'bottom') {
 +
                elem.config.axis = 'Y';
 +
            } else {
 +
                elem.config.axis = 'X';
 +
            }
 +
 
 +
            // Let’s make sure our our pixel distances are negative for top and left.
 +
            // e.g. config.origin = 'top' and config.distance = '25px' starts at `top: -25px` in CSS.
 +
            if (elem.config.origin === 'top' || elem.config.origin === 'left') {
 +
                elem.config.distance = '-' + elem.config.distance;
 +
            }
 +
        }
 +
 
 +
 
 +
 
 +
        function _style(elem) {
 +
            var computed = window.getComputedStyle(elem.domEl);
 +
 
 +
            if (!elem.styles) {
 +
                elem.styles = {
 +
                    transition : {},
 +
                    transform  : {},
 +
                    computed  : {}
 +
                };
 +
 
 +
                // Capture any existing inline styles, and add our visibility override.
 +
                // --
 +
                // See section 4.2. in the Documentation:
 +
                // https://github.com/jlmakes/scrollreveal.js#42-improve-user-experience
 +
                elem.styles.inline  = elem.domEl.getAttribute('style') || '';
 +
                elem.styles.inline += '; visibility: visible; ';
 +
 
 +
                // grab the elements existing opacity.
 +
                elem.styles.computed.opacity = computed.opacity;
 +
 
 +
                // grab the elements existing transitions.
 +
                if (!computed.transition || computed.transition == 'all 0s ease 0s') {
 +
                    elem.styles.computed.transition = '';
 +
                } else {
 +
                    elem.styles.computed.transition = computed.transition + ', ';
 +
                }
 +
            }
 +
 
 +
            // Create transition styles
 +
            elem.styles.transition.instant = _generateTransition(elem, 0);
 +
            elem.styles.transition.delayed = _generateTransition(elem, elem.config.delay);
 +
 
 +
            // Generate transform styles, first with the webkit prefix.
 +
            elem.styles.transform.initial = ' -webkit-transform:';
 +
            elem.styles.transform.target  = ' -webkit-transform:';
 +
            _generateTransform(elem);
 +
 
 +
            // And again without any prefix.
 +
            elem.styles.transform.initial += 'transform:';
 +
            elem.styles.transform.target  += 'transform:';
 +
            _generateTransform(elem);
 +
 
 +
        }
 +
 
 +
 
 +
 
 +
        function _generateTransition(elem, delay) {
 +
            var config = elem.config;
 +
 
 +
            return '-webkit-transition: ' + elem.styles.computed.transition +
 +
                    '-webkit-transform ' + config.duration / 1000 + 's '
 +
                                          + config.easing + ' '
 +
                                          + delay / 1000 + 's, opacity '
 +
                                          + config.duration / 1000 + 's '
 +
                                          + config.easing + ' '
 +
                                          + delay / 1000 + 's; ' +
 +
 
 +
                          'transition: ' + elem.styles.computed.transition +
 +
                            'transform ' + config.duration / 1000 + 's '
 +
                                          + config.easing + ' '
 +
                                          + delay / 1000 + 's, opacity '
 +
                                          + config.duration / 1000 + 's '
 +
                                          + config.easing + ' '
 +
                                          + delay / 1000 + 's; '
 +
        }
 +
 
 +
 
 +
 
 +
        function _generateTransform(elem) {
 +
            var config    = elem.config;
 +
            var transform = elem.styles.transform;
 +
 
 +
            if (parseInt(config.distance)) {
 +
                transform.initial += ' translate' + config.axis + '(' + config.distance + ')';
 +
                transform.target  += ' translate' + config.axis + '(0)';
 +
            }
 +
            if (config.scale) {
 +
                transform.initial += ' scale(' + config.scale + ')';
 +
                transform.target  += ' scale(1)';
 +
            }
 +
            if (config.rotate.x) {
 +
                transform.initial += ' rotateX(' + config.rotate.x + 'deg)';
 +
                transform.target  += ' rotateX(0)';
 +
            }
 +
            if (config.rotate.y) {
 +
                transform.initial += ' rotateY(' + config.rotate.y + 'deg)';
 +
                transform.target  += ' rotateY(0)';
 +
            }
 +
            if (config.rotate.z) {
 +
                transform.initial += ' rotateZ(' + config.rotate.z + 'deg)';
 +
                transform.target  += ' rotateZ(0)';
 +
            }
 +
            transform.initial += '; opacity: ' + config.opacity + ';';
 +
            transform.target  += '; opacity: ' + elem.styles.computed.opacity + ';';
 +
        }
 +
 
 +
 
 +
 
 +
        function _updateStore(elem) {
 +
            var container = elem.config.container;
 +
 
 +
            // If this element’s container isn’t already in the store, let’s add it.
 +
            if (container && sr.store.containers.indexOf(container) == -1) {
 +
                sr.store.containers.push(elem.config.container);
 +
            }
 +
 
 +
            // Update the element stored with our new element.
 +
            sr.store.elements[elem.id] = elem;
 +
        };
 +
 
 +
 
 +
 
 +
        function _record(selector, config, interval) {
 +
 
 +
            // Save the `reveal()` arguments that triggered this `_record()` call, so we
 +
            // can re-trace our steps when calling the `sync()` method.
 +
            var record = {
 +
                selector : selector,
 +
                config  : config,
 +
                interval : interval
 +
            };
 +
            sr.history.push(record);
 +
        }
 +
 
 +
 
 +
 
 +
        function _init() {
 +
            if (sr.isSupported()) {
 +
 
 +
                // Initial animate call triggers valid reveal animations on first load.
 +
                // Subsequent animate calls are made inside the event handler.
 +
                _animate();
 +
 
 +
                // Then we loop through all container nodes in the store and bind event
 +
                // listeners to each.
 +
                for (var i = 0; i < sr.store.containers.length; i++) {
 +
                    sr.store.containers[i].addEventListener('scroll', _handler);
 +
                    sr.store.containers[i].addEventListener('resize', _handler);
 +
                }
 +
 
 +
                // Let’s also do a one-time binding of window event listeners.
 +
                if (!sr.initialized) {
 +
                    window.addEventListener('scroll', _handler);
 +
                    window.addEventListener('resize', _handler);
 +
                    sr.initialized = true;
 +
                }
 +
            }
 +
            return sr
 +
        }
 +
 
 +
 
 +
 
 +
        function _handler() {
 +
            _requestAnimationFrame(_animate);
 +
        }
 +
 
 +
 
 +
 
 +
        function _setActiveSequences() {
 +
 
 +
            var
 +
                active,
 +
                elem,
 +
                elemId,
 +
                sequence;
 +
 
 +
            // Loop through all sequences
 +
            sr.tools.forOwn(sr.sequences, function(sequenceId) {
 +
                sequence = sr.sequences[sequenceId];
 +
                active  = false;
 +
 
 +
                // For each sequenced elemenet, let’s check visibility and if
 +
                // any are visible, set it’s sequence to active.
 +
                for (var i = 0; i < sequence.elemIds.length; i++) {
 +
                    elemId = sequence.elemIds[i]
 +
                    elem  = sr.store.elements[elemId];
 +
                    if (_isElemVisible(elem) && !active) {
 +
                        active = true;
 +
                    }
 +
                }
 +
 
 +
                sequence.active = active;
 +
            });
 +
        }
 +
 
 +
 
 +
 
 +
        function _animate() {
 +
 
 +
            var
 +
                delayed,
 +
                elem;
 +
 
 +
            _setActiveSequences();
 +
 
 +
            // Loop through all elements in the store
 +
            sr.tools.forOwn(sr.store.elements, function(elemId) {
 +
 
 +
                elem = sr.store.elements[elemId];
 +
                delayed = _shouldUseDelay(elem);
 +
 
 +
                // Let’s see if we should reveal, and if so, whether to use delay.
 +
                if (_shouldReveal(elem)) {
 +
                    if (delayed) {
 +
                        elem.domEl.setAttribute('style',
 +
                            elem.styles.inline
 +
                          + elem.styles.transform.target
 +
                          + elem.styles.transition.delayed
 +
                        );
 +
                    } else {
 +
                        elem.domEl.setAttribute('style',
 +
                            elem.styles.inline
 +
                          + elem.styles.transform.target
 +
                          + elem.styles.transition.instant
 +
                        );
 +
                    }
 +
 
 +
                    // Let’s queue the `afterReveal` callback and tag the element.
 +
                    _queueCallback('reveal', elem, delayed);
 +
                    elem.revealing = true;
 +
                    elem.seen = true;
 +
 
 +
                    if (elem.sequence) {
 +
                        _queueNextInSequence(elem, delayed);
 +
                    }
 +
                }
 +
 
 +
                // If we got this far our element shouldn’t reveal, but should it reset?
 +
                else if (_shouldReset(elem)) {
 +
                    elem.domEl.setAttribute('style',
 +
                        elem.styles.inline
 +
                      + elem.styles.transform.initial
 +
                      + elem.styles.transition.instant
 +
                    );
 +
                    _queueCallback('reset', elem);
 +
                    elem.revealing = false;
 +
                }
 +
            });
 +
        }
 +
 
 +
 
 +
 
 +
        /**
 +
        * Sequence callback that triggers the next element.
 +
        */
 +
        function _queueNextInSequence(elem, delayed) {
 +
 
 +
            var
 +
                elapsed  = 0,
 +
                delay    = 0,
 +
                sequence = sr.sequences[elem.sequence.id];
 +
 
 +
            // We’re processing a sequenced element, so let's block other elements in this sequence.
 +
            sequence.blocked = true;
 +
 
 +
            // Since we’re triggering animations a part of a sequence after animations on first load,
 +
            // we need to check for that condition and explicitly add the delay to our timer.
 +
            if (delayed && elem.config.useDelay == 'onload') {
 +
                delay = elem.config.delay;
 +
            }
 +
 
 +
            // If a sequence timer is already running, capture the elapsed time and clear it.
 +
            if (elem.sequence.timer) {
 +
                elapsed = Math.abs(elem.sequence.timer.started - new Date());
 +
                window.clearTimeout(elem.sequence.timer);
 +
            }
 +
 
 +
            // Start a new timer.
 +
            elem.sequence.timer = { started: new Date() };
 +
            elem.sequence.timer.clock = window.setTimeout(function() {
 +
 
 +
                // Sequence interval has passed, so unblock the sequence and re-run the handler.
 +
                sequence.blocked = false;
 +
                elem.sequence.timer = null;
 +
                _handler();
 +
 
 +
            }, Math.abs(sequence.interval) + delay - elapsed);
 +
        }
 +
 
 +
 
 +
 
 +
        function _queueCallback(type, elem, delayed) {
 +
 
 +
            var
 +
                elapsed  = 0,
 +
                duration = 0,
 +
                callback = 'after';
 +
 
 +
            // Check which callback we’re working with.
 +
            switch (type) {
 +
 
 +
                case 'reveal':
 +
                    duration = elem.config.duration;
 +
                    if (delayed) {
 +
                        duration += elem.config.delay;
 +
                    }
 +
                    callback += 'Reveal';
 +
                    break
 +
 
 +
                case 'reset':
 +
                    duration = elem.config.duration;
 +
                    callback += 'Reset';
 +
                    break
 +
            }
 +
 
 +
            // If a timer is already running, capture the elapsed time and clear it.
 +
            if (elem.timer) {
 +
                elapsed = Math.abs(elem.timer.started - new Date());
 +
                window.clearTimeout(elem.timer.clock);
 +
            }
 +
 
 +
            // Start a new timer.
 +
            elem.timer = { started: new Date() };
 +
            elem.timer.clock = window.setTimeout(function() {
 +
 
 +
                // The timer completed, so let’s fire the callback and null the timer.
 +
                elem.config[callback](elem.domEl);
 +
                elem.timer = null;
 +
 
 +
            }, duration - elapsed);
 +
        }
 +
 
 +
 
 +
 
 +
        function _shouldReveal(elem) {
 +
            if (elem.sequence) {
 +
                var sequence = sr.sequences[elem.sequence.id];
 +
                return sequence.active
 +
                    && !sequence.blocked
 +
                    && !elem.revealing
 +
                    && !elem.disabled
 +
            }
 +
            return _isElemVisible(elem)
 +
                && !elem.revealing
 +
                && !elem.disabled
 +
        }
 +
 
 +
 
 +
 
 +
        function _shouldUseDelay(elem) {
 +
            var config = elem.config.useDelay;
 +
            return config === 'always'
 +
                || (config === 'onload' && !sr.initialized)
 +
                || (config === 'once' && !elem.seen)
 +
        }
 +
 
 +
 
 +
 
 +
        function _shouldReset(elem) {
 +
            if (elem.sequence) {
 +
                var sequence = sr.sequences[elem.sequence.id];
 +
                return !sequence.active
 +
                    && elem.config.reset
 +
                    && elem.revealing
 +
                    && !elem.disabled
 +
            }
 +
            return !_isElemVisible(elem)
 +
                && elem.config.reset
 +
                && elem.revealing
 +
                && !elem.disabled
 +
        }
 +
 
 +
 
 +
 
 +
        function _getContainer(container) {
 +
            return {
 +
                width  : container.clientWidth,
 +
                height : container.clientHeight
 +
            }
 +
        }
 +
 
 +
 
 +
 
 +
        function _getScrolled(container) {
 +
 
 +
            // Return the container scroll values, plus the its offset.
 +
            if (container && container !== window.document.documentElement) {
 +
                var offset = _getOffset(container);
 +
                return {
 +
                    x : container.scrollLeft + offset.left,
 +
                    y : container.scrollTop  + offset.top
 +
                }
 +
            }
 +
 
 +
            // Otherwise, default to the window object’s scroll values.
 +
            else {
 +
                return {
 +
                    x : window.pageXOffset,
 +
                    y : window.pageYOffset
 +
                }
 +
            }
 +
        }
 +
 
 +
 
 +
 
 +
        function _getOffset(domEl) {
 +
 
 +
            var
 +
                offsetTop    = 0,
 +
                offsetLeft  = 0,
 +
 
 +
                // Grab the element’s dimensions.
 +
                offsetHeight = domEl.offsetHeight,
 +
                offsetWidth  = domEl.offsetWidth;
 +
 
 +
            // Now calculate the distance between the element and its parent, then
 +
            // again for the parent to its parent, and again etc... until we have the
 +
            // total distance of the element to the document’s top and left origin.
 +
            do {
 +
                if (!isNaN(domEl.offsetTop)) {
 +
                    offsetTop += domEl.offsetTop;
 +
                }
 +
                if (!isNaN(domEl.offsetLeft)) {
 +
                    offsetLeft += domEl.offsetLeft;
 +
                }
 +
            } while (domEl = domEl.offsetParent);
 +
 
 +
            return {
 +
                top    : offsetTop,
 +
                left  : offsetLeft,
 +
                height : offsetHeight,
 +
                width  : offsetWidth
 +
            }
 +
        }
 +
 
 +
 
 +
 
 +
        function _isElemVisible(elem) {
 +
 
 +
            var
 +
                offset    = _getOffset(elem.domEl),
 +
                container  = _getContainer(elem.config.container),
 +
                scrolled  = _getScrolled(elem.config.container),
 +
                vF        = elem.config.viewFactor,
 +
 
 +
                // Define the element geometry.
 +
                elemHeight = offset.height,
 +
                elemWidth  = offset.width,
 +
                elemTop    = offset.top,
 +
                elemLeft  = offset.left,
 +
                elemBottom = elemTop  + elemHeight,
 +
                elemRight  = elemLeft + elemWidth;
 +
 
 +
            return confirmBounds() || isPositionFixed()
 +
 
 +
            function confirmBounds() {
 +
 
 +
                var
 +
                    // Define the element’s functional boundaries using its view factor.
 +
                    top        = elemTop    + elemHeight * vF,
 +
                    left      = elemLeft  + elemWidth  * vF,
 +
                    bottom    = elemBottom - elemHeight * vF,
 +
                    right      = elemRight  - elemWidth  * vF,
 +
 
 +
                    // Define the container functional boundaries using its view offset.
 +
                    viewTop    = scrolled.y + elem.config.viewOffset.top,
 +
                    viewLeft  = scrolled.x + elem.config.viewOffset.left,
 +
                    viewBottom = scrolled.y - elem.config.viewOffset.bottom + container.height,
 +
                    viewRight  = scrolled.x - elem.config.viewOffset.right  + container.width;
 +
 
 +
                return top    < viewBottom
 +
                    && bottom > viewTop
 +
                    && left  > viewLeft
 +
                    && right  < viewRight
 +
            }
 +
 
 +
            function isPositionFixed() {
 +
                return (window.getComputedStyle(elem.domEl).position === 'fixed')
 +
            }
 +
        }
 +
 
 +
 
 +
 
 +
        return ScrollReveal
 +
 
 +
    })();
 +
 
 +
 
 +
    /**
 +
    * helper.tools.js
 +
    * ---------------
 +
    * Simple deep object extend, and a few other agnostic helper methods.
 +
    * gist: https://gist.github.com/jlmakes/9f104e3f1b4d86334987
 +
    */
 +
 
 +
    Tools = (function() {
 +
 
 +
        Tools.prototype.isObject = function(object) {
 +
            return object !== null && typeof object === 'object' && object.constructor == Object
 +
        };
 +
 
 +
        Tools.prototype.isNode = function(object) {
 +
            return typeof Node === 'object'
 +
                ? object instanceof Node
 +
                : object && typeof object === 'object'
 +
                        && typeof object.nodeType === 'number'
 +
                        && typeof object.nodeName === 'string'
 +
        };
 +
 
 +
        Tools.prototype.forOwn = function(object, callback) {
 +
            if (!this.isObject(object)) {
 +
                throw new TypeError('Expected "object", but received "' + typeof object + '".');
 +
            } else {
 +
                for (var property in object) {
 +
                    if (object.hasOwnProperty(property)) {
 +
                        callback(property);
 +
                    }
 +
                }
 +
            }
 +
        };
 +
 
 +
        Tools.prototype.extend = function(target, source) {
 +
            this.forOwn(source, function(property) {
 +
                if (this.isObject(source[property])) {
 +
                    if (!target[property] || !this.isObject(target[property])) {
 +
                        target[property] = {};
 +
                    }
 +
                    this.extend(target[property], source[property]);
 +
                } else {
 +
                    target[property] = source[property];
 +
                }
 +
            }.bind(this));
 +
            return target
 +
        };
 +
 
 +
        Tools.prototype.extendClone = function(target, source) {
 +
            return this.extend(this.extend({}, target), source)
 +
        };
 +
 
 +
        Tools.prototype.isMobile = function() {
 +
            return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
 +
        };
 +
 
 +
        function Tools() {};
 +
        return Tools
 +
 
 +
    })();
 +
 
 +
 
 +
 
 +
    _requestAnimationFrame = window.requestAnimationFrame      ||
 +
                            window.webkitRequestAnimationFrame ||
 +
                            window.mozRequestAnimationFrame;
 +
 
 +
 
 +
 
 +
}).call(this);
 +
 
 +
return this.ScrollReveal;
 +
 
 +
}));
 +
 
 +
/*! Magnific Popup - v1.1.0 - 2016-02-20
 +
* http://dimsemenov.com/plugins/magnific-popup/
 +
* Copyright (c) 2016 Dmitry Semenov; */
 +
;(function (factory) {
 +
if (typeof define === 'function' && define.amd) {
 +
// AMD. Register as an anonymous module.
 +
define(['jquery'], factory);
 +
} else if (typeof exports === 'object') {
 +
// Node/CommonJS
 +
factory(require('jquery'));
 +
} else {
 +
// Browser globals
 +
factory(window.jQuery || window.Zepto);
 +
}
 +
}(function($) {
 +
 
 +
/*>>core*/
 +
/**
 +
*
 +
* Magnific Popup Core JS file
 +
*
 +
*/
 +
 
 +
 
 +
/**
 +
* Private static constants
 +
*/
 +
var CLOSE_EVENT = 'Close',
 +
BEFORE_CLOSE_EVENT = 'BeforeClose',
 +
AFTER_CLOSE_EVENT = 'AfterClose',
 +
BEFORE_APPEND_EVENT = 'BeforeAppend',
 +
MARKUP_PARSE_EVENT = 'MarkupParse',
 +
OPEN_EVENT = 'Open',
 +
CHANGE_EVENT = 'Change',
 +
NS = 'mfp',
 +
EVENT_NS = '.' + NS,
 +
READY_CLASS = 'mfp-ready',
 +
REMOVING_CLASS = 'mfp-removing',
 +
PREVENT_CLOSE_CLASS = 'mfp-prevent-close';
 +
 
 +
 
 +
/**
 +
* Private vars
 +
*/
 +
/*jshint -W079 */
 +
var mfp, // As we have only one instance of MagnificPopup object, we define it locally to not to use 'this'
 +
MagnificPopup = function(){},
 +
_isJQ = !!(window.jQuery),
 +
_prevStatus,
 +
_window = $(window),
 +
_document,
 +
_prevContentType,
 +
_wrapClasses,
 +
_currPopupType;
 +
 
 +
 
 +
/**
 +
* Private functions
 +
*/
 +
var _mfpOn = function(name, f) {
 +
mfp.ev.on(NS + name + EVENT_NS, f);
 +
},
 +
_getEl = function(className, appendTo, html, raw) {
 +
var el = document.createElement('div');
 +
el.className = 'mfp-'+className;
 +
if(html) {
 +
el.innerHTML = html;
 +
}
 +
if(!raw) {
 +
el = $(el);
 +
if(appendTo) {
 +
el.appendTo(appendTo);
 +
}
 +
} else if(appendTo) {
 +
appendTo.appendChild(el);
 +
}
 +
return el;
 +
},
 +
_mfpTrigger = function(e, data) {
 +
mfp.ev.triggerHandler(NS + e, data);
 +
 
 +
if(mfp.st.callbacks) {
 +
// converts "mfpEventName" to "eventName" callback and triggers it if it's present
 +
e = e.charAt(0).toLowerCase() + e.slice(1);
 +
if(mfp.st.callbacks[e]) {
 +
mfp.st.callbacks[e].apply(mfp, $.isArray(data) ? data : [data]);
 +
}
 +
}
 +
},
 +
_getCloseBtn = function(type) {
 +
if(type !== _currPopupType || !mfp.currTemplate.closeBtn) {
 +
mfp.currTemplate.closeBtn = $( mfp.st.closeMarkup.replace('%title%', mfp.st.tClose ) );
 +
_currPopupType = type;
 +
}
 +
return mfp.currTemplate.closeBtn;
 +
},
 +
// Initialize Magnific Popup only when called at least once
 +
_checkInstance = function() {
 +
if(!$.magnificPopup.instance) {
 +
/*jshint -W020 */
 +
mfp = new MagnificPopup();
 +
mfp.init();
 +
$.magnificPopup.instance = mfp;
 +
}
 +
},
 +
// CSS transition detection, http://stackoverflow.com/questions/7264899/detect-css-transitions-using-javascript-and-without-modernizr
 +
supportsTransitions = function() {
 +
var s = document.createElement('p').style, // 's' for style. better to create an element if body yet to exist
 +
v = ['ms','O','Moz','Webkit']; // 'v' for vendor
 +
 
 +
if( s['transition'] !== undefined ) {
 +
return true;
 +
}
 +
 +
while( v.length ) {
 +
if( v.pop() + 'Transition' in s ) {
 +
return true;
 +
}
 +
}
 +
 +
return false;
 +
};
 +
 
 +
 
 +
 
 +
/**
 +
* Public functions
 +
*/
 +
MagnificPopup.prototype = {
 +
 
 +
constructor: MagnificPopup,
 +
 
 +
/**
 +
* Initializes Magnific Popup plugin.
 +
* This function is triggered only once when $.fn.magnificPopup or $.magnificPopup is executed
 +
*/
 +
init: function() {
 +
var appVersion = navigator.appVersion;
 +
mfp.isLowIE = mfp.isIE8 = document.all && !document.addEventListener;
 +
mfp.isAndroid = (/android/gi).test(appVersion);
 +
mfp.isIOS = (/iphone|ipad|ipod/gi).test(appVersion);
 +
mfp.supportsTransition = supportsTransitions();
 +
 
 +
// We disable fixed positioned lightbox on devices that don't handle it nicely.
 +
// If you know a better way of detecting this - let me know.
 +
mfp.probablyMobile = (mfp.isAndroid || mfp.isIOS || /(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent) );
 +
_document = $(document);
 +
 
 +
mfp.popupsCache = {};
 +
},
 +
 
 +
/**
 +
* Opens popup
 +
* @param  data [description]
 +
*/
 +
open: function(data) {
 +
 
 +
var i;
 +
 
 +
if(data.isObj === false) {
 +
// convert jQuery collection to array to avoid conflicts later
 +
mfp.items = data.items.toArray();
 +
 
 +
mfp.index = 0;
 +
var items = data.items,
 +
item;
 +
for(i = 0; i < items.length; i++) {
 +
item = items[i];
 +
if(item.parsed) {
 +
item = item.el[0];
 +
}
 +
if(item === data.el[0]) {
 +
mfp.index = i;
 +
break;
 +
}
 +
}
 +
} else {
 +
mfp.items = $.isArray(data.items) ? data.items : [data.items];
 +
mfp.index = data.index || 0;
 +
}
 +
 
 +
// if popup is already opened - we just update the content
 +
if(mfp.isOpen) {
 +
mfp.updateItemHTML();
 +
return;
 +
}
 
 
var owl = $('.owl-carousel-carousel');
+
mfp.types = [];
owl.owlCarousel({
+
_wrapClasses = '';
items: 3,
+
if(data.mainEl && data.mainEl.length) {
loop: true,
+
mfp.ev = data.mainEl.eq(0);
margin: 20,
+
} else {
nav: true,
+
mfp.ev = _document;
dots: true,
+
}
smartSpeed: 800,
+
autoHeight: true,
+
navText: [
+
      "<i class='ti-arrow-left owl-direction'></i>",
+
      "<i class='ti-arrow-right owl-direction'></i>"
+
    ],
+
    responsive:{
+
        0:{
+
            items:1
+
        },
+
        600:{
+
            items:2
+
        },
+
        1000:{
+
            items:3
+
        }
+
    }
+
});
+
  
 +
if(data.key) {
 +
if(!mfp.popupsCache[data.key]) {
 +
mfp.popupsCache[data.key] = {};
 +
}
 +
mfp.currTemplate = mfp.popupsCache[data.key];
 +
} else {
 +
mfp.currTemplate = {};
 +
}
  
var owl = $('.owl-carousel-fullwidth');
 
owl.owlCarousel({
 
items: 1,
 
loop: true,
 
margin: 20,
 
nav: true,
 
dots: true,
 
smartSpeed: 800,
 
autoHeight: true,
 
navText: [
 
      "<i class='ti-arrow-left owl-direction'></i>",
 
      "<i class='ti-arrow-right owl-direction'></i>"
 
    ]
 
});
 
  
  
 +
mfp.st = $.extend(true, {}, $.magnificPopup.defaults, data );
 +
mfp.fixedContentPos = mfp.st.fixedContentPos === 'auto' ? !mfp.probablyMobile : mfp.st.fixedContentPos;
 +
 +
if(mfp.st.modal) {
 +
mfp.st.closeOnContentClick = false;
 +
mfp.st.closeOnBgClick = false;
 +
mfp.st.showCloseBtn = false;
 +
mfp.st.enableEscapeKey = false;
 +
}
 
 
  
};
+
// Building markup
 +
// main containers are created only once
 +
if(!mfp.bgOverlay) {
  
var tabs = function() {
+
// Dark overlay
 +
mfp.bgOverlay = _getEl('bg').on('click'+EVENT_NS, function() {
 +
mfp.close();
 +
});
  
// Auto adjust height
+
mfp.wrap = _getEl('wrap').attr('tabindex', -1).on('click'+EVENT_NS, function(e) {
$('.gtco-tab-content-wrap').css('height', 0);
+
if(mfp._checkIfClose(e.target)) {
var autoHeight = function() {
+
mfp.close();
 +
}
 +
});
  
setTimeout(function(){
+
mfp.container = _getEl('container', mfp.wrap);
 +
}
  
var tabContentWrap = $('.gtco-tab-content-wrap'),
+
mfp.contentContainer = _getEl('content');
tabHeight = $('.gtco-tab-nav').outerHeight(),
+
if(mfp.st.preloader) {
formActiveHeight = $('.tab-content.active').outerHeight(),
+
mfp.preloader = _getEl('preloader', mfp.container, mfp.st.tLoading);
totalHeight = parseInt(tabHeight + formActiveHeight + 90);
+
}
  
tabContentWrap.css('height', totalHeight );
 
  
$(window).resize(function(){
+
// Initializing modules
var tabContentWrap = $('.gtco-tab-content-wrap'),
+
var modules = $.magnificPopup.modules;
tabHeight = $('.gtco-tab-nav').outerHeight(),
+
for(i = 0; i < modules.length; i++) {
formActiveHeight = $('.tab-content.active').outerHeight(),
+
var n = modules[i];
totalHeight = parseInt(tabHeight + formActiveHeight + 90);
+
n = n.charAt(0).toUpperCase() + n.slice(1);
 +
mfp['init'+n].call(mfp);
 +
}
 +
_mfpTrigger('BeforeOpen');
  
tabContentWrap.css('height', totalHeight );
+
 
 +
if(mfp.st.showCloseBtn) {
 +
// Close button
 +
if(!mfp.st.closeBtnInside) {
 +
mfp.wrap.append( _getCloseBtn() );
 +
} else {
 +
_mfpOn(MARKUP_PARSE_EVENT, function(e, template, values, item) {
 +
values.close_replaceWith = _getCloseBtn(item.type);
 
});
 
});
 +
_wrapClasses += ' mfp-close-btn-in';
 +
}
 +
}
  
}, 100);
+
if(mfp.st.alignTop) {
 +
_wrapClasses += ' mfp-align-top';
 +
}
 +
 
 +
 +
 
 +
if(mfp.fixedContentPos) {
 +
mfp.wrap.css({
 +
overflow: mfp.st.overflowY,
 +
overflowX: 'hidden',
 +
overflowY: mfp.st.overflowY
 +
});
 +
} else {
 +
mfp.wrap.css({
 +
top: _window.scrollTop(),
 +
position: 'absolute'
 +
});
 +
}
 +
if( mfp.st.fixedBgPos === false || (mfp.st.fixedBgPos === 'auto' && !mfp.fixedContentPos) ) {
 +
mfp.bgOverlay.css({
 +
height: _document.height(),
 +
position: 'absolute'
 +
});
 +
}
 +
 
 +
 +
 
 +
if(mfp.st.enableEscapeKey) {
 +
// Close on ESC key
 +
_document.on('keyup' + EVENT_NS, function(e) {
 +
if(e.keyCode === 27) {
 +
mfp.close();
 +
}
 +
});
 +
}
 +
 
 +
_window.on('resize' + EVENT_NS, function() {
 +
mfp.updateSize();
 +
});
 +
 
 +
 
 +
if(!mfp.st.closeOnContentClick) {
 +
_wrapClasses += ' mfp-auto-cursor';
 +
}
 +
 +
if(_wrapClasses)
 +
mfp.wrap.addClass(_wrapClasses);
 +
 
 +
 
 +
// this triggers recalculation of layout, so we get it once to not to trigger twice
 +
var windowHeight = mfp.wH = _window.height();
 +
 
 +
 +
var windowStyles = {};
 +
 
 +
if( mfp.fixedContentPos ) {
 +
            if(mfp._hasScrollBar(windowHeight)){
 +
                var s = mfp._getScrollbarSize();
 +
                if(s) {
 +
                    windowStyles.marginRight = s;
 +
                }
 +
            }
 +
        }
 +
 
 +
if(mfp.fixedContentPos) {
 +
if(!mfp.isIE7) {
 +
windowStyles.overflow = 'hidden';
 +
} else {
 +
// ie7 double-scroll bug
 +
$('body, html').css('overflow', 'hidden');
 +
}
 +
}
 +
 
 +
 +
 +
var classesToadd = mfp.st.mainClass;
 +
if(mfp.isIE7) {
 +
classesToadd += ' mfp-ie7';
 +
}
 +
if(classesToadd) {
 +
mfp._addClassToMFP( classesToadd );
 +
}
 +
 
 +
// add content
 +
mfp.updateItemHTML();
 +
 
 +
_mfpTrigger('BuildControls');
 +
 
 +
// remove scrollbar, add margin e.t.c
 +
$('html').css(windowStyles);
 +
 +
// add everything to DOM
 +
mfp.bgOverlay.add(mfp.wrap).prependTo( mfp.st.prependTo || $(document.body) );
 +
 
 +
// Save last focused element
 +
mfp._lastFocusedEl = document.activeElement;
 +
 +
// Wait for next cycle to allow CSS transition
 +
setTimeout(function() {
 
 
 +
if(mfp.content) {
 +
mfp._addClassToMFP(READY_CLASS);
 +
mfp._setFocus();
 +
} else {
 +
// if content is not defined (not loaded e.t.c) we add class only for BG
 +
mfp.bgOverlay.addClass(READY_CLASS);
 +
}
 +
 +
// Trap the focus in popup
 +
_document.on('focusin' + EVENT_NS, mfp._onFocusIn);
 +
 +
}, 16);
 +
 +
mfp.isOpen = true;
 +
mfp.updateSize(windowHeight);
 +
_mfpTrigger(OPEN_EVENT);
 +
 +
return data;
 +
},
 +
 +
/**
 +
* Closes the popup
 +
*/
 +
close: function() {
 +
if(!mfp.isOpen) return;
 +
_mfpTrigger(BEFORE_CLOSE_EVENT);
 +
 +
mfp.isOpen = false;
 +
// for CSS3 animation
 +
if(mfp.st.removalDelay && !mfp.isLowIE && mfp.supportsTransition )  {
 +
mfp._addClassToMFP(REMOVING_CLASS);
 +
setTimeout(function() {
 +
mfp._close();
 +
}, mfp.st.removalDelay);
 +
} else {
 +
mfp._close();
 +
}
 +
},
 +
 +
/**
 +
* Helper for close() function
 +
*/
 +
_close: function() {
 +
_mfpTrigger(CLOSE_EVENT);
 +
 +
var classesToRemove = REMOVING_CLASS + ' ' + READY_CLASS + ' ';
 +
 +
mfp.bgOverlay.detach();
 +
mfp.wrap.detach();
 +
mfp.container.empty();
 +
 +
if(mfp.st.mainClass) {
 +
classesToRemove += mfp.st.mainClass + ' ';
 +
}
 +
 +
mfp._removeClassFromMFP(classesToRemove);
 +
 +
if(mfp.fixedContentPos) {
 +
var windowStyles = {marginRight: ''};
 +
if(mfp.isIE7) {
 +
$('body, html').css('overflow', '');
 +
} else {
 +
windowStyles.overflow = '';
 +
}
 +
$('html').css(windowStyles);
 +
}
 +
 +
_document.off('keyup' + EVENT_NS + ' focusin' + EVENT_NS);
 +
mfp.ev.off(EVENT_NS);
 +
 +
// clean up DOM elements that aren't removed
 +
mfp.wrap.attr('class', 'mfp-wrap').removeAttr('style');
 +
mfp.bgOverlay.attr('class', 'mfp-bg');
 +
mfp.container.attr('class', 'mfp-container');
 +
 +
// remove close button from target element
 +
if(mfp.st.showCloseBtn &&
 +
(!mfp.st.closeBtnInside || mfp.currTemplate[mfp.currItem.type] === true)) {
 +
if(mfp.currTemplate.closeBtn)
 +
mfp.currTemplate.closeBtn.detach();
 +
}
 +
 +
 +
if(mfp.st.autoFocusLast && mfp._lastFocusedEl) {
 +
$(mfp._lastFocusedEl).focus(); // put tab focus back
 +
}
 +
mfp.currItem = null;
 +
mfp.content = null;
 +
mfp.currTemplate = null;
 +
mfp.prevHeight = 0;
 +
 +
_mfpTrigger(AFTER_CLOSE_EVENT);
 +
},
 +
 +
updateSize: function(winHeight) {
 +
 +
if(mfp.isIOS) {
 +
// fixes iOS nav bars https://github.com/dimsemenov/Magnific-Popup/issues/2
 +
var zoomLevel = document.documentElement.clientWidth / window.innerWidth;
 +
var height = window.innerHeight * zoomLevel;
 +
mfp.wrap.css('height', height);
 +
mfp.wH = height;
 +
} else {
 +
mfp.wH = winHeight || _window.height();
 +
}
 +
// Fixes #84: popup incorrectly positioned with position:relative on body
 +
if(!mfp.fixedContentPos) {
 +
mfp.wrap.css('height', mfp.wH);
 +
}
 +
 +
_mfpTrigger('Resize');
 +
 +
},
 +
 +
/**
 +
* Set content of popup based on current index
 +
*/
 +
updateItemHTML: function() {
 +
var item = mfp.items[mfp.index];
 +
 +
// Detach and perform modifications
 +
mfp.contentContainer.detach();
 +
 +
if(mfp.content)
 +
mfp.content.detach();
 +
 +
if(!item.parsed) {
 +
item = mfp.parseEl( mfp.index );
 +
}
 +
 +
var type = item.type;
 +
 +
_mfpTrigger('BeforeChange', [mfp.currItem ? mfp.currItem.type : '', type]);
 +
// BeforeChange event works like so:
 +
// _mfpOn('BeforeChange', function(e, prevType, newType) { });
 +
 +
mfp.currItem = item;
 +
 +
if(!mfp.currTemplate[type]) {
 +
var markup = mfp.st[type] ? mfp.st[type].markup : false;
 +
 +
// allows to modify markup
 +
_mfpTrigger('FirstMarkupParse', markup);
 +
 +
if(markup) {
 +
mfp.currTemplate[type] = $(markup);
 +
} else {
 +
// if there is no markup found we just define that template is parsed
 +
mfp.currTemplate[type] = true;
 +
}
 +
}
 +
 +
if(_prevContentType && _prevContentType !== item.type) {
 +
mfp.container.removeClass('mfp-'+_prevContentType+'-holder');
 +
}
 +
 +
var newContent = mfp['get' + type.charAt(0).toUpperCase() + type.slice(1)](item, mfp.currTemplate[type]);
 +
mfp.appendContent(newContent, type);
 +
 +
item.preloaded = true;
 +
 +
_mfpTrigger(CHANGE_EVENT, item);
 +
_prevContentType = item.type;
 +
 +
// Append container back after its content changed
 +
mfp.container.prepend(mfp.contentContainer);
 +
 +
_mfpTrigger('AfterChange');
 +
},
 +
 +
 +
/**
 +
* Set HTML content of popup
 +
*/
 +
appendContent: function(newContent, type) {
 +
mfp.content = newContent;
 +
 +
if(newContent) {
 +
if(mfp.st.showCloseBtn && mfp.st.closeBtnInside &&
 +
mfp.currTemplate[type] === true) {
 +
// if there is no markup, we just append close button element inside
 +
if(!mfp.content.find('.mfp-close').length) {
 +
mfp.content.append(_getCloseBtn());
 +
}
 +
} else {
 +
mfp.content = newContent;
 +
}
 +
} else {
 +
mfp.content = '';
 +
}
 +
 +
_mfpTrigger(BEFORE_APPEND_EVENT);
 +
mfp.container.addClass('mfp-'+type+'-holder');
 +
 +
mfp.contentContainer.append(mfp.content);
 +
},
 +
 +
 +
/**
 +
* Creates Magnific Popup data object based on given data
 +
* @param  {int} index Index of item to parse
 +
*/
 +
parseEl: function(index) {
 +
var item = mfp.items[index],
 +
type;
 +
 +
if(item.tagName) {
 +
item = { el: $(item) };
 +
} else {
 +
type = item.type;
 +
item = { data: item, src: item.src };
 +
}
 +
 +
if(item.el) {
 +
var types = mfp.types;
 +
 +
// check for 'mfp-TYPE' class
 +
for(var i = 0; i < types.length; i++) {
 +
if( item.el.hasClass('mfp-'+types[i]) ) {
 +
type = types[i];
 +
break;
 +
}
 +
}
 +
 +
item.src = item.el.attr('data-mfp-src');
 +
if(!item.src) {
 +
item.src = item.el.attr('href');
 +
}
 +
}
 +
 +
item.type = type || mfp.st.type || 'inline';
 +
item.index = index;
 +
item.parsed = true;
 +
mfp.items[index] = item;
 +
_mfpTrigger('ElementParse', item);
 +
 +
return mfp.items[index];
 +
},
 +
 +
 +
/**
 +
* Initializes single popup or a group of popups
 +
*/
 +
addGroup: function(el, options) {
 +
var eHandler = function(e) {
 +
e.mfpEl = this;
 +
mfp._openClick(e, el, options);
 
};
 
};
  
autoHeight();
+
if(!options) {
 +
options = {};
 +
}
  
 +
var eName = 'click.magnificPopup';
 +
options.mainEl = el;
  
// Click tab menu
+
if(options.items) {
$('.gtco-tab-nav a').on('click', function(event){
+
options.isObj = true;
+
el.off(eName).on(eName, eHandler);
var $this = $(this),
+
} else {
tab = $this.data('tab');
+
options.isObj = false;
 +
if(options.delegate) {
 +
el.off(eName).on(eName, options.delegate , eHandler);
 +
} else {
 +
options.items = el;
 +
el.off(eName).on(eName, eHandler);
 +
}
 +
}
 +
},
 +
_openClick: function(e, el, options) {
 +
var midClick = options.midClick !== undefined ? options.midClick : $.magnificPopup.defaults.midClick;
  
$('.tab-content')
 
.addClass('animated-fast fadeOutDown');
 
  
$('.tab-content')
+
if(!midClick && ( e.which === 2 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey ) ) {
.removeClass('active');
+
return;
 +
}
  
$('.gtco-tab-nav li').removeClass('active');
+
var disableOn = options.disableOn !== undefined ? options.disableOn : $.magnificPopup.defaults.disableOn;
+
$this
+
.closest('li')
+
.addClass('active')
+
  
$this
+
if(disableOn) {
.closest('.gtco-tabs')
+
if($.isFunction(disableOn)) {
.find('.tab-content[data-tab-content="'+tab+'"]')
+
if( !disableOn.call(mfp) ) {
.removeClass('animated-fast fadeOutDown')
+
return true;
.addClass('animated-fast active fadeIn');
+
}
 +
} else { // else it's number
 +
if( _window.width() < disableOn ) {
 +
return true;
 +
}
 +
}
 +
}
  
 +
if(e.type) {
 +
e.preventDefault();
  
autoHeight();
+
// This will prevent popup from closing if element is inside and popup is already opened
event.preventDefault();
+
if(mfp.isOpen) {
 +
e.stopPropagation();
 +
}
 +
}
  
});  
+
options.el = $(e.mfpEl);
};
+
if(options.delegate) {
 +
options.items = el.find(options.delegate);
 +
}
 +
mfp.open(options);
 +
},
  
  
var goToTop = function() {
+
/**
 +
* Updates text on preloader
 +
*/
 +
updateStatus: function(status, text) {
  
$('.js-gotop').on('click', function(event){
+
if(mfp.preloader) {
+
if(_prevStatus !== status) {
event.preventDefault();
+
mfp.container.removeClass('mfp-s-'+_prevStatus);
 +
}
  
$('html, body').animate({
+
if(!text && status === 'loading') {
scrollTop: $('html').offset().top
+
text = mfp.st.tLoading;
}, 500, 'easeInOutExpo');
+
}
+
 
 +
var data = {
 +
status: status,
 +
text: text
 +
};
 +
// allows to modify status
 +
_mfpTrigger('UpdateStatus', data);
 +
 
 +
status = data.status;
 +
text = data.text;
 +
 
 +
mfp.preloader.html(text);
 +
 
 +
mfp.preloader.find('a').on('click', function(e) {
 +
e.stopImmediatePropagation();
 +
});
 +
 
 +
mfp.container.addClass('mfp-s-'+status);
 +
_prevStatus = status;
 +
}
 +
},
 +
 
 +
 
 +
/*
 +
"Private" helpers that aren't private at all
 +
*/
 +
// Check to close popup or not
 +
// "target" is an element that was clicked
 +
_checkIfClose: function(target) {
 +
 
 +
if($(target).hasClass(PREVENT_CLOSE_CLASS)) {
 +
return;
 +
}
 +
 
 +
var closeOnContent = mfp.st.closeOnContentClick;
 +
var closeOnBg = mfp.st.closeOnBgClick;
 +
 
 +
if(closeOnContent && closeOnBg) {
 +
return true;
 +
} else {
 +
 
 +
// We close the popup if click is on close button or on preloader. Or if there is no content.
 +
if(!mfp.content || $(target).hasClass('mfp-close') || (mfp.preloader && target === mfp.preloader[0]) ) {
 +
return true;
 +
}
 +
 
 +
// if click is outside the content
 +
if( (target !== mfp.content[0] && !$.contains(mfp.content[0], target))  ) {
 +
if(closeOnBg) {
 +
// last check, if the clicked element is in DOM, (in case it's removed onclick)
 +
if( $.contains(document, target) ) {
 +
return true;
 +
}
 +
}
 +
} else if(closeOnContent) {
 +
return true;
 +
}
 +
 
 +
}
 +
return false;
 +
},
 +
_addClassToMFP: function(cName) {
 +
mfp.bgOverlay.addClass(cName);
 +
mfp.wrap.addClass(cName);
 +
},
 +
_removeClassFromMFP: function(cName) {
 +
this.bgOverlay.removeClass(cName);
 +
mfp.wrap.removeClass(cName);
 +
},
 +
_hasScrollBar: function(winHeight) {
 +
return (  (mfp.isIE7 ? _document.height() : document.body.scrollHeight) > (winHeight || _window.height()) );
 +
},
 +
_setFocus: function() {
 +
(mfp.st.focus ? mfp.content.find(mfp.st.focus).eq(0) : mfp.wrap).focus();
 +
},
 +
_onFocusIn: function(e) {
 +
if( e.target !== mfp.wrap[0] && !$.contains(mfp.wrap[0], e.target) ) {
 +
mfp._setFocus();
 
return false;
 
return false;
 +
}
 +
},
 +
_parseMarkup: function(template, values, item) {
 +
var arr;
 +
if(item.data) {
 +
values = $.extend(item.data, values);
 +
}
 +
_mfpTrigger(MARKUP_PARSE_EVENT, [template, values, item] );
 +
 +
$.each(values, function(key, value) {
 +
if(value === undefined || value === false) {
 +
return true;
 +
}
 +
arr = key.split('_');
 +
if(arr.length > 1) {
 +
var el = template.find(EVENT_NS + '-'+arr[0]);
 +
 +
if(el.length > 0) {
 +
var attr = arr[1];
 +
if(attr === 'replaceWith') {
 +
if(el[0] !== value[0]) {
 +
el.replaceWith(value);
 +
}
 +
} else if(attr === 'img') {
 +
if(el.is('img')) {
 +
el.attr('src', value);
 +
} else {
 +
el.replaceWith( $('<img>').attr('src', value).attr('class', el.attr('class')) );
 +
}
 +
} else {
 +
el.attr(arr[1], value);
 +
}
 +
}
 +
 +
} else {
 +
template.find(EVENT_NS + '-'+key).html(value);
 +
}
 
});
 
});
 +
},
 +
 +
_getScrollbarSize: function() {
 +
// thx David
 +
if(mfp.scrollbarSize === undefined) {
 +
var scrollDiv = document.createElement("div");
 +
scrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;';
 +
document.body.appendChild(scrollDiv);
 +
mfp.scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth;
 +
document.body.removeChild(scrollDiv);
 +
}
 +
return mfp.scrollbarSize;
 +
}
 +
 +
}; /* MagnificPopup core prototype end */
 +
 +
 +
 +
 +
/**
 +
* Public static functions
 +
*/
 +
$.magnificPopup = {
 +
instance: null,
 +
proto: MagnificPopup.prototype,
 +
modules: [],
 +
 +
open: function(options, index) {
 +
_checkInstance();
 +
 +
if(!options) {
 +
options = {};
 +
} else {
 +
options = $.extend(true, {}, options);
 +
}
 +
 +
options.isObj = true;
 +
options.index = index || 0;
 +
return this.instance.open(options);
 +
},
 +
 +
close: function() {
 +
return $.magnificPopup.instance && $.magnificPopup.instance.close();
 +
},
 +
 +
registerModule: function(name, module) {
 +
if(module.options) {
 +
$.magnificPopup.defaults[name] = module.options;
 +
}
 +
$.extend(this.proto, module.proto);
 +
this.modules.push(name);
 +
},
 +
 +
defaults: {
 +
 +
// Info about options is in docs:
 +
// http://dimsemenov.com/plugins/magnific-popup/documentation.html#options
 +
 +
disableOn: 0,
 +
 +
key: null,
 +
 +
midClick: false,
 +
 +
mainClass: '',
 +
 +
preloader: true,
 +
 +
focus: '', // CSS selector of input to focus after popup is opened
 +
 +
closeOnContentClick: false,
 +
 +
closeOnBgClick: true,
 +
 +
closeBtnInside: true,
 +
 +
showCloseBtn: true,
 +
 +
enableEscapeKey: true,
 +
 +
modal: false,
 +
 +
alignTop: false,
 +
 +
removalDelay: 0,
 +
 +
prependTo: null,
 +
 +
fixedContentPos: 'auto',
 +
 +
fixedBgPos: 'auto',
 +
 +
overflowY: 'auto',
 +
 +
closeMarkup: '<button title="%title%" type="button" class="mfp-close">&#215;</button>',
 +
 +
tClose: 'Close (Esc)',
 +
 +
tLoading: 'Loading...',
 +
 +
autoFocusLast: true
 +
 +
}
 +
};
 +
 +
 +
 +
$.fn.magnificPopup = function(options) {
 +
_checkInstance();
 +
 +
var jqEl = $(this);
 +
 +
// We call some API method of first param is a string
 +
if (typeof options === "string" ) {
  
$(window).scroll(function(){
+
if(options === 'open') {
 +
var items,
 +
itemOpts = _isJQ ? jqEl.data('magnificPopup') : jqEl[0].magnificPopup,
 +
index = parseInt(arguments[1], 10) || 0;
  
var $win = $(window);
+
if(itemOpts.items) {
if ($win.scrollTop() > 200) {
+
items = itemOpts.items[index];
$('.js-top').addClass('active');
+
 
} else {
 
} else {
$('.js-top').removeClass('active');
+
items = jqEl;
 +
if(itemOpts.delegate) {
 +
items = items.find(itemOpts.delegate);
 +
}
 +
items = items.eq( index );
 
}
 
}
 +
mfp._openClick({mfpEl:items}, jqEl, itemOpts);
 +
} else {
 +
if(mfp.isOpen)
 +
mfp[options].apply(mfp, Array.prototype.slice.call(arguments, 1));
 +
}
  
});
+
} else {
+
// clone options obj
 +
options = $.extend(true, {}, options);
 +
 
 +
/*
 +
* As Zepto doesn't support .data() method for objects
 +
* and it works only in normal browsers
 +
* we assign "options" object directly to the DOM element. FTW!
 +
*/
 +
if(_isJQ) {
 +
jqEl.data('magnificPopup', options);
 +
} else {
 +
jqEl[0].magnificPopup = options;
 +
}
 +
 
 +
mfp.addGroup(jqEl, options);
 +
 
 +
}
 +
return jqEl;
 +
};
 +
 
 +
/*>>core*/
 +
 
 +
/*>>inline*/
 +
 
 +
var INLINE_NS = 'inline',
 +
_hiddenClass,
 +
_inlinePlaceholder,
 +
_lastInlineElement,
 +
_putInlineElementsBack = function() {
 +
if(_lastInlineElement) {
 +
_inlinePlaceholder.after( _lastInlineElement.addClass(_hiddenClass) ).detach();
 +
_lastInlineElement = null;
 +
}
 
};
 
};
  
 +
$.magnificPopup.registerModule(INLINE_NS, {
 +
options: {
 +
hiddenClass: 'hide', // will be appended with `mfp-` prefix
 +
markup: '',
 +
tNotFound: 'Content not found'
 +
},
 +
proto: {
  
// Loading page
+
initInline: function() {
var loaderPage = function() {
+
mfp.types.push(INLINE_NS);
$(".gtco-loader").fadeOut("slow");
+
 
 +
_mfpOn(CLOSE_EVENT+'.'+INLINE_NS, function() {
 +
_putInlineElementsBack();
 +
});
 +
},
 +
 
 +
getInline: function(item, template) {
 +
 
 +
_putInlineElementsBack();
 +
 
 +
if(item.src) {
 +
var inlineSt = mfp.st.inline,
 +
el = $(item.src);
 +
 
 +
if(el.length) {
 +
 
 +
// If target element has parent - we replace it with placeholder and put it back after popup is closed
 +
var parent = el[0].parentNode;
 +
if(parent && parent.tagName) {
 +
if(!_inlinePlaceholder) {
 +
_hiddenClass = inlineSt.hiddenClass;
 +
_inlinePlaceholder = _getEl(_hiddenClass);
 +
_hiddenClass = 'mfp-'+_hiddenClass;
 +
}
 +
// replace target inline element with placeholder
 +
_lastInlineElement = el.after(_inlinePlaceholder).detach().removeClass(_hiddenClass);
 +
}
 +
 
 +
mfp.updateStatus('ready');
 +
} else {
 +
mfp.updateStatus('error', inlineSt.tNotFound);
 +
el = $('<div>');
 +
}
 +
 
 +
item.inlineElement = el;
 +
return el;
 +
}
 +
 
 +
mfp.updateStatus('ready');
 +
mfp._parseMarkup(template, {}, item);
 +
return template;
 +
}
 +
}
 +
});
 +
 
 +
/*>>inline*/
 +
 
 +
/*>>ajax*/
 +
var AJAX_NS = 'ajax',
 +
_ajaxCur,
 +
_removeAjaxCursor = function() {
 +
if(_ajaxCur) {
 +
$(document.body).removeClass(_ajaxCur);
 +
}
 +
},
 +
_destroyAjaxRequest = function() {
 +
_removeAjaxCursor();
 +
if(mfp.req) {
 +
mfp.req.abort();
 +
}
 
};
 
};
  
var counter = function() {
+
$.magnificPopup.registerModule(AJAX_NS, {
$('.js-counter').countTo({
+
 
formatter: function (value, options) {
+
options: {
      return value.toFixed(options.decimals);
+
settings: null,
    },
+
cursor: 'mfp-ajax-cur',
});
+
tError: '<a href="%url%">The content</a> could not be loaded.'
 +
},
 +
 
 +
proto: {
 +
initAjax: function() {
 +
mfp.types.push(AJAX_NS);
 +
_ajaxCur = mfp.st.ajax.cursor;
 +
 
 +
_mfpOn(CLOSE_EVENT+'.'+AJAX_NS, _destroyAjaxRequest);
 +
_mfpOn('BeforeChange.' + AJAX_NS, _destroyAjaxRequest);
 +
},
 +
getAjax: function(item) {
 +
 
 +
if(_ajaxCur) {
 +
$(document.body).addClass(_ajaxCur);
 +
}
 +
 
 +
mfp.updateStatus('loading');
 +
 
 +
var opts = $.extend({
 +
url: item.src,
 +
success: function(data, textStatus, jqXHR) {
 +
var temp = {
 +
data:data,
 +
xhr:jqXHR
 +
};
 +
 
 +
_mfpTrigger('ParseAjax', temp);
 +
 
 +
mfp.appendContent( $(temp.data), AJAX_NS );
 +
 
 +
item.finished = true;
 +
 
 +
_removeAjaxCursor();
 +
 
 +
mfp._setFocus();
 +
 
 +
setTimeout(function() {
 +
mfp.wrap.addClass(READY_CLASS);
 +
}, 16);
 +
 
 +
mfp.updateStatus('ready');
 +
 
 +
_mfpTrigger('AjaxContentAdded');
 +
},
 +
error: function() {
 +
_removeAjaxCursor();
 +
item.finished = item.loadError = true;
 +
mfp.updateStatus('error', mfp.st.ajax.tError.replace('%url%', item.src));
 +
}
 +
}, mfp.st.ajax.settings);
 +
 
 +
mfp.req = $.ajax(opts);
 +
 
 +
return '';
 +
}
 +
}
 +
});
 +
 
 +
/*>>ajax*/
 +
 
 +
/*>>image*/
 +
var _imgInterval,
 +
_getTitle = function(item) {
 +
if(item.data && item.data.title !== undefined)
 +
return item.data.title;
 +
 
 +
var src = mfp.st.image.titleSrc;
 +
 
 +
if(src) {
 +
if($.isFunction(src)) {
 +
return src.call(mfp, item);
 +
} else if(item.el) {
 +
return item.el.attr(src) || '';
 +
}
 +
}
 +
return '';
 
};
 
};
  
var counterWayPoint = function() {
+
$.magnificPopup.registerModule('image', {
if ($('#gtco-counter').length > 0 ) {
+
 
$('#gtco-counter').waypoint( function( direction ) {
+
options: {
+
markup: '<div class="mfp-figure">'+
if( direction === 'down' && !$(this.element).hasClass('animated') ) {
+
'<div class="mfp-close"></div>'+
setTimeout( counter , 400);
+
'<figure>'+
$(this.element).addClass('animated');
+
'<div class="mfp-img"></div>'+
 +
'<figcaption>'+
 +
'<div class="mfp-bottom-bar">'+
 +
'<div class="mfp-title"></div>'+
 +
'<div class="mfp-counter"></div>'+
 +
'</div>'+
 +
'</figcaption>'+
 +
'</figure>'+
 +
'</div>',
 +
cursor: 'mfp-zoom-out-cur',
 +
titleSrc: 'title',
 +
verticalFit: true,
 +
tError: '<a href="%url%">The image</a> could not be loaded.'
 +
},
 +
 
 +
proto: {
 +
initImage: function() {
 +
var imgSt = mfp.st.image,
 +
ns = '.image';
 +
 
 +
mfp.types.push('image');
 +
 
 +
_mfpOn(OPEN_EVENT+ns, function() {
 +
if(mfp.currItem.type === 'image' && imgSt.cursor) {
 +
$(document.body).addClass(imgSt.cursor);
 
}
 
}
} , { offset: '90%' } );
+
});
 +
 
 +
_mfpOn(CLOSE_EVENT+ns, function() {
 +
if(imgSt.cursor) {
 +
$(document.body).removeClass(imgSt.cursor);
 +
}
 +
_window.off('resize' + EVENT_NS);
 +
});
 +
 
 +
_mfpOn('Resize'+ns, mfp.resizeImage);
 +
if(mfp.isLowIE) {
 +
_mfpOn('AfterChange', mfp.resizeImage);
 +
}
 +
},
 +
resizeImage: function() {
 +
var item = mfp.currItem;
 +
if(!item || !item.img) return;
 +
 
 +
if(mfp.st.image.verticalFit) {
 +
var decr = 0;
 +
// fix box-sizing in ie7/8
 +
if(mfp.isLowIE) {
 +
decr = parseInt(item.img.css('padding-top'), 10) + parseInt(item.img.css('padding-bottom'),10);
 +
}
 +
item.img.css('max-height', mfp.wH-decr);
 +
}
 +
},
 +
_onImageHasSize: function(item) {
 +
if(item.img) {
 +
 
 +
item.hasSize = true;
 +
 
 +
if(_imgInterval) {
 +
clearInterval(_imgInterval);
 +
}
 +
 
 +
item.isCheckingImgSize = false;
 +
 
 +
_mfpTrigger('ImageHasSize', item);
 +
 
 +
if(item.imgHidden) {
 +
if(mfp.content)
 +
mfp.content.removeClass('mfp-loading');
 +
 
 +
item.imgHidden = false;
 +
}
 +
 
 +
}
 +
},
 +
 
 +
/**
 +
* Function that loops until the image has size to display elements that rely on it asap
 +
*/
 +
findImageSize: function(item) {
 +
 
 +
var counter = 0,
 +
img = item.img[0],
 +
mfpSetInterval = function(delay) {
 +
 
 +
if(_imgInterval) {
 +
clearInterval(_imgInterval);
 +
}
 +
// decelerating interval that checks for size of an image
 +
_imgInterval = setInterval(function() {
 +
if(img.naturalWidth > 0) {
 +
mfp._onImageHasSize(item);
 +
return;
 +
}
 +
 
 +
if(counter > 200) {
 +
clearInterval(_imgInterval);
 +
}
 +
 
 +
counter++;
 +
if(counter === 3) {
 +
mfpSetInterval(10);
 +
} else if(counter === 40) {
 +
mfpSetInterval(50);
 +
} else if(counter === 100) {
 +
mfpSetInterval(500);
 +
}
 +
}, delay);
 +
};
 +
 
 +
mfpSetInterval(1);
 +
},
 +
 
 +
getImage: function(item, template) {
 +
 
 +
var guard = 0,
 +
 
 +
// image load complete handler
 +
onLoadComplete = function() {
 +
if(item) {
 +
if (item.img[0].complete) {
 +
item.img.off('.mfploader');
 +
 
 +
if(item === mfp.currItem){
 +
mfp._onImageHasSize(item);
 +
 
 +
mfp.updateStatus('ready');
 +
}
 +
 
 +
item.hasSize = true;
 +
item.loaded = true;
 +
 
 +
_mfpTrigger('ImageLoadComplete');
 +
 
 +
}
 +
else {
 +
// if image complete check fails 200 times (20 sec), we assume that there was an error.
 +
guard++;
 +
if(guard < 200) {
 +
setTimeout(onLoadComplete,100);
 +
} else {
 +
onLoadError();
 +
}
 +
}
 +
}
 +
},
 +
 
 +
// image error handler
 +
onLoadError = function() {
 +
if(item) {
 +
item.img.off('.mfploader');
 +
if(item === mfp.currItem){
 +
mfp._onImageHasSize(item);
 +
mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) );
 +
}
 +
 
 +
item.hasSize = true;
 +
item.loaded = true;
 +
item.loadError = true;
 +
}
 +
},
 +
imgSt = mfp.st.image;
 +
 
 +
 
 +
var el = template.find('.mfp-img');
 +
if(el.length) {
 +
var img = document.createElement('img');
 +
img.className = 'mfp-img';
 +
if(item.el && item.el.find('img').length) {
 +
img.alt = item.el.find('img').attr('alt');
 +
}
 +
item.img = $(img).on('load.mfploader', onLoadComplete).on('error.mfploader', onLoadError);
 +
img.src = item.src;
 +
 
 +
// without clone() "error" event is not firing when IMG is replaced by new IMG
 +
// TODO: find a way to avoid such cloning
 +
if(el.is('img')) {
 +
item.img = item.img.clone();
 +
}
 +
 
 +
img = item.img[0];
 +
if(img.naturalWidth > 0) {
 +
item.hasSize = true;
 +
} else if(!img.width) {
 +
item.hasSize = false;
 +
}
 +
}
 +
 
 +
mfp._parseMarkup(template, {
 +
title: _getTitle(item),
 +
img_replaceWith: item.img
 +
}, item);
 +
 
 +
mfp.resizeImage();
 +
 
 +
if(item.hasSize) {
 +
if(_imgInterval) clearInterval(_imgInterval);
 +
 
 +
if(item.loadError) {
 +
template.addClass('mfp-loading');
 +
mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) );
 +
} else {
 +
template.removeClass('mfp-loading');
 +
mfp.updateStatus('ready');
 +
}
 +
return template;
 +
}
 +
 
 +
mfp.updateStatus('loading');
 +
item.loading = true;
 +
 
 +
if(!item.hasSize) {
 +
item.imgHidden = true;
 +
template.addClass('mfp-loading');
 +
mfp.findImageSize(item);
 +
}
 +
 
 +
return template;
 +
}
 +
}
 +
});
 +
 
 +
/*>>image*/
 +
 
 +
/*>>zoom*/
 +
var hasMozTransform,
 +
getHasMozTransform = function() {
 +
if(hasMozTransform === undefined) {
 +
hasMozTransform = document.createElement('p').style.MozTransform !== undefined;
 
}
 
}
 +
return hasMozTransform;
 
};
 
};
  
+
$.magnificPopup.registerModule('zoom', {
$(function(){
+
mobileMenuOutsideClick();
+
offcanvasMenu();
+
burgerMenu();
+
contentWayPoint();
+
dropdown();
+
owlCarousel();
+
tabs();
+
goToTop();
+
loaderPage();
+
counterWayPoint();
+
});
+
  
 +
options: {
 +
enabled: false,
 +
easing: 'ease-in-out',
 +
duration: 300,
 +
opener: function(element) {
 +
return element.is('img') ? element : element.find('img');
 +
}
 +
},
  
}());
+
proto: {
  
!function(a,b,c,d){function e(b,c){this.settings=null,this.options=a.extend({},e.Defaults,c),this.$element=a(b),this.drag=a.extend({},m),this.state=a.extend({},n),this.e=a.extend({},o),this._plugins={},this._supress={},this._current=null,this._speed=null,this._coordinates=[],this._breakpoint=null,this._width=null,this._items=[],this._clones=[],this._mergers=[],this._invalidated={},this._pipe=[],a.each(e.Plugins,a.proxy(function(a,b){this._plugins[a[0].toLowerCase()+a.slice(1)]=new b(this)},this)),a.each(e.Pipe,a.proxy(function(b,c){this._pipe.push({filter:c.filter,run:a.proxy(c.run,this)})},this)),this.setup(),this.initialize()}function f(a){if(a.touches!==d)return{x:a.touches[0].pageX,y:a.touches[0].pageY};if(a.touches===d){if(a.pageX!==d)return{x:a.pageX,y:a.pageY};if(a.pageX===d)return{x:a.clientX,y:a.clientY}}}function g(a){var b,d,e=c.createElement("div"),f=a;for(b in f)if(d=f[b],"undefined"!=typeof e.style[d])return e=null,[d,b];return[!1]}function h(){return g(["transition","WebkitTransition","MozTransition","OTransition"])[1]}function i(){return g(["transform","WebkitTransform","MozTransform","OTransform","msTransform"])[0]}function j(){return g(["perspective","webkitPerspective","MozPerspective","OPerspective","MsPerspective"])[0]}function k(){return"ontouchstart"in b||!!navigator.msMaxTouchPoints}function l(){return b.navigator.msPointerEnabled}var m,n,o;m={start:0,startX:0,startY:0,current:0,currentX:0,currentY:0,offsetX:0,offsetY:0,distance:null,startTime:0,endTime:0,updatedX:0,targetEl:null},n={isTouch:!1,isScrolling:!1,isSwiping:!1,direction:!1,inMotion:!1},o={_onDragStart:null,_onDragMove:null,_onDragEnd:null,_transitionEnd:null,_resizer:null,_responsiveCall:null,_goToLoop:null,_checkVisibile:null},e.Defaults={items:3,loop:!1,center:!1,mouseDrag:!0,touchDrag:!0,pullDrag:!0,freeDrag:!1,margin:0,stagePadding:0,merge:!1,mergeFit:!0,autoWidth:!1,startPosition:0,rtl:!1,smartSpeed:250,fluidSpeed:!1,dragEndSpeed:!1,responsive:{},responsiveRefreshRate:200,responsiveBaseElement:b,responsiveClass:!1,fallbackEasing:"swing",info:!1,nestedItemSelector:!1,itemElement:"div",stageElement:"div",themeClass:"owl-theme",baseClass:"owl-carousel",itemClass:"owl-item",centerClass:"center",activeClass:"active"},e.Width={Default:"default",Inner:"inner",Outer:"outer"},e.Plugins={},e.Pipe=[{filter:["width","items","settings"],run:function(a){a.current=this._items&&this._items[this.relative(this._current)]}},{filter:["items","settings"],run:function(){var a=this._clones,b=this.$stage.children(".cloned");(b.length!==a.length||!this.settings.loop&&a.length>0)&&(this.$stage.children(".cloned").remove(),this._clones=[])}},{filter:["items","settings"],run:function(){var a,b,c=this._clones,d=this._items,e=this.settings.loop?c.length-Math.max(2*this.settings.items,4):0;for(a=0,b=Math.abs(e/2);b>a;a++)e>0?(this.$stage.children().eq(d.length+c.length-1).remove(),c.pop(),this.$stage.children().eq(0).remove(),c.pop()):(c.push(c.length/2),this.$stage.append(d[c[c.length-1]].clone().addClass("cloned")),c.push(d.length-1-(c.length-1)/2),this.$stage.prepend(d[c[c.length-1]].clone().addClass("cloned")))}},{filter:["width","items","settings"],run:function(){var a,b,c,d=this.settings.rtl?1:-1,e=(this.width()/this.settings.items).toFixed(3),f=0;for(this._coordinates=[],b=0,c=this._clones.length+this._items.length;c>b;b++)a=this._mergers[this.relative(b)],a=this.settings.mergeFit&&Math.min(a,this.settings.items)||a,f+=(this.settings.autoWidth?this._items[this.relative(b)].width()+this.settings.margin:e*a)*d,this._coordinates.push(f)}},{filter:["width","items","settings"],run:function(){var b,c,d=(this.width()/this.settings.items).toFixed(3),e={width:Math.abs(this._coordinates[this._coordinates.length-1])+2*this.settings.stagePadding,"padding-left":this.settings.stagePadding||"","padding-right":this.settings.stagePadding||""};if(this.$stage.css(e),e={width:this.settings.autoWidth?"auto":d-this.settings.margin},e[this.settings.rtl?"margin-left":"margin-right"]=this.settings.margin,!this.settings.autoWidth&&a.grep(this._mergers,function(a){return a>1}).length>0)for(b=0,c=this._coordinates.length;c>b;b++)e.width=Math.abs(this._coordinates[b])-Math.abs(this._coordinates[b-1]||0)-this.settings.margin,this.$stage.children().eq(b).css(e);else this.$stage.children().css(e)}},{filter:["width","items","settings"],run:function(a){a.current&&this.reset(this.$stage.children().index(a.current))}},{filter:["position"],run:function(){this.animate(this.coordinates(this._current))}},{filter:["width","position","items","settings"],run:function(){var a,b,c,d,e=this.settings.rtl?1:-1,f=2*this.settings.stagePadding,g=this.coordinates(this.current())+f,h=g+this.width()*e,i=[];for(c=0,d=this._coordinates.length;d>c;c++)a=this._coordinates[c-1]||0,b=Math.abs(this._coordinates[c])+f*e,(this.op(a,"<=",g)&&this.op(a,">",h)||this.op(b,"<",g)&&this.op(b,">",h))&&i.push(c);this.$stage.children("."+this.settings.activeClass).removeClass(this.settings.activeClass),this.$stage.children(":eq("+i.join("), :eq(")+")").addClass(this.settings.activeClass),this.settings.center&&(this.$stage.children("."+this.settings.centerClass).removeClass(this.settings.centerClass),this.$stage.children().eq(this.current()).addClass(this.settings.centerClass))}}],e.prototype.initialize=function(){if(this.trigger("initialize"),this.$element.addClass(this.settings.baseClass).addClass(this.settings.themeClass).toggleClass("owl-rtl",this.settings.rtl),this.browserSupport(),this.settings.autoWidth&&this.state.imagesLoaded!==!0){var b,c,e;if(b=this.$element.find("img"),c=this.settings.nestedItemSelector?"."+this.settings.nestedItemSelector:d,e=this.$element.children(c).width(),b.length&&0>=e)return this.preloadAutoWidthImages(b),!1}this.$element.addClass("owl-loading"),this.$stage=a("<"+this.settings.stageElement+' class="owl-stage"/>').wrap('<div class="owl-stage-outer">'),this.$element.append(this.$stage.parent()),this.replace(this.$element.children().not(this.$stage.parent())),this._width=this.$element.width(),this.refresh(),this.$element.removeClass("owl-loading").addClass("owl-loaded"),this.eventsCall(),this.internalEvents(),this.addTriggerableEvents(),this.trigger("initialized")},e.prototype.setup=function(){var b=this.viewport(),c=this.options.responsive,d=-1,e=null;c?(a.each(c,function(a){b>=a&&a>d&&(d=Number(a))}),e=a.extend({},this.options,c[d]),delete e.responsive,e.responsiveClass&&this.$element.attr("class",function(a,b){return b.replace(/\b owl-responsive-\S+/g,"")}).addClass("owl-responsive-"+d)):e=a.extend({},this.options),(null===this.settings||this._breakpoint!==d)&&(this.trigger("change",{property:{name:"settings",value:e}}),this._breakpoint=d,this.settings=e,this.invalidate("settings"),this.trigger("changed",{property:{name:"settings",value:this.settings}}))},e.prototype.optionsLogic=function(){this.$element.toggleClass("owl-center",this.settings.center),this.settings.loop&&this._items.length<this.settings.items&&(this.settings.loop=!1),this.settings.autoWidth&&(this.settings.stagePadding=!1,this.settings.merge=!1)},e.prototype.prepare=function(b){var c=this.trigger("prepare",{content:b});return c.data||(c.data=a("<"+this.settings.itemElement+"/>").addClass(this.settings.itemClass).append(b)),this.trigger("prepared",{content:c.data}),c.data},e.prototype.update=function(){for(var b=0,c=this._pipe.length,d=a.proxy(function(a){return this[a]},this._invalidated),e={};c>b;)(this._invalidated.all||a.grep(this._pipe[b].filter,d).length>0)&&this._pipe[b].run(e),b++;this._invalidated={}},e.prototype.width=function(a){switch(a=a||e.Width.Default){case e.Width.Inner:case e.Width.Outer:return this._width;default:return this._width-2*this.settings.stagePadding+this.settings.margin}},e.prototype.refresh=function(){if(0===this._items.length)return!1;(new Date).getTime();this.trigger("refresh"),this.setup(),this.optionsLogic(),this.$stage.addClass("owl-refresh"),this.update(),this.$stage.removeClass("owl-refresh"),this.state.orientation=b.orientation,this.watchVisibility(),this.trigger("refreshed")},e.prototype.eventsCall=function(){this.e._onDragStart=a.proxy(function(a){this.onDragStart(a)},this),this.e._onDragMove=a.proxy(function(a){this.onDragMove(a)},this),this.e._onDragEnd=a.proxy(function(a){this.onDragEnd(a)},this),this.e._onResize=a.proxy(function(a){this.onResize(a)},this),this.e._transitionEnd=a.proxy(function(a){this.transitionEnd(a)},this),this.e._preventClick=a.proxy(function(a){this.preventClick(a)},this)},e.prototype.onThrottledResize=function(){b.clearTimeout(this.resizeTimer),this.resizeTimer=b.setTimeout(this.e._onResize,this.settings.responsiveRefreshRate)},e.prototype.onResize=function(){return this._items.length?this._width===this.$element.width()?!1:this.trigger("resize").isDefaultPrevented()?!1:(this._width=this.$element.width(),this.invalidate("width"),this.refresh(),void this.trigger("resized")):!1},e.prototype.eventsRouter=function(a){var b=a.type;"mousedown"===b||"touchstart"===b?this.onDragStart(a):"mousemove"===b||"touchmove"===b?this.onDragMove(a):"mouseup"===b||"touchend"===b?this.onDragEnd(a):"touchcancel"===b&&this.onDragEnd(a)},e.prototype.internalEvents=function(){var c=(k(),l());this.settings.mouseDrag?(this.$stage.on("mousedown",a.proxy(function(a){this.eventsRouter(a)},this)),this.$stage.on("dragstart",function(){return!1}),this.$stage.get(0).onselectstart=function(){return!1}):this.$element.addClass("owl-text-select-on"),this.settings.touchDrag&&!c&&this.$stage.on("touchstart touchcancel",a.proxy(function(a){this.eventsRouter(a)},this)),this.transitionEndVendor&&this.on(this.$stage.get(0),this.transitionEndVendor,this.e._transitionEnd,!1),this.settings.responsive!==!1&&this.on(b,"resize",a.proxy(this.onThrottledResize,this))},e.prototype.onDragStart=function(d){var e,g,h,i;if(e=d.originalEvent||d||b.event,3===e.which||this.state.isTouch)return!1;if("mousedown"===e.type&&this.$stage.addClass("owl-grab"),this.trigger("drag"),this.drag.startTime=(new Date).getTime(),this.speed(0),this.state.isTouch=!0,this.state.isScrolling=!1,this.state.isSwiping=!1,this.drag.distance=0,g=f(e).x,h=f(e).y,this.drag.offsetX=this.$stage.position().left,this.drag.offsetY=this.$stage.position().top,this.settings.rtl&&(this.drag.offsetX=this.$stage.position().left+this.$stage.width()-this.width()+this.settings.margin),this.state.inMotion&&this.support3d)i=this.getTransformProperty(),this.drag.offsetX=i,this.animate(i),this.state.inMotion=!0;else if(this.state.inMotion&&!this.support3d)return this.state.inMotion=!1,!1;this.drag.startX=g-this.drag.offsetX,this.drag.startY=h-this.drag.offsetY,this.drag.start=g-this.drag.startX,this.drag.targetEl=e.target||e.srcElement,this.drag.updatedX=this.drag.start,("IMG"===this.drag.targetEl.tagName||"A"===this.drag.targetEl.tagName)&&(this.drag.targetEl.draggable=!1),a(c).on("mousemove.owl.dragEvents mouseup.owl.dragEvents touchmove.owl.dragEvents touchend.owl.dragEvents",a.proxy(function(a){this.eventsRouter(a)},this))},e.prototype.onDragMove=function(a){var c,e,g,h,i,j;this.state.isTouch&&(this.state.isScrolling||(c=a.originalEvent||a||b.event,e=f(c).x,g=f(c).y,this.drag.currentX=e-this.drag.startX,this.drag.currentY=g-this.drag.startY,this.drag.distance=this.drag.currentX-this.drag.offsetX,this.drag.distance<0?this.state.direction=this.settings.rtl?"right":"left":this.drag.distance>0&&(this.state.direction=this.settings.rtl?"left":"right"),this.settings.loop?this.op(this.drag.currentX,">",this.coordinates(this.minimum()))&&"right"===this.state.direction?this.drag.currentX-=(this.settings.center&&this.coordinates(0))-this.coordinates(this._items.length):this.op(this.drag.currentX,"<",this.coordinates(this.maximum()))&&"left"===this.state.direction&&(this.drag.currentX+=(this.settings.center&&this.coordinates(0))-this.coordinates(this._items.length)):(h=this.coordinates(this.settings.rtl?this.maximum():this.minimum()),i=this.coordinates(this.settings.rtl?this.minimum():this.maximum()),j=this.settings.pullDrag?this.drag.distance/5:0,this.drag.currentX=Math.max(Math.min(this.drag.currentX,h+j),i+j)),(this.drag.distance>8||this.drag.distance<-8)&&(c.preventDefault!==d?c.preventDefault():c.returnValue=!1,this.state.isSwiping=!0),this.drag.updatedX=this.drag.currentX,(this.drag.currentY>16||this.drag.currentY<-16)&&this.state.isSwiping===!1&&(this.state.isScrolling=!0,this.drag.updatedX=this.drag.start),this.animate(this.drag.updatedX)))},e.prototype.onDragEnd=function(b){var d,e,f;if(this.state.isTouch){if("mouseup"===b.type&&this.$stage.removeClass("owl-grab"),this.trigger("dragged"),this.drag.targetEl.removeAttribute("draggable"),this.state.isTouch=!1,this.state.isScrolling=!1,this.state.isSwiping=!1,0===this.drag.distance&&this.state.inMotion!==!0)return this.state.inMotion=!1,!1;this.drag.endTime=(new Date).getTime(),d=this.drag.endTime-this.drag.startTime,e=Math.abs(this.drag.distance),(e>3||d>300)&&this.removeClick(this.drag.targetEl),f=this.closest(this.drag.updatedX),this.speed(this.settings.dragEndSpeed||this.settings.smartSpeed),this.current(f),this.invalidate("position"),this.update(),this.settings.pullDrag||this.drag.updatedX!==this.coordinates(f)||this.transitionEnd(),this.drag.distance=0,a(c).off(".owl.dragEvents")}},e.prototype.removeClick=function(c){this.drag.targetEl=c,a(c).on("click.preventClick",this.e._preventClick),b.setTimeout(function(){a(c).off("click.preventClick")},300)},e.prototype.preventClick=function(b){b.preventDefault?b.preventDefault():b.returnValue=!1,b.stopPropagation&&b.stopPropagation(),a(b.target).off("click.preventClick")},e.prototype.getTransformProperty=function(){var a,c;return a=b.getComputedStyle(this.$stage.get(0),null).getPropertyValue(this.vendorName+"transform"),a=a.replace(/matrix(3d)?\(|\)/g,"").split(","),c=16===a.length,c!==!0?a[4]:a[12]},e.prototype.closest=function(b){var c=-1,d=30,e=this.width(),f=this.coordinates();return this.settings.freeDrag||a.each(f,a.proxy(function(a,g){return b>g-d&&g+d>b?c=a:this.op(b,"<",g)&&this.op(b,">",f[a+1]||g-e)&&(c="left"===this.state.direction?a+1:a),-1===c},this)),this.settings.loop||(this.op(b,">",f[this.minimum()])?c=b=this.minimum():this.op(b,"<",f[this.maximum()])&&(c=b=this.maximum())),c},e.prototype.animate=function(b){this.trigger("translate"),this.state.inMotion=this.speed()>0,this.support3d?this.$stage.css({transform:"translate3d("+b+"px,0px, 0px)",transition:this.speed()/1e3+"s"}):this.state.isTouch?this.$stage.css({left:b+"px"}):this.$stage.animate({left:b},this.speed()/1e3,this.settings.fallbackEasing,a.proxy(function(){this.state.inMotion&&this.transitionEnd()},this))},e.prototype.current=function(a){if(a===d)return this._current;if(0===this._items.length)return d;if(a=this.normalize(a),this._current!==a){var b=this.trigger("change",{property:{name:"position",value:a}});b.data!==d&&(a=this.normalize(b.data)),this._current=a,this.invalidate("position"),this.trigger("changed",{property:{name:"position",value:this._current}})}return this._current},e.prototype.invalidate=function(a){this._invalidated[a]=!0},e.prototype.reset=function(a){a=this.normalize(a),a!==d&&(this._speed=0,this._current=a,this.suppress(["translate","translated"]),this.animate(this.coordinates(a)),this.release(["translate","translated"]))},e.prototype.normalize=function(b,c){var e=c?this._items.length:this._items.length+this._clones.length;return!a.isNumeric(b)||1>e?d:b=this._clones.length?(b%e+e)%e:Math.max(this.minimum(c),Math.min(this.maximum(c),b))},e.prototype.relative=function(a){return a=this.normalize(a),a-=this._clones.length/2,this.normalize(a,!0)},e.prototype.maximum=function(a){var b,c,d,e=0,f=this.settings;if(a)return this._items.length-1;if(!f.loop&&f.center)b=this._items.length-1;else if(f.loop||f.center)if(f.loop||f.center)b=this._items.length+f.items;else{if(!f.autoWidth&&!f.merge)throw"Can not detect maximum absolute position.";for(revert=f.rtl?1:-1,c=this.$stage.width()-this.$element.width();(d=this.coordinates(e))&&!(d*revert>=c);)b=++e}else b=this._items.length-f.items;return b},e.prototype.minimum=function(a){return a?0:this._clones.length/2},e.prototype.items=function(a){return a===d?this._items.slice():(a=this.normalize(a,!0),this._items[a])},e.prototype.mergers=function(a){return a===d?this._mergers.slice():(a=this.normalize(a,!0),this._mergers[a])},e.prototype.clones=function(b){var c=this._clones.length/2,e=c+this._items.length,f=function(a){return a%2===0?e+a/2:c-(a+1)/2};return b===d?a.map(this._clones,function(a,b){return f(b)}):a.map(this._clones,function(a,c){return a===b?f(c):null})},e.prototype.speed=function(a){return a!==d&&(this._speed=a),this._speed},e.prototype.coordinates=function(b){var c=null;return b===d?a.map(this._coordinates,a.proxy(function(a,b){return this.coordinates(b)},this)):(this.settings.center?(c=this._coordinates[b],c+=(this.width()-c+(this._coordinates[b-1]||0))/2*(this.settings.rtl?-1:1)):c=this._coordinates[b-1]||0,c)},e.prototype.duration=function(a,b,c){return Math.min(Math.max(Math.abs(b-a),1),6)*Math.abs(c||this.settings.smartSpeed)},e.prototype.to=function(c,d){if(this.settings.loop){var e=c-this.relative(this.current()),f=this.current(),g=this.current(),h=this.current()+e,i=0>g-h?!0:!1,j=this._clones.length+this._items.length;h<this.settings.items&&i===!1?(f=g+this._items.length,this.reset(f)):h>=j-this.settings.items&&i===!0&&(f=g-this._items.length,this.reset(f)),b.clearTimeout(this.e._goToLoop),this.e._goToLoop=b.setTimeout(a.proxy(function(){this.speed(this.duration(this.current(),f+e,d)),this.current(f+e),this.update()},this),30)}else this.speed(this.duration(this.current(),c,d)),this.current(c),this.update()},e.prototype.next=function(a){a=a||!1,this.to(this.relative(this.current())+1,a)},e.prototype.prev=function(a){a=a||!1,this.to(this.relative(this.current())-1,a)},e.prototype.transitionEnd=function(a){return a!==d&&(a.stopPropagation(),(a.target||a.srcElement||a.originalTarget)!==this.$stage.get(0))?!1:(this.state.inMotion=!1,void this.trigger("translated"))},e.prototype.viewport=function(){var d;if(this.options.responsiveBaseElement!==b)d=a(this.options.responsiveBaseElement).width();else if(b.innerWidth)d=b.innerWidth;else{if(!c.documentElement||!c.documentElement.clientWidth)throw"Can not detect viewport width.";d=c.documentElement.clientWidth}return d},e.prototype.replace=function(b){this.$stage.empty(),this._items=[],b&&(b=b instanceof jQuery?b:a(b)),this.settings.nestedItemSelector&&(b=b.find("."+this.settings.nestedItemSelector)),b.filter(function(){return 1===this.nodeType}).each(a.proxy(function(a,b){b=this.prepare(b),this.$stage.append(b),this._items.push(b),this._mergers.push(1*b.find("[data-merge]").andSelf("[data-merge]").attr("data-merge")||1)},this)),this.reset(a.isNumeric(this.settings.startPosition)?this.settings.startPosition:0),this.invalidate("items")},e.prototype.add=function(a,b){b=b===d?this._items.length:this.normalize(b,!0),this.trigger("add",{content:a,position:b}),0===this._items.length||b===this._items.length?(this.$stage.append(a),this._items.push(a),this._mergers.push(1*a.find("[data-merge]").andSelf("[data-merge]").attr("data-merge")||1)):(this._items[b].before(a),this._items.splice(b,0,a),this._mergers.splice(b,0,1*a.find("[data-merge]").andSelf("[data-merge]").attr("data-merge")||1)),this.invalidate("items"),this.trigger("added",{content:a,position:b})},e.prototype.remove=function(a){a=this.normalize(a,!0),a!==d&&(this.trigger("remove",{content:this._items[a],position:a}),this._items[a].remove(),this._items.splice(a,1),this._mergers.splice(a,1),this.invalidate("items"),this.trigger("removed",{content:null,position:a}))},e.prototype.addTriggerableEvents=function(){var b=a.proxy(function(b,c){return a.proxy(function(a){a.relatedTarget!==this&&(this.suppress([c]),b.apply(this,[].slice.call(arguments,1)),this.release([c]))},this)},this);a.each({next:this.next,prev:this.prev,to:this.to,destroy:this.destroy,refresh:this.refresh,replace:this.replace,add:this.add,remove:this.remove},a.proxy(function(a,c){this.$element.on(a+".owl.carousel",b(c,a+".owl.carousel"))},this))},e.prototype.watchVisibility=function(){function c(a){return a.offsetWidth>0&&a.offsetHeight>0}function d(){c(this.$element.get(0))&&(this.$element.removeClass("owl-hidden"),this.refresh(),b.clearInterval(this.e._checkVisibile))}c(this.$element.get(0))||(this.$element.addClass("owl-hidden"),b.clearInterval(this.e._checkVisibile),this.e._checkVisibile=b.setInterval(a.proxy(d,this),500))},e.prototype.preloadAutoWidthImages=function(b){var c,d,e,f;c=0,d=this,b.each(function(g,h){e=a(h),f=new Image,f.onload=function(){c++,e.attr("src",f.src),e.css("opacity",1),c>=b.length&&(d.state.imagesLoaded=!0,d.initialize())},f.src=e.attr("src")||e.attr("data-src")||e.attr("data-src-retina")})},e.prototype.destroy=function(){this.$element.hasClass(this.settings.themeClass)&&this.$element.removeClass(this.settings.themeClass),this.settings.responsive!==!1&&a(b).off("resize.owl.carousel"),this.transitionEndVendor&&this.off(this.$stage.get(0),this.transitionEndVendor,this.e._transitionEnd);for(var d in this._plugins)this._plugins[d].destroy();(this.settings.mouseDrag||this.settings.touchDrag)&&(this.$stage.off("mousedown touchstart touchcancel"),a(c).off(".owl.dragEvents"),this.$stage.get(0).onselectstart=function(){},this.$stage.off("dragstart",function(){return!1})),this.$element.off(".owl"),this.$stage.children(".cloned").remove(),this.e=null,this.$element.removeData("owlCarousel"),this.$stage.children().contents().unwrap(),this.$stage.children().unwrap(),this.$stage.unwrap()},e.prototype.op=function(a,b,c){var d=this.settings.rtl;switch(b){case"<":return d?a>c:c>a;case">":return d?c>a:a>c;case">=":return d?c>=a:a>=c;case"<=":return d?a>=c:c>=a}},e.prototype.on=function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,d):a.attachEvent&&a.attachEvent("on"+b,c)},e.prototype.off=function(a,b,c,d){a.removeEventListener?a.removeEventListener(b,c,d):a.detachEvent&&a.detachEvent("on"+b,c)},e.prototype.trigger=function(b,c,d){var e={item:{count:this._items.length,index:this.current()}},f=a.camelCase(a.grep(["on",b,d],function(a){return a}).join("-").toLowerCase()),g=a.Event([b,"owl",d||"carousel"].join(".").toLowerCase(),a.extend({relatedTarget:this},e,c));return this._supress[b]||(a.each(this._plugins,function(a,b){b.onTrigger&&b.onTrigger(g)}),this.$element.trigger(g),this.settings&&"function"==typeof this.settings[f]&&this.settings[f].apply(this,g)),g},e.prototype.suppress=function(b){a.each(b,a.proxy(function(a,b){this._supress[b]=!0},this))},e.prototype.release=function(b){a.each(b,a.proxy(function(a,b){delete this._supress[b]},this))},e.prototype.browserSupport=function(){if(this.support3d=j(),this.support3d){this.transformVendor=i();var a=["transitionend","webkitTransitionEnd","transitionend","oTransitionEnd"];this.transitionEndVendor=a[h()],this.vendorName=this.transformVendor.replace(/Transform/i,""),this.vendorName=""!==this.vendorName?"-"+this.vendorName.toLowerCase()+"-":""}this.state.orientation=b.orientation},a.fn.owlCarousel=function(b){return this.each(function(){a(this).data("owlCarousel")||a(this).data("owlCarousel",new e(this,b))})},a.fn.owlCarousel.Constructor=e}(window.Zepto||window.jQuery,window,document),function(a,b){var c=function(b){this._core=b,this._loaded=[],this._handlers={"initialized.owl.carousel change.owl.carousel":a.proxy(function(b){if(b.namespace&&this._core.settings&&this._core.settings.lazyLoad&&(b.property&&"position"==b.property.name||"initialized"==b.type))for(var c=this._core.settings,d=c.center&&Math.ceil(c.items/2)||c.items,e=c.center&&-1*d||0,f=(b.property&&b.property.value||this._core.current())+e,g=this._core.clones().length,h=a.proxy(function(a,b){this.load(b)},this);e++<d;)this.load(g/2+this._core.relative(f)),g&&a.each(this._core.clones(this._core.relative(f++)),h)},this)},this._core.options=a.extend({},c.Defaults,this._core.options),this._core.$element.on(this._handlers)};c.Defaults={lazyLoad:!1},c.prototype.load=function(c){var d=this._core.$stage.children().eq(c),e=d&&d.find(".owl-lazy");!e||a.inArray(d.get(0),this._loaded)>-1||(e.each(a.proxy(function(c,d){var e,f=a(d),g=b.devicePixelRatio>1&&f.attr("data-src-retina")||f.attr("data-src");this._core.trigger("load",{element:f,url:g},"lazy"),f.is("img")?f.one("load.owl.lazy",a.proxy(function(){f.css("opacity",1),this._core.trigger("loaded",{element:f,url:g},"lazy")},this)).attr("src",g):(e=new Image,e.onload=a.proxy(function(){f.css({"background-image":"url("+g+")",opacity:"1"}),this._core.trigger("loaded",{element:f,url:g},"lazy")},this),e.src=g)},this)),this._loaded.push(d.get(0)))},c.prototype.destroy=function(){var a,b;for(a in this.handlers)this._core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Lazy=c}(window.Zepto||window.jQuery,window,document),function(a){var b=function(c){this._core=c,this._handlers={"initialized.owl.carousel":a.proxy(function(){this._core.settings.autoHeight&&this.update()},this),"changed.owl.carousel":a.proxy(function(a){this._core.settings.autoHeight&&"position"==a.property.name&&this.update()},this),"loaded.owl.lazy":a.proxy(function(a){this._core.settings.autoHeight&&a.element.closest("."+this._core.settings.itemClass)===this._core.$stage.children().eq(this._core.current())&&this.update()},this)},this._core.options=a.extend({},b.Defaults,this._core.options),this._core.$element.on(this._handlers)};b.Defaults={autoHeight:!1,autoHeightClass:"owl-height"},b.prototype.update=function(){this._core.$stage.parent().height(this._core.$stage.children().eq(this._core.current()).height()).addClass(this._core.settings.autoHeightClass)},b.prototype.destroy=function(){var a,b;for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.AutoHeight=b}(window.Zepto||window.jQuery,window,document),function(a,b,c){var d=function(b){this._core=b,this._videos={},this._playing=null,this._fullscreen=!1,this._handlers={"resize.owl.carousel":a.proxy(function(a){this._core.settings.video&&!this.isInFullScreen()&&a.preventDefault()},this),"refresh.owl.carousel changed.owl.carousel":a.proxy(function(){this._playing&&this.stop()},this),"prepared.owl.carousel":a.proxy(function(b){var c=a(b.content).find(".owl-video");c.length&&(c.css("display","none"),this.fetch(c,a(b.content)))},this)},this._core.options=a.extend({},d.Defaults,this._core.options),this._core.$element.on(this._handlers),this._core.$element.on("click.owl.video",".owl-video-play-icon",a.proxy(function(a){this.play(a)},this))};d.Defaults={video:!1,videoHeight:!1,videoWidth:!1},d.prototype.fetch=function(a,b){var c=a.attr("data-vimeo-id")?"vimeo":"youtube",d=a.attr("data-vimeo-id")||a.attr("data-youtube-id"),e=a.attr("data-width")||this._core.settings.videoWidth,f=a.attr("data-height")||this._core.settings.videoHeight,g=a.attr("href");if(!g)throw new Error("Missing video URL.");if(d=g.match(/(http:|https:|)\/\/(player.|www.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com))\/(video\/|embed\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/),d[3].indexOf("youtu")>-1)c="youtube";else{if(!(d[3].indexOf("vimeo")>-1))throw new Error("Video URL not supported.");c="vimeo"}d=d[6],this._videos[g]={type:c,id:d,width:e,height:f},b.attr("data-video",g),this.thumbnail(a,this._videos[g])},d.prototype.thumbnail=function(b,c){var d,e,f,g=c.width&&c.height?'style="width:'+c.width+"px;height:"+c.height+'px;"':"",h=b.find("img"),i="src",j="",k=this._core.settings,l=function(a){e='<div class="owl-video-play-icon"></div>',d=k.lazyLoad?'<div class="owl-video-tn '+j+'" '+i+'="'+a+'"></div>':'<div class="owl-video-tn" style="opacity:1;background-image:url('+a+')"></div>',b.after(d),b.after(e)};return b.wrap('<div class="owl-video-wrapper"'+g+"></div>"),this._core.settings.lazyLoad&&(i="data-src",j="owl-lazy"),h.length?(l(h.attr(i)),h.remove(),!1):void("youtube"===c.type?(f="http://img.youtube.com/vi/"+c.id+"/hqdefault.jpg",l(f)):"vimeo"===c.type&&a.ajax({type:"GET",url:"http://vimeo.com/api/v2/video/"+c.id+".json",jsonp:"callback",dataType:"jsonp",success:function(a){f=a[0].thumbnail_large,l(f)}}))},d.prototype.stop=function(){this._core.trigger("stop",null,"video"),this._playing.find(".owl-video-frame").remove(),this._playing.removeClass("owl-video-playing"),this._playing=null},d.prototype.play=function(b){this._core.trigger("play",null,"video"),this._playing&&this.stop();var c,d,e=a(b.target||b.srcElement),f=e.closest("."+this._core.settings.itemClass),g=this._videos[f.attr("data-video")],h=g.width||"100%",i=g.height||this._core.$stage.height();"youtube"===g.type?c='<iframe width="'+h+'" height="'+i+'" src="http://www.youtube.com/embed/'+g.id+"?autoplay=1&v="+g.id+'" frameborder="0" allowfullscreen></iframe>':"vimeo"===g.type&&(c='<iframe src="http://player.vimeo.com/video/'+g.id+'?autoplay=1" width="'+h+'" height="'+i+'" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>'),f.addClass("owl-video-playing"),this._playing=f,d=a('<div style="height:'+i+"px; width:"+h+'px" class="owl-video-frame">'+c+"</div>"),e.after(d)},d.prototype.isInFullScreen=function(){var d=c.fullscreenElement||c.mozFullScreenElement||c.webkitFullscreenElement;return d&&a(d).parent().hasClass("owl-video-frame")&&(this._core.speed(0),this._fullscreen=!0),d&&this._fullscreen&&this._playing?!1:this._fullscreen?(this._fullscreen=!1,!1):this._playing&&this._core.state.orientation!==b.orientation?(this._core.state.orientation=b.orientation,!1):!0},d.prototype.destroy=function(){var a,b;this._core.$element.off("click.owl.video");for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Video=d}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this.core=b,this.core.options=a.extend({},e.Defaults,this.core.options),this.swapping=!0,this.previous=d,this.next=d,this.handlers={"change.owl.carousel":a.proxy(function(a){"position"==a.property.name&&(this.previous=this.core.current(),this.next=a.property.value)},this),"drag.owl.carousel dragged.owl.carousel translated.owl.carousel":a.proxy(function(a){this.swapping="translated"==a.type},this),"translate.owl.carousel":a.proxy(function(){this.swapping&&(this.core.options.animateOut||this.core.options.animateIn)&&this.swap()},this)},this.core.$element.on(this.handlers)};e.Defaults={animateOut:!1,animateIn:!1},e.prototype.swap=function(){if(1===this.core.settings.items&&this.core.support3d){this.core.speed(0);var b,c=a.proxy(this.clear,this),d=this.core.$stage.children().eq(this.previous),e=this.core.$stage.children().eq(this.next),f=this.core.settings.animateIn,g=this.core.settings.animateOut;this.core.current()!==this.previous&&(g&&(b=this.core.coordinates(this.previous)-this.core.coordinates(this.next),d.css({left:b+"px"}).addClass("animated owl-animated-out").addClass(g).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",c)),f&&e.addClass("animated owl-animated-in").addClass(f).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",c))}},e.prototype.clear=function(b){a(b.target).css({left:""}).removeClass("animated owl-animated-out owl-animated-in").removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut),this.core.transitionEnd()},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this.core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Animate=e}(window.Zepto||window.jQuery,window,document),function(a,b,c){var d=function(b){this.core=b,this.core.options=a.extend({},d.Defaults,this.core.options),this.handlers={"translated.owl.carousel refreshed.owl.carousel":a.proxy(function(){this.autoplay()
+
initZoom: function() {
},this),"play.owl.autoplay":a.proxy(function(a,b,c){this.play(b,c)},this),"stop.owl.autoplay":a.proxy(function(){this.stop()},this),"mouseover.owl.autoplay":a.proxy(function(){this.core.settings.autoplayHoverPause&&this.pause()},this),"mouseleave.owl.autoplay":a.proxy(function(){this.core.settings.autoplayHoverPause&&this.autoplay()},this)},this.core.$element.on(this.handlers)};d.Defaults={autoplay:!1,autoplayTimeout:5e3,autoplayHoverPause:!1,autoplaySpeed:!1},d.prototype.autoplay=function(){this.core.settings.autoplay&&!this.core.state.videoPlay?(b.clearInterval(this.interval),this.interval=b.setInterval(a.proxy(function(){this.play()},this),this.core.settings.autoplayTimeout)):b.clearInterval(this.interval)},d.prototype.play=function(){return c.hidden===!0||this.core.state.isTouch||this.core.state.isScrolling||this.core.state.isSwiping||this.core.state.inMotion?void 0:this.core.settings.autoplay===!1?void b.clearInterval(this.interval):void this.core.next(this.core.settings.autoplaySpeed)},d.prototype.stop=function(){b.clearInterval(this.interval)},d.prototype.pause=function(){b.clearInterval(this.interval)},d.prototype.destroy=function(){var a,c;b.clearInterval(this.interval);for(a in this.handlers)this.core.$element.off(a,this.handlers[a]);for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},a.fn.owlCarousel.Constructor.Plugins.autoplay=d}(window.Zepto||window.jQuery,window,document),function(a){"use strict";var b=function(c){this._core=c,this._initialized=!1,this._pages=[],this._controls={},this._templates=[],this.$element=this._core.$element,this._overrides={next:this._core.next,prev:this._core.prev,to:this._core.to},this._handlers={"prepared.owl.carousel":a.proxy(function(b){this._core.settings.dotsData&&this._templates.push(a(b.content).find("[data-dot]").andSelf("[data-dot]").attr("data-dot"))},this),"add.owl.carousel":a.proxy(function(b){this._core.settings.dotsData&&this._templates.splice(b.position,0,a(b.content).find("[data-dot]").andSelf("[data-dot]").attr("data-dot"))},this),"remove.owl.carousel prepared.owl.carousel":a.proxy(function(a){this._core.settings.dotsData&&this._templates.splice(a.position,1)},this),"change.owl.carousel":a.proxy(function(a){if("position"==a.property.name&&!this._core.state.revert&&!this._core.settings.loop&&this._core.settings.navRewind){var b=this._core.current(),c=this._core.maximum(),d=this._core.minimum();a.data=a.property.value>c?b>=c?d:c:a.property.value<d?c:a.property.value}},this),"changed.owl.carousel":a.proxy(function(a){"position"==a.property.name&&this.draw()},this),"refreshed.owl.carousel":a.proxy(function(){this._initialized||(this.initialize(),this._initialized=!0),this._core.trigger("refresh",null,"navigation"),this.update(),this.draw(),this._core.trigger("refreshed",null,"navigation")},this)},this._core.options=a.extend({},b.Defaults,this._core.options),this.$element.on(this._handlers)};b.Defaults={nav:!1,navRewind:!0,navText:["prev","next"],navSpeed:!1,navElement:"div",navContainer:!1,navContainerClass:"owl-nav",navClass:["owl-prev","owl-next"],slideBy:1,dotClass:"owl-dot",dotsClass:"owl-dots",dots:!0,dotsEach:!1,dotData:!1,dotsSpeed:!1,dotsContainer:!1,controlsClass:"owl-controls"},b.prototype.initialize=function(){var b,c,d=this._core.settings;d.dotsData||(this._templates=[a("<div>").addClass(d.dotClass).append(a("<span>")).prop("outerHTML")]),d.navContainer&&d.dotsContainer||(this._controls.$container=a("<div>").addClass(d.controlsClass).appendTo(this.$element)),this._controls.$indicators=d.dotsContainer?a(d.dotsContainer):a("<div>").hide().addClass(d.dotsClass).appendTo(this._controls.$container),this._controls.$indicators.on("click","div",a.proxy(function(b){var c=a(b.target).parent().is(this._controls.$indicators)?a(b.target).index():a(b.target).parent().index();b.preventDefault(),this.to(c,d.dotsSpeed)},this)),b=d.navContainer?a(d.navContainer):a("<div>").addClass(d.navContainerClass).prependTo(this._controls.$container),this._controls.$next=a("<"+d.navElement+">"),this._controls.$previous=this._controls.$next.clone(),this._controls.$previous.addClass(d.navClass[0]).html(d.navText[0]).hide().prependTo(b).on("click",a.proxy(function(){this.prev(d.navSpeed)},this)),this._controls.$next.addClass(d.navClass[1]).html(d.navText[1]).hide().appendTo(b).on("click",a.proxy(function(){this.next(d.navSpeed)},this));for(c in this._overrides)this._core[c]=a.proxy(this[c],this)},b.prototype.destroy=function(){var a,b,c,d;for(a in this._handlers)this.$element.off(a,this._handlers[a]);for(b in this._controls)this._controls[b].remove();for(d in this.overides)this._core[d]=this._overrides[d];for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},b.prototype.update=function(){var a,b,c,d=this._core.settings,e=this._core.clones().length/2,f=e+this._core.items().length,g=d.center||d.autoWidth||d.dotData?1:d.dotsEach||d.items;if("page"!==d.slideBy&&(d.slideBy=Math.min(d.slideBy,d.items)),d.dots||"page"==d.slideBy)for(this._pages=[],a=e,b=0,c=0;f>a;a++)(b>=g||0===b)&&(this._pages.push({start:a-e,end:a-e+g-1}),b=0,++c),b+=this._core.mergers(this._core.relative(a))},b.prototype.draw=function(){var b,c,d="",e=this._core.settings,f=(this._core.$stage.children(),this._core.relative(this._core.current()));if(!e.nav||e.loop||e.navRewind||(this._controls.$previous.toggleClass("disabled",0>=f),this._controls.$next.toggleClass("disabled",f>=this._core.maximum())),this._controls.$previous.toggle(e.nav),this._controls.$next.toggle(e.nav),e.dots){if(b=this._pages.length-this._controls.$indicators.children().length,e.dotData&&0!==b){for(c=0;c<this._controls.$indicators.children().length;c++)d+=this._templates[this._core.relative(c)];this._controls.$indicators.html(d)}else b>0?(d=new Array(b+1).join(this._templates[0]),this._controls.$indicators.append(d)):0>b&&this._controls.$indicators.children().slice(b).remove();this._controls.$indicators.find(".active").removeClass("active"),this._controls.$indicators.children().eq(a.inArray(this.current(),this._pages)).addClass("active")}this._controls.$indicators.toggle(e.dots)},b.prototype.onTrigger=function(b){var c=this._core.settings;b.page={index:a.inArray(this.current(),this._pages),count:this._pages.length,size:c&&(c.center||c.autoWidth||c.dotData?1:c.dotsEach||c.items)}},b.prototype.current=function(){var b=this._core.relative(this._core.current());return a.grep(this._pages,function(a){return a.start<=b&&a.end>=b}).pop()},b.prototype.getPosition=function(b){var c,d,e=this._core.settings;return"page"==e.slideBy?(c=a.inArray(this.current(),this._pages),d=this._pages.length,b?++c:--c,c=this._pages[(c%d+d)%d].start):(c=this._core.relative(this._core.current()),d=this._core.items().length,b?c+=e.slideBy:c-=e.slideBy),c},b.prototype.next=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!0),b)},b.prototype.prev=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!1),b)},b.prototype.to=function(b,c,d){var e;d?a.proxy(this._overrides.to,this._core)(b,c):(e=this._pages.length,a.proxy(this._overrides.to,this._core)(this._pages[(b%e+e)%e].start,c))},a.fn.owlCarousel.Constructor.Plugins.Navigation=b}(window.Zepto||window.jQuery,window,document),function(a,b){"use strict";var c=function(d){this._core=d,this._hashes={},this.$element=this._core.$element,this._handlers={"initialized.owl.carousel":a.proxy(function(){"URLHash"==this._core.settings.startPosition&&a(b).trigger("hashchange.owl.navigation")},this),"prepared.owl.carousel":a.proxy(function(b){var c=a(b.content).find("[data-hash]").andSelf("[data-hash]").attr("data-hash");this._hashes[c]=b.content},this)},this._core.options=a.extend({},c.Defaults,this._core.options),this.$element.on(this._handlers),a(b).on("hashchange.owl.navigation",a.proxy(function(){var a=b.location.hash.substring(1),c=this._core.$stage.children(),d=this._hashes[a]&&c.index(this._hashes[a])||0;return a?void this._core.to(d,!1,!0):!1},this))};c.Defaults={URLhashListener:!1},c.prototype.destroy=function(){var c,d;a(b).off("hashchange.owl.navigation");for(c in this._handlers)this._core.$element.off(c,this._handlers[c]);for(d in Object.getOwnPropertyNames(this))"function"!=typeof this[d]&&(this[d]=null)},a.fn.owlCarousel.Constructor.Plugins.Hash=c}(window.Zepto||window.jQuery,window,document);
+
var zoomSt = mfp.st.zoom,
 +
ns = '.zoom',
 +
image;
  
 +
if(!zoomSt.enabled || !mfp.supportsTransition) {
 +
return;
 +
}
  
/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl
+
var duration = zoomSt.duration,
* Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT
+
getElToAnimate = function(image) {
  *  */
+
var newImg = image.clone().removeAttr('style').removeAttr('class').addClass('mfp-animated-image'),
 +
transition = 'all '+(zoomSt.duration/1000)+'s ' + zoomSt.easing,
 +
cssObj = {
 +
position: 'fixed',
 +
zIndex: 9999,
 +
left: 0,
 +
top: 0,
 +
'-webkit-backface-visibility': 'hidden'
 +
},
 +
t = 'transition';
 +
 
 +
cssObj['-webkit-'+t] = cssObj['-moz-'+t] = cssObj['-o-'+t] = cssObj[t] = transition;
 +
 
 +
newImg.css(cssObj);
 +
return newImg;
 +
},
 +
showMainContent = function() {
 +
mfp.content.css('visibility', 'visible');
 +
},
 +
openTimeout,
 +
animatedImg;
 +
 
 +
_mfpOn('BuildControls'+ns, function() {
 +
if(mfp._allowZoom()) {
 +
 
 +
clearTimeout(openTimeout);
 +
mfp.content.css('visibility', 'hidden');
 +
 
 +
// Basically, all code below does is clones existing image, puts in on top of the current one and animated it
 +
 
 +
image = mfp._getItemToZoom();
 +
 
 +
if(!image) {
 +
showMainContent();
 +
return;
 +
}
 +
 
 +
animatedImg = getElToAnimate(image);
 +
 
 +
animatedImg.css( mfp._getOffset() );
 +
 
 +
mfp.wrap.append(animatedImg);
 +
 
 +
openTimeout = setTimeout(function() {
 +
animatedImg.css( mfp._getOffset( true ) );
 +
openTimeout = setTimeout(function() {
 +
 
 +
showMainContent();
 +
 
 +
setTimeout(function() {
 +
animatedImg.remove();
 +
image = animatedImg = null;
 +
_mfpTrigger('ZoomAnimationEnded');
 +
}, 16); // avoid blink when switching images
 +
 
 +
}, duration); // this timeout equals animation duration
 +
 
 +
}, 16); // by adding this timeout we avoid short glitch at the beginning of animation
 +
 
 +
 
 +
// Lots of timeouts...
 +
}
 +
});
 +
_mfpOn(BEFORE_CLOSE_EVENT+ns, function() {
 +
if(mfp._allowZoom()) {
 +
 
 +
clearTimeout(openTimeout);
 +
 
 +
mfp.st.removalDelay = duration;
 +
 
 +
if(!image) {
 +
image = mfp._getItemToZoom();
 +
if(!image) {
 +
return;
 +
}
 +
animatedImg = getElToAnimate(image);
 +
}
 +
 
 +
animatedImg.css( mfp._getOffset(true) );
 +
mfp.wrap.append(animatedImg);
 +
mfp.content.css('visibility', 'hidden');
 +
 
 +
setTimeout(function() {
 +
animatedImg.css( mfp._getOffset() );
 +
}, 16);
 +
}
 +
 
 +
});
 +
 
 +
_mfpOn(CLOSE_EVENT+ns, function() {
 +
if(mfp._allowZoom()) {
 +
showMainContent();
 +
if(animatedImg) {
 +
animatedImg.remove();
 +
}
 +
image = null;
 +
}
 +
});
 +
},
 +
 
 +
_allowZoom: function() {
 +
return mfp.currItem.type === 'image';
 +
},
 +
 
 +
_getItemToZoom: function() {
 +
if(mfp.currItem.hasSize) {
 +
return mfp.currItem.img;
 +
} else {
 +
return false;
 +
}
 +
},
 +
 
 +
// Get element postion relative to viewport
 +
_getOffset: function(isLarge) {
 +
var el;
 +
if(isLarge) {
 +
el = mfp.currItem.img;
 +
} else {
 +
el = mfp.st.zoom.opener(mfp.currItem.el || mfp.currItem);
 +
}
 +
 
 +
var offset = el.offset();
 +
var paddingTop = parseInt(el.css('padding-top'),10);
 +
var paddingBottom = parseInt(el.css('padding-bottom'),10);
 +
offset.top -= ( $(window).scrollTop() - paddingTop );
 +
 
 +
 
 +
/*
 +
 
 +
Animating left + top + width/height looks glitchy in Firefox, but perfect in Chrome. And vice-versa.
 +
 
 +
*/
 +
var obj = {
 +
width: el.width(),
 +
// fix Zepto height+padding issue
 +
height: (_isJQ ? el.innerHeight() : el[0].offsetHeight) - paddingBottom - paddingTop
 +
};
 +
 
 +
// I hate to do this, but there is no another option
 +
if( getHasMozTransform() ) {
 +
obj['-moz-transform'] = obj['transform'] = 'translate(' + offset.left + 'px,' + offset.top + 'px)';
 +
} else {
 +
obj.left = offset.left;
 +
obj.top = offset.top;
 +
}
 +
return obj;
 +
}
 +
 
 +
}
 +
});
 +
 
 +
 
 +
 
 +
/*>>zoom*/
 +
 
 +
/*>>iframe*/
 +
 
 +
var IFRAME_NS = 'iframe',
 +
_emptyPage = '//about:blank',
 +
 
 +
_fixIframeBugs = function(isShowing) {
 +
if(mfp.currTemplate[IFRAME_NS]) {
 +
var el = mfp.currTemplate[IFRAME_NS].find('iframe');
 +
if(el.length) {
 +
// reset src after the popup is closed to avoid "video keeps playing after popup is closed" bug
 +
if(!isShowing) {
 +
el[0].src = _emptyPage;
 +
}
 +
 
 +
// IE8 black screen bug fix
 +
if(mfp.isIE8) {
 +
el.css('display', isShowing ? 'block' : 'none');
 +
}
 +
}
 +
}
 +
};
 +
 
 +
$.magnificPopup.registerModule(IFRAME_NS, {
 +
 
 +
options: {
 +
markup: '<div class="mfp-iframe-scaler">'+
 +
'<div class="mfp-close"></div>'+
 +
'<iframe class="mfp-iframe" src="//about:blank" frameborder="0" allowfullscreen></iframe>'+
 +
'</div>',
 +
 
 +
srcAction: 'iframe_src',
 +
 
 +
// we don't care and support only one default type of URL by default
 +
patterns: {
 +
youtube: {
 +
index: 'youtube.com',
 +
id: 'v=',
 +
src: '//www.youtube.com/embed/%id%?autoplay=1'
 +
},
 +
vimeo: {
 +
index: 'vimeo.com/',
 +
id: '/',
 +
src: '//player.vimeo.com/video/%id%?autoplay=1'
 +
},
 +
gmaps: {
 +
index: '//maps.google.',
 +
src: '%id%&output=embed'
 +
}
 +
}
 +
},
 +
 
 +
proto: {
 +
initIframe: function() {
 +
mfp.types.push(IFRAME_NS);
 +
 
 +
_mfpOn('BeforeChange', function(e, prevType, newType) {
 +
if(prevType !== newType) {
 +
if(prevType === IFRAME_NS) {
 +
_fixIframeBugs(); // iframe if removed
 +
} else if(newType === IFRAME_NS) {
 +
_fixIframeBugs(true); // iframe is showing
 +
}
 +
}// else {
 +
// iframe source is switched, don't do anything
 +
//}
 +
});
 +
 
 +
_mfpOn(CLOSE_EVENT + '.' + IFRAME_NS, function() {
 +
_fixIframeBugs();
 +
});
 +
},
 +
 
 +
getIframe: function(item, template) {
 +
var embedSrc = item.src;
 +
var iframeSt = mfp.st.iframe;
 +
 
 +
$.each(iframeSt.patterns, function() {
 +
if(embedSrc.indexOf( this.index ) > -1) {
 +
if(this.id) {
 +
if(typeof this.id === 'string') {
 +
embedSrc = embedSrc.substr(embedSrc.lastIndexOf(this.id)+this.id.length, embedSrc.length);
 +
} else {
 +
embedSrc = this.id.call( this, embedSrc );
 +
}
 +
}
 +
embedSrc = this.src.replace('%id%', embedSrc );
 +
return false; // break;
 +
}
 +
});
 +
 
 +
var dataObj = {};
 +
if(iframeSt.srcAction) {
 +
dataObj[iframeSt.srcAction] = embedSrc;
 +
}
 +
mfp._parseMarkup(template, dataObj, item);
 +
 
 +
mfp.updateStatus('ready');
 +
 
 +
return template;
 +
}
 +
}
 +
});
 +
 
 +
 
 +
 
 +
/*>>iframe*/
 +
 
 +
/*>>gallery*/
 +
/**
 +
  * Get looped index depending on number of slides
 +
  */
 +
var _getLoopedId = function(index) {
 +
var numSlides = mfp.items.length;
 +
if(index > numSlides - 1) {
 +
return index - numSlides;
 +
} else  if(index < 0) {
 +
return numSlides + index;
 +
}
 +
return index;
 +
},
 +
_replaceCurrTotal = function(text, curr, total) {
 +
return text.replace(/%curr%/gi, curr + 1).replace(/%total%/gi, total);
 +
};
 +
 
 +
$.magnificPopup.registerModule('gallery', {
 +
 
 +
options: {
 +
enabled: false,
 +
arrowMarkup: '<button title="%title%" type="button" class="mfp-arrow mfp-arrow-%dir%"></button>',
 +
preload: [0,2],
 +
navigateByImgClick: true,
 +
arrows: true,
 +
 
 +
tPrev: 'Previous (Left arrow key)',
 +
tNext: 'Next (Right arrow key)',
 +
tCounter: '%curr% of %total%'
 +
},
 +
 
 +
proto: {
 +
initGallery: function() {
 +
 
 +
var gSt = mfp.st.gallery,
 +
ns = '.mfp-gallery';
 +
 
 +
mfp.direction = true; // true - next, false - prev
 +
 
 +
if(!gSt || !gSt.enabled ) return false;
 +
 
 +
_wrapClasses += ' mfp-gallery';
 +
 
 +
_mfpOn(OPEN_EVENT+ns, function() {
 +
 
 +
if(gSt.navigateByImgClick) {
 +
mfp.wrap.on('click'+ns, '.mfp-img', function() {
 +
if(mfp.items.length > 1) {
 +
mfp.next();
 +
return false;
 +
}
 +
});
 +
}
 +
 
 +
_document.on('keydown'+ns, function(e) {
 +
if (e.keyCode === 37) {
 +
mfp.prev();
 +
} else if (e.keyCode === 39) {
 +
mfp.next();
 +
}
 +
});
 +
});
 +
 
 +
_mfpOn('UpdateStatus'+ns, function(e, data) {
 +
if(data.text) {
 +
data.text = _replaceCurrTotal(data.text, mfp.currItem.index, mfp.items.length);
 +
}
 +
});
 +
 
 +
_mfpOn(MARKUP_PARSE_EVENT+ns, function(e, element, values, item) {
 +
var l = mfp.items.length;
 +
values.counter = l > 1 ? _replaceCurrTotal(gSt.tCounter, item.index, l) : '';
 +
});
 +
 
 +
_mfpOn('BuildControls' + ns, function() {
 +
if(mfp.items.length > 1 && gSt.arrows && !mfp.arrowLeft) {
 +
var markup = gSt.arrowMarkup,
 +
arrowLeft = mfp.arrowLeft = $( markup.replace(/%title%/gi, gSt.tPrev).replace(/%dir%/gi, 'left') ).addClass(PREVENT_CLOSE_CLASS),
 +
arrowRight = mfp.arrowRight = $( markup.replace(/%title%/gi, gSt.tNext).replace(/%dir%/gi, 'right') ).addClass(PREVENT_CLOSE_CLASS);
 +
 
 +
arrowLeft.click(function() {
 +
mfp.prev();
 +
});
 +
arrowRight.click(function() {
 +
mfp.next();
 +
});
 +
 
 +
mfp.container.append(arrowLeft.add(arrowRight));
 +
}
 +
});
 +
 
 +
_mfpOn(CHANGE_EVENT+ns, function() {
 +
if(mfp._preloadTimeout) clearTimeout(mfp._preloadTimeout);
 +
 
 +
mfp._preloadTimeout = setTimeout(function() {
 +
mfp.preloadNearbyImages();
 +
mfp._preloadTimeout = null;
 +
}, 16);
 +
});
 +
 
 +
 
 +
_mfpOn(CLOSE_EVENT+ns, function() {
 +
_document.off(ns);
 +
mfp.wrap.off('click'+ns);
 +
mfp.arrowRight = mfp.arrowLeft = null;
 +
});
 +
 
 +
},
 +
next: function() {
 +
mfp.direction = true;
 +
mfp.index = _getLoopedId(mfp.index + 1);
 +
mfp.updateItemHTML();
 +
},
 +
prev: function() {
 +
mfp.direction = false;
 +
mfp.index = _getLoopedId(mfp.index - 1);
 +
mfp.updateItemHTML();
 +
},
 +
goTo: function(newIndex) {
 +
mfp.direction = (newIndex >= mfp.index);
 +
mfp.index = newIndex;
 +
mfp.updateItemHTML();
 +
},
 +
preloadNearbyImages: function() {
 +
var p = mfp.st.gallery.preload,
 +
preloadBefore = Math.min(p[0], mfp.items.length),
 +
preloadAfter = Math.min(p[1], mfp.items.length),
 +
i;
 +
 
 +
for(i = 1; i <= (mfp.direction ? preloadAfter : preloadBefore); i++) {
 +
mfp._preloadItem(mfp.index+i);
 +
}
 +
for(i = 1; i <= (mfp.direction ? preloadBefore : preloadAfter); i++) {
 +
mfp._preloadItem(mfp.index-i);
 +
}
 +
},
 +
_preloadItem: function(index) {
 +
index = _getLoopedId(index);
 +
 
 +
if(mfp.items[index].preloaded) {
 +
return;
 +
}
 +
 
 +
var item = mfp.items[index];
 +
if(!item.parsed) {
 +
item = mfp.parseEl( index );
 +
}
 +
 
 +
_mfpTrigger('LazyLoad', item);
 +
 
 +
if(item.type === 'image') {
 +
item.img = $('<img class="mfp-img" />').on('load.mfploader', function() {
 +
item.hasSize = true;
 +
}).on('error.mfploader', function() {
 +
item.hasSize = true;
 +
item.loadError = true;
 +
_mfpTrigger('LazyLoadError', item);
 +
}).attr('src', item.src);
 +
}
 +
 
 +
 
 +
item.preloaded = true;
 +
}
 +
}
 +
});
 +
 
 +
/*>>gallery*/
 +
 
 +
/*>>retina*/
 +
 
 +
var RETINA_NS = 'retina';
 +
 
 +
$.magnificPopup.registerModule(RETINA_NS, {
 +
options: {
 +
replaceSrc: function(item) {
 +
return item.src.replace(/\.\w+$/, function(m) { return '@2x' + m; });
 +
},
 +
ratio: 1 // Function or number.  Set to 1 to disable.
 +
},
 +
proto: {
 +
initRetina: function() {
 +
if(window.devicePixelRatio > 1) {
 +
 
 +
var st = mfp.st.retina,
 +
ratio = st.ratio;
 +
 
 +
ratio = !isNaN(ratio) ? ratio : ratio();
 +
 
 +
if(ratio > 1) {
 +
_mfpOn('ImageHasSize' + '.' + RETINA_NS, function(e, item) {
 +
item.img.css({
 +
'max-width': item.img[0].naturalWidth / ratio,
 +
'width': '100%'
 +
});
 +
});
 +
_mfpOn('ElementParse' + '.' + RETINA_NS, function(e, item) {
 +
item.src = st.replaceSrc(item, ratio);
 +
});
 +
}
 +
}
 +
 
 +
}
 +
}
 +
});
 +
 
 +
/*>>retina*/
 +
_checkInstance(); }));
 +
 
 +
 
 +
(function($) {
 +
    "use strict"; // Start of use strict
 +
 
 +
    // jQuery for page scrolling feature - requires jQuery Easing plugin
 +
    $('a.page-scroll').bind('click', function(event) {
 +
        var $anchor = $(this);
 +
        $('html, body').stop().animate({
 +
            scrollTop: ($($anchor.attr('href')).offset().top - 50)
 +
        }, 1250, 'easeInOutExpo');
 +
        event.preventDefault();
 +
    });
 +
 
 +
    // Highlight the top nav as scrolling occurs
 +
    $('body').scrollspy({
 +
        target: '.navbar-fixed-top',
 +
        offset: 51
 +
    });
 +
 
 +
    // Closes the Responsive Menu on Menu Item Click
 +
    $('.navbar-collapse ul li a').click(function() {
 +
        $('.navbar-toggle:visible').click();
 +
    });
 +
 
 +
    // Offset for Main Navigation
 +
    $('#mainNav').affix({
 +
        offset: {
 +
            top: 100
 +
        }
 +
    })
 +
 
 +
    // Initialize and Configure Scroll Reveal Animation
 +
    window.sr = ScrollReveal();
 +
    sr.reveal('.sr-icons', {
 +
        duration: 600,
 +
        scale: 0.3,
 +
        distance: '0px'
 +
    }, 200);
 +
    sr.reveal('.sr-button', {
 +
        duration: 1000,
 +
        delay: 200
 +
    });
 +
    sr.reveal('.sr-contact', {
 +
        duration: 600,
 +
        scale: 0.3,
 +
        distance: '0px'
 +
    }, 300);
 +
 
 +
    // Initialize and Configure Magnific Popup Lightbox Plugin
 +
    $('.popup-gallery').magnificPopup({
 +
        delegate: 'a',
 +
        type: 'image',
 +
        tLoading: 'Loading image #%curr%...',
 +
        mainClass: 'mfp-img-mobile',
 +
        gallery: {
 +
            enabled: true,
 +
            navigateByImgClick: true,
 +
            preload: [0, 1] // Will preload 0 - before current, and 1 after the current image
 +
        },
 +
        image: {
 +
            tError: '<a href="%url%">The image #%curr%</a> could not be loaded.'
 +
        }
 +
    });
  
!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='&shy;<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b<s.length;b++){var c=s[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!o[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(v(c.styleSheet.rawCssText,e,f),o[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!r||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}w()};x(),c.update=x,c.getEmValue=t,a.addEventListener?a.addEventListener("resize",b,!1):a.attachEvent&&a.attachEvent("onresize",b)}}(this);
+
})(jQuery); // End of use strict

Revision as of 01:31, 14 September 2016

/*!

* jQuery JavaScript Library v1.12.4
* http://jquery.com/
*
* Includes Sizzle.js
* http://sizzlejs.com/
*
* Copyright jQuery Foundation and other contributors
* Released under the MIT license
* http://jquery.org/license
*
* Date: 2016-05-20T17:17Z
*/

(function( global, factory ) {

if ( typeof module === "object" && typeof module.exports === "object" ) { // For CommonJS and CommonJS-like environments where a proper `window` // is present, execute the factory and get jQuery. // For environments that do not have a `window` with a `document` // (such as Node.js), expose a factory as module.exports. // This accentuates the need for the creation of a real `window`. // e.g. var jQuery = require("jquery")(window); // See ticket #14549 for more info. module.exports = global.document ? factory( global, true ) : function( w ) { if ( !w.document ) { throw new Error( "jQuery requires a window with a document" ); } return factory( w ); }; } else { factory( global ); }

// Pass this if window is not defined yet }(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {

// Support: Firefox 18+ // Can't be in strict mode, several libs including ASP.NET trace // the stack via arguments.caller.callee and Firefox dies if // you try to trace through "use strict" call chains. (#13335) //"use strict"; var deletedIds = [];

var document = window.document;

var slice = deletedIds.slice;

var concat = deletedIds.concat;

var push = deletedIds.push;

var indexOf = deletedIds.indexOf;

var class2type = {};

var toString = class2type.toString;

var hasOwn = class2type.hasOwnProperty;

var support = {};


var version = "1.12.4",

// Define a local copy of jQuery jQuery = function( selector, context ) {

// The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQuery.fn.init( selector, context ); },

// Support: Android<4.1, IE<9 // Make sure we trim BOM and NBSP rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,

// Matches dashed string for camelizing rmsPrefix = /^-ms-/, rdashAlpha = /-([\da-z])/gi,

// Used by jQuery.camelCase as callback to replace() fcamelCase = function( all, letter ) { return letter.toUpperCase(); };

jQuery.fn = jQuery.prototype = {

// The current version of jQuery being used jquery: version,

constructor: jQuery,

// Start with an empty selector selector: "",

// The default length of a jQuery object is 0 length: 0,

toArray: function() { return slice.call( this ); },

// Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { return num != null ?

// Return just the one element from the set ( num < 0 ? this[ num + this.length ] : this[ num ] ) :

// Return all the elements in a clean array slice.call( this ); },

// Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems ) {

// Build a new jQuery matched element set var ret = jQuery.merge( this.constructor(), elems );

// Add the old object onto the stack (as a reference) ret.prevObject = this; ret.context = this.context;

// Return the newly-formed element set return ret; },

// Execute a callback for every element in the matched set. each: function( callback ) { return jQuery.each( this, callback ); },

map: function( callback ) { return this.pushStack( jQuery.map( this, function( elem, i ) { return callback.call( elem, i, elem ); } ) ); },

slice: function() { return this.pushStack( slice.apply( this, arguments ) ); },

first: function() { return this.eq( 0 ); },

last: function() { return this.eq( -1 ); },

eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); },

end: function() { return this.prevObject || this.constructor(); },

// For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: deletedIds.sort, splice: deletedIds.splice };

jQuery.extend = jQuery.fn.extend = function() { var src, copyIsArray, copy, name, options, clone, target = arguments[ 0 ] || {}, i = 1, length = arguments.length, deep = false;

// Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target;

// skip the boolean and the target target = arguments[ i ] || {}; i++; }

// Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { target = {}; }

// extend jQuery itself if only one argument is passed if ( i === length ) { target = this; i--; }

for ( ; i < length; i++ ) {

// Only deal with non-null/undefined values if ( ( options = arguments[ i ] ) != null ) {

// Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ];

// Prevent never-ending loop if ( target === copy ) { continue; }

// Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject( copy ) || ( copyIsArray = jQuery.isArray( copy ) ) ) ) {

if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray( src ) ? src : [];

} else { clone = src && jQuery.isPlainObject( src ) ? src : {}; }

// Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy );

// Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } }

// Return the modified object return target; };

jQuery.extend( {

// Unique for each copy of jQuery on the page expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),

// Assume jQuery is ready without the ready module isReady: true,

error: function( msg ) { throw new Error( msg ); },

noop: function() {},

// See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return jQuery.type( obj ) === "function"; },

isArray: Array.isArray || function( obj ) { return jQuery.type( obj ) === "array"; },

isWindow: function( obj ) { /* jshint eqeqeq: false */ return obj != null && obj == obj.window; },

isNumeric: function( obj ) {

// parseFloat NaNs numeric-cast false positives (null|true|false|"") // ...but misinterprets leading-number strings, particularly hex literals ("0x...") // subtraction forces infinities to NaN // adding 1 corrects loss of precision from parseFloat (#15100) var realStringObj = obj && obj.toString(); return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; },

isEmptyObject: function( obj ) { var name; for ( name in obj ) { return false; } return true; },

isPlainObject: function( obj ) { var key;

// Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; }

try {

// Not own constructor property must be Object if ( obj.constructor && !hasOwn.call( obj, "constructor" ) && !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { return false; } } catch ( e ) {

// IE8,9 Will throw exceptions on certain host objects #9897 return false; }

// Support: IE<9 // Handle iteration over inherited properties before own properties. if ( !support.ownFirst ) { for ( key in obj ) { return hasOwn.call( obj, key ); } }

// Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. for ( key in obj ) {}

return key === undefined || hasOwn.call( obj, key ); },

type: function( obj ) { if ( obj == null ) { return obj + ""; } return typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call( obj ) ] || "object" : typeof obj; },

// Workarounds based on findings by Jim Driscoll // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context globalEval: function( data ) { if ( data && jQuery.trim( data ) ) {

// We use execScript on Internet Explorer // We use an anonymous function so that context is window // rather than jQuery in Firefox ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation } )( data ); } },

// Convert dashed to camelCase; used by the css and data modules // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); },

nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); },

each: function( obj, callback ) { var length, i = 0;

if ( isArrayLike( obj ) ) { length = obj.length; for ( ; i < length; i++ ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } else { for ( i in obj ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } }

return obj; },

// Support: Android<4.1, IE<9 trim: function( text ) { return text == null ? "" : ( text + "" ).replace( rtrim, "" ); },

// results is for internal usage only makeArray: function( arr, results ) { var ret = results || [];

if ( arr != null ) { if ( isArrayLike( Object( arr ) ) ) { jQuery.merge( ret, typeof arr === "string" ? [ arr ] : arr ); } else { push.call( ret, arr ); } }

return ret; },

inArray: function( elem, arr, i ) { var len;

if ( arr ) { if ( indexOf ) { return indexOf.call( arr, elem, i ); }

len = arr.length; i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;

for ( ; i < len; i++ ) {

// Skip accessing in sparse arrays if ( i in arr && arr[ i ] === elem ) { return i; } } }

return -1; },

merge: function( first, second ) { var len = +second.length, j = 0, i = first.length;

while ( j < len ) { first[ i++ ] = second[ j++ ]; }

// Support: IE<9 // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) if ( len !== len ) { while ( second[ j ] !== undefined ) { first[ i++ ] = second[ j++ ]; } }

first.length = i;

return first; },

grep: function( elems, callback, invert ) { var callbackInverse, matches = [], i = 0, length = elems.length, callbackExpect = !invert;

// Go through the array, only saving the items // that pass the validator function for ( ; i < length; i++ ) { callbackInverse = !callback( elems[ i ], i ); if ( callbackInverse !== callbackExpect ) { matches.push( elems[ i ] ); } }

return matches; },

// arg is for internal usage only map: function( elems, callback, arg ) { var length, value, i = 0, ret = [];

// Go through the array, translating each of the items to their new values if ( isArrayLike( elems ) ) { length = elems.length; for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg );

if ( value != null ) { ret.push( value ); } }

// Go through every key on the object, } else { for ( i in elems ) { value = callback( elems[ i ], i, arg );

if ( value != null ) { ret.push( value ); } } }

// Flatten any nested arrays return concat.apply( [], ret ); },

// A global GUID counter for objects guid: 1,

// Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { var args, proxy, tmp;

if ( typeof context === "string" ) { tmp = fn[ context ]; context = fn; fn = tmp; }

// Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; }

// Simulated bind args = slice.call( arguments, 2 ); proxy = function() { return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); };

// Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || jQuery.guid++;

return proxy; },

now: function() { return +( new Date() ); },

// jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. support: support } );

// JSHint would error on this code due to the Symbol not being defined in ES5. // Defining this global in .jshintrc would create a danger of using the global // unguarded in another place, it seems safer to just disable JSHint for these // three lines. /* jshint ignore: start */ if ( typeof Symbol === "function" ) { jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ]; } /* jshint ignore: end */

// Populate the class2type map jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), function( i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } );

function isArrayLike( obj ) {

// Support: iOS 8.2 (not reproducible in simulator) // `in` check used to prevent JIT error (gh-2145) // hasOwn isn't used here due to false negatives // regarding Nodelist length in IE var length = !!obj && "length" in obj && obj.length, type = jQuery.type( obj );

if ( type === "function" || jQuery.isWindow( obj ) ) { return false; }

return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } var Sizzle = /*!

* Sizzle CSS Selector Engine v2.2.1
* http://sizzlejs.com/
*
* Copyright jQuery Foundation and other contributors
* Released under the MIT license
* http://jquery.org/license
*
* Date: 2015-10-17
*/

(function( window ) {

var i, support, Expr, getText, isXML, tokenize, compile, select, outermostContext, sortInput, hasDuplicate,

// Local document vars setDocument, document, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains,

// Instance-specific data expando = "sizzle" + 1 * new Date(), preferredDoc = window.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; } return 0; },

// General-purpose constants MAX_NEGATIVE = 1 << 31,

// Instance methods hasOwn = ({}).hasOwnProperty, arr = [], pop = arr.pop, push_native = arr.push, push = arr.push, slice = arr.slice, // Use a stripped-down indexOf as it's faster than native // http://jsperf.com/thor-indexof-vs-for/5 indexOf = function( list, elem ) { var i = 0, len = list.length; for ( ; i < len; i++ ) { if ( list[i] === elem ) { return i; } } return -1; },

booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",

// Regular expressions

// http://www.w3.org/TR/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]",

// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",

// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]",

pseudos = ":(" + identifier + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: // 1. quoted (capture 3; capture 4 or capture 5) "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + // 2. simple (capture 6) "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + // 3. anything else (capture 2) ".*" + ")\\)|)",

// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp( whitespace + "+", "g" ), rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),

rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),

rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),

rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ),

matchExpr = { "ID": new RegExp( "^#(" + identifier + ")" ), "CLASS": new RegExp( "^\\.(" + identifier + ")" ), "TAG": new RegExp( "^(" + identifier + "|[*])" ), "ATTR": new RegExp( "^" + attributes ), "PSEUDO": new RegExp( "^" + pseudos ), "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) },

rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i,

rnative = /^[^{]+\{\s*\[native \w/,

// Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,

rsibling = /[+~]/, rescape = /'|\\/g,

// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), funescape = function( _, escaped, escapedWhitespace ) { var high = "0x" + escaped - 0x10000; // NaN means non-codepoint // Support: Firefox<24 // Workaround erroneous numeric interpretation of +"0x" return high !== high || escapedWhitespace ? escaped : high < 0 ? // BMP codepoint String.fromCharCode( high + 0x10000 ) : // Supplemental Plane codepoint (surrogate pair) String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); },

// Used for iframes // See setDocument() // Removing the function wrapper causes a "Permission Denied" // error in IE unloadHandler = function() { setDocument(); };

// Optimize for push.apply( _, NodeList ) try { push.apply( (arr = slice.call( preferredDoc.childNodes )), preferredDoc.childNodes ); // Support: Android<4.0 // Detect silently failing push.apply arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { push = { apply: arr.length ?

// Leverage slice if possible function( target, els ) { push_native.apply( target, slice.call(els) ); } :

// Support: IE<9 // Otherwise append directly function( target, els ) { var j = target.length, i = 0; // Can't trust NodeList.length while ( (target[j++] = els[i++]) ) {} target.length = j - 1; } }; }

function Sizzle( selector, context, results, seed ) { var m, i, elem, nid, nidselect, match, groups, newSelector, newContext = context && context.ownerDocument,

// nodeType defaults to 9, since context defaults to document nodeType = context ? context.nodeType : 9;

results = results || [];

// Return early from calls with invalid selector or context if ( typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {

return results; }

// Try to shortcut find operations (as opposed to filters) in HTML documents if ( !seed ) {

if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { setDocument( context ); } context = context || document;

if ( documentIsHTML ) {

// If the selector is sufficiently simple, try using a "get*By*" DOM method // (excepting DocumentFragment context, where the methods don't exist) if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {

// ID selector if ( (m = match[1]) ) {

// Document context if ( nodeType === 9 ) { if ( (elem = context.getElementById( m )) ) {

// Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( elem.id === m ) { results.push( elem ); return results; } } else { return results; }

// Element context } else {

// Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( newContext && (elem = newContext.getElementById( m )) && contains( context, elem ) && elem.id === m ) {

results.push( elem ); return results; } }

// Type selector } else if ( match[2] ) { push.apply( results, context.getElementsByTagName( selector ) ); return results;

// Class selector } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {

push.apply( results, context.getElementsByClassName( m ) ); return results; } }

// Take advantage of querySelectorAll if ( support.qsa && !compilerCache[ selector + " " ] && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {

if ( nodeType !== 1 ) { newContext = context; newSelector = selector;

// qSA looks outside Element context, which is not what we want // Thanks to Andrew Dupont for this workaround technique // Support: IE <=8 // Exclude object elements } else if ( context.nodeName.toLowerCase() !== "object" ) {

// Capture the context ID, setting it first if necessary if ( (nid = context.getAttribute( "id" )) ) { nid = nid.replace( rescape, "\\$&" ); } else { context.setAttribute( "id", (nid = expando) ); }

// Prefix every selector in the list groups = tokenize( selector ); i = groups.length; nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; while ( i-- ) { groups[i] = nidselect + " " + toSelector( groups[i] ); } newSelector = groups.join( "," );

// Expand context for sibling selectors newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; }

if ( newSelector ) { try { push.apply( results, newContext.querySelectorAll( newSelector ) ); return results; } catch ( qsaError ) { } finally { if ( nid === expando ) { context.removeAttribute( "id" ); } } } } } }

// All others return select( selector.replace( rtrim, "$1" ), context, results, seed ); }

/**

* Create key-value caches of limited size
* @returns {function(string, object)} Returns the Object data after storing it on itself with
*	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
*	deleting the oldest entry
*/

function createCache() { var keys = [];

function cache( key, value ) { // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) if ( keys.push( key + " " ) > Expr.cacheLength ) { // Only keep the most recent entries delete cache[ keys.shift() ]; } return (cache[ key + " " ] = value); } return cache; }

/**

* Mark a function for special use by Sizzle
* @param {Function} fn The function to mark
*/

function markFunction( fn ) { fn[ expando ] = true; return fn; }

/**

* Support testing using an element
* @param {Function} fn Passed the created div and expects a boolean result
*/

function assert( fn ) { var div = document.createElement("div");

try { return !!fn( div ); } catch (e) { return false; } finally { // Remove from its parent by default if ( div.parentNode ) { div.parentNode.removeChild( div ); } // release memory in IE div = null; } }

/**

* Adds the same handler for all of the specified attrs
* @param {String} attrs Pipe-separated list of attributes
* @param {Function} handler The method that will be applied
*/

function addHandle( attrs, handler ) { var arr = attrs.split("|"), i = arr.length;

while ( i-- ) { Expr.attrHandle[ arr[i] ] = handler; } }

/**

* Checks document order of two siblings
* @param {Element} a
* @param {Element} b
* @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
*/

function siblingCheck( a, b ) { var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );

// Use IE sourceIndex if available on both nodes if ( diff ) { return diff; }

// Check if b follows a if ( cur ) { while ( (cur = cur.nextSibling) ) { if ( cur === b ) { return -1; } } }

return a ? 1 : -1; }

/**

* Returns a function to use in pseudos for input types
* @param {String} type
*/

function createInputPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === type; }; }

/**

* Returns a function to use in pseudos for buttons
* @param {String} type
*/

function createButtonPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && elem.type === type; }; }

/**

* Returns a function to use in pseudos for positionals
* @param {Function} fn
*/

function createPositionalPseudo( fn ) { return markFunction(function( argument ) { argument = +argument; return markFunction(function( seed, matches ) { var j, matchIndexes = fn( [], seed.length, argument ), i = matchIndexes.length;

// Match elements found at the specified indexes while ( i-- ) { if ( seed[ (j = matchIndexes[i]) ] ) { seed[j] = !(matches[j] = seed[j]); } } }); }); }

/**

* Checks a node for validity as a Sizzle context
* @param {Element|Object=} context
* @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
*/

function testContext( context ) { return context && typeof context.getElementsByTagName !== "undefined" && context; }

// Expose support vars for convenience support = Sizzle.support = {};

/**

* Detects XML nodes
* @param {Element|Object} elem An element or a document
* @returns {Boolean} True iff elem is a non-HTML XML node
*/

isXML = Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = elem && (elem.ownerDocument || elem).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; };

/**

* Sets document-related variables once based on the current document
* @param {Element|Object} [doc] An element or document object to use to set the document
* @returns {Object} Returns the current document
*/

setDocument = Sizzle.setDocument = function( node ) { var hasCompare, parent, doc = node ? node.ownerDocument || node : preferredDoc;

// Return early if doc is invalid or already selected if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { return document; }

// Update global variables document = doc; docElem = document.documentElement; documentIsHTML = !isXML( document );

// Support: IE 9-11, Edge // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) if ( (parent = document.defaultView) && parent.top !== parent ) { // Support: IE 11 if ( parent.addEventListener ) { parent.addEventListener( "unload", unloadHandler, false );

// Support: IE 9 - 10 only } else if ( parent.attachEvent ) { parent.attachEvent( "onunload", unloadHandler ); } }

/* Attributes ---------------------------------------------------------------------- */

// Support: IE<8 // Verify that getAttribute really returns attributes and not properties // (excepting IE8 booleans) support.attributes = assert(function( div ) { div.className = "i"; return !div.getAttribute("className"); });

/* getElement(s)By* ---------------------------------------------------------------------- */

// Check if getElementsByTagName("*") returns only elements support.getElementsByTagName = assert(function( div ) { div.appendChild( document.createComment("") ); return !div.getElementsByTagName("*").length; });

// Support: IE<9 support.getElementsByClassName = rnative.test( document.getElementsByClassName );

// Support: IE<10 // Check if getElementById returns elements by name // The broken getElementById methods don't pick up programatically-set names, // so use a roundabout getElementsByName test support.getById = assert(function( div ) { docElem.appendChild( div ).id = expando; return !document.getElementsByName || !document.getElementsByName( expando ).length; });

// ID find and filter if ( support.getById ) { Expr.find["ID"] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var m = context.getElementById( id ); return m ? [ m ] : []; } }; Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute("id") === attrId; }; }; } else { // Support: IE6/7 // getElementById is not reliable as a find shortcut delete Expr.find["ID"];

Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return node && node.value === attrId; }; }; }

// Tag Expr.find["TAG"] = support.getElementsByTagName ? function( tag, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( tag );

// DocumentFragment nodes don't have gEBTN } else if ( support.qsa ) { return context.querySelectorAll( tag ); } } :

function( tag, context ) { var elem, tmp = [], i = 0, // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too results = context.getElementsByTagName( tag );

// Filter out possible comments if ( tag === "*" ) { while ( (elem = results[i++]) ) { if ( elem.nodeType === 1 ) { tmp.push( elem ); } }

return tmp; } return results; };

// Class Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { return context.getElementsByClassName( className ); } };

/* QSA/matchesSelector ---------------------------------------------------------------------- */

// QSA and matchesSelector support

// matchesSelector(:active) reports false when true (IE9/Opera 11.5) rbuggyMatches = [];

// qSa(:focus) reports false when true (Chrome 21) // We allow this because of a bug in IE8/9 that throws an error // whenever `document.activeElement` is accessed on an iframe // So, we allow :focus to pass through QSA all the time to avoid the IE error // See http://bugs.jquery.com/ticket/13378 rbuggyQSA = [];

if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { // Build QSA regex // Regex strategy adopted from Diego Perini assert(function( div ) { // Select is set to empty string on purpose // This is to test IE's treatment of not explicitly // setting a boolean content attribute, // since its presence should be enough // http://bugs.jquery.com/ticket/12359 docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" + "<select id='" + expando + "-\r\\' msallowcapture=>" + "<option selected=></option></select>";

// Support: IE8, Opera 11-12.16 // Nothing should be selected when empty strings follow ^= or $= or *= // The test attribute must be unknown in Opera but "safe" for WinRT // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section if ( div.querySelectorAll("[msallowcapture^=]").length ) { rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:|\"\")" ); }

// Support: IE8 // Boolean attributes and "value" are not treated correctly if ( !div.querySelectorAll("[selected]").length ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); }

// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { rbuggyQSA.push("~="); }

// Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests if ( !div.querySelectorAll(":checked").length ) { rbuggyQSA.push(":checked"); }

// Support: Safari 8+, iOS 8+ // https://bugs.webkit.org/show_bug.cgi?id=136851 // In-page `selector#id sibing-combinator selector` fails if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { rbuggyQSA.push(".#.+[+~]"); } });

assert(function( div ) { // Support: Windows 8 Native Apps // The type and name attributes are restricted during .innerHTML assignment var input = document.createElement("input"); input.setAttribute( "type", "hidden" ); div.appendChild( input ).setAttribute( "name", "D" );

// Support: IE8 // Enforce case-sensitivity of name attribute if ( div.querySelectorAll("[name=d]").length ) { rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); }

// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // IE8 throws error here and will not see later tests if ( !div.querySelectorAll(":enabled").length ) { rbuggyQSA.push( ":enabled", ":disabled" ); }

// Opera 10-11 does not throw on post-comma invalid pseudos div.querySelectorAll("*,:x"); rbuggyQSA.push(",.*:"); }); }

if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector) )) ) {

assert(function( div ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9) support.disconnectedMatch = matches.call( div, "div" );

// This should fail with an exception // Gecko does not error, returns false instead matches.call( div, "[s!=]:x" ); rbuggyMatches.push( "!=", pseudos ); }); }

rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );

/* Contains ---------------------------------------------------------------------- */ hasCompare = rnative.test( docElem.compareDocumentPosition );

// Element contains another // Purposefully self-exclusive // As in, an element does not contain itself contains = hasCompare || rnative.test( docElem.contains ) ? function( a, b ) { var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode; return a === bup || !!( bup && bup.nodeType === 1 && ( adown.contains ? adown.contains( bup ) : a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 )); } : function( a, b ) { if ( b ) { while ( (b = b.parentNode) ) { if ( b === a ) { return true; } } } return false; };

/* Sorting ---------------------------------------------------------------------- */

// Document order sorting sortOrder = hasCompare ? function( a, b ) {

// Flag for duplicate removal if ( a === b ) { hasDuplicate = true; return 0; }

// Sort on method existence if only one input has compareDocumentPosition var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; if ( compare ) { return compare; }

// Calculate position if both inputs belong to the same document compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? a.compareDocumentPosition( b ) :

// Otherwise we know they are disconnected 1;

// Disconnected nodes if ( compare & 1 || (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {

// Choose the first element that is related to our preferred document if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { return -1; } if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { return 1; }

// Maintain original order return sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; }

return compare & 4 ? -1 : 1; } : function( a, b ) { // Exit early if the nodes are identical if ( a === b ) { hasDuplicate = true; return 0; }

var cur, i = 0, aup = a.parentNode, bup = b.parentNode, ap = [ a ], bp = [ b ];

// Parentless nodes are either documents or disconnected if ( !aup || !bup ) { return a === document ? -1 : b === document ? 1 : aup ? -1 : bup ? 1 : sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0;

// If the nodes are siblings, we can do a quick check } else if ( aup === bup ) { return siblingCheck( a, b ); }

// Otherwise we need full lists of their ancestors for comparison cur = a; while ( (cur = cur.parentNode) ) { ap.unshift( cur ); } cur = b; while ( (cur = cur.parentNode) ) { bp.unshift( cur ); }

// Walk down the tree looking for a discrepancy while ( ap[i] === bp[i] ) { i++; }

return i ? // Do a sibling check if the nodes have a common ancestor siblingCheck( ap[i], bp[i] ) :

// Otherwise nodes in our document sort first ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0; };

return document; };

Sizzle.matches = function( expr, elements ) { return Sizzle( expr, null, null, elements ); };

Sizzle.matchesSelector = function( elem, expr ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); }

// Make sure that attribute selectors are quoted expr = expr.replace( rattributeQuotes, "='$1']" );

if ( support.matchesSelector && documentIsHTML && !compilerCache[ expr + " " ] && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {

try { var ret = matches.call( elem, expr );

// IE 9's matchesSelector returns false on disconnected nodes if ( ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9 elem.document && elem.document.nodeType !== 11 ) { return ret; } } catch (e) {} }

return Sizzle( expr, document, null, [ elem ] ).length > 0; };

Sizzle.contains = function( context, elem ) { // Set document vars if needed if ( ( context.ownerDocument || context ) !== document ) { setDocument( context ); } return contains( context, elem ); };

Sizzle.attr = function( elem, name ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); }

var fn = Expr.attrHandle[ name.toLowerCase() ], // Don't get fooled by Object.prototype properties (jQuery #13807) val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, !documentIsHTML ) : undefined;

return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute( name ) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null; };

Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); };

/**

* Document sorting and removing duplicates
* @param {ArrayLike} results
*/

Sizzle.uniqueSort = function( results ) { var elem, duplicates = [], j = 0, i = 0;

// Unless we *know* we can detect duplicates, assume their presence hasDuplicate = !support.detectDuplicates; sortInput = !support.sortStable && results.slice( 0 ); results.sort( sortOrder );

if ( hasDuplicate ) { while ( (elem = results[i++]) ) { if ( elem === results[ i ] ) { j = duplicates.push( i ); } } while ( j-- ) { results.splice( duplicates[ j ], 1 ); } }

// Clear input after sorting to release objects // See https://github.com/jquery/sizzle/pull/225 sortInput = null;

return results; };

/**

* Utility function for retrieving the text value of an array of DOM nodes
* @param {Array|Element} elem
*/

getText = Sizzle.getText = function( elem ) { var node, ret = "", i = 0, nodeType = elem.nodeType;

if ( !nodeType ) { // If no nodeType, this is expected to be an array while ( (node = elem[i++]) ) { // Do not traverse comment nodes ret += getText( node ); } } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent for elements // innerText usage removed for consistency of new lines (jQuery #11153) if ( typeof elem.textContent === "string" ) { return elem.textContent; } else { // Traverse its children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } // Do not include comment or processing instruction nodes

return ret; };

Expr = Sizzle.selectors = {

// Can be adjusted by the user cacheLength: 50,

createPseudo: markFunction,

match: matchExpr,

attrHandle: {},

find: {},

relative: { ">": { dir: "parentNode", first: true }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: true }, "~": { dir: "previousSibling" } },

preFilter: { "ATTR": function( match ) { match[1] = match[1].replace( runescape, funescape );

// Move the given value to match[3] whether quoted or unquoted match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );

if ( match[2] === "~=" ) { match[3] = " " + match[3] + " "; }

return match.slice( 0, 4 ); },

"CHILD": function( match ) { /* matches from matchExpr["CHILD"] 1 type (only|nth|...) 2 what (child|of-type) 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 4 xn-component of xn+y argument ([+-]?\d*n|) 5 sign of xn-component 6 x of xn-component 7 sign of y-component 8 y of y-component */ match[1] = match[1].toLowerCase();

if ( match[1].slice( 0, 3 ) === "nth" ) { // nth-* requires argument if ( !match[3] ) { Sizzle.error( match[0] ); }

// numeric x and y parameters for Expr.filter.CHILD // remember that false/true cast respectively to 0/1 match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );

// other types prohibit arguments } else if ( match[3] ) { Sizzle.error( match[0] ); }

return match; },

"PSEUDO": function( match ) { var excess, unquoted = !match[6] && match[2];

if ( matchExpr["CHILD"].test( match[0] ) ) { return null; }

// Accept quoted arguments as-is if ( match[3] ) { match[2] = match[4] || match[5] || "";

// Strip excess characters from unquoted arguments } else if ( unquoted && rpseudo.test( unquoted ) && // Get excess from tokenize (recursively) (excess = tokenize( unquoted, true )) && // advance to the next closing parenthesis (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {

// excess is a negative index match[0] = match[0].slice( 0, excess ); match[2] = unquoted.slice( 0, excess ); }

// Return only captures needed by the pseudo filter method (type and argument) return match.slice( 0, 3 ); } },

filter: {

"TAG": function( nodeNameSelector ) { var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? function() { return true; } : function( elem ) { return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; }; },

"CLASS": function( className ) { var pattern = classCache[ className + " " ];

return pattern || (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && classCache( className, function( elem ) { return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); }); },

"ATTR": function( name, operator, check ) { return function( elem ) { var result = Sizzle.attr( elem, name );

if ( result == null ) { return operator === "!="; } if ( !operator ) { return true; }

result += "";

return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf( check ) === 0 : operator === "*=" ? check && result.indexOf( check ) > -1 : operator === "$=" ? check && result.slice( -check.length ) === check : operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : false; }; },

"CHILD": function( type, what, argument, first, last ) { var simple = type.slice( 0, 3 ) !== "nth", forward = type.slice( -4 ) !== "last", ofType = what === "of-type";

return first === 1 && last === 0 ?

// Shortcut for :nth-*(n) function( elem ) { return !!elem.parentNode; } :

function( elem, context, xml ) { var cache, uniqueCache, outerCache, node, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType, diff = false;

if ( parent ) {

// :(first|last|only)-(child|of-type) if ( simple ) { while ( dir ) { node = elem; while ( (node = node[ dir ]) ) { if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {

return false; } } // Reverse direction for :only-* (if we haven't yet done so) start = dir = type === "only" && !start && "nextSibling"; } return true; }

start = [ forward ? parent.firstChild : parent.lastChild ];

// non-xml :nth-child(...) stores cache data on `parent` if ( forward && useCache ) {

// Seek `elem` from a previously-cached index

// ...in a gzip-friendly way node = parent; outerCache = node[ expando ] || (node[ expando ] = {});

// Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || (outerCache[ node.uniqueID ] = {});

cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex && cache[ 2 ]; node = nodeIndex && parent.childNodes[ nodeIndex ];

while ( (node = ++nodeIndex && node && node[ dir ] ||

// Fallback to seeking `elem` from the start (diff = nodeIndex = 0) || start.pop()) ) {

// When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } }

} else { // Use previously-cached element index if available if ( useCache ) { // ...in a gzip-friendly way node = elem; outerCache = node[ expando ] || (node[ expando ] = {});

// Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || (outerCache[ node.uniqueID ] = {});

cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex; }

// xml :nth-child(...) // or :nth-last-child(...) or :nth(-last)?-of-type(...) if ( diff === false ) { // Use the same loop as above to seek `elem` from the start while ( (node = ++nodeIndex && node && node[ dir ] || (diff = nodeIndex = 0) || start.pop()) ) {

if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {

// Cache the index of each encountered element if ( useCache ) { outerCache = node[ expando ] || (node[ expando ] = {});

// Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || (outerCache[ node.uniqueID ] = {});

uniqueCache[ type ] = [ dirruns, diff ]; }

if ( node === elem ) { break; } } } } }

// Incorporate the offset, then check against cycle size diff -= last; return diff === first || ( diff % first === 0 && diff / first >= 0 ); } }; },

"PSEUDO": function( pseudo, argument ) { // pseudo-class names are case-insensitive // http://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos var args, fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || Sizzle.error( "unsupported pseudo: " + pseudo );

// The user may use createPseudo to indicate that // arguments are needed to create the filter function // just as Sizzle does if ( fn[ expando ] ) { return fn( argument ); }

// But maintain support for old signatures if ( fn.length > 1 ) { args = [ pseudo, pseudo, "", argument ]; return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? markFunction(function( seed, matches ) { var idx, matched = fn( seed, argument ), i = matched.length; while ( i-- ) { idx = indexOf( seed, matched[i] ); seed[ idx ] = !( matches[ idx ] = matched[i] ); } }) : function( elem ) { return fn( elem, 0, args ); }; }

return fn; } },

pseudos: { // Potentially complex pseudos "not": markFunction(function( selector ) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], matcher = compile( selector.replace( rtrim, "$1" ) );

return matcher[ expando ] ? markFunction(function( seed, matches, context, xml ) { var elem, unmatched = matcher( seed, null, xml, [] ), i = seed.length;

// Match elements unmatched by `matcher` while ( i-- ) { if ( (elem = unmatched[i]) ) { seed[i] = !(matches[i] = elem); } } }) : function( elem, context, xml ) { input[0] = elem; matcher( input, null, xml, results ); // Don't keep the element (issue #299) input[0] = null; return !results.pop(); }; }),

"has": markFunction(function( selector ) { return function( elem ) { return Sizzle( selector, elem ).length > 0; }; }),

"contains": markFunction(function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; }; }),

// "Whether an element is represented by a :lang() selector // is based solely on the element's language value // being equal to the identifier C, // or beginning with the identifier C immediately followed by "-". // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." // http://www.w3.org/TR/selectors/#lang-pseudo "lang": markFunction( function( lang ) { // lang value must be a valid identifier if ( !ridentifier.test(lang || "") ) { Sizzle.error( "unsupported lang: " + lang ); } lang = lang.replace( runescape, funescape ).toLowerCase(); return function( elem ) { var elemLang; do { if ( (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {

elemLang = elemLang.toLowerCase(); return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; } } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); return false; }; }),

// Miscellaneous "target": function( elem ) { var hash = window.location && window.location.hash; return hash && hash.slice( 1 ) === elem.id; },

"root": function( elem ) { return elem === docElem; },

"focus": function( elem ) { return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); },

// Boolean properties "enabled": function( elem ) { return elem.disabled === false; },

"disabled": function( elem ) { return elem.disabled === true; },

"checked": function( elem ) { // In CSS3, :checked should return both checked and selected elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked var nodeName = elem.nodeName.toLowerCase(); return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); },

"selected": function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; }

return elem.selected === true; },

// Contents "empty": function( elem ) { // http://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) // nodeType < 6 works because attributes (2) do not appear as children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { if ( elem.nodeType < 6 ) { return false; } } return true; },

"parent": function( elem ) { return !Expr.pseudos["empty"]( elem ); },

// Element/input types "header": function( elem ) { return rheader.test( elem.nodeName ); },

"input": function( elem ) { return rinputs.test( elem.nodeName ); },

"button": function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === "button" || name === "button"; },

"text": function( elem ) { var attr; return elem.nodeName.toLowerCase() === "input" && elem.type === "text" &&

// Support: IE<8 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); },

// Position-in-collection "first": createPositionalPseudo(function() { return [ 0 ]; }),

"last": createPositionalPseudo(function( matchIndexes, length ) { return [ length - 1 ]; }),

"eq": createPositionalPseudo(function( matchIndexes, length, argument ) { return [ argument < 0 ? argument + length : argument ]; }),

"even": createPositionalPseudo(function( matchIndexes, length ) { var i = 0; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }),

"odd": createPositionalPseudo(function( matchIndexes, length ) { var i = 1; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }),

"lt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; --i >= 0; ) { matchIndexes.push( i ); } return matchIndexes; }),

"gt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; ++i < length; ) { matchIndexes.push( i ); } return matchIndexes; }) } };

Expr.pseudos["nth"] = Expr.pseudos["eq"];

// Add button/input type pseudos for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { Expr.pseudos[ i ] = createInputPseudo( i ); } for ( i in { submit: true, reset: true } ) { Expr.pseudos[ i ] = createButtonPseudo( i ); }

// Easy API for creating new setFilters function setFilters() {} setFilters.prototype = Expr.filters = Expr.pseudos; Expr.setFilters = new setFilters();

tokenize = Sizzle.tokenize = function( selector, parseOnly ) { var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[ selector + " " ];

if ( cached ) { return parseOnly ? 0 : cached.slice( 0 ); }

soFar = selector; groups = []; preFilters = Expr.preFilter;

while ( soFar ) {

// Comma and first run if ( !matched || (match = rcomma.exec( soFar )) ) { if ( match ) { // Don't consume trailing commas as valid soFar = soFar.slice( match[0].length ) || soFar; } groups.push( (tokens = []) ); }

matched = false;

// Combinators if ( (match = rcombinators.exec( soFar )) ) { matched = match.shift(); tokens.push({ value: matched, // Cast descendant combinators to space type: match[0].replace( rtrim, " " ) }); soFar = soFar.slice( matched.length ); }

// Filters for ( type in Expr.filter ) { if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || (match = preFilters[ type ]( match ))) ) { matched = match.shift(); tokens.push({ value: matched, type: type, matches: match }); soFar = soFar.slice( matched.length ); } }

if ( !matched ) { break; } }

// Return the length of the invalid excess // if we're just parsing // Otherwise, throw an error or return tokens return parseOnly ? soFar.length : soFar ? Sizzle.error( selector ) : // Cache the tokens tokenCache( selector, groups ).slice( 0 ); };

function toSelector( tokens ) { var i = 0, len = tokens.length, selector = ""; for ( ; i < len; i++ ) { selector += tokens[i].value; } return selector; }

function addCombinator( matcher, combinator, base ) { var dir = combinator.dir, checkNonElements = base && dir === "parentNode", doneName = done++;

return combinator.first ? // Check against closest ancestor/preceding element function( elem, context, xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { return matcher( elem, context, xml ); } } } :

// Check against all ancestor/preceding elements function( elem, context, xml ) { var oldCache, uniqueCache, outerCache, newCache = [ dirruns, doneName ];

// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching if ( xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { if ( matcher( elem, context, xml ) ) { return true; } } } } else { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || (elem[ expando ] = {});

// Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});

if ( (oldCache = uniqueCache[ dir ]) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {

// Assign to newCache so results back-propagate to previous elements return (newCache[ 2 ] = oldCache[ 2 ]); } else { // Reuse newcache so results back-propagate to previous elements uniqueCache[ dir ] = newCache;

// A match means we're done; a fail means we have to keep checking if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { return true; } } } } } }; }

function elementMatcher( matchers ) { return matchers.length > 1 ? function( elem, context, xml ) { var i = matchers.length; while ( i-- ) { if ( !matchers[i]( elem, context, xml ) ) { return false; } } return true; } : matchers[0]; }

function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; for ( ; i < len; i++ ) { Sizzle( selector, contexts[i], results ); } return results; }

function condense( unmatched, map, filter, context, xml ) { var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = map != null;

for ( ; i < len; i++ ) { if ( (elem = unmatched[i]) ) { if ( !filter || filter( elem, context, xml ) ) { newUnmatched.push( elem ); if ( mapped ) { map.push( i ); } } } }

return newUnmatched; }

function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { if ( postFilter && !postFilter[ expando ] ) { postFilter = setMatcher( postFilter ); } if ( postFinder && !postFinder[ expando ] ) { postFinder = setMatcher( postFinder, postSelector ); } return markFunction(function( seed, results, context, xml ) { var temp, i, elem, preMap = [], postMap = [], preexisting = results.length,

// Get initial elements from seed or context elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),

// Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? condense( elems, preMap, preFilter, context, xml ) : elems,

matcherOut = matcher ? // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, postFinder || ( seed ? preFilter : preexisting || postFilter ) ?

// ...intermediate processing is necessary [] :

// ...otherwise use results directly results : matcherIn;

// Find primary matches if ( matcher ) { matcher( matcherIn, matcherOut, context, xml ); }

// Apply postFilter if ( postFilter ) { temp = condense( matcherOut, postMap ); postFilter( temp, [], context, xml );

// Un-match failing elements by moving them back to matcherIn i = temp.length; while ( i-- ) { if ( (elem = temp[i]) ) { matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); } } }

if ( seed ) { if ( postFinder || preFilter ) { if ( postFinder ) { // Get the final matcherOut by condensing this intermediate into postFinder contexts temp = []; i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) ) { // Restore matcherIn since elem is not yet a final match temp.push( (matcherIn[i] = elem) ); } } postFinder( null, (matcherOut = []), temp, xml ); }

// Move matched elements from seed to results to keep them synchronized i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) && (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {

seed[temp] = !(results[temp] = elem); } } }

// Add elements to results, through postFinder if defined } else { matcherOut = condense( matcherOut === results ? matcherOut.splice( preexisting, matcherOut.length ) : matcherOut ); if ( postFinder ) { postFinder( null, results, matcherOut, xml ); } else { push.apply( results, matcherOut ); } } }); }

function matcherFromTokens( tokens ) { var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[ tokens[0].type ], implicitRelative = leadingRelative || Expr.relative[" "], i = leadingRelative ? 1 : 0,

// The foundational matcher ensures that elements are reachable from top-level context(s) matchContext = addCombinator( function( elem ) { return elem === checkContext; }, implicitRelative, true ), matchAnyContext = addCombinator( function( elem ) { return indexOf( checkContext, elem ) > -1; }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( (checkContext = context).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); // Avoid hanging onto element (issue #299) checkContext = null; return ret; } ];

for ( ; i < len; i++ ) { if ( (matcher = Expr.relative[ tokens[i].type ]) ) { matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; } else { matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );

// Return special upon seeing a positional matcher if ( matcher[ expando ] ) { // Find the next relative operator (if any) for proper handling j = ++i; for ( ; j < len; j++ ) { if ( Expr.relative[ tokens[j].type ] ) { break; } } return setMatcher( i > 1 && elementMatcher( matchers ), i > 1 && toSelector( // If the preceding token was a descendant combinator, insert an implicit any-element `*` tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) ).replace( rtrim, "$1" ), matcher, i < j && matcherFromTokens( tokens.slice( i, j ) ), j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), j < len && toSelector( tokens ) ); } matchers.push( matcher ); } }

return elementMatcher( matchers ); }

function matcherFromGroupMatchers( elementMatchers, setMatchers ) { var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function( seed, context, xml, results, outermost ) { var elem, j, matcher, matchedCount = 0, i = "0", unmatched = seed && [], setMatched = [], contextBackup = outermostContext, // We must always have either seed elements or outermost context elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), // Use integer dirruns iff this is the outermost matcher dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), len = elems.length;

if ( outermost ) { outermostContext = context === document || context || outermost; }

// Add elements passing elementMatchers directly to results // Support: IE<9, Safari // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id for ( ; i !== len && (elem = elems[i]) != null; i++ ) { if ( byElement && elem ) { j = 0; if ( !context && elem.ownerDocument !== document ) { setDocument( elem ); xml = !documentIsHTML; } while ( (matcher = elementMatchers[j++]) ) { if ( matcher( elem, context || document, xml) ) { results.push( elem ); break; } } if ( outermost ) { dirruns = dirrunsUnique; } }

// Track unmatched elements for set filters if ( bySet ) { // They will have gone through all possible matchers if ( (elem = !matcher && elem) ) { matchedCount--; }

// Lengthen the array for every element, matched or not if ( seed ) { unmatched.push( elem ); } } }

// `i` is now the count of elements visited above, and adding it to `matchedCount` // makes the latter nonnegative. matchedCount += i;

// Apply set filters to unmatched elements // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` // equals `i`), unless we didn't visit _any_ elements in the above loop because we have // no element matchers and no seed. // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that // case, which will result in a "00" `matchedCount` that differs from `i` but is also // numerically zero. if ( bySet && i !== matchedCount ) { j = 0; while ( (matcher = setMatchers[j++]) ) { matcher( unmatched, setMatched, context, xml ); }

if ( seed ) { // Reintegrate element matches to eliminate the need for sorting if ( matchedCount > 0 ) { while ( i-- ) { if ( !(unmatched[i] || setMatched[i]) ) { setMatched[i] = pop.call( results ); } } }

// Discard index placeholder values to get only actual matches setMatched = condense( setMatched ); }

// Add matches to results push.apply( results, setMatched );

// Seedless set matches succeeding multiple successful matchers stipulate sorting if ( outermost && !seed && setMatched.length > 0 && ( matchedCount + setMatchers.length ) > 1 ) {

Sizzle.uniqueSort( results ); } }

// Override manipulation of globals by nested matchers if ( outermost ) { dirruns = dirrunsUnique; outermostContext = contextBackup; }

return unmatched; };

return bySet ? markFunction( superMatcher ) : superMatcher; }

compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { var i, setMatchers = [], elementMatchers = [], cached = compilerCache[ selector + " " ];

if ( !cached ) { // Generate a function of recursive functions that can be used to check each element if ( !match ) { match = tokenize( selector ); } i = match.length; while ( i-- ) { cached = matcherFromTokens( match[i] ); if ( cached[ expando ] ) { setMatchers.push( cached ); } else { elementMatchers.push( cached ); } }

// Cache the compiled function cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );

// Save selector and tokenization cached.selector = selector; } return cached; };

/**

* A low-level selection function that works with Sizzle's compiled
*  selector functions
* @param {String|Function} selector A selector or a pre-compiled
*  selector function built with Sizzle.compile
* @param {Element} context
* @param {Array} [results]
* @param {Array} [seed] A set of elements to match against
*/

select = Sizzle.select = function( selector, context, results, seed ) { var i, tokens, token, type, find, compiled = typeof selector === "function" && selector, match = !seed && tokenize( (selector = compiled.selector || selector) );

results = results || [];

// Try to minimize operations if there is only one selector in the list and no seed // (the latter of which guarantees us context) if ( match.length === 1 ) {

// Reduce context if the leading compound selector is an ID tokens = match[0] = match[0].slice( 0 ); if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && support.getById && context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {

context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; if ( !context ) { return results;

// Precompiled matchers will still verify ancestry, so step up a level } else if ( compiled ) { context = context.parentNode; }

selector = selector.slice( tokens.shift().value.length ); }

// Fetch a seed set for right-to-left matching i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; while ( i-- ) { token = tokens[i];

// Abort if we hit a combinator if ( Expr.relative[ (type = token.type) ] ) { break; } if ( (find = Expr.find[ type ]) ) { // Search, expanding context for leading sibling combinators if ( (seed = find( token.matches[0].replace( runescape, funescape ), rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context )) ) {

// If seed is empty or no tokens remain, we can return early tokens.splice( i, 1 ); selector = seed.length && toSelector( tokens ); if ( !selector ) { push.apply( results, seed ); return results; }

break; } } } }

// Compile and execute a filtering function if one is not provided // Provide `match` to avoid retokenization if we modified the selector above ( compiled || compile( selector, match ) )( seed, context, !documentIsHTML, results, !context || rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; };

// One-time assignments

// Sort stability support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;

// Support: Chrome 14-35+ // Always assume duplicates if they aren't passed to the comparison function support.detectDuplicates = !!hasDuplicate;

// Initialize against the default document setDocument();

// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Detached nodes confoundingly follow *each other* support.sortDetached = assert(function( div1 ) { // Should return 1, but returns 4 (following) return div1.compareDocumentPosition( document.createElement("div") ) & 1; });

// Support: IE<8 // Prevent attribute/property "interpolation" // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx if ( !assert(function( div ) { div.innerHTML = "<a href='#'></a>"; return div.firstChild.getAttribute("href") === "#" ; }) ) { addHandle( "type|href|height|width", function( elem, name, isXML ) { if ( !isXML ) { return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); } }); }

// Support: IE<9 // Use defaultValue in place of getAttribute("value") if ( !support.attributes || !assert(function( div ) { div.innerHTML = "<input/>"; div.firstChild.setAttribute( "value", "" ); return div.firstChild.getAttribute( "value" ) === ""; }) ) { addHandle( "value", function( elem, name, isXML ) { if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { return elem.defaultValue; } }); }

// Support: IE<9 // Use getAttributeNode to fetch booleans when getAttribute lies if ( !assert(function( div ) { return div.getAttribute("disabled") == null; }) ) { addHandle( booleans, function( elem, name, isXML ) { var val; if ( !isXML ) { return elem[ name ] === true ? name.toLowerCase() : (val = elem.getAttributeNode( name )) && val.specified ? val.value : null; } }); }

return Sizzle;

})( window );


jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[ ":" ] = jQuery.expr.pseudos; jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains;


var dir = function( elem, dir, until ) { var matched = [], truncate = until !== undefined;

while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { if ( elem.nodeType === 1 ) { if ( truncate && jQuery( elem ).is( until ) ) { break; } matched.push( elem ); } } return matched; };


var siblings = function( n, elem ) { var matched = [];

for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { matched.push( n ); } }

return matched; };


var rneedsContext = jQuery.expr.match.needsContext;

var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );


var risSimple = /^.[^:#\[\.,]*$/;

// Implement the identical functionality for filter and not function winnow( elements, qualifier, not ) { if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep( elements, function( elem, i ) { /* jshint -W018 */ return !!qualifier.call( elem, i, elem ) !== not; } );

}

if ( qualifier.nodeType ) { return jQuery.grep( elements, function( elem ) { return ( elem === qualifier ) !== not; } );

}

if ( typeof qualifier === "string" ) { if ( risSimple.test( qualifier ) ) { return jQuery.filter( qualifier, elements, not ); }

qualifier = jQuery.filter( qualifier, elements ); }

return jQuery.grep( elements, function( elem ) { return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not; } ); }

jQuery.filter = function( expr, elems, not ) { var elem = elems[ 0 ];

if ( not ) { expr = ":not(" + expr + ")"; }

return elems.length === 1 && elem.nodeType === 1 ? jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { return elem.nodeType === 1; } ) ); };

jQuery.fn.extend( { find: function( selector ) { var i, ret = [], self = this, len = self.length;

if ( typeof selector !== "string" ) { return this.pushStack( jQuery( selector ).filter( function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } } ) ); }

for ( i = 0; i < len; i++ ) { jQuery.find( selector, self[ i ], ret ); }

// Needed because $( selector, context ) becomes $( context ).find( selector ) ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); ret.selector = this.selector ? this.selector + " " + selector : selector; return ret; }, filter: function( selector ) { return this.pushStack( winnow( this, selector || [], false ) ); }, not: function( selector ) { return this.pushStack( winnow( this, selector || [], true ) ); }, is: function( selector ) { return !!winnow( this,

// If this is a positional/relative selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". typeof selector === "string" && rneedsContext.test( selector ) ? jQuery( selector ) : selector || [], false ).length; } } );


// Initialize a jQuery object


// A central reference to the root jQuery(document) var rootjQuery,

// A simple way to check for HTML strings // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,

init = jQuery.fn.init = function( selector, context, root ) { var match, elem;

// HANDLE: $(""), $(null), $(undefined), $(false) if ( !selector ) { return this; }

// init accepts an alternate rootjQuery // so migrate can support jQuery.sub (gh-2101) root = root || rootjQuery;

// Handle HTML strings if ( typeof selector === "string" ) { if ( selector.charAt( 0 ) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {

// Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ];

} else { match = rquickExpr.exec( selector ); }

// Match html or make sure no context is specified for #id if ( match && ( match[ 1 ] || !context ) ) {

// HANDLE: $(html) -> $(array) if ( match[ 1 ] ) { context = context instanceof jQuery ? context[ 0 ] : context;

// scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present jQuery.merge( this, jQuery.parseHTML( match[ 1 ], context && context.nodeType ? context.ownerDocument || context : document, true ) );

// HANDLE: $(html, props) if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { for ( match in context ) {

// Properties of context are called as methods if possible if ( jQuery.isFunction( this[ match ] ) ) { this[ match ]( context[ match ] );

// ...and otherwise set as attributes } else { this.attr( match, context[ match ] ); } } }

return this;

// HANDLE: $(#id) } else { elem = document.getElementById( match[ 2 ] );

// Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) {

// Handle the case where IE and Opera return items // by name instead of ID if ( elem.id !== match[ 2 ] ) { return rootjQuery.find( selector ); }

// Otherwise, we inject the element directly into the jQuery object this.length = 1; this[ 0 ] = elem; }

this.context = document; this.selector = selector; return this; }

// HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || root ).find( selector );

// HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); }

// HANDLE: $(DOMElement) } else if ( selector.nodeType ) { this.context = this[ 0 ] = selector; this.length = 1; return this;

// HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return typeof root.ready !== "undefined" ? root.ready( selector ) :

// Execute immediately if ready is not present selector( jQuery ); }

if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; }

return jQuery.makeArray( selector, this ); };

// Give the init function the jQuery prototype for later instantiation init.prototype = jQuery.fn;

// Initialize central reference rootjQuery = jQuery( document );


var rparentsprev = /^(?:parents|prev(?:Until|All))/,

// methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true };

jQuery.fn.extend( { has: function( target ) { var i, targets = jQuery( target, this ), len = targets.length;

return this.filter( function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( this, targets[ i ] ) ) { return true; } } } ); },

closest: function( selectors, context ) { var cur, i = 0, l = this.length, matched = [], pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? jQuery( selectors, context || this.context ) : 0;

for ( ; i < l; i++ ) { for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {

// Always skip document fragments if ( cur.nodeType < 11 && ( pos ? pos.index( cur ) > -1 :

// Don't pass non-elements to Sizzle cur.nodeType === 1 && jQuery.find.matchesSelector( cur, selectors ) ) ) {

matched.push( cur ); break; } } }

return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); },

// Determine the position of an element within // the matched set of elements index: function( elem ) {

// No argument, return index in parent if ( !elem ) { return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; }

// index in selector if ( typeof elem === "string" ) { return jQuery.inArray( this[ 0 ], jQuery( elem ) ); }

// Locate the position of the desired element return jQuery.inArray(

// If it receives a jQuery object, the first element is used elem.jquery ? elem[ 0 ] : elem, this ); },

add: function( selector, context ) { return this.pushStack( jQuery.uniqueSort( jQuery.merge( this.get(), jQuery( selector, context ) ) ) ); },

addBack: function( selector ) { return this.add( selector == null ? this.prevObject : this.prevObject.filter( selector ) ); } } );

function sibling( cur, dir ) { do { cur = cur[ dir ]; } while ( cur && cur.nodeType !== 1 );

return cur; }

jQuery.each( { parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return dir( elem, "parentNode", until ); }, next: function( elem ) { return sibling( elem, "nextSibling" ); }, prev: function( elem ) { return sibling( elem, "previousSibling" ); }, nextAll: function( elem ) { return dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return siblings( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return siblings( elem.firstChild ); }, contents: function( elem ) { return jQuery.nodeName( elem, "iframe" ) ? elem.contentDocument || elem.contentWindow.document : jQuery.merge( [], elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var ret = jQuery.map( this, fn, until );

if ( name.slice( -5 ) !== "Until" ) { selector = until; }

if ( selector && typeof selector === "string" ) { ret = jQuery.filter( selector, ret ); }

if ( this.length > 1 ) {

// Remove duplicates if ( !guaranteedUnique[ name ] ) { ret = jQuery.uniqueSort( ret ); }

// Reverse order for parents* and prev-derivatives if ( rparentsprev.test( name ) ) { ret = ret.reverse(); } }

return this.pushStack( ret ); }; } ); var rnotwhite = ( /\S+/g );


// Convert String-formatted options into Object-formatted ones function createOptions( options ) { var object = {}; jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { object[ flag ] = true; } ); return object; }

/*

* Create a callback list using the following parameters:
*
*	options: an optional list of space-separated options that will change how
*			the callback list behaves or a more traditional option object
*
* By default a callback list will act like an event callback list and can be
* "fired" multiple times.
*
* Possible options:
*
*	once:			will ensure the callback list can only be fired once (like a Deferred)
*
*	memory:			will keep track of previous values and will call any callback added
*					after the list has been fired right away with the latest "memorized"
*					values (like a Deferred)
*
*	unique:			will ensure a callback can only be added once (no duplicate in the list)
*
*	stopOnFalse:	interrupt callings when a callback returns false
*
*/

jQuery.Callbacks = function( options ) {

// Convert options from String-formatted to Object-formatted if needed // (we check in cache first) options = typeof options === "string" ? createOptions( options ) : jQuery.extend( {}, options );

var // Flag to know if list is currently firing firing,

// Last fire value for non-forgettable lists memory,

// Flag to know if list was already fired fired,

// Flag to prevent firing locked,

// Actual callback list list = [],

// Queue of execution data for repeatable lists queue = [],

// Index of currently firing callback (modified by add/remove as needed) firingIndex = -1,

// Fire callbacks fire = function() {

// Enforce single-firing locked = options.once;

// Execute callbacks for all pending executions, // respecting firingIndex overrides and runtime changes fired = firing = true; for ( ; queue.length; firingIndex = -1 ) { memory = queue.shift(); while ( ++firingIndex < list.length ) {

// Run callback and check for early termination if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && options.stopOnFalse ) {

// Jump to end and forget the data so .add doesn't re-fire firingIndex = list.length; memory = false; } } }

// Forget the data if we're done with it if ( !options.memory ) { memory = false; }

firing = false;

// Clean up if we're done firing for good if ( locked ) {

// Keep an empty list if we have data for future add calls if ( memory ) { list = [];

// Otherwise, this object is spent } else { list = ""; } } },

// Actual Callbacks object self = {

// Add a callback or a collection of callbacks to the list add: function() { if ( list ) {

// If we have memory from a past run, we should fire after adding if ( memory && !firing ) { firingIndex = list.length - 1; queue.push( memory ); }

( function add( args ) { jQuery.each( args, function( _, arg ) { if ( jQuery.isFunction( arg ) ) { if ( !options.unique || !self.has( arg ) ) { list.push( arg ); } } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {

// Inspect recursively add( arg ); } } ); } )( arguments );

if ( memory && !firing ) { fire(); } } return this; },

// Remove a callback from the list remove: function() { jQuery.each( arguments, function( _, arg ) { var index; while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { list.splice( index, 1 );

// Handle firing indexes if ( index <= firingIndex ) { firingIndex--; } } } ); return this; },

// Check if a given callback is in the list. // If no argument is given, return whether or not list has callbacks attached. has: function( fn ) { return fn ? jQuery.inArray( fn, list ) > -1 : list.length > 0; },

// Remove all callbacks from the list empty: function() { if ( list ) { list = []; } return this; },

// Disable .fire and .add // Abort any current/pending executions // Clear all callbacks and values disable: function() { locked = queue = []; list = memory = ""; return this; }, disabled: function() { return !list; },

// Disable .fire // Also disable .add unless we have memory (since it would have no effect) // Abort any pending executions lock: function() { locked = true; if ( !memory ) { self.disable(); } return this; }, locked: function() { return !!locked; },

// Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( !locked ) { args = args || []; args = [ context, args.slice ? args.slice() : args ]; queue.push( args ); if ( !firing ) { fire(); } } return this; },

// Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; },

// To know if the callbacks have already been called at least once fired: function() { return !!fired; } };

return self; };


jQuery.extend( {

Deferred: function( func ) { var tuples = [

// action, add listener, listener list, final state [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], [ "notify", "progress", jQuery.Callbacks( "memory" ) ] ], state = "pending", promise = { state: function() { return state; }, always: function() { deferred.done( arguments ).fail( arguments ); return this; }, then: function( /* fnDone, fnFail, fnProgress */ ) { var fns = arguments; return jQuery.Deferred( function( newDefer ) { jQuery.each( tuples, function( i, tuple ) { var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];

// deferred[ done | fail | progress ] for forwarding actions to newDefer deferred[ tuple[ 1 ] ]( function() { var returned = fn && fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise() .progress( newDefer.notify ) .done( newDefer.resolve ) .fail( newDefer.reject ); } else { newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); } } ); } ); fns = null; } ).promise(); },

// Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { return obj != null ? jQuery.extend( obj, promise ) : promise; } }, deferred = {};

// Keep pipe for back-compat promise.pipe = promise.then;

// Add list-specific methods jQuery.each( tuples, function( i, tuple ) { var list = tuple[ 2 ], stateString = tuple[ 3 ];

// promise[ done | fail | progress ] = list.add promise[ tuple[ 1 ] ] = list.add;

// Handle state if ( stateString ) { list.add( function() {

// state = [ resolved | rejected ] state = stateString;

// [ reject_list | resolve_list ].disable; progress_list.lock }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); }

// deferred[ resolve | reject | notify ] deferred[ tuple[ 0 ] ] = function() { deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); return this; }; deferred[ tuple[ 0 ] + "With" ] = list.fireWith; } );

// Make the deferred a promise promise.promise( deferred );

// Call given func if any if ( func ) { func.call( deferred, deferred ); }

// All done! return deferred; },

// Deferred helper when: function( subordinate /* , ..., subordinateN */ ) { var i = 0, resolveValues = slice.call( arguments ), length = resolveValues.length,

// the count of uncompleted subordinates remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,

// the master Deferred. // If resolveValues consist of only a single Deferred, just use that. deferred = remaining === 1 ? subordinate : jQuery.Deferred(),

// Update function for both resolve and progress values updateFunc = function( i, contexts, values ) { return function( value ) { contexts[ i ] = this; values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; if ( values === progressValues ) { deferred.notifyWith( contexts, values );

} else if ( !( --remaining ) ) { deferred.resolveWith( contexts, values ); } }; },

progressValues, progressContexts, resolveContexts;

// add listeners to Deferred subordinates; treat others as resolved if ( length > 1 ) { progressValues = new Array( length ); progressContexts = new Array( length ); resolveContexts = new Array( length ); for ( ; i < length; i++ ) { if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { resolveValues[ i ].promise() .progress( updateFunc( i, progressContexts, progressValues ) ) .done( updateFunc( i, resolveContexts, resolveValues ) ) .fail( deferred.reject ); } else { --remaining; } } }

// if we're not waiting on anything, resolve the master if ( !remaining ) { deferred.resolveWith( resolveContexts, resolveValues ); }

return deferred.promise(); } } );


// The deferred used on DOM ready var readyList;

jQuery.fn.ready = function( fn ) {

// Add the callback jQuery.ready.promise().done( fn );

return this; };

jQuery.extend( {

// Is the DOM ready to be used? Set to true once it occurs. isReady: false,

// A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1,

// Hold (or release) the ready event holdReady: function( hold ) { if ( hold ) { jQuery.readyWait++; } else { jQuery.ready( true ); } },

// Handle when the DOM is ready ready: function( wait ) {

// Abort if there are pending holds or we're already ready if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { return; }

// Remember that the DOM is ready jQuery.isReady = true;

// If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; }

// If there are functions bound, to execute readyList.resolveWith( document, [ jQuery ] );

// Trigger any bound ready events if ( jQuery.fn.triggerHandler ) { jQuery( document ).triggerHandler( "ready" ); jQuery( document ).off( "ready" ); } } } );

/**

* Clean-up method for dom ready events
*/

function detach() { if ( document.addEventListener ) { document.removeEventListener( "DOMContentLoaded", completed ); window.removeEventListener( "load", completed );

} else { document.detachEvent( "onreadystatechange", completed ); window.detachEvent( "onload", completed ); } }

/**

* The ready event handler and self cleanup method
*/

function completed() {

// readyState === "complete" is good enough for us to call the dom ready in oldIE if ( document.addEventListener || window.event.type === "load" || document.readyState === "complete" ) {

detach(); jQuery.ready(); } }

jQuery.ready.promise = function( obj ) { if ( !readyList ) {

readyList = jQuery.Deferred();

// Catch cases where $(document).ready() is called // after the browser event has already occurred. // Support: IE6-10 // Older IE sometimes signals "interactive" too soon if ( document.readyState === "complete" || ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {

// Handle it asynchronously to allow scripts the opportunity to delay ready window.setTimeout( jQuery.ready );

// Standards-based browsers support DOMContentLoaded } else if ( document.addEventListener ) {

// Use the handy event callback document.addEventListener( "DOMContentLoaded", completed );

// A fallback to window.onload, that will always work window.addEventListener( "load", completed );

// If IE event model is used } else {

// Ensure firing before onload, maybe late but safe also for iframes document.attachEvent( "onreadystatechange", completed );

// A fallback to window.onload, that will always work window.attachEvent( "onload", completed );

// If IE and not a frame // continually check to see if the document is ready var top = false;

try { top = window.frameElement == null && document.documentElement; } catch ( e ) {}

if ( top && top.doScroll ) { ( function doScrollCheck() { if ( !jQuery.isReady ) {

try {

// Use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ top.doScroll( "left" ); } catch ( e ) { return window.setTimeout( doScrollCheck, 50 ); }

// detach all dom ready events detach();

// and execute any waiting functions jQuery.ready(); } } )(); } } } return readyList.promise( obj ); };

// Kick off the DOM ready check even if the user does not jQuery.ready.promise();



// Support: IE<9 // Iteration over object's inherited properties before its own var i; for ( i in jQuery( support ) ) { break; } support.ownFirst = i === "0";

// Note: most support tests are defined in their respective modules. // false until the test is run support.inlineBlockNeedsLayout = false;

// Execute ASAP in case we need to set body.style.zoom jQuery( function() {

// Minified: var a,b,c,d var val, div, body, container;

body = document.getElementsByTagName( "body" )[ 0 ]; if ( !body || !body.style ) {

// Return for frameset docs that don't have a body return; }

// Setup div = document.createElement( "div" ); container = document.createElement( "div" ); container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; body.appendChild( container ).appendChild( div );

if ( typeof div.style.zoom !== "undefined" ) {

// Support: IE<8 // Check if natively block-level elements act like inline-block // elements when setting their display to 'inline' and giving // them layout div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";

support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; if ( val ) {

// Prevent IE 6 from affecting layout for positioned elements #11048 // Prevent IE from shrinking the body in IE 7 mode #12869 // Support: IE<8 body.style.zoom = 1; } }

body.removeChild( container ); } );


( function() { var div = document.createElement( "div" );

// Support: IE<9 support.deleteExpando = true; try { delete div.test; } catch ( e ) { support.deleteExpando = false; }

// Null elements to avoid leaks in IE. div = null; } )(); var acceptData = function( elem ) { var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ], nodeType = +elem.nodeType || 1;

// Do not set data on non-element DOM nodes because it will not be cleared (#8335). return nodeType !== 1 && nodeType !== 9 ? false :

// Nodes accept data unless otherwise specified; rejection can be conditional !noData || noData !== true && elem.getAttribute( "classid" ) === noData; };



var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /([A-Z])/g;

function dataAttr( elem, key, data ) {

// If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) {

var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();

data = elem.getAttribute( name );

if ( typeof data === "string" ) { try { data = data === "true" ? true : data === "false" ? false : data === "null" ? null :

// Only convert to a number if it doesn't change the string +data + "" === data ? +data : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; } catch ( e ) {}

// Make sure we set the data so it isn't changed later jQuery.data( elem, key, data );

} else { data = undefined; } }

return data; }

// checks a cache object for emptiness function isEmptyDataObject( obj ) { var name; for ( name in obj ) {

// if the public data object is empty, the private is still empty if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) { continue; } if ( name !== "toJSON" ) { return false; } }

return true; }

function internalData( elem, name, data, pvt /* Internal Use Only */ ) { if ( !acceptData( elem ) ) { return; }

var ret, thisCache, internalKey = jQuery.expando,

// We have to handle DOM nodes and JS objects differently because IE6-7 // can't GC object references properly across the DOM-JS boundary isNode = elem.nodeType,

// Only DOM nodes need the global jQuery cache; JS object data is // attached directly to the object so GC can occur automatically cache = isNode ? jQuery.cache : elem,

// Only defining an ID for JS objects if its cache already exists allows // the code to shortcut on the same path as a DOM node with no cache id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;

// Avoid doing any more work than we need to when trying to get data on an // object that has no data at all if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) && data === undefined && typeof name === "string" ) { return; }

if ( !id ) {

// Only DOM nodes need a new unique ID for each element since their data // ends up in the global cache if ( isNode ) { id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; } else { id = internalKey; } }

if ( !cache[ id ] ) {

// Avoid exposing jQuery metadata on plain JS objects when the object // is serialized using JSON.stringify cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; }

// An object can be passed to jQuery.data instead of a key/value pair; this gets // shallow copied over onto the existing cache if ( typeof name === "object" || typeof name === "function" ) { if ( pvt ) { cache[ id ] = jQuery.extend( cache[ id ], name ); } else { cache[ id ].data = jQuery.extend( cache[ id ].data, name ); } }

thisCache = cache[ id ];

// jQuery data() is stored in a separate object inside the object's internal data // cache in order to avoid key collisions between internal data and user-defined // data. if ( !pvt ) { if ( !thisCache.data ) { thisCache.data = {}; }

thisCache = thisCache.data; }

if ( data !== undefined ) { thisCache[ jQuery.camelCase( name ) ] = data; }

// Check for both converted-to-camel and non-converted data property names // If a data property was specified if ( typeof name === "string" ) {

// First Try to find as-is property data ret = thisCache[ name ];

// Test for null|undefined property data if ( ret == null ) {

// Try to find the camelCased property ret = thisCache[ jQuery.camelCase( name ) ]; } } else { ret = thisCache; }

return ret; }

function internalRemoveData( elem, name, pvt ) { if ( !acceptData( elem ) ) { return; }

var thisCache, i, isNode = elem.nodeType,

// See jQuery.data for more information cache = isNode ? jQuery.cache : elem, id = isNode ? elem[ jQuery.expando ] : jQuery.expando;

// If there is already no cache entry for this object, there is no // purpose in continuing if ( !cache[ id ] ) { return; }

if ( name ) {

thisCache = pvt ? cache[ id ] : cache[ id ].data;

if ( thisCache ) {

// Support array or space separated string names for data keys if ( !jQuery.isArray( name ) ) {

// try the string as a key before any manipulation if ( name in thisCache ) { name = [ name ]; } else {

// split the camel cased version by spaces unless a key with the spaces exists name = jQuery.camelCase( name ); if ( name in thisCache ) { name = [ name ]; } else { name = name.split( " " ); } } } else {

// If "name" is an array of keys... // When data is initially created, via ("key", "val") signature, // keys will be converted to camelCase. // Since there is no way to tell _how_ a key was added, remove // both plain key and camelCase key. #12786 // This will only penalize the array argument path. name = name.concat( jQuery.map( name, jQuery.camelCase ) ); }

i = name.length; while ( i-- ) { delete thisCache[ name[ i ] ]; }

// If there is no data left in the cache, we want to continue // and let the cache object itself get destroyed if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) { return; } } }

// See jQuery.data for more information if ( !pvt ) { delete cache[ id ].data;

// Don't destroy the parent cache unless the internal data object // had been the only thing left in it if ( !isEmptyDataObject( cache[ id ] ) ) { return; } }

// Destroy the cache if ( isNode ) { jQuery.cleanData( [ elem ], true );

// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) /* jshint eqeqeq: false */ } else if ( support.deleteExpando || cache != cache.window ) { /* jshint eqeqeq: true */ delete cache[ id ];

// When all else fails, undefined } else { cache[ id ] = undefined; } }

jQuery.extend( { cache: {},

// The following elements (space-suffixed to avoid Object.prototype collisions) // throw uncatchable exceptions if you attempt to set expando properties noData: { "applet ": true, "embed ": true,

// ...but Flash objects (which have this classid) *can* handle expandos "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" },

hasData: function( elem ) { elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ]; return !!elem && !isEmptyDataObject( elem ); },

data: function( elem, name, data ) { return internalData( elem, name, data ); },

removeData: function( elem, name ) { return internalRemoveData( elem, name ); },

// For internal use only. _data: function( elem, name, data ) { return internalData( elem, name, data, true ); },

_removeData: function( elem, name ) { return internalRemoveData( elem, name, true ); } } );

jQuery.fn.extend( { data: function( key, value ) { var i, name, data, elem = this[ 0 ], attrs = elem && elem.attributes;

// Special expections of .data basically thwart jQuery.access, // so implement the relevant behavior ourselves

// Gets all values if ( key === undefined ) { if ( this.length ) { data = jQuery.data( elem );

if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { i = attrs.length; while ( i-- ) {

// Support: IE11+ // The attrs elements can be null (#14894) if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { name = jQuery.camelCase( name.slice( 5 ) ); dataAttr( elem, name, data[ name ] ); } } } jQuery._data( elem, "parsedAttrs", true ); } }

return data; }

// Sets multiple values if ( typeof key === "object" ) { return this.each( function() { jQuery.data( this, key ); } ); }

return arguments.length > 1 ?

// Sets one value this.each( function() { jQuery.data( this, key, value ); } ) :

// Gets one value // Try to fetch any internally stored data first elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; },

removeData: function( key ) { return this.each( function() { jQuery.removeData( this, key ); } ); } } );


jQuery.extend( { queue: function( elem, type, data ) { var queue;

if ( elem ) { type = ( type || "fx" ) + "queue"; queue = jQuery._data( elem, type );

// Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !queue || jQuery.isArray( data ) ) { queue = jQuery._data( elem, type, jQuery.makeArray( data ) ); } else { queue.push( data ); } } return queue || []; } },

dequeue: function( elem, type ) { type = type || "fx";

var queue = jQuery.queue( elem, type ), startLength = queue.length, fn = queue.shift(), hooks = jQuery._queueHooks( elem, type ), next = function() { jQuery.dequeue( elem, type ); };

// If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); startLength--; }

if ( fn ) {

// Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); }

// clear up the last queue stop function delete hooks.stop; fn.call( elem, next, hooks ); }

if ( !startLength && hooks ) { hooks.empty.fire(); } },

// not intended for public consumption - generates a queueHooks object, // or returns the current one _queueHooks: function( elem, type ) { var key = type + "queueHooks"; return jQuery._data( elem, key ) || jQuery._data( elem, key, { empty: jQuery.Callbacks( "once memory" ).add( function() { jQuery._removeData( elem, type + "queue" ); jQuery._removeData( elem, key ); } ) } ); } } );

jQuery.fn.extend( { queue: function( type, data ) { var setter = 2;

if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; }

if ( arguments.length < setter ) { return jQuery.queue( this[ 0 ], type ); }

return data === undefined ? this : this.each( function() { var queue = jQuery.queue( this, type, data );

// ensure a hooks for this queue jQuery._queueHooks( this, type );

if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { jQuery.dequeue( this, type ); } } ); }, dequeue: function( type ) { return this.each( function() { jQuery.dequeue( this, type ); } ); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); },

// Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, obj ) { var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = this.length, resolve = function() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } };

if ( typeof type !== "string" ) { obj = type; type = undefined; } type = type || "fx";

while ( i-- ) { tmp = jQuery._data( elements[ i ], type + "queueHooks" ); if ( tmp && tmp.empty ) { count++; tmp.empty.add( resolve ); } } resolve(); return defer.promise( obj ); } } );


( function() { var shrinkWrapBlocksVal;

support.shrinkWrapBlocks = function() { if ( shrinkWrapBlocksVal != null ) { return shrinkWrapBlocksVal; }

// Will be changed later if needed. shrinkWrapBlocksVal = false;

// Minified: var b,c,d var div, body, container;

body = document.getElementsByTagName( "body" )[ 0 ]; if ( !body || !body.style ) {

// Test fired too early or in an unsupported environment, exit. return; }

// Setup div = document.createElement( "div" ); container = document.createElement( "div" ); container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; body.appendChild( container ).appendChild( div );

// Support: IE6 // Check if elements with layout shrink-wrap their children if ( typeof div.style.zoom !== "undefined" ) {

// Reset CSS: box-sizing; display; margin; border div.style.cssText =

// Support: Firefox<29, Android 2.3 // Vendor-prefix box-sizing "-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"; div.appendChild( document.createElement( "div" ) ).style.width = "5px"; shrinkWrapBlocksVal = div.offsetWidth !== 3; }

body.removeChild( container );

return shrinkWrapBlocksVal; };

} )(); var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;

var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );


var cssExpand = [ "Top", "Right", "Bottom", "Left" ];

var isHidden = function( elem, el ) {

// isHidden might be called from jQuery#filter function; // in that case, element will be second argument elem = el || elem; return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); };


function adjustCSS( elem, prop, valueParts, tween ) { var adjusted, scale = 1, maxIterations = 20, currentValue = tween ? function() { return tween.cur(); } : function() { return jQuery.css( elem, prop, "" ); }, initial = currentValue(), unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),

// Starting value computation is required for potential unit mismatches initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && rcssNum.exec( jQuery.css( elem, prop ) );

if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {

// Trust units reported by jQuery.css unit = unit || initialInUnit[ 3 ];

// Make sure we update the tween properties later on valueParts = valueParts || [];

// Iteratively approximate from a nonzero starting point initialInUnit = +initial || 1;

do {

// If previous iteration zeroed out, double until we get *something*. // Use string for doubling so we don't accidentally see scale as unchanged below scale = scale || ".5";

// Adjust and apply initialInUnit = initialInUnit / scale; jQuery.style( elem, prop, initialInUnit + unit );

// Update scale, tolerating zero or NaN from tween.cur() // Break the loop if scale is unchanged or perfect, or if we've just had enough. } while ( scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations ); }

if ( valueParts ) { initialInUnit = +initialInUnit || +initial || 0;

// Apply relative offset (+=/-=) if specified adjusted = valueParts[ 1 ] ? initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : +valueParts[ 2 ]; if ( tween ) { tween.unit = unit; tween.start = initialInUnit; tween.end = adjusted; } } return adjusted; }


// Multifunctional method to get and set values of a collection // The value/s can optionally be executed if it's a function var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { var i = 0, length = elems.length, bulk = key == null;

// Sets many values if ( jQuery.type( key ) === "object" ) { chainable = true; for ( i in key ) { access( elems, fn, i, key[ i ], true, emptyGet, raw ); }

// Sets one value } else if ( value !== undefined ) { chainable = true;

if ( !jQuery.isFunction( value ) ) { raw = true; }

if ( bulk ) {

// Bulk operations run against the entire set if ( raw ) { fn.call( elems, value ); fn = null;

// ...except when executing function values } else { bulk = fn; fn = function( elem, key, value ) { return bulk.call( jQuery( elem ), value ); }; } }

if ( fn ) { for ( ; i < length; i++ ) { fn( elems[ i ], key, raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) ); } } }

return chainable ? elems :

// Gets bulk ? fn.call( elems ) : length ? fn( elems[ 0 ], key ) : emptyGet; }; var rcheckableType = ( /^(?:checkbox|radio)$/i );

var rtagName = ( /<([\w:-]+)/ );

var rscriptType = ( /^$|\/(?:java|ecma)script/i );

var rleadingWhitespace = ( /^\s+/ );

var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" + "details|dialog|figcaption|figure|footer|header|hgroup|main|" + "mark|meter|nav|output|picture|progress|section|summary|template|time|video";


function createSafeFragment( document ) { var list = nodeNames.split( "|" ), safeFrag = document.createDocumentFragment();

if ( safeFrag.createElement ) { while ( list.length ) { safeFrag.createElement( list.pop() ); } } return safeFrag; }


( function() { var div = document.createElement( "div" ), fragment = document.createDocumentFragment(), input = document.createElement( "input" );

// Setup

div.innerHTML = " <link/>
<a href='/a'>a</a><input type='checkbox'/>";

// IE strips leading whitespace when .innerHTML is used support.leadingWhitespace = div.firstChild.nodeType === 3;

// Make sure that tbody elements aren't automatically inserted // IE will insert them into empty tables support.tbody = !div.getElementsByTagName( "tbody" ).length;

// Make sure that link elements get serialized correctly by innerHTML // This requires a wrapper element in IE support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;

// Makes sure cloning an html5 element does not cause problems // Where outerHTML is undefined, this still works support.html5Clone = document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>";

// Check if a disconnected checkbox will retain its checked // value of true after appended to the DOM (IE6/7) input.type = "checkbox"; input.checked = true; fragment.appendChild( input ); support.appendChecked = input.checked;

// Make sure textarea (and checkbox) defaultValue is properly cloned // Support: IE6-IE11+ div.innerHTML = "<textarea>x</textarea>"; support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;

// #11217 - WebKit loses check when the name is after the checked attribute fragment.appendChild( div );

// Support: Windows Web Apps (WWA) // `name` and `type` must use .setAttribute for WWA (#14901) input = document.createElement( "input" ); input.setAttribute( "type", "radio" ); input.setAttribute( "checked", "checked" ); input.setAttribute( "name", "t" );

div.appendChild( input );

// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 // old WebKit doesn't clone checked state correctly in fragments support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;

// Support: IE<9 // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+ support.noCloneEvent = !!div.addEventListener;

// Support: IE<9 // Since attributes and properties are the same in IE, // cleanData must set properties to undefined rather than use removeAttribute div[ jQuery.expando ] = 1; support.attributes = !div.getAttribute( jQuery.expando ); } )();


// We have to close these tags to support XHTML (#13200) var wrapMap = { option: [ 1, "<select multiple='multiple'>", "</select>" ], legend: [ 1, "<fieldset>", "</fieldset>" ], area: [ 1, "<map>", "</map>" ],

// Support: IE8 param: [ 1, "<object>", "</object>" ],

thead: [ 1, "", "
" ], tr: [ 2, "<tbody>", "</tbody>
" ], col: [ 2, "<tbody></tbody><colgroup>", "</colgroup>
" ], td: [ 3, "<tbody>", "</tbody>
" ],

// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, // unless wrapped in a div with non-breaking characters in front of it.

_default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ]

};

// Support: IE8-IE9 wrapMap.optgroup = wrapMap.option;

wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td;


function getAll( context, tag ) { var elems, elem, i = 0, found = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName( tag || "*" ) : typeof context.querySelectorAll !== "undefined" ? context.querySelectorAll( tag || "*" ) : undefined;

if ( !found ) { for ( found = [], elems = context.childNodes || context; ( elem = elems[ i ] ) != null; i++ ) { if ( !tag || jQuery.nodeName( elem, tag ) ) { found.push( elem ); } else { jQuery.merge( found, getAll( elem, tag ) ); } } }

return tag === undefined || tag && jQuery.nodeName( context, tag ) ? jQuery.merge( [ context ], found ) : found; }


// Mark scripts as having already been evaluated function setGlobalEval( elems, refElements ) { var elem, i = 0; for ( ; ( elem = elems[ i ] ) != null; i++ ) { jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[ i ], "globalEval" ) ); } }


var rhtml = /<|&#?\w+;/, rtbody = /<tbody/i;

function fixDefaultChecked( elem ) { if ( rcheckableType.test( elem.type ) ) { elem.defaultChecked = elem.checked; } }

function buildFragment( elems, context, scripts, selection, ignored ) { var j, elem, contains, tmp, tag, tbody, wrap, l = elems.length,

// Ensure a safe fragment safe = createSafeFragment( context ),

nodes = [], i = 0;

for ( ; i < l; i++ ) { elem = elems[ i ];

if ( elem || elem === 0 ) {

// Add nodes directly if ( jQuery.type( elem ) === "object" ) { jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );

// Convert non-html into a text node } else if ( !rhtml.test( elem ) ) { nodes.push( context.createTextNode( elem ) );

// Convert html into DOM nodes } else { tmp = tmp || safe.appendChild( context.createElement( "div" ) );

// Deserialize a standard representation tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); wrap = wrapMap[ tag ] || wrapMap._default;

tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];

// Descend through wrappers to the right content j = wrap[ 0 ]; while ( j-- ) { tmp = tmp.lastChild; }

// Manually add leading whitespace removed by IE if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[ 0 ] ) ); }

// Remove IE's autoinserted <tbody> from table fragments if ( !support.tbody ) {

// String was a , *may* have spurious <tbody> elem = tag === "table" && !rtbody.test( elem ) ? tmp.firstChild : // String was a bare <thead> or <tfoot> wrap[ 1 ] === "
" && !rtbody.test( elem ) ? tmp : 0; j = elem && elem.childNodes.length; while ( j-- ) { if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) && !tbody.childNodes.length ) { elem.removeChild( tbody ); } } } jQuery.merge( nodes, tmp.childNodes ); // Fix #12392 for WebKit and IE > 9 tmp.textContent = ""; // Fix #12392 for oldIE while ( tmp.firstChild ) { tmp.removeChild( tmp.firstChild ); } // Remember the top-level container for proper cleanup tmp = safe.lastChild; } } } // Fix #11356: Clear elements from fragment if ( tmp ) { safe.removeChild( tmp ); } // Reset defaultChecked for any radios and checkboxes // about to be appended to the DOM in IE 6/7 (#8060) if ( !support.appendChecked ) { jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); } i = 0; while ( ( elem = nodes[ i++ ] ) ) { // Skip elements already in the context collection (trac-4087) if ( selection && jQuery.inArray( elem, selection ) > -1 ) { if ( ignored ) { ignored.push( elem ); } continue; } contains = jQuery.contains( elem.ownerDocument, elem ); // Append to fragment tmp = getAll( safe.appendChild( elem ), "script" ); // Preserve script evaluation history if ( contains ) { setGlobalEval( tmp ); } // Capture executables if ( scripts ) { j = 0; while ( ( elem = tmp[ j++ ] ) ) { if ( rscriptType.test( elem.type || "" ) ) { scripts.push( elem ); } } } } tmp = null; return safe; } ( function() { var i, eventName, div = document.createElement( "div" ); // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events) for ( i in { submit: true, change: true, focusin: true } ) { eventName = "on" + i; if ( !( support[ i ] = eventName in window ) ) { // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) div.setAttribute( eventName, "t" ); support[ i ] = div.attributes[ eventName ].expando === false; } } // Null elements to avoid leaks in IE. div = null; } )(); var rformElems = /^(?:input|select|textarea)$/i, rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, rtypenamespace = /^([^.]*)(?:\.(.+)|)/; function returnTrue() { return true; } function returnFalse() { return false; } // Support: IE9 // See #13393 for more info function safeActiveElement() { try { return document.activeElement; } catch ( err ) { } } function on( elem, types, selector, data, fn, one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { on( elem, type, selector, data, types[ type ], one ); } return elem; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return elem; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return elem.each( function() { jQuery.event.add( this, types, fn, data, selector ); } ); } /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { global: {}, add: function( elem, types, handler, data, selector ) { var tmp, events, t, handleObjIn, special, eventHandle, handleObj, handlers, type, namespaces, origType, elemData = jQuery._data( elem ); // Don't attach events to noData or text/comment nodes (but allow plain objects) if ( !elemData ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first if ( !( events = elemData.events ) ) { events = elemData.events = {}; } if ( !( eventHandle = elemData.handle ) ) { eventHandle = elemData.handle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && ( !e || jQuery.event.triggered !== e.type ) ? jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : undefined; }; // Add elem as a property of the handle fn to prevent a memory leak // with IE non-native events eventHandle.elem = elem; } // Handle multiple events separated by a space types = ( types || "" ).match( rnotwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // There *must* be a type, no attaching namespace-only handlers if ( !type ) { continue; } // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend( { type: type, origType: origType, data: data, handler: handler, guid: handler.guid, selector: selector, needsContext: selector && jQuery.expr.match.needsContext.test( selector ), namespace: namespaces.join( "." ) }, handleObjIn ); // Init the event handler queue if we're the first if ( !( handlers = events[ type ] ) ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener/attachEvent if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { // Bind the global event handler to the element if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); } else if ( elem.attachEvent ) { elem.attachEvent( "on" + type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } // Nullify elem to prevent memory leaks in IE elem = null; }, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var j, handleObj, tmp, origCount, t, events, special, handlers, type, namespaces, origType, elemData = jQuery.hasData( elem ) && jQuery._data( elem ); if ( !elemData || !( events = elemData.events ) ) { return; } // Once for each type.namespace in types; type may be omitted types = ( types || "" ).match( rnotwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector ? special.delegateType : special.bindType ) || type; handlers = events[ type ] || []; tmp = tmp[ 2 ] && new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); // Remove matching events origCount = j = handlers.length; while ( j-- ) { handleObj = handlers[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !tmp || tmp.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { handlers.splice( j, 1 ); if ( handleObj.selector ) { handlers.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( origCount && !handlers.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { delete elemData.handle; // removeData also checks for emptiness and clears the expando if empty // so use it instead of delete jQuery._removeData( elem, "events" ); } }, trigger: function( event, data, elem, onlyHandlers ) { var handle, ontype, cur, bubbleType, special, tmp, i, eventPath = [ elem || document ], type = hasOwn.call( event, "type" ) ? event.type : event, namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; cur = tmp = elem = elem || document; // Don't do events on text and comment nodes if ( elem.nodeType === 3 || elem.nodeType === 8 ) { return; } // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "." ) > -1 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split( "." ); type = namespaces.shift(); namespaces.sort(); } ontype = type.indexOf( ":" ) < 0 && "on" + type; // Caller can pass in a jQuery.Event object, Object, or just an event type string event = event[ jQuery.expando ] ? event : new jQuery.Event( type, typeof event === "object" && event ); // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) event.isTrigger = onlyHandlers ? 2 : 3; event.namespace = namespaces.join( "." ); event.rnamespace = event.namespace ? new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : null; // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data == null ? [ event ] : jQuery.makeArray( data, [ event ] ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; if ( !rfocusMorph.test( bubbleType + type ) ) { cur = cur.parentNode; } for ( ; cur; cur = cur.parentNode ) { eventPath.push( cur ); tmp = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( tmp === ( elem.ownerDocument || document ) ) { eventPath.push( tmp.defaultView || tmp.parentWindow || window ); } } // Fire handlers on the event path i = 0; while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { event.type = i > 1 ? bubbleType : special.bindType || type; // jQuery handler handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Native handler handle = ontype && cur[ ontype ]; if ( handle && handle.apply && acceptData( cur ) ) { event.result = handle.apply( cur, data ); if ( event.result === false ) { event.preventDefault(); } } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( ( !special._default || special._default.apply( eventPath.pop(), data ) === false ) && acceptData( elem ) ) { // Call a native DOM method on the target with the same name name as the event. // Can't use an .isFunction() check here because IE6/7 fails that test. // Don't do default actions on window, that's where global variables be (#6170) if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method tmp = elem[ ontype ]; if ( tmp ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; try { elem[ type ](); } catch ( e ) { // IE<9 dies on focus/blur to hidden element (#1486,#12518) // only reproducible on winXP IE8 native, not IE9 in IE8 mode } jQuery.event.triggered = undefined; if ( tmp ) { elem[ ontype ] = tmp; } } } } return event.result; }, dispatch: function( event ) { // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event ); var i, j, ret, matched, handleObj, handlerQueue = [], args = slice.call( arguments ), handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[ 0 ] = event; event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers handlerQueue = jQuery.event.handlers.call( this, event, handlers ); // Run delegates first; they may want to stop propagation beneath us i = 0; while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { event.currentTarget = matched.elem; j = 0; while ( ( handleObj = matched.handlers[ j++ ] ) && !event.isImmediatePropagationStopped() ) { // Triggered event must either 1) have no namespace, or 2) have namespace(s) // a subset or equal to those in the bound event (both can have no namespace). if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { event.handleObj = handleObj; event.data = handleObj.data; ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || handleObj.handler ).apply( matched.elem, args ); if ( ret !== undefined ) { if ( ( event.result = ret ) === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, handlers: function( event, handlers ) { var i, matches, sel, handleObj, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; // Support (at least): Chrome, IE9 // Find delegate handlers // Black-hole SVG <use> instance trees (#13180) // // Support: Firefox<=42+ // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) if ( delegateCount && cur.nodeType && ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { /* jshint eqeqeq: false */ for ( ; cur != this; cur = cur.parentNode || this ) { /* jshint eqeqeq: true */ // Don't check non-elements (#13208) // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { matches = []; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; // Don't conflict with Object.prototype properties (#13203) sel = handleObj.selector + " "; if ( matches[ sel ] === undefined ) { matches[ sel ] = handleObj.needsContext ? jQuery( sel, this ).index( cur ) > -1 : jQuery.find( sel, this, null, [ cur ] ).length; } if ( matches[ sel ] ) { matches.push( handleObj ); } } if ( matches.length ) { handlerQueue.push( { elem: cur, handlers: matches } ); } } } } // Add the remaining (directly-bound) handlers if ( delegateCount < handlers.length ) { handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); } return handlerQueue; }, fix: function( event ) { if ( event[ jQuery.expando ] ) { return event; } // Create a writable copy of the event object and normalize some properties var i, prop, copy, type = event.type, originalEvent = event, fixHook = this.fixHooks[ type ]; if ( !fixHook ) { this.fixHooks[ type ] = fixHook = rmouseEvent.test( type ) ? this.mouseHooks : rkeyEvent.test( type ) ? this.keyHooks : {}; } copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; event = new jQuery.Event( originalEvent ); i = copy.length; while ( i-- ) { prop = copy[ i ]; event[ prop ] = originalEvent[ prop ]; } // Support: IE<9 // Fix target property (#1925) if ( !event.target ) { event.target = originalEvent.srcElement || document; } // Support: Safari 6-8+ // Target should not be a text node (#504, #13143) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } // Support: IE<9 // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) event.metaKey = !!event.metaKey; return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; }, // Includes some event props shared by KeyEvent and MouseEvent props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split( " " ), filter: function( event, original ) { // Add which for key events if ( event.which == null ) { event.which = original.charCode != null ? original.charCode : original.keyCode; } return event; } }, mouseHooks: { props: ( "button buttons clientX clientY fromElement offsetX offsetY " + "pageX pageY screenX screenY toElement" ).split( " " ), filter: function( event, original ) { var body, eventDoc, doc, button = original.button, fromElement = original.fromElement; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && original.clientX != null ) { eventDoc = event.target.ownerDocument || document; doc = eventDoc.documentElement; body = eventDoc.body; event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); } // Add relatedTarget, if necessary if ( !event.relatedTarget && fromElement ) { event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; } // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); } return event; } }, special: { load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { // Fire native event if possible so blur/focus sequence is correct trigger: function() { if ( this !== safeActiveElement() && this.focus ) { try { this.focus(); return false; } catch ( e ) { // Support: IE<9 // If we error on focus to hidden element (#1486, #12518), // let .trigger() run the handlers } } }, delegateType: "focusin" }, blur: { trigger: function() { if ( this === safeActiveElement() && this.blur ) { this.blur(); return false; } }, delegateType: "focusout" }, click: { // For checkbox, fire native event so checked state will be right trigger: function() { if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { this.click(); return false; } }, // For cross-browser consistency, don't fire native .click() on links _default: function( event ) { return jQuery.nodeName( event.target, "a" ); } }, beforeunload: { postDispatch: function( event ) { // Support: Firefox 20+ // Firefox doesn't alert if the returnValue field is not set. if ( event.result !== undefined && event.originalEvent ) { event.originalEvent.returnValue = event.result; } } } }, // Piggyback on a donor event to simulate a different one simulate: function( type, elem, event ) { var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true // Previously, `originalEvent: {}` was set here, so stopPropagation call // would not be triggered on donor event, since in our own // jQuery.event.stopPropagation function we had a check for existence of // originalEvent.stopPropagation method, so, consequently it would be a noop. // // Guard for simulated events was moved to jQuery.event.stopPropagation function // since `originalEvent` should point to the original event for the // constancy with other events and for more focused logic } ); jQuery.event.trigger( e, null, elem ); if ( e.isDefaultPrevented() ) { event.preventDefault(); } } }; jQuery.removeEvent = document.removeEventListener ? function( elem, type, handle ) { // This "if" is needed for plain objects if ( elem.removeEventListener ) { elem.removeEventListener( type, handle ); } } : function( elem, type, handle ) { var name = "on" + type; if ( elem.detachEvent ) { // #8545, #7054, preventing memory leaks for custom events in IE6-8 // detachEvent needed property on element, by name of that event, // to properly expose it to GC if ( typeof elem[ name ] === "undefined" ) { elem[ name ] = null; } elem.detachEvent( name, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !( this instanceof jQuery.Event ) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && // Support: IE < 9, Android < 4.0 src.returnValue === false ? returnTrue : returnFalse; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { constructor: jQuery.Event, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, preventDefault: function() { var e = this.originalEvent; this.isDefaultPrevented = returnTrue; if ( !e ) { return; } // If preventDefault exists, run it on the original event if ( e.preventDefault ) { e.preventDefault(); // Support: IE // Otherwise set the returnValue property of the original event to false } else { e.returnValue = false; } }, stopPropagation: function() { var e = this.originalEvent; this.isPropagationStopped = returnTrue; if ( !e || this.isSimulated ) { return; } // If stopPropagation exists, run it on the original event if ( e.stopPropagation ) { e.stopPropagation(); } // Support: IE // Set the cancelBubble property of the original event to true e.cancelBubble = true; }, stopImmediatePropagation: function() { var e = this.originalEvent; this.isImmediatePropagationStopped = returnTrue; if ( e && e.stopImmediatePropagation ) { e.stopImmediatePropagation(); } this.stopPropagation(); } }; // Create mouseenter/leave events using mouseover/out and event-time checks // so that event delegation works in jQuery. // Do the same for pointerenter/pointerleave and pointerover/pointerout // // Support: Safari 7 only // Safari sends mouseenter too often; see: // https://code.google.com/p/chromium/issues/detail?id=470258 // for the description of the bug (it existed in older Chrome versions as well). jQuery.each( { mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj; // For mouseenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; } ); // IE submit delegation if ( !support.submit ) { jQuery.event.special.submit = { setup: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Lazy-add a submit handler when a descendant form may potentially be submitted jQuery.event.add( this, "click._submit keypress._submit", function( e ) { // Node name check avoids a VML-related crash in IE (#9807) var elem = e.target, form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? // Support: IE <=8 // We use jQuery.prop instead of elem.form // to allow fixing the IE8 delegated submit issue (gh-2332) // by 3rd party polyfills/workarounds. jQuery.prop( elem, "form" ) : undefined; if ( form && !jQuery._data( form, "submit" ) ) { jQuery.event.add( form, "submit._submit", function( event ) { event._submitBubble = true; } ); jQuery._data( form, "submit", true ); } } ); // return undefined since we don't need an event listener }, postDispatch: function( event ) { // If form was submitted by the user, bubble the event up the tree if ( event._submitBubble ) { delete event._submitBubble; if ( this.parentNode && !event.isTrigger ) { jQuery.event.simulate( "submit", this.parentNode, event ); } } }, teardown: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Remove delegated handlers; cleanData eventually reaps submit handlers attached above jQuery.event.remove( this, "._submit" ); } }; } // IE change delegation and checkbox/radio fix if ( !support.change ) { jQuery.event.special.change = { setup: function() { if ( rformElems.test( this.nodeName ) ) { // IE doesn't fire change on a check/radio until blur; trigger it on click // after a propertychange. Eat the blur-change in special.change.handle. // This still fires onchange a second time for check/radio after blur. if ( this.type === "checkbox" || this.type === "radio" ) { jQuery.event.add( this, "propertychange._change", function( event ) { if ( event.originalEvent.propertyName === "checked" ) { this._justChanged = true; } } ); jQuery.event.add( this, "click._change", function( event ) { if ( this._justChanged && !event.isTrigger ) { this._justChanged = false; } // Allow triggered, simulated change events (#11500) jQuery.event.simulate( "change", this, event ); } ); } return false; } // Delegated event; lazy-add a change handler on descendant inputs jQuery.event.add( this, "beforeactivate._change", function( e ) { var elem = e.target; if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) { jQuery.event.add( elem, "change._change", function( event ) { if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { jQuery.event.simulate( "change", this.parentNode, event ); } } ); jQuery._data( elem, "change", true ); } } ); }, handle: function( event ) { var elem = event.target; // Swallow native change events from checkbox/radio, we already triggered them above if ( this !== elem || event.isSimulated || event.isTrigger || ( elem.type !== "radio" && elem.type !== "checkbox" ) ) { return event.handleObj.handler.apply( this, arguments ); } }, teardown: function() { jQuery.event.remove( this, "._change" ); return !rformElems.test( this.nodeName ); } }; } // Support: Firefox // Firefox doesn't have focus(in | out) events // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 // // Support: Chrome, Safari // focus(in | out) events fire after focus & blur events, // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order // Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 if ( !support.focusin ) { jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler on the document while someone wants focusin/focusout var handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); }; jQuery.event.special[ fix ] = { setup: function() { var doc = this.ownerDocument || this, attaches = jQuery._data( doc, fix ); if ( !attaches ) { doc.addEventListener( orig, handler, true ); } jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); }, teardown: function() { var doc = this.ownerDocument || this, attaches = jQuery._data( doc, fix ) - 1; if ( !attaches ) { doc.removeEventListener( orig, handler, true ); jQuery._removeData( doc, fix ); } else { jQuery._data( doc, fix, attaches ); } } }; } ); } jQuery.fn.extend( { on: function( types, selector, data, fn ) { return on( this, types, selector, data, fn ); }, one: function( types, selector, data, fn ) { return on( this, types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { var handleObj, type; if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each( function() { jQuery.event.remove( this, types, fn, selector ); } ); }, trigger: function( type, data ) { return this.each( function() { jQuery.event.trigger( type, data, this ); } ); }, triggerHandler: function( type, data ) { var elem = this[ 0 ]; if ( elem ) { return jQuery.event.trigger( type, data, elem, true ); } } } ); var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ), rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, // Support: IE 10-11, Edge 10240+ // In IE/Edge using regex groups here causes severe slowdowns. // See https://connect.microsoft.com/IE/feedback/details/1736512/ rnoInnerhtml = /<script|<style|<link/i, // checked="checked" or checked rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, rscriptTypeMasked = /^true\/(.*)/, rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g, safeFragment = createSafeFragment( document ), fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) ); // Support: IE<8 // Manipulating tables requires a tbody function manipulationTarget( elem, content ) { return jQuery.nodeName( elem, "table" ) && jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? elem.getElementsByTagName( "tbody" )[ 0 ] || elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation function disableScript( elem ) { elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type; return elem; } function restoreScript( elem ) { var match = rscriptTypeMasked.exec( elem.type ); if ( match ) { elem.type = match[ 1 ]; } else { elem.removeAttribute( "type" ); } return elem; } function cloneCopyEvent( src, dest ) { if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { return; } var type, i, l, oldData = jQuery._data( src ), curData = jQuery._data( dest, oldData ), events = oldData.events; if ( events ) { delete curData.handle; curData.events = {}; for ( type in events ) { for ( i = 0, l = events[ type ].length; i < l; i++ ) { jQuery.event.add( dest, type, events[ type ][ i ] ); } } } // make the cloned public data object a copy from the original if ( curData.data ) { curData.data = jQuery.extend( {}, curData.data ); } } function fixCloneNodeIssues( src, dest ) { var nodeName, e, data; // We do not need to do anything for non-Elements if ( dest.nodeType !== 1 ) { return; } nodeName = dest.nodeName.toLowerCase(); // IE6-8 copies events bound via attachEvent when using cloneNode. if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { data = jQuery._data( dest ); for ( e in data.events ) { jQuery.removeEvent( dest, e, data.handle ); } // Event data gets referenced instead of copied if the expando gets copied too dest.removeAttribute( jQuery.expando ); } // IE blanks contents when cloning scripts, and tries to evaluate newly-set text if ( nodeName === "script" && dest.text !== src.text ) { disableScript( dest ).text = src.text; restoreScript( dest ); // IE6-10 improperly clones children of object elements using classid. // IE10 throws NoModificationAllowedError if parent is null, #12132. } else if ( nodeName === "object" ) { if ( dest.parentNode ) { dest.outerHTML = src.outerHTML; } // This path appears unavoidable for IE9. When cloning an object // element in IE9, the outerHTML strategy above is not sufficient. // If the src has innerHTML and the destination does not, // copy the src.innerHTML into the dest.innerHTML. #10324 if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) { dest.innerHTML = src.innerHTML; } } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { // IE6-8 fails to persist the checked state of a cloned checkbox // or radio button. Worse, IE6-7 fail to give the cloned element // a checked appearance if the defaultChecked value isn't also set dest.defaultChecked = dest.checked = src.checked; // IE6-7 get confused and end up setting the value of a cloned // checkbox/radio button to an empty string instead of "on" if ( dest.value !== src.value ) { dest.value = src.value; } // IE6-8 fails to return the selected option to the default selected // state when cloning options } else if ( nodeName === "option" ) { dest.defaultSelected = dest.selected = src.defaultSelected; // IE6-8 fails to set the defaultValue to the correct value when // cloning other types of input fields } else if ( nodeName === "input" || nodeName === "textarea" ) { dest.defaultValue = src.defaultValue; } } function domManip( collection, args, callback, ignored ) { // Flatten any nested arrays args = concat.apply( [], args ); var first, node, hasScripts, scripts, doc, fragment, i = 0, l = collection.length, iNoClone = l - 1, value = args[ 0 ], isFunction = jQuery.isFunction( value ); // We can't cloneNode fragments that contain checked, in WebKit if ( isFunction || ( l > 1 && typeof value === "string" && !support.checkClone && rchecked.test( value ) ) ) { return collection.each( function( index ) { var self = collection.eq( index ); if ( isFunction ) { args[ 0 ] = value.call( this, index, self.html() ); } domManip( self, args, callback, ignored ); } ); } if ( l ) { fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); first = fragment.firstChild; if ( fragment.childNodes.length === 1 ) { fragment = first; } // Require either new content or an interest in ignored elements to invoke the callback if ( first || ignored ) { scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); hasScripts = scripts.length; // Use the original fragment for the last item // instead of the first because it can end up // being emptied incorrectly in certain situations (#8070). for ( ; i < l; i++ ) { node = fragment; if ( i !== iNoClone ) { node = jQuery.clone( node, true, true ); // Keep references to cloned scripts for later restoration if ( hasScripts ) { // Support: Android<4.1, PhantomJS<2 // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( scripts, getAll( node, "script" ) ); } } callback.call( collection[ i ], node, i ); } if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; // Reenable scripts jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion for ( i = 0; i < hasScripts; i++ ) { node = scripts[ i ]; if ( rscriptType.test( node.type || "" ) && !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { if ( node.src ) { // Optional AJAX dependency, but won't run scripts if not present if ( jQuery._evalUrl ) { jQuery._evalUrl( node.src ); } } else { jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ) .replace( rcleanScript, "" ) ); } } } } // Fix #11809: Avoid leaking memory fragment = first = null; } } return collection; } function remove( elem, selector, keepData ) { var node, elems = selector ? jQuery.filter( selector, elem ) : elem, i = 0; for ( ; ( node = elems[ i ] ) != null; i++ ) { if ( !keepData && node.nodeType === 1 ) { jQuery.cleanData( getAll( node ) ); } if ( node.parentNode ) { if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { setGlobalEval( getAll( node, "script" ) ); } node.parentNode.removeChild( node ); } } return elem; } jQuery.extend( { htmlPrefilter: function( html ) { return html.replace( rxhtmlTag, "<$1></$2>" ); }, clone: function( elem, dataAndEvents, deepDataAndEvents ) { var destElements, node, clone, i, srcElements, inPage = jQuery.contains( elem.ownerDocument, elem ); if ( support.html5Clone || jQuery.isXMLDoc( elem ) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { clone = elem.cloneNode( true ); // IE<=8 does not properly clone detached, unknown element nodes } else { fragmentDiv.innerHTML = elem.outerHTML; fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); } if ( ( !support.noCloneEvent || !support.noCloneChecked ) && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); // Fix all IE cloning issues for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) { // Ensure that the destination node is not null; Fixes #9587 if ( destElements[ i ] ) { fixCloneNodeIssues( node, destElements[ i ] ); } } } // Copy the events from the original to the clone if ( dataAndEvents ) { if ( deepDataAndEvents ) { srcElements = srcElements || getAll( elem ); destElements = destElements || getAll( clone ); for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) { cloneCopyEvent( node, destElements[ i ] ); } } else { cloneCopyEvent( elem, clone ); } } // Preserve script evaluation history destElements = getAll( clone, "script" ); if ( destElements.length > 0 ) { setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); } destElements = srcElements = node = null; // Return the cloned set return clone; }, cleanData: function( elems, /* internal */ forceAcceptData ) { var elem, type, id, data, i = 0, internalKey = jQuery.expando, cache = jQuery.cache, attributes = support.attributes, special = jQuery.event.special; for ( ; ( elem = elems[ i ] ) != null; i++ ) { if ( forceAcceptData || acceptData( elem ) ) { id = elem[ internalKey ]; data = id && cache[ id ]; if ( data ) { if ( data.events ) { for ( type in data.events ) { if ( special[ type ] ) { jQuery.event.remove( elem, type ); // This is a shortcut to avoid jQuery.event.remove's overhead } else { jQuery.removeEvent( elem, type, data.handle ); } } } // Remove cache only if it was not already removed by jQuery.event.remove if ( cache[ id ] ) { delete cache[ id ]; // Support: IE<9 // IE does not allow us to delete expando properties from nodes // IE creates expando attributes along with the property // IE does not have a removeAttribute function on Document nodes if ( !attributes && typeof elem.removeAttribute !== "undefined" ) { elem.removeAttribute( internalKey ); // Webkit & Blink performance suffers when deleting properties // from DOM nodes, so set to undefined instead // https://code.google.com/p/chromium/issues/detail?id=378607 } else { elem[ internalKey ] = undefined; } deletedIds.push( id ); } } } } } } ); jQuery.fn.extend( { // Keep domManip exposed until 3.0 (gh-2225) domManip: domManip, detach: function( selector ) { return remove( this, selector, true ); }, remove: function( selector ) { return remove( this, selector ); }, text: function( value ) { return access( this, function( value ) { return value === undefined ? jQuery.text( this ) : this.empty().append( ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) ); }, null, value, arguments.length ); }, append: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.appendChild( elem ); } } ); }, prepend: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.insertBefore( elem, target.firstChild ); } } ); }, before: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this ); } } ); }, after: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this.nextSibling ); } } ); }, empty: function() { var elem, i = 0; for ( ; ( elem = this[ i ] ) != null; i++ ) { // Remove element nodes and prevent memory leaks if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); } // Remove any remaining nodes while ( elem.firstChild ) { elem.removeChild( elem.firstChild ); } // If this is a select, ensure that it displays empty (#12336) // Support: IE<9 if ( elem.options && jQuery.nodeName( elem, "select" ) ) { elem.options.length = 0; } } return this; }, clone: function( dataAndEvents, deepDataAndEvents ) { dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; return this.map( function() { return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); } ); }, html: function( value ) { return access( this, function( value ) { var elem = this[ 0 ] || {}, i = 0, l = this.length; if ( value === undefined ) { return elem.nodeType === 1 ? elem.innerHTML.replace( rinlinejQuery, "" ) : undefined; } // See if we can take a shortcut and just use innerHTML if ( typeof value === "string" && !rnoInnerhtml.test( value ) && ( support.htmlSerialize || !rnoshimcache.test( value ) ) && ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { value = jQuery.htmlPrefilter( value ); try { for ( ; i < l; i++ ) { // Remove element nodes and prevent memory leaks elem = this[ i ] || {}; if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); elem.innerHTML = value; } } elem = 0; // If using innerHTML throws an exception, use the fallback method } catch ( e ) {} } if ( elem ) { this.empty().append( value ); } }, null, value, arguments.length ); }, replaceWith: function() { var ignored = []; // Make the changes, replacing each non-ignored context element with the new content return domManip( this, arguments, function( elem ) { var parent = this.parentNode; if ( jQuery.inArray( this, ignored ) < 0 ) { jQuery.cleanData( getAll( this ) ); if ( parent ) { parent.replaceChild( elem, this ); } } // Force callback invocation }, ignored ); } } ); jQuery.each( { appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function( name, original ) { jQuery.fn[ name ] = function( selector ) { var elems, i = 0, ret = [], insert = jQuery( selector ), last = insert.length - 1; for ( ; i <= last; i++ ) { elems = i === last ? this : this.clone( true ); jQuery( insert[ i ] )[ original ]( elems ); // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() push.apply( ret, elems.get() ); } return this.pushStack( ret ); }; } ); var iframe, elemdisplay = { // Support: Firefox // We have to pre-define these values for FF (#10227) HTML: "block", BODY: "block" }; /** * Retrieve the actual display of a element * @param {String} name nodeName of the element * @param {Object} doc Document object */ // Called only from within defaultDisplay function actualDisplay( name, doc ) { var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), display = jQuery.css( elem[ 0 ], "display" ); // We don't have any data stored on the element, // so use "detach" method as fast way to get rid of the element elem.detach(); return display; } /** * Try to determine the default display value of an element * @param {String} nodeName */ function defaultDisplay( nodeName ) { var doc = document, display = elemdisplay[ nodeName ]; if ( !display ) { display = actualDisplay( nodeName, doc ); // If the simple way fails, read from inside an iframe if ( display === "none" || !display ) { // Use the already-created iframe if possible iframe = ( iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" ) ) .appendTo( doc.documentElement ); // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document; // Support: IE doc.write(); doc.close(); display = actualDisplay( nodeName, doc ); iframe.detach(); } // Store the correct default display elemdisplay[ nodeName ] = display; } return display; } var rmargin = ( /^margin/ ); var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); var swap = function( elem, options, callback, args ) { var ret, name, old = {}; // Remember the old values, and insert the new ones for ( name in options ) { old[ name ] = elem.style[ name ]; elem.style[ name ] = options[ name ]; } ret = callback.apply( elem, args || [] ); // Revert the old values for ( name in options ) { elem.style[ name ] = old[ name ]; } return ret; }; var documentElement = document.documentElement; ( function() { var pixelPositionVal, pixelMarginRightVal, boxSizingReliableVal, reliableHiddenOffsetsVal, reliableMarginRightVal, reliableMarginLeftVal, container = document.createElement( "div" ), div = document.createElement( "div" ); // Finish early in limited (non-browser) environments if ( !div.style ) { return; } div.style.cssText = "float:left;opacity:.5"; // Support: IE<9 // Make sure that element opacity exists (as opposed to filter) support.opacity = div.style.opacity === "0.5"; // Verify style float existence // (IE uses styleFloat instead of cssFloat) support.cssFloat = !!div.style.cssFloat; div.style.backgroundClip = "content-box"; div.cloneNode( true ).style.backgroundClip = ""; support.clearCloneStyle = div.style.backgroundClip === "content-box"; container = document.createElement( "div" ); container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + "padding:0;margin-top:1px;position:absolute"; div.innerHTML = ""; container.appendChild( div ); // Support: Firefox<29, Android 2.3 // Vendor-prefix box-sizing support.boxSizing = div.style.boxSizing === "" || div.style.MozBoxSizing === "" || div.style.WebkitBoxSizing === ""; jQuery.extend( support, { reliableHiddenOffsets: function() { if ( pixelPositionVal == null ) { computeStyleTests(); } return reliableHiddenOffsetsVal; }, boxSizingReliable: function() { // We're checking for pixelPositionVal here instead of boxSizingReliableVal // since that compresses better and they're computed together anyway. if ( pixelPositionVal == null ) { computeStyleTests(); } return boxSizingReliableVal; }, pixelMarginRight: function() { // Support: Android 4.0-4.3 if ( pixelPositionVal == null ) { computeStyleTests(); } return pixelMarginRightVal; }, pixelPosition: function() { if ( pixelPositionVal == null ) { computeStyleTests(); } return pixelPositionVal; }, reliableMarginRight: function() { // Support: Android 2.3 if ( pixelPositionVal == null ) { computeStyleTests(); } return reliableMarginRightVal; }, reliableMarginLeft: function() { // Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37 if ( pixelPositionVal == null ) { computeStyleTests(); } return reliableMarginLeftVal; } } ); function computeStyleTests() { var contents, divStyle, documentElement = document.documentElement; // Setup documentElement.appendChild( container ); div.style.cssText = // Support: Android 2.3 // Vendor-prefix box-sizing "-webkit-box-sizing:border-box;box-sizing:border-box;" + "position:relative;display:block;" + "margin:auto;border:1px;padding:1px;" + "top:1%;width:50%"; // Support: IE<9 // Assume reasonable values in the absence of getComputedStyle pixelPositionVal = boxSizingReliableVal = reliableMarginLeftVal = false; pixelMarginRightVal = reliableMarginRightVal = true; // Check for getComputedStyle so that this code is not run in IE<9. if ( window.getComputedStyle ) { divStyle = window.getComputedStyle( div ); pixelPositionVal = ( divStyle || {} ).top !== "1%"; reliableMarginLeftVal = ( divStyle || {} ).marginLeft === "2px"; boxSizingReliableVal = ( divStyle || { width: "4px" } ).width === "4px"; // Support: Android 4.0 - 4.3 only // Some styles come back with percentage values, even though they shouldn't div.style.marginRight = "50%"; pixelMarginRightVal = ( divStyle || { marginRight: "4px" } ).marginRight === "4px"; // Support: Android 2.3 only // Div with explicit width and no margin-right incorrectly // gets computed margin-right based on width of container (#3333) // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right contents = div.appendChild( document.createElement( "div" ) ); // Reset CSS: box-sizing; display; margin; border; padding contents.style.cssText = div.style.cssText = // Support: Android 2.3 // Vendor-prefix box-sizing "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + "box-sizing:content-box;display:block;margin:0;border:0;padding:0"; contents.style.marginRight = contents.style.width = "0"; div.style.width = "1px"; reliableMarginRightVal = !parseFloat( ( window.getComputedStyle( contents ) || {} ).marginRight ); div.removeChild( contents ); } // Support: IE6-8 // First check that getClientRects works as expected // Check if table cells still have offsetWidth/Height when they are set // to display:none and there are still other visible table cells in a // table row; if so, offsetWidth/Height are not reliable for use when // determining if an element has been hidden directly using // display:none (it is still safe to use offsets if a parent element is // hidden; don safety goggles and see bug #4512 for more information). div.style.display = "none"; reliableHiddenOffsetsVal = div.getClientRects().length === 0; if ( reliableHiddenOffsetsVal ) { div.style.display = ""; div.innerHTML = "
t
";

div.childNodes[ 0 ].style.borderCollapse = "separate"; contents = div.getElementsByTagName( "td" ); contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none"; reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0; if ( reliableHiddenOffsetsVal ) { contents[ 0 ].style.display = ""; contents[ 1 ].style.display = "none"; reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0; } }

// Teardown documentElement.removeChild( container ); }

} )();


var getStyles, curCSS, rposition = /^(top|right|bottom|left)$/;

if ( window.getComputedStyle ) { getStyles = function( elem ) {

// Support: IE<=11+, Firefox<=30+ (#15098, #14150) // IE throws on elements created in popups // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" var view = elem.ownerDocument.defaultView;

if ( !view || !view.opener ) { view = window; }

return view.getComputedStyle( elem ); };

curCSS = function( elem, name, computed ) { var width, minWidth, maxWidth, ret, style = elem.style;

computed = computed || getStyles( elem );

// getPropertyValue is only needed for .css('filter') in IE9, see #12537 ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;

// Support: Opera 12.1x only // Fall back to style even without computed // computed is undefined for elems on document fragments if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) { ret = jQuery.style( elem, name ); }

if ( computed ) {

// A tribute to the "awesome hack by Dean Edwards" // Chrome < 17 and Safari 5.0 uses "computed value" // instead of "used value" for margin-right // Safari 5.1.7 (at least) returns percentage for a larger set of values, // but width seems to be reliably pixels // this is against the CSSOM draft spec: // http://dev.w3.org/csswg/cssom/#resolved-values if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {

// Remember the original values width = style.width; minWidth = style.minWidth; maxWidth = style.maxWidth;

// Put in the new values to get a computed value out style.minWidth = style.maxWidth = style.width = ret; ret = computed.width;

// Revert the changed values style.width = width; style.minWidth = minWidth; style.maxWidth = maxWidth; } }

// Support: IE // IE returns zIndex value as an integer. return ret === undefined ? ret : ret + ""; }; } else if ( documentElement.currentStyle ) { getStyles = function( elem ) { return elem.currentStyle; };

curCSS = function( elem, name, computed ) { var left, rs, rsLeft, ret, style = elem.style;

computed = computed || getStyles( elem ); ret = computed ? computed[ name ] : undefined;

// Avoid setting ret to empty string here // so we don't default to auto if ( ret == null && style && style[ name ] ) { ret = style[ name ]; }

// From the awesome hack by Dean Edwards // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291

// If we're not dealing with a regular pixel number // but a number that has a weird ending, we need to convert it to pixels // but not position css attributes, as those are // proportional to the parent element instead // and we can't measure the parent instead because it // might trigger a "stacking dolls" problem if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {

// Remember the original values left = style.left; rs = elem.runtimeStyle; rsLeft = rs && rs.left;

// Put in the new values to get a computed value out if ( rsLeft ) { rs.left = elem.currentStyle.left; } style.left = name === "fontSize" ? "1em" : ret; ret = style.pixelLeft + "px";

// Revert the changed values style.left = left; if ( rsLeft ) { rs.left = rsLeft; } }

// Support: IE // IE returns zIndex value as an integer. return ret === undefined ? ret : ret + "" || "auto"; }; }



function addGetHookIf( conditionFn, hookFn ) {

// Define the hook, we'll check on the first run if it's really needed. return { get: function() { if ( conditionFn() ) {

// Hook not needed (or it's not possible to use it due // to missing dependency), remove it. delete this.get; return; }

// Hook needed; redefine it so that the support test is not executed again. return ( this.get = hookFn ).apply( this, arguments ); } }; }


var

ralpha = /alpha\([^)]*\)/i, ropacity = /opacity\s*=\s*([^)]*)/i,

// swappable if display is none or starts with table except // "table", "table-cell", or "table-caption" // see here for display values: // https://developer.mozilla.org/en-US/docs/CSS/display rdisplayswap = /^(none|table(?!-c[ea]).+)/, rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),

cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = { letterSpacing: "0", fontWeight: "400" },

cssPrefixes = [ "Webkit", "O", "Moz", "ms" ], emptyStyle = document.createElement( "div" ).style;


// return a css property mapped to a potentially vendor prefixed property function vendorPropName( name ) {

// shortcut for names that are not vendor prefixed if ( name in emptyStyle ) { return name; }

// check for vendor prefixed names var capName = name.charAt( 0 ).toUpperCase() + name.slice( 1 ), i = cssPrefixes.length;

while ( i-- ) { name = cssPrefixes[ i ] + capName; if ( name in emptyStyle ) { return name; } } }

function showHide( elements, show ) { var display, elem, hidden, values = [], index = 0, length = elements.length;

for ( ; index < length; index++ ) { elem = elements[ index ]; if ( !elem.style ) { continue; }

values[ index ] = jQuery._data( elem, "olddisplay" ); display = elem.style.display; if ( show ) {

// Reset the inline display of this element to learn if it is // being hidden by cascaded rules or not if ( !values[ index ] && display === "none" ) { elem.style.display = ""; }

// Set elements which have been overridden with display: none // in a stylesheet to whatever the default browser style is // for such an element if ( elem.style.display === "" && isHidden( elem ) ) { values[ index ] = jQuery._data( elem, "olddisplay", defaultDisplay( elem.nodeName ) ); } } else { hidden = isHidden( elem );

if ( display && display !== "none" || !hidden ) { jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) ); } } }

// Set the display of most of the elements in a second loop // to avoid the constant reflow for ( index = 0; index < length; index++ ) { elem = elements[ index ]; if ( !elem.style ) { continue; } if ( !show || elem.style.display === "none" || elem.style.display === "" ) { elem.style.display = show ? values[ index ] || "" : "none"; } }

return elements; }

function setPositiveNumber( elem, value, subtract ) { var matches = rnumsplit.exec( value ); return matches ?

// Guard against undefined "subtract", e.g., when used as in cssHooks Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : value; }

function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { var i = extra === ( isBorderBox ? "border" : "content" ) ?

// If we already have the right measurement, avoid augmentation 4 :

// Otherwise initialize for horizontal or vertical properties name === "width" ? 1 : 0,

val = 0;

for ( ; i < 4; i += 2 ) {

// both box models exclude margin, so add it if we want it if ( extra === "margin" ) { val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); }

if ( isBorderBox ) {

// border-box includes padding, so remove it if we want content if ( extra === "content" ) { val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); }

// at this point, extra isn't border nor margin, so remove border if ( extra !== "margin" ) { val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } } else {

// at this point, extra isn't content, so add padding val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );

// at this point, extra isn't content nor padding, so add border if ( extra !== "padding" ) { val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } } }

return val; }

function getWidthOrHeight( elem, name, extra ) {

// Start with offset property, which is equivalent to the border-box value var valueIsBorderBox = true, val = name === "width" ? elem.offsetWidth : elem.offsetHeight, styles = getStyles( elem ), isBorderBox = support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";

// some non-html elements return undefined for offsetWidth, so check for null/undefined // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 if ( val <= 0 || val == null ) {

// Fall back to computed then uncomputed css if necessary val = curCSS( elem, name, styles ); if ( val < 0 || val == null ) { val = elem.style[ name ]; }

// Computed unit is not pixels. Stop here and return. if ( rnumnonpx.test( val ) ) { return val; }

// we need the check for style in case a browser which returns unreliable values // for getComputedStyle silently falls back to the reliable elem.style valueIsBorderBox = isBorderBox && ( support.boxSizingReliable() || val === elem.style[ name ] );

// Normalize "", auto, and prepare for extra val = parseFloat( val ) || 0; }

// use the active box-sizing model to add/subtract irrelevant styles return ( val + augmentWidthOrHeight( elem, name, extra || ( isBorderBox ? "border" : "content" ), valueIsBorderBox, styles ) ) + "px"; }

jQuery.extend( {

// Add in style property hooks for overriding the default // behavior of getting and setting a style property cssHooks: { opacity: { get: function( elem, computed ) { if ( computed ) {

// We should always get a number back from opacity var ret = curCSS( elem, "opacity" ); return ret === "" ? "1" : ret; } } } },

// Don't automatically add "px" to these possibly-unitless properties cssNumber: { "animationIterationCount": true, "columnCount": true, "fillOpacity": true, "flexGrow": true, "flexShrink": true, "fontWeight": true, "lineHeight": true, "opacity": true, "order": true, "orphans": true, "widows": true, "zIndex": true, "zoom": true },

// Add in properties whose names you wish to fix before // setting or getting the value cssProps: {

// normalize float css property "float": support.cssFloat ? "cssFloat" : "styleFloat" },

// Get and set the style property on a DOM Node style: function( elem, name, value, extra ) {

// Don't set styles on text and comment nodes if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { return; }

// Make sure that we're working with the right name var ret, type, hooks, origName = jQuery.camelCase( name ), style = elem.style;

name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );

// gets hook for the prefixed version // followed by the unprefixed version hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];

// Check if we're setting a value if ( value !== undefined ) { type = typeof value;

// Convert "+=" or "-=" to relative numbers (#7345) if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { value = adjustCSS( elem, name, ret );

// Fixes bug #9237 type = "number"; }

// Make sure that null and NaN values aren't set. See: #7116 if ( value == null || value !== value ) { return; }

// If a number was passed in, add the unit (except for certain CSS properties) if ( type === "number" ) { value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); }

// Fixes #8908, it can be done more correctly by specifing setters in cssHooks, // but it would mean to define eight // (for every problematic property) identical functions if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { style[ name ] = "inherit"; }

// If a hook was provided, use that value, otherwise just set the specified value if ( !hooks || !( "set" in hooks ) || ( value = hooks.set( elem, value, extra ) ) !== undefined ) {

// Support: IE // Swallow errors from 'invalid' CSS values (#5509) try { style[ name ] = value; } catch ( e ) {} }

} else {

// If a hook was provided get the non-computed value from there if ( hooks && "get" in hooks && ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {

return ret; }

// Otherwise just get the value from the style object return style[ name ]; } },

css: function( elem, name, extra, styles ) { var num, val, hooks, origName = jQuery.camelCase( name );

// Make sure that we're working with the right name name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );

// gets hook for the prefixed version // followed by the unprefixed version hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];

// If a hook was provided get the computed value from there if ( hooks && "get" in hooks ) { val = hooks.get( elem, true, extra ); }

// Otherwise, if a way to get the computed value exists, use that if ( val === undefined ) { val = curCSS( elem, name, styles ); }

//convert "normal" to computed value if ( val === "normal" && name in cssNormalTransform ) { val = cssNormalTransform[ name ]; }

// Return, converting to number if forced or a qualifier was provided and val looks numeric if ( extra === "" || extra ) { num = parseFloat( val ); return extra === true || isFinite( num ) ? num || 0 : val; } return val; } } );

jQuery.each( [ "height", "width" ], function( i, name ) { jQuery.cssHooks[ name ] = { get: function( elem, computed, extra ) { if ( computed ) {

// certain elements can have dimension info if we invisibly show them // however, it must have a current display style that would benefit from this return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ? swap( elem, cssShow, function() { return getWidthOrHeight( elem, name, extra ); } ) : getWidthOrHeight( elem, name, extra ); } },

set: function( elem, value, extra ) { var styles = extra && getStyles( elem ); return setPositiveNumber( elem, value, extra ? augmentWidthOrHeight( elem, name, extra, support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box", styles ) : 0 ); } }; } );

if ( !support.opacity ) { jQuery.cssHooks.opacity = { get: function( elem, computed ) {

// IE uses filters for opacity return ropacity.test( ( computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter ) || "" ) ? ( 0.01 * parseFloat( RegExp.$1 ) ) + "" : computed ? "1" : ""; },

set: function( elem, value ) { var style = elem.style, currentStyle = elem.currentStyle, opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "", filter = currentStyle && currentStyle.filter || style.filter || "";

// IE has trouble with opacity if it does not have layout // Force it by setting the zoom level style.zoom = 1;

// if setting opacity to 1, and no other filters exist - // attempt to remove filter attribute #6652 // if value === "", then remove inline opacity #12685 if ( ( value >= 1 || value === "" ) && jQuery.trim( filter.replace( ralpha, "" ) ) === "" && style.removeAttribute ) {

// Setting style.filter to null, "" & " " still leave "filter:" in the cssText // if "filter:" is present at all, clearType is disabled, we want to avoid this // style.removeAttribute is IE Only, but so apparently is this code path... style.removeAttribute( "filter" );

// if there is no filter style applied in a css rule // or unset inline opacity, we are done if ( value === "" || currentStyle && !currentStyle.filter ) { return; } }

// otherwise, set new filter values style.filter = ralpha.test( filter ) ? filter.replace( ralpha, opacity ) : filter + " " + opacity; } }; }

jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight, function( elem, computed ) { if ( computed ) { return swap( elem, { "display": "inline-block" }, curCSS, [ elem, "marginRight" ] ); } } );

jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, function( elem, computed ) { if ( computed ) { return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||

// Support: IE<=11+ // Running getBoundingClientRect on a disconnected node in IE throws an error // Support: IE8 only // getClientRects() errors on disconnected elems ( jQuery.contains( elem.ownerDocument, elem ) ? elem.getBoundingClientRect().left - swap( elem, { marginLeft: 0 }, function() { return elem.getBoundingClientRect().left; } ) : 0 ) ) + "px"; } } );

// These hooks are used by animate to expand properties jQuery.each( { margin: "", padding: "", border: "Width" }, function( prefix, suffix ) { jQuery.cssHooks[ prefix + suffix ] = { expand: function( value ) { var i = 0, expanded = {},

// assumes a single number if not a string parts = typeof value === "string" ? value.split( " " ) : [ value ];

for ( ; i < 4; i++ ) { expanded[ prefix + cssExpand[ i ] + suffix ] = parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; }

return expanded; } };

if ( !rmargin.test( prefix ) ) { jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; } } );

jQuery.fn.extend( { css: function( name, value ) { return access( this, function( elem, name, value ) { var styles, len, map = {}, i = 0;

if ( jQuery.isArray( name ) ) { styles = getStyles( elem ); len = name.length;

for ( ; i < len; i++ ) { map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); }

return map; }

return value !== undefined ? jQuery.style( elem, name, value ) : jQuery.css( elem, name ); }, name, value, arguments.length > 1 ); }, show: function() { return showHide( this, true ); }, hide: function() { return showHide( this ); }, toggle: function( state ) { if ( typeof state === "boolean" ) { return state ? this.show() : this.hide(); }

return this.each( function() { if ( isHidden( this ) ) { jQuery( this ).show(); } else { jQuery( this ).hide(); } } ); } } );


function Tween( elem, options, prop, end, easing ) { return new Tween.prototype.init( elem, options, prop, end, easing ); } jQuery.Tween = Tween;

Tween.prototype = { constructor: Tween, init: function( elem, options, prop, end, easing, unit ) { this.elem = elem; this.prop = prop; this.easing = easing || jQuery.easing._default; this.options = options; this.start = this.now = this.cur(); this.end = end; this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); }, cur: function() { var hooks = Tween.propHooks[ this.prop ];

return hooks && hooks.get ? hooks.get( this ) : Tween.propHooks._default.get( this ); }, run: function( percent ) { var eased, hooks = Tween.propHooks[ this.prop ];

if ( this.options.duration ) { this.pos = eased = jQuery.easing[ this.easing ]( percent, this.options.duration * percent, 0, 1, this.options.duration ); } else { this.pos = eased = percent; } this.now = ( this.end - this.start ) * eased + this.start;

if ( this.options.step ) { this.options.step.call( this.elem, this.now, this ); }

if ( hooks && hooks.set ) { hooks.set( this ); } else { Tween.propHooks._default.set( this ); } return this; } };

Tween.prototype.init.prototype = Tween.prototype;

Tween.propHooks = { _default: { get: function( tween ) { var result;

// Use a property on the element directly when it is not a DOM element, // or when there is no matching style property that exists. if ( tween.elem.nodeType !== 1 || tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { return tween.elem[ tween.prop ]; }

// passing an empty string as a 3rd parameter to .css will automatically // attempt a parseFloat and fallback to a string if the parse fails // so, simple values such as "10px" are parsed to Float. // complex values such as "rotate(1rad)" are returned as is. result = jQuery.css( tween.elem, tween.prop, "" );

// Empty strings, null, undefined and "auto" are converted to 0. return !result || result === "auto" ? 0 : result; }, set: function( tween ) {

// use step hook for back compat - use cssHook if its there - use .style if its // available and use plain properties where available if ( jQuery.fx.step[ tween.prop ] ) { jQuery.fx.step[ tween.prop ]( tween ); } else if ( tween.elem.nodeType === 1 && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) { jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); } else { tween.elem[ tween.prop ] = tween.now; } } } };

// Support: IE <=9 // Panic based approach to setting things on disconnected nodes

Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { set: function( tween ) { if ( tween.elem.nodeType && tween.elem.parentNode ) { tween.elem[ tween.prop ] = tween.now; } } };

jQuery.easing = { linear: function( p ) { return p; }, swing: function( p ) { return 0.5 - Math.cos( p * Math.PI ) / 2; }, _default: "swing" };

jQuery.fx = Tween.prototype.init;

// Back Compat <1.8 extension point jQuery.fx.step = {};



var fxNow, timerId, rfxtypes = /^(?:toggle|show|hide)$/, rrun = /queueHooks$/;

// Animations created synchronously will run synchronously function createFxNow() { window.setTimeout( function() { fxNow = undefined; } ); return ( fxNow = jQuery.now() ); }

// Generate parameters to create a standard animation function genFx( type, includeWidth ) { var which, attrs = { height: type }, i = 0;

// if we include width, step value is 1 to do all cssExpand values, // if we don't include width, step value is 2 to skip over Left and Right includeWidth = includeWidth ? 1 : 0; for ( ; i < 4 ; i += 2 - includeWidth ) { which = cssExpand[ i ]; attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; }

if ( includeWidth ) { attrs.opacity = attrs.width = type; }

return attrs; }

function createTween( value, prop, animation ) { var tween, collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), index = 0, length = collection.length; for ( ; index < length; index++ ) { if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {

// we're done with this property return tween; } } }

function defaultPrefilter( elem, props, opts ) { /* jshint validthis: true */ var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay, anim = this, orig = {}, style = elem.style, hidden = elem.nodeType && isHidden( elem ), dataShow = jQuery._data( elem, "fxshow" );

// handle queue: false promises if ( !opts.queue ) { hooks = jQuery._queueHooks( elem, "fx" ); if ( hooks.unqueued == null ) { hooks.unqueued = 0; oldfire = hooks.empty.fire; hooks.empty.fire = function() { if ( !hooks.unqueued ) { oldfire(); } }; } hooks.unqueued++;

anim.always( function() {

// doing this makes sure that the complete handler will be called // before this completes anim.always( function() { hooks.unqueued--; if ( !jQuery.queue( elem, "fx" ).length ) { hooks.empty.fire(); } } ); } ); }

// height/width overflow pass if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {

// Make sure that nothing sneaks out // Record all 3 overflow attributes because IE does not // change the overflow attribute when overflowX and // overflowY are set to the same value opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];

// Set display property to inline-block for height/width // animations on inline elements that are having width/height animated display = jQuery.css( elem, "display" );

// Test default display if display is currently "none" checkDisplay = display === "none" ? jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;

if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {

// inline-level elements accept inline-block; // block-level elements need to be inline with layout if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) { style.display = "inline-block"; } else { style.zoom = 1; } } }

if ( opts.overflow ) { style.overflow = "hidden"; if ( !support.shrinkWrapBlocks() ) { anim.always( function() { style.overflow = opts.overflow[ 0 ]; style.overflowX = opts.overflow[ 1 ]; style.overflowY = opts.overflow[ 2 ]; } ); } }

// show/hide pass for ( prop in props ) { value = props[ prop ]; if ( rfxtypes.exec( value ) ) { delete props[ prop ]; toggle = toggle || value === "toggle"; if ( value === ( hidden ? "hide" : "show" ) ) {

// If there is dataShow left over from a stopped hide or show // and we are going to proceed with show, we should pretend to be hidden if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { hidden = true; } else { continue; } } orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );

// Any non-fx value stops us from restoring the original display value } else { display = undefined; } }

if ( !jQuery.isEmptyObject( orig ) ) { if ( dataShow ) { if ( "hidden" in dataShow ) { hidden = dataShow.hidden; } } else { dataShow = jQuery._data( elem, "fxshow", {} ); }

// store state if its toggle - enables .stop().toggle() to "reverse" if ( toggle ) { dataShow.hidden = !hidden; } if ( hidden ) { jQuery( elem ).show(); } else { anim.done( function() { jQuery( elem ).hide(); } ); } anim.done( function() { var prop; jQuery._removeData( elem, "fxshow" ); for ( prop in orig ) { jQuery.style( elem, prop, orig[ prop ] ); } } ); for ( prop in orig ) { tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );

if ( !( prop in dataShow ) ) { dataShow[ prop ] = tween.start; if ( hidden ) { tween.end = tween.start; tween.start = prop === "width" || prop === "height" ? 1 : 0; } } }

// If this is a noop like .hide().hide(), restore an overwritten display value } else if ( ( display === "none" ? defaultDisplay( elem.nodeName ) : display ) === "inline" ) { style.display = display; } }

function propFilter( props, specialEasing ) { var index, name, easing, value, hooks;

// camelCase, specialEasing and expand cssHook pass for ( index in props ) { name = jQuery.camelCase( index ); easing = specialEasing[ name ]; value = props[ index ]; if ( jQuery.isArray( value ) ) { easing = value[ 1 ]; value = props[ index ] = value[ 0 ]; }

if ( index !== name ) { props[ name ] = value; delete props[ index ]; }

hooks = jQuery.cssHooks[ name ]; if ( hooks && "expand" in hooks ) { value = hooks.expand( value ); delete props[ name ];

// not quite $.extend, this wont overwrite keys already present. // also - reusing 'index' from above because we have the correct "name" for ( index in value ) { if ( !( index in props ) ) { props[ index ] = value[ index ]; specialEasing[ index ] = easing; } } } else { specialEasing[ name ] = easing; } } }

function Animation( elem, properties, options ) { var result, stopped, index = 0, length = Animation.prefilters.length, deferred = jQuery.Deferred().always( function() {

// don't match elem in the :animated selector delete tick.elem; } ), tick = function() { if ( stopped ) { return false; } var currentTime = fxNow || createFxNow(), remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),

// Support: Android 2.3 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) temp = remaining / animation.duration || 0, percent = 1 - temp, index = 0, length = animation.tweens.length;

for ( ; index < length ; index++ ) { animation.tweens[ index ].run( percent ); }

deferred.notifyWith( elem, [ animation, percent, remaining ] );

if ( percent < 1 && length ) { return remaining; } else { deferred.resolveWith( elem, [ animation ] ); return false; } }, animation = deferred.promise( { elem: elem, props: jQuery.extend( {}, properties ), opts: jQuery.extend( true, { specialEasing: {}, easing: jQuery.easing._default }, options ), originalProperties: properties, originalOptions: options, startTime: fxNow || createFxNow(), duration: options.duration, tweens: [], createTween: function( prop, end ) { var tween = jQuery.Tween( elem, animation.opts, prop, end, animation.opts.specialEasing[ prop ] || animation.opts.easing ); animation.tweens.push( tween ); return tween; }, stop: function( gotoEnd ) { var index = 0,

// if we are going to the end, we want to run all the tweens // otherwise we skip this part length = gotoEnd ? animation.tweens.length : 0; if ( stopped ) { return this; } stopped = true; for ( ; index < length ; index++ ) { animation.tweens[ index ].run( 1 ); }

// resolve when we played the last frame // otherwise, reject if ( gotoEnd ) { deferred.notifyWith( elem, [ animation, 1, 0 ] ); deferred.resolveWith( elem, [ animation, gotoEnd ] ); } else { deferred.rejectWith( elem, [ animation, gotoEnd ] ); } return this; } } ), props = animation.props;

propFilter( props, animation.opts.specialEasing );

for ( ; index < length ; index++ ) { result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); if ( result ) { if ( jQuery.isFunction( result.stop ) ) { jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = jQuery.proxy( result.stop, result ); } return result; } }

jQuery.map( props, createTween, animation );

if ( jQuery.isFunction( animation.opts.start ) ) { animation.opts.start.call( elem, animation ); }

jQuery.fx.timer( jQuery.extend( tick, { elem: elem, anim: animation, queue: animation.opts.queue } ) );

// attach callbacks from options return animation.progress( animation.opts.progress ) .done( animation.opts.done, animation.opts.complete ) .fail( animation.opts.fail ) .always( animation.opts.always ); }

jQuery.Animation = jQuery.extend( Animation, {

tweeners: { "*": [ function( prop, value ) { var tween = this.createTween( prop, value ); adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); return tween; } ] },

tweener: function( props, callback ) { if ( jQuery.isFunction( props ) ) { callback = props; props = [ "*" ]; } else { props = props.match( rnotwhite ); }

var prop, index = 0, length = props.length;

for ( ; index < length ; index++ ) { prop = props[ index ]; Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; Animation.tweeners[ prop ].unshift( callback ); } },

prefilters: [ defaultPrefilter ],

prefilter: function( callback, prepend ) { if ( prepend ) { Animation.prefilters.unshift( callback ); } else { Animation.prefilters.push( callback ); } } } );

jQuery.speed = function( speed, easing, fn ) { var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { complete: fn || !fn && easing || jQuery.isFunction( speed ) && speed, duration: speed, easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing };

opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;

// normalize opt.queue - true/undefined/null -> "fx" if ( opt.queue == null || opt.queue === true ) { opt.queue = "fx"; }

// Queueing opt.old = opt.complete;

opt.complete = function() { if ( jQuery.isFunction( opt.old ) ) { opt.old.call( this ); }

if ( opt.queue ) { jQuery.dequeue( this, opt.queue ); } };

return opt; };

jQuery.fn.extend( { fadeTo: function( speed, to, easing, callback ) {

// show any hidden elements after setting opacity to 0 return this.filter( isHidden ).css( "opacity", 0 ).show()

// animate to the value specified .end().animate( { opacity: to }, speed, easing, callback ); }, animate: function( prop, speed, easing, callback ) { var empty = jQuery.isEmptyObject( prop ), optall = jQuery.speed( speed, easing, callback ), doAnimation = function() {

// Operate on a copy of prop so per-property easing won't be lost var anim = Animation( this, jQuery.extend( {}, prop ), optall );

// Empty animations, or finishing resolves immediately if ( empty || jQuery._data( this, "finish" ) ) { anim.stop( true ); } }; doAnimation.finish = doAnimation;

return empty || optall.queue === false ? this.each( doAnimation ) : this.queue( optall.queue, doAnimation ); }, stop: function( type, clearQueue, gotoEnd ) { var stopQueue = function( hooks ) { var stop = hooks.stop; delete hooks.stop; stop( gotoEnd ); };

if ( typeof type !== "string" ) { gotoEnd = clearQueue; clearQueue = type; type = undefined; } if ( clearQueue && type !== false ) { this.queue( type || "fx", [] ); }

return this.each( function() { var dequeue = true, index = type != null && type + "queueHooks", timers = jQuery.timers, data = jQuery._data( this );

if ( index ) { if ( data[ index ] && data[ index ].stop ) { stopQueue( data[ index ] ); } } else { for ( index in data ) { if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { stopQueue( data[ index ] ); } } }

for ( index = timers.length; index--; ) { if ( timers[ index ].elem === this && ( type == null || timers[ index ].queue === type ) ) {

timers[ index ].anim.stop( gotoEnd ); dequeue = false; timers.splice( index, 1 ); } }

// start the next in the queue if the last step wasn't forced // timers currently will call their complete callbacks, which will dequeue // but only if they were gotoEnd if ( dequeue || !gotoEnd ) { jQuery.dequeue( this, type ); } } ); }, finish: function( type ) { if ( type !== false ) { type = type || "fx"; } return this.each( function() { var index, data = jQuery._data( this ), queue = data[ type + "queue" ], hooks = data[ type + "queueHooks" ], timers = jQuery.timers, length = queue ? queue.length : 0;

// enable finishing flag on private data data.finish = true;

// empty the queue first jQuery.queue( this, type, [] );

if ( hooks && hooks.stop ) { hooks.stop.call( this, true ); }

// look for any active animations, and finish them for ( index = timers.length; index--; ) { if ( timers[ index ].elem === this && timers[ index ].queue === type ) { timers[ index ].anim.stop( true ); timers.splice( index, 1 ); } }

// look for any animations in the old queue and finish them for ( index = 0; index < length; index++ ) { if ( queue[ index ] && queue[ index ].finish ) { queue[ index ].finish.call( this ); } }

// turn off finishing flag delete data.finish; } ); } } );

jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { var cssFn = jQuery.fn[ name ]; jQuery.fn[ name ] = function( speed, easing, callback ) { return speed == null || typeof speed === "boolean" ? cssFn.apply( this, arguments ) : this.animate( genFx( name, true ), speed, easing, callback ); }; } );

// Generate shortcuts for custom animations jQuery.each( { slideDown: genFx( "show" ), slideUp: genFx( "hide" ), slideToggle: genFx( "toggle" ), fadeIn: { opacity: "show" }, fadeOut: { opacity: "hide" }, fadeToggle: { opacity: "toggle" } }, function( name, props ) { jQuery.fn[ name ] = function( speed, easing, callback ) { return this.animate( props, speed, easing, callback ); }; } );

jQuery.timers = []; jQuery.fx.tick = function() { var timer, timers = jQuery.timers, i = 0;

fxNow = jQuery.now();

for ( ; i < timers.length; i++ ) { timer = timers[ i ];

// Checks the timer has not already been removed if ( !timer() && timers[ i ] === timer ) { timers.splice( i--, 1 ); } }

if ( !timers.length ) { jQuery.fx.stop(); } fxNow = undefined; };

jQuery.fx.timer = function( timer ) { jQuery.timers.push( timer ); if ( timer() ) { jQuery.fx.start(); } else { jQuery.timers.pop(); } };

jQuery.fx.interval = 13;

jQuery.fx.start = function() { if ( !timerId ) { timerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval ); } };

jQuery.fx.stop = function() { window.clearInterval( timerId ); timerId = null; };

jQuery.fx.speeds = { slow: 600, fast: 200,

// Default speed _default: 400 };


// Based off of the plugin by Clint Helfers, with permission. // http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ jQuery.fn.delay = function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx";

return this.queue( type, function( next, hooks ) { var timeout = window.setTimeout( next, time ); hooks.stop = function() { window.clearTimeout( timeout ); }; } ); };


( function() { var a, input = document.createElement( "input" ), div = document.createElement( "div" ), select = document.createElement( "select" ), opt = select.appendChild( document.createElement( "option" ) );

// Setup div = document.createElement( "div" ); div.setAttribute( "className", "t" );

div.innerHTML = " <link/>
<a href='/a'>a</a><input type='checkbox'/>";

a = div.getElementsByTagName( "a" )[ 0 ];

// Support: Windows Web Apps (WWA) // `type` must use .setAttribute for WWA (#14901) input.setAttribute( "type", "checkbox" ); div.appendChild( input );

a = div.getElementsByTagName( "a" )[ 0 ];

// First batch of tests. a.style.cssText = "top:1px";

// Test setAttribute on camelCase class. // If it works, we need attrFixes when doing get/setAttribute (ie6/7) support.getSetAttribute = div.className !== "t";

// Get the style information from getAttribute // (IE uses .cssText instead) support.style = /top/.test( a.getAttribute( "style" ) );

// Make sure that URLs aren't manipulated // (IE normalizes it by default) support.hrefNormalized = a.getAttribute( "href" ) === "/a";

// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere) support.checkOn = !!input.value;

// Make sure that a selected-by-default option has a working selected property. // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) support.optSelected = opt.selected;

// Tests for enctype support on a form (#6743) support.enctype = !!document.createElement( "form" ).enctype;

// Make sure that the options inside disabled selects aren't marked as disabled // (WebKit marks them as disabled) select.disabled = true; support.optDisabled = !opt.disabled;

// Support: IE8 only // Check if we can trust getAttribute("value") input = document.createElement( "input" ); input.setAttribute( "value", "" ); support.input = input.getAttribute( "value" ) === "";

// Check if an input maintains its value after becoming a radio input.value = "t"; input.setAttribute( "type", "radio" ); support.radioValue = input.value === "t"; } )();


var rreturn = /\r/g, rspaces = /[\x20\t\r\n\f]+/g;

jQuery.fn.extend( { val: function( value ) { var hooks, ret, isFunction, elem = this[ 0 ];

if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];

if ( hooks && "get" in hooks && ( ret = hooks.get( elem, "value" ) ) !== undefined ) { return ret; }

ret = elem.value;

return typeof ret === "string" ?

// handle most common string cases ret.replace( rreturn, "" ) :

// handle cases where value is null/undef or number ret == null ? "" : ret; }

return; }

isFunction = jQuery.isFunction( value );

return this.each( function( i ) { var val;

if ( this.nodeType !== 1 ) { return; }

if ( isFunction ) { val = value.call( this, i, jQuery( this ).val() ); } else { val = value; }

// Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( jQuery.isArray( val ) ) { val = jQuery.map( val, function( value ) { return value == null ? "" : value + ""; } ); }

hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];

// If set returns undefined, fall back to normal setting if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } } ); } } );

jQuery.extend( { valHooks: { option: { get: function( elem ) { var val = jQuery.find.attr( elem, "value" ); return val != null ? val :

// Support: IE10-11+ // option.text throws exceptions (#14686, #14858) // Strip and collapse whitespace // https://html.spec.whatwg.org/#strip-and-collapse-whitespace jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " ); } }, select: { get: function( elem ) { var value, option, options = elem.options, index = elem.selectedIndex, one = elem.type === "select-one" || index < 0, values = one ? null : [], max = one ? index + 1 : options.length, i = index < 0 ? max : one ? index : 0;

// Loop through all the selected options for ( ; i < max; i++ ) { option = options[ i ];

// oldIE doesn't update selected after form reset (#2551) if ( ( option.selected || i === index ) &&

// Don't return options that are disabled or in a disabled optgroup ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) && ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {

// Get the specific value for the option value = jQuery( option ).val();

// We don't need an array for one selects if ( one ) { return value; }

// Multi-Selects return an array values.push( value ); } }

return values; },

set: function( elem, value ) { var optionSet, option, options = elem.options, values = jQuery.makeArray( value ), i = options.length;

while ( i-- ) { option = options[ i ];

if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) {

// Support: IE6 // When new option element is added to select box we need to // force reflow of newly added node in order to workaround delay // of initialization properties try { option.selected = optionSet = true;

} catch ( _ ) {

// Will be executed only in IE6 option.scrollHeight; }

} else { option.selected = false; } }

// Force browsers to behave consistently when non-matching value is set if ( !optionSet ) { elem.selectedIndex = -1; }

return options; } } } } );

// Radios and checkboxes getter/setter jQuery.each( [ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { set: function( elem, value ) { if ( jQuery.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); } } }; if ( !support.checkOn ) { jQuery.valHooks[ this ].get = function( elem ) { return elem.getAttribute( "value" ) === null ? "on" : elem.value; }; } } );



var nodeHook, boolHook, attrHandle = jQuery.expr.attrHandle, ruseDefault = /^(?:checked|selected)$/i, getSetAttribute = support.getSetAttribute, getSetInput = support.input;

jQuery.fn.extend( { attr: function( name, value ) { return access( this, jQuery.attr, name, value, arguments.length > 1 ); },

removeAttr: function( name ) { return this.each( function() { jQuery.removeAttr( this, name ); } ); } } );

jQuery.extend( { attr: function( elem, name, value ) { var ret, hooks, nType = elem.nodeType;

// Don't get/set attributes on text, comment and attribute nodes if ( nType === 3 || nType === 8 || nType === 2 ) { return; }

// Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); }

// All attributes are lowercase // Grab necessary hook if one is defined if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { name = name.toLowerCase(); hooks = jQuery.attrHooks[ name ] || ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); }

if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; }

if ( hooks && "set" in hooks && ( ret = hooks.set( elem, value, name ) ) !== undefined ) { return ret; }

elem.setAttribute( name, value + "" ); return value; }

if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { return ret; }

ret = jQuery.find.attr( elem, name );

// Non-existent attributes return null, we normalize to undefined return ret == null ? undefined : ret; },

attrHooks: { type: { set: function( elem, value ) { if ( !support.radioValue && value === "radio" && jQuery.nodeName( elem, "input" ) ) {

// Setting the type on a radio button after the value resets the value in IE8-9 // Reset value to default in case type is set after value during creation var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } } },

removeAttr: function( elem, value ) { var name, propName, i = 0, attrNames = value && value.match( rnotwhite );

if ( attrNames && elem.nodeType === 1 ) { while ( ( name = attrNames[ i++ ] ) ) { propName = jQuery.propFix[ name ] || name;

// Boolean attributes get special treatment (#10870) if ( jQuery.expr.match.bool.test( name ) ) {

// Set corresponding property to false if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { elem[ propName ] = false;

// Support: IE<9 // Also clear defaultChecked/defaultSelected (if appropriate) } else { elem[ jQuery.camelCase( "default-" + name ) ] = elem[ propName ] = false; }

// See #9699 for explanation of this approach (setting first, then removal) } else { jQuery.attr( elem, name, "" ); }

elem.removeAttribute( getSetAttribute ? name : propName ); } } } } );

// Hooks for boolean attributes boolHook = { set: function( elem, value, name ) { if ( value === false ) {

// Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {

// IE<8 needs the *property* name elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );

} else {

// Support: IE<9 // Use defaultChecked and defaultSelected for oldIE elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true; } return name; } };

jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { var getter = attrHandle[ name ] || jQuery.find.attr;

if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { attrHandle[ name ] = function( elem, name, isXML ) { var ret, handle; if ( !isXML ) {

// Avoid an infinite loop by temporarily removing this function from the getter handle = attrHandle[ name ]; attrHandle[ name ] = ret; ret = getter( elem, name, isXML ) != null ? name.toLowerCase() : null; attrHandle[ name ] = handle; } return ret; }; } else { attrHandle[ name ] = function( elem, name, isXML ) { if ( !isXML ) { return elem[ jQuery.camelCase( "default-" + name ) ] ? name.toLowerCase() : null; } }; } } );

// fix oldIE attroperties if ( !getSetInput || !getSetAttribute ) { jQuery.attrHooks.value = { set: function( elem, value, name ) { if ( jQuery.nodeName( elem, "input" ) ) {

// Does not return so that setAttribute is also used elem.defaultValue = value; } else {

// Use nodeHook if defined (#1954); otherwise setAttribute is fine return nodeHook && nodeHook.set( elem, value, name ); } } }; }

// IE6/7 do not support getting/setting some attributes with get/setAttribute if ( !getSetAttribute ) {

// Use this for any attribute in IE6/7 // This fixes almost every IE6/7 issue nodeHook = { set: function( elem, value, name ) {

// Set the existing or create a new attribute node var ret = elem.getAttributeNode( name ); if ( !ret ) { elem.setAttributeNode( ( ret = elem.ownerDocument.createAttribute( name ) ) ); }

ret.value = value += "";

// Break association with cloned elements by also using setAttribute (#9646) if ( name === "value" || value === elem.getAttribute( name ) ) { return value; } } };

// Some attributes are constructed with empty-string values when not defined attrHandle.id = attrHandle.name = attrHandle.coords = function( elem, name, isXML ) { var ret; if ( !isXML ) { return ( ret = elem.getAttributeNode( name ) ) && ret.value !== "" ? ret.value : null; } };

// Fixing value retrieval on a button requires this module jQuery.valHooks.button = { get: function( elem, name ) { var ret = elem.getAttributeNode( name ); if ( ret && ret.specified ) { return ret.value; } }, set: nodeHook.set };

// Set contenteditable to false on removals(#10429) // Setting to empty string throws an error as an invalid value jQuery.attrHooks.contenteditable = { set: function( elem, value, name ) { nodeHook.set( elem, value === "" ? false : value, name ); } };

// Set width and height to auto instead of 0 on empty string( Bug #8150 ) // This is for removals jQuery.each( [ "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = { set: function( elem, value ) { if ( value === "" ) { elem.setAttribute( name, "auto" ); return value; } } }; } ); }

if ( !support.style ) { jQuery.attrHooks.style = { get: function( elem ) {

// Return undefined in the case of empty string // Note: IE uppercases css property names, but if we were to .toLowerCase() // .cssText, that would destroy case sensitivity in URL's, like in "background" return elem.style.cssText || undefined; }, set: function( elem, value ) { return ( elem.style.cssText = value + "" ); } }; }



var rfocusable = /^(?:input|select|textarea|button|object)$/i, rclickable = /^(?:a|area)$/i;

jQuery.fn.extend( { prop: function( name, value ) { return access( this, jQuery.prop, name, value, arguments.length > 1 ); },

removeProp: function( name ) { name = jQuery.propFix[ name ] || name; return this.each( function() {

// try/catch handles cases where IE balks (such as removing a property on window) try { this[ name ] = undefined; delete this[ name ]; } catch ( e ) {} } ); } } );

jQuery.extend( { prop: function( elem, name, value ) { var ret, hooks, nType = elem.nodeType;

// Don't get/set properties on text, comment and attribute nodes if ( nType === 3 || nType === 8 || nType === 2 ) { return; }

if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {

// Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; }

if ( value !== undefined ) { if ( hooks && "set" in hooks && ( ret = hooks.set( elem, value, name ) ) !== undefined ) { return ret; }

return ( elem[ name ] = value ); }

if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { return ret; }

return elem[ name ]; },

propHooks: { tabIndex: { get: function( elem ) {

// elem.tabIndex doesn't always return the // correct value when it hasn't been explicitly set // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ // Use proper attribute retrieval(#12072) var tabindex = jQuery.find.attr( elem, "tabindex" );

return tabindex ? parseInt( tabindex, 10 ) : rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? 0 : -1; } } },

propFix: { "for": "htmlFor", "class": "className" } } );

// Some attributes require a special call on IE // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx if ( !support.hrefNormalized ) {

// href/src property should get the full normalized URL (#10299/#12915) jQuery.each( [ "href", "src" ], function( i, name ) { jQuery.propHooks[ name ] = { get: function( elem ) { return elem.getAttribute( name, 4 ); } }; } ); }

// Support: Safari, IE9+ // Accessing the selectedIndex property // forces the browser to respect setting selected // on the option // The getter ensures a default option is selected // when in an optgroup if ( !support.optSelected ) { jQuery.propHooks.selected = { get: function( elem ) { var parent = elem.parentNode;

if ( parent ) { parent.selectedIndex;

// Make sure that it also works with optgroups, see #5701 if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } return null; }, set: function( elem ) { var parent = elem.parentNode; if ( parent ) { parent.selectedIndex;

if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } } }; }

jQuery.each( [ "tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable" ], function() { jQuery.propFix[ this.toLowerCase() ] = this; } );

// IE6/7 call enctype encoding if ( !support.enctype ) { jQuery.propFix.enctype = "encoding"; }



var rclass = /[\t\r\n\f]/g;

function getClass( elem ) { return jQuery.attr( elem, "class" ) || ""; }

jQuery.fn.extend( { addClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0;

if ( jQuery.isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); } ); }

if ( typeof value === "string" && value ) { classes = value.match( rnotwhite ) || [];

while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); cur = elem.nodeType === 1 && ( " " + curValue + " " ).replace( rclass, " " );

if ( cur ) { j = 0; while ( ( clazz = classes[ j++ ] ) ) { if ( cur.indexOf( " " + clazz + " " ) < 0 ) { cur += clazz + " "; } }

// only assign if different to avoid unneeded rendering. finalValue = jQuery.trim( cur ); if ( curValue !== finalValue ) { jQuery.attr( elem, "class", finalValue ); } } } }

return this; },

removeClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0;

if ( jQuery.isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); } ); }

if ( !arguments.length ) { return this.attr( "class", "" ); }

if ( typeof value === "string" && value ) { classes = value.match( rnotwhite ) || [];

while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem );

// This expression is here for better compressibility (see addClass) cur = elem.nodeType === 1 && ( " " + curValue + " " ).replace( rclass, " " );

if ( cur ) { j = 0; while ( ( clazz = classes[ j++ ] ) ) {

// Remove *all* instances while ( cur.indexOf( " " + clazz + " " ) > -1 ) { cur = cur.replace( " " + clazz + " ", " " ); } }

// Only assign if different to avoid unneeded rendering. finalValue = jQuery.trim( cur ); if ( curValue !== finalValue ) { jQuery.attr( elem, "class", finalValue ); } } } }

return this; },

toggleClass: function( value, stateVal ) { var type = typeof value;

if ( typeof stateVal === "boolean" && type === "string" ) { return stateVal ? this.addClass( value ) : this.removeClass( value ); }

if ( jQuery.isFunction( value ) ) { return this.each( function( i ) { jQuery( this ).toggleClass( value.call( this, i, getClass( this ), stateVal ), stateVal ); } ); }

return this.each( function() { var className, i, self, classNames;

if ( type === "string" ) {

// Toggle individual class names i = 0; self = jQuery( this ); classNames = value.match( rnotwhite ) || [];

while ( ( className = classNames[ i++ ] ) ) {

// Check each className given, space separated list if ( self.hasClass( className ) ) { self.removeClass( className ); } else { self.addClass( className ); } }

// Toggle whole class name } else if ( value === undefined || type === "boolean" ) { className = getClass( this ); if ( className ) {

// store className if set jQuery._data( this, "__className__", className ); }

// If the element has a class name or if we're passed "false", // then remove the whole classname (if there was one, the above saved it). // Otherwise bring back whatever was previously saved (if anything), // falling back to the empty string if nothing was stored. jQuery.attr( this, "class", className || value === false ? "" : jQuery._data( this, "__className__" ) || "" ); } } ); },

hasClass: function( selector ) { var className, elem, i = 0;

className = " " + selector + " "; while ( ( elem = this[ i++ ] ) ) { if ( elem.nodeType === 1 && ( " " + getClass( elem ) + " " ).replace( rclass, " " ) .indexOf( className ) > -1 ) { return true; } }

return false; } } );



// Return jQuery for attributes-only inclusion


jQuery.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( i, name ) {

// Handle event binding jQuery.fn[ name ] = function( data, fn ) { return arguments.length > 0 ? this.on( name, null, data, fn ) : this.trigger( name ); }; } );

jQuery.fn.extend( { hover: function( fnOver, fnOut ) { return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); } } );


var location = window.location;

var nonce = jQuery.now();

var rquery = ( /\?/ );


var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;

jQuery.parseJSON = function( data ) {

// Attempt to parse using the native JSON parser first if ( window.JSON && window.JSON.parse ) {

// Support: Android 2.3 // Workaround failure to string-cast null input return window.JSON.parse( data + "" ); }

var requireNonComma, depth = null, str = jQuery.trim( data + "" );

// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains // after removing valid tokens return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {

// Force termination if we see a misplaced comma if ( requireNonComma && comma ) { depth = 0; }

// Perform no more replacements after returning to outermost depth if ( depth === 0 ) { return token; }

// Commas must not follow "[", "{", or "," requireNonComma = open || comma;

// Determine new depth // array/object open ("[" or "{"): depth += true - false (increment) // array/object close ("]" or "}"): depth += false - true (decrement) // other cases ("," or primitive): depth += true - true (numeric cast) depth += !close - !open;

// Remove this token return ""; } ) ) ? ( Function( "return " + str ) )() : jQuery.error( "Invalid JSON: " + data ); };


// Cross-browser xml parsing jQuery.parseXML = function( data ) { var xml, tmp; if ( !data || typeof data !== "string" ) { return null; } try { if ( window.DOMParser ) { // Standard tmp = new window.DOMParser(); xml = tmp.parseFromString( data, "text/xml" ); } else { // IE xml = new window.ActiveXObject( "Microsoft.XMLDOM" ); xml.async = "false"; xml.loadXML( data ); } } catch ( e ) { xml = undefined; } if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; };


var rhash = /#.*$/, rts = /([?&])_=[^&]*/,

// IE leaves an \r character at EOL rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg,

// #7653, #8125, #8152: local protocol detection rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,

/* Prefilters * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) * 2) These are called: * - BEFORE asking for a transport * - AFTER param serialization (s.data is a string if s.processData is true) * 3) key is the dataType * 4) the catchall symbol "*" can be used * 5) execution will start with transport dataType and THEN continue down to "*" if needed */ prefilters = {},

/* Transports bindings * 1) key is the dataType * 2) the catchall symbol "*" can be used * 3) selection will start with transport dataType and THEN go to "*" if needed */ transports = {},

// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression allTypes = "*/".concat( "*" ),

// Document location ajaxLocation = location.href,

// Segment location into parts ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];

// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport function addToPrefiltersOrTransports( structure ) {

// dataTypeExpression is optional and defaults to "*" return function( dataTypeExpression, func ) {

if ( typeof dataTypeExpression !== "string" ) { func = dataTypeExpression; dataTypeExpression = "*"; }

var dataType, i = 0, dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];

if ( jQuery.isFunction( func ) ) {

// For each dataType in the dataTypeExpression while ( ( dataType = dataTypes[ i++ ] ) ) {

// Prepend if requested if ( dataType.charAt( 0 ) === "+" ) { dataType = dataType.slice( 1 ) || "*"; ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );

// Otherwise append } else { ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); } } } }; }

// Base inspection function for prefilters and transports function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {

var inspected = {}, seekingTransport = ( structure === transports );

function inspect( dataType ) { var selected; inspected[ dataType ] = true; jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {

options.dataTypes.unshift( dataTypeOrTransport ); inspect( dataTypeOrTransport ); return false; } else if ( seekingTransport ) { return !( selected = dataTypeOrTransport ); } } ); return selected; }

return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); }

// A special extend for ajax options // that takes "flat" options (not to be deep extended) // Fixes #9887 function ajaxExtend( target, src ) { var deep, key, flatOptions = jQuery.ajaxSettings.flatOptions || {};

for ( key in src ) { if ( src[ key ] !== undefined ) { ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; } } if ( deep ) { jQuery.extend( true, target, deep ); }

return target; }

/* Handles responses to an ajax request:

* - finds the right dataType (mediates between content-type and expected dataType)
* - returns the corresponding response
*/

function ajaxHandleResponses( s, jqXHR, responses ) { var firstDataType, ct, finalDataType, type, contents = s.contents, dataTypes = s.dataTypes;

// Remove auto dataType and get content-type in the process while ( dataTypes[ 0 ] === "*" ) { dataTypes.shift(); if ( ct === undefined ) { ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); } }

// Check if we're dealing with a known content-type if ( ct ) { for ( type in contents ) { if ( contents[ type ] && contents[ type ].test( ct ) ) { dataTypes.unshift( type ); break; } } }

// Check to see if we have a response for the expected dataType if ( dataTypes[ 0 ] in responses ) { finalDataType = dataTypes[ 0 ]; } else {

// Try convertible dataTypes for ( type in responses ) { if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { finalDataType = type; break; } if ( !firstDataType ) { firstDataType = type; } }

// Or just use first one finalDataType = finalDataType || firstDataType; }

// If we found a dataType // We add the dataType to the list if needed // and return the corresponding response if ( finalDataType ) { if ( finalDataType !== dataTypes[ 0 ] ) { dataTypes.unshift( finalDataType ); } return responses[ finalDataType ]; } }

/* Chain conversions given the request and the original response

* Also sets the responseXXX fields on the jqXHR instance
*/

function ajaxConvert( s, response, jqXHR, isSuccess ) { var conv2, current, conv, tmp, prev, converters = {},

// Work with a copy of dataTypes in case we need to modify it for conversion dataTypes = s.dataTypes.slice();

// Create converters map with lowercased keys if ( dataTypes[ 1 ] ) { for ( conv in s.converters ) { converters[ conv.toLowerCase() ] = s.converters[ conv ]; } }

current = dataTypes.shift();

// Convert to each sequential dataType while ( current ) {

if ( s.responseFields[ current ] ) { jqXHR[ s.responseFields[ current ] ] = response; }

// Apply the dataFilter if provided if ( !prev && isSuccess && s.dataFilter ) { response = s.dataFilter( response, s.dataType ); }

prev = current; current = dataTypes.shift();

if ( current ) {

// There's only work to do if current dataType is non-auto if ( current === "*" ) {

current = prev;

// Convert response if prev dataType is non-auto and differs from current } else if ( prev !== "*" && prev !== current ) {

// Seek a direct converter conv = converters[ prev + " " + current ] || converters[ "* " + current ];

// If none found, seek a pair if ( !conv ) { for ( conv2 in converters ) {

// If conv2 outputs current tmp = conv2.split( " " ); if ( tmp[ 1 ] === current ) {

// If prev can be converted to accepted input conv = converters[ prev + " " + tmp[ 0 ] ] || converters[ "* " + tmp[ 0 ] ]; if ( conv ) {

// Condense equivalence converters if ( conv === true ) { conv = converters[ conv2 ];

// Otherwise, insert the intermediate dataType } else if ( converters[ conv2 ] !== true ) { current = tmp[ 0 ]; dataTypes.unshift( tmp[ 1 ] ); } break; } } } }

// Apply converter (if not an equivalence) if ( conv !== true ) {

// Unless errors are allowed to bubble, catch and return them if ( conv && s[ "throws" ] ) { // jscs:ignore requireDotNotation response = conv( response ); } else { try { response = conv( response ); } catch ( e ) { return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current }; } } } } } }

return { state: "success", data: response }; }

jQuery.extend( {

// Counter for holding the number of active queries active: 0,

// Last-Modified header cache for next request lastModified: {}, etag: {},

ajaxSettings: { url: ajaxLocation, type: "GET", isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), global: true, processData: true, async: true, contentType: "application/x-www-form-urlencoded; charset=UTF-8", /* timeout: 0, data: null, dataType: null, username: null, password: null, cache: null, throws: false, traditional: false, headers: {}, */

accepts: { "*": allTypes, text: "text/plain", html: "text/html", xml: "application/xml, text/xml", json: "application/json, text/javascript" },

contents: { xml: /\bxml\b/, html: /\bhtml/, json: /\bjson\b/ },

responseFields: { xml: "responseXML", text: "responseText", json: "responseJSON" },

// Data converters // Keys separate source (or catchall "*") and destination types with a single space converters: {

// Convert anything to text "* text": String,

// Text to html (true = no transformation) "text html": true,

// Evaluate text as a json expression "text json": jQuery.parseJSON,

// Parse text as xml "text xml": jQuery.parseXML },

// For options that shouldn't be deep extended: // you can add your own custom options here if // and when you create one that shouldn't be // deep extended (see ajaxExtend) flatOptions: { url: true, context: true } },

// Creates a full fledged settings object into target // with both ajaxSettings and settings fields. // If target is omitted, writes into ajaxSettings. ajaxSetup: function( target, settings ) { return settings ?

// Building a settings object ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :

// Extending ajaxSettings ajaxExtend( jQuery.ajaxSettings, target ); },

ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), ajaxTransport: addToPrefiltersOrTransports( transports ),

// Main method ajax: function( url, options ) {

// If url is an object, simulate pre-1.5 signature if ( typeof url === "object" ) { options = url; url = undefined; }

// Force options to be an object options = options || {};

var

// Cross-domain detection vars parts,

// Loop variable i,

// URL without anti-cache param cacheURL,

// Response headers as string responseHeadersString,

// timeout handle timeoutTimer,

// To know if global events are to be dispatched fireGlobals,

transport,

// Response headers responseHeaders,

// Create the final options object s = jQuery.ajaxSetup( {}, options ),

// Callbacks context callbackContext = s.context || s,

// Context for global events is callbackContext if it is a DOM node or jQuery collection globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ? jQuery( callbackContext ) : jQuery.event,

// Deferreds deferred = jQuery.Deferred(), completeDeferred = jQuery.Callbacks( "once memory" ),

// Status-dependent callbacks statusCode = s.statusCode || {},

// Headers (they are sent all at once) requestHeaders = {}, requestHeadersNames = {},

// The jqXHR state state = 0,

// Default abort message strAbort = "canceled",

// Fake xhr jqXHR = { readyState: 0,

// Builds headers hashtable if needed getResponseHeader: function( key ) { var match; if ( state === 2 ) { if ( !responseHeaders ) { responseHeaders = {}; while ( ( match = rheaders.exec( responseHeadersString ) ) ) { responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; } } match = responseHeaders[ key.toLowerCase() ]; } return match == null ? null : match; },

// Raw string getAllResponseHeaders: function() { return state === 2 ? responseHeadersString : null; },

// Caches the header setRequestHeader: function( name, value ) { var lname = name.toLowerCase(); if ( !state ) { name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; requestHeaders[ name ] = value; } return this; },

// Overrides response content-type header overrideMimeType: function( type ) { if ( !state ) { s.mimeType = type; } return this; },

// Status-dependent callbacks statusCode: function( map ) { var code; if ( map ) { if ( state < 2 ) { for ( code in map ) {

// Lazy-add the new callback in a way that preserves old ones statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; } } else {

// Execute the appropriate callbacks jqXHR.always( map[ jqXHR.status ] ); } } return this; },

// Cancel the request abort: function( statusText ) { var finalText = statusText || strAbort; if ( transport ) { transport.abort( finalText ); } done( 0, finalText ); return this; } };

// Attach deferreds deferred.promise( jqXHR ).complete = completeDeferred.add; jqXHR.success = jqXHR.done; jqXHR.error = jqXHR.fail;

// Remove hash character (#7531: and string promotion) // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) // Handle falsy url in the settings object (#10093: consistency with old signature) // We also use the url parameter if available s.url = ( ( url || s.url || ajaxLocation ) + "" ) .replace( rhash, "" ) .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );

// Alias method option to type as per ticket #12004 s.type = options.method || options.type || s.method || s.type;

// Extract dataTypes list s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];

// A cross-domain request is in order when we have a protocol:host:port mismatch if ( s.crossDomain == null ) { parts = rurl.exec( s.url.toLowerCase() ); s.crossDomain = !!( parts && ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] || ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !== ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) ) ); }

// Convert data if not already a string if ( s.data && s.processData && typeof s.data !== "string" ) { s.data = jQuery.param( s.data, s.traditional ); }

// Apply prefilters inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );

// If request was aborted inside a prefilter, stop there if ( state === 2 ) { return jqXHR; }

// We can fire global events as of now if asked to // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) fireGlobals = jQuery.event && s.global;

// Watch for a new set of requests if ( fireGlobals && jQuery.active++ === 0 ) { jQuery.event.trigger( "ajaxStart" ); }

// Uppercase the type s.type = s.type.toUpperCase();

// Determine if request has content s.hasContent = !rnoContent.test( s.type );

// Save the URL in case we're toying with the If-Modified-Since // and/or If-None-Match header later on cacheURL = s.url;

// More options handling for requests with no content if ( !s.hasContent ) {

// If data is available, append data to url if ( s.data ) { cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );

// #9682: remove data so that it's not used in an eventual retry delete s.data; }

// Add anti-cache in url if needed if ( s.cache === false ) { s.url = rts.test( cacheURL ) ?

// If there is already a '_' parameter, set its value cacheURL.replace( rts, "$1_=" + nonce++ ) :

// Otherwise add one to the end cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++; } }

// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { if ( jQuery.lastModified[ cacheURL ] ) { jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); } if ( jQuery.etag[ cacheURL ] ) { jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); } }

// Set the correct header, if data is being sent if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { jqXHR.setRequestHeader( "Content-Type", s.contentType ); }

// Set the Accepts header for the server, depending on the dataType jqXHR.setRequestHeader( "Accept", s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? s.accepts[ s.dataTypes[ 0 ] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : s.accepts[ "*" ] );

// Check for headers option for ( i in s.headers ) { jqXHR.setRequestHeader( i, s.headers[ i ] ); }

// Allow custom headers/mimetypes and early abort if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {

// Abort if not done already and return return jqXHR.abort(); }

// aborting is no longer a cancellation strAbort = "abort";

// Install callbacks on deferreds for ( i in { success: 1, error: 1, complete: 1 } ) { jqXHR[ i ]( s[ i ] ); }

// Get transport transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );

// If no transport, we auto-abort if ( !transport ) { done( -1, "No Transport" ); } else { jqXHR.readyState = 1;

// Send global event if ( fireGlobals ) { globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); }

// If request was aborted inside ajaxSend, stop there if ( state === 2 ) { return jqXHR; }

// Timeout if ( s.async && s.timeout > 0 ) { timeoutTimer = window.setTimeout( function() { jqXHR.abort( "timeout" ); }, s.timeout ); }

try { state = 1; transport.send( requestHeaders, done ); } catch ( e ) {

// Propagate exception as error if not done if ( state < 2 ) { done( -1, e );

// Simply rethrow otherwise } else { throw e; } } }

// Callback for when everything is done function done( status, nativeStatusText, responses, headers ) { var isSuccess, success, error, response, modified, statusText = nativeStatusText;

// Called once if ( state === 2 ) { return; }

// State is "done" now state = 2;

// Clear timeout if it exists if ( timeoutTimer ) { window.clearTimeout( timeoutTimer ); }

// Dereference transport for early garbage collection // (no matter how long the jqXHR object will be used) transport = undefined;

// Cache response headers responseHeadersString = headers || "";

// Set readyState jqXHR.readyState = status > 0 ? 4 : 0;

// Determine if successful isSuccess = status >= 200 && status < 300 || status === 304;

// Get response data if ( responses ) { response = ajaxHandleResponses( s, jqXHR, responses ); }

// Convert no matter what (that way responseXXX fields are always set) response = ajaxConvert( s, response, jqXHR, isSuccess );

// If successful, handle type chaining if ( isSuccess ) {

// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { modified = jqXHR.getResponseHeader( "Last-Modified" ); if ( modified ) { jQuery.lastModified[ cacheURL ] = modified; } modified = jqXHR.getResponseHeader( "etag" ); if ( modified ) { jQuery.etag[ cacheURL ] = modified; } }

// if no content if ( status === 204 || s.type === "HEAD" ) { statusText = "nocontent";

// if not modified } else if ( status === 304 ) { statusText = "notmodified";

// If we have data, let's convert it } else { statusText = response.state; success = response.data; error = response.error; isSuccess = !error; } } else {

// We extract error from statusText // then normalize statusText and status for non-aborts error = statusText; if ( status || !statusText ) { statusText = "error"; if ( status < 0 ) { status = 0; } } }

// Set data for the fake xhr object jqXHR.status = status; jqXHR.statusText = ( nativeStatusText || statusText ) + "";

// Success/Error if ( isSuccess ) { deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); } else { deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); }

// Status-dependent callbacks jqXHR.statusCode( statusCode ); statusCode = undefined;

if ( fireGlobals ) { globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", [ jqXHR, s, isSuccess ? success : error ] ); }

// Complete completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );

if ( fireGlobals ) { globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );

// Handle the global AJAX counter if ( !( --jQuery.active ) ) { jQuery.event.trigger( "ajaxStop" ); } } }

return jqXHR; },

getJSON: function( url, data, callback ) { return jQuery.get( url, data, callback, "json" ); },

getScript: function( url, callback ) { return jQuery.get( url, undefined, callback, "script" ); } } );

jQuery.each( [ "get", "post" ], function( i, method ) { jQuery[ method ] = function( url, data, callback, type ) {

// shift arguments if data argument was omitted if ( jQuery.isFunction( data ) ) { type = type || callback; callback = data; data = undefined; }

// The url can be an options object (which then must have .url) return jQuery.ajax( jQuery.extend( { url: url, type: method, dataType: type, data: data, success: callback }, jQuery.isPlainObject( url ) && url ) ); }; } );


jQuery._evalUrl = function( url ) { return jQuery.ajax( { url: url,

// Make this explicit, since user can override this through ajaxSetup (#11264) type: "GET", dataType: "script", cache: true, async: false, global: false, "throws": true } ); };


jQuery.fn.extend( { wrapAll: function( html ) { if ( jQuery.isFunction( html ) ) { return this.each( function( i ) { jQuery( this ).wrapAll( html.call( this, i ) ); } ); }

if ( this[ 0 ] ) {

// The elements to wrap the target around var wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );

if ( this[ 0 ].parentNode ) { wrap.insertBefore( this[ 0 ] ); }

wrap.map( function() { var elem = this;

while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { elem = elem.firstChild; }

return elem; } ).append( this ); }

return this; },

wrapInner: function( html ) { if ( jQuery.isFunction( html ) ) { return this.each( function( i ) { jQuery( this ).wrapInner( html.call( this, i ) ); } ); }

return this.each( function() { var self = jQuery( this ), contents = self.contents();

if ( contents.length ) { contents.wrapAll( html );

} else { self.append( html ); } } ); },

wrap: function( html ) { var isFunction = jQuery.isFunction( html );

return this.each( function( i ) { jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); } ); },

unwrap: function() { return this.parent().each( function() { if ( !jQuery.nodeName( this, "body" ) ) { jQuery( this ).replaceWith( this.childNodes ); } } ).end(); } } );


function getDisplay( elem ) { return elem.style && elem.style.display || jQuery.css( elem, "display" ); }

function filterHidden( elem ) {

// Disconnected elements are considered hidden if ( !jQuery.contains( elem.ownerDocument || document, elem ) ) { return true; } while ( elem && elem.nodeType === 1 ) { if ( getDisplay( elem ) === "none" || elem.type === "hidden" ) { return true; } elem = elem.parentNode; } return false; }

jQuery.expr.filters.hidden = function( elem ) {

// Support: Opera <= 12.12 // Opera reports offsetWidths and offsetHeights less than zero on some elements return support.reliableHiddenOffsets() ? ( elem.offsetWidth <= 0 && elem.offsetHeight <= 0 && !elem.getClientRects().length ) : filterHidden( elem ); };

jQuery.expr.filters.visible = function( elem ) { return !jQuery.expr.filters.hidden( elem ); };



var r20 = /%20/g, rbracket = /\[\]$/, rCRLF = /\r?\n/g, rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, rsubmittable = /^(?:input|select|textarea|keygen)/i;

function buildParams( prefix, obj, traditional, add ) { var name;

if ( jQuery.isArray( obj ) ) {

// Serialize array item. jQuery.each( obj, function( i, v ) { if ( traditional || rbracket.test( prefix ) ) {

// Treat each array item as a scalar. add( prefix, v );

} else {

// Item is non-scalar (array or object), encode its numeric index. buildParams( prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", v, traditional, add ); } } );

} else if ( !traditional && jQuery.type( obj ) === "object" ) {

// Serialize object item. for ( name in obj ) { buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); }

} else {

// Serialize scalar item. add( prefix, obj ); } }

// Serialize an array of form elements or a set of // key/values into a query string jQuery.param = function( a, traditional ) { var prefix, s = [], add = function( key, value ) {

// If value is a function, invoke it and return its value value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value ); s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); };

// Set traditional to true for jQuery <= 1.3.2 behavior. if ( traditional === undefined ) { traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; }

// If an array was passed in, assume that it is an array of form elements. if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {

// Serialize the form elements jQuery.each( a, function() { add( this.name, this.value ); } );

} else {

// If traditional, encode the "old" way (the way 1.3.2 or older // did it), otherwise encode params recursively. for ( prefix in a ) { buildParams( prefix, a[ prefix ], traditional, add ); } }

// Return the resulting serialization return s.join( "&" ).replace( r20, "+" ); };

jQuery.fn.extend( { serialize: function() { return jQuery.param( this.serializeArray() ); }, serializeArray: function() { return this.map( function() {

// Can add propHook for "elements" to filter or add form elements var elements = jQuery.prop( this, "elements" ); return elements ? jQuery.makeArray( elements ) : this; } ) .filter( function() { var type = this.type;

// Use .is(":disabled") so that fieldset[disabled] works return this.name && !jQuery( this ).is( ":disabled" ) && rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && ( this.checked || !rcheckableType.test( type ) ); } ) .map( function( i, elem ) { var val = jQuery( this ).val();

return val == null ? null : jQuery.isArray( val ) ? jQuery.map( val, function( val ) { return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; } ) : { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; } ).get(); } } );


// Create the request object // (This is still attached to ajaxSettings for backward compatibility) jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?

// Support: IE6-IE8 function() {

// XHR cannot access local files, always use ActiveX for that case if ( this.isLocal ) { return createActiveXHR(); }

// Support: IE 9-11 // IE seems to error on cross-domain PATCH requests when ActiveX XHR // is used. In IE 9+ always use the native XHR. // Note: this condition won't catch Edge as it doesn't define // document.documentMode but it also doesn't support ActiveX so it won't // reach this code. if ( document.documentMode > 8 ) { return createStandardXHR(); }

// Support: IE<9 // oldIE XHR does not support non-RFC2616 methods (#13240) // See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx // and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9 // Although this check for six methods instead of eight // since IE also does not support "trace" and "connect" return /^(get|post|head|put|delete|options)$/i.test( this.type ) && createStandardXHR() || createActiveXHR(); } :

// For all other browsers, use the standard XMLHttpRequest object createStandardXHR;

var xhrId = 0, xhrCallbacks = {}, xhrSupported = jQuery.ajaxSettings.xhr();

// Support: IE<10 // Open requests must be manually aborted on unload (#5280) // See https://support.microsoft.com/kb/2856746 for more info if ( window.attachEvent ) { window.attachEvent( "onunload", function() { for ( var key in xhrCallbacks ) { xhrCallbacks[ key ]( undefined, true ); } } ); }

// Determine support properties support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); xhrSupported = support.ajax = !!xhrSupported;

// Create transport if the browser can provide an xhr if ( xhrSupported ) {

jQuery.ajaxTransport( function( options ) {

// Cross domain only allowed if supported through XMLHttpRequest if ( !options.crossDomain || support.cors ) {

var callback;

return { send: function( headers, complete ) { var i, xhr = options.xhr(), id = ++xhrId;

// Open the socket xhr.open( options.type, options.url, options.async, options.username, options.password );

// Apply custom fields if provided if ( options.xhrFields ) { for ( i in options.xhrFields ) { xhr[ i ] = options.xhrFields[ i ]; } }

// Override mime type if needed if ( options.mimeType && xhr.overrideMimeType ) { xhr.overrideMimeType( options.mimeType ); }

// X-Requested-With header // For cross-domain requests, seeing as conditions for a preflight are // akin to a jigsaw puzzle, we simply never set it to be sure. // (it can always be set on a per-request basis or even using ajaxSetup) // For same-domain requests, won't change header if already provided. if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { headers[ "X-Requested-With" ] = "XMLHttpRequest"; }

// Set headers for ( i in headers ) {

// Support: IE<9 // IE's ActiveXObject throws a 'Type Mismatch' exception when setting // request header to a null-value. // // To keep consistent with other XHR implementations, cast the value // to string and ignore `undefined`. if ( headers[ i ] !== undefined ) { xhr.setRequestHeader( i, headers[ i ] + "" ); } }

// Do send the request // This may raise an exception which is actually // handled in jQuery.ajax (so no try/catch here) xhr.send( ( options.hasContent && options.data ) || null );

// Listener callback = function( _, isAbort ) { var status, statusText, responses;

// Was never called and is aborted or complete if ( callback && ( isAbort || xhr.readyState === 4 ) ) {

// Clean up delete xhrCallbacks[ id ]; callback = undefined; xhr.onreadystatechange = jQuery.noop;

// Abort manually if needed if ( isAbort ) { if ( xhr.readyState !== 4 ) { xhr.abort(); } } else { responses = {}; status = xhr.status;

// Support: IE<10 // Accessing binary-data responseText throws an exception // (#11426) if ( typeof xhr.responseText === "string" ) { responses.text = xhr.responseText; }

// Firefox throws an exception when accessing // statusText for faulty cross-domain requests try { statusText = xhr.statusText; } catch ( e ) {

// We normalize with Webkit giving an empty statusText statusText = ""; }

// Filter status for non standard behaviors

// If the request is local and we have data: assume a success // (success with no data won't get notified, that's the best we // can do given current implementations) if ( !status && options.isLocal && !options.crossDomain ) { status = responses.text ? 200 : 404;

// IE - #1450: sometimes returns 1223 when it should be 204 } else if ( status === 1223 ) { status = 204; } } }

// Call complete if needed if ( responses ) { complete( status, statusText, responses, xhr.getAllResponseHeaders() ); } };

// Do send the request // `xhr.send` may raise an exception, but it will be // handled in jQuery.ajax (so no try/catch here) if ( !options.async ) {

// If we're in sync mode we fire the callback callback(); } else if ( xhr.readyState === 4 ) {

// (IE6 & IE7) if it's in cache and has been // retrieved directly we need to fire the callback window.setTimeout( callback ); } else {

// Register the callback, but delay it in case `xhr.send` throws // Add to the list of active xhr callbacks xhr.onreadystatechange = xhrCallbacks[ id ] = callback; } },

abort: function() { if ( callback ) { callback( undefined, true ); } } }; } } ); }

// Functions to create xhrs function createStandardXHR() { try { return new window.XMLHttpRequest(); } catch ( e ) {} }

function createActiveXHR() { try { return new window.ActiveXObject( "Microsoft.XMLHTTP" ); } catch ( e ) {} }



// Install script dataType jQuery.ajaxSetup( { accepts: { script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript" }, contents: { script: /\b(?:java|ecma)script\b/ }, converters: { "text script": function( text ) { jQuery.globalEval( text ); return text; } } } );

// Handle cache's special case and global jQuery.ajaxPrefilter( "script", function( s ) { if ( s.cache === undefined ) { s.cache = false; } if ( s.crossDomain ) { s.type = "GET"; s.global = false; } } );

// Bind script tag hack transport jQuery.ajaxTransport( "script", function( s ) {

// This transport only deals with cross domain requests if ( s.crossDomain ) {

var script, head = document.head || jQuery( "head" )[ 0 ] || document.documentElement;

return {

send: function( _, callback ) {

script = document.createElement( "script" );

script.async = true;

if ( s.scriptCharset ) { script.charset = s.scriptCharset; }

script.src = s.url;

// Attach handlers for all browsers script.onload = script.onreadystatechange = function( _, isAbort ) {

if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {

// Handle memory leak in IE script.onload = script.onreadystatechange = null;

// Remove the script if ( script.parentNode ) { script.parentNode.removeChild( script ); }

// Dereference the script script = null;

// Callback if not abort if ( !isAbort ) { callback( 200, "success" ); } } };

// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending // Use native DOM manipulation to avoid our domManip AJAX trickery head.insertBefore( script, head.firstChild ); },

abort: function() { if ( script ) { script.onload( undefined, true ); } } }; } } );



var oldCallbacks = [], rjsonp = /(=)\?(?=&|$)|\?\?/;

// Default jsonp settings jQuery.ajaxSetup( { jsonp: "callback", jsonpCallback: function() { var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); this[ callback ] = true; return callback; } } );

// Detect, normalize options and install callbacks for jsonp requests jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {

var callbackName, overwritten, responseContainer, jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? "url" : typeof s.data === "string" && ( s.contentType || "" ) .indexOf( "application/x-www-form-urlencoded" ) === 0 && rjsonp.test( s.data ) && "data" );

// Handle iff the expected data type is "jsonp" or we have a parameter to set if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {

// Get callback name, remembering preexisting value associated with it callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback;

// Insert callback into url or form data if ( jsonProp ) { s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); } else if ( s.jsonp !== false ) { s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; }

// Use data converter to retrieve json after script execution s.converters[ "script json" ] = function() { if ( !responseContainer ) { jQuery.error( callbackName + " was not called" ); } return responseContainer[ 0 ]; };

// force json dataType s.dataTypes[ 0 ] = "json";

// Install callback overwritten = window[ callbackName ]; window[ callbackName ] = function() { responseContainer = arguments; };

// Clean-up function (fires after converters) jqXHR.always( function() {

// If previous value didn't exist - remove it if ( overwritten === undefined ) { jQuery( window ).removeProp( callbackName );

// Otherwise restore preexisting value } else { window[ callbackName ] = overwritten; }

// Save back as free if ( s[ callbackName ] ) {

// make sure that re-using the options doesn't screw things around s.jsonpCallback = originalSettings.jsonpCallback;

// save the callback name for future use oldCallbacks.push( callbackName ); }

// Call if it was a function and we have a response if ( responseContainer && jQuery.isFunction( overwritten ) ) { overwritten( responseContainer[ 0 ] ); }

responseContainer = overwritten = undefined; } );

// Delegate to script return "script"; } } );



// data: string of html // context (optional): If specified, the fragment will be created in this context, // defaults to document // keepScripts (optional): If true, will include scripts passed in the html string jQuery.parseHTML = function( data, context, keepScripts ) { if ( !data || typeof data !== "string" ) { return null; } if ( typeof context === "boolean" ) { keepScripts = context; context = false; } context = context || document;

var parsed = rsingleTag.exec( data ), scripts = !keepScripts && [];

// Single tag if ( parsed ) { return [ context.createElement( parsed[ 1 ] ) ]; }

parsed = buildFragment( [ data ], context, scripts );

if ( scripts && scripts.length ) { jQuery( scripts ).remove(); }

return jQuery.merge( [], parsed.childNodes ); };


// Keep a copy of the old load method var _load = jQuery.fn.load;

/**

* Load a url into a page
*/

jQuery.fn.load = function( url, params, callback ) { if ( typeof url !== "string" && _load ) { return _load.apply( this, arguments ); }

var selector, type, response, self = this, off = url.indexOf( " " );

if ( off > -1 ) { selector = jQuery.trim( url.slice( off, url.length ) ); url = url.slice( 0, off ); }

// If it's a function if ( jQuery.isFunction( params ) ) {

// We assume that it's the callback callback = params; params = undefined;

// Otherwise, build a param string } else if ( params && typeof params === "object" ) { type = "POST"; }

// If we have elements to modify, make the request if ( self.length > 0 ) { jQuery.ajax( { url: url,

// If "type" variable is undefined, then "GET" method will be used. // Make value of this field explicit since // user can override it through ajaxSetup method type: type || "GET", dataType: "html", data: params } ).done( function( responseText ) {

// Save response for use in complete callback response = arguments;

self.html( selector ?

// If a selector was specified, locate the right elements in a dummy div // Exclude scripts to avoid IE 'Permission Denied' errors

jQuery( "
" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :

// Otherwise use the full result responseText );

// If the request succeeds, this function gets "data", "status", "jqXHR" // but they are ignored because response was set above. // If it fails, this function gets "jqXHR", "status", "error" } ).always( callback && function( jqXHR, status ) { self.each( function() { callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); } ); } ); }

return this; };



// Attach a bunch of functions for handling common AJAX events jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) { jQuery.fn[ type ] = function( fn ) { return this.on( type, fn ); }; } );



jQuery.expr.filters.animated = function( elem ) { return jQuery.grep( jQuery.timers, function( fn ) { return elem === fn.elem; } ).length; };



/**

* Gets a window from an element
*/

function getWindow( elem ) { return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 ? elem.defaultView || elem.parentWindow : false; }

jQuery.offset = { setOffset: function( elem, options, i ) { var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, position = jQuery.css( elem, "position" ), curElem = jQuery( elem ), props = {};

// set position first, in-case top/left are set even on static elem if ( position === "static" ) { elem.style.position = "relative"; }

curOffset = curElem.offset(); curCSSTop = jQuery.css( elem, "top" ); curCSSLeft = jQuery.css( elem, "left" ); calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray( "auto", [ curCSSTop, curCSSLeft ] ) > -1;

// need to be able to calculate position if either top or left // is auto and position is either absolute or fixed if ( calculatePosition ) { curPosition = curElem.position(); curTop = curPosition.top; curLeft = curPosition.left; } else { curTop = parseFloat( curCSSTop ) || 0; curLeft = parseFloat( curCSSLeft ) || 0; }

if ( jQuery.isFunction( options ) ) {

// Use jQuery.extend here to allow modification of coordinates argument (gh-1848) options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); }

if ( options.top != null ) { props.top = ( options.top - curOffset.top ) + curTop; } if ( options.left != null ) { props.left = ( options.left - curOffset.left ) + curLeft; }

if ( "using" in options ) { options.using.call( elem, props ); } else { curElem.css( props ); } } };

jQuery.fn.extend( { offset: function( options ) { if ( arguments.length ) { return options === undefined ? this : this.each( function( i ) { jQuery.offset.setOffset( this, options, i ); } ); }

var docElem, win, box = { top: 0, left: 0 }, elem = this[ 0 ], doc = elem && elem.ownerDocument;

if ( !doc ) { return; }

docElem = doc.documentElement;

// Make sure it's not a disconnected DOM node if ( !jQuery.contains( docElem, elem ) ) { return box; }

// If we don't have gBCR, just use 0,0 rather than error // BlackBerry 5, iOS 3 (original iPhone) if ( typeof elem.getBoundingClientRect !== "undefined" ) { box = elem.getBoundingClientRect(); } win = getWindow( doc ); return { top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ), left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 ) }; },

position: function() { if ( !this[ 0 ] ) { return; }

var offsetParent, offset, parentOffset = { top: 0, left: 0 }, elem = this[ 0 ];

// Fixed elements are offset from window (parentOffset = {top:0, left: 0}, // because it is its only offset parent if ( jQuery.css( elem, "position" ) === "fixed" ) {

// we assume that getBoundingClientRect is available when computed position is fixed offset = elem.getBoundingClientRect(); } else {

// Get *real* offsetParent offsetParent = this.offsetParent();

// Get correct offsets offset = this.offset(); if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) { parentOffset = offsetParent.offset(); }

// Add offsetParent borders parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ); parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true ); }

// Subtract parent offsets and element margins // note: when an element has margin: auto the offsetLeft and marginLeft // are the same in Safari causing offset.left to incorrectly be 0 return { top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) }; },

offsetParent: function() { return this.map( function() { var offsetParent = this.offsetParent;

while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) { offsetParent = offsetParent.offsetParent; } return offsetParent || documentElement; } ); } } );

// Create scrollLeft and scrollTop methods jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { var top = /Y/.test( prop );

jQuery.fn[ method ] = function( val ) { return access( this, function( elem, method, val ) { var win = getWindow( elem );

if ( val === undefined ) { return win ? ( prop in win ) ? win[ prop ] : win.document.documentElement[ method ] : elem[ method ]; }

if ( win ) { win.scrollTo( !top ? val : jQuery( win ).scrollLeft(), top ? val : jQuery( win ).scrollTop() );

} else { elem[ method ] = val; } }, method, val, arguments.length, null ); }; } );

// Support: Safari<7-8+, Chrome<37-44+ // Add the top/left cssHooks using jQuery.fn.position // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 // getComputedStyle returns percent when specified for top/left/bottom/right // rather than make the css module depend on the offset module, we just check for it here jQuery.each( [ "top", "left" ], function( i, prop ) { jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, function( elem, computed ) { if ( computed ) { computed = curCSS( elem, prop );

// if curCSS returns percentage, fallback to offset return rnumnonpx.test( computed ) ? jQuery( elem ).position()[ prop ] + "px" : computed; } } ); } );


// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {

// margin is only for outerHeight, outerWidth jQuery.fn[ funcName ] = function( margin, value ) { var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );

return access( this, function( elem, type, value ) { var doc;

if ( jQuery.isWindow( elem ) ) {

// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there // isn't a whole lot we can do. See pull request at this URL for discussion: // https://github.com/jquery/jquery/pull/764 return elem.document.documentElement[ "client" + name ]; }

// Get document width or height if ( elem.nodeType === 9 ) { doc = elem.documentElement;

// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], // whichever is greatest // unfortunately, this causes bug #3838 in IE6/8 only, // but there is currently no good, small way to fix it. return Math.max( elem.body[ "scroll" + name ], doc[ "scroll" + name ], elem.body[ "offset" + name ], doc[ "offset" + name ], doc[ "client" + name ] ); }

return value === undefined ?

// Get width or height on the element, requesting but not forcing parseFloat jQuery.css( elem, type, extra ) :

// Set width or height on the element jQuery.style( elem, type, value, extra ); }, type, chainable ? margin : undefined, chainable, null ); }; } ); } );


jQuery.fn.extend( {

bind: function( types, data, fn ) { return this.on( types, null, data, fn ); }, unbind: function( types, fn ) { return this.off( types, null, fn ); },

delegate: function( selector, types, data, fn ) { return this.on( types, selector, data, fn ); }, undelegate: function( selector, types, fn ) {

// ( namespace ) or ( selector, types [, fn] ) return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn ); } } );

// The number of elements contained in the matched element set jQuery.fn.size = function() { return this.length; };

jQuery.fn.andSelf = jQuery.fn.addBack;



// Register as a named AMD module, since jQuery can be concatenated with other // files that may use define, but not via a proper concatenation script that // understands anonymous AMD modules. A named AMD is safest and most robust // way to register. Lowercase jquery is used because AMD module names are // derived from file names, and jQuery is normally delivered in a lowercase // file name. Do this after creating the global so that if an AMD module wants // to call noConflict to hide this version of jQuery, it will work.

// Note that for maximum portability, libraries that are not jQuery should // declare themselves as anonymous modules, and avoid setting a global if an // AMD loader is present. jQuery is a special case. For more information, see // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon

if ( typeof define === "function" && define.amd ) { define( "jquery", [], function() { return jQuery; } ); }


var

// Map over jQuery in case of overwrite _jQuery = window.jQuery,

// Map over the $ in case of overwrite _$ = window.$;

jQuery.noConflict = function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; }

if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; }

return jQuery; };

// Expose jQuery and $ identifiers, even in // AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557) // and CommonJS for browser emulators (#13566) if ( !noGlobal ) { window.jQuery = window.$ = jQuery; }

return jQuery; }));


/*!

* Bootstrap v3.3.7 (http://getbootstrap.com)
* Copyright 2011-2016 Twitter, Inc.
* Licensed under the MIT license
*/

if (typeof jQuery === 'undefined') {

 throw new Error('Bootstrap\'s JavaScript requires jQuery')

}

+function ($) {

 'use strict';
 var version = $.fn.jquery.split(' ')[0].split('.')
 if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {
   throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')
 }

}(jQuery);

/* ========================================================================

* Bootstrap: transition.js v3.3.7
* http://getbootstrap.com/javascript/#transitions
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */


+function ($) {

 'use strict';
 // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
 // ============================================================
 function transitionEnd() {
   var el = document.createElement('bootstrap')
   var transEndEventNames = {
     WebkitTransition : 'webkitTransitionEnd',
     MozTransition    : 'transitionend',
     OTransition      : 'oTransitionEnd otransitionend',
     transition       : 'transitionend'
   }
   for (var name in transEndEventNames) {
     if (el.style[name] !== undefined) {
       return { end: transEndEventNames[name] }
     }
   }
   return false // explicit for ie8 (  ._.)
 }
 // http://blog.alexmaccaw.com/css-transitions
 $.fn.emulateTransitionEnd = function (duration) {
   var called = false
   var $el = this
   $(this).one('bsTransitionEnd', function () { called = true })
   var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
   setTimeout(callback, duration)
   return this
 }
 $(function () {
   $.support.transition = transitionEnd()
   if (!$.support.transition) return
   $.event.special.bsTransitionEnd = {
     bindType: $.support.transition.end,
     delegateType: $.support.transition.end,
     handle: function (e) {
       if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
     }
   }
 })

}(jQuery);

/* ========================================================================

* Bootstrap: alert.js v3.3.7
* http://getbootstrap.com/javascript/#alerts
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */


+function ($) {

 'use strict';
 // ALERT CLASS DEFINITION
 // ======================
 var dismiss = '[data-dismiss="alert"]'
 var Alert   = function (el) {
   $(el).on('click', dismiss, this.close)
 }
 Alert.VERSION = '3.3.7'
 Alert.TRANSITION_DURATION = 150
 Alert.prototype.close = function (e) {
   var $this    = $(this)
   var selector = $this.attr('data-target')
   if (!selector) {
     selector = $this.attr('href')
     selector = selector && selector.replace(/.*(?=#[^\s]*$)/, ) // strip for ie7
   }
   var $parent = $(selector === '#' ? [] : selector)
   if (e) e.preventDefault()
   if (!$parent.length) {
     $parent = $this.closest('.alert')
   }
   $parent.trigger(e = $.Event('close.bs.alert'))
   if (e.isDefaultPrevented()) return
   $parent.removeClass('in')
   function removeElement() {
     // detach from parent, fire event then clean up data
     $parent.detach().trigger('closed.bs.alert').remove()
   }
   $.support.transition && $parent.hasClass('fade') ?
     $parent
       .one('bsTransitionEnd', removeElement)
       .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
     removeElement()
 }


 // ALERT PLUGIN DEFINITION
 // =======================
 function Plugin(option) {
   return this.each(function () {
     var $this = $(this)
     var data  = $this.data('bs.alert')
     if (!data) $this.data('bs.alert', (data = new Alert(this)))
     if (typeof option == 'string') data[option].call($this)
   })
 }
 var old = $.fn.alert
 $.fn.alert             = Plugin
 $.fn.alert.Constructor = Alert


 // ALERT NO CONFLICT
 // =================
 $.fn.alert.noConflict = function () {
   $.fn.alert = old
   return this
 }


 // ALERT DATA-API
 // ==============
 $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)

}(jQuery);

/* ========================================================================

* Bootstrap: button.js v3.3.7
* http://getbootstrap.com/javascript/#buttons
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */


+function ($) {

 'use strict';
 // BUTTON PUBLIC CLASS DEFINITION
 // ==============================
 var Button = function (element, options) {
   this.$element  = $(element)
   this.options   = $.extend({}, Button.DEFAULTS, options)
   this.isLoading = false
 }
 Button.VERSION  = '3.3.7'
 Button.DEFAULTS = {
   loadingText: 'loading...'
 }
 Button.prototype.setState = function (state) {
   var d    = 'disabled'
   var $el  = this.$element
   var val  = $el.is('input') ? 'val' : 'html'
   var data = $el.data()
   state += 'Text'
   if (data.resetText == null) $el.data('resetText', $el[val]())
   // push to event loop to allow forms to submit
   setTimeout($.proxy(function () {
     $el[val](data[state] == null ? this.options[state] : data[state])
     if (state == 'loadingText') {
       this.isLoading = true
       $el.addClass(d).attr(d, d).prop(d, true)
     } else if (this.isLoading) {
       this.isLoading = false
       $el.removeClass(d).removeAttr(d).prop(d, false)
     }
   }, this), 0)
 }
 Button.prototype.toggle = function () {
   var changed = true
   var $parent = this.$element.closest('[data-toggle="buttons"]')
   if ($parent.length) {
     var $input = this.$element.find('input')
     if ($input.prop('type') == 'radio') {
       if ($input.prop('checked')) changed = false
       $parent.find('.active').removeClass('active')
       this.$element.addClass('active')
     } else if ($input.prop('type') == 'checkbox') {
       if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
       this.$element.toggleClass('active')
     }
     $input.prop('checked', this.$element.hasClass('active'))
     if (changed) $input.trigger('change')
   } else {
     this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
     this.$element.toggleClass('active')
   }
 }


 // BUTTON PLUGIN DEFINITION
 // ========================
 function Plugin(option) {
   return this.each(function () {
     var $this   = $(this)
     var data    = $this.data('bs.button')
     var options = typeof option == 'object' && option
     if (!data) $this.data('bs.button', (data = new Button(this, options)))
     if (option == 'toggle') data.toggle()
     else if (option) data.setState(option)
   })
 }
 var old = $.fn.button
 $.fn.button             = Plugin
 $.fn.button.Constructor = Button


 // BUTTON NO CONFLICT
 // ==================
 $.fn.button.noConflict = function () {
   $.fn.button = old
   return this
 }


 // BUTTON DATA-API
 // ===============
 $(document)
   .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
     var $btn = $(e.target).closest('.btn')
     Plugin.call($btn, 'toggle')
     if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
       // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
       e.preventDefault()
       // The target component still receive the focus
       if ($btn.is('input,button')) $btn.trigger('focus')
       else $btn.find('input:visible,button:visible').first().trigger('focus')
     }
   })
   .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
     $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
   })

}(jQuery);

/* ========================================================================

* Bootstrap: carousel.js v3.3.7
* http://getbootstrap.com/javascript/#carousel
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */


+function ($) {

 'use strict';
 // CAROUSEL CLASS DEFINITION
 // =========================
 var Carousel = function (element, options) {
   this.$element    = $(element)
   this.$indicators = this.$element.find('.carousel-indicators')
   this.options     = options
   this.paused      = null
   this.sliding     = null
   this.interval    = null
   this.$active     = null
   this.$items      = null
   this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
   this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
     .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
     .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
 }
 Carousel.VERSION  = '3.3.7'
 Carousel.TRANSITION_DURATION = 600
 Carousel.DEFAULTS = {
   interval: 5000,
   pause: 'hover',
   wrap: true,
   keyboard: true
 }
 Carousel.prototype.keydown = function (e) {
   if (/input|textarea/i.test(e.target.tagName)) return
   switch (e.which) {
     case 37: this.prev(); break
     case 39: this.next(); break
     default: return
   }
   e.preventDefault()
 }
 Carousel.prototype.cycle = function (e) {
   e || (this.paused = false)
   this.interval && clearInterval(this.interval)
   this.options.interval
     && !this.paused
     && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
   return this
 }
 Carousel.prototype.getItemIndex = function (item) {
   this.$items = item.parent().children('.item')
   return this.$items.index(item || this.$active)
 }
 Carousel.prototype.getItemForDirection = function (direction, active) {
   var activeIndex = this.getItemIndex(active)
   var willWrap = (direction == 'prev' && activeIndex === 0)
               || (direction == 'next' && activeIndex == (this.$items.length - 1))
   if (willWrap && !this.options.wrap) return active
   var delta = direction == 'prev' ? -1 : 1
   var itemIndex = (activeIndex + delta) % this.$items.length
   return this.$items.eq(itemIndex)
 }
 Carousel.prototype.to = function (pos) {
   var that        = this
   var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
   if (pos > (this.$items.length - 1) || pos < 0) return
   if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
   if (activeIndex == pos) return this.pause().cycle()
   return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
 }
 Carousel.prototype.pause = function (e) {
   e || (this.paused = true)
   if (this.$element.find('.next, .prev').length && $.support.transition) {
     this.$element.trigger($.support.transition.end)
     this.cycle(true)
   }
   this.interval = clearInterval(this.interval)
   return this
 }
 Carousel.prototype.next = function () {
   if (this.sliding) return
   return this.slide('next')
 }
 Carousel.prototype.prev = function () {
   if (this.sliding) return
   return this.slide('prev')
 }
 Carousel.prototype.slide = function (type, next) {
   var $active   = this.$element.find('.item.active')
   var $next     = next || this.getItemForDirection(type, $active)
   var isCycling = this.interval
   var direction = type == 'next' ? 'left' : 'right'
   var that      = this
   if ($next.hasClass('active')) return (this.sliding = false)
   var relatedTarget = $next[0]
   var slideEvent = $.Event('slide.bs.carousel', {
     relatedTarget: relatedTarget,
     direction: direction
   })
   this.$element.trigger(slideEvent)
   if (slideEvent.isDefaultPrevented()) return
   this.sliding = true
   isCycling && this.pause()
   if (this.$indicators.length) {
     this.$indicators.find('.active').removeClass('active')
     var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
     $nextIndicator && $nextIndicator.addClass('active')
   }
   var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
   if ($.support.transition && this.$element.hasClass('slide')) {
     $next.addClass(type)
     $next[0].offsetWidth // force reflow
     $active.addClass(direction)
     $next.addClass(direction)
     $active
       .one('bsTransitionEnd', function () {
         $next.removeClass([type, direction].join(' ')).addClass('active')
         $active.removeClass(['active', direction].join(' '))
         that.sliding = false
         setTimeout(function () {
           that.$element.trigger(slidEvent)
         }, 0)
       })
       .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
   } else {
     $active.removeClass('active')
     $next.addClass('active')
     this.sliding = false
     this.$element.trigger(slidEvent)
   }
   isCycling && this.cycle()
   return this
 }


 // CAROUSEL PLUGIN DEFINITION
 // ==========================
 function Plugin(option) {
   return this.each(function () {
     var $this   = $(this)
     var data    = $this.data('bs.carousel')
     var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
     var action  = typeof option == 'string' ? option : options.slide
     if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
     if (typeof option == 'number') data.to(option)
     else if (action) data[action]()
     else if (options.interval) data.pause().cycle()
   })
 }
 var old = $.fn.carousel
 $.fn.carousel             = Plugin
 $.fn.carousel.Constructor = Carousel


 // CAROUSEL NO CONFLICT
 // ====================
 $.fn.carousel.noConflict = function () {
   $.fn.carousel = old
   return this
 }


 // CAROUSEL DATA-API
 // =================
 var clickHandler = function (e) {
   var href
   var $this   = $(this)
   var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, )) // strip for ie7
   if (!$target.hasClass('carousel')) return
   var options = $.extend({}, $target.data(), $this.data())
   var slideIndex = $this.attr('data-slide-to')
   if (slideIndex) options.interval = false
   Plugin.call($target, options)
   if (slideIndex) {
     $target.data('bs.carousel').to(slideIndex)
   }
   e.preventDefault()
 }
 $(document)
   .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
   .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
 $(window).on('load', function () {
   $('[data-ride="carousel"]').each(function () {
     var $carousel = $(this)
     Plugin.call($carousel, $carousel.data())
   })
 })

}(jQuery);

/* ========================================================================

* Bootstrap: collapse.js v3.3.7
* http://getbootstrap.com/javascript/#collapse
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */

/* jshint latedef: false */

+function ($) {

 'use strict';
 // COLLAPSE PUBLIC CLASS DEFINITION
 // ================================
 var Collapse = function (element, options) {
   this.$element      = $(element)
   this.options       = $.extend({}, Collapse.DEFAULTS, options)
   this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
                          '[data-toggle="collapse"][data-target="#' + element.id + '"]')
   this.transitioning = null
   if (this.options.parent) {
     this.$parent = this.getParent()
   } else {
     this.addAriaAndCollapsedClass(this.$element, this.$trigger)
   }
   if (this.options.toggle) this.toggle()
 }
 Collapse.VERSION  = '3.3.7'
 Collapse.TRANSITION_DURATION = 350
 Collapse.DEFAULTS = {
   toggle: true
 }
 Collapse.prototype.dimension = function () {
   var hasWidth = this.$element.hasClass('width')
   return hasWidth ? 'width' : 'height'
 }
 Collapse.prototype.show = function () {
   if (this.transitioning || this.$element.hasClass('in')) return
   var activesData
   var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
   if (actives && actives.length) {
     activesData = actives.data('bs.collapse')
     if (activesData && activesData.transitioning) return
   }
   var startEvent = $.Event('show.bs.collapse')
   this.$element.trigger(startEvent)
   if (startEvent.isDefaultPrevented()) return
   if (actives && actives.length) {
     Plugin.call(actives, 'hide')
     activesData || actives.data('bs.collapse', null)
   }
   var dimension = this.dimension()
   this.$element
     .removeClass('collapse')
     .addClass('collapsing')[dimension](0)
     .attr('aria-expanded', true)
   this.$trigger
     .removeClass('collapsed')
     .attr('aria-expanded', true)
   this.transitioning = 1
   var complete = function () {
     this.$element
       .removeClass('collapsing')
       .addClass('collapse in')[dimension]()
     this.transitioning = 0
     this.$element
       .trigger('shown.bs.collapse')
   }
   if (!$.support.transition) return complete.call(this)
   var scrollSize = $.camelCase(['scroll', dimension].join('-'))
   this.$element
     .one('bsTransitionEnd', $.proxy(complete, this))
     .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
 }
 Collapse.prototype.hide = function () {
   if (this.transitioning || !this.$element.hasClass('in')) return
   var startEvent = $.Event('hide.bs.collapse')
   this.$element.trigger(startEvent)
   if (startEvent.isDefaultPrevented()) return
   var dimension = this.dimension()
   this.$element[dimension](this.$element[dimension]())[0].offsetHeight
   this.$element
     .addClass('collapsing')
     .removeClass('collapse in')
     .attr('aria-expanded', false)
   this.$trigger
     .addClass('collapsed')
     .attr('aria-expanded', false)
   this.transitioning = 1
   var complete = function () {
     this.transitioning = 0
     this.$element
       .removeClass('collapsing')
       .addClass('collapse')
       .trigger('hidden.bs.collapse')
   }
   if (!$.support.transition) return complete.call(this)
   this.$element
     [dimension](0)
     .one('bsTransitionEnd', $.proxy(complete, this))
     .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
 }
 Collapse.prototype.toggle = function () {
   this[this.$element.hasClass('in') ? 'hide' : 'show']()
 }
 Collapse.prototype.getParent = function () {
   return $(this.options.parent)
     .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
     .each($.proxy(function (i, element) {
       var $element = $(element)
       this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
     }, this))
     .end()
 }
 Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
   var isOpen = $element.hasClass('in')
   $element.attr('aria-expanded', isOpen)
   $trigger
     .toggleClass('collapsed', !isOpen)
     .attr('aria-expanded', isOpen)
 }
 function getTargetFromTrigger($trigger) {
   var href
   var target = $trigger.attr('data-target')
     || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, ) // strip for ie7
   return $(target)
 }


 // COLLAPSE PLUGIN DEFINITION
 // ==========================
 function Plugin(option) {
   return this.each(function () {
     var $this   = $(this)
     var data    = $this.data('bs.collapse')
     var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
     if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
     if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
     if (typeof option == 'string') data[option]()
   })
 }
 var old = $.fn.collapse
 $.fn.collapse             = Plugin
 $.fn.collapse.Constructor = Collapse


 // COLLAPSE NO CONFLICT
 // ====================
 $.fn.collapse.noConflict = function () {
   $.fn.collapse = old
   return this
 }


 // COLLAPSE DATA-API
 // =================
 $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
   var $this   = $(this)
   if (!$this.attr('data-target')) e.preventDefault()
   var $target = getTargetFromTrigger($this)
   var data    = $target.data('bs.collapse')
   var option  = data ? 'toggle' : $this.data()
   Plugin.call($target, option)
 })

}(jQuery);

/* ========================================================================

* Bootstrap: dropdown.js v3.3.7
* http://getbootstrap.com/javascript/#dropdowns
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */


+function ($) {

 'use strict';
 // DROPDOWN CLASS DEFINITION
 // =========================
 var backdrop = '.dropdown-backdrop'
 var toggle   = '[data-toggle="dropdown"]'
 var Dropdown = function (element) {
   $(element).on('click.bs.dropdown', this.toggle)
 }
 Dropdown.VERSION = '3.3.7'
 function getParent($this) {
   var selector = $this.attr('data-target')
   if (!selector) {
     selector = $this.attr('href')
     selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, ) // strip for ie7
   }
   var $parent = selector && $(selector)
   return $parent && $parent.length ? $parent : $this.parent()
 }
 function clearMenus(e) {
   if (e && e.which === 3) return
   $(backdrop).remove()
   $(toggle).each(function () {
     var $this         = $(this)
     var $parent       = getParent($this)
     var relatedTarget = { relatedTarget: this }
     if (!$parent.hasClass('open')) return
     if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
     $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
     if (e.isDefaultPrevented()) return
     $this.attr('aria-expanded', 'false')
     $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
   })
 }
 Dropdown.prototype.toggle = function (e) {
   var $this = $(this)
   if ($this.is('.disabled, :disabled')) return
   var $parent  = getParent($this)
   var isActive = $parent.hasClass('open')
   clearMenus()
   if (!isActive) {
     if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
       // if mobile we use a backdrop because click events don't delegate
       $(document.createElement('div'))
         .addClass('dropdown-backdrop')
         .insertAfter($(this))
         .on('click', clearMenus)
     }
     var relatedTarget = { relatedTarget: this }
     $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
     if (e.isDefaultPrevented()) return
     $this
       .trigger('focus')
       .attr('aria-expanded', 'true')
     $parent
       .toggleClass('open')
       .trigger($.Event('shown.bs.dropdown', relatedTarget))
   }
   return false
 }
 Dropdown.prototype.keydown = function (e) {
   if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
   var $this = $(this)
   e.preventDefault()
   e.stopPropagation()
   if ($this.is('.disabled, :disabled')) return
   var $parent  = getParent($this)
   var isActive = $parent.hasClass('open')
   if (!isActive && e.which != 27 || isActive && e.which == 27) {
     if (e.which == 27) $parent.find(toggle).trigger('focus')
     return $this.trigger('click')
   }
   var desc = ' li:not(.disabled):visible a'
   var $items = $parent.find('.dropdown-menu' + desc)
   if (!$items.length) return
   var index = $items.index(e.target)
   if (e.which == 38 && index > 0)                 index--         // up
   if (e.which == 40 && index < $items.length - 1) index++         // down
   if (!~index)                                    index = 0
   $items.eq(index).trigger('focus')
 }


 // DROPDOWN PLUGIN DEFINITION
 // ==========================
 function Plugin(option) {
   return this.each(function () {
     var $this = $(this)
     var data  = $this.data('bs.dropdown')
     if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
     if (typeof option == 'string') data[option].call($this)
   })
 }
 var old = $.fn.dropdown
 $.fn.dropdown             = Plugin
 $.fn.dropdown.Constructor = Dropdown


 // DROPDOWN NO CONFLICT
 // ====================
 $.fn.dropdown.noConflict = function () {
   $.fn.dropdown = old
   return this
 }


 // APPLY TO STANDARD DROPDOWN ELEMENTS
 // ===================================
 $(document)
   .on('click.bs.dropdown.data-api', clearMenus)
   .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
   .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
   .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
   .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)

}(jQuery);

/* ========================================================================

* Bootstrap: modal.js v3.3.7
* http://getbootstrap.com/javascript/#modals
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */


+function ($) {

 'use strict';
 // MODAL CLASS DEFINITION
 // ======================
 var Modal = function (element, options) {
   this.options             = options
   this.$body               = $(document.body)
   this.$element            = $(element)
   this.$dialog             = this.$element.find('.modal-dialog')
   this.$backdrop           = null
   this.isShown             = null
   this.originalBodyPad     = null
   this.scrollbarWidth      = 0
   this.ignoreBackdropClick = false
   if (this.options.remote) {
     this.$element
       .find('.modal-content')
       .load(this.options.remote, $.proxy(function () {
         this.$element.trigger('loaded.bs.modal')
       }, this))
   }
 }
 Modal.VERSION  = '3.3.7'
 Modal.TRANSITION_DURATION = 300
 Modal.BACKDROP_TRANSITION_DURATION = 150
 Modal.DEFAULTS = {
   backdrop: true,
   keyboard: true,
   show: true
 }
 Modal.prototype.toggle = function (_relatedTarget) {
   return this.isShown ? this.hide() : this.show(_relatedTarget)
 }
 Modal.prototype.show = function (_relatedTarget) {
   var that = this
   var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
   this.$element.trigger(e)
   if (this.isShown || e.isDefaultPrevented()) return
   this.isShown = true
   this.checkScrollbar()
   this.setScrollbar()
   this.$body.addClass('modal-open')
   this.escape()
   this.resize()
   this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
   this.$dialog.on('mousedown.dismiss.bs.modal', function () {
     that.$element.one('mouseup.dismiss.bs.modal', function (e) {
       if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
     })
   })
   this.backdrop(function () {
     var transition = $.support.transition && that.$element.hasClass('fade')
     if (!that.$element.parent().length) {
       that.$element.appendTo(that.$body) // don't move modals dom position
     }
     that.$element
       .show()
       .scrollTop(0)
     that.adjustDialog()
     if (transition) {
       that.$element[0].offsetWidth // force reflow
     }
     that.$element.addClass('in')
     that.enforceFocus()
     var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
     transition ?
       that.$dialog // wait for modal to slide in
         .one('bsTransitionEnd', function () {
           that.$element.trigger('focus').trigger(e)
         })
         .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
       that.$element.trigger('focus').trigger(e)
   })
 }
 Modal.prototype.hide = function (e) {
   if (e) e.preventDefault()
   e = $.Event('hide.bs.modal')
   this.$element.trigger(e)
   if (!this.isShown || e.isDefaultPrevented()) return
   this.isShown = false
   this.escape()
   this.resize()
   $(document).off('focusin.bs.modal')
   this.$element
     .removeClass('in')
     .off('click.dismiss.bs.modal')
     .off('mouseup.dismiss.bs.modal')
   this.$dialog.off('mousedown.dismiss.bs.modal')
   $.support.transition && this.$element.hasClass('fade') ?
     this.$element
       .one('bsTransitionEnd', $.proxy(this.hideModal, this))
       .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
     this.hideModal()
 }
 Modal.prototype.enforceFocus = function () {
   $(document)
     .off('focusin.bs.modal') // guard against infinite focus loop
     .on('focusin.bs.modal', $.proxy(function (e) {
       if (document !== e.target &&
           this.$element[0] !== e.target &&
           !this.$element.has(e.target).length) {
         this.$element.trigger('focus')
       }
     }, this))
 }
 Modal.prototype.escape = function () {
   if (this.isShown && this.options.keyboard) {
     this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
       e.which == 27 && this.hide()
     }, this))
   } else if (!this.isShown) {
     this.$element.off('keydown.dismiss.bs.modal')
   }
 }
 Modal.prototype.resize = function () {
   if (this.isShown) {
     $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
   } else {
     $(window).off('resize.bs.modal')
   }
 }
 Modal.prototype.hideModal = function () {
   var that = this
   this.$element.hide()
   this.backdrop(function () {
     that.$body.removeClass('modal-open')
     that.resetAdjustments()
     that.resetScrollbar()
     that.$element.trigger('hidden.bs.modal')
   })
 }
 Modal.prototype.removeBackdrop = function () {
   this.$backdrop && this.$backdrop.remove()
   this.$backdrop = null
 }
 Modal.prototype.backdrop = function (callback) {
   var that = this
   var animate = this.$element.hasClass('fade') ? 'fade' : 
   if (this.isShown && this.options.backdrop) {
     var doAnimate = $.support.transition && animate
     this.$backdrop = $(document.createElement('div'))
       .addClass('modal-backdrop ' + animate)
       .appendTo(this.$body)
     this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
       if (this.ignoreBackdropClick) {
         this.ignoreBackdropClick = false
         return
       }
       if (e.target !== e.currentTarget) return
       this.options.backdrop == 'static'
         ? this.$element[0].focus()
         : this.hide()
     }, this))
     if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
     this.$backdrop.addClass('in')
     if (!callback) return
     doAnimate ?
       this.$backdrop
         .one('bsTransitionEnd', callback)
         .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
       callback()
   } else if (!this.isShown && this.$backdrop) {
     this.$backdrop.removeClass('in')
     var callbackRemove = function () {
       that.removeBackdrop()
       callback && callback()
     }
     $.support.transition && this.$element.hasClass('fade') ?
       this.$backdrop
         .one('bsTransitionEnd', callbackRemove)
         .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
       callbackRemove()
   } else if (callback) {
     callback()
   }
 }
 // these following methods are used to handle overflowing modals
 Modal.prototype.handleUpdate = function () {
   this.adjustDialog()
 }
 Modal.prototype.adjustDialog = function () {
   var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
   this.$element.css({
     paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : ,
     paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : 
   })
 }
 Modal.prototype.resetAdjustments = function () {
   this.$element.css({
     paddingLeft: ,
     paddingRight: 
   })
 }
 Modal.prototype.checkScrollbar = function () {
   var fullWindowWidth = window.innerWidth
   if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
     var documentElementRect = document.documentElement.getBoundingClientRect()
     fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
   }
   this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
   this.scrollbarWidth = this.measureScrollbar()
 }
 Modal.prototype.setScrollbar = function () {
   var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
   this.originalBodyPad = document.body.style.paddingRight || 
   if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
 }
 Modal.prototype.resetScrollbar = function () {
   this.$body.css('padding-right', this.originalBodyPad)
 }
 Modal.prototype.measureScrollbar = function () { // thx walsh
   var scrollDiv = document.createElement('div')
   scrollDiv.className = 'modal-scrollbar-measure'
   this.$body.append(scrollDiv)
   var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
   this.$body[0].removeChild(scrollDiv)
   return scrollbarWidth
 }


 // MODAL PLUGIN DEFINITION
 // =======================
 function Plugin(option, _relatedTarget) {
   return this.each(function () {
     var $this   = $(this)
     var data    = $this.data('bs.modal')
     var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
     if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
     if (typeof option == 'string') data[option](_relatedTarget)
     else if (options.show) data.show(_relatedTarget)
   })
 }
 var old = $.fn.modal
 $.fn.modal             = Plugin
 $.fn.modal.Constructor = Modal


 // MODAL NO CONFLICT
 // =================
 $.fn.modal.noConflict = function () {
   $.fn.modal = old
   return this
 }


 // MODAL DATA-API
 // ==============
 $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
   var $this   = $(this)
   var href    = $this.attr('href')
   var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ))) // strip for ie7
   var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
   if ($this.is('a')) e.preventDefault()
   $target.one('show.bs.modal', function (showEvent) {
     if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
     $target.one('hidden.bs.modal', function () {
       $this.is(':visible') && $this.trigger('focus')
     })
   })
   Plugin.call($target, option, this)
 })

}(jQuery);

/* ========================================================================

* Bootstrap: tooltip.js v3.3.7
* http://getbootstrap.com/javascript/#tooltip
* Inspired by the original jQuery.tipsy by Jason Frame
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */


+function ($) {

 'use strict';
 // TOOLTIP PUBLIC CLASS DEFINITION
 // ===============================
 var Tooltip = function (element, options) {
   this.type       = null
   this.options    = null
   this.enabled    = null
   this.timeout    = null
   this.hoverState = null
   this.$element   = null
   this.inState    = null
   this.init('tooltip', element, options)
 }
 Tooltip.VERSION  = '3.3.7'
 Tooltip.TRANSITION_DURATION = 150
 Tooltip.DEFAULTS = {
   animation: true,
   placement: 'top',
   selector: false,
template: '
',
   trigger: 'hover focus',
   title: ,
   delay: 0,
   html: false,
   container: false,
   viewport: {
     selector: 'body',
     padding: 0
   }
 }
 Tooltip.prototype.init = function (type, element, options) {
   this.enabled   = true
   this.type      = type
   this.$element  = $(element)
   this.options   = this.getOptions(options)
   this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
   this.inState   = { click: false, hover: false, focus: false }
   if (this.$element[0] instanceof document.constructor && !this.options.selector) {
     throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
   }
   var triggers = this.options.trigger.split(' ')
   for (var i = triggers.length; i--;) {
     var trigger = triggers[i]
     if (trigger == 'click') {
       this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
     } else if (trigger != 'manual') {
       var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
       var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
       this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
       this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
     }
   }
   this.options.selector ?
     (this._options = $.extend({}, this.options, { trigger: 'manual', selector:  })) :
     this.fixTitle()
 }
 Tooltip.prototype.getDefaults = function () {
   return Tooltip.DEFAULTS
 }
 Tooltip.prototype.getOptions = function (options) {
   options = $.extend({}, this.getDefaults(), this.$element.data(), options)
   if (options.delay && typeof options.delay == 'number') {
     options.delay = {
       show: options.delay,
       hide: options.delay
     }
   }
   return options
 }
 Tooltip.prototype.getDelegateOptions = function () {
   var options  = {}
   var defaults = this.getDefaults()
   this._options && $.each(this._options, function (key, value) {
     if (defaults[key] != value) options[key] = value
   })
   return options
 }
 Tooltip.prototype.enter = function (obj) {
   var self = obj instanceof this.constructor ?
     obj : $(obj.currentTarget).data('bs.' + this.type)
   if (!self) {
     self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
     $(obj.currentTarget).data('bs.' + this.type, self)
   }
   if (obj instanceof $.Event) {
     self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
   }
   if (self.tip().hasClass('in') || self.hoverState == 'in') {
     self.hoverState = 'in'
     return
   }
   clearTimeout(self.timeout)
   self.hoverState = 'in'
   if (!self.options.delay || !self.options.delay.show) return self.show()
   self.timeout = setTimeout(function () {
     if (self.hoverState == 'in') self.show()
   }, self.options.delay.show)
 }
 Tooltip.prototype.isInStateTrue = function () {
   for (var key in this.inState) {
     if (this.inState[key]) return true
   }
   return false
 }
 Tooltip.prototype.leave = function (obj) {
   var self = obj instanceof this.constructor ?
     obj : $(obj.currentTarget).data('bs.' + this.type)
   if (!self) {
     self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
     $(obj.currentTarget).data('bs.' + this.type, self)
   }
   if (obj instanceof $.Event) {
     self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
   }
   if (self.isInStateTrue()) return
   clearTimeout(self.timeout)
   self.hoverState = 'out'
   if (!self.options.delay || !self.options.delay.hide) return self.hide()
   self.timeout = setTimeout(function () {
     if (self.hoverState == 'out') self.hide()
   }, self.options.delay.hide)
 }
 Tooltip.prototype.show = function () {
   var e = $.Event('show.bs.' + this.type)
   if (this.hasContent() && this.enabled) {
     this.$element.trigger(e)
     var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
     if (e.isDefaultPrevented() || !inDom) return
     var that = this
     var $tip = this.tip()
     var tipId = this.getUID(this.type)
     this.setContent()
     $tip.attr('id', tipId)
     this.$element.attr('aria-describedby', tipId)
     if (this.options.animation) $tip.addClass('fade')
     var placement = typeof this.options.placement == 'function' ?
       this.options.placement.call(this, $tip[0], this.$element[0]) :
       this.options.placement
     var autoToken = /\s?auto?\s?/i
     var autoPlace = autoToken.test(placement)
     if (autoPlace) placement = placement.replace(autoToken, ) || 'top'
     $tip
       .detach()
       .css({ top: 0, left: 0, display: 'block' })
       .addClass(placement)
       .data('bs.' + this.type, this)
     this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
     this.$element.trigger('inserted.bs.' + this.type)
     var pos          = this.getPosition()
     var actualWidth  = $tip[0].offsetWidth
     var actualHeight = $tip[0].offsetHeight
     if (autoPlace) {
       var orgPlacement = placement
       var viewportDim = this.getPosition(this.$viewport)
       placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
                   placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
                   placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
                   placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
                   placement
       $tip
         .removeClass(orgPlacement)
         .addClass(placement)
     }
     var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
     this.applyPlacement(calculatedOffset, placement)
     var complete = function () {
       var prevHoverState = that.hoverState
       that.$element.trigger('shown.bs.' + that.type)
       that.hoverState = null
       if (prevHoverState == 'out') that.leave(that)
     }
     $.support.transition && this.$tip.hasClass('fade') ?
       $tip
         .one('bsTransitionEnd', complete)
         .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
       complete()
   }
 }
 Tooltip.prototype.applyPlacement = function (offset, placement) {
   var $tip   = this.tip()
   var width  = $tip[0].offsetWidth
   var height = $tip[0].offsetHeight
   // manually read margins because getBoundingClientRect includes difference
   var marginTop = parseInt($tip.css('margin-top'), 10)
   var marginLeft = parseInt($tip.css('margin-left'), 10)
   // we must check for NaN for ie 8/9
   if (isNaN(marginTop))  marginTop  = 0
   if (isNaN(marginLeft)) marginLeft = 0
   offset.top  += marginTop
   offset.left += marginLeft
   // $.fn.offset doesn't round pixel values
   // so we use setOffset directly with our own function B-0
   $.offset.setOffset($tip[0], $.extend({
     using: function (props) {
       $tip.css({
         top: Math.round(props.top),
         left: Math.round(props.left)
       })
     }
   }, offset), 0)
   $tip.addClass('in')
   // check to see if placing tip in new offset caused the tip to resize itself
   var actualWidth  = $tip[0].offsetWidth
   var actualHeight = $tip[0].offsetHeight
   if (placement == 'top' && actualHeight != height) {
     offset.top = offset.top + height - actualHeight
   }
   var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
   if (delta.left) offset.left += delta.left
   else offset.top += delta.top
   var isVertical          = /top|bottom/.test(placement)
   var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
   var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
   $tip.offset(offset)
   this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
 }
 Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
   this.arrow()
     .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
     .css(isVertical ? 'top' : 'left', )
 }
 Tooltip.prototype.setContent = function () {
   var $tip  = this.tip()
   var title = this.getTitle()
   $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
   $tip.removeClass('fade in top bottom left right')
 }
 Tooltip.prototype.hide = function (callback) {
   var that = this
   var $tip = $(this.$tip)
   var e    = $.Event('hide.bs.' + this.type)
   function complete() {
     if (that.hoverState != 'in') $tip.detach()
     if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
       that.$element
         .removeAttr('aria-describedby')
         .trigger('hidden.bs.' + that.type)
     }
     callback && callback()
   }
   this.$element.trigger(e)
   if (e.isDefaultPrevented()) return
   $tip.removeClass('in')
   $.support.transition && $tip.hasClass('fade') ?
     $tip
       .one('bsTransitionEnd', complete)
       .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
     complete()
   this.hoverState = null
   return this
 }
 Tooltip.prototype.fixTitle = function () {
   var $e = this.$element
   if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
     $e.attr('data-original-title', $e.attr('title') || ).attr('title', )
   }
 }
 Tooltip.prototype.hasContent = function () {
   return this.getTitle()
 }
 Tooltip.prototype.getPosition = function ($element) {
   $element   = $element || this.$element
   var el     = $element[0]
   var isBody = el.tagName == 'BODY'
   var elRect    = el.getBoundingClientRect()
   if (elRect.width == null) {
     // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
     elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
   }
   var isSvg = window.SVGElement && el instanceof window.SVGElement
   // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
   // See https://github.com/twbs/bootstrap/issues/20280
   var elOffset  = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
   var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
   var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
   return $.extend({}, elRect, scroll, outerDims, elOffset)
 }
 Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
   return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
          placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
          placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
       /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
 }
 Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
   var delta = { top: 0, left: 0 }
   if (!this.$viewport) return delta
   var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
   var viewportDimensions = this.getPosition(this.$viewport)
   if (/right|left/.test(placement)) {
     var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
     var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
     if (topEdgeOffset < viewportDimensions.top) { // top overflow
       delta.top = viewportDimensions.top - topEdgeOffset
     } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
       delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
     }
   } else {
     var leftEdgeOffset  = pos.left - viewportPadding
     var rightEdgeOffset = pos.left + viewportPadding + actualWidth
     if (leftEdgeOffset < viewportDimensions.left) { // left overflow
       delta.left = viewportDimensions.left - leftEdgeOffset
     } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
       delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
     }
   }
   return delta
 }
 Tooltip.prototype.getTitle = function () {
   var title
   var $e = this.$element
   var o  = this.options
   title = $e.attr('data-original-title')
     || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
   return title
 }
 Tooltip.prototype.getUID = function (prefix) {
   do prefix += ~~(Math.random() * 1000000)
   while (document.getElementById(prefix))
   return prefix
 }
 Tooltip.prototype.tip = function () {
   if (!this.$tip) {
     this.$tip = $(this.options.template)
     if (this.$tip.length != 1) {
       throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
     }
   }
   return this.$tip
 }
 Tooltip.prototype.arrow = function () {
   return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
 }
 Tooltip.prototype.enable = function () {
   this.enabled = true
 }
 Tooltip.prototype.disable = function () {
   this.enabled = false
 }
 Tooltip.prototype.toggleEnabled = function () {
   this.enabled = !this.enabled
 }
 Tooltip.prototype.toggle = function (e) {
   var self = this
   if (e) {
     self = $(e.currentTarget).data('bs.' + this.type)
     if (!self) {
       self = new this.constructor(e.currentTarget, this.getDelegateOptions())
       $(e.currentTarget).data('bs.' + this.type, self)
     }
   }
   if (e) {
     self.inState.click = !self.inState.click
     if (self.isInStateTrue()) self.enter(self)
     else self.leave(self)
   } else {
     self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
   }
 }
 Tooltip.prototype.destroy = function () {
   var that = this
   clearTimeout(this.timeout)
   this.hide(function () {
     that.$element.off('.' + that.type).removeData('bs.' + that.type)
     if (that.$tip) {
       that.$tip.detach()
     }
     that.$tip = null
     that.$arrow = null
     that.$viewport = null
     that.$element = null
   })
 }


 // TOOLTIP PLUGIN DEFINITION
 // =========================
 function Plugin(option) {
   return this.each(function () {
     var $this   = $(this)
     var data    = $this.data('bs.tooltip')
     var options = typeof option == 'object' && option
     if (!data && /destroy|hide/.test(option)) return
     if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
     if (typeof option == 'string') data[option]()
   })
 }
 var old = $.fn.tooltip
 $.fn.tooltip             = Plugin
 $.fn.tooltip.Constructor = Tooltip


 // TOOLTIP NO CONFLICT
 // ===================
 $.fn.tooltip.noConflict = function () {
   $.fn.tooltip = old
   return this
 }

}(jQuery);

/* ========================================================================

* Bootstrap: popover.js v3.3.7
* http://getbootstrap.com/javascript/#popovers
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */


+function ($) {

 'use strict';
 // POPOVER PUBLIC CLASS DEFINITION
 // ===============================
 var Popover = function (element, options) {
   this.init('popover', element, options)
 }
 if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
 Popover.VERSION  = '3.3.7'
 Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
   placement: 'right',
   trigger: 'click',
   content: ,
template: '

'
 })


 // NOTE: POPOVER EXTENDS tooltip.js
 // ================================
 Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
 Popover.prototype.constructor = Popover
 Popover.prototype.getDefaults = function () {
   return Popover.DEFAULTS
 }
 Popover.prototype.setContent = function () {
   var $tip    = this.tip()
   var title   = this.getTitle()
   var content = this.getContent()
   $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
   $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
     this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
   ](content)
   $tip.removeClass('fade top bottom left right in')
   // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
   // this manually by checking the contents.
   if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
 }
 Popover.prototype.hasContent = function () {
   return this.getTitle() || this.getContent()
 }
 Popover.prototype.getContent = function () {
   var $e = this.$element
   var o  = this.options
   return $e.attr('data-content')
     || (typeof o.content == 'function' ?
           o.content.call($e[0]) :
           o.content)
 }
 Popover.prototype.arrow = function () {
   return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
 }


 // POPOVER PLUGIN DEFINITION
 // =========================
 function Plugin(option) {
   return this.each(function () {
     var $this   = $(this)
     var data    = $this.data('bs.popover')
     var options = typeof option == 'object' && option
     if (!data && /destroy|hide/.test(option)) return
     if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
     if (typeof option == 'string') data[option]()
   })
 }
 var old = $.fn.popover
 $.fn.popover             = Plugin
 $.fn.popover.Constructor = Popover


 // POPOVER NO CONFLICT
 // ===================
 $.fn.popover.noConflict = function () {
   $.fn.popover = old
   return this
 }

}(jQuery);

/* ========================================================================

* Bootstrap: scrollspy.js v3.3.7
* http://getbootstrap.com/javascript/#scrollspy
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */


+function ($) {

 'use strict';
 // SCROLLSPY CLASS DEFINITION
 // ==========================
 function ScrollSpy(element, options) {
   this.$body          = $(document.body)
   this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
   this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
   this.selector       = (this.options.target || ) + ' .nav li > a'
   this.offsets        = []
   this.targets        = []
   this.activeTarget   = null
   this.scrollHeight   = 0
   this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
   this.refresh()
   this.process()
 }
 ScrollSpy.VERSION  = '3.3.7'
 ScrollSpy.DEFAULTS = {
   offset: 10
 }
 ScrollSpy.prototype.getScrollHeight = function () {
   return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
 }
 ScrollSpy.prototype.refresh = function () {
   var that          = this
   var offsetMethod  = 'offset'
   var offsetBase    = 0
   this.offsets      = []
   this.targets      = []
   this.scrollHeight = this.getScrollHeight()
   if (!$.isWindow(this.$scrollElement[0])) {
     offsetMethod = 'position'
     offsetBase   = this.$scrollElement.scrollTop()
   }
   this.$body
     .find(this.selector)
     .map(function () {
       var $el   = $(this)
       var href  = $el.data('target') || $el.attr('href')
       var $href = /^#./.test(href) && $(href)
       return ($href
         && $href.length
         && $href.is(':visible')
         && [[$href[offsetMethod]().top + offsetBase, href]]) || null
     })
     .sort(function (a, b) { return a[0] - b[0] })
     .each(function () {
       that.offsets.push(this[0])
       that.targets.push(this[1])
     })
 }
 ScrollSpy.prototype.process = function () {
   var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
   var scrollHeight = this.getScrollHeight()
   var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
   var offsets      = this.offsets
   var targets      = this.targets
   var activeTarget = this.activeTarget
   var i
   if (this.scrollHeight != scrollHeight) {
     this.refresh()
   }
   if (scrollTop >= maxScroll) {
     return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
   }
   if (activeTarget && scrollTop < offsets[0]) {
     this.activeTarget = null
     return this.clear()
   }
   for (i = offsets.length; i--;) {
     activeTarget != targets[i]
       && scrollTop >= offsets[i]
       && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
       && this.activate(targets[i])
   }
 }
 ScrollSpy.prototype.activate = function (target) {
   this.activeTarget = target
   this.clear()
   var selector = this.selector +
     '[data-target="' + target + '"],' +
     this.selector + '[href="' + target + '"]'
   var active = $(selector)
     .parents('li')
     .addClass('active')
   if (active.parent('.dropdown-menu').length) {
     active = active
       .closest('li.dropdown')
       .addClass('active')
   }
   active.trigger('activate.bs.scrollspy')
 }
 ScrollSpy.prototype.clear = function () {
   $(this.selector)
     .parentsUntil(this.options.target, '.active')
     .removeClass('active')
 }


 // SCROLLSPY PLUGIN DEFINITION
 // ===========================
 function Plugin(option) {
   return this.each(function () {
     var $this   = $(this)
     var data    = $this.data('bs.scrollspy')
     var options = typeof option == 'object' && option
     if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
     if (typeof option == 'string') data[option]()
   })
 }
 var old = $.fn.scrollspy
 $.fn.scrollspy             = Plugin
 $.fn.scrollspy.Constructor = ScrollSpy


 // SCROLLSPY NO CONFLICT
 // =====================
 $.fn.scrollspy.noConflict = function () {
   $.fn.scrollspy = old
   return this
 }


 // SCROLLSPY DATA-API
 // ==================
 $(window).on('load.bs.scrollspy.data-api', function () {
   $('[data-spy="scroll"]').each(function () {
     var $spy = $(this)
     Plugin.call($spy, $spy.data())
   })
 })

}(jQuery);

/* ========================================================================

* Bootstrap: tab.js v3.3.7
* http://getbootstrap.com/javascript/#tabs
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */


+function ($) {

 'use strict';
 // TAB CLASS DEFINITION
 // ====================
 var Tab = function (element) {
   // jscs:disable requireDollarBeforejQueryAssignment
   this.element = $(element)
   // jscs:enable requireDollarBeforejQueryAssignment
 }
 Tab.VERSION = '3.3.7'
 Tab.TRANSITION_DURATION = 150
 Tab.prototype.show = function () {
   var $this    = this.element
   var $ul      = $this.closest('ul:not(.dropdown-menu)')
   var selector = $this.data('target')
   if (!selector) {
     selector = $this.attr('href')
     selector = selector && selector.replace(/.*(?=#[^\s]*$)/, ) // strip for ie7
   }
   if ($this.parent('li').hasClass('active')) return
   var $previous = $ul.find('.active:last a')
   var hideEvent = $.Event('hide.bs.tab', {
     relatedTarget: $this[0]
   })
   var showEvent = $.Event('show.bs.tab', {
     relatedTarget: $previous[0]
   })
   $previous.trigger(hideEvent)
   $this.trigger(showEvent)
   if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
   var $target = $(selector)
   this.activate($this.closest('li'), $ul)
   this.activate($target, $target.parent(), function () {
     $previous.trigger({
       type: 'hidden.bs.tab',
       relatedTarget: $this[0]
     })
     $this.trigger({
       type: 'shown.bs.tab',
       relatedTarget: $previous[0]
     })
   })
 }
 Tab.prototype.activate = function (element, container, callback) {
   var $active    = container.find('> .active')
   var transition = callback
     && $.support.transition
     && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
   function next() {
     $active
       .removeClass('active')
       .find('> .dropdown-menu > .active')
         .removeClass('active')
       .end()
       .find('[data-toggle="tab"]')
         .attr('aria-expanded', false)
     element
       .addClass('active')
       .find('[data-toggle="tab"]')
         .attr('aria-expanded', true)
     if (transition) {
       element[0].offsetWidth // reflow for transition
       element.addClass('in')
     } else {
       element.removeClass('fade')
     }
     if (element.parent('.dropdown-menu').length) {
       element
         .closest('li.dropdown')
           .addClass('active')
         .end()
         .find('[data-toggle="tab"]')
           .attr('aria-expanded', true)
     }
     callback && callback()
   }
   $active.length && transition ?
     $active
       .one('bsTransitionEnd', next)
       .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
     next()
   $active.removeClass('in')
 }


 // TAB PLUGIN DEFINITION
 // =====================
 function Plugin(option) {
   return this.each(function () {
     var $this = $(this)
     var data  = $this.data('bs.tab')
     if (!data) $this.data('bs.tab', (data = new Tab(this)))
     if (typeof option == 'string') data[option]()
   })
 }
 var old = $.fn.tab
 $.fn.tab             = Plugin
 $.fn.tab.Constructor = Tab


 // TAB NO CONFLICT
 // ===============
 $.fn.tab.noConflict = function () {
   $.fn.tab = old
   return this
 }


 // TAB DATA-API
 // ============
 var clickHandler = function (e) {
   e.preventDefault()
   Plugin.call($(this), 'show')
 }
 $(document)
   .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
   .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)

}(jQuery);

/* ========================================================================

* Bootstrap: affix.js v3.3.7
* http://getbootstrap.com/javascript/#affix
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */


+function ($) {

 'use strict';
 // AFFIX CLASS DEFINITION
 // ======================
 var Affix = function (element, options) {
   this.options = $.extend({}, Affix.DEFAULTS, options)
   this.$target = $(this.options.target)
     .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
     .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
   this.$element     = $(element)
   this.affixed      = null
   this.unpin        = null
   this.pinnedOffset = null
   this.checkPosition()
 }
 Affix.VERSION  = '3.3.7'
 Affix.RESET    = 'affix affix-top affix-bottom'
 Affix.DEFAULTS = {
   offset: 0,
   target: window
 }
 Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
   var scrollTop    = this.$target.scrollTop()
   var position     = this.$element.offset()
   var targetHeight = this.$target.height()
   if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
   if (this.affixed == 'bottom') {
     if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
     return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
   }
   var initializing   = this.affixed == null
   var colliderTop    = initializing ? scrollTop : position.top
   var colliderHeight = initializing ? targetHeight : height
   if (offsetTop != null && scrollTop <= offsetTop) return 'top'
   if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
   return false
 }
 Affix.prototype.getPinnedOffset = function () {
   if (this.pinnedOffset) return this.pinnedOffset
   this.$element.removeClass(Affix.RESET).addClass('affix')
   var scrollTop = this.$target.scrollTop()
   var position  = this.$element.offset()
   return (this.pinnedOffset = position.top - scrollTop)
 }
 Affix.prototype.checkPositionWithEventLoop = function () {
   setTimeout($.proxy(this.checkPosition, this), 1)
 }
 Affix.prototype.checkPosition = function () {
   if (!this.$element.is(':visible')) return
   var height       = this.$element.height()
   var offset       = this.options.offset
   var offsetTop    = offset.top
   var offsetBottom = offset.bottom
   var scrollHeight = Math.max($(document).height(), $(document.body).height())
   if (typeof offset != 'object')         offsetBottom = offsetTop = offset
   if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
   if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
   var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
   if (this.affixed != affix) {
     if (this.unpin != null) this.$element.css('top', )
     var affixType = 'affix' + (affix ? '-' + affix : )
     var e         = $.Event(affixType + '.bs.affix')
     this.$element.trigger(e)
     if (e.isDefaultPrevented()) return
     this.affixed = affix
     this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
     this.$element
       .removeClass(Affix.RESET)
       .addClass(affixType)
       .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
   }
   if (affix == 'bottom') {
     this.$element.offset({
       top: scrollHeight - height - offsetBottom
     })
   }
 }


 // AFFIX PLUGIN DEFINITION
 // =======================
 function Plugin(option) {
   return this.each(function () {
     var $this   = $(this)
     var data    = $this.data('bs.affix')
     var options = typeof option == 'object' && option
     if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
     if (typeof option == 'string') data[option]()
   })
 }
 var old = $.fn.affix
 $.fn.affix             = Plugin
 $.fn.affix.Constructor = Affix


 // AFFIX NO CONFLICT
 // =================
 $.fn.affix.noConflict = function () {
   $.fn.affix = old
   return this
 }


 // AFFIX DATA-API
 // ==============
 $(window).on('load', function () {
   $('[data-spy="affix"]').each(function () {
     var $spy = $(this)
     var data = $spy.data()
     data.offset = data.offset || {}
     if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
     if (data.offsetTop    != null) data.offset.top    = data.offsetTop
     Plugin.call($spy, data)
   })
 })

}(jQuery);


(function(root, factory) {

 if (typeof define === 'function' && define.amd) {
   define(factory);
 } else if (typeof exports === 'object') {
   module.exports = factory(require, exports, module);
 } else {
   root.ScrollReveal = factory();
 }

}(this, function(require, exports, module) {


///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// /////

        /////    /////
        /////    /////

///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// /////

/**

* ScrollReveal
* ------------
* Version : 3.1.4
* Website : scrollrevealjs.org
* Repo    : github.com/jlmakes/scrollreveal.js
* Author  : Julian Lloyd (@jlmakes)
*/
(function() {
   'use strict';
   var
       sr,
       Tools,
       _requestAnimationFrame;
   this.ScrollReveal = (function() {
       /**
        * Configuration
        * -------------
        * This object signature can be passed directly to the ScrollReveal constructor,
        * or as the second argument of the `reveal()` method.
        */
       ScrollReveal.prototype.defaults = {
           //            'bottom', 'left', 'top', 'right'
           origin      : 'bottom',
           //            Can be any valid CSS distance, e.g. '5rem', '10%', '20vw', etc.
           distance    : '20px',
           //            Time in milliseconds.
           duration    : 500,
           delay       : 0,
           //            Starting angles in degrees, will transition from these values to 0 in all axes.
           rotate      : { x: 0, y: 0, z: 0 },
           //            Starting opacity value, before transitioning to the computed opacity.
           opacity     : 0,
           //            Starting scale value, will transition from this value to 1
           scale       : 0.9,
           //            Accepts any valid CSS easing, e.g. 'ease', 'ease-in-out', 'linear', etc.
           easing      : 'cubic-bezier(0.6, 0.2, 0.1, 1)',
// When null, `` is assumed to be the reveal container. You can pass a // DOM node as a custom container, e.g. document.querySelector('.fooContainer') // or a selector, e.g. '.fooContainer' container : null, // true/false to control reveal animations on mobile. mobile : true, // true: reveals occur every time elements become visible // false: reveals occur once as elements become visible reset : false, // 'always' — delay for all reveal animations // 'once' — delay only the first time reveals occur // 'onload' - delay only for animations triggered by first load useDelay : 'always', // Change when an element is considered in the viewport. The default value // of 0.20 means 20% of an element must be visible for its reveal to occur. viewFactor : 0.2, // Pixel values that alter the container boundaries. // e.g. Set `{ top: 48 }`, if you have a 48px tall fixed toolbar. // -- // Visual Aid: https://scrollrevealjs.org/assets/viewoffset.png viewOffset : { top: 0, right: 0, bottom: 0, left: 0 }, // Callbacks that fire for each completed element reveal, and if // `config.reset = true`, for each completed element reset. When creating your // callbacks, remember they are passed the element’s DOM node that triggered // it as the first argument. afterReveal : function(domEl) {}, afterReset : function(domEl) {} }; function ScrollReveal(config) { // Support instantiation without the `new` keyword. if (typeof this == 'undefined' || Object.getPrototypeOf(this) !== ScrollReveal.prototype) { return new ScrollReveal(config) } sr = this; // Save reference to instance. sr.tools = new Tools(); // *required utilities if (sr.isSupported()) { sr.tools.extend(sr.defaults, config || {}); _resolveContainer(sr.defaults); sr.store = { elements : {}, containers : [] }; sr.sequences = {}; sr.history = []; sr.uid = 0; sr.initialized = false; } // Note: IE9 only supports console if devtools are open. else if (typeof console !== 'undefined' && console !== null) { console.log('ScrollReveal is not supported in this browser.'); } return sr } /** * Check if client supports CSS Transform and CSS Transition. * @return {boolean} */ ScrollReveal.prototype.isSupported = function() { var style = document.documentElement.style; return 'WebkitTransition' in style && 'WebkitTransform' in style || 'transition' in style && 'transform' in style }; /** * Creates a reveal set, a group of elements that will animate when they * become visible. If [interval] is provided, a new sequence is created * that will ensure elements reveal in the order they appear in the DOM. * * @param {string|Node} [selector] The element (node) or elements (selector) to animate. * @param {Object} [config] Override the defaults for this reveal set. * @param {number} [interval] Time between sequenced element animations (milliseconds). * @param {boolean} [sync] Used internally when updating reveals for async content. * * @return {Object} The current ScrollReveal instance. */ ScrollReveal.prototype.reveal = function(selector, config, interval, sync) { var container, elements, elem, elemId, sequence, sequenceId; // Resolve container. if (config && config.container) { container = _resolveContainer(config); } else { container = sr.defaults.container; } // Let’s check to see if a DOM node was passed in as the first argument, // otherwise query the container for all elements matching the selector. if (sr.tools.isNode(selector)) { elements = [selector]; } else { elements = Array.prototype.slice.call(container.querySelectorAll(selector)); } if (!elements.length) { console.log('ScrollReveal: reveal on "'+ selector + '" failed, no elements found.'); return sr } // No custom configuration was passed, but a sequence interval instead. // let’s shuffle things around to make sure everything works. if (config && typeof config == 'number') { interval = config; config = {}; } // Prepare a new sequence if an interval is passed. if (interval && typeof interval == 'number') { sequenceId = _nextUid(); sequence = sr.sequences[sequenceId] = { id : sequenceId, interval : interval, elemIds : [], active : false } } // Begin main loop to configure ScrollReveal elements. for (var i = 0; i < elements.length; i++) { // Check if the element has already been configured and grab it from the store. elemId = elements[i].getAttribute('data-sr-id'); if (elemId) { elem = sr.store.elements[elemId]; } // Otherwise, let’s do some basic setup. else { elem = { id : _nextUid(), domEl : elements[i], seen : false, revealing : false }; elem.domEl.setAttribute('data-sr-id', elem.id); } // Sequence only setup if (sequence) { elem.sequence = { id : sequence.id, index : sequence.elemIds.length }; sequence.elemIds.push(elem.id); } // New or existing element, it’s time to update its configuration, styles, // and send the updates to our store. _configure(elem, config || {}); _style(elem); _updateStore(elem); // We need to make sure elements are set to visibility: visible, even when // on mobile and `config.mobile == false`, or if unsupported. if (sr.tools.isMobile() && !elem.config.mobile || !sr.isSupported()) { elem.domEl.setAttribute('style', elem.styles.inline); elem.disabled = true; } // Otherwise, proceed normally. else if (!elem.revealing) { elem.domEl.setAttribute('style', elem.styles.inline + elem.styles.transform.initial ); } } // Each `reveal()` is recorded so that when calling `sync()` while working // with asynchronously loaded content, it can re-trace your steps but with // all your new elements now in the DOM. // Since `reveal()` is called internally by `sync()`, we don’t want to // record or intiialize each reveal during syncing. if (!sync && sr.isSupported()) { _record(selector, config); // We push initialization to the event queue using setTimeout, so that we can // give ScrollReveal room to process all reveal calls before putting things into motion. // -- // Philip Roberts - What the heck is the event loop anyway? (JSConf EU 2014) // https://www.youtube.com/watch?v=8aGhZQkoFbQ if (sr.initTimeout) { window.clearTimeout(sr.initTimeout); } sr.initTimeout = window.setTimeout(_init, 0); } return sr }; /** * Re-runs `reveal()` for each record stored in history, effectively capturing * any content loaded asynchronously that matches existing reveal set selectors. * * @return {Object} The current ScrollReveal instance. */ ScrollReveal.prototype.sync = function() { if (sr.history.length && sr.isSupported()) { for (var i = 0; i < sr.history.length; i++) { var record = sr.history[i]; sr.reveal(record.selector, record.config, record.interval, true); }; _init(); } else { console.log('ScrollReveal: sync failed, no reveals found.'); } return sr }; /** * Private Methods * --------------- * These methods remain accessible only to the ScrollReveal instance, even * though they only "exist" during instantiation outside of the constructors scope. * -- * http://stackoverflow.com/questions/111102/how-do-javascript-closures-work */ function _resolveContainer(config) { var container = config.container; // Check if our container is defined by a selector. if (container && typeof container == 'string') { return config.container = window.document.querySelector(container); } // Check if our container is defined by a node. else if (container && !sr.tools.isNode(container)) { console.log('ScrollReveal: Invalid container provided, using instead.'); config.container = null; } // Otherwise use by default. if (container == null) { config.container = window.document.documentElement; } return config.container } /** * A consistent way of creating unique IDs. * @returns {number} */ function _nextUid() { return ++sr.uid; } function _configure(elem, config) { // If the element hasn’t already been configured, let’s use a clone of the // defaults extended by the configuration passed as the second argument. if (!elem.config) { elem.config = sr.tools.extendClone(sr.defaults, config); } // Otherwise, let’s use a clone of the existing element configuration extended // by the configuration passed as the second argument. else { elem.config = sr.tools.extendClone(elem.config, config); } // Infer CSS Transform axis from origin string. if (elem.config.origin === 'top' || elem.config.origin === 'bottom') { elem.config.axis = 'Y'; } else { elem.config.axis = 'X'; } // Let’s make sure our our pixel distances are negative for top and left. // e.g. config.origin = 'top' and config.distance = '25px' starts at `top: -25px` in CSS. if (elem.config.origin === 'top' || elem.config.origin === 'left') { elem.config.distance = '-' + elem.config.distance; } } function _style(elem) { var computed = window.getComputedStyle(elem.domEl); if (!elem.styles) { elem.styles = { transition : {}, transform : {}, computed : {} }; // Capture any existing inline styles, and add our visibility override. // -- // See section 4.2. in the Documentation: // https://github.com/jlmakes/scrollreveal.js#42-improve-user-experience elem.styles.inline = elem.domEl.getAttribute('style') || ''; elem.styles.inline += '; visibility: visible; '; // grab the elements existing opacity. elem.styles.computed.opacity = computed.opacity; // grab the elements existing transitions. if (!computed.transition || computed.transition == 'all 0s ease 0s') { elem.styles.computed.transition = ''; } else { elem.styles.computed.transition = computed.transition + ', '; } } // Create transition styles elem.styles.transition.instant = _generateTransition(elem, 0); elem.styles.transition.delayed = _generateTransition(elem, elem.config.delay); // Generate transform styles, first with the webkit prefix. elem.styles.transform.initial = ' -webkit-transform:'; elem.styles.transform.target = ' -webkit-transform:'; _generateTransform(elem); // And again without any prefix. elem.styles.transform.initial += 'transform:'; elem.styles.transform.target += 'transform:'; _generateTransform(elem); } function _generateTransition(elem, delay) { var config = elem.config; return '-webkit-transition: ' + elem.styles.computed.transition + '-webkit-transform ' + config.duration / 1000 + 's ' + config.easing + ' ' + delay / 1000 + 's, opacity ' + config.duration / 1000 + 's ' + config.easing + ' ' + delay / 1000 + 's; ' + 'transition: ' + elem.styles.computed.transition + 'transform ' + config.duration / 1000 + 's ' + config.easing + ' ' + delay / 1000 + 's, opacity ' + config.duration / 1000 + 's ' + config.easing + ' ' + delay / 1000 + 's; ' } function _generateTransform(elem) { var config = elem.config; var transform = elem.styles.transform; if (parseInt(config.distance)) { transform.initial += ' translate' + config.axis + '(' + config.distance + ')'; transform.target += ' translate' + config.axis + '(0)'; } if (config.scale) { transform.initial += ' scale(' + config.scale + ')'; transform.target += ' scale(1)'; } if (config.rotate.x) { transform.initial += ' rotateX(' + config.rotate.x + 'deg)'; transform.target += ' rotateX(0)'; } if (config.rotate.y) { transform.initial += ' rotateY(' + config.rotate.y + 'deg)'; transform.target += ' rotateY(0)'; } if (config.rotate.z) { transform.initial += ' rotateZ(' + config.rotate.z + 'deg)'; transform.target += ' rotateZ(0)'; } transform.initial += '; opacity: ' + config.opacity + ';'; transform.target += '; opacity: ' + elem.styles.computed.opacity + ';'; } function _updateStore(elem) { var container = elem.config.container; // If this element’s container isn’t already in the store, let’s add it. if (container && sr.store.containers.indexOf(container) == -1) { sr.store.containers.push(elem.config.container); } // Update the element stored with our new element. sr.store.elements[elem.id] = elem; }; function _record(selector, config, interval) { // Save the `reveal()` arguments that triggered this `_record()` call, so we // can re-trace our steps when calling the `sync()` method. var record = { selector : selector, config : config, interval : interval }; sr.history.push(record); } function _init() { if (sr.isSupported()) { // Initial animate call triggers valid reveal animations on first load. // Subsequent animate calls are made inside the event handler. _animate(); // Then we loop through all container nodes in the store and bind event // listeners to each. for (var i = 0; i < sr.store.containers.length; i++) { sr.store.containers[i].addEventListener('scroll', _handler); sr.store.containers[i].addEventListener('resize', _handler); } // Let’s also do a one-time binding of window event listeners. if (!sr.initialized) { window.addEventListener('scroll', _handler); window.addEventListener('resize', _handler); sr.initialized = true; } } return sr } function _handler() { _requestAnimationFrame(_animate); } function _setActiveSequences() { var active, elem, elemId, sequence; // Loop through all sequences sr.tools.forOwn(sr.sequences, function(sequenceId) { sequence = sr.sequences[sequenceId]; active = false; // For each sequenced elemenet, let’s check visibility and if // any are visible, set it’s sequence to active. for (var i = 0; i < sequence.elemIds.length; i++) { elemId = sequence.elemIds[i] elem = sr.store.elements[elemId]; if (_isElemVisible(elem) && !active) { active = true; } } sequence.active = active; }); } function _animate() { var delayed, elem; _setActiveSequences(); // Loop through all elements in the store sr.tools.forOwn(sr.store.elements, function(elemId) { elem = sr.store.elements[elemId]; delayed = _shouldUseDelay(elem); // Let’s see if we should reveal, and if so, whether to use delay. if (_shouldReveal(elem)) { if (delayed) { elem.domEl.setAttribute('style', elem.styles.inline + elem.styles.transform.target + elem.styles.transition.delayed ); } else { elem.domEl.setAttribute('style', elem.styles.inline + elem.styles.transform.target + elem.styles.transition.instant ); } // Let’s queue the `afterReveal` callback and tag the element. _queueCallback('reveal', elem, delayed); elem.revealing = true; elem.seen = true; if (elem.sequence) { _queueNextInSequence(elem, delayed); } } // If we got this far our element shouldn’t reveal, but should it reset? else if (_shouldReset(elem)) { elem.domEl.setAttribute('style', elem.styles.inline + elem.styles.transform.initial + elem.styles.transition.instant ); _queueCallback('reset', elem); elem.revealing = false; } }); } /** * Sequence callback that triggers the next element. */ function _queueNextInSequence(elem, delayed) { var elapsed = 0, delay = 0, sequence = sr.sequences[elem.sequence.id]; // We’re processing a sequenced element, so let's block other elements in this sequence. sequence.blocked = true; // Since we’re triggering animations a part of a sequence after animations on first load, // we need to check for that condition and explicitly add the delay to our timer. if (delayed && elem.config.useDelay == 'onload') { delay = elem.config.delay; } // If a sequence timer is already running, capture the elapsed time and clear it. if (elem.sequence.timer) { elapsed = Math.abs(elem.sequence.timer.started - new Date()); window.clearTimeout(elem.sequence.timer); } // Start a new timer. elem.sequence.timer = { started: new Date() }; elem.sequence.timer.clock = window.setTimeout(function() { // Sequence interval has passed, so unblock the sequence and re-run the handler. sequence.blocked = false; elem.sequence.timer = null; _handler(); }, Math.abs(sequence.interval) + delay - elapsed); } function _queueCallback(type, elem, delayed) { var elapsed = 0, duration = 0, callback = 'after'; // Check which callback we’re working with. switch (type) { case 'reveal': duration = elem.config.duration; if (delayed) { duration += elem.config.delay; } callback += 'Reveal'; break case 'reset': duration = elem.config.duration; callback += 'Reset'; break } // If a timer is already running, capture the elapsed time and clear it. if (elem.timer) { elapsed = Math.abs(elem.timer.started - new Date()); window.clearTimeout(elem.timer.clock); } // Start a new timer. elem.timer = { started: new Date() }; elem.timer.clock = window.setTimeout(function() { // The timer completed, so let’s fire the callback and null the timer. elem.config[callback](elem.domEl); elem.timer = null; }, duration - elapsed); } function _shouldReveal(elem) { if (elem.sequence) { var sequence = sr.sequences[elem.sequence.id]; return sequence.active && !sequence.blocked && !elem.revealing && !elem.disabled } return _isElemVisible(elem) && !elem.revealing && !elem.disabled } function _shouldUseDelay(elem) { var config = elem.config.useDelay; return config === 'always' || (config === 'onload' && !sr.initialized) || (config === 'once' && !elem.seen) } function _shouldReset(elem) { if (elem.sequence) { var sequence = sr.sequences[elem.sequence.id]; return !sequence.active && elem.config.reset && elem.revealing && !elem.disabled } return !_isElemVisible(elem) && elem.config.reset && elem.revealing && !elem.disabled } function _getContainer(container) { return { width : container.clientWidth, height : container.clientHeight } } function _getScrolled(container) { // Return the container scroll values, plus the its offset. if (container && container !== window.document.documentElement) { var offset = _getOffset(container); return { x : container.scrollLeft + offset.left, y : container.scrollTop + offset.top } } // Otherwise, default to the window object’s scroll values. else { return { x : window.pageXOffset, y : window.pageYOffset } } } function _getOffset(domEl) { var offsetTop = 0, offsetLeft = 0, // Grab the element’s dimensions. offsetHeight = domEl.offsetHeight, offsetWidth = domEl.offsetWidth; // Now calculate the distance between the element and its parent, then // again for the parent to its parent, and again etc... until we have the // total distance of the element to the document’s top and left origin. do { if (!isNaN(domEl.offsetTop)) { offsetTop += domEl.offsetTop; } if (!isNaN(domEl.offsetLeft)) { offsetLeft += domEl.offsetLeft; } } while (domEl = domEl.offsetParent); return { top : offsetTop, left : offsetLeft, height : offsetHeight, width : offsetWidth } } function _isElemVisible(elem) { var offset = _getOffset(elem.domEl), container = _getContainer(elem.config.container), scrolled = _getScrolled(elem.config.container), vF = elem.config.viewFactor, // Define the element geometry. elemHeight = offset.height, elemWidth = offset.width, elemTop = offset.top, elemLeft = offset.left, elemBottom = elemTop + elemHeight, elemRight = elemLeft + elemWidth; return confirmBounds() || isPositionFixed() function confirmBounds() { var // Define the element’s functional boundaries using its view factor. top = elemTop + elemHeight * vF, left = elemLeft + elemWidth * vF, bottom = elemBottom - elemHeight * vF, right = elemRight - elemWidth * vF, // Define the container functional boundaries using its view offset. viewTop = scrolled.y + elem.config.viewOffset.top, viewLeft = scrolled.x + elem.config.viewOffset.left, viewBottom = scrolled.y - elem.config.viewOffset.bottom + container.height, viewRight = scrolled.x - elem.config.viewOffset.right + container.width; return top < viewBottom && bottom > viewTop && left > viewLeft && right < viewRight } function isPositionFixed() { return (window.getComputedStyle(elem.domEl).position === 'fixed') } } return ScrollReveal })(); /** * helper.tools.js * --------------- * Simple deep object extend, and a few other agnostic helper methods. * gist: https://gist.github.com/jlmakes/9f104e3f1b4d86334987 */ Tools = (function() { Tools.prototype.isObject = function(object) { return object !== null && typeof object === 'object' && object.constructor == Object }; Tools.prototype.isNode = function(object) { return typeof Node === 'object' ? object instanceof Node : object && typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string' }; Tools.prototype.forOwn = function(object, callback) { if (!this.isObject(object)) { throw new TypeError('Expected "object", but received "' + typeof object + '".'); } else { for (var property in object) { if (object.hasOwnProperty(property)) { callback(property); } } } }; Tools.prototype.extend = function(target, source) { this.forOwn(source, function(property) { if (this.isObject(source[property])) { if (!target[property] || !this.isObject(target[property])) { target[property] = {}; } this.extend(target[property], source[property]); } else { target[property] = source[property]; } }.bind(this)); return target }; Tools.prototype.extendClone = function(target, source) { return this.extend(this.extend({}, target), source) }; Tools.prototype.isMobile = function() { return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) }; function Tools() {}; return Tools })(); _requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame; }).call(this); return this.ScrollReveal; })); /*! Magnific Popup - v1.1.0 - 2016-02-20 * http://dimsemenov.com/plugins/magnific-popup/ * Copyright (c) 2016 Dmitry Semenov; */ ;(function (factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); } else if (typeof exports === 'object') { // Node/CommonJS factory(require('jquery')); } else { // Browser globals factory(window.jQuery || window.Zepto); } }(function($) { /*>>core*/ /** * * Magnific Popup Core JS file * */ /** * Private static constants */ var CLOSE_EVENT = 'Close', BEFORE_CLOSE_EVENT = 'BeforeClose', AFTER_CLOSE_EVENT = 'AfterClose', BEFORE_APPEND_EVENT = 'BeforeAppend', MARKUP_PARSE_EVENT = 'MarkupParse', OPEN_EVENT = 'Open', CHANGE_EVENT = 'Change', NS = 'mfp', EVENT_NS = '.' + NS, READY_CLASS = 'mfp-ready', REMOVING_CLASS = 'mfp-removing', PREVENT_CLOSE_CLASS = 'mfp-prevent-close'; /** * Private vars */ /*jshint -W079 */ var mfp, // As we have only one instance of MagnificPopup object, we define it locally to not to use 'this' MagnificPopup = function(){}, _isJQ = !!(window.jQuery), _prevStatus, _window = $(window), _document, _prevContentType, _wrapClasses, _currPopupType; /** * Private functions */ var _mfpOn = function(name, f) { mfp.ev.on(NS + name + EVENT_NS, f); }, _getEl = function(className, appendTo, html, raw) { var el = document.createElement('div'); el.className = 'mfp-'+className; if(html) { el.innerHTML = html; } if(!raw) { el = $(el); if(appendTo) { el.appendTo(appendTo); } } else if(appendTo) { appendTo.appendChild(el); } return el; }, _mfpTrigger = function(e, data) { mfp.ev.triggerHandler(NS + e, data); if(mfp.st.callbacks) { // converts "mfpEventName" to "eventName" callback and triggers it if it's present e = e.charAt(0).toLowerCase() + e.slice(1); if(mfp.st.callbacks[e]) { mfp.st.callbacks[e].apply(mfp, $.isArray(data) ? data : [data]); } } }, _getCloseBtn = function(type) { if(type !== _currPopupType || !mfp.currTemplate.closeBtn) { mfp.currTemplate.closeBtn = $( mfp.st.closeMarkup.replace('%title%', mfp.st.tClose ) ); _currPopupType = type; } return mfp.currTemplate.closeBtn; }, // Initialize Magnific Popup only when called at least once _checkInstance = function() { if(!$.magnificPopup.instance) { /*jshint -W020 */ mfp = new MagnificPopup(); mfp.init(); $.magnificPopup.instance = mfp; } }, // CSS transition detection, http://stackoverflow.com/questions/7264899/detect-css-transitions-using-javascript-and-without-modernizr supportsTransitions = function() { var s = document.createElement('p').style, // 's' for style. better to create an element if body yet to exist v = ['ms','O','Moz','Webkit']; // 'v' for vendor if( s['transition'] !== undefined ) { return true; } while( v.length ) { if( v.pop() + 'Transition' in s ) { return true; } } return false; }; /** * Public functions */ MagnificPopup.prototype = { constructor: MagnificPopup, /** * Initializes Magnific Popup plugin. * This function is triggered only once when $.fn.magnificPopup or $.magnificPopup is executed */ init: function() { var appVersion = navigator.appVersion; mfp.isLowIE = mfp.isIE8 = document.all && !document.addEventListener; mfp.isAndroid = (/android/gi).test(appVersion); mfp.isIOS = (/iphone|ipad|ipod/gi).test(appVersion); mfp.supportsTransition = supportsTransitions(); // We disable fixed positioned lightbox on devices that don't handle it nicely. // If you know a better way of detecting this - let me know. mfp.probablyMobile = (mfp.isAndroid || mfp.isIOS || /(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent) ); _document = $(document); mfp.popupsCache = {}; }, /** * Opens popup * @param data [description] */ open: function(data) { var i; if(data.isObj === false) { // convert jQuery collection to array to avoid conflicts later mfp.items = data.items.toArray(); mfp.index = 0; var items = data.items, item; for(i = 0; i < items.length; i++) { item = items[i]; if(item.parsed) { item = item.el[0]; } if(item === data.el[0]) { mfp.index = i; break; } } } else { mfp.items = $.isArray(data.items) ? data.items : [data.items]; mfp.index = data.index || 0; } // if popup is already opened - we just update the content if(mfp.isOpen) { mfp.updateItemHTML(); return; } mfp.types = []; _wrapClasses = ''; if(data.mainEl && data.mainEl.length) { mfp.ev = data.mainEl.eq(0); } else { mfp.ev = _document; } if(data.key) { if(!mfp.popupsCache[data.key]) { mfp.popupsCache[data.key] = {}; } mfp.currTemplate = mfp.popupsCache[data.key]; } else { mfp.currTemplate = {}; } mfp.st = $.extend(true, {}, $.magnificPopup.defaults, data ); mfp.fixedContentPos = mfp.st.fixedContentPos === 'auto' ? !mfp.probablyMobile : mfp.st.fixedContentPos; if(mfp.st.modal) { mfp.st.closeOnContentClick = false; mfp.st.closeOnBgClick = false; mfp.st.showCloseBtn = false; mfp.st.enableEscapeKey = false; } // Building markup // main containers are created only once if(!mfp.bgOverlay) { // Dark overlay mfp.bgOverlay = _getEl('bg').on('click'+EVENT_NS, function() { mfp.close(); }); mfp.wrap = _getEl('wrap').attr('tabindex', -1).on('click'+EVENT_NS, function(e) { if(mfp._checkIfClose(e.target)) { mfp.close(); } }); mfp.container = _getEl('container', mfp.wrap); } mfp.contentContainer = _getEl('content'); if(mfp.st.preloader) { mfp.preloader = _getEl('preloader', mfp.container, mfp.st.tLoading); } // Initializing modules var modules = $.magnificPopup.modules; for(i = 0; i < modules.length; i++) { var n = modules[i]; n = n.charAt(0).toUpperCase() + n.slice(1); mfp['init'+n].call(mfp); } _mfpTrigger('BeforeOpen'); if(mfp.st.showCloseBtn) { // Close button if(!mfp.st.closeBtnInside) { mfp.wrap.append( _getCloseBtn() ); } else { _mfpOn(MARKUP_PARSE_EVENT, function(e, template, values, item) { values.close_replaceWith = _getCloseBtn(item.type); }); _wrapClasses += ' mfp-close-btn-in'; } } if(mfp.st.alignTop) { _wrapClasses += ' mfp-align-top'; } if(mfp.fixedContentPos) { mfp.wrap.css({ overflow: mfp.st.overflowY, overflowX: 'hidden', overflowY: mfp.st.overflowY }); } else { mfp.wrap.css({ top: _window.scrollTop(), position: 'absolute' }); } if( mfp.st.fixedBgPos === false || (mfp.st.fixedBgPos === 'auto' && !mfp.fixedContentPos) ) { mfp.bgOverlay.css({ height: _document.height(), position: 'absolute' }); } if(mfp.st.enableEscapeKey) { // Close on ESC key _document.on('keyup' + EVENT_NS, function(e) { if(e.keyCode === 27) { mfp.close(); } }); } _window.on('resize' + EVENT_NS, function() { mfp.updateSize(); }); if(!mfp.st.closeOnContentClick) { _wrapClasses += ' mfp-auto-cursor'; } if(_wrapClasses) mfp.wrap.addClass(_wrapClasses); // this triggers recalculation of layout, so we get it once to not to trigger twice var windowHeight = mfp.wH = _window.height(); var windowStyles = {}; if( mfp.fixedContentPos ) { if(mfp._hasScrollBar(windowHeight)){ var s = mfp._getScrollbarSize(); if(s) { windowStyles.marginRight = s; } } } if(mfp.fixedContentPos) { if(!mfp.isIE7) { windowStyles.overflow = 'hidden'; } else { // ie7 double-scroll bug $('body, html').css('overflow', 'hidden'); } } var classesToadd = mfp.st.mainClass; if(mfp.isIE7) { classesToadd += ' mfp-ie7'; } if(classesToadd) { mfp._addClassToMFP( classesToadd ); } // add content mfp.updateItemHTML(); _mfpTrigger('BuildControls'); // remove scrollbar, add margin e.t.c $('html').css(windowStyles); // add everything to DOM mfp.bgOverlay.add(mfp.wrap).prependTo( mfp.st.prependTo || $(document.body) ); // Save last focused element mfp._lastFocusedEl = document.activeElement; // Wait for next cycle to allow CSS transition setTimeout(function() { if(mfp.content) { mfp._addClassToMFP(READY_CLASS); mfp._setFocus(); } else { // if content is not defined (not loaded e.t.c) we add class only for BG mfp.bgOverlay.addClass(READY_CLASS); } // Trap the focus in popup _document.on('focusin' + EVENT_NS, mfp._onFocusIn); }, 16); mfp.isOpen = true; mfp.updateSize(windowHeight); _mfpTrigger(OPEN_EVENT); return data; }, /** * Closes the popup */ close: function() { if(!mfp.isOpen) return; _mfpTrigger(BEFORE_CLOSE_EVENT); mfp.isOpen = false; // for CSS3 animation if(mfp.st.removalDelay && !mfp.isLowIE && mfp.supportsTransition ) { mfp._addClassToMFP(REMOVING_CLASS); setTimeout(function() { mfp._close(); }, mfp.st.removalDelay); } else { mfp._close(); } }, /** * Helper for close() function */ _close: function() { _mfpTrigger(CLOSE_EVENT); var classesToRemove = REMOVING_CLASS + ' ' + READY_CLASS + ' '; mfp.bgOverlay.detach(); mfp.wrap.detach(); mfp.container.empty(); if(mfp.st.mainClass) { classesToRemove += mfp.st.mainClass + ' '; } mfp._removeClassFromMFP(classesToRemove); if(mfp.fixedContentPos) { var windowStyles = {marginRight: ''}; if(mfp.isIE7) { $('body, html').css('overflow', ''); } else { windowStyles.overflow = ''; } $('html').css(windowStyles); } _document.off('keyup' + EVENT_NS + ' focusin' + EVENT_NS); mfp.ev.off(EVENT_NS); // clean up DOM elements that aren't removed mfp.wrap.attr('class', 'mfp-wrap').removeAttr('style'); mfp.bgOverlay.attr('class', 'mfp-bg'); mfp.container.attr('class', 'mfp-container'); // remove close button from target element if(mfp.st.showCloseBtn && (!mfp.st.closeBtnInside || mfp.currTemplate[mfp.currItem.type] === true)) { if(mfp.currTemplate.closeBtn) mfp.currTemplate.closeBtn.detach(); } if(mfp.st.autoFocusLast && mfp._lastFocusedEl) { $(mfp._lastFocusedEl).focus(); // put tab focus back } mfp.currItem = null; mfp.content = null; mfp.currTemplate = null; mfp.prevHeight = 0; _mfpTrigger(AFTER_CLOSE_EVENT); }, updateSize: function(winHeight) { if(mfp.isIOS) { // fixes iOS nav bars https://github.com/dimsemenov/Magnific-Popup/issues/2 var zoomLevel = document.documentElement.clientWidth / window.innerWidth; var height = window.innerHeight * zoomLevel; mfp.wrap.css('height', height); mfp.wH = height; } else { mfp.wH = winHeight || _window.height(); } // Fixes #84: popup incorrectly positioned with position:relative on body if(!mfp.fixedContentPos) { mfp.wrap.css('height', mfp.wH); } _mfpTrigger('Resize'); }, /** * Set content of popup based on current index */ updateItemHTML: function() { var item = mfp.items[mfp.index]; // Detach and perform modifications mfp.contentContainer.detach(); if(mfp.content) mfp.content.detach(); if(!item.parsed) { item = mfp.parseEl( mfp.index ); } var type = item.type; _mfpTrigger('BeforeChange', [mfp.currItem ? mfp.currItem.type : '', type]); // BeforeChange event works like so: // _mfpOn('BeforeChange', function(e, prevType, newType) { }); mfp.currItem = item; if(!mfp.currTemplate[type]) { var markup = mfp.st[type] ? mfp.st[type].markup : false; // allows to modify markup _mfpTrigger('FirstMarkupParse', markup); if(markup) { mfp.currTemplate[type] = $(markup); } else { // if there is no markup found we just define that template is parsed mfp.currTemplate[type] = true; } } if(_prevContentType && _prevContentType !== item.type) { mfp.container.removeClass('mfp-'+_prevContentType+'-holder'); } var newContent = mfp['get' + type.charAt(0).toUpperCase() + type.slice(1)](item, mfp.currTemplate[type]); mfp.appendContent(newContent, type); item.preloaded = true; _mfpTrigger(CHANGE_EVENT, item); _prevContentType = item.type; // Append container back after its content changed mfp.container.prepend(mfp.contentContainer); _mfpTrigger('AfterChange'); }, /** * Set HTML content of popup */ appendContent: function(newContent, type) { mfp.content = newContent; if(newContent) { if(mfp.st.showCloseBtn && mfp.st.closeBtnInside && mfp.currTemplate[type] === true) { // if there is no markup, we just append close button element inside if(!mfp.content.find('.mfp-close').length) { mfp.content.append(_getCloseBtn()); } } else { mfp.content = newContent; } } else { mfp.content = ''; } _mfpTrigger(BEFORE_APPEND_EVENT); mfp.container.addClass('mfp-'+type+'-holder'); mfp.contentContainer.append(mfp.content); }, /** * Creates Magnific Popup data object based on given data * @param {int} index Index of item to parse */ parseEl: function(index) { var item = mfp.items[index], type; if(item.tagName) { item = { el: $(item) }; } else { type = item.type; item = { data: item, src: item.src }; } if(item.el) { var types = mfp.types; // check for 'mfp-TYPE' class for(var i = 0; i < types.length; i++) { if( item.el.hasClass('mfp-'+types[i]) ) { type = types[i]; break; } } item.src = item.el.attr('data-mfp-src'); if(!item.src) { item.src = item.el.attr('href'); } } item.type = type || mfp.st.type || 'inline'; item.index = index; item.parsed = true; mfp.items[index] = item; _mfpTrigger('ElementParse', item); return mfp.items[index]; }, /** * Initializes single popup or a group of popups */ addGroup: function(el, options) { var eHandler = function(e) { e.mfpEl = this; mfp._openClick(e, el, options); }; if(!options) { options = {}; } var eName = 'click.magnificPopup'; options.mainEl = el; if(options.items) { options.isObj = true; el.off(eName).on(eName, eHandler); } else { options.isObj = false; if(options.delegate) { el.off(eName).on(eName, options.delegate , eHandler); } else { options.items = el; el.off(eName).on(eName, eHandler); } } }, _openClick: function(e, el, options) { var midClick = options.midClick !== undefined ? options.midClick : $.magnificPopup.defaults.midClick; if(!midClick && ( e.which === 2 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey ) ) { return; } var disableOn = options.disableOn !== undefined ? options.disableOn : $.magnificPopup.defaults.disableOn; if(disableOn) { if($.isFunction(disableOn)) { if( !disableOn.call(mfp) ) { return true; } } else { // else it's number if( _window.width() < disableOn ) { return true; } } } if(e.type) { e.preventDefault(); // This will prevent popup from closing if element is inside and popup is already opened if(mfp.isOpen) { e.stopPropagation(); } } options.el = $(e.mfpEl); if(options.delegate) { options.items = el.find(options.delegate); } mfp.open(options); }, /** * Updates text on preloader */ updateStatus: function(status, text) { if(mfp.preloader) { if(_prevStatus !== status) { mfp.container.removeClass('mfp-s-'+_prevStatus); } if(!text && status === 'loading') { text = mfp.st.tLoading; } var data = { status: status, text: text }; // allows to modify status _mfpTrigger('UpdateStatus', data); status = data.status; text = data.text; mfp.preloader.html(text); mfp.preloader.find('a').on('click', function(e) { e.stopImmediatePropagation(); }); mfp.container.addClass('mfp-s-'+status); _prevStatus = status; } }, /* "Private" helpers that aren't private at all */ // Check to close popup or not // "target" is an element that was clicked _checkIfClose: function(target) { if($(target).hasClass(PREVENT_CLOSE_CLASS)) { return; } var closeOnContent = mfp.st.closeOnContentClick; var closeOnBg = mfp.st.closeOnBgClick; if(closeOnContent && closeOnBg) { return true; } else { // We close the popup if click is on close button or on preloader. Or if there is no content. if(!mfp.content || $(target).hasClass('mfp-close') || (mfp.preloader && target === mfp.preloader[0]) ) { return true; } // if click is outside the content if( (target !== mfp.content[0] && !$.contains(mfp.content[0], target)) ) { if(closeOnBg) { // last check, if the clicked element is in DOM, (in case it's removed onclick) if( $.contains(document, target) ) { return true; } } } else if(closeOnContent) { return true; } } return false; }, _addClassToMFP: function(cName) { mfp.bgOverlay.addClass(cName); mfp.wrap.addClass(cName); }, _removeClassFromMFP: function(cName) { this.bgOverlay.removeClass(cName); mfp.wrap.removeClass(cName); }, _hasScrollBar: function(winHeight) { return ( (mfp.isIE7 ? _document.height() : document.body.scrollHeight) > (winHeight || _window.height()) ); }, _setFocus: function() { (mfp.st.focus ? mfp.content.find(mfp.st.focus).eq(0) : mfp.wrap).focus(); }, _onFocusIn: function(e) { if( e.target !== mfp.wrap[0] && !$.contains(mfp.wrap[0], e.target) ) { mfp._setFocus(); return false; } }, _parseMarkup: function(template, values, item) { var arr; if(item.data) { values = $.extend(item.data, values); } _mfpTrigger(MARKUP_PARSE_EVENT, [template, values, item] ); $.each(values, function(key, value) { if(value === undefined || value === false) { return true; } arr = key.split('_'); if(arr.length > 1) { var el = template.find(EVENT_NS + '-'+arr[0]); if(el.length > 0) { var attr = arr[1]; if(attr === 'replaceWith') { if(el[0] !== value[0]) { el.replaceWith(value); } } else if(attr === 'img') { if(el.is('img')) { el.attr('src', value); } else { el.replaceWith( $('').attr('src', value).attr('class', el.attr('class')) ); } } else { el.attr(arr[1], value); } } } else { template.find(EVENT_NS + '-'+key).html(value); } }); }, _getScrollbarSize: function() { // thx David if(mfp.scrollbarSize === undefined) { var scrollDiv = document.createElement("div"); scrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;'; document.body.appendChild(scrollDiv); mfp.scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth; document.body.removeChild(scrollDiv); } return mfp.scrollbarSize; } }; /* MagnificPopup core prototype end */ /** * Public static functions */ $.magnificPopup = { instance: null, proto: MagnificPopup.prototype, modules: [], open: function(options, index) { _checkInstance(); if(!options) { options = {}; } else { options = $.extend(true, {}, options); } options.isObj = true; options.index = index || 0; return this.instance.open(options); }, close: function() { return $.magnificPopup.instance && $.magnificPopup.instance.close(); }, registerModule: function(name, module) { if(module.options) { $.magnificPopup.defaults[name] = module.options; } $.extend(this.proto, module.proto); this.modules.push(name); }, defaults: { // Info about options is in docs: // http://dimsemenov.com/plugins/magnific-popup/documentation.html#options disableOn: 0, key: null, midClick: false, mainClass: '', preloader: true, focus: '', // CSS selector of input to focus after popup is opened closeOnContentClick: false, closeOnBgClick: true, closeBtnInside: true, showCloseBtn: true, enableEscapeKey: true, modal: false, alignTop: false, removalDelay: 0, prependTo: null, fixedContentPos: 'auto', fixedBgPos: 'auto', overflowY: 'auto', closeMarkup: '', tClose: 'Close (Esc)', tLoading: 'Loading...', autoFocusLast: true } }; $.fn.magnificPopup = function(options) { _checkInstance(); var jqEl = $(this); // We call some API method of first param is a string if (typeof options === "string" ) { if(options === 'open') { var items, itemOpts = _isJQ ? jqEl.data('magnificPopup') : jqEl[0].magnificPopup, index = parseInt(arguments[1], 10) || 0; if(itemOpts.items) { items = itemOpts.items[index]; } else { items = jqEl; if(itemOpts.delegate) { items = items.find(itemOpts.delegate); } items = items.eq( index ); } mfp._openClick({mfpEl:items}, jqEl, itemOpts); } else { if(mfp.isOpen) mfp[options].apply(mfp, Array.prototype.slice.call(arguments, 1)); } } else { // clone options obj options = $.extend(true, {}, options); /* * As Zepto doesn't support .data() method for objects * and it works only in normal browsers * we assign "options" object directly to the DOM element. FTW! */ if(_isJQ) { jqEl.data('magnificPopup', options); } else { jqEl[0].magnificPopup = options; } mfp.addGroup(jqEl, options); } return jqEl; }; /*>>core*/ /*>>inline*/ var INLINE_NS = 'inline', _hiddenClass, _inlinePlaceholder, _lastInlineElement, _putInlineElementsBack = function() { if(_lastInlineElement) { _inlinePlaceholder.after( _lastInlineElement.addClass(_hiddenClass) ).detach(); _lastInlineElement = null; } }; $.magnificPopup.registerModule(INLINE_NS, { options: { hiddenClass: 'hide', // will be appended with `mfp-` prefix markup: '', tNotFound: 'Content not found' }, proto: { initInline: function() { mfp.types.push(INLINE_NS); _mfpOn(CLOSE_EVENT+'.'+INLINE_NS, function() { _putInlineElementsBack(); }); }, getInline: function(item, template) { _putInlineElementsBack(); if(item.src) { var inlineSt = mfp.st.inline, el = $(item.src); if(el.length) { // If target element has parent - we replace it with placeholder and put it back after popup is closed var parent = el[0].parentNode; if(parent && parent.tagName) { if(!_inlinePlaceholder) { _hiddenClass = inlineSt.hiddenClass; _inlinePlaceholder = _getEl(_hiddenClass); _hiddenClass = 'mfp-'+_hiddenClass; } // replace target inline element with placeholder _lastInlineElement = el.after(_inlinePlaceholder).detach().removeClass(_hiddenClass); } mfp.updateStatus('ready'); } else { mfp.updateStatus('error', inlineSt.tNotFound); el = $('
'); } item.inlineElement = el; return el; } mfp.updateStatus('ready'); mfp._parseMarkup(template, {}, item); return template; } } }); /*>>inline*/ /*>>ajax*/ var AJAX_NS = 'ajax', _ajaxCur, _removeAjaxCursor = function() { if(_ajaxCur) { $(document.body).removeClass(_ajaxCur); } }, _destroyAjaxRequest = function() { _removeAjaxCursor(); if(mfp.req) { mfp.req.abort(); } }; $.magnificPopup.registerModule(AJAX_NS, { options: { settings: null, cursor: 'mfp-ajax-cur', tError: 'The content could not be loaded.' }, proto: { initAjax: function() { mfp.types.push(AJAX_NS); _ajaxCur = mfp.st.ajax.cursor; _mfpOn(CLOSE_EVENT+'.'+AJAX_NS, _destroyAjaxRequest); _mfpOn('BeforeChange.' + AJAX_NS, _destroyAjaxRequest); }, getAjax: function(item) { if(_ajaxCur) { $(document.body).addClass(_ajaxCur); } mfp.updateStatus('loading'); var opts = $.extend({ url: item.src, success: function(data, textStatus, jqXHR) { var temp = { data:data, xhr:jqXHR }; _mfpTrigger('ParseAjax', temp); mfp.appendContent( $(temp.data), AJAX_NS ); item.finished = true; _removeAjaxCursor(); mfp._setFocus(); setTimeout(function() { mfp.wrap.addClass(READY_CLASS); }, 16); mfp.updateStatus('ready'); _mfpTrigger('AjaxContentAdded'); }, error: function() { _removeAjaxCursor(); item.finished = item.loadError = true; mfp.updateStatus('error', mfp.st.ajax.tError.replace('%url%', item.src)); } }, mfp.st.ajax.settings); mfp.req = $.ajax(opts); return ''; } } }); /*>>ajax*/ /*>>image*/ var _imgInterval, _getTitle = function(item) { if(item.data && item.data.title !== undefined) return item.data.title; var src = mfp.st.image.titleSrc; if(src) { if($.isFunction(src)) { return src.call(mfp, item); } else if(item.el) { return item.el.attr(src) || ''; } } return ''; }; $.magnificPopup.registerModule('image', { options: { markup: '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
', cursor: 'mfp-zoom-out-cur', titleSrc: 'title', verticalFit: true, tError: 'The image could not be loaded.' }, proto: { initImage: function() { var imgSt = mfp.st.image, ns = '.image'; mfp.types.push('image'); _mfpOn(OPEN_EVENT+ns, function() { if(mfp.currItem.type === 'image' && imgSt.cursor) { $(document.body).addClass(imgSt.cursor); } }); _mfpOn(CLOSE_EVENT+ns, function() { if(imgSt.cursor) { $(document.body).removeClass(imgSt.cursor); } _window.off('resize' + EVENT_NS); }); _mfpOn('Resize'+ns, mfp.resizeImage); if(mfp.isLowIE) { _mfpOn('AfterChange', mfp.resizeImage); } }, resizeImage: function() { var item = mfp.currItem; if(!item || !item.img) return; if(mfp.st.image.verticalFit) { var decr = 0; // fix box-sizing in ie7/8 if(mfp.isLowIE) { decr = parseInt(item.img.css('padding-top'), 10) + parseInt(item.img.css('padding-bottom'),10); } item.img.css('max-height', mfp.wH-decr); } }, _onImageHasSize: function(item) { if(item.img) { item.hasSize = true; if(_imgInterval) { clearInterval(_imgInterval); } item.isCheckingImgSize = false; _mfpTrigger('ImageHasSize', item); if(item.imgHidden) { if(mfp.content) mfp.content.removeClass('mfp-loading'); item.imgHidden = false; } } }, /** * Function that loops until the image has size to display elements that rely on it asap */ findImageSize: function(item) { var counter = 0, img = item.img[0], mfpSetInterval = function(delay) { if(_imgInterval) { clearInterval(_imgInterval); } // decelerating interval that checks for size of an image _imgInterval = setInterval(function() { if(img.naturalWidth > 0) { mfp._onImageHasSize(item); return; } if(counter > 200) { clearInterval(_imgInterval); } counter++; if(counter === 3) { mfpSetInterval(10); } else if(counter === 40) { mfpSetInterval(50); } else if(counter === 100) { mfpSetInterval(500); } }, delay); }; mfpSetInterval(1); }, getImage: function(item, template) { var guard = 0, // image load complete handler onLoadComplete = function() { if(item) { if (item.img[0].complete) { item.img.off('.mfploader'); if(item === mfp.currItem){ mfp._onImageHasSize(item); mfp.updateStatus('ready'); } item.hasSize = true; item.loaded = true; _mfpTrigger('ImageLoadComplete'); } else { // if image complete check fails 200 times (20 sec), we assume that there was an error. guard++; if(guard < 200) { setTimeout(onLoadComplete,100); } else { onLoadError(); } } } }, // image error handler onLoadError = function() { if(item) { item.img.off('.mfploader'); if(item === mfp.currItem){ mfp._onImageHasSize(item); mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) ); } item.hasSize = true; item.loaded = true; item.loadError = true; } }, imgSt = mfp.st.image; var el = template.find('.mfp-img'); if(el.length) { var img = document.createElement('img'); img.className = 'mfp-img'; if(item.el && item.el.find('img').length) { img.alt = item.el.find('img').attr('alt'); } item.img = $(img).on('load.mfploader', onLoadComplete).on('error.mfploader', onLoadError); img.src = item.src; // without clone() "error" event is not firing when IMG is replaced by new IMG // TODO: find a way to avoid such cloning if(el.is('img')) { item.img = item.img.clone(); } img = item.img[0]; if(img.naturalWidth > 0) { item.hasSize = true; } else if(!img.width) { item.hasSize = false; } } mfp._parseMarkup(template, { title: _getTitle(item), img_replaceWith: item.img }, item); mfp.resizeImage(); if(item.hasSize) { if(_imgInterval) clearInterval(_imgInterval); if(item.loadError) { template.addClass('mfp-loading'); mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) ); } else { template.removeClass('mfp-loading'); mfp.updateStatus('ready'); } return template; } mfp.updateStatus('loading'); item.loading = true; if(!item.hasSize) { item.imgHidden = true; template.addClass('mfp-loading'); mfp.findImageSize(item); } return template; } } }); /*>>image*/ /*>>zoom*/ var hasMozTransform, getHasMozTransform = function() { if(hasMozTransform === undefined) { hasMozTransform = document.createElement('p').style.MozTransform !== undefined; } return hasMozTransform; }; $.magnificPopup.registerModule('zoom', { options: { enabled: false, easing: 'ease-in-out', duration: 300, opener: function(element) { return element.is('img') ? element : element.find('img'); } }, proto: { initZoom: function() { var zoomSt = mfp.st.zoom, ns = '.zoom', image; if(!zoomSt.enabled || !mfp.supportsTransition) { return; } var duration = zoomSt.duration, getElToAnimate = function(image) { var newImg = image.clone().removeAttr('style').removeAttr('class').addClass('mfp-animated-image'), transition = 'all '+(zoomSt.duration/1000)+'s ' + zoomSt.easing, cssObj = { position: 'fixed', zIndex: 9999, left: 0, top: 0, '-webkit-backface-visibility': 'hidden' }, t = 'transition'; cssObj['-webkit-'+t] = cssObj['-moz-'+t] = cssObj['-o-'+t] = cssObj[t] = transition; newImg.css(cssObj); return newImg; }, showMainContent = function() { mfp.content.css('visibility', 'visible'); }, openTimeout, animatedImg; _mfpOn('BuildControls'+ns, function() { if(mfp._allowZoom()) { clearTimeout(openTimeout); mfp.content.css('visibility', 'hidden'); // Basically, all code below does is clones existing image, puts in on top of the current one and animated it image = mfp._getItemToZoom(); if(!image) { showMainContent(); return; } animatedImg = getElToAnimate(image); animatedImg.css( mfp._getOffset() ); mfp.wrap.append(animatedImg); openTimeout = setTimeout(function() { animatedImg.css( mfp._getOffset( true ) ); openTimeout = setTimeout(function() { showMainContent(); setTimeout(function() { animatedImg.remove(); image = animatedImg = null; _mfpTrigger('ZoomAnimationEnded'); }, 16); // avoid blink when switching images }, duration); // this timeout equals animation duration }, 16); // by adding this timeout we avoid short glitch at the beginning of animation // Lots of timeouts... } }); _mfpOn(BEFORE_CLOSE_EVENT+ns, function() { if(mfp._allowZoom()) { clearTimeout(openTimeout); mfp.st.removalDelay = duration; if(!image) { image = mfp._getItemToZoom(); if(!image) { return; } animatedImg = getElToAnimate(image); } animatedImg.css( mfp._getOffset(true) ); mfp.wrap.append(animatedImg); mfp.content.css('visibility', 'hidden'); setTimeout(function() { animatedImg.css( mfp._getOffset() ); }, 16); } }); _mfpOn(CLOSE_EVENT+ns, function() { if(mfp._allowZoom()) { showMainContent(); if(animatedImg) { animatedImg.remove(); } image = null; } }); }, _allowZoom: function() { return mfp.currItem.type === 'image'; }, _getItemToZoom: function() { if(mfp.currItem.hasSize) { return mfp.currItem.img; } else { return false; } }, // Get element postion relative to viewport _getOffset: function(isLarge) { var el; if(isLarge) { el = mfp.currItem.img; } else { el = mfp.st.zoom.opener(mfp.currItem.el || mfp.currItem); } var offset = el.offset(); var paddingTop = parseInt(el.css('padding-top'),10); var paddingBottom = parseInt(el.css('padding-bottom'),10); offset.top -= ( $(window).scrollTop() - paddingTop ); /* Animating left + top + width/height looks glitchy in Firefox, but perfect in Chrome. And vice-versa. */ var obj = { width: el.width(), // fix Zepto height+padding issue height: (_isJQ ? el.innerHeight() : el[0].offsetHeight) - paddingBottom - paddingTop }; // I hate to do this, but there is no another option if( getHasMozTransform() ) { obj['-moz-transform'] = obj['transform'] = 'translate(' + offset.left + 'px,' + offset.top + 'px)'; } else { obj.left = offset.left; obj.top = offset.top; } return obj; } } }); /*>>zoom*/ /*>>iframe*/ var IFRAME_NS = 'iframe', _emptyPage = '//about:blank', _fixIframeBugs = function(isShowing) { if(mfp.currTemplate[IFRAME_NS]) { var el = mfp.currTemplate[IFRAME_NS].find('iframe'); if(el.length) { // reset src after the popup is closed to avoid "video keeps playing after popup is closed" bug if(!isShowing) { el[0].src = _emptyPage; } // IE8 black screen bug fix if(mfp.isIE8) { el.css('display', isShowing ? 'block' : 'none'); } } } }; $.magnificPopup.registerModule(IFRAME_NS, { options: { markup: '
'+ '
'+ ''+ '
', srcAction: 'iframe_src', // we don't care and support only one default type of URL by default patterns: { youtube: { index: 'youtube.com', id: 'v=', src: '//www.youtube.com/embed/%id%?autoplay=1' }, vimeo: { index: 'vimeo.com/', id: '/', src: '//player.vimeo.com/video/%id%?autoplay=1' }, gmaps: { index: '//maps.google.', src: '%id%&output=embed' } } }, proto: { initIframe: function() { mfp.types.push(IFRAME_NS); _mfpOn('BeforeChange', function(e, prevType, newType) { if(prevType !== newType) { if(prevType === IFRAME_NS) { _fixIframeBugs(); // iframe if removed } else if(newType === IFRAME_NS) { _fixIframeBugs(true); // iframe is showing } }// else { // iframe source is switched, don't do anything //} }); _mfpOn(CLOSE_EVENT + '.' + IFRAME_NS, function() { _fixIframeBugs(); }); }, getIframe: function(item, template) { var embedSrc = item.src; var iframeSt = mfp.st.iframe; $.each(iframeSt.patterns, function() { if(embedSrc.indexOf( this.index ) > -1) { if(this.id) { if(typeof this.id === 'string') { embedSrc = embedSrc.substr(embedSrc.lastIndexOf(this.id)+this.id.length, embedSrc.length); } else { embedSrc = this.id.call( this, embedSrc ); } } embedSrc = this.src.replace('%id%', embedSrc ); return false; // break; } }); var dataObj = {}; if(iframeSt.srcAction) { dataObj[iframeSt.srcAction] = embedSrc; } mfp._parseMarkup(template, dataObj, item); mfp.updateStatus('ready'); return template; } } }); /*>>iframe*/ /*>>gallery*/ /** * Get looped index depending on number of slides */ var _getLoopedId = function(index) { var numSlides = mfp.items.length; if(index > numSlides - 1) { return index - numSlides; } else if(index < 0) { return numSlides + index; } return index; }, _replaceCurrTotal = function(text, curr, total) { return text.replace(/%curr%/gi, curr + 1).replace(/%total%/gi, total); }; $.magnificPopup.registerModule('gallery', { options: { enabled: false, arrowMarkup: '', preload: [0,2], navigateByImgClick: true, arrows: true, tPrev: 'Previous (Left arrow key)', tNext: 'Next (Right arrow key)', tCounter: '%curr% of %total%' }, proto: { initGallery: function() { var gSt = mfp.st.gallery, ns = '.mfp-gallery'; mfp.direction = true; // true - next, false - prev if(!gSt || !gSt.enabled ) return false; _wrapClasses += ' mfp-gallery'; _mfpOn(OPEN_EVENT+ns, function() { if(gSt.navigateByImgClick) { mfp.wrap.on('click'+ns, '.mfp-img', function() { if(mfp.items.length > 1) { mfp.next(); return false; } }); } _document.on('keydown'+ns, function(e) { if (e.keyCode === 37) { mfp.prev(); } else if (e.keyCode === 39) { mfp.next(); } }); }); _mfpOn('UpdateStatus'+ns, function(e, data) { if(data.text) { data.text = _replaceCurrTotal(data.text, mfp.currItem.index, mfp.items.length); } }); _mfpOn(MARKUP_PARSE_EVENT+ns, function(e, element, values, item) { var l = mfp.items.length; values.counter = l > 1 ? _replaceCurrTotal(gSt.tCounter, item.index, l) : ''; }); _mfpOn('BuildControls' + ns, function() { if(mfp.items.length > 1 && gSt.arrows && !mfp.arrowLeft) { var markup = gSt.arrowMarkup, arrowLeft = mfp.arrowLeft = $( markup.replace(/%title%/gi, gSt.tPrev).replace(/%dir%/gi, 'left') ).addClass(PREVENT_CLOSE_CLASS), arrowRight = mfp.arrowRight = $( markup.replace(/%title%/gi, gSt.tNext).replace(/%dir%/gi, 'right') ).addClass(PREVENT_CLOSE_CLASS); arrowLeft.click(function() { mfp.prev(); }); arrowRight.click(function() { mfp.next(); }); mfp.container.append(arrowLeft.add(arrowRight)); } }); _mfpOn(CHANGE_EVENT+ns, function() { if(mfp._preloadTimeout) clearTimeout(mfp._preloadTimeout); mfp._preloadTimeout = setTimeout(function() { mfp.preloadNearbyImages(); mfp._preloadTimeout = null; }, 16); }); _mfpOn(CLOSE_EVENT+ns, function() { _document.off(ns); mfp.wrap.off('click'+ns); mfp.arrowRight = mfp.arrowLeft = null; }); }, next: function() { mfp.direction = true; mfp.index = _getLoopedId(mfp.index + 1); mfp.updateItemHTML(); }, prev: function() { mfp.direction = false; mfp.index = _getLoopedId(mfp.index - 1); mfp.updateItemHTML(); }, goTo: function(newIndex) { mfp.direction = (newIndex >= mfp.index); mfp.index = newIndex; mfp.updateItemHTML(); }, preloadNearbyImages: function() { var p = mfp.st.gallery.preload, preloadBefore = Math.min(p[0], mfp.items.length), preloadAfter = Math.min(p[1], mfp.items.length), i; for(i = 1; i <= (mfp.direction ? preloadAfter : preloadBefore); i++) { mfp._preloadItem(mfp.index+i); } for(i = 1; i <= (mfp.direction ? preloadBefore : preloadAfter); i++) { mfp._preloadItem(mfp.index-i); } }, _preloadItem: function(index) { index = _getLoopedId(index); if(mfp.items[index].preloaded) { return; } var item = mfp.items[index]; if(!item.parsed) { item = mfp.parseEl( index ); } _mfpTrigger('LazyLoad', item); if(item.type === 'image') { item.img = $('').on('load.mfploader', function() { item.hasSize = true; }).on('error.mfploader', function() { item.hasSize = true; item.loadError = true; _mfpTrigger('LazyLoadError', item); }).attr('src', item.src); } item.preloaded = true; } } }); /*>>gallery*/ /*>>retina*/ var RETINA_NS = 'retina'; $.magnificPopup.registerModule(RETINA_NS, { options: { replaceSrc: function(item) { return item.src.replace(/\.\w+$/, function(m) { return '@2x' + m; }); }, ratio: 1 // Function or number. Set to 1 to disable. }, proto: { initRetina: function() { if(window.devicePixelRatio > 1) { var st = mfp.st.retina, ratio = st.ratio; ratio = !isNaN(ratio) ? ratio : ratio(); if(ratio > 1) { _mfpOn('ImageHasSize' + '.' + RETINA_NS, function(e, item) { item.img.css({ 'max-width': item.img[0].naturalWidth / ratio, 'width': '100%' }); }); _mfpOn('ElementParse' + '.' + RETINA_NS, function(e, item) { item.src = st.replaceSrc(item, ratio); }); } } } } }); /*>>retina*/ _checkInstance(); })); (function($) { "use strict"; // Start of use strict // jQuery for page scrolling feature - requires jQuery Easing plugin $('a.page-scroll').bind('click', function(event) { var $anchor = $(this); $('html, body').stop().animate({ scrollTop: ($($anchor.attr('href')).offset().top - 50) }, 1250, 'easeInOutExpo'); event.preventDefault(); }); // Highlight the top nav as scrolling occurs $('body').scrollspy({ target: '.navbar-fixed-top', offset: 51 }); // Closes the Responsive Menu on Menu Item Click $('.navbar-collapse ul li a').click(function() { $('.navbar-toggle:visible').click(); }); // Offset for Main Navigation $('#mainNav').affix({ offset: { top: 100 } }) // Initialize and Configure Scroll Reveal Animation window.sr = ScrollReveal(); sr.reveal('.sr-icons', { duration: 600, scale: 0.3, distance: '0px' }, 200); sr.reveal('.sr-button', { duration: 1000, delay: 200 }); sr.reveal('.sr-contact', { duration: 600, scale: 0.3, distance: '0px' }, 300); // Initialize and Configure Magnific Popup Lightbox Plugin $('.popup-gallery').magnificPopup({ delegate: 'a', type: 'image', tLoading: 'Loading image #%curr%...', mainClass: 'mfp-img-mobile', gallery: { enabled: true, navigateByImgClick: true, preload: [0, 1] // Will preload 0 - before current, and 1 after the current image }, image: { tError: 'The image #%curr% could not be loaded.' } }); })(jQuery); // End of use strict