/*! jQuery Migrate v3.4.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ "undefined"==typeof jQuery.migrateMute&&(jQuery.migrateMute=!0),function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],function(e){return t(e,window)}):"object"==typeof module&&module.exports?module.exports=t(require("jquery"),window):t(jQuery,window)}(function(s,n){"use strict";function e(e){return 0<=function(e,t){for(var r=/^(\d+)\.(\d+)\.(\d+)/,n=r.exec(e)||[],o=r.exec(t)||[],a=1;a<=3;a++){if(+o[a]<+n[a])return 1;if(+n[a]<+o[a])return-1}return 0}(s.fn.jquery,e)}s.migrateVersion="3.4.1";var t=Object.create(null);s.migrateDisablePatches=function(){for(var e=0;e\x20\t\r\n\f]*)[^>]*)\/>/gi;s.UNSAFE_restoreLegacyHtmlPrefilter=function(){s.migrateEnablePatches("self-closed-tags")},i(s,"htmlPrefilter",function(e){var t,r;return(r=(t=e).replace(F,"<$1>"))!==t&&T(t)!==T(r)&&u("self-closed-tags","HTML tags must be properly nested and closed: "+t),e.replace(F,"<$1>")},"self-closed-tags"),s.migrateDisablePatches("self-closed-tags");var D,W,_,I=s.fn.offset;return i(s.fn,"offset",function(){var e=this[0];return!e||e.nodeType&&e.getBoundingClientRect?I.apply(this,arguments):(u("offset-valid-elem","jQuery.fn.offset() requires a valid DOM element"),arguments.length?this:void 0)},"offset-valid-elem"),s.ajax&&(D=s.param,i(s,"param",function(e,t){var r=s.ajaxSettings&&s.ajaxSettings.traditional;return void 0===t&&r&&(u("param-ajax-traditional","jQuery.param() no longer uses jQuery.ajaxSettings.traditional"),t=r),D.call(this,e,t)},"param-ajax-traditional")),c(s.fn,"andSelf",s.fn.addBack,"andSelf","jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()"),s.Deferred&&(W=s.Deferred,_=[["resolve","done",s.Callbacks("once memory"),s.Callbacks("once memory"),"resolved"],["reject","fail",s.Callbacks("once memory"),s.Callbacks("once memory"),"rejected"],["notify","progress",s.Callbacks("memory"),s.Callbacks("memory")]],i(s,"Deferred",function(e){var a=W(),i=a.promise();function t(){var o=arguments;return s.Deferred(function(n){s.each(_,function(e,t){var r="function"==typeof o[e]&&o[e];a[t[1]](function(){var e=r&&r.apply(this,arguments);e&&"function"==typeof e.promise?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[t[0]+"With"](this===i?n.promise():this,r?[e]:arguments)})}),o=null}).promise()}return c(a,"pipe",t,"deferred-pipe","deferred.pipe() is deprecated"),c(i,"pipe",t,"deferred-pipe","deferred.pipe() is deprecated"),e&&e.call(a,a),a},"deferred-pipe"),s.Deferred.exceptionHook=W.exceptionHook),s}); ; !function($){return $?($.Unslider=function(t,n){var e=this;return e._="unslider",e.defaults={autoplay:!1,delay:3e3,speed:750,easing:"swing",keys:{prev:37,next:39},nav:!0,arrows:{prev:'',next:''},animation:"horizontal",selectors:{container:"ul:first",slides:"li"},animateHeight:!1,activeClass:e._+"-active",swipe:!0,swipeThreshold:.2},e.$context=t,e.options={}, e.$parent=null,e.$container=null,e.$slides=null,e.$nav=null,e.$arrows=[],e.total=0,e.current=0,e.prefix=e._+"-",e.eventSuffix="."+e.prefix+~~(2e3*Math.random()),e.interval=null,e.init=function(t){return e.options=$.extend({},e.defaults,t),e.$container=e.$context.find(e.options.selectors.container).addClass(e.prefix+"wrap"),e.$slides=e.$container.children(e.options.selectors.slides),e.setup(),$.each(["nav","arrows","keys","infinite"],function(t,n){e.options[n]&&e["init"+$._ucfirst(n)]()}),jQuery.event.special.swipe&&e.options.swipe&&e.initSwipe(),e.options.autoplay&&e.start(),e.calculateSlides(),e.$context.trigger(e._+".ready"),e.animate(e.options.index||e.current,"init")},e.setup=function(){e.$context.addClass(e.prefix+e.options.animation).wrap('
'),e.$parent=e.$context.parent("."+e._);var t=e.$context.css("position");"static"===t&&e.$context.css("position","relative"),e.$context.css("overflow","hidden")},e.calculateSlides=function(){if(e.total=e.$slides.length,"fade"!==e.options.animation){var t="width";"vertical"===e.options.animation&&(t="height"),e.$container.css(t,100*e.total+"%").addClass(e.prefix+"carousel"),e.$slides.css(t,100/e.total+"%")}},e.start=function(){return e.interval=setTimeout(function(){e.next()},e.options.delay),e},e.stop=function(){return clearTimeout(e.interval),e},e.initNav=function(){var t=$('');e.$slides.each(function(n){var i=this.getAttribute("data-nav")||n+1;$.isFunction(e.options.nav)&&(i=e.options.nav.call(e.$slides.eq(n),n,i)),t.children("ol").append('
  • '+i+"
  • ")}),e.$nav=t.insertAfter(e.$context),e.$nav.find("li").on("click"+e.eventSuffix,function(){var t=$(this).addClass(e.options.activeClass);t.siblings().removeClass(e.options.activeClass),e.animate(t.attr("data-slide"))})},e.initArrows=function(){e.options.arrows===!0&&(e.options.arrows=e.defaults.arrows),$.each(e.options.arrows,function(t,n){e.$arrows.push($(n).insertAfter(e.$context).on("click"+e.eventSuffix,e[t]))})},e.initKeys=function(){e.options.keys===!0&&(e.options.keys=e.defaults.keys),$(document).on("keyup"+e.eventSuffix,function(t){$.each(e.options.keys,function(n,i){t.which===i&&$.isFunction(e[n])&&e[n].call(e)})})},e.initSwipe=function(){var t=e.$slides.width();"fade"!==e.options.animation&&e.$container.on({movestart:function(t){return t.distX>t.distY&&t.distX<-t.distY||t.distX-t.distY?!!t.preventDefault():void e.$container.css("position","relative")},move:function(n){e.$container.css("left",-(100*e.current)+100*n.distX/t+"%")},moveend:function(n){Math.abs(n.distX)/t>e.options.swipeThreshold?e[n.distX<0?"next":"prev"]():e.$container.animate({left:-(100*e.current)+"%"},e.options.speed/2)}})},e.initInfinite=function(){var t=["first","last"];$.each(t,function(n,i){e.$slides.push.apply(e.$slides,e.$slides.filter(':not(".'+e._+'-clone")')[i]().clone().addClass(e._+"-clone")["insert"+(0===n?"After":"Before")](e.$slides[t[~~!n]]()))})},e.destroyArrows=function(){$.each(e.$arrows,function(t,n){n.remove()})},e.destroySwipe=function(){e.$container.off("movestart move moveend")},e.destroyKeys=function(){$(document).off("keyup"+e.eventSuffix)},e.setIndex=function(t){return 0>t&&(t=e.total-1),e.current=Math.min(Math.max(0,t),e.total-1),e.options.nav&&e.$nav.find('[data-slide="'+e.current+'"]')._active(e.options.activeClass),e.$slides.eq(e.current)._active(e.options.activeClass),e},e.animate=function(t,n){if("first"===t&&(t=0),"last"===t&&(t=e.total),isNaN(t))return e;e.options.autoplay&&e.stop().start(),e.setIndex(t),e.$context.trigger(e._+".change",[t,e.$slides.eq(t)]);var i="animate"+$._ucfirst(e.options.animation);return $.isFunction(e[i])&&e[i](e.current,n),e},e.next=function(){var t=e.current+1;return t>=e.total&&(t=0),e.animate(t,"next")},e.prev=function(){return e.animate(e.current-1,"prev")},e.animateHorizontal=function(t){var n="left";return"rtl"===e.$context.attr("dir")&&(n="right"),e.options.infinite&&e.$container.css("margin-"+n,"-100%"),e.slide(n,t)},e.animateVertical=function(t){return e.options.animateHeight=!0,e.options.infinite&&e.$container.css("margin-top",-e.$slides.outerHeight()),e.slide("top",t)},e.slide=function(t,n){if(e.options.animateHeight&&e._move(e.$context,{height:e.$slides.eq(n).outerHeight()},!1),e.options.infinite){var i;n===e.total-1&&(i=e.total-3,n=-1),n===e.total-2&&(i=0,n=e.total-2),"number"==typeof i&&(e.setIndex(i),e.$context.on(e._+".moved",function(){e.current===i&&e.$container.css(t,-(100*i)+"%").off(e._+".moved")}))}var o={};return o[t]=-(100*n)+"%",e._move(e.$container,o)},e.animateFade=function(t){var n=e.$slides.eq(t).addClass(e.options.activeClass);e._move(n.siblings().removeClass(e.options.activeClass),{opacity:0}),e._move(n,{opacity:1},!1)},e._move=function(t,n,i,o){return i!==!1&&(i=function(){e.$context.trigger(e._+".moved")}),t._move(n,o||e.options.speed,e.options.easing,i)},e.init(n)},$.fn._active=function(t){return this.addClass(t).siblings().removeClass(t)},$._ucfirst=function(t){return(t+"").toLowerCase().replace(/^./,function(t){return t.toUpperCase()})},$.fn._move=function(){return this.stop(!0,!0),$.fn[$.fn.velocity?"velocity":"animate"].apply(this,arguments)},void($.fn.unslider=function(t){return this.each(function(){var n=$(this);if("string"==typeof t&&n.data("unslider")){t=t.split(":");var e=n.data("unslider")[t[0]];if($.isFunction(e))return e.apply(n,t[1]?t[1].split(","):null)}return n.data("unslider",new $.Unslider(n,t))})})):console.warn("Unslider needs jQuery")}(window.jQuery);; (function() { if ( ! window.Symbol ) { return; } // DOM.event.move // // 2.0.0 // // Stephen Band // // Triggers 'movestart', 'move' and 'moveend' events after // mousemoves following a mousedown cross a distance threshold, // similar to the native 'dragstart', 'drag' and 'dragend' events. // Move events are throttled to animation frames. Move event objects // have the properties: // // pageX: // pageY: Page coordinates of pointer. // startX: // startY: Page coordinates of pointer at movestart. // distX: // distY: Distance the pointer has moved since movestart. // deltaX: // deltaY: Distance the finger has moved since last event. // velocityX: // velocityY: Average velocity over last few events. (function(fn) { if (typeof define === 'function' && define.amd) { define([], fn); } else if ((typeof module !== "undefined" && module !== null) && module.exports) { module.exports = fn; } else { fn(); } })(function(){ var assign = Object.assign || window.jQuery && jQuery.extend; // Number of pixels a pressed pointer travels before movestart // event is fired. var threshold = 8; // Shim for requestAnimationFrame, falling back to timer. See: // see http://paulirish.com/2011/requestanimationframe-for-smart-animating/ var requestFrame = (function(){ return ( window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(fn, element){ return window.setTimeout(function(){ fn(); }, 25); } ); })(); var ignoreTags = { textarea: true, input: true, select: true, button: true }; var mouseevents = { move: 'mousemove', cancel: 'mouseup dragstart', end: 'mouseup' }; var touchevents = { move: 'touchmove', cancel: 'touchend', end: 'touchend' }; var rspaces = /\s+/; // DOM Events var eventOptions = { bubbles: true, cancelable: true }; var eventsSymbol = Symbol('events'); function createEvent(type) { return new CustomEvent(type, eventOptions); } function getEvents(node) { return node[eventsSymbol] || (node[eventsSymbol] = {}); } function on(node, types, fn, data, selector) { types = types.split(rspaces); var events = getEvents(node); var i = types.length; var handlers, type; function handler(e) { fn(e, data); } while (i--) { type = types[i]; handlers = events[type] || (events[type] = []); handlers.push([fn, handler]); node.addEventListener(type, handler); } } function off(node, types, fn, selector) { types = types.split(rspaces); var events = getEvents(node); var i = types.length; var type, handlers, k; if (!events) { return; } while (i--) { type = types[i]; handlers = events[type]; if (!handlers) { continue; } k = handlers.length; while (k--) { if (handlers[k][0] === fn) { node.removeEventListener(type, handlers[k][1]); handlers.splice(k, 1); } } } } function trigger(node, type, properties) { // Don't cache events. It prevents you from triggering an event of a // given type from inside the handler of another event of that type. var event = createEvent(type); if (properties) { assign(event, properties); } node.dispatchEvent(event); } // Constructors function Timer(fn){ var callback = fn, active = false, running = false; function trigger(time) { if (active){ callback(); requestFrame(trigger); running = true; active = false; } else { running = false; } } this.kick = function(fn) { active = true; if (!running) { trigger(); } }; this.end = function(fn) { var cb = callback; if (!fn) { return; } // If the timer is not running, simply call the end callback. if (!running) { fn(); } // If the timer is running, and has been kicked lately, then // queue up the current callback and the end callback, otherwise // just the end callback. else { callback = active ? function(){ cb(); fn(); } : fn ; active = true; } }; } // Functions function noop() {} function preventDefault(e) { e.preventDefault(); } function isIgnoreTag(e) { return !!ignoreTags[e.target.tagName.toLowerCase()]; } function isPrimaryButton(e) { // Ignore mousedowns on any button other than the left (or primary) // mouse button, or when a modifier key is pressed. return (e.which === 1 && !e.ctrlKey && !e.altKey); } function identifiedTouch(touchList, id) { var i, l; if (touchList.identifiedTouch) { return touchList.identifiedTouch(id); } // touchList.identifiedTouch() does not exist in // webkit yet… we must do the search ourselves... i = -1; l = touchList.length; while (++i < l) { if (touchList[i].identifier === id) { return touchList[i]; } } } function changedTouch(e, data) { var touch = identifiedTouch(e.changedTouches, data.identifier); // This isn't the touch you're looking for. if (!touch) { return; } // Chrome Android (at least) includes touches that have not // changed in e.changedTouches. That's a bit annoying. Check // that this touch has changed. if (touch.pageX === data.pageX && touch.pageY === data.pageY) { return; } return touch; } // Handlers that decide when the first movestart is triggered function mousedown(e){ // Ignore non-primary buttons if (!isPrimaryButton(e)) { return; } // Ignore form and interactive elements if (isIgnoreTag(e)) { return; } on(document, mouseevents.move, mousemove, e); on(document, mouseevents.cancel, mouseend, e); } function mousemove(e, data){ checkThreshold(e, data, e, removeMouse); } function mouseend(e, data) { removeMouse(); } function removeMouse() { off(document, mouseevents.move, mousemove); off(document, mouseevents.cancel, mouseend); } function touchstart(e) { // Don't get in the way of interaction with form elements if (ignoreTags[e.target.tagName.toLowerCase()]) { return; } var touch = e.changedTouches[0]; // iOS live updates the touch objects whereas Android gives us copies. // That means we can't trust the touchstart object to stay the same, // so we must copy the data. This object acts as a template for // movestart, move and moveend event objects. var data = { target: touch.target, pageX: touch.pageX, pageY: touch.pageY, identifier: touch.identifier, // The only way to make handlers individually unbindable is by // making them unique. touchmove: function(e, data) { touchmove(e, data); }, touchend: function(e, data) { touchend(e, data); } }; on(document, touchevents.move, data.touchmove, data); on(document, touchevents.cancel, data.touchend, data); } function touchmove(e, data) { var touch = changedTouch(e, data); if (!touch) { return; } checkThreshold(e, data, touch, removeTouch); } function touchend(e, data) { var touch = identifiedTouch(e.changedTouches, data.identifier); if (!touch) { return; } removeTouch(data); } function removeTouch(data) { off(document, touchevents.move, data.touchmove); off(document, touchevents.cancel, data.touchend); } function checkThreshold(e, data, touch, fn) { var distX = touch.pageX - data.pageX; var distY = touch.pageY - data.pageY; // Do nothing if the threshold has not been crossed. if ((distX * distX) + (distY * distY) < (threshold * threshold)) { return; } triggerStart(e, data, touch, distX, distY, fn); } function triggerStart(e, data, touch, distX, distY, fn) { var touches = e.targetTouches; var time = e.timeStamp - data.timeStamp; // Create a movestart object with some special properties that // are passed only to the movestart handlers. var template = { altKey: e.altKey, ctrlKey: e.ctrlKey, shiftKey: e.shiftKey, startX: data.pageX, startY: data.pageY, distX: distX, distY: distY, deltaX: distX, deltaY: distY, pageX: touch.pageX, pageY: touch.pageY, velocityX: distX / time, velocityY: distY / time, identifier: data.identifier, targetTouches: touches, finger: touches ? touches.length : 1, enableMove: function() { this.moveEnabled = true; this.enableMove = noop; e.preventDefault(); } }; // Trigger the movestart event. trigger(data.target, 'movestart', template); // Unbind handlers that tracked the touch or mouse up till now. fn(data); } // Handlers that control what happens following a movestart function activeMousemove(e, data) { var timer = data.timer; data.touch = e; data.timeStamp = e.timeStamp; timer.kick(); } function activeMouseend(e, data) { var target = data.target; var event = data.event; var timer = data.timer; removeActiveMouse(); endEvent(target, event, timer, function() { // Unbind the click suppressor, waiting until after mouseup // has been handled. setTimeout(function(){ off(target, 'click', preventDefault); }, 0); }); } function removeActiveMouse() { off(document, mouseevents.move, activeMousemove); off(document, mouseevents.end, activeMouseend); } function activeTouchmove(e, data) { var event = data.event; var timer = data.timer; var touch = changedTouch(e, event); if (!touch) { return; } // Stop the interface from gesturing e.preventDefault(); event.targetTouches = e.targetTouches; data.touch = touch; data.timeStamp = e.timeStamp; timer.kick(); } function activeTouchend(e, data) { var target = data.target; var event = data.event; var timer = data.timer; var touch = identifiedTouch(e.changedTouches, event.identifier); // This isn't the touch you're looking for. if (!touch) { return; } removeActiveTouch(data); endEvent(target, event, timer); } function removeActiveTouch(data) { off(document, touchevents.move, data.activeTouchmove); off(document, touchevents.end, data.activeTouchend); } // Logic for triggering move and moveend events function updateEvent(event, touch, timeStamp) { var time = timeStamp - event.timeStamp; event.distX = touch.pageX - event.startX; event.distY = touch.pageY - event.startY; event.deltaX = touch.pageX - event.pageX; event.deltaY = touch.pageY - event.pageY; // Average the velocity of the last few events using a decay // curve to even out spurious jumps in values. event.velocityX = 0.3 * event.velocityX + 0.7 * event.deltaX / time; event.velocityY = 0.3 * event.velocityY + 0.7 * event.deltaY / time; event.pageX = touch.pageX; event.pageY = touch.pageY; } function endEvent(target, event, timer, fn) { timer.end(function(){ trigger(target, 'moveend', event); return fn && fn(); }); } // Set up the DOM function movestart(e) { if (e.defaultPrevented) { return; } if (!e.moveEnabled) { return; } var event = { startX: e.startX, startY: e.startY, pageX: e.pageX, pageY: e.pageY, distX: e.distX, distY: e.distY, deltaX: e.deltaX, deltaY: e.deltaY, velocityX: e.velocityX, velocityY: e.velocityY, identifier: e.identifier, targetTouches: e.targetTouches, finger: e.finger }; var data = { target: e.target, event: event, timer: new Timer(update), touch: undefined, timeStamp: e.timeStamp }; function update(time) { updateEvent(event, data.touch, data.timeStamp); trigger(data.target, 'move', event); } if (e.identifier === undefined) { // We're dealing with a mouse event. // Stop clicks from propagating during a move on(e.target, 'click', preventDefault); on(document, mouseevents.move, activeMousemove, data); on(document, mouseevents.end, activeMouseend, data); } else { // In order to unbind correct handlers they have to be unique data.activeTouchmove = function(e, data) { activeTouchmove(e, data); }; data.activeTouchend = function(e, data) { activeTouchend(e, data); }; // We're dealing with a touch. on(document, touchevents.move, data.activeTouchmove, data); on(document, touchevents.end, data.activeTouchend, data); } } on(document, 'mousedown', mousedown); on(document, 'touchstart', touchstart); on(document, 'movestart', movestart); // jQuery special events // // jQuery event objects are copies of DOM event objects. They need // a little help copying the move properties across. if (!window.jQuery) { return; } var properties = ("startX startY pageX pageY distX distY deltaX deltaY velocityX velocityY").split(' '); function enableMove1(e) { e.enableMove(); } function enableMove2(e) { e.enableMove(); } function enableMove3(e) { e.enableMove(); } function add(handleObj) { var handler = handleObj.handler; handleObj.handler = function(e) { // Copy move properties across from originalEvent var i = properties.length; var property; while(i--) { property = properties[i]; e[property] = e.originalEvent[property]; } handler.apply(this, arguments); }; } jQuery.event.special.movestart = { setup: function() { // Movestart must be enabled to allow other move events on(this, 'movestart', enableMove1); // Do listen to DOM events return false; }, teardown: function() { off(this, 'movestart', enableMove1); return false; }, add: add }; jQuery.event.special.move = { setup: function() { on(this, 'movestart', enableMove2); return false; }, teardown: function() { off(this, 'movestart', enableMove2); return false; }, add: add }; jQuery.event.special.moveend = { setup: function() { on(this, 'movestart', enableMove3); return false; }, teardown: function() { off(this, 'movestart', enableMove3); return false; }, add: add }; }); })(); (function() { if ( ! window.Symbol ) { return; } // jQuery.event.swipe // 0.5 // Stephen Band // Dependencies // jQuery.event.move 1.2 // One of swipeleft, swiperight, swipeup or swipedown is triggered on // moveend, when the move has covered a threshold ratio of the dimension // of the target node, or has gone really fast. Threshold and velocity // sensitivity changed with: // // jQuery.event.special.swipe.settings.threshold // jQuery.event.special.swipe.settings.sensitivity (function (thisModule) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery', undefined, 'jquery.event.move'], thisModule); } else if ((typeof module !== "undefined" && module !== null) && module.exports) { module.exports = thisModule; } else { // Browser globals thisModule(jQuery); } })(function(jQuery, undefined){ var add = jQuery.event.add, remove = jQuery.event.remove, // Just sugar, so we can have arguments in the same order as // add and remove. trigger = function(node, type, data) { jQuery.event.trigger(type, data, node); }, settings = { // Ratio of distance over target finger must travel to be // considered a swipe. threshold: 0.4, // Faster fingers can travel shorter distances to be considered // swipes. 'sensitivity' controls how much. Bigger is shorter. sensitivity: 6 }; function moveend(e) { var w, h, event; w = e.currentTarget.offsetWidth; h = e.currentTarget.offsetHeight; // Copy over some useful properties from the move event event = { distX: e.distX, distY: e.distY, velocityX: e.velocityX, velocityY: e.velocityY, finger: e.finger }; // Find out which of the four directions was swiped if (e.distX > e.distY) { if (e.distX > -e.distY) { if (e.distX/w > settings.threshold || e.velocityX * e.distX/w * settings.sensitivity > 1) { event.type = 'swiperight'; trigger(e.currentTarget, event); } } else { if (-e.distY/h > settings.threshold || e.velocityY * e.distY/w * settings.sensitivity > 1) { event.type = 'swipeup'; trigger(e.currentTarget, event); } } } else { if (e.distX > -e.distY) { if (e.distY/h > settings.threshold || e.velocityY * e.distY/w * settings.sensitivity > 1) { event.type = 'swipedown'; trigger(e.currentTarget, event); } } else { if (-e.distX/w > settings.threshold || e.velocityX * e.distX/w * settings.sensitivity > 1) { event.type = 'swipeleft'; trigger(e.currentTarget, event); } } } } function getData(node) { var data = jQuery.data(node, 'event_swipe'); if (!data) { data = { count: 0 }; jQuery.data(node, 'event_swipe', data); } return data; } jQuery.event.special.swipe = jQuery.event.special.swipeleft = jQuery.event.special.swiperight = jQuery.event.special.swipeup = jQuery.event.special.swipedown = { setup: function( data, namespaces, eventHandle ) { var data = getData(this); // If another swipe event is already setup, don't setup again. if (data.count++ > 0) { return; } add(this, 'moveend', moveend); return true; }, teardown: function() { var data = getData(this); // If another swipe event is still setup, don't teardown. if (--data.count > 0) { return; } remove(this, 'moveend', moveend); return true; }, settings: settings }; }); })();