PageSourceSearch

https://www.dreametech.com/cdn/shop/t/361/assets/swiper-4.5.min.js?v=70956347514609430161782787816

js dreametech.com collected 2026-09-27 20:55:19 UTC 298,110 bytes, 8,150 lines download raw bytes

vendor: 298,110 bytes, lines 1-8150
1/**
2 * Swiper 4.5.3
3 * Most modern mobile touch slider and framework with hardware accelerated transitions
4 * http://www.idangero.us/swiper/
5 *
6 * Copyright 2014-2019 Vladimir Kharlampidi
7 *
8 * Released under the MIT License
9 *
10 * Released on: October 16, 2019
11 */
12
13 (function (global, factory) {
14    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
15    typeof define === 'function' && define.amd ? define(factory) :
16    (global = global || self, global.Swiper = factory());
17  }(this, function () { 'use strict';
18  
19    /**
20     * SSR Window 1.0.1
21     * Better handling for window object in SSR environment
22     * https://github.com/nolimits4web/ssr-window
23     *
24     * Copyright 2018, Vladimir Kharlampidi
25     *
26     * Licensed under MIT
27     *
28     * Released on: July 18, 2018
29     */
30    var doc = (typeof document === 'undefined') ? {
31      body: {},
32      addEventListener: function addEventListener() {},
33      removeEventListener: function removeEventListener() {},
34      activeElement: {
35        blur: function blur() {},
36        nodeName: '',
37      },
38      querySelector: function querySelector() {
39        return null;
40      },
41      querySelectorAll: function querySelectorAll() {
42        return [];
43      },
44      getElementById: function getElementById() {
45        return null;
46      },
47      createEvent: function createEvent() {
48        return {
49          initEvent: function initEvent() {},
50        };
51      },
52      createElement: function createElement() {
53        return {
54          children: [],
55          childNodes: [],
56          style: {},
57          setAttribute: function setAttribute() {},
58          getElementsByTagName: function getElementsByTagName() {
59            return [];
60          },
61        };
62      },
63      location: { hash: '' },
64    } : document; // eslint-disable-line
65  
66    var win = (typeof window === 'undefined') ? {
67      document: doc,
68      navigator: {
69        userAgent: '',
70      },
71      location: {},
72      history: {},
73      CustomEvent: function CustomEvent() {
74        return this;
75      },
76      addEventListener: function addEventListener() {},
77      removeEventListener: function removeEventListener() {},
78      getComputedStyle: function getComputedStyle() {
79        return {
80          getPropertyValue: function getPropertyValue() {
81            return '';
82          },
83        };
84      },
85      Image: function Image() {},
86      Date: function Date() {},
87      screen: {},
88      setTimeout: function setTimeout() {},
89      clearTimeout: function clearTimeout() {},
90    } : window; // eslint-disable-line
91  
92    /**
93     * Dom7 2.1.3
94     * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API
95     * http://framework7.io/docs/dom.html
96     *
97     * Copyright 2019, Vladimir Kharlampidi
98     * The iDangero.us
99     * http://www.idangero.us/
100     *
101     * Licensed under MIT
102     *
103     * Released on: February 11, 2019
104     */
105  
106    var Dom7 = function Dom7(arr) {
107      var self = this;
108      // Create array-like object
109      for (var i = 0; i < arr.length; i += 1) {
110        self[i] = arr[i];
111      }
112      self.length = arr.length;
113      // Return collection with methods
114      return this;
115    };
116  
117    function $(selector, context) {
118      var arr = [];
119      var i = 0;
120      if (selector && !context) {
121        if (selector instanceof Dom7) {
122          return selector;
123        }
124      }
125      if (selector) {
126          // String
127        if (typeof selector === 'string') {
128          var els;
129          var tempParent;
130          var html = selector.trim();
131          if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {
132            var toCreate = 'div';
133            if (html.indexOf('<li') === 0) { toCreate = 'ul'; }
134            if (html.indexOf('<tr') === 0) { toCreate = 'tbody'; }
135            if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) { toCreate = 'tr'; }
136            if (html.indexOf('<tbody') === 0) { toCreate = 'table'; }
137            if (html.indexOf('<option') === 0) { toCreate = 'select'; }
138            tempParent = doc.createElement(toCreate);
139            tempParent.innerHTML = html;
140            for (i = 0; i < tempParent.childNodes.length; i += 1) {
141              arr.push(tempParent.childNodes[i]);
142            }
143          } else {
144            if (!context && selector[0] === '#' && !selector.match(/[ .<>:~]/)) {
145              // Pure ID selector
146              els = [doc.getElementById(selector.trim().split('#')[1])];
147            } else {
148              // Other selectors
149              els = (context || doc).querySelectorAll(selector.trim());
150            }
151            for (i = 0; i < els.length; i += 1) {
152              if (els[i]) { arr.push(els[i]); }
153            }
154          }
155        } else if (selector.nodeType || selector === win || selector === doc) {
156          // Node/element
157          arr.push(selector);
158        } else if (selector.length > 0 && selector[0].nodeType) {
159          // Array of elements or instance of Dom
160          for (i = 0; i < selector.length; i += 1) {
161            arr.push(selector[i]);
162          }
163        }
164      }
165      return new Dom7(arr);
166    }
167  
168    $.fn = Dom7.prototype;
169    $.Class = Dom7;
170    $.Dom7 = Dom7;
171  
172    function unique(arr) {
173      var uniqueArray = [];
174      for (var i = 0; i < arr.length; i += 1) {
175        if (uniqueArray.indexOf(arr[i]) === -1) { uniqueArray.push(arr[i]); }
176      }
177      return uniqueArray;
178    }
179  
180    // Classes and attributes
181    function addClass(className) {
182      if (typeof className === 'undefined') {
183        return this;
184      }
185      var classes = className.split(' ');
186      for (var i = 0; i < classes.length; i += 1) {
187        for (var j = 0; j < this.length; j += 1) {
188          if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.add(classes[i]); }
189        }
190      }
191      return this;
192    }
193    function removeClass(className) {
194      var classes = className.split(' ');
195      for (var i = 0; i < classes.length; i += 1) {
196        for (var j = 0; j < this.length; j += 1) {
197          if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.remove(classes[i]); }
198        }
199      }
200      return this;
201    }
202    function hasClass(className) {
203      if (!this[0]) { return false; }
204      return this[0].classList.contains(className);
205    }
206    function toggleClass(className) {
207      var classes = className.split(' ');
208      for (var i = 0; i < classes.length; i += 1) {
209        for (var j = 0; j < this.length; j += 1) {
210          if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.toggle(classes[i]); }
211        }
212      }
213      return this;
214    }
215    function attr(attrs, value) {
216      var arguments$1 = arguments;
217  
218      if (arguments.length === 1 && typeof attrs === 'string') {
219        // Get attr
220        if (this[0]) { return this[0].getAttribute(attrs); }
221        return undefined;
222      }
223  
224      // Set attrs
225      for (var i = 0; i < this.length; i += 1) {
226        if (arguments$1.length === 2) {
227          // String
228          this[i].setAttribute(attrs, value);
229        } else {
230          // Object
231          // eslint-disable-next-line
232          for (var attrName in attrs) {
233            this[i][attrName] = attrs[attrName];
234            this[i].setAttribute(attrName, attrs[attrName]);
235          }
236        }
237      }
238      return this;
239    }
240    // eslint-disable-next-line
241    function removeAttr(attr) {
242      for (var i = 0; i < this.length; i += 1) {
243        this[i].removeAttribute(attr);
244      }
245      return this;
246    }
247    function data(key, value) {
248      var el;
249      if (typeof value === 'undefined') {
250        el = this[0];
251        // Get value
252        if (el) {
253          if (el.dom7ElementDataStorage && (key in el.dom7ElementDataStorage)) {
254            return el.dom7ElementDataStorage[key];
255          }
256  
257          var dataKey = el.getAttribute(("data-" + key));
258          if (dataKey) {
259            return dataKey;
260          }
261          return undefined;
262        }
263        return undefined;
264      }
265  
266      // Set value
267      for (var i = 0; i < this.length; i += 1) {
268        el = this[i];
269        if (!el.dom7ElementDataStorage) { el.dom7ElementDataStorage = {}; }
270        el.dom7ElementDataStorage[key] = value;
271      }
272      return this;
273    }
274    // Transforms
275    // eslint-disable-next-line
276    function transform(transform) {
277      for (var i = 0; i < this.length; i += 1) {
278        var elStyle = this[i].style;
279        elStyle.webkitTransform = transform;
280        elStyle.transform = transform;
281      }
282      return this;
283    }
284    function transition(duration) {
285      if (typeof duration !== 'string') {
286        duration = duration + "ms"; // eslint-disable-line
287      }
288      for (var i = 0; i < this.length; i += 1) {
289        var elStyle = this[i].style;
290        elStyle.webkitTransitionDuration = duration;
291        elStyle.transitionDuration = duration;
292      }
293      return this;
294    }
295    // Events
296    function on() {
297      var assign;
298  
299      var args = [], len = arguments.length;
300      while ( len-- ) args[ len ] = arguments[ len ];
301      var eventType = args[0];
302      var targetSelector = args[1];
303      var listener = args[2];
304      var capture = args[3];
305      if (typeof args[1] === 'function') {
306        (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);
307        targetSelector = undefined;
308      }
309      if (!capture) { capture = false; }
310  
311      function handleLiveEvent(e) {
312        var target = e.target;
313        if (!target) { return; }
314        var eventData = e.target.dom7EventData || [];
315        if (eventData.indexOf(e) < 0) {
316          eventData.unshift(e);
317        }
318        if ($(target).is(targetSelector)) { listener.apply(target, eventData); }
319        else {
320          var parents = $(target).parents(); // eslint-disable-line
321          for (var k = 0; k < parents.length; k += 1) {
322            if ($(parents[k]).is(targetSelector)) { listener.apply(parents[k], eventData); }
323          }
324        }
325      }
326      function handleEvent(e) {
327        var eventData = e && e.target ? e.target.dom7EventData || [] : [];
328        if (eventData.indexOf(e) < 0) {
329          eventData.unshift(e);
330        }
331        listener.apply(this, eventData);
332      }
333      var events = eventType.split(' ');
334      var j;
335      for (var i = 0; i < this.length; i += 1) {
336        var el = this[i];
337        if (!targetSelector) {
338          for (j = 0; j < events.length; j += 1) {
339            var event = events[j];
340            if (!el.dom7Listeners) { el.dom7Listeners = {}; }
341            if (!el.dom7Listeners[event]) { el.dom7Listeners[event] = []; }
342            el.dom7Listeners[event].push({
343              listener: listener,
344              proxyListener: handleEvent,
345            });
346            el.addEventListener(event, handleEvent, capture);
347          }
348        } else {
349          // Live events
350          for (j = 0; j < events.length; j += 1) {
351            var event$1 = events[j];
352            if (!el.dom7LiveListeners) { el.dom7LiveListeners = {}; }
353            if (!el.dom7LiveListeners[event$1]) { el.dom7LiveListeners[event$1] = []; }
354            el.dom7LiveListeners[event$1].push({
355              listener: listener,
356              proxyListener: handleLiveEvent,
357            });
358            el.addEventListener(event$1, handleLiveEvent, capture);
359          }
360        }
361      }
362      return this;
363    }
364    function off() {
365      var assign;
366  
367      var args = [], len = arguments.length;
368      while ( len-- ) args[ len ] = arguments[ len ];
369      var eventType = args[0];
370      var targetSelector = args[1];
371      var listener = args[2];
372      var capture = args[3];
373      if (typeof args[1] === 'function') {
374        (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);
375        targetSelector = undefined;
376      }
377      if (!capture) { capture = false; }
378  
379      var events = eventType.split(' ');
380      for (var i = 0; i < events.length; i += 1) {
381        var event = events[i];
382        for (var j = 0; j < this.length; j += 1) {
383          var el = this[j];
384          var handlers = (void 0);
385          if (!targetSelector && el.dom7Listeners) {
386            handlers = el.dom7Listeners[event];
387          } else if (targetSelector && el.dom7LiveListeners) {
388            handlers = el.dom7LiveListeners[event];
389          }
390          if (handlers && handlers.length) {
391            for (var k = handlers.length - 1; k >= 0; k -= 1) {
392              var handler = handlers[k];
393              if (listener && handler.listener === listener) {
394                el.removeEventListener(event, handler.proxyListener, capture);
395                handlers.splice(k, 1);
396              } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {
397                el.removeEventListener(event, handler.proxyListener, capture);
398                handlers.splice(k, 1);
399              } else if (!listener) {
400                el.removeEventListener(event, handler.proxyListener, capture);
401                handlers.splice(k, 1);
402              }
403            }
404          }
405        }
406      }
407      return this;
408    }
409    function trigger() {
410      var args = [], len = arguments.length;
411      while ( len-- ) args[ len ] = arguments[ len ];
412  
413      var events = args[0].split(' ');
414      var eventData = args[1];
415      for (var i = 0; i < events.length; i += 1) {
416        var event = events[i];
417        for (var j = 0; j < this.length; j += 1) {
418          var el = this[j];
419          var evt = (void 0);
420          try {
421            evt = new win.CustomEvent(event, {
422              detail: eventData,
423              bubbles: true,
424              cancelable: true,
425            });
426          } catch (e) {
427            evt = doc.createEvent('Event');
428            evt.initEvent(event, true, true);
429            evt.detail = eventData;
430          }
431          // eslint-disable-next-line
432          el.dom7EventData = args.filter(function (data, dataIndex) { return dataIndex > 0; });
433          el.dispatchEvent(evt);
434          el.dom7EventData = [];
435          delete el.dom7EventData;
436        }
437      }
438      return this;
439    }
440    function transitionEnd(callback) {
441      var events = ['webkitTransitionEnd', 'transitionend'];
442      var dom = this;
443      var i;
444      function fireCallBack(e) {
445        /* jshint validthis:true */
446        if (e.target !== this) { return; }
447        callback.call(this, e);
448        for (i = 0; i < events.length; i += 1) {
449          dom.off(events[i], fireCallBack);
450        }
451      }
452      if (callback) {
453        for (i = 0; i < events.length; i += 1) {
454          dom.on(events[i], fireCallBack);
455        }
456      }
457      return this;
458    }
459    function outerWidth(includeMargins) {
460      if (this.length > 0) {
461        if (includeMargins) {
462          // eslint-disable-next-line
463          var styles = this.styles();
464          return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));
465        }
466        return this[0].offsetWidth;
467      }
468      return null;
469    }
470    function outerHeight(includeMargins) {
471      if (this.length > 0) {
472        if (includeMargins) {
473          // eslint-disable-next-line
474          var styles = this.styles();
475          return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));
476        }
477        return this[0].offsetHeight;
478      }
479      return null;
480    }
481    function offset() {
482      if (this.length > 0) {
483        var el = this[0];
484        var box = el.getBoundingClientRect();
485        var body = doc.body;
486        var clientTop = el.clientTop || body.clientTop || 0;
487        var clientLeft = el.clientLeft || body.clientLeft || 0;
488        var scrollTop = el === win ? win.scrollY : el.scrollTop;
489        var scrollLeft = el === win ? win.scrollX : el.scrollLeft;
490        return {
491          top: (box.top + scrollTop) - clientTop,
492          left: (box.left + scrollLeft) - clientLeft,
493        };
494      }
495  
496      return null;
497    }
498    function styles() {
499      if (this[0]) { return win.getComputedStyle(this[0], null); }
500      return {};
501    }
502    function css(props, value) {
503      var i;
504      if (arguments.length === 1) {
505        if (typeof props === 'string') {
506          if (this[0]) { return win.getComputedStyle(this[0], null).getPropertyValue(props); }
507        } else {
508          for (i = 0; i < this.length; i += 1) {
509            // eslint-disable-next-line
510            for (var prop in props) {
511              this[i].style[prop] = props[prop];
512            }
513          }
514          return this;
515        }
516      }
517      if (arguments.length === 2 && typeof props === 'string') {
518        for (i = 0; i < this.length; i += 1) {
519          this[i].style[props] = value;
520        }
521        return this;
522      }
523      return this;
524    }
525    // Iterate over the collection passing elements to `callback`
526    function each(callback) {
527      // Don't bother continuing without a callback
528      if (!callback) { return this; }
529      // Iterate over the current collection
530      for (var i = 0; i < this.length; i += 1) {
531        // If the callback returns false
532        if (callback.call(this[i], i, this[i]) === false) {
533          // End the loop early
534          return this;
535        }
536      }
537      // Return `this` to allow chained DOM operations
538      return this;
539    }
540    // eslint-disable-next-line
541    function html(html) {
542      if (typeof html === 'undefined') {
543        return this[0] ? this[0].innerHTML : undefined;
544      }
545  
546      for (var i = 0; i < this.length; i += 1) {
547        this[i].innerHTML = html;
548      }
549      return this;
550    }
551    // eslint-disable-next-line
552    function text(text) {
553      if (typeof text === 'undefined') {
554        if (this[0]) {
555          return this[0].textContent.trim();
556        }
557        return null;
558      }
559  
560      for (var i = 0; i < this.length; i += 1) {
561        this[i].textContent = text;
562      }
563      return this;
564    }
565    function is(selector) {
566      var el = this[0];
567      var compareWith;
568      var i;
569      if (!el || typeof selector === 'undefined') { return false; }
570      if (typeof selector === 'string') {
571        if (el.matches) { return el.matches(selector); }
572        else if (el.webkitMatchesSelector) { return el.webkitMatchesSelector(selector); }
573        else if (el.msMatchesSelector) { return el.msMatchesSelector(selector); }
574  
575        compareWith = $(selector);
576        for (i = 0; i < compareWith.length; i += 1) {
577          if (compareWith[i] === el) { return true; }
578        }
579        return false;
580      } else if (selector === doc) { return el === doc; }
581      else if (selector === win) { return el === win; }
582  
583      if (selector.nodeType || selector instanceof Dom7) {
584        compareWith = selector.nodeType ? [selector] : selector;
585        for (i = 0; i < compareWith.length; i += 1) {
586          if (compareWith[i] === el) { return true; }
587        }
588        return false;
589      }
590      return false;
591    }
592    function index() {
593      var child = this[0];
594      var i;
595      if (child) {
596        i = 0;
597        // eslint-disable-next-line
598        while ((child = child.previousSibling) !== null) {
599          if (child.nodeType === 1) { i += 1; }
600        }
601        return i;
602      }
603      return undefined;
604    }
605    // eslint-disable-next-line
606    function eq(index) {
607      if (typeof index === 'undefined') { return this; }
608      var length = this.length;
609      var returnIndex;
610      if (index > length - 1) {
611        return new Dom7([]);
612      }
613      if (index < 0) {
614        returnIndex = length + index;
615        if (returnIndex < 0) { return new Dom7([]); }
616        return new Dom7([this[returnIndex]]);
617      }
618      return new Dom7([this[index]]);
619    }
620    function append() {
621      var args = [], len = arguments.length;
622      while ( len-- ) args[ len ] = arguments[ len ];
623  
624      var newChild;
625  
626      for (var k = 0; k < args.length; k += 1) {
627        newChild = args[k];
628        for (var i = 0; i < this.length; i += 1) {
629          if (typeof newChild === 'string') {
630            var tempDiv = doc.createElement('div');
631            tempDiv.innerHTML = newChild;
632            while (tempDiv.firstChild) {
633              this[i].appendChild(tempDiv.firstChild);
634            }
635          } else if (newChild instanceof Dom7) {
636            for (var j = 0; j < newChild.length; j += 1) {
637              this[i].appendChild(newChild[j]);
638            }
639          } else {
640            this[i].appendChild(newChild);
641          }
642        }
643      }
644  
645      return this;
646    }
647    function prepend(newChild) {
648      var i;
649      var j;
650      for (i = 0; i < this.length; i += 1) {
651        if (typeof newChild === 'string') {
652          var tempDiv = doc.createElement('div');
653          tempDiv.innerHTML = newChild;
654          for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {
655            this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);
656          }
657        } else if (newChild instanceof Dom7) {
658          for (j = 0; j < newChild.length; j += 1) {
659            this[i].insertBefore(newChild[j], this[i].childNodes[0]);
660          }
661        } else {
662          this[i].insertBefore(newChild, this[i].childNodes[0]);
663        }
664      }
665      return this;
666    }
667    function next(selector) {
668      if (this.length > 0) {
669        if (selector) {
670          if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {
671            return new Dom7([this[0].nextElementSibling]);
672          }
673          return new Dom7([]);
674        }
675  
676        if (this[0].nextElementSibling) { return new Dom7([this[0].nextElementSibling]); }
677        return new Dom7([]);
678      }
679      return new Dom7([]);
680    }
681    function nextAll(selector) {
682      var nextEls = [];
683      var el = this[0];
684      if (!el) { return new Dom7([]); }
685      while (el.nextElementSibling) {
686        var next = el.nextElementSibling; // eslint-disable-line
687        if (selector) {
688          if ($(next).is(selector)) { nextEls.push(next); }
689        } else { nextEls.push(next); }
690        el = next;
691      }
692      return new Dom7(nextEls);
693    }
694    function prev(selector) {
695      if (this.length > 0) {
696        var el = this[0];
697        if (selector) {
698          if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {
699            return new Dom7([el.previousElementSibling]);
700          }
701          return new Dom7([]);
702        }
703  
704        if (el.previousElementSibling) { return new Dom7([el.previousElementSibling]); }
705        return new Dom7([]);
706      }
707      return new Dom7([]);
708    }
709    function prevAll(selector) {
710      var prevEls = [];
711      var el = this[0];
712      if (!el) { return new Dom7([]); }
713      while (el.previousElementSibling) {
714        var prev = el.previousElementSibling; // eslint-disable-line
715        if (selector) {
716          if ($(prev).is(selector)) { prevEls.push(prev); }
717        } else { prevEls.push(prev); }
718        el = prev;
719      }
720      return new Dom7(prevEls);
721    }
722    function parent(selector) {
723      var parents = []; // eslint-disable-line
724      for (var i = 0; i < this.length; i += 1) {
725        if (this[i].parentNode !== null) {
726          if (selector) {
727            if ($(this[i].parentNode).is(selector)) { parents.push(this[i].parentNode); }
728          } else {
729            parents.push(this[i].parentNode);
730          }
731        }
732      }
733      return $(unique(parents));
734    }
735    function parents(selector) {
736      var parents = []; // eslint-disable-line
737      for (var i = 0; i < this.length; i += 1) {
738        var parent = this[i].parentNode; // eslint-disable-line
739        while (parent) {
740          if (selector) {
741            if ($(parent).is(selector)) { parents.push(parent); }
742          } else {
743            parents.push(parent);
744          }
745          parent = parent.parentNode;
746        }
747      }
748      return $(unique(parents));
749    }
750    function closest(selector) {
751      var closest = this; // eslint-disable-line
752      if (typeof selector === 'undefined') {
753        return new Dom7([]);
754      }
755      if (!closest.is(selector)) {
756        closest = closest.parents(selector).eq(0);
757      }
758      return closest;
759    }
760    function find(selector) {
761      var foundElements = [];
762      for (var i = 0; i < this.length; i += 1) {
763        var found = this[i].querySelectorAll(selector);
764        for (var j = 0; j < found.length; j += 1) {
765          foundElements.push(found[j]);
766        }
767      }
768      return new Dom7(foundElements);
769    }
770    function children(selector) {
771      var children = []; // eslint-disable-line
772      for (var i = 0; i < this.length; i += 1) {
773        var childNodes = this[i].childNodes;
774  
775        for (var j = 0; j < childNodes.length; j += 1) {
776          if (!selector) {
777            if (childNodes[j].nodeType === 1) { children.push(childNodes[j]); }
778          } else if (childNodes[j].nodeType === 1 && $(childNodes[j]).is(selector)) {
779            children.push(childNodes[j]);
780          }
781        }
782      }
783      return new Dom7(unique(children));
784    }
785    function remove() {
786      for (var i = 0; i < this.length; i += 1) {
787        if (this[i].parentNode) { this[i].parentNode.removeChild(this[i]); }
788      }
789      return this;
790    }
791    function add() {
792      var args = [], len = arguments.length;
793      while ( len-- ) args[ len ] = arguments[ len ];
794  
795      var dom = this;
796      var i;
797      var j;
798      for (i = 0; i < args.length; i += 1) {
799        var toAdd = $(args[i]);
800        for (j = 0; j < toAdd.length; j += 1) {
801          dom[dom.length] = toAdd[j];
802          dom.length += 1;
803        }
804      }
805      return dom;
806    }
807  
808    var Methods = {
809      addClass: addClass,
810      removeClass: removeClass,
811      hasClass: hasClass,
812      toggleClass: toggleClass,
813      attr: attr,
814      removeAttr: removeAttr,
815      data: data,
816      transform: transform,
817      transition: transition,
818      on: on,
819      off: off,
820      trigger: trigger,
821      transitionEnd: transitionEnd,
822      outerWidth: outerWidth,
823      outerHeight: outerHeight,
824      offset: offset,
825      css: css,
826      each: each,
827      html: html,
828      text: text,
829      is: is,
830      index: index,
831      eq: eq,
832      append: append,
833      prepend: prepend,
834      next: next,
835      nextAll: nextAll,
836      prev: prev,
837      prevAll: prevAll,
838      parent: parent,
839      parents: parents,
840      closest: closest,
841      find: find,
842      children: children,
843      remove: remove,
844      add: add,
845      styles: styles,
846    };
847  
848    Object.keys(Methods).forEach(function (methodName) {
849      $.fn[methodName] = $.fn[methodName] || Methods[methodName];
850    });
851  
852    var Utils = {
853      deleteProps: function deleteProps(obj) {
854        var object = obj;
855        Object.keys(object).forEach(function (key) {
856          try {
857            object[key] = null;
858          } catch (e) {
859            // no getter for object
860          }
861          try {
862            delete object[key];
863          } catch (e) {
864            // something got wrong
865          }
866        });
867      },
868      nextTick: function nextTick(callback, delay) {
869        if ( delay === void 0 ) delay = 0;
870  
871        return setTimeout(callback, delay);
872      },
873      now: function now() {
874        return Date.now();
875      },
876      getTranslate: function getTranslate(el, axis) {
877        if ( axis === void 0 ) axis = 'x';
878  
879        var matrix;
880        var curTransform;
881        var transformMatrix;
882  
883        var curStyle = win.getComputedStyle(el, null);
884  
885        if (win.WebKitCSSMatrix) {
886          curTransform = curStyle.transform || curStyle.webkitTransform;
887          if (curTransform.split(',').length > 6) {
888            curTransform = curTransform.split(', ').map(function (a) { return a.replace(',', '.'); }).join(', ');
889          }
890          // Some old versions of Webkit choke when 'none' is passed; pass
891          // empty string instead in this case
892          transformMatrix = new win.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
893        } else {
894          transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
895          matrix = transformMatrix.toString().split(',');
896        }
897  
898        if (axis === 'x') {
899          // Latest Chrome and webkits Fix
900          if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m41; }
901          // Crazy IE10 Matrix
902          else if (matrix.length === 16) { curTransform = parseFloat(matrix[12]); }
903          // Normal Browsers
904          else { curTransform = parseFloat(matrix[4]); }
905        }
906        if (axis === 'y') {
907          // Latest Chrome and webkits Fix
908          if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m42; }
909          // Crazy IE10 Matrix
910          else if (matrix.length === 16) { curTransform = parseFloat(matrix[13]); }
911          // Normal Browsers
912          else { curTransform = parseFloat(matrix[5]); }
913        }
914        return curTransform || 0;
915      },
916      parseUrlQuery: function parseUrlQuery(url) {
917        var query = {};
918        var urlToParse = url || win.location.href;
919        var i;
920        var params;
921        var param;
922        var length;
923        if (typeof urlToParse === 'string' && urlToParse.length) {
924          urlToParse = urlToParse.indexOf('?') > -1 ? urlToParse.replace(/\S*\?/, '') : '';
925          params = urlToParse.split('&').filter(function (paramsPart) { return paramsPart !== ''; });
926          length = params.length;
927  
928          for (i = 0; i < length; i += 1) {
929            param = params[i].replace(/#\S+/g, '').split('=');
930            query[decodeURIComponent(param[0])] = typeof param[1] === 'undefined' ? undefined : decodeURIComponent(param[1]) || '';
931          }
932        }
933        return query;
934      },
935      isObject: function isObject(o) {
936        return typeof o === 'object' && o !== null && o.constructor && o.constructor === Object;
937      },
938      extend: function extend() {
939        var args = [], len$1 = arguments.length;
940        while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ];
941  
942        var to = Object(args[0]);
943        for (var i = 1; i < args.length; i += 1) {
944          var nextSource = args[i];
945          if (nextSource !== undefined && nextSource !== null) {
946            var keysArray = Object.keys(Object(nextSource));
947            for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
948              var nextKey = keysArray[nextIndex];
949              var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
950              if (desc !== undefined && desc.enumerable) {
951                if (Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {
952                  Utils.extend(to[nextKey], nextSource[nextKey]);
953                } else if (!Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {
954                  to[nextKey] = {};
955                  Utils.extend(to[nextKey], nextSource[nextKey]);
956                } else {
957                  to[nextKey] = nextSource[nextKey];
958                }
959              }
960            }
961          }
962        }
963        return to;
964      },
965    };
966  
967    var Support = (function Support() {
968      var testDiv = doc.createElement('div');
969      return {
970        touch: (win.Modernizr && win.Modernizr.touch === true) || (function checkTouch() {
971          return !!((win.navigator.maxTouchPoints > 0) || ('ontouchstart' in win) || (win.DocumentTouch && doc instanceof win.DocumentTouch));
972        }()),
973  
974        pointerEvents: !!(win.navigator.pointerEnabled || win.PointerEvent || ('maxTouchPoints' in win.navigator && win.navigator.maxTouchPoints > 0)),
975        prefixedPointerEvents: !!win.navigator.msPointerEnabled,
976  
977        transition: (function checkTransition() {
978          var style = testDiv.style;
979          return ('transition' in style || 'webkitTransition' in style || 'MozTransition' in style);
980        }()),
981        transforms3d: (win.Modernizr && win.Modernizr.csstransforms3d === true) || (function checkTransforms3d() {
982          var style = testDiv.style;
983          return ('webkitPerspective' in style || 'MozPerspective' in style || 'OPerspective' in style || 'MsPerspective' in style || 'perspective' in style);
984        }()),
985  
986        flexbox: (function checkFlexbox() {
987          var style = testDiv.style;
988          var styles = ('alignItems webkitAlignItems webkitBoxAlign msFlexAlign mozBoxAlign webkitFlexDirection msFlexDirection mozBoxDirection mozBoxOrient webkitBoxDirection webkitBoxOrient').split(' ');
989          for (var i = 0; i < styles.length; i += 1) {
990            if (styles[i] in style) { return true; }
991          }
992          return false;
993        }()),
994  
995        observer: (function checkObserver() {
996          return ('MutationObserver' in win || 'WebkitMutationObserver' in win);
997        }()),
998  
999        passiveListener: (function checkPassiveListener() {
1000          var supportsPassive = false;
1001          try {
1002            var opts = Object.defineProperty({}, 'passive', {
1003              // eslint-disable-next-line
1004              get: function get() {
1005                supportsPassive = true;
1006              },
1007            });
1008            win.addEventListener('testPassiveListener', null, opts);
1009          } catch (e) {
1010            // No support
1011          }
1012          return supportsPassive;
1013        }()),
1014  
1015        gestures: (function checkGestures() {
1016          return 'ongesturestart' in win;
1017        }()),
1018      };
1019    }());
1020  
1021    var Browser = (function Browser() {
1022      function isSafari() {
1023        var ua = win.navigator.userAgent.toLowerCase();
1024        return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0);
1025      }
1026      return {
1027        isIE: !!win.navigator.userAgent.match(/Trident/g) || !!win.navigator.userAgent.match(/MSIE/g),
1028        isEdge: !!win.navigator.userAgent.match(/Edge/g),
1029        isSafari: isSafari(),
1030        isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(win.navigator.userAgent),
1031      };
1032    }());
1033  
1034    var SwiperClass = function SwiperClass(params) {
1035      if ( params === void 0 ) params = {};
1036  
1037      var self = this;
1038      self.params = params;
1039  
1040      // Events
1041      self.eventsListeners = {};
1042  
1043      if (self.params && self.params.on) {
1044        Object.keys(self.params.on).forEach(function (eventName) {
1045          self.on(eventName, self.params.on[eventName]);
1046        });
1047      }
1048    };
1049  
1050    var staticAccessors = { components: { configurable: true } };
1051  
1052    SwiperClass.prototype.on = function on (events, handler, priority) {
1053      var self = this;
1054      if (typeof handler !== 'function') { return self; }
1055      var method = priority ? 'unshift' : 'push';
1056      events.split(' ').forEach(function (event) {
1057        if (!self.eventsListeners[event]) { self.eventsListeners[event] = []; }
1058        self.eventsListeners[event][method](handler);
1059      });
1060      return self;
1061    };
1062  
1063    SwiperClass.prototype.once = function once (events, handler, priority) {
1064      var self = this;
1065      if (typeof handler !== 'function') { return self; }
1066      function onceHandler() {
1067          var args = [], len = arguments.length;
1068          while ( len-- ) args[ len ] = arguments[ len ];
1069  
1070        handler.apply(self, args);
1071        self.off(events, onceHandler);
1072        if (onceHandler.f7proxy) {
1073          delete onceHandler.f7proxy;
1074        }
1075      }
1076      onceHandler.f7proxy = handler;
1077      return self.on(events, onceHandler, priority);
1078    };
1079  
1080    SwiperClass.prototype.off = function off (events, handler) {
1081      var self = this;
1082      if (!self.eventsListeners) { return self; }
1083      events.split(' ').forEach(function (event) {
1084        if (typeof handler === 'undefined') {
1085          self.eventsListeners[event] = [];
1086        } else if (self.eventsListeners[event] && self.eventsListeners[event].length) {
1087          self.eventsListeners[event].forEach(function (eventHandler, index) {
1088            if (eventHandler === handler || (eventHandler.f7proxy && eventHandler.f7proxy === handler)) {
1089              self.eventsListeners[event].splice(index, 1);
1090            }
1091          });
1092        }
1093      });
1094      return self;
1095    };
1096  
1097    SwiperClass.prototype.emit = function emit () {
1098        var args = [], len = arguments.length;
1099        while ( len-- ) args[ len ] = arguments[ len ];
1100  
1101      var self = this;
1102      if (!self.eventsListeners) { return self; }
1103      var events;
1104      var data;
1105      var context;
1106      if (typeof args[0] === 'string' || Array.isArray(args[0])) {
1107        events = args[0];
1108        data = args.slice(1, args.length);
1109        context = self;
1110      } else {
1111        events = args[0].events;
1112        data = args[0].data;
1113        context = args[0].context || self;
1114      }
1115      var eventsArray = Array.isArray(events) ? events : events.split(' ');
1116      eventsArray.forEach(function (event) {
1117        if (self.eventsListeners && self.eventsListeners[event]) {
1118          var handlers = [];
1119          self.eventsListeners[event].forEach(function (eventHandler) {
1120            handlers.push(eventHandler);
1121          });
1122          handlers.forEach(function (eventHandler) {
1123            eventHandler.apply(context, data);
1124          });
1125        }
1126      });
1127      return self;
1128    };
1129  
1130    SwiperClass.prototype.useModulesParams = function useModulesParams (instanceParams) {
1131      var instance = this;
1132      if (!instance.modules) { return; }
1133      Object.keys(instance.modules).forEach(function (moduleName) {
1134        var module = instance.modules[moduleName];
1135        // Extend params
1136        if (module.params) {
1137          Utils.extend(instanceParams, module.params);
1138        }
1139      });
1140    };
1141  
1142    SwiperClass.prototype.useModules = function useModules (modulesParams) {
1143        if ( modulesParams === void 0 ) modulesParams = {};
1144  
1145      var instance = this;
1146      if (!instance.modules) { return; }
1147      Object.keys(instance.modules).forEach(function (moduleName) {
1148        var module = instance.modules[moduleName];
1149        var moduleParams = modulesParams[moduleName] || {};
1150        // Extend instance methods and props
1151        if (module.instance) {
1152          Object.keys(module.instance).forEach(function (modulePropName) {
1153            var moduleProp = module.instance[modulePropName];
1154            if (typeof moduleProp === 'function') {
1155              instance[modulePropName] = moduleProp.bind(instance);
1156            } else {
1157              instance[modulePropName] = moduleProp;
1158            }
1159          });
1160        }
1161        // Add event listeners
1162        if (module.on && instance.on) {
1163          Object.keys(module.on).forEach(function (moduleEventName) {
1164            instance.on(moduleEventName, module.on[moduleEventName]);
1165          });
1166        }
1167  
1168        // Module create callback
1169        if (module.create) {
1170          module.create.bind(instance)(moduleParams);
1171        }
1172      });
1173    };
1174  
1175    staticAccessors.components.set = function (components) {
1176      var Class = this;
1177      if (!Class.use) { return; }
1178      Class.use(components);
1179    };
1180  
1181    SwiperClass.installModule = function installModule (module) {
1182        var params = [], len = arguments.length - 1;
1183        while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];
1184  
1185      var Class = this;
1186      if (!Class.prototype.modules) { Class.prototype.modules = {}; }
1187      var name = module.name || (((Object.keys(Class.prototype.modules).length) + "_" + (Utils.now())));
1188      Class.prototype.modules[name] = module;
1189      // Prototype
1190      if (module.proto) {
1191        Object.keys(module.proto).forEach(function (key) {
1192          Class.prototype[key] = module.proto[key];
1193        });
1194      }
1195      // Class
1196      if (module.static) {
1197        Object.keys(module.static).forEach(function (key) {
1198          Class[key] = module.static[key];
1199        });
1200      }
1201      // Callback
1202      if (module.install) {
1203        module.install.apply(Class, params);
1204      }
1205      return Class;
1206    };
1207  
1208    SwiperClass.use = function use (module) {
1209        var params = [], len = arguments.length - 1;
1210        while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];
1211  
1212      var Class = this;
1213      if (Array.isArray(module)) {
1214        module.forEach(function (m) { return Class.installModule(m); });
1215        return Class;
1216      }
1217      return Class.installModule.apply(Class, [ module ].concat( params ));
1218    };
1219  
1220    Object.defineProperties( SwiperClass, staticAccessors );
1221  
1222    function updateSize () {
1223      var swiper = this;
1224      var width;
1225      var height;
1226      var $el = swiper.$el;
1227      if (typeof swiper.params.width !== 'undefined') {
1228        width = swiper.params.width;
1229      } else {
1230        width = $el[0].clientWidth;
1231      }
1232      if (typeof swiper.params.height !== 'undefined') {
1233        height = swiper.params.height;
1234      } else {
1235        height = $el[0].clientHeight;
1236      }
1237      if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {
1238        return;
1239      }
1240  
1241      // Subtract paddings
1242      width = width - parseInt($el.css('padding-left'), 10) - parseInt($el.css('padding-right'), 10);
1243      height = height - parseInt($el.css('padding-top'), 10) - parseInt($el.css('padding-bottom'), 10);
1244  
1245      Utils.extend(swiper, {
1246        width: width,
1247        height: height,
1248        size: swiper.isHorizontal() ? width : height,
1249      });
1250    }
1251  
1252    function updateSlides () {
1253      var swiper = this;
1254      var params = swiper.params;
1255  
1256      var $wrapperEl = swiper.$wrapperEl;
1257      var swiperSize = swiper.size;
1258      var rtl = swiper.rtlTranslate;
1259      var wrongRTL = swiper.wrongRTL;
1260      var isVirtual = swiper.virtual && params.virtual.enabled;
1261      var previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
1262      var slides = $wrapperEl.children(("." + (swiper.params.slideClass)));
1263      var slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
1264      var snapGrid = [];
1265      var slidesGrid = [];
1266      var slidesSizesGrid = [];
1267  
1268      var offsetBefore = params.slidesOffsetBefore;
1269      if (typeof offsetBefore === 'function') {
1270        offsetBefore = params.slidesOffsetBefore.call(swiper);
1271      }
1272  
1273      var offsetAfter = params.slidesOffsetAfter;
1274      if (typeof offsetAfter === 'function') {
1275        offsetAfter = params.slidesOffsetAfter.call(swiper);
1276      }
1277  
1278      var previousSnapGridLength = swiper.snapGrid.length;
1279      var previousSlidesGridLength = swiper.snapGrid.length;
1280  
1281      var spaceBetween = params.spaceBetween;
1282      var slidePosition = -offsetBefore;
1283      var prevSlideSize = 0;
1284      var index = 0;
1285      if (typeof swiperSize === 'undefined') {
1286        return;
1287      }
1288      if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
1289        spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;
1290      }
1291  
1292      swiper.virtualSize = -spaceBetween;
1293  
1294      // reset margins
1295      if (rtl) { slides.css({ marginLeft: '', marginTop: '' }); }
1296      else { slides.css({ marginRight: '', marginBottom: '' }); }
1297  
1298      var slidesNumberEvenToRows;
1299      if (params.slidesPerColumn > 1) {
1300        if (Math.floor(slidesLength / params.slidesPerColumn) === slidesLength / swiper.params.slidesPerColumn) {
1301          slidesNumberEvenToRows = slidesLength;
1302        } else {
1303          slidesNumberEvenToRows = Math.ceil(slidesLength / params.slidesPerColumn) * params.slidesPerColumn;
1304        }
1305        if (params.slidesPerView !== 'auto' && params.slidesPerColumnFill === 'row') {
1306          slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, params.slidesPerView * params.slidesPerColumn);
1307        }
1308      }
1309  
1310      // Calc slides
1311      var slideSize;
1312      var slidesPerColumn = params.slidesPerColumn;
1313      var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn;
1314      var numFullColumns = Math.floor(slidesLength / params.slidesPerColumn);
1315      for (var i = 0; i < slidesLength; i += 1) {
1316        slideSize = 0;
1317        var slide = slides.eq(i);
1318        if (params.slidesPerColumn > 1) {
1319          // Set slides order
1320          var newSlideOrderIndex = (void 0);
1321          var column = (void 0);
1322          var row = (void 0);
1323          if (
1324            (params.slidesPerColumnFill === 'column')
1325            || (params.slidesPerColumnFill === 'row' && params.slidesPerGroup > 1)
1326          ) {
1327            if (params.slidesPerColumnFill === 'column') {
1328              column = Math.floor(i / slidesPerColumn);
1329              row = i - (column * slidesPerColumn);
1330              if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn - 1)) {
1331                row += 1;
1332                if (row >= slidesPerColumn) {
1333                  row = 0;
1334                  column += 1;
1335                }
1336              }
1337            } else {
1338              var groupIndex = Math.floor(i / params.slidesPerGroup);
1339              row = Math.floor(i / params.slidesPerView) - groupIndex * params.slidesPerColumn;
1340              column = i - row * params.slidesPerView - groupIndex * params.slidesPerView;
1341            }
1342            newSlideOrderIndex = column + ((row * slidesNumberEvenToRows) / slidesPerColumn);
1343            slide
1344              .css({
1345                '-webkit-box-ordinal-group': newSlideOrderIndex,
1346                '-moz-box-ordinal-group': newSlideOrderIndex,
1347                '-ms-flex-order': newSlideOrderIndex,
1348                '-webkit-order': newSlideOrderIndex,
1349                order: newSlideOrderIndex,
1350              });
1351          } else {
1352            row = Math.floor(i / slidesPerRow);
1353            column = i - (row * slidesPerRow);
1354          }
1355          slide
1356            .css(
1357              ("margin-" + (swiper.isHorizontal() ? 'top' : 'left')),
1358              (row !== 0 && params.spaceBetween) && (((params.spaceBetween) + "px"))
1359            )
1360            .attr('data-swiper-column', column)
1361            .attr('data-swiper-row', row);
1362        }
1363        if (slide.css('display') === 'none') { continue; } // eslint-disable-line
1364  
1365        if (params.slidesPerView === 'auto') {
1366          var slideStyles = win.getComputedStyle(slide[0], null);
1367          var currentTransform = slide[0].style.transform;
1368          var currentWebKitTransform = slide[0].style.webkitTransform;
1369          if (currentTransform) {
1370            slide[0].style.transform = 'none';
1371          }
1372          if (currentWebKitTransform) {
1373            slide[0].style.webkitTransform = 'none';
1374          }
1375          if (params.roundLengths) {
1376            slideSize = swiper.isHorizontal()
1377              ? slide.outerWidth(true)
1378              : slide.outerHeight(true);
1379          } else {
1380            // eslint-disable-next-line
1381            if (swiper.isHorizontal()) {
1382              var width = parseFloat(slideStyles.getPropertyValue('width'));
1383              var paddingLeft = parseFloat(slideStyles.getPropertyValue('padding-left'));
1384              var paddingRight = parseFloat(slideStyles.getPropertyValue('padding-right'));
1385              var marginLeft = parseFloat(slideStyles.getPropertyValue('margin-left'));
1386              var marginRight = parseFloat(slideStyles.getPropertyValue('margin-right'));
1387              var boxSizing = slideStyles.getPropertyValue('box-sizing');
1388              if (boxSizing && boxSizing === 'border-box' && !Browser.isIE) {
1389                slideSize = width + marginLeft + marginRight;
1390              } else {
1391                slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight;
1392              }
1393            } else {
1394              var height = parseFloat(slideStyles.getPropertyValue('height'));
1395              var paddingTop = parseFloat(slideStyles.getPropertyValue('padding-top'));
1396              var paddingBottom = parseFloat(slideStyles.getPropertyValue('padding-bottom'));
1397              var marginTop = parseFloat(slideStyles.getPropertyValue('margin-top'));
1398              var marginBottom = parseFloat(slideStyles.getPropertyValue('margin-bottom'));
1399              var boxSizing$1 = slideStyles.getPropertyValue('box-sizing');
1400              if (boxSizing$1 && boxSizing$1 === 'border-box' && !Browser.isIE) {
1401                slideSize = height + marginTop + marginBottom;
1402              } else {
1403                slideSize = height + paddingTop + paddingBottom + marginTop + marginBottom;
1404              }
1405            }
1406          }
1407          if (currentTransform) {
1408            slide[0].style.transform = currentTransform;
1409          }
1410          if (currentWebKitTransform) {
1411            slide[0].style.webkitTransform = currentWebKitTransform;
1412          }
1413          if (params.roundLengths) { slideSize = Math.floor(slideSize); }
1414        } else {
1415          slideSize = (swiperSize - ((params.slidesPerView - 1) * spaceBetween)) / params.slidesPerView;
1416          if (params.roundLengths) { slideSize = Math.floor(slideSize); }
1417  
1418          if (slides[i]) {
1419            if (swiper.isHorizontal()) {
1420              slides[i].style.width = slideSize + "px";
1421            } else {
1422              slides[i].style.height = slideSize + "px";
1423            }
1424          }
1425        }
1426        if (slides[i]) {
1427          slides[i].swiperSlideSize = slideSize;
1428        }
1429        slidesSizesGrid.push(slideSize);
1430  
1431  
1432        if (params.centeredSlides) {
1433          slidePosition = slidePosition + (slideSize / 2) + (prevSlideSize / 2) + spaceBetween;
1434          if (prevSlideSize === 0 && i !== 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }
1435          if (i === 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }
1436          if (Math.abs(slidePosition) < 1 / 1000) { slidePosition = 0; }
1437          if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }
1438          if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }
1439          slidesGrid.push(slidePosition);
1440        } else {
1441          if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }
1442          if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }
1443          slidesGrid.push(slidePosition);
1444          slidePosition = slidePosition + slideSize + spaceBetween;
1445        }
1446  
1447        swiper.virtualSize += slideSize + spaceBetween;
1448  
1449        prevSlideSize = slideSize;
1450  
1451        index += 1;
1452      }
1453      swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
1454      var newSlidesGrid;
1455  
1456      if (
1457        rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {
1458        $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") });
1459      }
1460      if (!Support.flexbox || params.setWrapperSize) {
1461        if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
1462        else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
1463      }
1464  
1465      if (params.slidesPerColumn > 1) {
1466        swiper.virtualSize = (slideSize + params.spaceBetween) * slidesNumberEvenToRows;
1467        swiper.virtualSize = Math.ceil(swiper.virtualSize / params.slidesPerColumn) - params.spaceBetween;
1468        if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
1469        else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
1470        if (params.centeredSlides) {
1471          newSlidesGrid = [];
1472          for (var i$1 = 0; i$1 < snapGrid.length; i$1 += 1) {
1473            var slidesGridItem = snapGrid[i$1];
1474            if (params.roundLengths) { slidesGridItem = Math.floor(slidesGridItem); }
1475            if (snapGrid[i$1] < swiper.virtualSize + snapGrid[0]) { newSlidesGrid.push(slidesGridItem); }
1476          }
1477          snapGrid = newSlidesGrid;
1478        }
1479      }
1480  
1481      // Remove last grid elements depending on width
1482      if (!params.centeredSlides) {
1483        newSlidesGrid = [];
1484        for (var i$2 = 0; i$2 < snapGrid.length; i$2 += 1) {
1485          var slidesGridItem$1 = snapGrid[i$2];
1486          if (params.roundLengths) { slidesGridItem$1 = Math.floor(slidesGridItem$1); }
1487          if (snapGrid[i$2] <= swiper.virtualSize - swiperSize) {
1488            newSlidesGrid.push(slidesGridItem$1);
1489          }
1490        }
1491        snapGrid = newSlidesGrid;
1492        if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
1493          snapGrid.push(swiper.virtualSize - swiperSize);
1494        }
1495      }
1496      if (snapGrid.length === 0) { snapGrid = [0]; }
1497  
1498      if (params.spaceBetween !== 0) {
1499        if (swiper.isHorizontal()) {
1500          if (rtl) { slides.css({ marginLeft: (spaceBetween + "px") }); }
1501          else { slides.css({ marginRight: (spaceBetween + "px") }); }
1502        } else { slides.css({ marginBottom: (spaceBetween + "px") }); }
1503      }
1504  
1505      if (params.centerInsufficientSlides) {
1506        var allSlidesSize = 0;
1507        slidesSizesGrid.forEach(function (slideSizeValue) {
1508          allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);
1509        });
1510        allSlidesSize -= params.spaceBetween;
1511        if (allSlidesSize < swiperSize) {
1512          var allSlidesOffset = (swiperSize - allSlidesSize) / 2;
1513          snapGrid.forEach(function (snap, snapIndex) {
1514            snapGrid[snapIndex] = snap - allSlidesOffset;
1515          });
1516          slidesGrid.forEach(function (snap, snapIndex) {
1517            slidesGrid[snapIndex] = snap + allSlidesOffset;
1518          });
1519        }
1520      }
1521  
1522      Utils.extend(swiper, {
1523        slides: slides,
1524        snapGrid: snapGrid,
1525        slidesGrid: slidesGrid,
1526        slidesSizesGrid: slidesSizesGrid,
1527      });
1528  
1529      if (slidesLength !== previousSlidesLength) {
1530        swiper.emit('slidesLengthChange');
1531      }
1532      if (snapGrid.length !== previousSnapGridLength) {
1533        if (swiper.params.watchOverflow) { swiper.checkOverflow(); }
1534        swiper.emit('snapGridLengthChange');
1535      }
1536      if (slidesGrid.length !== previousSlidesGridLength) {
1537        swiper.emit('slidesGridLengthChange');
1538      }
1539  
1540      if (params.watchSlidesProgress || params.watchSlidesVisibility) {
1541        swiper.updateSlidesOffset();
1542      }
1543    }
1544  
1545    function updateAutoHeight (speed) {
1546      var swiper = this;
1547      var activeSlides = [];
1548      var newHeight = 0;
1549      var i;
1550      if (typeof speed === 'number') {
1551        swiper.setTransition(speed);
1552      } else if (speed === true) {
1553        swiper.setTransition(swiper.params.speed);
1554      }
1555      // Find slides currently in view
1556      if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {
1557        for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {
1558          var index = swiper.activeIndex + i;
1559          if (index > swiper.slides.length) { break; }
1560          activeSlides.push(swiper.slides.eq(index)[0]);
1561        }
1562      } else {
1563        activeSlides.push(swiper.slides.eq(swiper.activeIndex)[0]);
1564      }
1565  
1566      // Find new height from highest slide in view
1567      for (i = 0; i < activeSlides.length; i += 1) {
1568        if (typeof activeSlides[i] !== 'undefined') {
1569          var height = activeSlides[i].offsetHeight;
1570          newHeight = height > newHeight ? height : newHeight;
1571        }
1572      }
1573  
1574      // Update Height
1575      if (newHeight) { swiper.$wrapperEl.css('height', (newHeight + "px")); }
1576    }
1577  
1578    function updateSlidesOffset () {
1579      var swiper = this;
1580      var slides = swiper.slides;
1581      for (var i = 0; i < slides.length; i += 1) {
1582        slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop;
1583      }
1584    }
1585  
1586    function updateSlidesProgress (translate) {
1587      var swiper = this;
1588      var params = swiper.params;
1589      if (typeof translate === 'undefined') {
1590        // eslint-disable-next-line
1591        translate = (swiper && swiper.translate) || 0;
1592      }
1593  
1594      var slides = swiper.slides;
1595      var rtl = swiper.rtlTranslate;
1596  
1597      if (slides.length === 0) { return; }
1598      if (typeof slides[0].swiperSlideOffset === 'undefined') { swiper.updateSlidesOffset(); }
1599  
1600      var offsetCenter = -translate;
1601      if (rtl) { offsetCenter = translate; }
1602  
1603      // Visible Slides
1604      slides.removeClass(params.slideVisibleClass);
1605  
1606      swiper.visibleSlidesIndexes = [];
1607      swiper.visibleSlides = [];
1608  
1609      for (var i = 0; i < slides.length; i += 1) {
1610        var slide = slides[i];
1611        var slideProgress = (
1612          (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0)) - slide.swiperSlideOffset
1613        ) / (slide.swiperSlideSize + params.spaceBetween);
1614        if (params.watchSlidesVisibility) {
1615          var slideBefore = -(offsetCenter - slide.swiperSlideOffset);
1616          var slideAfter = slideBefore + swiper.slidesSizesGrid[i];
1617          var isVisible = (slideBefore >= 0 && slideBefore < swiper.size - 1)
1618                    || (slideAfter > 1 && slideAfter <= swiper.size)
1619                    || (slideBefore <= 0 && slideAfter >= swiper.size);
1620          if (isVisible) {
1621            swiper.visibleSlides.push(slide);
1622            swiper.visibleSlidesIndexes.push(i);
1623            slides.eq(i).addClass(params.slideVisibleClass);
1624          }
1625        }
1626        slide.progress = rtl ? -slideProgress : slideProgress;
1627      }
1628      swiper.visibleSlides = $(swiper.visibleSlides);
1629    }
1630  
1631    function updateProgress (translate) {
1632      var swiper = this;
1633      var params = swiper.params;
1634  
1635      if (typeof translate === 'undefined') {
1636        var multiplier = swiper.rtlTranslate ? -1 : 1;
1637        // eslint-disable-next-line
1638        translate = (swiper && swiper.translate && (swiper.translate * multiplier)) || 0;
1639      }
1640  
1641      var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
1642      var progress = swiper.progress;
1643      var isBeginning = swiper.isBeginning;
1644      var isEnd = swiper.isEnd;
1645      var wasBeginning = isBeginning;
1646      var wasEnd = isEnd;
1647      if (translatesDiff === 0) {
1648        progress = 0;
1649        isBeginning = true;
1650        isEnd = true;
1651      } else {
1652        progress = (translate - swiper.minTranslate()) / (translatesDiff);
1653        isBeginning = progress <= 0;
1654        isEnd = progress >= 1;
1655      }
1656      Utils.extend(swiper, {
1657        progress: progress,
1658        isBeginning: isBeginning,
1659        isEnd: isEnd,
1660      });
1661  
1662      if (params.watchSlidesProgress || params.watchSlidesVisibility) { swiper.updateSlidesProgress(translate); }
1663  
1664      if (isBeginning && !wasBeginning) {
1665        swiper.emit('reachBeginning toEdge');
1666      }
1667      if (isEnd && !wasEnd) {
1668        swiper.emit('reachEnd toEdge');
1669      }
1670      if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {
1671        swiper.emit('fromEdge');
1672      }
1673  
1674      swiper.emit('progress', progress);
1675    }
1676  
1677    function updateSlidesClasses () {
1678      var swiper = this;
1679  
1680      var slides = swiper.slides;
1681      var params = swiper.params;
1682      var $wrapperEl = swiper.$wrapperEl;
1683      var activeIndex = swiper.activeIndex;
1684      var realIndex = swiper.realIndex;
1685      var isVirtual = swiper.virtual && params.virtual.enabled;
1686  
1687      slides.removeClass(((params.slideActiveClass) + " " + (params.slideNextClass) + " " + (params.slidePrevClass) + " " + (params.slideDuplicateActiveClass) + " " + (params.slideDuplicateNextClass) + " " + (params.slideDuplicatePrevClass)));
1688  
1689      var activeSlide;
1690      if (isVirtual) {
1691        activeSlide = swiper.$wrapperEl.find(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + activeIndex + "\"]"));
1692      } else {
1693        activeSlide = slides.eq(activeIndex);
1694      }
1695  
1696      // Active classes
1697      activeSlide.addClass(params.slideActiveClass);
1698  
1699      if (params.loop) {
1700        // Duplicate to all looped slides
1701        if (activeSlide.hasClass(params.slideDuplicateClass)) {
1702          $wrapperEl
1703            .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + realIndex + "\"]"))
1704            .addClass(params.slideDuplicateActiveClass);
1705        } else {
1706          $wrapperEl
1707            .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]"))
1708            .addClass(params.slideDuplicateActiveClass);
1709        }
1710      }
1711      // Next Slide
1712      var nextSlide = activeSlide.nextAll(("." + (params.slideClass))).eq(0).addClass(params.slideNextClass);
1713      if (params.loop && nextSlide.length === 0) {
1714        nextSlide = slides.eq(0);
1715        nextSlide.addClass(params.slideNextClass);
1716      }
1717      // Prev Slide
1718      var prevSlide = activeSlide.prevAll(("." + (params.slideClass))).eq(0).addClass(params.slidePrevClass);
1719      if (params.loop && prevSlide.length === 0) {
1720        prevSlide = slides.eq(-1);
1721        prevSlide.addClass(params.slidePrevClass);
1722      }
1723      if (params.loop) {
1724        // Duplicate to all looped slides
1725        if (nextSlide.hasClass(params.slideDuplicateClass)) {
1726          $wrapperEl
1727            .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (nextSlide.attr('data-swiper-slide-index')) + "\"]"))
1728            .addClass(params.slideDuplicateNextClass);
1729        } else {
1730          $wrapperEl
1731            .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (nextSlide.attr('data-swiper-slide-index')) + "\"]"))
1732            .addClass(params.slideDuplicateNextClass);
1733        }
1734        if (prevSlide.hasClass(params.slideDuplicateClass)) {
1735          $wrapperEl
1736            .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (prevSlide.attr('data-swiper-slide-index')) + "\"]"))
1737            .addClass(params.slideDuplicatePrevClass);
1738        } else {
1739          $wrapperEl
1740            .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (prevSlide.attr('data-swiper-slide-index')) + "\"]"))
1741            .addClass(params.slideDuplicatePrevClass);
1742        }
1743      }
1744    }
1745  
1746    function updateActiveIndex (newActiveIndex) {
1747      var swiper = this;
1748      var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
1749      var slidesGrid = swiper.slidesGrid;
1750      var snapGrid = swiper.snapGrid;
1751      var params = swiper.params;
1752      var previousIndex = swiper.activeIndex;
1753      var previousRealIndex = swiper.realIndex;
1754      var previousSnapIndex = swiper.snapIndex;
1755      var activeIndex = newActiveIndex;
1756      var snapIndex;
1757      if (typeof activeIndex === 'undefined') {
1758        for (var i = 0; i < slidesGrid.length; i += 1) {
1759          if (typeof slidesGrid[i + 1] !== 'undefined') {
1760            if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - ((slidesGrid[i + 1] - slidesGrid[i]) / 2)) {
1761              activeIndex = i;
1762            } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {
1763              activeIndex = i + 1;
1764            }
1765          } else if (translate >= slidesGrid[i]) {
1766            activeIndex = i;
1767          }
1768        }
1769        // Normalize slideIndex
1770        if (params.normalizeSlideIndex) {
1771          if (activeIndex < 0 || typeof activeIndex === 'undefined') { activeIndex = 0; }
1772        }
1773      }
1774      if (snapGrid.indexOf(translate) >= 0) {
1775        snapIndex = snapGrid.indexOf(translate);
1776      } else {
1777        snapIndex = Math.floor(activeIndex / params.slidesPerGroup);
1778      }
1779      if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }
1780      if (activeIndex === previousIndex) {
1781        if (snapIndex !== previousSnapIndex) {
1782          swiper.snapIndex = snapIndex;
1783          swiper.emit('snapIndexChange');
1784        }
1785        return;
1786      }
1787  
1788      // Get real index
1789      var realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10);
1790  
1791      Utils.extend(swiper, {
1792        snapIndex: snapIndex,
1793        realIndex: realIndex,
1794        previousIndex: previousIndex,
1795        activeIndex: activeIndex,
1796      });
1797      swiper.emit('activeIndexChange');
1798      swiper.emit('snapIndexChange');
1799      if (previousRealIndex !== realIndex) {
1800        swiper.emit('realIndexChange');
1801      }
1802      if (swiper.initialized || swiper.runCallbacksOnInit) {
1803        swiper.emit('slideChange');
1804      }
1805    }
1806  
1807    function updateClickedSlide (e) {
1808      var swiper = this;
1809      var params = swiper.params;
1810      var slide = $(e.target).closest(("." + (params.slideClass)))[0];
1811      var slideFound = false;
1812      if (slide) {
1813        for (var i = 0; i < swiper.slides.length; i += 1) {
1814          if (swiper.slides[i] === slide) { slideFound = true; }
1815        }
1816      }
1817  
1818      if (slide && slideFound) {
1819        swiper.clickedSlide = slide;
1820        if (swiper.virtual && swiper.params.virtual.enabled) {
1821          swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);
1822        } else {
1823          swiper.clickedIndex = $(slide).index();
1824        }
1825      } else {
1826        swiper.clickedSlide = undefined;
1827        swiper.clickedIndex = undefined;
1828        return;
1829      }
1830      if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {
1831        swiper.slideToClickedSlide();
1832      }
1833    }
1834  
1835    var update = {
1836      updateSize: updateSize,
1837      updateSlides: updateSlides,
1838      updateAutoHeight: updateAutoHeight,
1839      updateSlidesOffset: updateSlidesOffset,
1840      updateSlidesProgress: updateSlidesProgress,
1841      updateProgress: updateProgress,
1842      updateSlidesClasses: updateSlidesClasses,
1843      updateActiveIndex: updateActiveIndex,
1844      updateClickedSlide: updateClickedSlide,
1845    };
1846  
1847    function getTranslate (axis) {
1848      if ( axis === void 0 ) axis = this.isHorizontal() ? 'x' : 'y';
1849  
1850      var swiper = this;
1851  
1852      var params = swiper.params;
1853      var rtl = swiper.rtlTranslate;
1854      var translate = swiper.translate;
1855      var $wrapperEl = swiper.$wrapperEl;
1856  
1857      if (params.virtualTranslate) {
1858        return rtl ? -translate : translate;
1859      }
1860  
1861      var currentTranslate = Utils.getTranslate($wrapperEl[0], axis);
1862      if (rtl) { currentTranslate = -currentTranslate; }
1863  
1864      return currentTranslate || 0;
1865    }
1866  
1867    function setTranslate (translate, byController) {
1868      var swiper = this;
1869      var rtl = swiper.rtlTranslate;
1870      var params = swiper.params;
1871      var $wrapperEl = swiper.$wrapperEl;
1872      var progress = swiper.progress;
1873      var x = 0;
1874      var y = 0;
1875      var z = 0;
1876  
1877      if (swiper.isHorizontal()) {
1878        x = rtl ? -translate : translate;
1879      } else {
1880        y = translate;
1881      }
1882  
1883      if (params.roundLengths) {
1884        x = Math.floor(x);
1885        y = Math.floor(y);
1886      }
1887  
1888      if (!params.virtualTranslate) {
1889        if (Support.transforms3d) { $wrapperEl.transform(("translate3d(" + x + "px, " + y + "px, " + z + "px)")); }
1890        else { $wrapperEl.transform(("translate(" + x + "px, " + y + "px)")); }
1891      }
1892      swiper.previousTranslate = swiper.translate;
1893      swiper.translate = swiper.isHorizontal() ? x : y;
1894  
1895      // Check if we need to update progress
1896      var newProgress;
1897      var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
1898      if (translatesDiff === 0) {
1899        newProgress = 0;
1900      } else {
1901        newProgress = (translate - swiper.minTranslate()) / (translatesDiff);
1902      }
1903      if (newProgress !== progress) {
1904        swiper.updateProgress(translate);
1905      }
1906  
1907      swiper.emit('setTranslate', swiper.translate, byController);
1908    }
1909  
1910    function minTranslate () {
1911      return (-this.snapGrid[0]);
1912    }
1913  
1914    function maxTranslate () {
1915      return (-this.snapGrid[this.snapGrid.length - 1]);
1916    }
1917  
1918    var translate = {
1919      getTranslate: getTranslate,
1920      setTranslate: setTranslate,
1921      minTranslate: minTranslate,
1922      maxTranslate: maxTranslate,
1923    };
1924  
1925    function setTransition (duration, byController) {
1926      var swiper = this;
1927  
1928      swiper.$wrapperEl.transition(duration);
1929  
1930      swiper.emit('setTransition', duration, byController);
1931    }
1932  
1933    function transitionStart (runCallbacks, direction) {
1934      if ( runCallbacks === void 0 ) runCallbacks = true;
1935  
1936      var swiper = this;
1937      var activeIndex = swiper.activeIndex;
1938      var params = swiper.params;
1939      var previousIndex = swiper.previousIndex;
1940      if (params.autoHeight) {
1941        swiper.updateAutoHeight();
1942      }
1943  
1944      var dir = direction;
1945      if (!dir) {
1946        if (activeIndex > previousIndex) { dir = 'next'; }
1947        else if (activeIndex < previousIndex) { dir = 'prev'; }
1948        else { dir = 'reset'; }
1949      }
1950  
1951      swiper.emit('transitionStart');
1952  
1953      if (runCallbacks && activeIndex !== previousIndex) {
1954        if (dir === 'reset') {
1955          swiper.emit('slideResetTransitionStart');
1956          return;
1957        }
1958        swiper.emit('slideChangeTransitionStart');
1959        if (dir === 'next') {
1960          swiper.emit('slideNextTransitionStart');
1961        } else {
1962          swiper.emit('slidePrevTransitionStart');
1963        }
1964      }
1965    }
1966  
1967    function transitionEnd$1 (runCallbacks, direction) {
1968      if ( runCallbacks === void 0 ) runCallbacks = true;
1969  
1970      var swiper = this;
1971      var activeIndex = swiper.activeIndex;
1972      var previousIndex = swiper.previousIndex;
1973      swiper.animating = false;
1974      swiper.setTransition(0);
1975  
1976      var dir = direction;
1977      if (!dir) {
1978        if (activeIndex > previousIndex) { dir = 'next'; }
1979        else if (activeIndex < previousIndex) { dir = 'prev'; }
1980        else { dir = 'reset'; }
1981      }
1982  
1983      swiper.emit('transitionEnd');
1984  
1985      if (runCallbacks && activeIndex !== previousIndex) {
1986        if (dir === 'reset') {
1987          swiper.emit('slideResetTransitionEnd');
1988          return;
1989        }
1990        swiper.emit('slideChangeTransitionEnd');
1991        if (dir === 'next') {
1992          swiper.emit('slideNextTransitionEnd');
1993        } else {
1994          swiper.emit('slidePrevTransitionEnd');
1995        }
1996      }
1997    }
1998  
1999    var transition$1 = {
2000      setTransition: setTransition,
2001      transitionStart: transitionStart,
2002      transitionEnd: transitionEnd$1,
2003    };
2004  
2005    function slideTo (index, speed, runCallbacks, internal) {
2006      if ( index === void 0 ) index = 0;
2007      if ( speed === void 0 ) speed = this.params.speed;
2008      if ( runCallbacks === void 0 ) runCallbacks = true;
2009  
2010      var swiper = this;
2011      var slideIndex = index;
2012      if (slideIndex < 0) { slideIndex = 0; }
2013  
2014      var params = swiper.params;
2015      var snapGrid = swiper.snapGrid;
2016      var slidesGrid = swiper.slidesGrid;
2017      var previousIndex = swiper.previousIndex;
2018      var activeIndex = swiper.activeIndex;
2019      var rtl = swiper.rtlTranslate;
2020      if (swiper.animating && params.preventInteractionOnTransition) {
2021        return false;
2022      }
2023  
2024      var snapIndex = Math.floor(slideIndex / params.slidesPerGroup);
2025      if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }
2026  
2027      if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {
2028        swiper.emit('beforeSlideChangeStart');
2029      }
2030  
2031      var translate = -snapGrid[snapIndex];
2032  
2033      // Update progress
2034      swiper.updateProgress(translate);
2035  
2036      // Normalize slideIndex
2037      if (params.normalizeSlideIndex) {
2038        for (var i = 0; i < slidesGrid.length; i += 1) {
2039          if (-Math.floor(translate * 100) >= Math.floor(slidesGrid[i] * 100)) {
2040            slideIndex = i;
2041          }
2042        }
2043      }
2044      // Directions locks
2045      if (swiper.initialized && slideIndex !== activeIndex) {
2046        if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {
2047          return false;
2048        }
2049        if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {
2050          if ((activeIndex || 0) !== slideIndex) { return false; }
2051        }
2052      }
2053  
2054      var direction;
2055      if (slideIndex > activeIndex) { direction = 'next'; }
2056      else if (slideIndex < activeIndex) { direction = 'prev'; }
2057      else { direction = 'reset'; }
2058  
2059  
2060      // Update Index
2061      if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {
2062        swiper.updateActiveIndex(slideIndex);
2063        // Update Height
2064        if (params.autoHeight) {
2065          swiper.updateAutoHeight();
2066        }
2067        swiper.updateSlidesClasses();
2068        if (params.effect !== 'slide') {
2069          swiper.setTranslate(translate);
2070        }
2071        if (direction !== 'reset') {
2072          swiper.transitionStart(runCallbacks, direction);
2073          swiper.transitionEnd(runCallbacks, direction);
2074        }
2075        return false;
2076      }
2077  
2078      if (speed === 0 || !Support.transition) {
2079        swiper.setTransition(0);
2080        swiper.setTranslate(translate);
2081        swiper.updateActiveIndex(slideIndex);
2082        swiper.updateSlidesClasses();
2083        swiper.emit('beforeTransitionStart', speed, internal);
2084        swiper.transitionStart(runCallbacks, direction);
2085        swiper.transitionEnd(runCallbacks, direction);
2086      } else {
2087        swiper.setTransition(speed);
2088        swiper.setTranslate(translate);
2089        swiper.updateActiveIndex(slideIndex);
2090        swiper.updateSlidesClasses();
2091        swiper.emit('beforeTransitionStart', speed, internal);
2092        swiper.transitionStart(runCallbacks, direction);
2093        if (!swiper.animating) {
2094          swiper.animating = true;
2095          if (!swiper.onSlideToWrapperTransitionEnd) {
2096            swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {
2097              if (!swiper || swiper.destroyed) { return; }
2098              if (e.target !== this) { return; }
2099              swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
2100              swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
2101              swiper.onSlideToWrapperTransitionEnd = null;
2102              delete swiper.onSlideToWrapperTransitionEnd;
2103              swiper.transitionEnd(runCallbacks, direction);
2104            };
2105          }
2106          swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
2107          swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
2108        }
2109      }
2110  
2111      return true;
2112    }
2113  
2114    function slideToLoop (index, speed, runCallbacks, internal) {
2115      if ( index === void 0 ) index = 0;
2116      if ( speed === void 0 ) speed = this.params.speed;
2117      if ( runCallbacks === void 0 ) runCallbacks = true;
2118  
2119      var swiper = this;
2120      var newIndex = index;
2121      if (swiper.params.loop) {
2122        newIndex += swiper.loopedSlides;
2123      }
2124  
2125      return swiper.slideTo(newIndex, speed, runCallbacks, internal);
2126    }
2127  
2128    /* eslint no-unused-vars: "off" */
2129    function slideNext (speed, runCallbacks, internal) {
2130      if ( speed === void 0 ) speed = this.params.speed;
2131      if ( runCallbacks === void 0 ) runCallbacks = true;
2132  
2133      var swiper = this;
2134      var params = swiper.params;
2135      var animating = swiper.animating;
2136      if (params.loop) {
2137        if (animating) { return false; }
2138        swiper.loopFix();
2139        // eslint-disable-next-line
2140        swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
2141        return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal);
2142      }
2143      return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal);
2144    }
2145  
2146    /* eslint no-unused-vars: "off" */
2147    function slidePrev (speed, runCallbacks, internal) {
2148      if ( speed === void 0 ) speed = this.params.speed;
2149      if ( runCallbacks === void 0 ) runCallbacks = true;
2150  
2151      var swiper = this;
2152      var params = swiper.params;
2153      var animating = swiper.animating;
2154      var snapGrid = swiper.snapGrid;
2155      var slidesGrid = swiper.slidesGrid;
2156      var rtlTranslate = swiper.rtlTranslate;
2157  
2158      if (params.loop) {
2159        if (animating) { return false; }
2160        swiper.loopFix();
2161        // eslint-disable-next-line
2162        swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
2163      }
2164      var translate = rtlTranslate ? swiper.translate : -swiper.translate;
2165      function normalize(val) {
2166        if (val < 0) { return -Math.floor(Math.abs(val)); }
2167        return Math.floor(val);
2168      }
2169      var normalizedTranslate = normalize(translate);
2170      var normalizedSnapGrid = snapGrid.map(function (val) { return normalize(val); });
2171      var normalizedSlidesGrid = slidesGrid.map(function (val) { return normalize(val); });
2172  
2173      var currentSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate)];
2174      var prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
2175      var prevIndex;
2176      if (typeof prevSnap !== 'undefined') {
2177        prevIndex = slidesGrid.indexOf(prevSnap);
2178        if (prevIndex < 0) { prevIndex = swiper.activeIndex - 1; }
2179      }
2180      return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
2181    }
2182  
2183    /* eslint no-unused-vars: "off" */
2184    function slideReset (speed, runCallbacks, internal) {
2185      if ( speed === void 0 ) speed = this.params.speed;
2186      if ( runCallbacks === void 0 ) runCallbacks = true;
2187  
2188      var swiper = this;
2189      return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
2190    }
2191  
2192    /* eslint no-unused-vars: "off" */
2193    function slideToClosest (speed, runCallbacks, internal) {
2194      if ( speed === void 0 ) speed = this.params.speed;
2195      if ( runCallbacks === void 0 ) runCallbacks = true;
2196  
2197      var swiper = this;
2198      var index = swiper.activeIndex;
2199      var snapIndex = Math.floor(index / swiper.params.slidesPerGroup);
2200  
2201      if (snapIndex < swiper.snapGrid.length - 1) {
2202        var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
2203  
2204        var currentSnap = swiper.snapGrid[snapIndex];
2205        var nextSnap = swiper.snapGrid[snapIndex + 1];
2206  
2207        if ((translate - currentSnap) > (nextSnap - currentSnap) / 2) {
2208          index = swiper.params.slidesPerGroup;
2209        }
2210      }
2211  
2212      return swiper.slideTo(index, speed, runCallbacks, internal);
2213    }
2214  
2215    function slideToClickedSlide () {
2216      var swiper = this;
2217      var params = swiper.params;
2218      var $wrapperEl = swiper.$wrapperEl;
2219  
2220      var slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;
2221      var slideToIndex = swiper.clickedIndex;
2222      var realIndex;
2223      if (params.loop) {
2224        if (swiper.animating) { return; }
2225        realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);
2226        if (params.centeredSlides) {
2227          if (
2228            (slideToIndex < swiper.loopedSlides - (slidesPerView / 2))
2229            || (slideToIndex > (swiper.slides.length - swiper.loopedSlides) + (slidesPerView / 2))
2230          ) {
2231            swiper.loopFix();
2232            slideToIndex = $wrapperEl
2233              .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")"))
2234              .eq(0)
2235              .index();
2236  
2237            Utils.nextTick(function () {
2238              swiper.slideTo(slideToIndex);
2239            });
2240          } else {
2241            swiper.slideTo(slideToIndex);
2242          }
2243        } else if (slideToIndex > swiper.slides.length - slidesPerView) {
2244          swiper.loopFix();
2245          slideToIndex = $wrapperEl
2246            .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")"))
2247            .eq(0)
2248            .index();
2249  
2250          Utils.nextTick(function () {
2251            swiper.slideTo(slideToIndex);
2252          });
2253        } else {
2254          swiper.slideTo(slideToIndex);
2255        }
2256      } else {
2257        swiper.slideTo(slideToIndex);
2258      }
2259    }
2260  
2261    var slide = {
2262      slideTo: slideTo,
2263      slideToLoop: slideToLoop,
2264      slideNext: slideNext,
2265      slidePrev: slidePrev,
2266      slideReset: slideReset,
2267      slideToClosest: slideToClosest,
2268      slideToClickedSlide: slideToClickedSlide,
2269    };
2270  
2271    function loopCreate () {
2272      var swiper = this;
2273      var params = swiper.params;
2274      var $wrapperEl = swiper.$wrapperEl;
2275      // Remove duplicated slides
2276      $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass))).remove();
2277  
2278      var slides = $wrapperEl.children(("." + (params.slideClass)));
2279  
2280      if (params.loopFillGroupWithBlank) {
2281        var blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);
2282        if (blankSlidesNum !== params.slidesPerGroup) {
2283          for (var i = 0; i < blankSlidesNum; i += 1) {
2284            var blankNode = $(doc.createElement('div')).addClass(((params.slideClass) + " " + (params.slideBlankClass)));
2285            $wrapperEl.append(blankNode);
2286          }
2287          slides = $wrapperEl.children(("." + (params.slideClass)));
2288        }
2289      }
2290  
2291      if (params.slidesPerView === 'auto' && !params.loopedSlides) { params.loopedSlides = slides.length; }
2292  
2293      swiper.loopedSlides = parseInt(params.loopedSlides || params.slidesPerView, 10);
2294      swiper.loopedSlides += params.loopAdditionalSlides;
2295      if (swiper.loopedSlides > slides.length) {
2296        swiper.loopedSlides = slides.length;
2297      }
2298  
2299      var prependSlides = [];
2300      var appendSlides = [];
2301      slides.each(function (index, el) {
2302        var slide = $(el);
2303        if (index < swiper.loopedSlides) { appendSlides.push(el); }
2304        if (index < slides.length && index >= slides.length - swiper.loopedSlides) { prependSlides.push(el); }
2305        slide.attr('data-swiper-slide-index', index);
2306      });
2307      for (var i$1 = 0; i$1 < appendSlides.length; i$1 += 1) {
2308        $wrapperEl.append($(appendSlides[i$1].cloneNode(true)).addClass(params.slideDuplicateClass));
2309      }
2310      for (var i$2 = prependSlides.length - 1; i$2 >= 0; i$2 -= 1) {
2311        $wrapperEl.prepend($(prependSlides[i$2].cloneNode(true)).addClass(params.slideDuplicateClass));
2312      }
2313    }
2314  
2315    function loopFix () {
2316      var swiper = this;
2317      var params = swiper.params;
2318      var activeIndex = swiper.activeIndex;
2319      var slides = swiper.slides;
2320      var loopedSlides = swiper.loopedSlides;
2321      var allowSlidePrev = swiper.allowSlidePrev;
2322      var allowSlideNext = swiper.allowSlideNext;
2323      var snapGrid = swiper.snapGrid;
2324      var rtl = swiper.rtlTranslate;
2325      var newIndex;
2326      swiper.allowSlidePrev = true;
2327      swiper.allowSlideNext = true;
2328  
2329      var snapTranslate = -snapGrid[activeIndex];
2330      var diff = snapTranslate - swiper.getTranslate();
2331  
2332  
2333      // Fix For Negative Oversliding
2334      if (activeIndex < loopedSlides) {
2335        newIndex = (slides.length - (loopedSlides * 3)) + activeIndex;
2336        newIndex += loopedSlides;
2337        var slideChanged = swiper.slideTo(newIndex, 0, false, true);
2338        if (slideChanged && diff !== 0) {
2339          swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
2340        }
2341      } else if ((params.slidesPerView === 'auto' && activeIndex >= loopedSlides * 2) || (activeIndex >= slides.length - loopedSlides)) {
2342        // Fix For Positive Oversliding
2343        newIndex = -slides.length + activeIndex + loopedSlides;
2344        newIndex += loopedSlides;
2345        var slideChanged$1 = swiper.slideTo(newIndex, 0, false, true);
2346        if (slideChanged$1 && diff !== 0) {
2347          swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
2348        }
2349      }
2350      swiper.allowSlidePrev = allowSlidePrev;
2351      swiper.allowSlideNext = allowSlideNext;
2352    }
2353  
2354    function loopDestroy () {
2355      var swiper = this;
2356      var $wrapperEl = swiper.$wrapperEl;
2357      var params = swiper.params;
2358      var slides = swiper.slides;
2359      $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + ",." + (params.slideClass) + "." + (params.slideBlankClass))).remove();
2360      slides.removeAttr('data-swiper-slide-index');
2361    }
2362  
2363    var loop = {
2364      loopCreate: loopCreate,
2365      loopFix: loopFix,
2366      loopDestroy: loopDestroy,
2367    };
2368  
2369    function setGrabCursor (moving) {
2370      var swiper = this;
2371      if (Support.touch || !swiper.params.simulateTouch || (swiper.params.watchOverflow && swiper.isLocked)) { return; }
2372      var el = swiper.el;
2373      el.style.cursor = 'move';
2374      el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';
2375      el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';
2376      el.style.cursor = moving ? 'grabbing' : 'grab';
2377    }
2378  
2379    function unsetGrabCursor () {
2380      var swiper = this;
2381      if (Support.touch || (swiper.params.watchOverflow && swiper.isLocked)) { return; }
2382      swiper.el.style.cursor = '';
2383    }
2384  
2385    var grabCursor = {
2386      setGrabCursor: setGrabCursor,
2387      unsetGrabCursor: unsetGrabCursor,
2388    };
2389  
2390    function appendSlide (slides) {
2391      var swiper = this;
2392      var $wrapperEl = swiper.$wrapperEl;
2393      var params = swiper.params;
2394      if (params.loop) {
2395        swiper.loopDestroy();
2396      }
2397      if (typeof slides === 'object' && 'length' in slides) {
2398        for (var i = 0; i < slides.length; i += 1) {
2399          if (slides[i]) { $wrapperEl.append(slides[i]); }
2400        }
2401      } else {
2402        $wrapperEl.append(slides);
2403      }
2404      if (params.loop) {
2405        swiper.loopCreate();
2406      }
2407      if (!(params.observer && Support.observer)) {
2408        swiper.update();
2409      }
2410    }
2411  
2412    function prependSlide (slides) {
2413      var swiper = this;
2414      var params = swiper.params;
2415      var $wrapperEl = swiper.$wrapperEl;
2416      var activeIndex = swiper.activeIndex;
2417  
2418      if (params.loop) {
2419        swiper.loopDestroy();
2420      }
2421      var newActiveIndex = activeIndex + 1;
2422      if (typeof slides === 'object' && 'length' in slides) {
2423        for (var i = 0; i < slides.length; i += 1) {
2424          if (slides[i]) { $wrapperEl.prepend(slides[i]); }
2425        }
2426        newActiveIndex = activeIndex + slides.length;
2427      } else {
2428        $wrapperEl.prepend(slides);
2429      }
2430      if (params.loop) {
2431        swiper.loopCreate();
2432      }
2433      if (!(params.observer && Support.observer)) {
2434        swiper.update();
2435      }
2436      swiper.slideTo(newActiveIndex, 0, false);
2437    }
2438  
2439    function addSlide (index, slides) {
2440      var swiper = this;
2441      var $wrapperEl = swiper.$wrapperEl;
2442      var params = swiper.params;
2443      var activeIndex = swiper.activeIndex;
2444      var activeIndexBuffer = activeIndex;
2445      if (params.loop) {
2446        activeIndexBuffer -= swiper.loopedSlides;
2447        swiper.loopDestroy();
2448        swiper.slides = $wrapperEl.children(("." + (params.slideClass)));
2449      }
2450      var baseLength = swiper.slides.length;
2451      if (index <= 0) {
2452        swiper.prependSlide(slides);
2453        return;
2454      }
2455      if (index >= baseLength) {
2456        swiper.appendSlide(slides);
2457        return;
2458      }
2459      var newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;
2460  
2461      var slidesBuffer = [];
2462      for (var i = baseLength - 1; i >= index; i -= 1) {
2463        var currentSlide = swiper.slides.eq(i);
2464        currentSlide.remove();
2465        slidesBuffer.unshift(currentSlide);
2466      }
2467  
2468      if (typeof slides === 'object' && 'length' in slides) {
2469        for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {
2470          if (slides[i$1]) { $wrapperEl.append(slides[i$1]); }
2471        }
2472        newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;
2473      } else {
2474        $wrapperEl.append(slides);
2475      }
2476  
2477      for (var i$2 = 0; i$2 < slidesBuffer.length; i$2 += 1) {
2478        $wrapperEl.append(slidesBuffer[i$2]);
2479      }
2480  
2481      if (params.loop) {
2482        swiper.loopCreate();
2483      }
2484      if (!(params.observer && Support.observer)) {
2485        swiper.update();
2486      }
2487      if (params.loop) {
2488        swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
2489      } else {
2490        swiper.slideTo(newActiveIndex, 0, false);
2491      }
2492    }
2493  
2494    function removeSlide (slidesIndexes) {
2495      var swiper = this;
2496      var params = swiper.params;
2497      var $wrapperEl = swiper.$wrapperEl;
2498      var activeIndex = swiper.activeIndex;
2499  
2500      var activeIndexBuffer = activeIndex;
2501      if (params.loop) {
2502        activeIndexBuffer -= swiper.loopedSlides;
2503        swiper.loopDestroy();
2504        swiper.slides = $wrapperEl.children(("." + (params.slideClass)));
2505      }
2506      var newActiveIndex = activeIndexBuffer;
2507      var indexToRemove;
2508  
2509      if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {
2510        for (var i = 0; i < slidesIndexes.length; i += 1) {
2511          indexToRemove = slidesIndexes[i];
2512          if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }
2513          if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }
2514        }
2515        newActiveIndex = Math.max(newActiveIndex, 0);
2516      } else {
2517        indexToRemove = slidesIndexes;
2518        if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }
2519        if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }
2520        newActiveIndex = Math.max(newActiveIndex, 0);
2521      }
2522  
2523      if (params.loop) {
2524        swiper.loopCreate();
2525      }
2526  
2527      if (!(params.observer && Support.observer)) {
2528        swiper.update();
2529      }
2530      if (params.loop) {
2531        swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
2532      } else {
2533        swiper.slideTo(newActiveIndex, 0, false);
2534      }
2535    }
2536  
2537    function removeAllSlides () {
2538      var swiper = this;
2539  
2540      var slidesIndexes = [];
2541      for (var i = 0; i < swiper.slides.length; i += 1) {
2542        slidesIndexes.push(i);
2543      }
2544      swiper.removeSlide(slidesIndexes);
2545    }
2546  
2547    var manipulation = {
2548      appendSlide: appendSlide,
2549      prependSlide: prependSlide,
2550      addSlide: addSlide,
2551      removeSlide: removeSlide,
2552      removeAllSlides: removeAllSlides,
2553    };
2554  
2555    var Device = (function Device() {
2556      var ua = win.navigator.userAgent;
2557  
2558      var device = {
2559        ios: false,
2560        android: false,
2561        androidChrome: false,
2562        desktop: false,
2563        windows: false,
2564        iphone: false,
2565        ipod: false,
2566        ipad: false,
2567        cordova: win.cordova || win.phonegap,
2568        phonegap: win.cordova || win.phonegap,
2569      };
2570  
2571      var windows = ua.match(/(Windows Phone);?[\s\/]+([\d.]+)?/); // eslint-disable-line
2572      var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line
2573      var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
2574      var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
2575      var iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
2576  
2577  
2578      // Windows
2579      if (windows) {
2580        device.os = 'windows';
2581        device.osVersion = windows[2];
2582        device.windows = true;
2583      }
2584      // Android
2585      if (android && !windows) {
2586        device.os = 'android';
2587        device.osVersion = android[2];
2588        device.android = true;
2589        device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;
2590      }
2591      if (ipad || iphone || ipod) {
2592        device.os = 'ios';
2593        device.ios = true;
2594      }
2595      // iOS
2596      if (iphone && !ipod) {
2597        device.osVersion = iphone[2].replace(/_/g, '.');
2598        device.iphone = true;
2599      }
2600      if (ipad) {
2601        device.osVersion = ipad[2].replace(/_/g, '.');
2602        device.ipad = true;
2603      }
2604      if (ipod) {
2605        device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;
2606        device.iphone = true;
2607      }
2608      // iOS 8+ changed UA
2609      if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {
2610        if (device.osVersion.split('.')[0] === '10') {
2611          device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];
2612        }
2613      }
2614  
2615      // Desktop
2616      device.desktop = !(device.os || device.android || device.webView);
2617  
2618      // Webview
2619      device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i);
2620  
2621      // Minimal UI
2622      if (device.os && device.os === 'ios') {
2623        var osVersionArr = device.osVersion.split('.');
2624        var metaViewport = doc.querySelector('meta[name="viewport"]');
2625        device.minimalUi = !device.webView
2626          && (ipod || iphone)
2627          && (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7)
2628          && metaViewport && metaViewport.getAttribute('content').indexOf('minimal-ui') >= 0;
2629      }
2630  
2631      // Pixel Ratio
2632      device.pixelRatio = win.devicePixelRatio || 1;
2633  
2634      // Export object
2635      return device;
2636    }());
2637  
2638    function onTouchStart (event) {
2639      var swiper = this;
2640      var data = swiper.touchEventsData;
2641      var params = swiper.params;
2642      var touches = swiper.touches;
2643      if (swiper.animating && params.preventInteractionOnTransition) {
2644        return;
2645      }
2646      var e = event;
2647      if (e.originalEvent) { e = e.originalEvent; }
2648      data.isTouchEvent = e.type === 'touchstart';
2649      if (!data.isTouchEvent && 'which' in e && e.which === 3) { return; }
2650      if (!data.isTouchEvent && 'button' in e && e.button > 0) { return; }
2651      if (data.isTouched && data.isMoved) { return; }
2652      if (params.noSwiping && $(e.target).closest(params.noSwipingSelector ? params.noSwipingSelector : ("." + (params.noSwipingClass)))[0]) {
2653        swiper.allowClick = true;
2654        return;
2655      }
2656      if (params.swipeHandler) {
2657        if (!$(e).closest(params.swipeHandler)[0]) { return; }
2658      }
2659  
2660      touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
2661      touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
2662      var startX = touches.currentX;
2663      var startY = touches.currentY;
2664  
2665      // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore
2666  
2667      var edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;
2668      var edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;
2669      if (
2670        edgeSwipeDetection
2671        && ((startX <= edgeSwipeThreshold)
2672        || (startX >= win.screen.width - edgeSwipeThreshold))
2673      ) {
2674        return;
2675      }
2676  
2677      Utils.extend(data, {
2678        isTouched: true,
2679        isMoved: false,
2680        allowTouchCallbacks: true,
2681        isScrolling: undefined,
2682        startMoving: undefined,
2683      });
2684  
2685      touches.startX = startX;
2686      touches.startY = startY;
2687      data.touchStartTime = Utils.now();
2688      swiper.allowClick = true;
2689      swiper.updateSize();
2690      swiper.swipeDirection = undefined;
2691      if (params.threshold > 0) { data.allowThresholdMove = false; }
2692      if (e.type !== 'touchstart') {
2693        var preventDefault = true;
2694        if ($(e.target).is(data.formElements)) { preventDefault = false; }
2695        if (
2696          doc.activeElement
2697          && $(doc.activeElement).is(data.formElements)
2698          && doc.activeElement !== e.target
2699        ) {
2700          doc.activeElement.blur();
2701        }
2702  
2703        var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
2704        if (params.touchStartForcePreventDefault || shouldPreventDefault) {
2705          e.preventDefault();
2706        }
2707      }
2708      swiper.emit('touchStart', e);
2709    }
2710  
2711    function onTouchMove (event) {
2712      var swiper = this;
2713      var data = swiper.touchEventsData;
2714      var params = swiper.params;
2715      var touches = swiper.touches;
2716      var rtl = swiper.rtlTranslate;
2717      var e = event;
2718      if (e.originalEvent) { e = e.originalEvent; }
2719      if (!data.isTouched) {
2720        if (data.startMoving && data.isScrolling) {
2721          swiper.emit('touchMoveOpposite', e);
2722        }
2723        return;
2724      }
2725      if (data.isTouchEvent && e.type === 'mousemove') { return; }
2726      var targetTouch = e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);
2727      var pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;
2728      var pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;
2729      if (e.preventedByNestedSwiper) {
2730        touches.startX = pageX;
2731        touches.startY = pageY;
2732        return;
2733      }
2734      if (!swiper.allowTouchMove) {
2735        // isMoved = true;
2736        swiper.allowClick = false;
2737        if (data.isTouched) {
2738          Utils.extend(touches, {
2739            startX: pageX,
2740            startY: pageY,
2741            currentX: pageX,
2742            currentY: pageY,
2743          });
2744          data.touchStartTime = Utils.now();
2745        }
2746        return;
2747      }
2748      if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {
2749        if (swiper.isVertical()) {
2750          // Vertical
2751          if (
2752            (pageY < touches.startY && swiper.translate <= swiper.maxTranslate())
2753            || (pageY > touches.startY && swiper.translate >= swiper.minTranslate())
2754          ) {
2755            data.isTouched = false;
2756            data.isMoved = false;
2757            return;
2758          }
2759        } else if (
2760          (pageX < touches.startX && swiper.translate <= swiper.maxTranslate())
2761          || (pageX > touches.startX && swiper.translate >= swiper.minTranslate())
2762        ) {
2763          return;
2764        }
2765      }
2766      if (data.isTouchEvent && doc.activeElement) {
2767        if (e.target === doc.activeElement && $(e.target).is(data.formElements)) {
2768          data.isMoved = true;
2769          swiper.allowClick = false;
2770          return;
2771        }
2772      }
2773      if (data.allowTouchCallbacks) {
2774        swiper.emit('touchMove', e);
2775      }
2776      if (e.targetTouches && e.targetTouches.length > 1) { return; }
2777  
2778      touches.currentX = pageX;
2779      touches.currentY = pageY;
2780  
2781      var diffX = touches.currentX - touches.startX;
2782      var diffY = touches.currentY - touches.startY;
2783      if (swiper.params.threshold && Math.sqrt((Math.pow( diffX, 2 )) + (Math.pow( diffY, 2 ))) < swiper.params.threshold) { return; }
2784  
2785      if (typeof data.isScrolling === 'undefined') {
2786        var touchAngle;
2787        if ((swiper.isHorizontal() && touches.currentY === touches.startY) || (swiper.isVertical() && touches.currentX === touches.startX)) {
2788          data.isScrolling = false;
2789        } else {
2790          // eslint-disable-next-line
2791          if ((diffX * diffX) + (diffY * diffY) >= 25) {
2792            touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;
2793            data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : (90 - touchAngle > params.touchAngle);
2794          }
2795        }
2796      }
2797      if (data.isScrolling) {
2798        swiper.emit('touchMoveOpposite', e);
2799      }
2800      if (typeof data.startMoving === 'undefined') {
2801        if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
2802          data.startMoving = true;
2803        }
2804      }
2805      if (data.isScrolling) {
2806        data.isTouched = false;
2807        return;
2808      }
2809      if (!data.startMoving) {
2810        return;
2811      }
2812      swiper.allowClick = false;
2813      e.preventDefault();
2814      if (params.touchMoveStopPropagation && !params.nested) {
2815        e.stopPropagation();
2816      }
2817  
2818      if (!data.isMoved) {
2819        if (params.loop) {
2820          swiper.loopFix();
2821        }
2822        data.startTranslate = swiper.getTranslate();
2823        swiper.setTransition(0);
2824        if (swiper.animating) {
2825          swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');
2826        }
2827        data.allowMomentumBounce = false;
2828        // Grab Cursor
2829        if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
2830          swiper.setGrabCursor(true);
2831        }
2832        swiper.emit('sliderFirstMove', e);
2833      }
2834      swiper.emit('sliderMove', e);
2835      data.isMoved = true;
2836  
2837      var diff = swiper.isHorizontal() ? diffX : diffY;
2838      touches.diff = diff;
2839  
2840      diff *= params.touchRatio;
2841      if (rtl) { diff = -diff; }
2842  
2843      swiper.swipeDirection = diff > 0 ? 'prev' : 'next';
2844      data.currentTranslate = diff + data.startTranslate;
2845  
2846      var disableParentSwiper = true;
2847      var resistanceRatio = params.resistanceRatio;
2848      if (params.touchReleaseOnEdges) {
2849        resistanceRatio = 0;
2850      }
2851      if ((diff > 0 && data.currentTranslate > swiper.minTranslate())) {
2852        disableParentSwiper = false;
2853        if (params.resistance) { data.currentTranslate = (swiper.minTranslate() - 1) + (Math.pow( (-swiper.minTranslate() + data.startTranslate + diff), resistanceRatio )); }
2854      } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {
2855        disableParentSwiper = false;
2856        if (params.resistance) { data.currentTranslate = (swiper.maxTranslate() + 1) - (Math.pow( (swiper.maxTranslate() - data.startTranslate - diff), resistanceRatio )); }
2857      }
2858  
2859      if (disableParentSwiper) {
2860        e.preventedByNestedSwiper = true;
2861      }
2862  
2863      // Directions locks
2864      if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {
2865        data.currentTranslate = data.startTranslate;
2866      }
2867      if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {
2868        data.currentTranslate = data.startTranslate;
2869      }
2870  
2871  
2872      // Threshold
2873      if (params.threshold > 0) {
2874        if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
2875          if (!data.allowThresholdMove) {
2876            data.allowThresholdMove = true;
2877            touches.startX = touches.currentX;
2878            touches.startY = touches.currentY;
2879            data.currentTranslate = data.startTranslate;
2880            touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
2881            return;
2882          }
2883        } else {
2884          data.currentTranslate = data.startTranslate;
2885          return;
2886        }
2887      }
2888  
2889      if (!params.followFinger) { return; }
2890  
2891      // Update active index in free mode
2892      if (params.freeMode || params.watchSlidesProgress || params.watchSlidesVisibility) {
2893        swiper.updateActiveIndex();
2894        swiper.updateSlidesClasses();
2895      }
2896      if (params.freeMode) {
2897        // Velocity
2898        if (data.velocities.length === 0) {
2899          data.velocities.push({
2900            position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],
2901            time: data.touchStartTime,
2902          });
2903        }
2904        data.velocities.push({
2905          position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],
2906          time: Utils.now(),
2907        });
2908      }
2909      // Update progress
2910      swiper.updateProgress(data.currentTranslate);
2911      // Update translate
2912      swiper.setTranslate(data.currentTranslate);
2913    }
2914  
2915    function onTouchEnd (event) {
2916      var swiper = this;
2917      var data = swiper.touchEventsData;
2918  
2919      var params = swiper.params;
2920      var touches = swiper.touches;
2921      var rtl = swiper.rtlTranslate;
2922      var $wrapperEl = swiper.$wrapperEl;
2923      var slidesGrid = swiper.slidesGrid;
2924      var snapGrid = swiper.snapGrid;
2925      var e = event;
2926      if (e.originalEvent) { e = e.originalEvent; }
2927      if (data.allowTouchCallbacks) {
2928        swiper.emit('touchEnd', e);
2929      }
2930      data.allowTouchCallbacks = false;
2931      if (!data.isTouched) {
2932        if (data.isMoved && params.grabCursor) {
2933          swiper.setGrabCursor(false);
2934        }
2935        data.isMoved = false;
2936        data.startMoving = false;
2937        return;
2938      }
2939      // Return Grab Cursor
2940      if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
2941        swiper.setGrabCursor(false);
2942      }
2943  
2944      // Time diff
2945      var touchEndTime = Utils.now();
2946      var timeDiff = touchEndTime - data.touchStartTime;
2947  
2948      // Tap, doubleTap, Click
2949      if (swiper.allowClick) {
2950        swiper.updateClickedSlide(e);
2951        swiper.emit('tap', e);
2952        if (timeDiff < 300 && (touchEndTime - data.lastClickTime) > 300) {
2953          if (data.clickTimeout) { clearTimeout(data.clickTimeout); }
2954          data.clickTimeout = Utils.nextTick(function () {
2955            if (!swiper || swiper.destroyed) { return; }
2956            swiper.emit('click', e);
2957          }, 300);
2958        }
2959        if (timeDiff < 300 && (touchEndTime - data.lastClickTime) < 300) {
2960          if (data.clickTimeout) { clearTimeout(data.clickTimeout); }
2961          swiper.emit('doubleTap', e);
2962        }
2963      }
2964  
2965      data.lastClickTime = Utils.now();
2966      Utils.nextTick(function () {
2967        if (!swiper.destroyed) { swiper.allowClick = true; }
2968      });
2969  
2970      if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {
2971        data.isTouched = false;
2972        data.isMoved = false;
2973        data.startMoving = false;
2974        return;
2975      }
2976      data.isTouched = false;
2977      data.isMoved = false;
2978      data.startMoving = false;
2979  
2980      var currentPos;
2981      if (params.followFinger) {
2982        currentPos = rtl ? swiper.translate : -swiper.translate;
2983      } else {
2984        currentPos = -data.currentTranslate;
2985      }
2986  
2987      if (params.freeMode) {
2988        if (currentPos < -swiper.minTranslate()) {
2989          swiper.slideTo(swiper.activeIndex);
2990          return;
2991        }
2992        if (currentPos > -swiper.maxTranslate()) {
2993          if (swiper.slides.length < snapGrid.length) {
2994            swiper.slideTo(snapGrid.length - 1);
2995          } else {
2996            swiper.slideTo(swiper.slides.length - 1);
2997          }
2998          return;
2999        }
3000  
3001        if (params.freeModeMomentum) {
3002          if (data.velocities.length > 1) {
3003            var lastMoveEvent = data.velocities.pop();
3004            var velocityEvent = data.velocities.pop();
3005  
3006            var distance = lastMoveEvent.position - velocityEvent.position;
3007            var time = lastMoveEvent.time - velocityEvent.time;
3008            swiper.velocity = distance / time;
3009            swiper.velocity /= 2;
3010            if (Math.abs(swiper.velocity) < params.freeModeMinimumVelocity) {
3011              swiper.velocity = 0;
3012            }
3013            // this implies that the user stopped moving a finger then released.
3014            // There would be no events with distance zero, so the last event is stale.
3015            if (time > 150 || (Utils.now() - lastMoveEvent.time) > 300) {
3016              swiper.velocity = 0;
3017            }
3018          } else {
3019            swiper.velocity = 0;
3020          }
3021          swiper.velocity *= params.freeModeMomentumVelocityRatio;
3022  
3023          data.velocities.length = 0;
3024          var momentumDuration = 1000 * params.freeModeMomentumRatio;
3025          var momentumDistance = swiper.velocity * momentumDuration;
3026  
3027          var newPosition = swiper.translate + momentumDistance;
3028          if (rtl) { newPosition = -newPosition; }
3029  
3030          var doBounce = false;
3031          var afterBouncePosition;
3032          var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeModeMomentumBounceRatio;
3033          var needsLoopFix;
3034          if (newPosition < swiper.maxTranslate()) {
3035            if (params.freeModeMomentumBounce) {
3036              if (newPosition + swiper.maxTranslate() < -bounceAmount) {
3037                newPosition = swiper.maxTranslate() - bounceAmount;
3038              }
3039              afterBouncePosition = swiper.maxTranslate();
3040              doBounce = true;
3041              data.allowMomentumBounce = true;
3042            } else {
3043              newPosition = swiper.maxTranslate();
3044            }
3045            if (params.loop && params.centeredSlides) { needsLoopFix = true; }
3046          } else if (newPosition > swiper.minTranslate()) {
3047            if (params.freeModeMomentumBounce) {
3048              if (newPosition - swiper.minTranslate() > bounceAmount) {
3049                newPosition = swiper.minTranslate() + bounceAmount;
3050              }
3051              afterBouncePosition = swiper.minTranslate();
3052              doBounce = true;
3053              data.allowMomentumBounce = true;
3054            } else {
3055              newPosition = swiper.minTranslate();
3056            }
3057            if (params.loop && params.centeredSlides) { needsLoopFix = true; }
3058          } else if (params.freeModeSticky) {
3059            var nextSlide;
3060            for (var j = 0; j < snapGrid.length; j += 1) {
3061              if (snapGrid[j] > -newPosition) {
3062                nextSlide = j;
3063                break;
3064              }
3065            }
3066  
3067            if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {
3068              newPosition = snapGrid[nextSlide];
3069            } else {
3070              newPosition = snapGrid[nextSlide - 1];
3071            }
3072            newPosition = -newPosition;
3073          }
3074          if (needsLoopFix) {
3075            swiper.once('transitionEnd', function () {
3076              swiper.loopFix();
3077            });
3078          }
3079          // Fix duration
3080          if (swiper.velocity !== 0) {
3081            if (rtl) {
3082              momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);
3083            } else {
3084              momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);
3085            }
3086          } else if (params.freeModeSticky) {
3087            swiper.slideToClosest();
3088            return;
3089          }
3090  
3091          if (params.freeModeMomentumBounce && doBounce) {
3092            swiper.updateProgress(afterBouncePosition);
3093            swiper.setTransition(momentumDuration);
3094            swiper.setTranslate(newPosition);
3095            swiper.transitionStart(true, swiper.swipeDirection);
3096            swiper.animating = true;
3097            $wrapperEl.transitionEnd(function () {
3098              if (!swiper || swiper.destroyed || !data.allowMomentumBounce) { return; }
3099              swiper.emit('momentumBounce');
3100  
3101              swiper.setTransition(params.speed);
3102              swiper.setTranslate(afterBouncePosition);
3103              $wrapperEl.transitionEnd(function () {
3104                if (!swiper || swiper.destroyed) { return; }
3105                swiper.transitionEnd();
3106              });
3107            });
3108          } else if (swiper.velocity) {
3109            swiper.updateProgress(newPosition);
3110            swiper.setTransition(momentumDuration);
3111            swiper.setTranslate(newPosition);
3112            swiper.transitionStart(true, swiper.swipeDirection);
3113            if (!swiper.animating) {
3114              swiper.animating = true;
3115              $wrapperEl.transitionEnd(function () {
3116                if (!swiper || swiper.destroyed) { return; }
3117                swiper.transitionEnd();
3118              });
3119            }
3120          } else {
3121            swiper.updateProgress(newPosition);
3122          }
3123  
3124          swiper.updateActiveIndex();
3125          swiper.updateSlidesClasses();
3126        } else if (params.freeModeSticky) {
3127          swiper.slideToClosest();
3128          return;
3129        }
3130  
3131        if (!params.freeModeMomentum || timeDiff >= params.longSwipesMs) {
3132          swiper.updateProgress();
3133          swiper.updateActiveIndex();
3134          swiper.updateSlidesClasses();
3135        }
3136        return;
3137      }
3138  
3139      // Find current slide
3140      var stopIndex = 0;
3141      var groupSize = swiper.slidesSizesGrid[0];
3142      for (var i = 0; i < slidesGrid.length; i += params.slidesPerGroup) {
3143        if (typeof slidesGrid[i + params.slidesPerGroup] !== 'undefined') {
3144          if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + params.slidesPerGroup]) {
3145            stopIndex = i;
3146            groupSize = slidesGrid[i + params.slidesPerGroup] - slidesGrid[i];
3147          }
3148        } else if (currentPos >= slidesGrid[i]) {
3149          stopIndex = i;
3150          groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
3151        }
3152      }
3153  
3154      // Find current slide size
3155      var ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
3156  
3157      if (timeDiff > params.longSwipesMs) {
3158        // Long touches
3159        if (!params.longSwipes) {
3160          swiper.slideTo(swiper.activeIndex);
3161          return;
3162        }
3163        if (swiper.swipeDirection === 'next') {
3164          if (ratio >= params.longSwipesRatio) { swiper.slideTo(stopIndex + params.slidesPerGroup); }
3165          else { swiper.slideTo(stopIndex); }
3166        }
3167        if (swiper.swipeDirection === 'prev') {
3168          if (ratio > (1 - params.longSwipesRatio)) { swiper.slideTo(stopIndex + params.slidesPerGroup); }
3169          else { swiper.slideTo(stopIndex); }
3170        }
3171      } else {
3172        // Short swipes
3173        if (!params.shortSwipes) {
3174          swiper.slideTo(swiper.activeIndex);
3175          return;
3176        }
3177        if (swiper.swipeDirection === 'next') {
3178          swiper.slideTo(stopIndex + params.slidesPerGroup);
3179        }
3180        if (swiper.swipeDirection === 'prev') {
3181          swiper.slideTo(stopIndex);
3182        }
3183      }
3184    }
3185  
3186    function onResize () {
3187      var swiper = this;
3188  
3189      var params = swiper.params;
3190      var el = swiper.el;
3191  
3192      if (el && el.offsetWidth === 0) { return; }
3193  
3194      // Breakpoints
3195      if (params.breakpoints) {
3196        swiper.setBreakpoint();
3197      }
3198  
3199      // Save locks
3200      var allowSlideNext = swiper.allowSlideNext;
3201      var allowSlidePrev = swiper.allowSlidePrev;
3202      var snapGrid = swiper.snapGrid;
3203  
3204      // Disable locks on resize
3205      swiper.allowSlideNext = true;
3206      swiper.allowSlidePrev = true;
3207  
3208      swiper.updateSize();
3209      swiper.updateSlides();
3210  
3211      if (params.freeMode) {
3212        var newTranslate = Math.min(Math.max(swiper.translate, swiper.maxTranslate()), swiper.minTranslate());
3213        swiper.setTranslate(newTranslate);
3214        swiper.updateActiveIndex();
3215        swiper.updateSlidesClasses();
3216  
3217        if (params.autoHeight) {
3218          swiper.updateAutoHeight();
3219        }
3220      } else {
3221        swiper.updateSlidesClasses();
3222        if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {
3223          swiper.slideTo(swiper.slides.length - 1, 0, false, true);
3224        } else {
3225          swiper.slideTo(swiper.activeIndex, 0, false, true);
3226        }
3227      }
3228      if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
3229        swiper.autoplay.run();
3230      }
3231      // Return locks after resize
3232      swiper.allowSlidePrev = allowSlidePrev;
3233      swiper.allowSlideNext = allowSlideNext;
3234  
3235      if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
3236        swiper.checkOverflow();
3237      }
3238    }
3239  
3240    function onClick (e) {
3241      var swiper = this;
3242      if (!swiper.allowClick) {
3243        if (swiper.params.preventClicks) { e.preventDefault(); }
3244        if (swiper.params.preventClicksPropagation && swiper.animating) {
3245          e.stopPropagation();
3246          e.stopImmediatePropagation();
3247        }
3248      }
3249    }
3250  
3251    var dummyEventAttached = false;
3252    function dummyEventListener() {}
3253  
3254    function attachEvents() {
3255      var swiper = this;
3256      var params = swiper.params;
3257      var touchEvents = swiper.touchEvents;
3258      var el = swiper.el;
3259      var wrapperEl = swiper.wrapperEl;
3260  
3261      {
3262        swiper.onTouchStart = onTouchStart.bind(swiper);
3263        swiper.onTouchMove = onTouchMove.bind(swiper);
3264        swiper.onTouchEnd = onTouchEnd.bind(swiper);
3265      }
3266  
3267      swiper.onClick = onClick.bind(swiper);
3268  
3269      var target = params.touchEventsTarget === 'container' ? el : wrapperEl;
3270      var capture = !!params.nested;
3271  
3272      // Touch Events
3273      {
3274        if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) {
3275          target.addEventListener(touchEvents.start, swiper.onTouchStart, false);
3276          doc.addEventListener(touchEvents.move, swiper.onTouchMove, capture);
3277          doc.addEventListener(touchEvents.end, swiper.onTouchEnd, false);
3278        } else {
3279          if (Support.touch) {
3280            var passiveListener = touchEvents.start === 'touchstart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
3281            target.addEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
3282            target.addEventListener(touchEvents.move, swiper.onTouchMove, Support.passiveListener ? { passive: false, capture: capture } : capture);
3283            target.addEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
3284  
3285            if (!dummyEventAttached) {
3286              doc.addEventListener('touchstart', dummyEventListener);
3287              dummyEventAttached = true;
3288            }
3289          }
3290          if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {
3291            target.addEventListener('mousedown', swiper.onTouchStart, false);
3292            doc.addEventListener('mousemove', swiper.onTouchMove, capture);
3293            doc.addEventListener('mouseup', swiper.onTouchEnd, false);
3294          }
3295        }
3296        // Prevent Links Clicks
3297        if (params.preventClicks || params.preventClicksPropagation) {
3298          target.addEventListener('click', swiper.onClick, true);
3299        }
3300      }
3301  
3302      // Resize handler
3303      swiper.on((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize, true);
3304    }
3305  
3306    function detachEvents() {
3307      var swiper = this;
3308  
3309      var params = swiper.params;
3310      var touchEvents = swiper.touchEvents;
3311      var el = swiper.el;
3312      var wrapperEl = swiper.wrapperEl;
3313  
3314      var target = params.touchEventsTarget === 'container' ? el : wrapperEl;
3315      var capture = !!params.nested;
3316  
3317      // Touch Events
3318      {
3319        if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) {
3320          target.removeEventListener(touchEvents.start, swiper.onTouchStart, false);
3321          doc.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
3322          doc.removeEventListener(touchEvents.end, swiper.onTouchEnd, false);
3323        } else {
3324          if (Support.touch) {
3325            var passiveListener = touchEvents.start === 'onTouchStart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
3326            target.removeEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
3327            target.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
3328            target.removeEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
3329          }
3330          if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {
3331            target.removeEventListener('mousedown', swiper.onTouchStart, false);
3332            doc.removeEventListener('mousemove', swiper.onTouchMove, capture);
3333            doc.removeEventListener('mouseup', swiper.onTouchEnd, false);
3334          }
3335        }
3336        // Prevent Links Clicks
3337        if (params.preventClicks || params.preventClicksPropagation) {
3338          target.removeEventListener('click', swiper.onClick, true);
3339        }
3340      }
3341  
3342      // Resize handler
3343      swiper.off((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize);
3344    }
3345  
3346    var events = {
3347      attachEvents: attachEvents,
3348      detachEvents: detachEvents,
3349    };
3350  
3351    function setBreakpoint () {
3352      var swiper = this;
3353      var activeIndex = swiper.activeIndex;
3354      var initialized = swiper.initialized;
3355      var loopedSlides = swiper.loopedSlides; if ( loopedSlides === void 0 ) loopedSlides = 0;
3356      var params = swiper.params;
3357      var breakpoints = params.breakpoints;
3358      if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) { return; }
3359  
3360      // Set breakpoint for window width and update parameters
3361      var breakpoint = swiper.getBreakpoint(breakpoints);
3362  
3363      if (breakpoint && swiper.currentBreakpoint !== breakpoint) {
3364        var breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;
3365        if (breakpointOnlyParams) {
3366          ['slidesPerView', 'spaceBetween', 'slidesPerGroup'].forEach(function (param) {
3367            var paramValue = breakpointOnlyParams[param];
3368            if (typeof paramValue === 'undefined') { return; }
3369            if (param === 'slidesPerView' && (paramValue === 'AUTO' || paramValue === 'auto')) {
3370              breakpointOnlyParams[param] = 'auto';
3371            } else if (param === 'slidesPerView') {
3372              breakpointOnlyParams[param] = parseFloat(paramValue);
3373            } else {
3374              breakpointOnlyParams[param] = parseInt(paramValue, 10);
3375            }
3376          });
3377        }
3378  
3379        var breakpointParams = breakpointOnlyParams || swiper.originalParams;
3380        var directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;
3381        var needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);
3382  
3383        if (directionChanged && initialized) {
3384          swiper.changeDirection();
3385        }
3386  
3387        Utils.extend(swiper.params, breakpointParams);
3388  
3389        Utils.extend(swiper, {
3390          allowTouchMove: swiper.params.allowTouchMove,
3391          allowSlideNext: swiper.params.allowSlideNext,
3392          allowSlidePrev: swiper.params.allowSlidePrev,
3393        });
3394  
3395        swiper.currentBreakpoint = breakpoint;
3396  
3397        if (needsReLoop && initialized) {
3398          swiper.loopDestroy();
3399          swiper.loopCreate();
3400          swiper.updateSlides();
3401          swiper.slideTo((activeIndex - loopedSlides) + swiper.loopedSlides, 0, false);
3402        }
3403  
3404        swiper.emit('breakpoint', breakpointParams);
3405      }
3406    }
3407  
3408    function getBreakpoint (breakpoints) {
3409      var swiper = this;
3410      // Get breakpoint for window width
3411      if (!breakpoints) { return undefined; }
3412      var breakpoint = false;
3413      var points = [];
3414      Object.keys(breakpoints).forEach(function (point) {
3415        points.push(point);
3416      });
3417      points.sort(function (a, b) { return parseInt(a, 10) - parseInt(b, 10); });
3418      for (var i = 0; i < points.length; i += 1) {
3419        var point = points[i];
3420        if (swiper.params.breakpointsInverse) {
3421          if (point <= win.innerWidth) {
3422            breakpoint = point;
3423          }
3424        } else if (point >= win.innerWidth && !breakpoint) {
3425          breakpoint = point;
3426        }
3427      }
3428      return breakpoint || 'max';
3429    }
3430  
3431    var breakpoints = { setBreakpoint: setBreakpoint, getBreakpoint: getBreakpoint };
3432  
3433    function addClasses () {
3434      var swiper = this;
3435      var classNames = swiper.classNames;
3436      var params = swiper.params;
3437      var rtl = swiper.rtl;
3438      var $el = swiper.$el;
3439      var suffixes = [];
3440  
3441      suffixes.push('initialized');
3442      suffixes.push(params.direction);
3443  
3444      if (params.freeMode) {
3445        suffixes.push('free-mode');
3446      }
3447      if (!Support.flexbox) {
3448        suffixes.push('no-flexbox');
3449      }
3450      if (params.autoHeight) {
3451        suffixes.push('autoheight');
3452      }
3453      if (rtl) {
3454        suffixes.push('rtl');
3455      }
3456      if (params.slidesPerColumn > 1) {
3457        suffixes.push('multirow');
3458      }
3459      if (Device.android) {
3460        suffixes.push('android');
3461      }
3462      if (Device.ios) {
3463        suffixes.push('ios');
3464      }
3465      // WP8 Touch Events Fix
3466      if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) {
3467        suffixes.push(("wp8-" + (params.direction)));
3468      }
3469  
3470      suffixes.forEach(function (suffix) {
3471        classNames.push(params.containerModifierClass + suffix);
3472      });
3473  
3474      $el.addClass(classNames.join(' '));
3475    }
3476  
3477    function removeClasses () {
3478      var swiper = this;
3479      var $el = swiper.$el;
3480      var classNames = swiper.classNames;
3481  
3482      $el.removeClass(classNames.join(' '));
3483    }
3484  
3485    var classes = { addClasses: addClasses, removeClasses: removeClasses };
3486  
3487    function loadImage (imageEl, src, srcset, sizes, checkForComplete, callback) {
3488      var image;
3489      function onReady() {
3490        if (callback) { callback(); }
3491      }
3492      if (!imageEl.complete || !checkForComplete) {
3493        if (src) {
3494          image = new win.Image();
3495          image.onload = onReady;
3496          image.onerror = onReady;
3497          if (sizes) {
3498            image.sizes = sizes;
3499          }
3500          if (srcset) {
3501            image.srcset = srcset;
3502          }
3503          if (src) {
3504            image.src = src;
3505          }
3506        } else {
3507          onReady();
3508        }
3509      } else {
3510        // image already loaded...
3511        onReady();
3512      }
3513    }
3514  
3515    function preloadImages () {
3516      var swiper = this;
3517      swiper.imagesToLoad = swiper.$el.find('img');
3518      function onReady() {
3519        if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) { return; }
3520        if (swiper.imagesLoaded !== undefined) { swiper.imagesLoaded += 1; }
3521        if (swiper.imagesLoaded === swiper.imagesToLoad.length) {
3522          if (swiper.params.updateOnImagesReady) { swiper.update(); }
3523          swiper.emit('imagesReady');
3524        }
3525      }
3526      for (var i = 0; i < swiper.imagesToLoad.length; i += 1) {
3527        var imageEl = swiper.imagesToLoad[i];
3528        swiper.loadImage(
3529          imageEl,
3530          imageEl.currentSrc || imageEl.getAttribute('src'),
3531          imageEl.srcset || imageEl.getAttribute('srcset'),
3532          imageEl.sizes || imageEl.getAttribute('sizes'),
3533          true,
3534          onReady
3535        );
3536      }
3537    }
3538  
3539    var images = {
3540      loadImage: loadImage,
3541      preloadImages: preloadImages,
3542    };
3543  
3544    function checkOverflow() {
3545      var swiper = this;
3546      var wasLocked = swiper.isLocked;
3547  
3548      swiper.isLocked = swiper.snapGrid.length === 1;
3549      swiper.allowSlideNext = !swiper.isLocked;
3550      swiper.allowSlidePrev = !swiper.isLocked;
3551  
3552      // events
3553      if (wasLocked !== swiper.isLocked) { swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); }
3554  
3555      if (wasLocked && wasLocked !== swiper.isLocked) {
3556        swiper.isEnd = false;
3557        swiper.navigation.update();
3558      }
3559    }
3560  
3561    var checkOverflow$1 = { checkOverflow: checkOverflow };
3562  
3563    var defaults = {
3564      init: true,
3565      direction: 'horizontal',
3566      touchEventsTarget: 'container',
3567      initialSlide: 0,
3568      speed: 300,
3569      //
3570      preventInteractionOnTransition: false,
3571  
3572      // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView).
3573      edgeSwipeDetection: false,
3574      edgeSwipeThreshold: 20,
3575  
3576      // Free mode
3577      freeMode: false,
3578      freeModeMomentum: true,
3579      freeModeMomentumRatio: 1,
3580      freeModeMomentumBounce: true,
3581      freeModeMomentumBounceRatio: 1,
3582      freeModeMomentumVelocityRatio: 1,
3583      freeModeSticky: false,
3584      freeModeMinimumVelocity: 0.02,
3585  
3586      // Autoheight
3587      autoHeight: false,
3588  
3589      // Set wrapper width
3590      setWrapperSize: false,
3591  
3592      // Virtual Translate
3593      virtualTranslate: false,
3594  
3595      // Effects
3596      effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
3597  
3598      // Breakpoints
3599      breakpoints: undefined,
3600      breakpointsInverse: false,
3601  
3602      // Slides grid
3603      spaceBetween: 0,
3604      slidesPerView: 1,
3605      slidesPerColumn: 1,
3606      slidesPerColumnFill: 'column',
3607      slidesPerGroup: 1,
3608      centeredSlides: false,
3609      slidesOffsetBefore: 0, // in px
3610      slidesOffsetAfter: 0, // in px
3611      normalizeSlideIndex: true,
3612      centerInsufficientSlides: false,
3613  
3614      // Disable swiper and hide navigation when container not overflow
3615      watchOverflow: false,
3616  
3617      // Round length
3618      roundLengths: false,
3619  
3620      // Touches
3621      touchRatio: 1,
3622      touchAngle: 45,
3623      simulateTouch: true,
3624      shortSwipes: true,
3625      longSwipes: true,
3626      longSwipesRatio: 0.5,
3627      longSwipesMs: 300,
3628      followFinger: true,
3629      allowTouchMove: true,
3630      threshold: 0,
3631      touchMoveStopPropagation: true,
3632      touchStartPreventDefault: true,
3633      touchStartForcePreventDefault: false,
3634      touchReleaseOnEdges: false,
3635  
3636      // Unique Navigation Elements
3637      uniqueNavElements: true,
3638  
3639      // Resistance
3640      resistance: true,
3641      resistanceRatio: 0.85,
3642  
3643      // Progress
3644      watchSlidesProgress: false,
3645      watchSlidesVisibility: false,
3646  
3647      // Cursor
3648      grabCursor: false,
3649  
3650      // Clicks
3651      preventClicks: true,
3652      preventClicksPropagation: true,
3653      slideToClickedSlide: false,
3654  
3655      // Images
3656      preloadImages: true,
3657      updateOnImagesReady: true,
3658  
3659      // loop
3660      loop: false,
3661      loopAdditionalSlides: 0,
3662      loopedSlides: null,
3663      loopFillGroupWithBlank: false,
3664  
3665      // Swiping/no swiping
3666      allowSlidePrev: true,
3667      allowSlideNext: true,
3668      swipeHandler: null, // '.swipe-handler',
3669      noSwiping: true,
3670      noSwipingClass: 'swiper-no-swiping',
3671      noSwipingSelector: null,
3672  
3673      // Passive Listeners
3674      passiveListeners: true,
3675  
3676      // NS
3677      containerModifierClass: 'swiper-container-', // NEW
3678      slideClass: 'swiper-slide',
3679      slideBlankClass: 'swiper-slide-invisible-blank',
3680      slideActiveClass: 'swiper-slide-active',
3681      slideDuplicateActiveClass: 'swiper-slide-duplicate-active',
3682      slideVisibleClass: 'swiper-slide-visible',
3683      slideDuplicateClass: 'swiper-slide-duplicate',
3684      slideNextClass: 'swiper-slide-next',
3685      slideDuplicateNextClass: 'swiper-slide-duplicate-next',
3686      slidePrevClass: 'swiper-slide-prev',
3687      slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',
3688      wrapperClass: 'swiper-wrapper',
3689  
3690      // Callbacks
3691      runCallbacksOnInit: true,
3692    };
3693  
3694    /* eslint no-param-reassign: "off" */
3695  
3696    var prototypes = {
3697      update: update,
3698      translate: translate,
3699      transition: transition$1,
3700      slide: slide,
3701      loop: loop,
3702      grabCursor: grabCursor,
3703      manipulation: manipulation,
3704      events: events,
3705      breakpoints: breakpoints,
3706      checkOverflow: checkOverflow$1,
3707      classes: classes,
3708      images: images,
3709    };
3710  
3711    var extendedDefaults = {};
3712  
3713    var Swiper = /*@__PURE__*/(function (SwiperClass) {
3714      function Swiper() {
3715        var assign;
3716  
3717        var args = [], len = arguments.length;
3718        while ( len-- ) args[ len ] = arguments[ len ];
3719        var el;
3720        var params;
3721        if (args.length === 1 && args[0].constructor && args[0].constructor === Object) {
3722          params = args[0];
3723        } else {
3724          (assign = args, el = assign[0], params = assign[1]);
3725        }
3726        if (!params) { params = {}; }
3727  
3728        params = Utils.extend({}, params);
3729        if (el && !params.el) { params.el = el; }
3730  
3731        SwiperClass.call(this, params);
3732  
3733        Object.keys(prototypes).forEach(function (prototypeGroup) {
3734          Object.keys(prototypes[prototypeGroup]).forEach(function (protoMethod) {
3735            if (!Swiper.prototype[protoMethod]) {
3736              Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];
3737            }
3738          });
3739        });
3740  
3741        // Swiper Instance
3742        var swiper = this;
3743        if (typeof swiper.modules === 'undefined') {
3744          swiper.modules = {};
3745        }
3746        Object.keys(swiper.modules).forEach(function (moduleName) {
3747          var module = swiper.modules[moduleName];
3748          if (module.params) {
3749            var moduleParamName = Object.keys(module.params)[0];
3750            var moduleParams = module.params[moduleParamName];
3751            if (typeof moduleParams !== 'object' || moduleParams === null) { return; }
3752            if (!(moduleParamName in params && 'enabled' in moduleParams)) { return; }
3753            if (params[moduleParamName] === true) {
3754              params[moduleParamName] = { enabled: true };
3755            }
3756            if (
3757              typeof params[moduleParamName] === 'object'
3758              && !('enabled' in params[moduleParamName])
3759            ) {
3760              params[moduleParamName].enabled = true;
3761            }
3762            if (!params[moduleParamName]) { params[moduleParamName] = { enabled: false }; }
3763          }
3764        });
3765  
3766        // Extend defaults with modules params
3767        var swiperParams = Utils.extend({}, defaults);
3768        swiper.useModulesParams(swiperParams);
3769  
3770        // Extend defaults with passed params
3771        swiper.params = Utils.extend({}, swiperParams, extendedDefaults, params);
3772        swiper.originalParams = Utils.extend({}, swiper.params);
3773        swiper.passedParams = Utils.extend({}, params);
3774  
3775        // Save Dom lib
3776        swiper.$ = $;
3777  
3778        // Find el
3779        var $el = $(swiper.params.el);
3780        el = $el[0];
3781  
3782        if (!el) {
3783          return undefined;
3784        }
3785  
3786        if ($el.length > 1) {
3787          var swipers = [];
3788          $el.each(function (index, containerEl) {
3789            var newParams = Utils.extend({}, params, { el: containerEl });
3790            swipers.push(new Swiper(newParams));
3791          });
3792          return swipers;
3793        }
3794  
3795        el.swiper = swiper;
3796        $el.data('swiper', swiper);
3797  
3798        // Find Wrapper
3799        var $wrapperEl = $el.children(("." + (swiper.params.wrapperClass)));
3800  
3801        // Extend Swiper
3802        Utils.extend(swiper, {
3803          $el: $el,
3804          el: el,
3805          $wrapperEl: $wrapperEl,
3806          wrapperEl: $wrapperEl[0],
3807  
3808          // Classes
3809          classNames: [],
3810  
3811          // Slides
3812          slides: $(),
3813          slidesGrid: [],
3814          snapGrid: [],
3815          slidesSizesGrid: [],
3816  
3817          // isDirection
3818          isHorizontal: function isHorizontal() {
3819            return swiper.params.direction === 'horizontal';
3820          },
3821          isVertical: function isVertical() {
3822            return swiper.params.direction === 'vertical';
3823          },
3824          // RTL
3825          rtl: (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),
3826          rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),
3827          wrongRTL: $wrapperEl.css('display') === '-webkit-box',
3828  
3829          // Indexes
3830          activeIndex: 0,
3831          realIndex: 0,
3832  
3833          //
3834          isBeginning: true,
3835          isEnd: false,
3836  
3837          // Props
3838          translate: 0,
3839          previousTranslate: 0,
3840          progress: 0,
3841          velocity: 0,
3842          animating: false,
3843  
3844          // Locks
3845          allowSlideNext: swiper.params.allowSlideNext,
3846          allowSlidePrev: swiper.params.allowSlidePrev,
3847  
3848          // Touch Events
3849          touchEvents: (function touchEvents() {
3850            var touch = ['touchstart', 'touchmove', 'touchend'];
3851            var desktop = ['mousedown', 'mousemove', 'mouseup'];
3852            if (Support.pointerEvents) {
3853              desktop = ['pointerdown', 'pointermove', 'pointerup'];
3854            } else if (Support.prefixedPointerEvents) {
3855              desktop = ['MSPointerDown', 'MSPointerMove', 'MSPointerUp'];
3856            }
3857            swiper.touchEventsTouch = {
3858              start: touch[0],
3859              move: touch[1],
3860              end: touch[2],
3861            };
3862            swiper.touchEventsDesktop = {
3863              start: desktop[0],
3864              move: desktop[1],
3865              end: desktop[2],
3866            };
3867            return Support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop;
3868          }()),
3869          touchEventsData: {
3870            isTouched: undefined,
3871            isMoved: undefined,
3872            allowTouchCallbacks: undefined,
3873            touchStartTime: undefined,
3874            isScrolling: undefined,
3875            currentTranslate: undefined,
3876            startTranslate: undefined,
3877            allowThresholdMove: undefined,
3878            // Form elements to match
3879            formElements: 'input, select, option, textarea, button, video',
3880            // Last click time
3881            lastClickTime: Utils.now(),
3882            clickTimeout: undefined,
3883            // Velocities
3884            velocities: [],
3885            allowMomentumBounce: undefined,
3886            isTouchEvent: undefined,
3887            startMoving: undefined,
3888          },
3889  
3890          // Clicks
3891          allowClick: true,
3892  
3893          // Touches
3894          allowTouchMove: swiper.params.allowTouchMove,
3895  
3896          touches: {
3897            startX: 0,
3898            startY: 0,
3899            currentX: 0,
3900            currentY: 0,
3901            diff: 0,
3902          },
3903  
3904          // Images
3905          imagesToLoad: [],
3906          imagesLoaded: 0,
3907  
3908        });
3909  
3910        // Install Modules
3911        swiper.useModules();
3912  
3913        // Init
3914        if (swiper.params.init) {
3915          swiper.init();
3916        }
3917  
3918        // Return app instance
3919        return swiper;
3920      }
3921  
3922      if ( SwiperClass ) Swiper.__proto__ = SwiperClass;
3923      Swiper.prototype = Object.create( SwiperClass && SwiperClass.prototype );
3924      Swiper.prototype.constructor = Swiper;
3925  
3926      var staticAccessors = { extendedDefaults: { configurable: true },defaults: { configurable: true },Class: { configurable: true },$: { configurable: true } };
3927  
3928      Swiper.prototype.slidesPerViewDynamic = function slidesPerViewDynamic () {
3929        var swiper = this;
3930        var params = swiper.params;
3931        var slides = swiper.slides;
3932        var slidesGrid = swiper.slidesGrid;
3933        var swiperSize = swiper.size;
3934        var activeIndex = swiper.activeIndex;
3935        var spv = 1;
3936        if (params.centeredSlides) {
3937          var slideSize = slides[activeIndex].swiperSlideSize;
3938          var breakLoop;
3939          for (var i = activeIndex + 1; i < slides.length; i += 1) {
3940            if (slides[i] && !breakLoop) {
3941              slideSize += slides[i].swiperSlideSize;
3942              spv += 1;
3943              if (slideSize > swiperSize) { breakLoop = true; }
3944            }
3945          }
3946          for (var i$1 = activeIndex - 1; i$1 >= 0; i$1 -= 1) {
3947            if (slides[i$1] && !breakLoop) {
3948              slideSize += slides[i$1].swiperSlideSize;
3949              spv += 1;
3950              if (slideSize > swiperSize) { breakLoop = true; }
3951            }
3952          }
3953        } else {
3954          for (var i$2 = activeIndex + 1; i$2 < slides.length; i$2 += 1) {
3955            if (slidesGrid[i$2] - slidesGrid[activeIndex] < swiperSize) {
3956              spv += 1;
3957            }
3958          }
3959        }
3960        return spv;
3961      };
3962  
3963      Swiper.prototype.update = function update () {
3964        var swiper = this;
3965        if (!swiper || swiper.destroyed) { return; }
3966        var snapGrid = swiper.snapGrid;
3967        var params = swiper.params;
3968        // Breakpoints
3969        if (params.breakpoints) {
3970          swiper.setBreakpoint();
3971        }
3972        swiper.updateSize();
3973        swiper.updateSlides();
3974        swiper.updateProgress();
3975        swiper.updateSlidesClasses();
3976  
3977        function setTranslate() {
3978          var translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;
3979          var newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());
3980          swiper.setTranslate(newTranslate);
3981          swiper.updateActiveIndex();
3982          swiper.updateSlidesClasses();
3983        }
3984        var translated;
3985        if (swiper.params.freeMode) {
3986          setTranslate();
3987          if (swiper.params.autoHeight) {
3988            swiper.updateAutoHeight();
3989          }
3990        } else {
3991          if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {
3992            translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);
3993          } else {
3994            translated = swiper.slideTo(swiper.activeIndex, 0, false, true);
3995          }
3996          if (!translated) {
3997            setTranslate();
3998          }
3999        }
4000        if (params.watchOverflow && snapGrid !== swiper.snapGrid) {
4001          swiper.checkOverflow();
4002        }
4003        swiper.emit('update');
4004      };
4005  
4006      Swiper.prototype.changeDirection = function changeDirection (newDirection, needUpdate) {
4007        if ( needUpdate === void 0 ) needUpdate = true;
4008  
4009        var swiper = this;
4010        var currentDirection = swiper.params.direction;
4011        if (!newDirection) {
4012          // eslint-disable-next-line
4013          newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';
4014        }
4015        if ((newDirection === currentDirection) || (newDirection !== 'horizontal' && newDirection !== 'vertical')) {
4016          return swiper;
4017        }
4018  
4019        swiper.$el
4020          .removeClass(("" + (swiper.params.containerModifierClass) + currentDirection + " wp8-" + currentDirection))
4021          .addClass(("" + (swiper.params.containerModifierClass) + newDirection));
4022  
4023        if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) {
4024          swiper.$el.addClass(((swiper.params.containerModifierClass) + "wp8-" + newDirection));
4025        }
4026  
4027        swiper.params.direction = newDirection;
4028  
4029        swiper.slides.each(function (slideIndex, slideEl) {
4030          if (newDirection === 'vertical') {
4031            slideEl.style.width = '';
4032          } else {
4033            slideEl.style.height = '';
4034          }
4035        });
4036  
4037        swiper.emit('changeDirection');
4038        if (needUpdate) { swiper.update(); }
4039  
4040        return swiper;
4041      };
4042  
4043      Swiper.prototype.init = function init () {
4044        var swiper = this;
4045        if (swiper.initialized) { return; }
4046  
4047        swiper.emit('beforeInit');
4048  
4049        // Set breakpoint
4050        if (swiper.params.breakpoints) {
4051          swiper.setBreakpoint();
4052        }
4053  
4054        // Add Classes
4055        swiper.addClasses();
4056  
4057        // Create loop
4058        if (swiper.params.loop) {
4059          swiper.loopCreate();
4060        }
4061  
4062        // Update size
4063        swiper.updateSize();
4064  
4065        // Update slides
4066        swiper.updateSlides();
4067  
4068        if (swiper.params.watchOverflow) {
4069          swiper.checkOverflow();
4070        }
4071  
4072        // Set Grab Cursor
4073        if (swiper.params.grabCursor) {
4074          swiper.setGrabCursor();
4075        }
4076  
4077        if (swiper.params.preloadImages) {
4078          swiper.preloadImages();
4079        }
4080  
4081        // Slide To Initial Slide
4082        if (swiper.params.loop) {
4083          swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit);
4084        } else {
4085          swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit);
4086        }
4087  
4088        // Attach events
4089        swiper.attachEvents();
4090  
4091        // Init Flag
4092        swiper.initialized = true;
4093  
4094        // Emit
4095        swiper.emit('init');
4096      };
4097  
4098      Swiper.prototype.destroy = function destroy (deleteInstance, cleanStyles) {
4099        if ( deleteInstance === void 0 ) deleteInstance = true;
4100        if ( cleanStyles === void 0 ) cleanStyles = true;
4101  
4102        var swiper = this;
4103        var params = swiper.params;
4104        var $el = swiper.$el;
4105        var $wrapperEl = swiper.$wrapperEl;
4106        var slides = swiper.slides;
4107  
4108        if (typeof swiper.params === 'undefined' || swiper.destroyed) {
4109          return null;
4110        }
4111  
4112        swiper.emit('beforeDestroy');
4113  
4114        // Init Flag
4115        swiper.initialized = false;
4116  
4117        // Detach events
4118        swiper.detachEvents();
4119  
4120        // Destroy loop
4121        if (params.loop) {
4122          swiper.loopDestroy();
4123        }
4124  
4125        // Cleanup styles
4126        if (cleanStyles) {
4127          swiper.removeClasses();
4128          $el.removeAttr('style');
4129          $wrapperEl.removeAttr('style');
4130          if (slides && slides.length) {
4131            slides
4132              .removeClass([
4133                params.slideVisibleClass,
4134                params.slideActiveClass,
4135                params.slideNextClass,
4136                params.slidePrevClass ].join(' '))
4137              .removeAttr('style')
4138              .removeAttr('data-swiper-slide-index')
4139              .removeAttr('data-swiper-column')
4140              .removeAttr('data-swiper-row');
4141          }
4142        }
4143  
4144        swiper.emit('destroy');
4145  
4146        // Detach emitter events
4147        Object.keys(swiper.eventsListeners).forEach(function (eventName) {
4148          swiper.off(eventName);
4149        });
4150  
4151        if (deleteInstance !== false) {
4152          swiper.$el[0].swiper = null;
4153          swiper.$el.data('swiper', null);
4154          Utils.deleteProps(swiper);
4155        }
4156        swiper.destroyed = true;
4157  
4158        return null;
4159      };
4160  
4161      Swiper.extendDefaults = function extendDefaults (newDefaults) {
4162        Utils.extend(extendedDefaults, newDefaults);
4163      };
4164  
4165      staticAccessors.extendedDefaults.get = function () {
4166        return extendedDefaults;
4167      };
4168  
4169      staticAccessors.defaults.get = function () {
4170        return defaults;
4171      };
4172  
4173      staticAccessors.Class.get = function () {
4174        return SwiperClass;
4175      };
4176  
4177      staticAccessors.$.get = function () {
4178        return $;
4179      };
4180  
4181      Object.defineProperties( Swiper, staticAccessors );
4182  
4183      return Swiper;
4184    }(SwiperClass));
4185  
4186    var Device$1 = {
4187      name: 'device',
4188      proto: {
4189        device: Device,
4190      },
4191      static: {
4192        device: Device,
4193      },
4194    };
4195  
4196    var Support$1 = {
4197      name: 'support',
4198      proto: {
4199        support: Support,
4200      },
4201      static: {
4202        support: Support,
4203      },
4204    };
4205  
4206    var Browser$1 = {
4207      name: 'browser',
4208      proto: {
4209        browser: Browser,
4210      },
4211      static: {
4212        browser: Browser,
4213      },
4214    };
4215  
4216    var Resize = {
4217      name: 'resize',
4218      create: function create() {
4219        var swiper = this;
4220        Utils.extend(swiper, {
4221          resize: {
4222            resizeHandler: function resizeHandler() {
4223              if (!swiper || swiper.destroyed || !swiper.initialized) { return; }
4224              swiper.emit('beforeResize');
4225              swiper.emit('resize');
4226            },
4227            orientationChangeHandler: function orientationChangeHandler() {
4228              if (!swiper || swiper.destroyed || !swiper.initialized) { return; }
4229              swiper.emit('orientationchange');
4230            },
4231          },
4232        });
4233      },
4234      on: {
4235        init: function init() {
4236          var swiper = this;
4237          // Emit resize
4238          win.addEventListener('resize', swiper.resize.resizeHandler);
4239  
4240          // Emit orientationchange
4241          win.addEventListener('orientationchange', swiper.resize.orientationChangeHandler);
4242        },
4243        destroy: function destroy() {
4244          var swiper = this;
4245          win.removeEventListener('resize', swiper.resize.resizeHandler);
4246          win.removeEventListener('orientationchange', swiper.resize.orientationChangeHandler);
4247        },
4248      },
4249    };
4250  
4251    var Observer = {
4252      func: win.MutationObserver || win.WebkitMutationObserver,
4253      attach: function attach(target, options) {
4254        if ( options === void 0 ) options = {};
4255  
4256        var swiper = this;
4257  
4258        var ObserverFunc = Observer.func;
4259        var observer = new ObserverFunc(function (mutations) {
4260          // The observerUpdate event should only be triggered
4261          // once despite the number of mutations.  Additional
4262          // triggers are redundant and are very costly
4263          if (mutations.length === 1) {
4264            swiper.emit('observerUpdate', mutations[0]);
4265            return;
4266          }
4267          var observerUpdate = function observerUpdate() {
4268            swiper.emit('observerUpdate', mutations[0]);
4269          };
4270  
4271          if (win.requestAnimationFrame) {
4272            win.requestAnimationFrame(observerUpdate);
4273          } else {
4274            win.setTimeout(observerUpdate, 0);
4275          }
4276        });
4277  
4278        observer.observe(target, {
4279          attributes: typeof options.attributes === 'undefined' ? true : options.attributes,
4280          childList: typeof options.childList === 'undefined' ? true : options.childList,
4281          characterData: typeof options.characterData === 'undefined' ? true : options.characterData,
4282        });
4283  
4284        swiper.observer.observers.push(observer);
4285      },
4286      init: function init() {
4287        var swiper = this;
4288        if (!Support.observer || !swiper.params.observer) { return; }
4289        if (swiper.params.observeParents) {
4290          var containerParents = swiper.$el.parents();
4291          for (var i = 0; i < containerParents.length; i += 1) {
4292            swiper.observer.attach(containerParents[i]);
4293          }
4294        }
4295        // Observe container
4296        swiper.observer.attach(swiper.$el[0], { childList: swiper.params.observeSlideChildren });
4297  
4298        // Observe wrapper
4299        swiper.observer.attach(swiper.$wrapperEl[0], { attributes: false });
4300      },
4301      destroy: function destroy() {
4302        var swiper = this;
4303        swiper.observer.observers.forEach(function (observer) {
4304          observer.disconnect();
4305        });
4306        swiper.observer.observers = [];
4307      },
4308    };
4309  
4310    var Observer$1 = {
4311      name: 'observer',
4312      params: {
4313        observer: false,
4314        observeParents: false,
4315        observeSlideChildren: false,
4316      },
4317      create: function create() {
4318        var swiper = this;
4319        Utils.extend(swiper, {
4320          observer: {
4321            init: Observer.init.bind(swiper),
4322            attach: Observer.attach.bind(swiper),
4323            destroy: Observer.destroy.bind(swiper),
4324            observers: [],
4325          },
4326        });
4327      },
4328      on: {
4329        init: function init() {
4330          var swiper = this;
4331          swiper.observer.init();
4332        },
4333        destroy: function destroy() {
4334          var swiper = this;
4335          swiper.observer.destroy();
4336        },
4337      },
4338    };
4339  
4340    var Virtual = {
4341      update: function update(force) {
4342        var swiper = this;
4343        var ref = swiper.params;
4344        var slidesPerView = ref.slidesPerView;
4345        var slidesPerGroup = ref.slidesPerGroup;
4346        var centeredSlides = ref.centeredSlides;
4347        var ref$1 = swiper.params.virtual;
4348        var addSlidesBefore = ref$1.addSlidesBefore;
4349        var addSlidesAfter = ref$1.addSlidesAfter;
4350        var ref$2 = swiper.virtual;
4351        var previousFrom = ref$2.from;
4352        var previousTo = ref$2.to;
4353        var slides = ref$2.slides;
4354        var previousSlidesGrid = ref$2.slidesGrid;
4355        var renderSlide = ref$2.renderSlide;
4356        var previousOffset = ref$2.offset;
4357        swiper.updateActiveIndex();
4358        var activeIndex = swiper.activeIndex || 0;
4359  
4360        var offsetProp;
4361        if (swiper.rtlTranslate) { offsetProp = 'right'; }
4362        else { offsetProp = swiper.isHorizontal() ? 'left' : 'top'; }
4363  
4364        var slidesAfter;
4365        var slidesBefore;
4366        if (centeredSlides) {
4367          slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;
4368          slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;
4369        } else {
4370          slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesBefore;
4371          slidesBefore = slidesPerGroup + addSlidesAfter;
4372        }
4373        var from = Math.max((activeIndex || 0) - slidesBefore, 0);
4374        var to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);
4375        var offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);
4376  
4377        Utils.extend(swiper.virtual, {
4378          from: from,
4379          to: to,
4380          offset: offset,
4381          slidesGrid: swiper.slidesGrid,
4382        });
4383  
4384        function onRendered() {
4385          swiper.updateSlides();
4386          swiper.updateProgress();
4387          swiper.updateSlidesClasses();
4388          if (swiper.lazy && swiper.params.lazy.enabled) {
4389            swiper.lazy.load();
4390          }
4391        }
4392  
4393        if (previousFrom === from && previousTo === to && !force) {
4394          if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {
4395            swiper.slides.css(offsetProp, (offset + "px"));
4396          }
4397          swiper.updateProgress();
4398          return;
4399        }
4400        if (swiper.params.virtual.renderExternal) {
4401          swiper.params.virtual.renderExternal.call(swiper, {
4402            offset: offset,
4403            from: from,
4404            to: to,
4405            slides: (function getSlides() {
4406              var slidesToRender = [];
4407              for (var i = from; i <= to; i += 1) {
4408                slidesToRender.push(slides[i]);
4409              }
4410              return slidesToRender;
4411            }()),
4412          });
4413          onRendered();
4414          return;
4415        }
4416        var prependIndexes = [];
4417        var appendIndexes = [];
4418        if (force) {
4419          swiper.$wrapperEl.find(("." + (swiper.params.slideClass))).remove();
4420        } else {
4421          for (var i = previousFrom; i <= previousTo; i += 1) {
4422            if (i < from || i > to) {
4423              swiper.$wrapperEl.find(("." + (swiper.params.slideClass) + "[data-swiper-slide-index=\"" + i + "\"]")).remove();
4424            }
4425          }
4426        }
4427        for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {
4428          if (i$1 >= from && i$1 <= to) {
4429            if (typeof previousTo === 'undefined' || force) {
4430              appendIndexes.push(i$1);
4431            } else {
4432              if (i$1 > previousTo) { appendIndexes.push(i$1); }
4433              if (i$1 < previousFrom) { prependIndexes.push(i$1); }
4434            }
4435          }
4436        }
4437        appendIndexes.forEach(function (index) {
4438          swiper.$wrapperEl.append(renderSlide(slides[index], index));
4439        });
4440        prependIndexes.sort(function (a, b) { return b - a; }).forEach(function (index) {
4441          swiper.$wrapperEl.prepend(renderSlide(slides[index], index));
4442        });
4443        swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, (offset + "px"));
4444        onRendered();
4445      },
4446      renderSlide: function renderSlide(slide, index) {
4447        var swiper = this;
4448        var params = swiper.params.virtual;
4449        if (params.cache && swiper.virtual.cache[index]) {
4450          return swiper.virtual.cache[index];
4451        }
4452        var $slideEl = params.renderSlide
4453          ? $(params.renderSlide.call(swiper, slide, index))
4454          : $(("<div class=\"" + (swiper.params.slideClass) + "\" data-swiper-slide-index=\"" + index + "\">" + slide + "</div>"));
4455        if (!$slideEl.attr('data-swiper-slide-index')) { $slideEl.attr('data-swiper-slide-index', index); }
4456        if (params.cache) { swiper.virtual.cache[index] = $slideEl; }
4457        return $slideEl;
4458      },
4459      appendSlide: function appendSlide(slides) {
4460        var swiper = this;
4461        if (typeof slides === 'object' && 'length' in slides) {
4462          for (var i = 0; i < slides.length; i += 1) {
4463            if (slides[i]) { swiper.virtual.slides.push(slides[i]); }
4464          }
4465        } else {
4466          swiper.virtual.slides.push(slides);
4467        }
4468        swiper.virtual.update(true);
4469      },
4470      prependSlide: function prependSlide(slides) {
4471        var swiper = this;
4472        var activeIndex = swiper.activeIndex;
4473        var newActiveIndex = activeIndex + 1;
4474        var numberOfNewSlides = 1;
4475  
4476        if (Array.isArray(slides)) {
4477          for (var i = 0; i < slides.length; i += 1) {
4478            if (slides[i]) { swiper.virtual.slides.unshift(slides[i]); }
4479          }
4480          newActiveIndex = activeIndex + slides.length;
4481          numberOfNewSlides = slides.length;
4482        } else {
4483          swiper.virtual.slides.unshift(slides);
4484        }
4485        if (swiper.params.virtual.cache) {
4486          var cache = swiper.virtual.cache;
4487          var newCache = {};
4488          Object.keys(cache).forEach(function (cachedIndex) {
4489            newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = cache[cachedIndex];
4490          });
4491          swiper.virtual.cache = newCache;
4492        }
4493        swiper.virtual.update(true);
4494        swiper.slideTo(newActiveIndex, 0);
4495      },
4496      removeSlide: function removeSlide(slidesIndexes) {
4497        var swiper = this;
4498        if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) { return; }
4499        var activeIndex = swiper.activeIndex;
4500        if (Array.isArray(slidesIndexes)) {
4501          for (var i = slidesIndexes.length - 1; i >= 0; i -= 1) {
4502            swiper.virtual.slides.splice(slidesIndexes[i], 1);
4503            if (swiper.params.virtual.cache) {
4504              delete swiper.virtual.cache[slidesIndexes[i]];
4505            }
4506            if (slidesIndexes[i] < activeIndex) { activeIndex -= 1; }
4507            activeIndex = Math.max(activeIndex, 0);
4508          }
4509        } else {
4510          swiper.virtual.slides.splice(slidesIndexes, 1);
4511          if (swiper.params.virtual.cache) {
4512            delete swiper.virtual.cache[slidesIndexes];
4513          }
4514          if (slidesIndexes < activeIndex) { activeIndex -= 1; }
4515          activeIndex = Math.max(activeIndex, 0);
4516        }
4517        swiper.virtual.update(true);
4518        swiper.slideTo(activeIndex, 0);
4519      },
4520      removeAllSlides: function removeAllSlides() {
4521        var swiper = this;
4522        swiper.virtual.slides = [];
4523        if (swiper.params.virtual.cache) {
4524          swiper.virtual.cache = {};
4525        }
4526        swiper.virtual.update(true);
4527        swiper.slideTo(0, 0);
4528      },
4529    };
4530  
4531    var Virtual$1 = {
4532      name: 'virtual',
4533      params: {
4534        virtual: {
4535          enabled: false,
4536          slides: [],
4537          cache: true,
4538          renderSlide: null,
4539          renderExternal: null,
4540          addSlidesBefore: 0,
4541          addSlidesAfter: 0,
4542        },
4543      },
4544      create: function create() {
4545        var swiper = this;
4546        Utils.extend(swiper, {
4547          virtual: {
4548            update: Virtual.update.bind(swiper),
4549            appendSlide: Virtual.appendSlide.bind(swiper),
4550            prependSlide: Virtual.prependSlide.bind(swiper),
4551            removeSlide: Virtual.removeSlide.bind(swiper),
4552            removeAllSlides: Virtual.removeAllSlides.bind(swiper),
4553            renderSlide: Virtual.renderSlide.bind(swiper),
4554            slides: swiper.params.virtual.slides,
4555            cache: {},
4556          },
4557        });
4558      },
4559      on: {
4560        beforeInit: function beforeInit() {
4561          var swiper = this;
4562          if (!swiper.params.virtual.enabled) { return; }
4563          swiper.classNames.push(((swiper.params.containerModifierClass) + "virtual"));
4564          var overwriteParams = {
4565            watchSlidesProgress: true,
4566          };
4567          Utils.extend(swiper.params, overwriteParams);
4568          Utils.extend(swiper.originalParams, overwriteParams);
4569  
4570          if (!swiper.params.initialSlide) {
4571            swiper.virtual.update();
4572          }
4573        },
4574        setTranslate: function setTranslate() {
4575          var swiper = this;
4576          if (!swiper.params.virtual.enabled) { return; }
4577          swiper.virtual.update();
4578        },
4579      },
4580    };
4581  
4582    var Keyboard = {
4583      handle: function handle(event) {
4584        var swiper = this;
4585        var rtl = swiper.rtlTranslate;
4586        var e = event;
4587        if (e.originalEvent) { e = e.originalEvent; } // jquery fix
4588        var kc = e.keyCode || e.charCode;
4589        // Directions locks
4590        if (!swiper.allowSlideNext && ((swiper.isHorizontal() && kc === 39) || (swiper.isVertical() && kc === 40) || kc === 34)) {
4591          return false;
4592        }
4593        if (!swiper.allowSlidePrev && ((swiper.isHorizontal() && kc === 37) || (swiper.isVertical() && kc === 38) || kc === 33)) {
4594          return false;
4595        }
4596        if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {
4597          return undefined;
4598        }
4599        if (doc.activeElement && doc.activeElement.nodeName && (doc.activeElement.nodeName.toLowerCase() === 'input' || doc.activeElement.nodeName.toLowerCase() === 'textarea')) {
4600          return undefined;
4601        }
4602        if (swiper.params.keyboard.onlyInViewport && (kc === 33 || kc === 34 || kc === 37 || kc === 39 || kc === 38 || kc === 40)) {
4603          var inView = false;
4604          // Check that swiper should be inside of visible area of window
4605          if (swiper.$el.parents(("." + (swiper.params.slideClass))).length > 0 && swiper.$el.parents(("." + (swiper.params.slideActiveClass))).length === 0) {
4606            return undefined;
4607          }
4608          var windowWidth = win.innerWidth;
4609          var windowHeight = win.innerHeight;
4610          var swiperOffset = swiper.$el.offset();
4611          if (rtl) { swiperOffset.left -= swiper.$el[0].scrollLeft; }
4612          var swiperCoord = [
4613            [swiperOffset.left, swiperOffset.top],
4614            [swiperOffset.left + swiper.width, swiperOffset.top],
4615            [swiperOffset.left, swiperOffset.top + swiper.height],
4616            [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height] ];
4617          for (var i = 0; i < swiperCoord.length; i += 1) {
4618            var point = swiperCoord[i];
4619            if (
4620              point[0] >= 0 && point[0] <= windowWidth
4621              && point[1] >= 0 && point[1] <= windowHeight
4622            ) {
4623              inView = true;
4624            }
4625          }
4626          if (!inView) { return undefined; }
4627        }
4628        if (swiper.isHorizontal()) {
4629          if (kc === 33 || kc === 34 || kc === 37 || kc === 39) {
4630            if (e.preventDefault) { e.preventDefault(); }
4631            else { e.returnValue = false; }
4632          }
4633          if (((kc === 34 || kc === 39) && !rtl) || ((kc === 33 || kc === 37) && rtl)) { swiper.slideNext(); }
4634          if (((kc === 33 || kc === 37) && !rtl) || ((kc === 34 || kc === 39) && rtl)) { swiper.slidePrev(); }
4635        } else {
4636          if (kc === 33 || kc === 34 || kc === 38 || kc === 40) {
4637            if (e.preventDefault) { e.preventDefault(); }
4638            else { e.returnValue = false; }
4639          }
4640          if (kc === 34 || kc === 40) { swiper.slideNext(); }
4641          if (kc === 33 || kc === 38) { swiper.slidePrev(); }
4642        }
4643        swiper.emit('keyPress', kc);
4644        return undefined;
4645      },
4646      enable: function enable() {
4647        var swiper = this;
4648        if (swiper.keyboard.enabled) { return; }
4649        $(doc).on('keydown', swiper.keyboard.handle);
4650        swiper.keyboard.enabled = true;
4651      },
4652      disable: function disable() {
4653        var swiper = this;
4654        if (!swiper.keyboard.enabled) { return; }
4655        $(doc).off('keydown', swiper.keyboard.handle);
4656        swiper.keyboard.enabled = false;
4657      },
4658    };
4659  
4660    var Keyboard$1 = {
4661      name: 'keyboard',
4662      params: {
4663        keyboard: {
4664          enabled: false,
4665          onlyInViewport: true,
4666        },
4667      },
4668      create: function create() {
4669        var swiper = this;
4670        Utils.extend(swiper, {
4671          keyboard: {
4672            enabled: false,
4673            enable: Keyboard.enable.bind(swiper),
4674            disable: Keyboard.disable.bind(swiper),
4675            handle: Keyboard.handle.bind(swiper),
4676          },
4677        });
4678      },
4679      on: {
4680        init: function init() {
4681          var swiper = this;
4682          if (swiper.params.keyboard.enabled) {
4683            swiper.keyboard.enable();
4684          }
4685        },
4686        destroy: function destroy() {
4687          var swiper = this;
4688          if (swiper.keyboard.enabled) {
4689            swiper.keyboard.disable();
4690          }
4691        },
4692      },
4693    };
4694  
4695    function isEventSupported() {
4696      var eventName = 'onwheel';
4697      var isSupported = eventName in doc;
4698  
4699      if (!isSupported) {
4700        var element = doc.createElement('div');
4701        element.setAttribute(eventName, 'return;');
4702        isSupported = typeof element[eventName] === 'function';
4703      }
4704  
4705      if (!isSupported
4706        && doc.implementation
4707        && doc.implementation.hasFeature
4708        // always returns true in newer browsers as per the standard.
4709        // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature
4710        && doc.implementation.hasFeature('', '') !== true
4711      ) {
4712        // This is the only way to test support for the `wheel` event in IE9+.
4713        isSupported = doc.implementation.hasFeature('Events.wheel', '3.0');
4714      }
4715  
4716      return isSupported;
4717    }
4718    var Mousewheel = {
4719      lastScrollTime: Utils.now(),
4720      event: (function getEvent() {
4721        if (win.navigator.userAgent.indexOf('firefox') > -1) { return 'DOMMouseScroll'; }
4722        return isEventSupported() ? 'wheel' : 'mousewheel';
4723      }()),
4724      normalize: function normalize(e) {
4725        // Reasonable defaults
4726        var PIXEL_STEP = 10;
4727        var LINE_HEIGHT = 40;
4728        var PAGE_HEIGHT = 800;
4729  
4730        var sX = 0;
4731        var sY = 0; // spinX, spinY
4732        var pX = 0;
4733        var pY = 0; // pixelX, pixelY
4734  
4735        // Legacy
4736        if ('detail' in e) {
4737          sY = e.detail;
4738        }
4739        if ('wheelDelta' in e) {
4740          sY = -e.wheelDelta / 120;
4741        }
4742        if ('wheelDeltaY' in e) {
4743          sY = -e.wheelDeltaY / 120;
4744        }
4745        if ('wheelDeltaX' in e) {
4746          sX = -e.wheelDeltaX / 120;
4747        }
4748  
4749        // side scrolling on FF with DOMMouseScroll
4750        if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {
4751          sX = sY;
4752          sY = 0;
4753        }
4754  
4755        pX = sX * PIXEL_STEP;
4756        pY = sY * PIXEL_STEP;
4757  
4758        if ('deltaY' in e) {
4759          pY = e.deltaY;
4760        }
4761        if ('deltaX' in e) {
4762          pX = e.deltaX;
4763        }
4764  
4765        if ((pX || pY) && e.deltaMode) {
4766          if (e.deltaMode === 1) { // delta in LINE units
4767            pX *= LINE_HEIGHT;
4768            pY *= LINE_HEIGHT;
4769          } else { // delta in PAGE units
4770            pX *= PAGE_HEIGHT;
4771            pY *= PAGE_HEIGHT;
4772          }
4773        }
4774  
4775        // Fall-back if spin cannot be determined
4776        if (pX && !sX) {
4777          sX = (pX < 1) ? -1 : 1;
4778        }
4779        if (pY && !sY) {
4780          sY = (pY < 1) ? -1 : 1;
4781        }
4782  
4783        return {
4784          spinX: sX,
4785          spinY: sY,
4786          pixelX: pX,
4787          pixelY: pY,
4788        };
4789      },
4790      handleMouseEnter: function handleMouseEnter() {
4791        var swiper = this;
4792        swiper.mouseEntered = true;
4793      },
4794      handleMouseLeave: function handleMouseLeave() {
4795        var swiper = this;
4796        swiper.mouseEntered = false;
4797      },
4798      handle: function handle(event) {
4799        var e = event;
4800        var swiper = this;
4801        var params = swiper.params.mousewheel;
4802  
4803        if (!swiper.mouseEntered && !params.releaseOnEdges) { return true; }
4804  
4805        if (e.originalEvent) { e = e.originalEvent; } // jquery fix
4806        var delta = 0;
4807        var rtlFactor = swiper.rtlTranslate ? -1 : 1;
4808  
4809        var data = Mousewheel.normalize(e);
4810  
4811        if (params.forceToAxis) {
4812          if (swiper.isHorizontal()) {
4813            if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) { delta = data.pixelX * rtlFactor; }
4814            else { return true; }
4815          } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) { delta = data.pixelY; }
4816          else { return true; }
4817        } else {
4818          delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;
4819        }
4820  
4821        if (delta === 0) { return true; }
4822  
4823        if (params.invert) { delta = -delta; }
4824  
4825        if (!swiper.params.freeMode) {
4826          if (Utils.now() - swiper.mousewheel.lastScrollTime > 60) {
4827            if (delta < 0) {
4828              if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {
4829                swiper.slideNext();
4830                swiper.emit('scroll', e);
4831              } else if (params.releaseOnEdges) { return true; }
4832            } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {
4833              swiper.slidePrev();
4834              swiper.emit('scroll', e);
4835            } else if (params.releaseOnEdges) { return true; }
4836          }
4837          swiper.mousewheel.lastScrollTime = (new win.Date()).getTime();
4838        } else {
4839          // Freemode or scrollContainer:
4840          if (swiper.params.loop) {
4841            swiper.loopFix();
4842          }
4843          var position = swiper.getTranslate() + (delta * params.sensitivity);
4844          var wasBeginning = swiper.isBeginning;
4845          var wasEnd = swiper.isEnd;
4846  
4847          if (position >= swiper.minTranslate()) { position = swiper.minTranslate(); }
4848          if (position <= swiper.maxTranslate()) { position = swiper.maxTranslate(); }
4849  
4850          swiper.setTransition(0);
4851          swiper.setTranslate(position);
4852          swiper.updateProgress();
4853          swiper.updateActiveIndex();
4854          swiper.updateSlidesClasses();
4855  
4856          if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) {
4857            swiper.updateSlidesClasses();
4858          }
4859  
4860          if (swiper.params.freeModeSticky) {
4861            clearTimeout(swiper.mousewheel.timeout);
4862            swiper.mousewheel.timeout = Utils.nextTick(function () {
4863              swiper.slideToClosest();
4864            }, 300);
4865          }
4866          // Emit event
4867          swiper.emit('scroll', e);
4868  
4869          // Stop autoplay
4870          if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) { swiper.autoplay.stop(); }
4871          // Return page scroll on edge positions
4872          if (position === swiper.minTranslate() || position === swiper.maxTranslate()) { return true; }
4873        }
4874  
4875        if (e.preventDefault) { e.preventDefault(); }
4876        else { e.returnValue = false; }
4877        return false;
4878      },
4879      enable: function enable() {
4880        var swiper = this;
4881        if (!Mousewheel.event) { return false; }
4882        if (swiper.mousewheel.enabled) { return false; }
4883        var target = swiper.$el;
4884        if (swiper.params.mousewheel.eventsTarged !== 'container') {
4885          target = $(swiper.params.mousewheel.eventsTarged);
4886        }
4887        target.on('mouseenter', swiper.mousewheel.handleMouseEnter);
4888        target.on('mouseleave', swiper.mousewheel.handleMouseLeave);
4889        target.on(Mousewheel.event, swiper.mousewheel.handle);
4890        swiper.mousewheel.enabled = true;
4891        return true;
4892      },
4893      disable: function disable() {
4894        var swiper = this;
4895        if (!Mousewheel.event) { return false; }
4896        if (!swiper.mousewheel.enabled) { return false; }
4897        var target = swiper.$el;
4898        if (swiper.params.mousewheel.eventsTarged !== 'container') {
4899          target = $(swiper.params.mousewheel.eventsTarged);
4900        }
4901        target.off(Mousewheel.event, swiper.mousewheel.handle);
4902        swiper.mousewheel.enabled = false;
4903        return true;
4904      },
4905    };
4906  
4907    var Mousewheel$1 = {
4908      name: 'mousewheel',
4909      params: {
4910        mousewheel: {
4911          enabled: false,
4912          releaseOnEdges: false,
4913          invert: false,
4914          forceToAxis: false,
4915          sensitivity: 1,
4916          eventsTarged: 'container',
4917        },
4918      },
4919      create: function create() {
4920        var swiper = this;
4921        Utils.extend(swiper, {
4922          mousewheel: {
4923            enabled: false,
4924            enable: Mousewheel.enable.bind(swiper),
4925            disable: Mousewheel.disable.bind(swiper),
4926            handle: Mousewheel.handle.bind(swiper),
4927            handleMouseEnter: Mousewheel.handleMouseEnter.bind(swiper),
4928            handleMouseLeave: Mousewheel.handleMouseLeave.bind(swiper),
4929            lastScrollTime: Utils.now(),
4930          },
4931        });
4932      },
4933      on: {
4934        init: function init() {
4935          var swiper = this;
4936          if (swiper.params.mousewheel.enabled) { swiper.mousewheel.enable(); }
4937        },
4938        destroy: function destroy() {
4939          var swiper = this;
4940          if (swiper.mousewheel.enabled) { swiper.mousewheel.disable(); }
4941        },
4942      },
4943    };
4944  
4945    var Navigation = {
4946      update: function update() {
4947        // Update Navigation Buttons
4948        var swiper = this;
4949        var params = swiper.params.navigation;
4950  
4951        if (swiper.params.loop) { return; }
4952        var ref = swiper.navigation;
4953        var $nextEl = ref.$nextEl;
4954        var $prevEl = ref.$prevEl;
4955  
4956        if ($prevEl && $prevEl.length > 0) {
4957          if (swiper.isBeginning) {
4958            $prevEl.addClass(params.disabledClass);
4959          } else {
4960            $prevEl.removeClass(params.disabledClass);
4961          }
4962          $prevEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
4963        }
4964        if ($nextEl && $nextEl.length > 0) {
4965          if (swiper.isEnd) {
4966            $nextEl.addClass(params.disabledClass);
4967          } else {
4968            $nextEl.removeClass(params.disabledClass);
4969          }
4970          $nextEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
4971        }
4972      },
4973      onPrevClick: function onPrevClick(e) {
4974        var swiper = this;
4975        e.preventDefault();
4976        if (swiper.isBeginning && !swiper.params.loop) { return; }
4977        swiper.slidePrev();
4978      },
4979      onNextClick: function onNextClick(e) {
4980        var swiper = this;
4981        e.preventDefault();
4982        if (swiper.isEnd && !swiper.params.loop) { return; }
4983        swiper.slideNext();
4984      },
4985      init: function init() {
4986        var swiper = this;
4987        var params = swiper.params.navigation;
4988        if (!(params.nextEl || params.prevEl)) { return; }
4989  
4990        var $nextEl;
4991        var $prevEl;
4992        if (params.nextEl) {
4993          $nextEl = $(params.nextEl);
4994          if (
4995            swiper.params.uniqueNavElements
4996            && typeof params.nextEl === 'string'
4997            && $nextEl.length > 1
4998            && swiper.$el.find(params.nextEl).length === 1
4999          ) {
5000            $nextEl = swiper.$el.find(params.nextEl);
5001          }
5002        }
5003        if (params.prevEl) {
5004          $prevEl = $(params.prevEl);
5005          if (
5006            swiper.params.uniqueNavElements
5007            && typeof params.prevEl === 'string'
5008            && $prevEl.length > 1
5009            && swiper.$el.find(params.prevEl).length === 1
5010          ) {
5011            $prevEl = swiper.$el.find(params.prevEl);
5012          }
5013        }
5014  
5015        if ($nextEl && $nextEl.length > 0) {
5016          $nextEl.on('click', swiper.navigation.onNextClick);
5017        }
5018        if ($prevEl && $prevEl.length > 0) {
5019          $prevEl.on('click', swiper.navigation.onPrevClick);
5020        }
5021  
5022        Utils.extend(swiper.navigation, {
5023          $nextEl: $nextEl,
5024          nextEl: $nextEl && $nextEl[0],
5025          $prevEl: $prevEl,
5026          prevEl: $prevEl && $prevEl[0],
5027        });
5028      },
5029      destroy: function destroy() {
5030        var swiper = this;
5031        var ref = swiper.navigation;
5032        var $nextEl = ref.$nextEl;
5033        var $prevEl = ref.$prevEl;
5034        if ($nextEl && $nextEl.length) {
5035          $nextEl.off('click', swiper.navigation.onNextClick);
5036          $nextEl.removeClass(swiper.params.navigation.disabledClass);
5037        }
5038        if ($prevEl && $prevEl.length) {
5039          $prevEl.off('click', swiper.navigation.onPrevClick);
5040          $prevEl.removeClass(swiper.params.navigation.disabledClass);
5041        }
5042      },
5043    };
5044  
5045    var Navigation$1 = {
5046      name: 'navigation',
5047      params: {
5048        navigation: {
5049          nextEl: null,
5050          prevEl: null,
5051  
5052          hideOnClick: false,
5053          disabledClass: 'swiper-button-disabled',
5054          hiddenClass: 'swiper-button-hidden',
5055          lockClass: 'swiper-button-lock',
5056        },
5057      },
5058      create: function create() {
5059        var swiper = this;
5060        Utils.extend(swiper, {
5061          navigation: {
5062            init: Navigation.init.bind(swiper),
5063            update: Navigation.update.bind(swiper),
5064            destroy: Navigation.destroy.bind(swiper),
5065            onNextClick: Navigation.onNextClick.bind(swiper),
5066            onPrevClick: Navigation.onPrevClick.bind(swiper),
5067          },
5068        });
5069      },
5070      on: {
5071        init: function init() {
5072          var swiper = this;
5073          swiper.navigation.init();
5074          swiper.navigation.update();
5075        },
5076        toEdge: function toEdge() {
5077          var swiper = this;
5078          swiper.navigation.update();
5079        },
5080        fromEdge: function fromEdge() {
5081          var swiper = this;
5082          swiper.navigation.update();
5083        },
5084        destroy: function destroy() {
5085          var swiper = this;
5086          swiper.navigation.destroy();
5087        },
5088        click: function click(e) {
5089          var swiper = this;
5090          var ref = swiper.navigation;
5091          var $nextEl = ref.$nextEl;
5092          var $prevEl = ref.$prevEl;
5093          if (
5094            swiper.params.navigation.hideOnClick
5095            && !$(e.target).is($prevEl)
5096            && !$(e.target).is($nextEl)
5097          ) {
5098            var isHidden;
5099            if ($nextEl) {
5100              isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);
5101            } else if ($prevEl) {
5102              isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);
5103            }
5104            if (isHidden === true) {
5105              swiper.emit('navigationShow', swiper);
5106            } else {
5107              swiper.emit('navigationHide', swiper);
5108            }
5109            if ($nextEl) {
5110              $nextEl.toggleClass(swiper.params.navigation.hiddenClass);
5111            }
5112            if ($prevEl) {
5113              $prevEl.toggleClass(swiper.params.navigation.hiddenClass);
5114            }
5115          }
5116        },
5117      },
5118    };
5119  
5120    var Pagination = {
5121      update: function update() {
5122        // Render || Update Pagination bullets/items
5123        var swiper = this;
5124        var rtl = swiper.rtl;
5125        var params = swiper.params.pagination;
5126        if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
5127        var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
5128        var $el = swiper.pagination.$el;
5129        // Current/Total
5130        var current;
5131        var total = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
5132        if (swiper.params.loop) {
5133          current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup);
5134          if (current > slidesLength - 1 - (swiper.loopedSlides * 2)) {
5135            current -= (slidesLength - (swiper.loopedSlides * 2));
5136          }
5137          if (current > total - 1) { current -= total; }
5138          if (current < 0 && swiper.params.paginationType !== 'bullets') { current = total + current; }
5139        } else if (typeof swiper.snapIndex !== 'undefined') {
5140          current = swiper.snapIndex;
5141        } else {
5142          current = swiper.activeIndex || 0;
5143        }
5144        // Types
5145        if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {
5146          var bullets = swiper.pagination.bullets;
5147          var firstIndex;
5148          var lastIndex;
5149          var midIndex;
5150          if (params.dynamicBullets) {
5151            swiper.pagination.bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);
5152            $el.css(swiper.isHorizontal() ? 'width' : 'height', ((swiper.pagination.bulletSize * (params.dynamicMainBullets + 4)) + "px"));
5153            if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {
5154              swiper.pagination.dynamicBulletIndex += (current - swiper.previousIndex);
5155              if (swiper.pagination.dynamicBulletIndex > (params.dynamicMainBullets - 1)) {
5156                swiper.pagination.dynamicBulletIndex = params.dynamicMainBullets - 1;
5157              } else if (swiper.pagination.dynamicBulletIndex < 0) {
5158                swiper.pagination.dynamicBulletIndex = 0;
5159              }
5160            }
5161            firstIndex = current - swiper.pagination.dynamicBulletIndex;
5162            lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);
5163            midIndex = (lastIndex + firstIndex) / 2;
5164          }
5165          bullets.removeClass(((params.bulletActiveClass) + " " + (params.bulletActiveClass) + "-next " + (params.bulletActiveClass) + "-next-next " + (params.bulletActiveClass) + "-prev " + (params.bulletActiveClass) + "-prev-prev " + (params.bulletActiveClass) + "-main"));
5166          if ($el.length > 1) {
5167            bullets.each(function (index, bullet) {
5168              var $bullet = $(bullet);
5169              var bulletIndex = $bullet.index();
5170              if (bulletIndex === current) {
5171                $bullet.addClass(params.bulletActiveClass);
5172              }
5173              if (params.dynamicBullets) {
5174                if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {
5175                  $bullet.addClass(((params.bulletActiveClass) + "-main"));
5176                }
5177                if (bulletIndex === firstIndex) {
5178                  $bullet
5179                    .prev()
5180                    .addClass(((params.bulletActiveClass) + "-prev"))
5181                    .prev()
5182                    .addClass(((params.bulletActiveClass) + "-prev-prev"));
5183                }
5184                if (bulletIndex === lastIndex) {
5185                  $bullet
5186                    .next()
5187                    .addClass(((params.bulletActiveClass) + "-next"))
5188                    .next()
5189                    .addClass(((params.bulletActiveClass) + "-next-next"));
5190                }
5191              }
5192            });
5193          } else {
5194            var $bullet = bullets.eq(current);
5195            $bullet.addClass(params.bulletActiveClass);
5196            if (params.dynamicBullets) {
5197              var $firstDisplayedBullet = bullets.eq(firstIndex);
5198              var $lastDisplayedBullet = bullets.eq(lastIndex);
5199              for (var i = firstIndex; i <= lastIndex; i += 1) {
5200                bullets.eq(i).addClass(((params.bulletActiveClass) + "-main"));
5201              }
5202              $firstDisplayedBullet
5203                .prev()
5204                .addClass(((params.bulletActiveClass) + "-prev"))
5205                .prev()
5206                .addClass(((params.bulletActiveClass) + "-prev-prev"));
5207              $lastDisplayedBullet
5208                .next()
5209                .addClass(((params.bulletActiveClass) + "-next"))
5210                .next()
5211                .addClass(((params.bulletActiveClass) + "-next-next"));
5212            }
5213          }
5214          if (params.dynamicBullets) {
5215            var dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);
5216            var bulletsOffset = (((swiper.pagination.bulletSize * dynamicBulletsLength) - (swiper.pagination.bulletSize)) / 2) - (midIndex * swiper.pagination.bulletSize);
5217            var offsetProp = rtl ? 'right' : 'left';
5218            bullets.css(swiper.isHorizontal() ? offsetProp : 'top', (bulletsOffset + "px"));
5219          }
5220        }
5221        if (params.type === 'fraction') {
5222          $el.find(("." + (params.currentClass))).text(params.formatFractionCurrent(current + 1));
5223          $el.find(("." + (params.totalClass))).text(params.formatFractionTotal(total));
5224        }
5225        if (params.type === 'progressbar') {
5226          var progressbarDirection;
5227          if (params.progressbarOpposite) {
5228            progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';
5229          } else {
5230            progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';
5231          }
5232          var scale = (current + 1) / total;
5233          var scaleX = 1;
5234          var scaleY = 1;
5235          if (progressbarDirection === 'horizontal') {
5236            scaleX = scale;
5237          } else {
5238            scaleY = scale;
5239          }
5240          $el.find(("." + (params.progressbarFillClass))).transform(("translate3d(0,0,0) scaleX(" + scaleX + ") scaleY(" + scaleY + ")")).transition(swiper.params.speed);
5241        }
5242        if (params.type === 'custom' && params.renderCustom) {
5243          $el.html(params.renderCustom(swiper, current + 1, total));
5244          swiper.emit('paginationRender', swiper, $el[0]);
5245        } else {
5246          swiper.emit('paginationUpdate', swiper, $el[0]);
5247        }
5248        $el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
5249      },
5250      render: function render() {
5251        // Render Container
5252        var swiper = this;
5253        var params = swiper.params.pagination;
5254        if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
5255        var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
5256  
5257        var $el = swiper.pagination.$el;
5258        var paginationHTML = '';
5259        if (params.type === 'bullets') {
5260          var numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
5261          for (var i = 0; i < numberOfBullets; i += 1) {
5262            if (params.renderBullet) {
5263              paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);
5264            } else {
5265              paginationHTML += "<" + (params.bulletElement) + " class=\"" + (params.bulletClass) + "\"></" + (params.bulletElement) + ">";
5266            }
5267          }
5268          $el.html(paginationHTML);
5269          swiper.pagination.bullets = $el.find(("." + (params.bulletClass)));
5270        }
5271        if (params.type === 'fraction') {
5272          if (params.renderFraction) {
5273            paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);
5274          } else {
5275            paginationHTML = "<span class=\"" + (params.currentClass) + "\"></span>"
5276            + ' / '
5277            + "<span class=\"" + (params.totalClass) + "\"></span>";
5278          }
5279          $el.html(paginationHTML);
5280        }
5281        if (params.type === 'progressbar') {
5282          if (params.renderProgressbar) {
5283            paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);
5284          } else {
5285            paginationHTML = "<span class=\"" + (params.progressbarFillClass) + "\"></span>";
5286          }
5287          $el.html(paginationHTML);
5288        }
5289        if (params.type !== 'custom') {
5290          swiper.emit('paginationRender', swiper.pagination.$el[0]);
5291        }
5292      },
5293      init: function init() {
5294        var swiper = this;
5295        var params = swiper.params.pagination;
5296        if (!params.el) { return; }
5297  
5298        var $el = $(params.el);
5299        if ($el.length === 0) { return; }
5300  
5301        if (
5302          swiper.params.uniqueNavElements
5303          && typeof params.el === 'string'
5304          && $el.length > 1
5305          && swiper.$el.find(params.el).length === 1
5306        ) {
5307          $el = swiper.$el.find(params.el);
5308        }
5309  
5310        if (params.type === 'bullets' && params.clickable) {
5311          $el.addClass(params.clickableClass);
5312        }
5313  
5314        $el.addClass(params.modifierClass + params.type);
5315  
5316        if (params.type === 'bullets' && params.dynamicBullets) {
5317          $el.addClass(("" + (params.modifierClass) + (params.type) + "-dynamic"));
5318          swiper.pagination.dynamicBulletIndex = 0;
5319          if (params.dynamicMainBullets < 1) {
5320            params.dynamicMainBullets = 1;
5321          }
5322        }
5323        if (params.type === 'progressbar' && params.progressbarOpposite) {
5324          $el.addClass(params.progressbarOppositeClass);
5325        }
5326  
5327        if (params.clickable) {
5328          $el.on('click', ("." + (params.bulletClass)), function onClick(e) {
5329            e.preventDefault();
5330            var index = $(this).index() * swiper.params.slidesPerGroup;
5331            if (swiper.params.loop) { index += swiper.loopedSlides; }
5332            swiper.slideTo(index);
5333          });
5334        }
5335  
5336        Utils.extend(swiper.pagination, {
5337          $el: $el,
5338          el: $el[0],
5339        });
5340      },
5341      destroy: function destroy() {
5342        var swiper = this;
5343        var params = swiper.params.pagination;
5344        if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
5345        var $el = swiper.pagination.$el;
5346  
5347        $el.removeClass(params.hiddenClass);
5348        $el.removeClass(params.modifierClass + params.type);
5349        if (swiper.pagination.bullets) { swiper.pagination.bullets.removeClass(params.bulletActiveClass); }
5350        if (params.clickable) {
5351          $el.off('click', ("." + (params.bulletClass)));
5352        }
5353      },
5354    };
5355  
5356    var Pagination$1 = {
5357      name: 'pagination',
5358      params: {
5359        pagination: {
5360          el: null,
5361          bulletElement: 'span',
5362          clickable: false,
5363          hideOnClick: false,
5364          renderBullet: null,
5365          renderProgressbar: null,
5366          renderFraction: null,
5367          renderCustom: null,
5368          progressbarOpposite: false,
5369          type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'
5370          dynamicBullets: false,
5371          dynamicMainBullets: 1,
5372          formatFractionCurrent: function (number) { return number; },
5373          formatFractionTotal: function (number) { return number; },
5374          bulletClass: 'swiper-pagination-bullet',
5375          bulletActiveClass: 'swiper-pagination-bullet-active',
5376          modifierClass: 'swiper-pagination-', // NEW
5377          currentClass: 'swiper-pagination-current',
5378          totalClass: 'swiper-pagination-total',
5379          hiddenClass: 'swiper-pagination-hidden',
5380          progressbarFillClass: 'swiper-pagination-progressbar-fill',
5381          progressbarOppositeClass: 'swiper-pagination-progressbar-opposite',
5382          clickableClass: 'swiper-pagination-clickable', // NEW
5383          lockClass: 'swiper-pagination-lock',
5384        },
5385      },
5386      create: function create() {
5387        var swiper = this;
5388        Utils.extend(swiper, {
5389          pagination: {
5390            init: Pagination.init.bind(swiper),
5391            render: Pagination.render.bind(swiper),
5392            update: Pagination.update.bind(swiper),
5393            destroy: Pagination.destroy.bind(swiper),
5394            dynamicBulletIndex: 0,
5395          },
5396        });
5397      },
5398      on: {
5399        init: function init() {
5400          var swiper = this;
5401          swiper.pagination.init();
5402          swiper.pagination.render();
5403          swiper.pagination.update();
5404        },
5405        activeIndexChange: function activeIndexChange() {
5406          var swiper = this;
5407          if (swiper.params.loop) {
5408            swiper.pagination.update();
5409          } else if (typeof swiper.snapIndex === 'undefined') {
5410            swiper.pagination.update();
5411          }
5412        },
5413        snapIndexChange: function snapIndexChange() {
5414          var swiper = this;
5415          if (!swiper.params.loop) {
5416            swiper.pagination.update();
5417          }
5418        },
5419        slidesLengthChange: function slidesLengthChange() {
5420          var swiper = this;
5421          if (swiper.params.loop) {
5422            swiper.pagination.render();
5423            swiper.pagination.update();
5424          }
5425        },
5426        snapGridLengthChange: function snapGridLengthChange() {
5427          var swiper = this;
5428          if (!swiper.params.loop) {
5429            swiper.pagination.render();
5430            swiper.pagination.update();
5431          }
5432        },
5433        destroy: function destroy() {
5434          var swiper = this;
5435          swiper.pagination.destroy();
5436        },
5437        click: function click(e) {
5438          var swiper = this;
5439          if (
5440            swiper.params.pagination.el
5441            && swiper.params.pagination.hideOnClick
5442            && swiper.pagination.$el.length > 0
5443            && !$(e.target).hasClass(swiper.params.pagination.bulletClass)
5444          ) {
5445            var isHidden = swiper.pagination.$el.hasClass(swiper.params.pagination.hiddenClass);
5446            if (isHidden === true) {
5447              swiper.emit('paginationShow', swiper);
5448            } else {
5449              swiper.emit('paginationHide', swiper);
5450            }
5451            swiper.pagination.$el.toggleClass(swiper.params.pagination.hiddenClass);
5452          }
5453        },
5454      },
5455    };
5456  
5457    var Scrollbar = {
5458      setTranslate: function setTranslate() {
5459        var swiper = this;
5460        if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
5461        var scrollbar = swiper.scrollbar;
5462        var rtl = swiper.rtlTranslate;
5463        var progress = swiper.progress;
5464        var dragSize = scrollbar.dragSize;
5465        var trackSize = scrollbar.trackSize;
5466        var $dragEl = scrollbar.$dragEl;
5467        var $el = scrollbar.$el;
5468        var params = swiper.params.scrollbar;
5469  
5470        var newSize = dragSize;
5471        var newPos = (trackSize - dragSize) * progress;
5472        if (rtl) {
5473          newPos = -newPos;
5474          if (newPos > 0) {
5475            newSize = dragSize - newPos;
5476            newPos = 0;
5477          } else if (-newPos + dragSize > trackSize) {
5478            newSize = trackSize + newPos;
5479          }
5480        } else if (newPos < 0) {
5481          newSize = dragSize + newPos;
5482          newPos = 0;
5483        } else if (newPos + dragSize > trackSize) {
5484          newSize = trackSize - newPos;
5485        }
5486        if (swiper.isHorizontal()) {
5487          if (Support.transforms3d) {
5488            $dragEl.transform(("translate3d(" + newPos + "px, 0, 0)"));
5489          } else {
5490            $dragEl.transform(("translateX(" + newPos + "px)"));
5491          }
5492          $dragEl[0].style.width = newSize + "px";
5493        } else {
5494          if (Support.transforms3d) {
5495            $dragEl.transform(("translate3d(0px, " + newPos + "px, 0)"));
5496          } else {
5497            $dragEl.transform(("translateY(" + newPos + "px)"));
5498          }
5499          $dragEl[0].style.height = newSize + "px";
5500        }
5501        if (params.hide) {
5502          clearTimeout(swiper.scrollbar.timeout);
5503          $el[0].style.opacity = 1;
5504          swiper.scrollbar.timeout = setTimeout(function () {
5505            $el[0].style.opacity = 0;
5506            $el.transition(400);
5507          }, 1000);
5508        }
5509      },
5510      setTransition: function setTransition(duration) {
5511        var swiper = this;
5512        if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
5513        swiper.scrollbar.$dragEl.transition(duration);
5514      },
5515      updateSize: function updateSize() {
5516        var swiper = this;
5517        if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
5518  
5519        var scrollbar = swiper.scrollbar;
5520        var $dragEl = scrollbar.$dragEl;
5521        var $el = scrollbar.$el;
5522  
5523        $dragEl[0].style.width = '';
5524        $dragEl[0].style.height = '';
5525        var trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;
5526  
5527        var divider = swiper.size / swiper.virtualSize;
5528        var moveDivider = divider * (trackSize / swiper.size);
5529        var dragSize;
5530        if (swiper.params.scrollbar.dragSize === 'auto') {
5531          dragSize = trackSize * divider;
5532        } else {
5533          dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);
5534        }
5535  
5536        if (swiper.isHorizontal()) {
5537          $dragEl[0].style.width = dragSize + "px";
5538        } else {
5539          $dragEl[0].style.height = dragSize + "px";
5540        }
5541  
5542        if (divider >= 1) {
5543          $el[0].style.display = 'none';
5544        } else {
5545          $el[0].style.display = '';
5546        }
5547        if (swiper.params.scrollbar.hide) {
5548          $el[0].style.opacity = 0;
5549        }
5550        Utils.extend(scrollbar, {
5551          trackSize: trackSize,
5552          divider: divider,
5553          moveDivider: moveDivider,
5554          dragSize: dragSize,
5555        });
5556        scrollbar.$el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass);
5557      },
5558      getPointerPosition: function getPointerPosition(e) {
5559        var swiper = this;
5560        if (swiper.isHorizontal()) {
5561          return ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageX : e.pageX || e.clientX);
5562        }
5563        return ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageY : e.pageY || e.clientY);
5564      },
5565      setDragPosition: function setDragPosition(e) {
5566        var swiper = this;
5567        var scrollbar = swiper.scrollbar;
5568        var rtl = swiper.rtlTranslate;
5569        var $el = scrollbar.$el;
5570        var dragSize = scrollbar.dragSize;
5571        var trackSize = scrollbar.trackSize;
5572        var dragStartPos = scrollbar.dragStartPos;
5573  
5574        var positionRatio;
5575        positionRatio = ((scrollbar.getPointerPosition(e)) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top']
5576          - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);
5577        positionRatio = Math.max(Math.min(positionRatio, 1), 0);
5578        if (rtl) {
5579          positionRatio = 1 - positionRatio;
5580        }
5581  
5582        var position = swiper.minTranslate() + ((swiper.maxTranslate() - swiper.minTranslate()) * positionRatio);
5583  
5584        swiper.updateProgress(position);
5585        swiper.setTranslate(position);
5586        swiper.updateActiveIndex();
5587        swiper.updateSlidesClasses();
5588      },
5589      onDragStart: function onDragStart(e) {
5590        var swiper = this;
5591        var params = swiper.params.scrollbar;
5592        var scrollbar = swiper.scrollbar;
5593        var $wrapperEl = swiper.$wrapperEl;
5594        var $el = scrollbar.$el;
5595        var $dragEl = scrollbar.$dragEl;
5596        swiper.scrollbar.isTouched = true;
5597        swiper.scrollbar.dragStartPos = (e.target === $dragEl[0] || e.target === $dragEl)
5598          ? scrollbar.getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;
5599        e.preventDefault();
5600        e.stopPropagation();
5601  
5602        $wrapperEl.transition(100);
5603        $dragEl.transition(100);
5604        scrollbar.setDragPosition(e);
5605  
5606        clearTimeout(swiper.scrollbar.dragTimeout);
5607  
5608        $el.transition(0);
5609        if (params.hide) {
5610          $el.css('opacity', 1);
5611        }
5612        swiper.emit('scrollbarDragStart', e);
5613      },
5614      onDragMove: function onDragMove(e) {
5615        var swiper = this;
5616        var scrollbar = swiper.scrollbar;
5617        var $wrapperEl = swiper.$wrapperEl;
5618        var $el = scrollbar.$el;
5619        var $dragEl = scrollbar.$dragEl;
5620  
5621        if (!swiper.scrollbar.isTouched) { return; }
5622        if (e.preventDefault) { e.preventDefault(); }
5623        else { e.returnValue = false; }
5624        scrollbar.setDragPosition(e);
5625        $wrapperEl.transition(0);
5626        $el.transition(0);
5627        $dragEl.transition(0);
5628        swiper.emit('scrollbarDragMove', e);
5629      },
5630      onDragEnd: function onDragEnd(e) {
5631        var swiper = this;
5632  
5633        var params = swiper.params.scrollbar;
5634        var scrollbar = swiper.scrollbar;
5635        var $el = scrollbar.$el;
5636  
5637        if (!swiper.scrollbar.isTouched) { return; }
5638        swiper.scrollbar.isTouched = false;
5639        if (params.hide) {
5640          clearTimeout(swiper.scrollbar.dragTimeout);
5641          swiper.scrollbar.dragTimeout = Utils.nextTick(function () {
5642            $el.css('opacity', 0);
5643            $el.transition(400);
5644          }, 1000);
5645        }
5646        swiper.emit('scrollbarDragEnd', e);
5647        if (params.snapOnRelease) {
5648          swiper.slideToClosest();
5649        }
5650      },
5651      enableDraggable: function enableDraggable() {
5652        var swiper = this;
5653        if (!swiper.params.scrollbar.el) { return; }
5654        var scrollbar = swiper.scrollbar;
5655        var touchEventsTouch = swiper.touchEventsTouch;
5656        var touchEventsDesktop = swiper.touchEventsDesktop;
5657        var params = swiper.params;
5658        var $el = scrollbar.$el;
5659        var target = $el[0];
5660        var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;
5661        var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
5662        if (!Support.touch) {
5663          target.addEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
5664          doc.addEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
5665          doc.addEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
5666        } else {
5667          target.addEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
5668          target.addEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
5669          target.addEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
5670        }
5671      },
5672      disableDraggable: function disableDraggable() {
5673        var swiper = this;
5674        if (!swiper.params.scrollbar.el) { return; }
5675        var scrollbar = swiper.scrollbar;
5676        var touchEventsTouch = swiper.touchEventsTouch;
5677        var touchEventsDesktop = swiper.touchEventsDesktop;
5678        var params = swiper.params;
5679        var $el = scrollbar.$el;
5680        var target = $el[0];
5681        var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;
5682        var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
5683        if (!Support.touch) {
5684          target.removeEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
5685          doc.removeEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
5686          doc.removeEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
5687        } else {
5688          target.removeEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
5689          target.removeEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
5690          target.removeEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
5691        }
5692      },
5693      init: function init() {
5694        var swiper = this;
5695        if (!swiper.params.scrollbar.el) { return; }
5696        var scrollbar = swiper.scrollbar;
5697        var $swiperEl = swiper.$el;
5698        var params = swiper.params.scrollbar;
5699  
5700        var $el = $(params.el);
5701        if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) {
5702          $el = $swiperEl.find(params.el);
5703        }
5704  
5705        var $dragEl = $el.find(("." + (swiper.params.scrollbar.dragClass)));
5706        if ($dragEl.length === 0) {
5707          $dragEl = $(("<div class=\"" + (swiper.params.scrollbar.dragClass) + "\"></div>"));
5708          $el.append($dragEl);
5709        }
5710  
5711        Utils.extend(scrollbar, {
5712          $el: $el,
5713          el: $el[0],
5714          $dragEl: $dragEl,
5715          dragEl: $dragEl[0],
5716        });
5717  
5718        if (params.draggable) {
5719          scrollbar.enableDraggable();
5720        }
5721      },
5722      destroy: function destroy() {
5723        var swiper = this;
5724        swiper.scrollbar.disableDraggable();
5725      },
5726    };
5727  
5728    var Scrollbar$1 = {
5729      name: 'scrollbar',
5730      params: {
5731        scrollbar: {
5732          el: null,
5733          dragSize: 'auto',
5734          hide: false,
5735          draggable: false,
5736          snapOnRelease: true,
5737          lockClass: 'swiper-scrollbar-lock',
5738          dragClass: 'swiper-scrollbar-drag',
5739        },
5740      },
5741      create: function create() {
5742        var swiper = this;
5743        Utils.extend(swiper, {
5744          scrollbar: {
5745            init: Scrollbar.init.bind(swiper),
5746            destroy: Scrollbar.destroy.bind(swiper),
5747            updateSize: Scrollbar.updateSize.bind(swiper),
5748            setTranslate: Scrollbar.setTranslate.bind(swiper),
5749            setTransition: Scrollbar.setTransition.bind(swiper),
5750            enableDraggable: Scrollbar.enableDraggable.bind(swiper),
5751            disableDraggable: Scrollbar.disableDraggable.bind(swiper),
5752            setDragPosition: Scrollbar.setDragPosition.bind(swiper),
5753            getPointerPosition: Scrollbar.getPointerPosition.bind(swiper),
5754            onDragStart: Scrollbar.onDragStart.bind(swiper),
5755            onDragMove: Scrollbar.onDragMove.bind(swiper),
5756            onDragEnd: Scrollbar.onDragEnd.bind(swiper),
5757            isTouched: false,
5758            timeout: null,
5759            dragTimeout: null,
5760          },
5761        });
5762      },
5763      on: {
5764        init: function init() {
5765          var swiper = this;
5766          swiper.scrollbar.init();
5767          swiper.scrollbar.updateSize();
5768          swiper.scrollbar.setTranslate();
5769        },
5770        update: function update() {
5771          var swiper = this;
5772          swiper.scrollbar.updateSize();
5773        },
5774        resize: function resize() {
5775          var swiper = this;
5776          swiper.scrollbar.updateSize();
5777        },
5778        observerUpdate: function observerUpdate() {
5779          var swiper = this;
5780          swiper.scrollbar.updateSize();
5781        },
5782        setTranslate: function setTranslate() {
5783          var swiper = this;
5784          swiper.scrollbar.setTranslate();
5785        },
5786        setTransition: function setTransition(duration) {
5787          var swiper = this;
5788          swiper.scrollbar.setTransition(duration);
5789        },
5790        destroy: function destroy() {
5791          var swiper = this;
5792          swiper.scrollbar.destroy();
5793        },
5794      },
5795    };
5796  
5797    var Parallax = {
5798      setTransform: function setTransform(el, progress) {
5799        var swiper = this;
5800        var rtl = swiper.rtl;
5801  
5802        var $el = $(el);
5803        var rtlFactor = rtl ? -1 : 1;
5804  
5805        var p = $el.attr('data-swiper-parallax') || '0';
5806        var x = $el.attr('data-swiper-parallax-x');
5807        var y = $el.attr('data-swiper-parallax-y');
5808        var scale = $el.attr('data-swiper-parallax-scale');
5809        var opacity = $el.attr('data-swiper-parallax-opacity');
5810  
5811        if (x || y) {
5812          x = x || '0';
5813          y = y || '0';
5814        } else if (swiper.isHorizontal()) {
5815          x = p;
5816          y = '0';
5817        } else {
5818          y = p;
5819          x = '0';
5820        }
5821  
5822        if ((x).indexOf('%') >= 0) {
5823          x = (parseInt(x, 10) * progress * rtlFactor) + "%";
5824        } else {
5825          x = (x * progress * rtlFactor) + "px";
5826        }
5827        if ((y).indexOf('%') >= 0) {
5828          y = (parseInt(y, 10) * progress) + "%";
5829        } else {
5830          y = (y * progress) + "px";
5831        }
5832  
5833        if (typeof opacity !== 'undefined' && opacity !== null) {
5834          var currentOpacity = opacity - ((opacity - 1) * (1 - Math.abs(progress)));
5835          $el[0].style.opacity = currentOpacity;
5836        }
5837        if (typeof scale === 'undefined' || scale === null) {
5838          $el.transform(("translate3d(" + x + ", " + y + ", 0px)"));
5839        } else {
5840          var currentScale = scale - ((scale - 1) * (1 - Math.abs(progress)));
5841          $el.transform(("translate3d(" + x + ", " + y + ", 0px) scale(" + currentScale + ")"));
5842        }
5843      },
5844      setTranslate: function setTranslate() {
5845        var swiper = this;
5846        var $el = swiper.$el;
5847        var slides = swiper.slides;
5848        var progress = swiper.progress;
5849        var snapGrid = swiper.snapGrid;
5850        $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')
5851          .each(function (index, el) {
5852            swiper.parallax.setTransform(el, progress);
5853          });
5854        slides.each(function (slideIndex, slideEl) {
5855          var slideProgress = slideEl.progress;
5856          if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {
5857            slideProgress += Math.ceil(slideIndex / 2) - (progress * (snapGrid.length - 1));
5858          }
5859          slideProgress = Math.min(Math.max(slideProgress, -1), 1);
5860          $(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')
5861            .each(function (index, el) {
5862              swiper.parallax.setTransform(el, slideProgress);
5863            });
5864        });
5865      },
5866      setTransition: function setTransition(duration) {
5867        if ( duration === void 0 ) duration = this.params.speed;
5868  
5869        var swiper = this;
5870        var $el = swiper.$el;
5871        $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')
5872          .each(function (index, parallaxEl) {
5873            var $parallaxEl = $(parallaxEl);
5874            var parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;
5875            if (duration === 0) { parallaxDuration = 0; }
5876            $parallaxEl.transition(parallaxDuration);
5877          });
5878      },
5879    };
5880  
5881    var Parallax$1 = {
5882      name: 'parallax',
5883      params: {
5884        parallax: {
5885          enabled: false,
5886        },
5887      },
5888      create: function create() {
5889        var swiper = this;
5890        Utils.extend(swiper, {
5891          parallax: {
5892            setTransform: Parallax.setTransform.bind(swiper),
5893            setTranslate: Parallax.setTranslate.bind(swiper),
5894            setTransition: Parallax.setTransition.bind(swiper),
5895          },
5896        });
5897      },
5898      on: {
5899        beforeInit: function beforeInit() {
5900          var swiper = this;
5901          if (!swiper.params.parallax.enabled) { return; }
5902          swiper.params.watchSlidesProgress = true;
5903          swiper.originalParams.watchSlidesProgress = true;
5904        },
5905        init: function init() {
5906          var swiper = this;
5907          if (!swiper.params.parallax.enabled) { return; }
5908          swiper.parallax.setTranslate();
5909        },
5910        setTranslate: function setTranslate() {
5911          var swiper = this;
5912          if (!swiper.params.parallax.enabled) { return; }
5913          swiper.parallax.setTranslate();
5914        },
5915        setTransition: function setTransition(duration) {
5916          var swiper = this;
5917          if (!swiper.params.parallax.enabled) { return; }
5918          swiper.parallax.setTransition(duration);
5919        },
5920      },
5921    };
5922  
5923    var Zoom = {
5924      // Calc Scale From Multi-touches
5925      getDistanceBetweenTouches: function getDistanceBetweenTouches(e) {
5926        if (e.targetTouches.length < 2) { return 1; }
5927        var x1 = e.targetTouches[0].pageX;
5928        var y1 = e.targetTouches[0].pageY;
5929        var x2 = e.targetTouches[1].pageX;
5930        var y2 = e.targetTouches[1].pageY;
5931        var distance = Math.sqrt((Math.pow( (x2 - x1), 2 )) + (Math.pow( (y2 - y1), 2 )));
5932        return distance;
5933      },
5934      // Events
5935      onGestureStart: function onGestureStart(e) {
5936        var swiper = this;
5937        var params = swiper.params.zoom;
5938        var zoom = swiper.zoom;
5939        var gesture = zoom.gesture;
5940        zoom.fakeGestureTouched = false;
5941        zoom.fakeGestureMoved = false;
5942        if (!Support.gestures) {
5943          if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {
5944            return;
5945          }
5946          zoom.fakeGestureTouched = true;
5947          gesture.scaleStart = Zoom.getDistanceBetweenTouches(e);
5948        }
5949        if (!gesture.$slideEl || !gesture.$slideEl.length) {
5950          gesture.$slideEl = $(e.target).closest('.swiper-slide');
5951          if (gesture.$slideEl.length === 0) { gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); }
5952          gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');
5953          gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
5954          gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
5955          if (gesture.$imageWrapEl.length === 0) {
5956            gesture.$imageEl = undefined;
5957            return;
5958          }
5959        }
5960        gesture.$imageEl.transition(0);
5961        swiper.zoom.isScaling = true;
5962      },
5963      onGestureChange: function onGestureChange(e) {
5964        var swiper = this;
5965        var params = swiper.params.zoom;
5966        var zoom = swiper.zoom;
5967        var gesture = zoom.gesture;
5968        if (!Support.gestures) {
5969          if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {
5970            return;
5971          }
5972          zoom.fakeGestureMoved = true;
5973          gesture.scaleMove = Zoom.getDistanceBetweenTouches(e);
5974        }
5975        if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
5976        if (Support.gestures) {
5977          zoom.scale = e.scale * zoom.currentScale;
5978        } else {
5979          zoom.scale = (gesture.scaleMove / gesture.scaleStart) * zoom.currentScale;
5980        }
5981        if (zoom.scale > gesture.maxRatio) {
5982          zoom.scale = (gesture.maxRatio - 1) + (Math.pow( ((zoom.scale - gesture.maxRatio) + 1), 0.5 ));
5983        }
5984        if (zoom.scale < params.minRatio) {
5985          zoom.scale = (params.minRatio + 1) - (Math.pow( ((params.minRatio - zoom.scale) + 1), 0.5 ));
5986        }
5987        gesture.$imageEl.transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
5988      },
5989      onGestureEnd: function onGestureEnd(e) {
5990        var swiper = this;
5991        var params = swiper.params.zoom;
5992        var zoom = swiper.zoom;
5993        var gesture = zoom.gesture;
5994        if (!Support.gestures) {
5995          if (!zoom.fakeGestureTouched || !zoom.fakeGestureMoved) {
5996            return;
5997          }
5998          if (e.type !== 'touchend' || (e.type === 'touchend' && e.changedTouches.length < 2 && !Device.android)) {
5999            return;
6000          }
6001          zoom.fakeGestureTouched = false;
6002          zoom.fakeGestureMoved = false;
6003        }
6004        if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
6005        zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);
6006        gesture.$imageEl.transition(swiper.params.speed).transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
6007        zoom.currentScale = zoom.scale;
6008        zoom.isScaling = false;
6009        if (zoom.scale === 1) { gesture.$slideEl = undefined; }
6010      },
6011      onTouchStart: function onTouchStart(e) {
6012        var swiper = this;
6013        var zoom = swiper.zoom;
6014        var gesture = zoom.gesture;
6015        var image = zoom.image;
6016        if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
6017        if (image.isTouched) { return; }
6018        if (Device.android) { e.preventDefault(); }
6019        image.isTouched = true;
6020        image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
6021        image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
6022      },
6023      onTouchMove: function onTouchMove(e) {
6024        var swiper = this;
6025        var zoom = swiper.zoom;
6026        var gesture = zoom.gesture;
6027        var image = zoom.image;
6028        var velocity = zoom.velocity;
6029        if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
6030        swiper.allowClick = false;
6031        if (!image.isTouched || !gesture.$slideEl) { return; }
6032  
6033        if (!image.isMoved) {
6034          image.width = gesture.$imageEl[0].offsetWidth;
6035          image.height = gesture.$imageEl[0].offsetHeight;
6036          image.startX = Utils.getTranslate(gesture.$imageWrapEl[0], 'x') || 0;
6037          image.startY = Utils.getTranslate(gesture.$imageWrapEl[0], 'y') || 0;
6038          gesture.slideWidth = gesture.$slideEl[0].offsetWidth;
6039          gesture.slideHeight = gesture.$slideEl[0].offsetHeight;
6040          gesture.$imageWrapEl.transition(0);
6041          if (swiper.rtl) {
6042            image.startX = -image.startX;
6043            image.startY = -image.startY;
6044          }
6045        }
6046        // Define if we need image drag
6047        var scaledWidth = image.width * zoom.scale;
6048        var scaledHeight = image.height * zoom.scale;
6049  
6050        if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) { return; }
6051  
6052        image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);
6053        image.maxX = -image.minX;
6054        image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);
6055        image.maxY = -image.minY;
6056  
6057        image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
6058        image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
6059  
6060        if (!image.isMoved && !zoom.isScaling) {
6061          if (
6062            swiper.isHorizontal()
6063            && (
6064              (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x)
6065              || (Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)
6066            )
6067          ) {
6068            image.isTouched = false;
6069            return;
6070          } if (
6071            !swiper.isHorizontal()
6072            && (
6073              (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y)
6074              || (Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)
6075            )
6076          ) {
6077            image.isTouched = false;
6078            return;
6079          }
6080        }
6081        e.preventDefault();
6082        e.stopPropagation();
6083  
6084        image.isMoved = true;
6085        image.currentX = (image.touchesCurrent.x - image.touchesStart.x) + image.startX;
6086        image.currentY = (image.touchesCurrent.y - image.touchesStart.y) + image.startY;
6087  
6088        if (image.currentX < image.minX) {
6089          image.currentX = (image.minX + 1) - (Math.pow( ((image.minX - image.currentX) + 1), 0.8 ));
6090        }
6091        if (image.currentX > image.maxX) {
6092          image.currentX = (image.maxX - 1) + (Math.pow( ((image.currentX - image.maxX) + 1), 0.8 ));
6093        }
6094  
6095        if (image.currentY < image.minY) {
6096          image.currentY = (image.minY + 1) - (Math.pow( ((image.minY - image.currentY) + 1), 0.8 ));
6097        }
6098        if (image.currentY > image.maxY) {
6099          image.currentY = (image.maxY - 1) + (Math.pow( ((image.currentY - image.maxY) + 1), 0.8 ));
6100        }
6101  
6102        // Velocity
6103        if (!velocity.prevPositionX) { velocity.prevPositionX = image.touchesCurrent.x; }
6104        if (!velocity.prevPositionY) { velocity.prevPositionY = image.touchesCurrent.y; }
6105        if (!velocity.prevTime) { velocity.prevTime = Date.now(); }
6106        velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;
6107        velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;
6108        if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) { velocity.x = 0; }
6109        if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) { velocity.y = 0; }
6110        velocity.prevPositionX = image.touchesCurrent.x;
6111        velocity.prevPositionY = image.touchesCurrent.y;
6112        velocity.prevTime = Date.now();
6113  
6114        gesture.$imageWrapEl.transform(("translate3d(" + (image.currentX) + "px, " + (image.currentY) + "px,0)"));
6115      },
6116      onTouchEnd: function onTouchEnd() {
6117        var swiper = this;
6118        var zoom = swiper.zoom;
6119        var gesture = zoom.gesture;
6120        var image = zoom.image;
6121        var velocity = zoom.velocity;
6122        if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
6123        if (!image.isTouched || !image.isMoved) {
6124          image.isTouched = false;
6125          image.isMoved = false;
6126          return;
6127        }
6128        image.isTouched = false;
6129        image.isMoved = false;
6130        var momentumDurationX = 300;
6131        var momentumDurationY = 300;
6132        var momentumDistanceX = velocity.x * momentumDurationX;
6133        var newPositionX = image.currentX + momentumDistanceX;
6134        var momentumDistanceY = velocity.y * momentumDurationY;
6135        var newPositionY = image.currentY + momentumDistanceY;
6136  
6137        // Fix duration
6138        if (velocity.x !== 0) { momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); }
6139        if (velocity.y !== 0) { momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); }
6140        var momentumDuration = Math.max(momentumDurationX, momentumDurationY);
6141  
6142        image.currentX = newPositionX;
6143        image.currentY = newPositionY;
6144  
6145        // Define if we need image drag
6146        var scaledWidth = image.width * zoom.scale;
6147        var scaledHeight = image.height * zoom.scale;
6148        image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);
6149        image.maxX = -image.minX;
6150        image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);
6151        image.maxY = -image.minY;
6152        image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);
6153        image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);
6154  
6155        gesture.$imageWrapEl.transition(momentumDuration).transform(("translate3d(" + (image.currentX) + "px, " + (image.currentY) + "px,0)"));
6156      },
6157      onTransitionEnd: function onTransitionEnd() {
6158        var swiper = this;
6159        var zoom = swiper.zoom;
6160        var gesture = zoom.gesture;
6161        if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {
6162          gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');
6163          gesture.$imageWrapEl.transform('translate3d(0,0,0)');
6164  
6165          zoom.scale = 1;
6166          zoom.currentScale = 1;
6167  
6168          gesture.$slideEl = undefined;
6169          gesture.$imageEl = undefined;
6170          gesture.$imageWrapEl = undefined;
6171        }
6172      },
6173      // Toggle Zoom
6174      toggle: function toggle(e) {
6175        var swiper = this;
6176        var zoom = swiper.zoom;
6177  
6178        if (zoom.scale && zoom.scale !== 1) {
6179          // Zoom Out
6180          zoom.out();
6181        } else {
6182          // Zoom In
6183          zoom.in(e);
6184        }
6185      },
6186      in: function in$1(e) {
6187        var swiper = this;
6188  
6189        var zoom = swiper.zoom;
6190        var params = swiper.params.zoom;
6191        var gesture = zoom.gesture;
6192        var image = zoom.image;
6193  
6194        if (!gesture.$slideEl) {
6195          gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex);
6196          gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');
6197          gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
6198        }
6199        if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
6200  
6201        gesture.$slideEl.addClass(("" + (params.zoomedSlideClass)));
6202  
6203        var touchX;
6204        var touchY;
6205        var offsetX;
6206        var offsetY;
6207        var diffX;
6208        var diffY;
6209        var translateX;
6210        var translateY;
6211        var imageWidth;
6212        var imageHeight;
6213        var scaledWidth;
6214        var scaledHeight;
6215        var translateMinX;
6216        var translateMinY;
6217        var translateMaxX;
6218        var translateMaxY;
6219        var slideWidth;
6220        var slideHeight;
6221  
6222        if (typeof image.touchesStart.x === 'undefined' && e) {
6223          touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;
6224          touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;
6225        } else {
6226          touchX = image.touchesStart.x;
6227          touchY = image.touchesStart.y;
6228        }
6229  
6230        zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
6231        zoom.currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
6232        if (e) {
6233          slideWidth = gesture.$slideEl[0].offsetWidth;
6234          slideHeight = gesture.$slideEl[0].offsetHeight;
6235          offsetX = gesture.$slideEl.offset().left;
6236          offsetY = gesture.$slideEl.offset().top;
6237          diffX = (offsetX + (slideWidth / 2)) - touchX;
6238          diffY = (offsetY + (slideHeight / 2)) - touchY;
6239  
6240          imageWidth = gesture.$imageEl[0].offsetWidth;
6241          imageHeight = gesture.$imageEl[0].offsetHeight;
6242          scaledWidth = imageWidth * zoom.scale;
6243          scaledHeight = imageHeight * zoom.scale;
6244  
6245          translateMinX = Math.min(((slideWidth / 2) - (scaledWidth / 2)), 0);
6246          translateMinY = Math.min(((slideHeight / 2) - (scaledHeight / 2)), 0);
6247          translateMaxX = -translateMinX;
6248          translateMaxY = -translateMinY;
6249  
6250          translateX = diffX * zoom.scale;
6251          translateY = diffY * zoom.scale;
6252  
6253          if (translateX < translateMinX) {
6254            translateX = translateMinX;
6255          }
6256          if (translateX > translateMaxX) {
6257            translateX = translateMaxX;
6258          }
6259  
6260          if (translateY < translateMinY) {
6261            translateY = translateMinY;
6262          }
6263          if (translateY > translateMaxY) {
6264            translateY = translateMaxY;
6265          }
6266        } else {
6267          translateX = 0;
6268          translateY = 0;
6269        }
6270        gesture.$imageWrapEl.transition(300).transform(("translate3d(" + translateX + "px, " + translateY + "px,0)"));
6271        gesture.$imageEl.transition(300).transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
6272      },
6273      out: function out() {
6274        var swiper = this;
6275  
6276        var zoom = swiper.zoom;
6277        var params = swiper.params.zoom;
6278        var gesture = zoom.gesture;
6279  
6280        if (!gesture.$slideEl) {
6281          gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex);
6282          gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');
6283          gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
6284        }
6285        if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
6286  
6287        zoom.scale = 1;
6288        zoom.currentScale = 1;
6289        gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');
6290        gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');
6291        gesture.$slideEl.removeClass(("" + (params.zoomedSlideClass)));
6292        gesture.$slideEl = undefined;
6293      },
6294      // Attach/Detach Events
6295      enable: function enable() {
6296        var swiper = this;
6297        var zoom = swiper.zoom;
6298        if (zoom.enabled) { return; }
6299        zoom.enabled = true;
6300  
6301        var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;
6302  
6303        // Scale image
6304        if (Support.gestures) {
6305          swiper.$wrapperEl.on('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener);
6306          swiper.$wrapperEl.on('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener);
6307          swiper.$wrapperEl.on('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener);
6308        } else if (swiper.touchEvents.start === 'touchstart') {
6309          swiper.$wrapperEl.on(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener);
6310          swiper.$wrapperEl.on(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener);
6311          swiper.$wrapperEl.on(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener);
6312        }
6313  
6314        // Move image
6315        swiper.$wrapperEl.on(swiper.touchEvents.move, ("." + (swiper.params.zoom.containerClass)), zoom.onTouchMove);
6316      },
6317      disable: function disable() {
6318        var swiper = this;
6319        var zoom = swiper.zoom;
6320        if (!zoom.enabled) { return; }
6321  
6322        swiper.zoom.enabled = false;
6323  
6324        var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;
6325  
6326        // Scale image
6327        if (Support.gestures) {
6328          swiper.$wrapperEl.off('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener);
6329          swiper.$wrapperEl.off('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener);
6330          swiper.$wrapperEl.off('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener);
6331        } else if (swiper.touchEvents.start === 'touchstart') {
6332          swiper.$wrapperEl.off(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener);
6333          swiper.$wrapperEl.off(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener);
6334          swiper.$wrapperEl.off(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener);
6335        }
6336  
6337        // Move image
6338        swiper.$wrapperEl.off(swiper.touchEvents.move, ("." + (swiper.params.zoom.containerClass)), zoom.onTouchMove);
6339      },
6340    };
6341  
6342    var Zoom$1 = {
6343      name: 'zoom',
6344      params: {
6345        zoom: {
6346          enabled: false,
6347          maxRatio: 3,
6348          minRatio: 1,
6349          toggle: true,
6350          containerClass: 'swiper-zoom-container',
6351          zoomedSlideClass: 'swiper-slide-zoomed',
6352        },
6353      },
6354      create: function create() {
6355        var swiper = this;
6356        var zoom = {
6357          enabled: false,
6358          scale: 1,
6359          currentScale: 1,
6360          isScaling: false,
6361          gesture: {
6362            $slideEl: undefined,
6363            slideWidth: undefined,
6364            slideHeight: undefined,
6365            $imageEl: undefined,
6366            $imageWrapEl: undefined,
6367            maxRatio: 3,
6368          },
6369          image: {
6370            isTouched: undefined,
6371            isMoved: undefined,
6372            currentX: undefined,
6373            currentY: undefined,
6374            minX: undefined,
6375            minY: undefined,
6376            maxX: undefined,
6377            maxY: undefined,
6378            width: undefined,
6379            height: undefined,
6380            startX: undefined,
6381            startY: undefined,
6382            touchesStart: {},
6383            touchesCurrent: {},
6384          },
6385          velocity: {
6386            x: undefined,
6387            y: undefined,
6388            prevPositionX: undefined,
6389            prevPositionY: undefined,
6390            prevTime: undefined,
6391          },
6392        };
6393  
6394        ('onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out').split(' ').forEach(function (methodName) {
6395          zoom[methodName] = Zoom[methodName].bind(swiper);
6396        });
6397        Utils.extend(swiper, {
6398          zoom: zoom,
6399        });
6400  
6401        var scale = 1;
6402        Object.defineProperty(swiper.zoom, 'scale', {
6403          get: function get() {
6404            return scale;
6405          },
6406          set: function set(value) {
6407            if (scale !== value) {
6408              var imageEl = swiper.zoom.gesture.$imageEl ? swiper.zoom.gesture.$imageEl[0] : undefined;
6409              var slideEl = swiper.zoom.gesture.$slideEl ? swiper.zoom.gesture.$slideEl[0] : undefined;
6410              swiper.emit('zoomChange', value, imageEl, slideEl);
6411            }
6412            scale = value;
6413          },
6414        });
6415      },
6416      on: {
6417        init: function init() {
6418          var swiper = this;
6419          if (swiper.params.zoom.enabled) {
6420            swiper.zoom.enable();
6421          }
6422        },
6423        destroy: function destroy() {
6424          var swiper = this;
6425          swiper.zoom.disable();
6426        },
6427        touchStart: function touchStart(e) {
6428          var swiper = this;
6429          if (!swiper.zoom.enabled) { return; }
6430          swiper.zoom.onTouchStart(e);
6431        },
6432        touchEnd: function touchEnd(e) {
6433          var swiper = this;
6434          if (!swiper.zoom.enabled) { return; }
6435          swiper.zoom.onTouchEnd(e);
6436        },
6437        doubleTap: function doubleTap(e) {
6438          var swiper = this;
6439          if (swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {
6440            swiper.zoom.toggle(e);
6441          }
6442        },
6443        transitionEnd: function transitionEnd() {
6444          var swiper = this;
6445          if (swiper.zoom.enabled && swiper.params.zoom.enabled) {
6446            swiper.zoom.onTransitionEnd();
6447          }
6448        },
6449      },
6450    };
6451  
6452    var Lazy = {
6453      loadInSlide: function loadInSlide(index, loadInDuplicate) {
6454        if ( loadInDuplicate === void 0 ) loadInDuplicate = true;
6455  
6456        var swiper = this;
6457        var params = swiper.params.lazy;
6458        if (typeof index === 'undefined') { return; }
6459        if (swiper.slides.length === 0) { return; }
6460        var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
6461  
6462        var $slideEl = isVirtual
6463          ? swiper.$wrapperEl.children(("." + (swiper.params.slideClass) + "[data-swiper-slide-index=\"" + index + "\"]"))
6464          : swiper.slides.eq(index);
6465  
6466        var $images = $slideEl.find(("." + (params.elementClass) + ":not(." + (params.loadedClass) + "):not(." + (params.loadingClass) + ")"));
6467        if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) {
6468          $images = $images.add($slideEl[0]);
6469        }
6470        if ($images.length === 0) { return; }
6471  
6472        $images.each(function (imageIndex, imageEl) {
6473          var $imageEl = $(imageEl);
6474          $imageEl.addClass(params.loadingClass);
6475  
6476          var background = $imageEl.attr('data-background');
6477          var src = $imageEl.attr('data-src');
6478          var srcset = $imageEl.attr('data-srcset');
6479          var sizes = $imageEl.attr('data-sizes');
6480  
6481          swiper.loadImage($imageEl[0], (src || background), srcset, sizes, false, function () {
6482            if (typeof swiper === 'undefined' || swiper === null || !swiper || (swiper && !swiper.params) || swiper.destroyed) { return; }
6483            if (background) {
6484              $imageEl.css('background-image', ("url(\"" + background + "\")"));
6485              $imageEl.removeAttr('data-background');
6486            } else {
6487              if (srcset) {
6488                $imageEl.attr('srcset', srcset);
6489                $imageEl.removeAttr('data-srcset');
6490              }
6491              if (sizes) {
6492                $imageEl.attr('sizes', sizes);
6493                $imageEl.removeAttr('data-sizes');
6494              }
6495              if (src) {
6496                $imageEl.attr('src', src);
6497                $imageEl.removeAttr('data-src');
6498              }
6499            }
6500  
6501            $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);
6502            $slideEl.find(("." + (params.preloaderClass))).remove();
6503            if (swiper.params.loop && loadInDuplicate) {
6504              var slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');
6505              if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {
6506                var originalSlide = swiper.$wrapperEl.children(("[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]:not(." + (swiper.params.slideDuplicateClass) + ")"));
6507                swiper.lazy.loadInSlide(originalSlide.index(), false);
6508              } else {
6509                var duplicatedSlide = swiper.$wrapperEl.children(("." + (swiper.params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]"));
6510                swiper.lazy.loadInSlide(duplicatedSlide.index(), false);
6511              }
6512            }
6513            swiper.emit('lazyImageReady', $slideEl[0], $imageEl[0]);
6514          });
6515  
6516          swiper.emit('lazyImageLoad', $slideEl[0], $imageEl[0]);
6517        });
6518      },
6519      load: function load() {
6520        var swiper = this;
6521        var $wrapperEl = swiper.$wrapperEl;
6522        var swiperParams = swiper.params;
6523        var slides = swiper.slides;
6524        var activeIndex = swiper.activeIndex;
6525        var isVirtual = swiper.virtual && swiperParams.virtual.enabled;
6526        var params = swiperParams.lazy;
6527  
6528        var slidesPerView = swiperParams.slidesPerView;
6529        if (slidesPerView === 'auto') {
6530          slidesPerView = 0;
6531        }
6532  
6533        function slideExist(index) {
6534          if (isVirtual) {
6535            if ($wrapperEl.children(("." + (swiperParams.slideClass) + "[data-swiper-slide-index=\"" + index + "\"]")).length) {
6536              return true;
6537            }
6538          } else if (slides[index]) { return true; }
6539          return false;
6540        }
6541        function slideIndex(slideEl) {
6542          if (isVirtual) {
6543            return $(slideEl).attr('data-swiper-slide-index');
6544          }
6545          return $(slideEl).index();
6546        }
6547  
6548        if (!swiper.lazy.initialImageLoaded) { swiper.lazy.initialImageLoaded = true; }
6549        if (swiper.params.watchSlidesVisibility) {
6550          $wrapperEl.children(("." + (swiperParams.slideVisibleClass))).each(function (elIndex, slideEl) {
6551            var index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();
6552            swiper.lazy.loadInSlide(index);
6553          });
6554        } else if (slidesPerView > 1) {
6555          for (var i = activeIndex; i < activeIndex + slidesPerView; i += 1) {
6556            if (slideExist(i)) { swiper.lazy.loadInSlide(i); }
6557          }
6558        } else {
6559          swiper.lazy.loadInSlide(activeIndex);
6560        }
6561        if (params.loadPrevNext) {
6562          if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {
6563            var amount = params.loadPrevNextAmount;
6564            var spv = slidesPerView;
6565            var maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);
6566            var minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);
6567            // Next Slides
6568            for (var i$1 = activeIndex + slidesPerView; i$1 < maxIndex; i$1 += 1) {
6569              if (slideExist(i$1)) { swiper.lazy.loadInSlide(i$1); }
6570            }
6571            // Prev Slides
6572            for (var i$2 = minIndex; i$2 < activeIndex; i$2 += 1) {
6573              if (slideExist(i$2)) { swiper.lazy.loadInSlide(i$2); }
6574            }
6575          } else {
6576            var nextSlide = $wrapperEl.children(("." + (swiperParams.slideNextClass)));
6577            if (nextSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(nextSlide)); }
6578  
6579            var prevSlide = $wrapperEl.children(("." + (swiperParams.slidePrevClass)));
6580            if (prevSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(prevSlide)); }
6581          }
6582        }
6583      },
6584    };
6585  
6586    var Lazy$1 = {
6587      name: 'lazy',
6588      params: {
6589        lazy: {
6590          enabled: false,
6591          loadPrevNext: false,
6592          loadPrevNextAmount: 1,
6593          loadOnTransitionStart: false,
6594  
6595          elementClass: 'swiper-lazy',
6596          loadingClass: 'swiper-lazy-loading',
6597          loadedClass: 'swiper-lazy-loaded',
6598          preloaderClass: 'swiper-lazy-preloader',
6599        },
6600      },
6601      create: function create() {
6602        var swiper = this;
6603        Utils.extend(swiper, {
6604          lazy: {
6605            initialImageLoaded: false,
6606            load: Lazy.load.bind(swiper),
6607            loadInSlide: Lazy.loadInSlide.bind(swiper),
6608          },
6609        });
6610      },
6611      on: {
6612        beforeInit: function beforeInit() {
6613          var swiper = this;
6614          if (swiper.params.lazy.enabled && swiper.params.preloadImages) {
6615            swiper.params.preloadImages = false;
6616          }
6617        },
6618        init: function init() {
6619          var swiper = this;
6620          if (swiper.params.lazy.enabled && !swiper.params.loop && swiper.params.initialSlide === 0) {
6621            swiper.lazy.load();
6622          }
6623        },
6624        scroll: function scroll() {
6625          var swiper = this;
6626          if (swiper.params.freeMode && !swiper.params.freeModeSticky) {
6627            swiper.lazy.load();
6628          }
6629        },
6630        resize: function resize() {
6631          var swiper = this;
6632          if (swiper.params.lazy.enabled) {
6633            swiper.lazy.load();
6634          }
6635        },
6636        scrollbarDragMove: function scrollbarDragMove() {
6637          var swiper = this;
6638          if (swiper.params.lazy.enabled) {
6639            swiper.lazy.load();
6640          }
6641        },
6642        transitionStart: function transitionStart() {
6643          var swiper = this;
6644          if (swiper.params.lazy.enabled) {
6645            if (swiper.params.lazy.loadOnTransitionStart || (!swiper.params.lazy.loadOnTransitionStart && !swiper.lazy.initialImageLoaded)) {
6646              swiper.lazy.load();
6647            }
6648          }
6649        },
6650        transitionEnd: function transitionEnd() {
6651          var swiper = this;
6652          if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {
6653            swiper.lazy.load();
6654          }
6655        },
6656      },
6657    };
6658  
6659    /* eslint no-bitwise: ["error", { "allow": [">>"] }] */
6660  
6661    var Controller = {
6662      LinearSpline: function LinearSpline(x, y) {
6663        var binarySearch = (function search() {
6664          var maxIndex;
6665          var minIndex;
6666          var guess;
6667          return function (array, val) {
6668            minIndex = -1;
6669            maxIndex = array.length;
6670            while (maxIndex - minIndex > 1) {
6671              guess = maxIndex + minIndex >> 1;
6672              if (array[guess] <= val) {
6673                minIndex = guess;
6674              } else {
6675                maxIndex = guess;
6676              }
6677            }
6678            return maxIndex;
6679          };
6680        }());
6681        this.x = x;
6682        this.y = y;
6683        this.lastIndex = x.length - 1;
6684        // Given an x value (x2), return the expected y2 value:
6685        // (x1,y1) is the known point before given value,
6686        // (x3,y3) is the known point after given value.
6687        var i1;
6688        var i3;
6689  
6690        this.interpolate = function interpolate(x2) {
6691          if (!x2) { return 0; }
6692  
6693          // Get the indexes of x1 and x3 (the array indexes before and after given x2):
6694          i3 = binarySearch(this.x, x2);
6695          i1 = i3 - 1;
6696  
6697          // We have our indexes i1 & i3, so we can calculate already:
6698          // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1
6699          return (((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1])) + this.y[i1];
6700        };
6701        return this;
6702      },
6703      // xxx: for now i will just save one spline function to to
6704      getInterpolateFunction: function getInterpolateFunction(c) {
6705        var swiper = this;
6706        if (!swiper.controller.spline) {
6707          swiper.controller.spline = swiper.params.loop
6708            ? new Controller.LinearSpline(swiper.slidesGrid, c.slidesGrid)
6709            : new Controller.LinearSpline(swiper.snapGrid, c.snapGrid);
6710        }
6711      },
6712      setTranslate: function setTranslate(setTranslate$1, byController) {
6713        var swiper = this;
6714        var controlled = swiper.controller.control;
6715        var multiplier;
6716        var controlledTranslate;
6717        function setControlledTranslate(c) {
6718          // this will create an Interpolate function based on the snapGrids
6719          // x is the Grid of the scrolled scroller and y will be the controlled scroller
6720          // it makes sense to create this only once and recall it for the interpolation
6721          // the function does a lot of value caching for performance
6722          var translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;
6723          if (swiper.params.controller.by === 'slide') {
6724            swiper.controller.getInterpolateFunction(c);
6725            // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid
6726            // but it did not work out
6727            controlledTranslate = -swiper.controller.spline.interpolate(-translate);
6728          }
6729  
6730          if (!controlledTranslate || swiper.params.controller.by === 'container') {
6731            multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());
6732            controlledTranslate = ((translate - swiper.minTranslate()) * multiplier) + c.minTranslate();
6733          }
6734  
6735          if (swiper.params.controller.inverse) {
6736            controlledTranslate = c.maxTranslate() - controlledTranslate;
6737          }
6738          c.updateProgress(controlledTranslate);
6739          c.setTranslate(controlledTranslate, swiper);
6740          c.updateActiveIndex();
6741          c.updateSlidesClasses();
6742        }
6743        if (Array.isArray(controlled)) {
6744          for (var i = 0; i < controlled.length; i += 1) {
6745            if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
6746              setControlledTranslate(controlled[i]);
6747            }
6748          }
6749        } else if (controlled instanceof Swiper && byController !== controlled) {
6750          setControlledTranslate(controlled);
6751        }
6752      },
6753      setTransition: function setTransition(duration, byController) {
6754        var swiper = this;
6755        var controlled = swiper.controller.control;
6756        var i;
6757        function setControlledTransition(c) {
6758          c.setTransition(duration, swiper);
6759          if (duration !== 0) {
6760            c.transitionStart();
6761            if (c.params.autoHeight) {
6762              Utils.nextTick(function () {
6763                c.updateAutoHeight();
6764              });
6765            }
6766            c.$wrapperEl.transitionEnd(function () {
6767              if (!controlled) { return; }
6768              if (c.params.loop && swiper.params.controller.by === 'slide') {
6769                c.loopFix();
6770              }
6771              c.transitionEnd();
6772            });
6773          }
6774        }
6775        if (Array.isArray(controlled)) {
6776          for (i = 0; i < controlled.length; i += 1) {
6777            if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
6778              setControlledTransition(controlled[i]);
6779            }
6780          }
6781        } else if (controlled instanceof Swiper && byController !== controlled) {
6782          setControlledTransition(controlled);
6783        }
6784      },
6785    };
6786    var Controller$1 = {
6787      name: 'controller',
6788      params: {
6789        controller: {
6790          control: undefined,
6791          inverse: false,
6792          by: 'slide', // or 'container'
6793        },
6794      },
6795      create: function create() {
6796        var swiper = this;
6797        Utils.extend(swiper, {
6798          controller: {
6799            control: swiper.params.controller.control,
6800            getInterpolateFunction: Controller.getInterpolateFunction.bind(swiper),
6801            setTranslate: Controller.setTranslate.bind(swiper),
6802            setTransition: Controller.setTransition.bind(swiper),
6803          },
6804        });
6805      },
6806      on: {
6807        update: function update() {
6808          var swiper = this;
6809          if (!swiper.controller.control) { return; }
6810          if (swiper.controller.spline) {
6811            swiper.controller.spline = undefined;
6812            delete swiper.controller.spline;
6813          }
6814        },
6815        resize: function resize() {
6816          var swiper = this;
6817          if (!swiper.controller.control) { return; }
6818          if (swiper.controller.spline) {
6819            swiper.controller.spline = undefined;
6820            delete swiper.controller.spline;
6821          }
6822        },
6823        observerUpdate: function observerUpdate() {
6824          var swiper = this;
6825          if (!swiper.controller.control) { return; }
6826          if (swiper.controller.spline) {
6827            swiper.controller.spline = undefined;
6828            delete swiper.controller.spline;
6829          }
6830        },
6831        setTranslate: function setTranslate(translate, byController) {
6832          var swiper = this;
6833          if (!swiper.controller.control) { return; }
6834          swiper.controller.setTranslate(translate, byController);
6835        },
6836        setTransition: function setTransition(duration, byController) {
6837          var swiper = this;
6838          if (!swiper.controller.control) { return; }
6839          swiper.controller.setTransition(duration, byController);
6840        },
6841      },
6842    };
6843  
6844    var a11y = {
6845      makeElFocusable: function makeElFocusable($el) {
6846        $el.attr('tabIndex', '0');
6847        return $el;
6848      },
6849      addElRole: function addElRole($el, role) {
6850        $el.attr('role', role);
6851        return $el;
6852      },
6853      addElLabel: function addElLabel($el, label) {
6854        $el.attr('aria-label', label);
6855        return $el;
6856      },
6857      disableEl: function disableEl($el) {
6858        $el.attr('aria-disabled', true);
6859        return $el;
6860      },
6861      enableEl: function enableEl($el) {
6862        $el.attr('aria-disabled', false);
6863        return $el;
6864      },
6865      onEnterKey: function onEnterKey(e) {
6866        var swiper = this;
6867        var params = swiper.params.a11y;
6868        if (e.keyCode !== 13) { return; }
6869        var $targetEl = $(e.target);
6870        if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {
6871          if (!(swiper.isEnd && !swiper.params.loop)) {
6872            swiper.slideNext();
6873          }
6874          if (swiper.isEnd) {
6875            swiper.a11y.notify(params.lastSlideMessage);
6876          } else {
6877            swiper.a11y.notify(params.nextSlideMessage);
6878          }
6879        }
6880        if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {
6881          if (!(swiper.isBeginning && !swiper.params.loop)) {
6882            swiper.slidePrev();
6883          }
6884          if (swiper.isBeginning) {
6885            swiper.a11y.notify(params.firstSlideMessage);
6886          } else {
6887            swiper.a11y.notify(params.prevSlideMessage);
6888          }
6889        }
6890        if (swiper.pagination && $targetEl.is(("." + (swiper.params.pagination.bulletClass)))) {
6891          $targetEl[0].click();
6892        }
6893      },
6894      notify: function notify(message) {
6895        var swiper = this;
6896        var notification = swiper.a11y.liveRegion;
6897        if (notification.length === 0) { return; }
6898        notification.html('');
6899        notification.html(message);
6900      },
6901      updateNavigation: function updateNavigation() {
6902        var swiper = this;
6903  
6904        if (swiper.params.loop) { return; }
6905        var ref = swiper.navigation;
6906        var $nextEl = ref.$nextEl;
6907        var $prevEl = ref.$prevEl;
6908  
6909        if ($prevEl && $prevEl.length > 0) {
6910          if (swiper.isBeginning) {
6911            swiper.a11y.disableEl($prevEl);
6912          } else {
6913            swiper.a11y.enableEl($prevEl);
6914          }
6915        }
6916        if ($nextEl && $nextEl.length > 0) {
6917          if (swiper.isEnd) {
6918            swiper.a11y.disableEl($nextEl);
6919          } else {
6920            swiper.a11y.enableEl($nextEl);
6921          }
6922        }
6923      },
6924      updatePagination: function updatePagination() {
6925        var swiper = this;
6926        var params = swiper.params.a11y;
6927        if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
6928          swiper.pagination.bullets.each(function (bulletIndex, bulletEl) {
6929            var $bulletEl = $(bulletEl);
6930            swiper.a11y.makeElFocusable($bulletEl);
6931            swiper.a11y.addElRole($bulletEl, 'button');
6932            swiper.a11y.addElLabel($bulletEl, params.paginationBulletMessage.replace(/{{index}}/, $bulletEl.index() + 1));
6933          });
6934        }
6935      },
6936      init: function init() {
6937        var swiper = this;
6938  
6939        swiper.$el.append(swiper.a11y.liveRegion);
6940  
6941        // Navigation
6942        var params = swiper.params.a11y;
6943        var $nextEl;
6944        var $prevEl;
6945        if (swiper.navigation && swiper.navigation.$nextEl) {
6946          $nextEl = swiper.navigation.$nextEl;
6947        }
6948        if (swiper.navigation && swiper.navigation.$prevEl) {
6949          $prevEl = swiper.navigation.$prevEl;
6950        }
6951        if ($nextEl) {
6952          swiper.a11y.makeElFocusable($nextEl);
6953          swiper.a11y.addElRole($nextEl, 'button');
6954          swiper.a11y.addElLabel($nextEl, params.nextSlideMessage);
6955          $nextEl.on('keydown', swiper.a11y.onEnterKey);
6956        }
6957        if ($prevEl) {
6958          swiper.a11y.makeElFocusable($prevEl);
6959          swiper.a11y.addElRole($prevEl, 'button');
6960          swiper.a11y.addElLabel($prevEl, params.prevSlideMessage);
6961          $prevEl.on('keydown', swiper.a11y.onEnterKey);
6962        }
6963  
6964        // Pagination
6965        if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
6966          swiper.pagination.$el.on('keydown', ("." + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);
6967        }
6968      },
6969      destroy: function destroy() {
6970        var swiper = this;
6971        if (swiper.a11y.liveRegion && swiper.a11y.liveRegion.length > 0) { swiper.a11y.liveRegion.remove(); }
6972  
6973        var $nextEl;
6974        var $prevEl;
6975        if (swiper.navigation && swiper.navigation.$nextEl) {
6976          $nextEl = swiper.navigation.$nextEl;
6977        }
6978        if (swiper.navigation && swiper.navigation.$prevEl) {
6979          $prevEl = swiper.navigation.$prevEl;
6980        }
6981        if ($nextEl) {
6982          $nextEl.off('keydown', swiper.a11y.onEnterKey);
6983        }
6984        if ($prevEl) {
6985          $prevEl.off('keydown', swiper.a11y.onEnterKey);
6986        }
6987  
6988        // Pagination
6989        if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
6990          swiper.pagination.$el.off('keydown', ("." + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);
6991        }
6992      },
6993    };
6994    var A11y = {
6995      name: 'a11y',
6996      params: {
6997        a11y: {
6998          enabled: true,
6999          notificationClass: 'swiper-notification',
7000          prevSlideMessage: 'Previous slide',
7001          nextSlideMessage: 'Next slide',
7002          firstSlideMessage: 'This is the first slide',
7003          lastSlideMessage: 'This is the last slide',
7004          paginationBulletMessage: 'Go to slide {{index}}',
7005        },
7006      },
7007      create: function create() {
7008        var swiper = this;
7009        Utils.extend(swiper, {
7010          a11y: {
7011            liveRegion: $(("<span class=\"" + (swiper.params.a11y.notificationClass) + "\" aria-live=\"assertive\" aria-atomic=\"true\"></span>")),
7012          },
7013        });
7014        Object.keys(a11y).forEach(function (methodName) {
7015          swiper.a11y[methodName] = a11y[methodName].bind(swiper);
7016        });
7017      },
7018      on: {
7019        init: function init() {
7020          var swiper = this;
7021          if (!swiper.params.a11y.enabled) { return; }
7022          swiper.a11y.init();
7023          swiper.a11y.updateNavigation();
7024        },
7025        toEdge: function toEdge() {
7026          var swiper = this;
7027          if (!swiper.params.a11y.enabled) { return; }
7028          swiper.a11y.updateNavigation();
7029        },
7030        fromEdge: function fromEdge() {
7031          var swiper = this;
7032          if (!swiper.params.a11y.enabled) { return; }
7033          swiper.a11y.updateNavigation();
7034        },
7035        paginationUpdate: function paginationUpdate() {
7036          var swiper = this;
7037          if (!swiper.params.a11y.enabled) { return; }
7038          swiper.a11y.updatePagination();
7039        },
7040        destroy: function destroy() {
7041          var swiper = this;
7042          if (!swiper.params.a11y.enabled) { return; }
7043          swiper.a11y.destroy();
7044        },
7045      },
7046    };
7047  
7048    var History = {
7049      init: function init() {
7050        var swiper = this;
7051        if (!swiper.params.history) { return; }
7052        if (!win.history || !win.history.pushState) {
7053          swiper.params.history.enabled = false;
7054          swiper.params.hashNavigation.enabled = true;
7055          return;
7056        }
7057        var history = swiper.history;
7058        history.initialized = true;
7059        history.paths = History.getPathValues();
7060        if (!history.paths.key && !history.paths.value) { return; }
7061        history.scrollToSlide(0, history.paths.value, swiper.params.runCallbacksOnInit);
7062        if (!swiper.params.history.replaceState) {
7063          win.addEventListener('popstate', swiper.history.setHistoryPopState);
7064        }
7065      },
7066      destroy: function destroy() {
7067        var swiper = this;
7068        if (!swiper.params.history.replaceState) {
7069          win.removeEventListener('popstate', swiper.history.setHistoryPopState);
7070        }
7071      },
7072      setHistoryPopState: function setHistoryPopState() {
7073        var swiper = this;
7074        swiper.history.paths = History.getPathValues();
7075        swiper.history.scrollToSlide(swiper.params.speed, swiper.history.paths.value, false);
7076      },
7077      getPathValues: function getPathValues() {
7078        var pathArray = win.location.pathname.slice(1).split('/').filter(function (part) { return part !== ''; });
7079        var total = pathArray.length;
7080        var key = pathArray[total - 2];
7081        var value = pathArray[total - 1];
7082        return { key: key, value: value };
7083      },
7084      setHistory: function setHistory(key, index) {
7085        var swiper = this;
7086        if (!swiper.history.initialized || !swiper.params.history.enabled) { return; }
7087        var slide = swiper.slides.eq(index);
7088        var value = History.slugify(slide.attr('data-history'));
7089        if (!win.location.pathname.includes(key)) {
7090          value = key + "/" + value;
7091        }
7092        var currentState = win.history.state;
7093        if (currentState && currentState.value === value) {
7094          return;
7095        }
7096        if (swiper.params.history.replaceState) {
7097          win.history.replaceState({ value: value }, null, value);
7098        } else {
7099          win.history.pushState({ value: value }, null, value);
7100        }
7101      },
7102      slugify: function slugify(text) {
7103        return text.toString()
7104          .replace(/\s+/g, '-')
7105          .replace(/[^\w-]+/g, '')
7106          .replace(/--+/g, '-')
7107          .replace(/^-+/, '')
7108          .replace(/-+$/, '');
7109      },
7110      scrollToSlide: function scrollToSlide(speed, value, runCallbacks) {
7111        var swiper = this;
7112        if (value) {
7113          for (var i = 0, length = swiper.slides.length; i < length; i += 1) {
7114            var slide = swiper.slides.eq(i);
7115            var slideHistory = History.slugify(slide.attr('data-history'));
7116            if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {
7117              var index = slide.index();
7118              swiper.slideTo(index, speed, runCallbacks);
7119            }
7120          }
7121        } else {
7122          swiper.slideTo(0, speed, runCallbacks);
7123        }
7124      },
7125    };
7126  
7127    var History$1 = {
7128      name: 'history',
7129      params: {
7130        history: {
7131          enabled: false,
7132          replaceState: false,
7133          key: 'slides',
7134        },
7135      },
7136      create: function create() {
7137        var swiper = this;
7138        Utils.extend(swiper, {
7139          history: {
7140            init: History.init.bind(swiper),
7141            setHistory: History.setHistory.bind(swiper),
7142            setHistoryPopState: History.setHistoryPopState.bind(swiper),
7143            scrollToSlide: History.scrollToSlide.bind(swiper),
7144            destroy: History.destroy.bind(swiper),
7145          },
7146        });
7147      },
7148      on: {
7149        init: function init() {
7150          var swiper = this;
7151          if (swiper.params.history.enabled) {
7152            swiper.history.init();
7153          }
7154        },
7155        destroy: function destroy() {
7156          var swiper = this;
7157          if (swiper.params.history.enabled) {
7158            swiper.history.destroy();
7159          }
7160        },
7161        transitionEnd: function transitionEnd() {
7162          var swiper = this;
7163          if (swiper.history.initialized) {
7164            swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);
7165          }
7166        },
7167      },
7168    };
7169  
7170    var HashNavigation = {
7171      onHashCange: function onHashCange() {
7172        var swiper = this;
7173        var newHash = doc.location.hash.replace('#', '');
7174        var activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');
7175        if (newHash !== activeSlideHash) {
7176          var newIndex = swiper.$wrapperEl.children(("." + (swiper.params.slideClass) + "[data-hash=\"" + newHash + "\"]")).index();
7177          if (typeof newIndex === 'undefined') { return; }
7178          swiper.slideTo(newIndex);
7179        }
7180      },
7181      setHash: function setHash() {
7182        var swiper = this;
7183        if (!swiper.hashNavigation.initialized || !swiper.params.hashNavigation.enabled) { return; }
7184        if (swiper.params.hashNavigation.replaceState && win.history && win.history.replaceState) {
7185          win.history.replaceState(null, null, (("#" + (swiper.slides.eq(swiper.activeIndex).attr('data-hash'))) || ''));
7186        } else {
7187          var slide = swiper.slides.eq(swiper.activeIndex);
7188          var hash = slide.attr('data-hash') || slide.attr('data-history');
7189          doc.location.hash = hash || '';
7190        }
7191      },
7192      init: function init() {
7193        var swiper = this;
7194        if (!swiper.params.hashNavigation.enabled || (swiper.params.history && swiper.params.history.enabled)) { return; }
7195        swiper.hashNavigation.initialized = true;
7196        var hash = doc.location.hash.replace('#', '');
7197        if (hash) {
7198          var speed = 0;
7199          for (var i = 0, length = swiper.slides.length; i < length; i += 1) {
7200            var slide = swiper.slides.eq(i);
7201            var slideHash = slide.attr('data-hash') || slide.attr('data-history');
7202            if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {
7203              var index = slide.index();
7204              swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);
7205            }
7206          }
7207        }
7208        if (swiper.params.hashNavigation.watchState) {
7209          $(win).on('hashchange', swiper.hashNavigation.onHashCange);
7210        }
7211      },
7212      destroy: function destroy() {
7213        var swiper = this;
7214        if (swiper.params.hashNavigation.watchState) {
7215          $(win).off('hashchange', swiper.hashNavigation.onHashCange);
7216        }
7217      },
7218    };
7219    var HashNavigation$1 = {
7220      name: 'hash-navigation',
7221      params: {
7222        hashNavigation: {
7223          enabled: false,
7224          replaceState: false,
7225          watchState: false,
7226        },
7227      },
7228      create: function create() {
7229        var swiper = this;
7230        Utils.extend(swiper, {
7231          hashNavigation: {
7232            initialized: false,
7233            init: HashNavigation.init.bind(swiper),
7234            destroy: HashNavigation.destroy.bind(swiper),
7235            setHash: HashNavigation.setHash.bind(swiper),
7236            onHashCange: HashNavigation.onHashCange.bind(swiper),
7237          },
7238        });
7239      },
7240      on: {
7241        init: function init() {
7242          var swiper = this;
7243          if (swiper.params.hashNavigation.enabled) {
7244            swiper.hashNavigation.init();
7245          }
7246        },
7247        destroy: function destroy() {
7248          var swiper = this;
7249          if (swiper.params.hashNavigation.enabled) {
7250            swiper.hashNavigation.destroy();
7251          }
7252        },
7253        transitionEnd: function transitionEnd() {
7254          var swiper = this;
7255          if (swiper.hashNavigation.initialized) {
7256            swiper.hashNavigation.setHash();
7257          }
7258        },
7259      },
7260    };
7261  
7262    /* eslint no-underscore-dangle: "off" */
7263  
7264    var Autoplay = {
7265      run: function run() {
7266        var swiper = this;
7267        var $activeSlideEl = swiper.slides.eq(swiper.activeIndex);
7268        var delay = swiper.params.autoplay.delay;
7269        if ($activeSlideEl.attr('data-swiper-autoplay')) {
7270          delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;
7271        }
7272        clearTimeout(swiper.autoplay.timeout);
7273        swiper.autoplay.timeout = Utils.nextTick(function () {
7274          if (swiper.params.autoplay.reverseDirection) {
7275            if (swiper.params.loop) {
7276              swiper.loopFix();
7277              swiper.slidePrev(swiper.params.speed, true, true);
7278              swiper.emit('autoplay');
7279            } else if (!swiper.isBeginning) {
7280              swiper.slidePrev(swiper.params.speed, true, true);
7281              swiper.emit('autoplay');
7282            } else if (!swiper.params.autoplay.stopOnLastSlide) {
7283              swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true);
7284              swiper.emit('autoplay');
7285            } else {
7286              swiper.autoplay.stop();
7287            }
7288          } else if (swiper.params.loop) {
7289            swiper.loopFix();
7290            swiper.slideNext(swiper.params.speed, true, true);
7291            swiper.emit('autoplay');
7292          } else if (!swiper.isEnd) {
7293            swiper.slideNext(swiper.params.speed, true, true);
7294            swiper.emit('autoplay');
7295          } else if (!swiper.params.autoplay.stopOnLastSlide) {
7296            swiper.slideTo(0, swiper.params.speed, true, true);
7297            swiper.emit('autoplay');
7298          } else {
7299            swiper.autoplay.stop();
7300          }
7301        }, delay);
7302      },
7303      start: function start() {
7304        var swiper = this;
7305        if (typeof swiper.autoplay.timeout !== 'undefined') { return false; }
7306        if (swiper.autoplay.running) { return false; }
7307        swiper.autoplay.running = true;
7308        swiper.emit('autoplayStart');
7309        swiper.autoplay.run();
7310        return true;
7311      },
7312      stop: function stop() {
7313        var swiper = this;
7314        if (!swiper.autoplay.running) { return false; }
7315        if (typeof swiper.autoplay.timeout === 'undefined') { return false; }
7316  
7317        if (swiper.autoplay.timeout) {
7318          clearTimeout(swiper.autoplay.timeout);
7319          swiper.autoplay.timeout = undefined;
7320        }
7321        swiper.autoplay.running = false;
7322        swiper.emit('autoplayStop');
7323        return true;
7324      },
7325      pause: function pause(speed) {
7326        var swiper = this;
7327        if (!swiper.autoplay.running) { return; }
7328        if (swiper.autoplay.paused) { return; }
7329        if (swiper.autoplay.timeout) { clearTimeout(swiper.autoplay.timeout); }
7330        swiper.autoplay.paused = true;
7331        if (speed === 0 || !swiper.params.autoplay.waitForTransition) {
7332          swiper.autoplay.paused = false;
7333          swiper.autoplay.run();
7334        } else {
7335          swiper.$wrapperEl[0].addEventListener('transitionend', swiper.autoplay.onTransitionEnd);
7336          swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);
7337        }
7338      },
7339    };
7340  
7341    var Autoplay$1 = {
7342      name: 'autoplay',
7343      params: {
7344        autoplay: {
7345          enabled: false,
7346          delay: 3000,
7347          waitForTransition: true,
7348          disableOnInteraction: true,
7349          stopOnLastSlide: false,
7350          reverseDirection: false,
7351        },
7352      },
7353      create: function create() {
7354        var swiper = this;
7355        Utils.extend(swiper, {
7356          autoplay: {
7357            running: false,
7358            paused: false,
7359            run: Autoplay.run.bind(swiper),
7360            start: Autoplay.start.bind(swiper),
7361            stop: Autoplay.stop.bind(swiper),
7362            pause: Autoplay.pause.bind(swiper),
7363            onTransitionEnd: function onTransitionEnd(e) {
7364              if (!swiper || swiper.destroyed || !swiper.$wrapperEl) { return; }
7365              if (e.target !== this) { return; }
7366              swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.autoplay.onTransitionEnd);
7367              swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);
7368              swiper.autoplay.paused = false;
7369              if (!swiper.autoplay.running) {
7370                swiper.autoplay.stop();
7371              } else {
7372                swiper.autoplay.run();
7373              }
7374            },
7375          },
7376        });
7377      },
7378      on: {
7379        init: function init() {
7380          var swiper = this;
7381          if (swiper.params.autoplay.enabled) {
7382            swiper.autoplay.start();
7383          }
7384        },
7385        beforeTransitionStart: function beforeTransitionStart(speed, internal) {
7386          var swiper = this;
7387          if (swiper.autoplay.running) {
7388            if (internal || !swiper.params.autoplay.disableOnInteraction) {
7389              swiper.autoplay.pause(speed);
7390            } else {
7391              swiper.autoplay.stop();
7392            }
7393          }
7394        },
7395        sliderFirstMove: function sliderFirstMove() {
7396          var swiper = this;
7397          if (swiper.autoplay.running) {
7398            if (swiper.params.autoplay.disableOnInteraction) {
7399              swiper.autoplay.stop();
7400            } else {
7401              swiper.autoplay.pause();
7402            }
7403          }
7404        },
7405        destroy: function destroy() {
7406          var swiper = this;
7407          if (swiper.autoplay.running) {
7408            swiper.autoplay.stop();
7409          }
7410        },
7411      },
7412    };
7413  
7414    var Fade = {
7415      setTranslate: function setTranslate() {
7416        var swiper = this;
7417        var slides = swiper.slides;
7418        for (var i = 0; i < slides.length; i += 1) {
7419          var $slideEl = swiper.slides.eq(i);
7420          var offset = $slideEl[0].swiperSlideOffset;
7421          var tx = -offset;
7422          if (!swiper.params.virtualTranslate) { tx -= swiper.translate; }
7423          var ty = 0;
7424          if (!swiper.isHorizontal()) {
7425            ty = tx;
7426            tx = 0;
7427          }
7428          var slideOpacity = swiper.params.fadeEffect.crossFade
7429            ? Math.max(1 - Math.abs($slideEl[0].progress), 0)
7430            : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);
7431          $slideEl
7432            .css({
7433              opacity: slideOpacity,
7434            })
7435            .transform(("translate3d(" + tx + "px, " + ty + "px, 0px)"));
7436        }
7437      },
7438      setTransition: function setTransition(duration) {
7439        var swiper = this;
7440        var slides = swiper.slides;
7441        var $wrapperEl = swiper.$wrapperEl;
7442        slides.transition(duration);
7443        if (swiper.params.virtualTranslate && duration !== 0) {
7444          var eventTriggered = false;
7445          slides.transitionEnd(function () {
7446            if (eventTriggered) { return; }
7447            if (!swiper || swiper.destroyed) { return; }
7448            eventTriggered = true;
7449            swiper.animating = false;
7450            var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
7451            for (var i = 0; i < triggerEvents.length; i += 1) {
7452              $wrapperEl.trigger(triggerEvents[i]);
7453            }
7454          });
7455        }
7456      },
7457    };
7458  
7459    var EffectFade = {
7460      name: 'effect-fade',
7461      params: {
7462        fadeEffect: {
7463          crossFade: false,
7464        },
7465      },
7466      create: function create() {
7467        var swiper = this;
7468        Utils.extend(swiper, {
7469          fadeEffect: {
7470            setTranslate: Fade.setTranslate.bind(swiper),
7471            setTransition: Fade.setTransition.bind(swiper),
7472          },
7473        });
7474      },
7475      on: {
7476        beforeInit: function beforeInit() {
7477          var swiper = this;
7478          if (swiper.params.effect !== 'fade') { return; }
7479          swiper.classNames.push(((swiper.params.containerModifierClass) + "fade"));
7480          var overwriteParams = {
7481            slidesPerView: 1,
7482            slidesPerColumn: 1,
7483            slidesPerGroup: 1,
7484            watchSlidesProgress: true,
7485            spaceBetween: 0,
7486            virtualTranslate: true,
7487          };
7488          Utils.extend(swiper.params, overwriteParams);
7489          Utils.extend(swiper.originalParams, overwriteParams);
7490        },
7491        setTranslate: function setTranslate() {
7492          var swiper = this;
7493          if (swiper.params.effect !== 'fade') { return; }
7494          swiper.fadeEffect.setTranslate();
7495        },
7496        setTransition: function setTransition(duration) {
7497          var swiper = this;
7498          if (swiper.params.effect !== 'fade') { return; }
7499          swiper.fadeEffect.setTransition(duration);
7500        },
7501      },
7502    };
7503  
7504    var Cube = {
7505      setTranslate: function setTranslate() {
7506        var swiper = this;
7507        var $el = swiper.$el;
7508        var $wrapperEl = swiper.$wrapperEl;
7509        var slides = swiper.slides;
7510        var swiperWidth = swiper.width;
7511        var swiperHeight = swiper.height;
7512        var rtl = swiper.rtlTranslate;
7513        var swiperSize = swiper.size;
7514        var params = swiper.params.cubeEffect;
7515        var isHorizontal = swiper.isHorizontal();
7516        var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
7517        var wrapperRotate = 0;
7518        var $cubeShadowEl;
7519        if (params.shadow) {
7520          if (isHorizontal) {
7521            $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');
7522            if ($cubeShadowEl.length === 0) {
7523              $cubeShadowEl = $('<div class="swiper-cube-shadow"></div>');
7524              $wrapperEl.append($cubeShadowEl);
7525            }
7526            $cubeShadowEl.css({ height: (swiperWidth + "px") });
7527          } else {
7528            $cubeShadowEl = $el.find('.swiper-cube-shadow');
7529            if ($cubeShadowEl.length === 0) {
7530              $cubeShadowEl = $('<div class="swiper-cube-shadow"></div>');
7531              $el.append($cubeShadowEl);
7532            }
7533          }
7534        }
7535        for (var i = 0; i < slides.length; i += 1) {
7536          var $slideEl = slides.eq(i);
7537          var slideIndex = i;
7538          if (isVirtual) {
7539            slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);
7540          }
7541          var slideAngle = slideIndex * 90;
7542          var round = Math.floor(slideAngle / 360);
7543          if (rtl) {
7544            slideAngle = -slideAngle;
7545            round = Math.floor(-slideAngle / 360);
7546          }
7547          var progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
7548          var tx = 0;
7549          var ty = 0;
7550          var tz = 0;
7551          if (slideIndex % 4 === 0) {
7552            tx = -round * 4 * swiperSize;
7553            tz = 0;
7554          } else if ((slideIndex - 1) % 4 === 0) {
7555            tx = 0;
7556            tz = -round * 4 * swiperSize;
7557          } else if ((slideIndex - 2) % 4 === 0) {
7558            tx = swiperSize + (round * 4 * swiperSize);
7559            tz = swiperSize;
7560          } else if ((slideIndex - 3) % 4 === 0) {
7561            tx = -swiperSize;
7562            tz = (3 * swiperSize) + (swiperSize * 4 * round);
7563          }
7564          if (rtl) {
7565            tx = -tx;
7566          }
7567  
7568          if (!isHorizontal) {
7569            ty = tx;
7570            tx = 0;
7571          }
7572  
7573          var transform = "rotateX(" + (isHorizontal ? 0 : -slideAngle) + "deg) rotateY(" + (isHorizontal ? slideAngle : 0) + "deg) translate3d(" + tx + "px, " + ty + "px, " + tz + "px)";
7574          if (progress <= 1 && progress > -1) {
7575            wrapperRotate = (slideIndex * 90) + (progress * 90);
7576            if (rtl) { wrapperRotate = (-slideIndex * 90) - (progress * 90); }
7577          }
7578          $slideEl.transform(transform);
7579          if (params.slideShadows) {
7580            // Set shadows
7581            var shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
7582            var shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
7583            if (shadowBefore.length === 0) {
7584              shadowBefore = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>"));
7585              $slideEl.append(shadowBefore);
7586            }
7587            if (shadowAfter.length === 0) {
7588              shadowAfter = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>"));
7589              $slideEl.append(shadowAfter);
7590            }
7591            if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }
7592            if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }
7593          }
7594        }
7595        $wrapperEl.css({
7596          '-webkit-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
7597          '-moz-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
7598          '-ms-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
7599          'transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
7600        });
7601  
7602        if (params.shadow) {
7603          if (isHorizontal) {
7604            $cubeShadowEl.transform(("translate3d(0px, " + ((swiperWidth / 2) + params.shadowOffset) + "px, " + (-swiperWidth / 2) + "px) rotateX(90deg) rotateZ(0deg) scale(" + (params.shadowScale) + ")"));
7605          } else {
7606            var shadowAngle = Math.abs(wrapperRotate) - (Math.floor(Math.abs(wrapperRotate) / 90) * 90);
7607            var multiplier = 1.5 - (
7608              (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2)
7609              + (Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2)
7610            );
7611            var scale1 = params.shadowScale;
7612            var scale2 = params.shadowScale / multiplier;
7613            var offset = params.shadowOffset;
7614            $cubeShadowEl.transform(("scale3d(" + scale1 + ", 1, " + scale2 + ") translate3d(0px, " + ((swiperHeight / 2) + offset) + "px, " + (-swiperHeight / 2 / scale2) + "px) rotateX(-90deg)"));
7615          }
7616        }
7617        var zFactor = (Browser.isSafari || Browser.isUiWebView) ? (-swiperSize / 2) : 0;
7618        $wrapperEl
7619          .transform(("translate3d(0px,0," + zFactor + "px) rotateX(" + (swiper.isHorizontal() ? 0 : wrapperRotate) + "deg) rotateY(" + (swiper.isHorizontal() ? -wrapperRotate : 0) + "deg)"));
7620      },
7621      setTransition: function setTransition(duration) {
7622        var swiper = this;
7623        var $el = swiper.$el;
7624        var slides = swiper.slides;
7625        slides
7626          .transition(duration)
7627          .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
7628          .transition(duration);
7629        if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {
7630          $el.find('.swiper-cube-shadow').transition(duration);
7631        }
7632      },
7633    };
7634  
7635    var EffectCube = {
7636      name: 'effect-cube',
7637      params: {
7638        cubeEffect: {
7639          slideShadows: true,
7640          shadow: true,
7641          shadowOffset: 20,
7642          shadowScale: 0.94,
7643        },
7644      },
7645      create: function create() {
7646        var swiper = this;
7647        Utils.extend(swiper, {
7648          cubeEffect: {
7649            setTranslate: Cube.setTranslate.bind(swiper),
7650            setTransition: Cube.setTransition.bind(swiper),
7651          },
7652        });
7653      },
7654      on: {
7655        beforeInit: function beforeInit() {
7656          var swiper = this;
7657          if (swiper.params.effect !== 'cube') { return; }
7658          swiper.classNames.push(((swiper.params.containerModifierClass) + "cube"));
7659          swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
7660          var overwriteParams = {
7661            slidesPerView: 1,
7662            slidesPerColumn: 1,
7663            slidesPerGroup: 1,
7664            watchSlidesProgress: true,
7665            resistanceRatio: 0,
7666            spaceBetween: 0,
7667            centeredSlides: false,
7668            virtualTranslate: true,
7669          };
7670          Utils.extend(swiper.params, overwriteParams);
7671          Utils.extend(swiper.originalParams, overwriteParams);
7672        },
7673        setTranslate: function setTranslate() {
7674          var swiper = this;
7675          if (swiper.params.effect !== 'cube') { return; }
7676          swiper.cubeEffect.setTranslate();
7677        },
7678        setTransition: function setTransition(duration) {
7679          var swiper = this;
7680          if (swiper.params.effect !== 'cube') { return; }
7681          swiper.cubeEffect.setTransition(duration);
7682        },
7683      },
7684    };
7685  
7686    var Flip = {
7687      setTranslate: function setTranslate() {
7688        var swiper = this;
7689        var slides = swiper.slides;
7690        var rtl = swiper.rtlTranslate;
7691        for (var i = 0; i < slides.length; i += 1) {
7692          var $slideEl = slides.eq(i);
7693          var progress = $slideEl[0].progress;
7694          if (swiper.params.flipEffect.limitRotation) {
7695            progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
7696          }
7697          var offset = $slideEl[0].swiperSlideOffset;
7698          var rotate = -180 * progress;
7699          var rotateY = rotate;
7700          var rotateX = 0;
7701          var tx = -offset;
7702          var ty = 0;
7703          if (!swiper.isHorizontal()) {
7704            ty = tx;
7705            tx = 0;
7706            rotateX = -rotateY;
7707            rotateY = 0;
7708          } else if (rtl) {
7709            rotateY = -rotateY;
7710          }
7711  
7712          $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;
7713  
7714          if (swiper.params.flipEffect.slideShadows) {
7715            // Set shadows
7716            var shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
7717            var shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
7718            if (shadowBefore.length === 0) {
7719              shadowBefore = $(("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'left' : 'top') + "\"></div>"));
7720              $slideEl.append(shadowBefore);
7721            }
7722            if (shadowAfter.length === 0) {
7723              shadowAfter = $(("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'right' : 'bottom') + "\"></div>"));
7724              $slideEl.append(shadowAfter);
7725            }
7726            if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }
7727            if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }
7728          }
7729          $slideEl
7730            .transform(("translate3d(" + tx + "px, " + ty + "px, 0px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)"));
7731        }
7732      },
7733      setTransition: function setTransition(duration) {
7734        var swiper = this;
7735        var slides = swiper.slides;
7736        var activeIndex = swiper.activeIndex;
7737        var $wrapperEl = swiper.$wrapperEl;
7738        slides
7739          .transition(duration)
7740          .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
7741          .transition(duration);
7742        if (swiper.params.virtualTranslate && duration !== 0) {
7743          var eventTriggered = false;
7744          // eslint-disable-next-line
7745          slides.eq(activeIndex).transitionEnd(function onTransitionEnd() {
7746            if (eventTriggered) { return; }
7747            if (!swiper || swiper.destroyed) { return; }
7748            // if (!$(this).hasClass(swiper.params.slideActiveClass)) return;
7749            eventTriggered = true;
7750            swiper.animating = false;
7751            var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
7752            for (var i = 0; i < triggerEvents.length; i += 1) {
7753              $wrapperEl.trigger(triggerEvents[i]);
7754            }
7755          });
7756        }
7757      },
7758    };
7759  
7760    var EffectFlip = {
7761      name: 'effect-flip',
7762      params: {
7763        flipEffect: {
7764          slideShadows: true,
7765          limitRotation: true,
7766        },
7767      },
7768      create: function create() {
7769        var swiper = this;
7770        Utils.extend(swiper, {
7771          flipEffect: {
7772            setTranslate: Flip.setTranslate.bind(swiper),
7773            setTransition: Flip.setTransition.bind(swiper),
7774          },
7775        });
7776      },
7777      on: {
7778        beforeInit: function beforeInit() {
7779          var swiper = this;
7780          if (swiper.params.effect !== 'flip') { return; }
7781          swiper.classNames.push(((swiper.params.containerModifierClass) + "flip"));
7782          swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
7783          var overwriteParams = {
7784            slidesPerView: 1,
7785            slidesPerColumn: 1,
7786            slidesPerGroup: 1,
7787            watchSlidesProgress: true,
7788            spaceBetween: 0,
7789            virtualTranslate: true,
7790          };
7791          Utils.extend(swiper.params, overwriteParams);
7792          Utils.extend(swiper.originalParams, overwriteParams);
7793        },
7794        setTranslate: function setTranslate() {
7795          var swiper = this;
7796          if (swiper.params.effect !== 'flip') { return; }
7797          swiper.flipEffect.setTranslate();
7798        },
7799        setTransition: function setTransition(duration) {
7800          var swiper = this;
7801          if (swiper.params.effect !== 'flip') { return; }
7802          swiper.flipEffect.setTransition(duration);
7803        },
7804      },
7805    };
7806  
7807    var Coverflow = {
7808      setTranslate: function setTranslate() {
7809        var swiper = this;
7810        var swiperWidth = swiper.width;
7811        var swiperHeight = swiper.height;
7812        var slides = swiper.slides;
7813        var $wrapperEl = swiper.$wrapperEl;
7814        var slidesSizesGrid = swiper.slidesSizesGrid;
7815        var params = swiper.params.coverflowEffect;
7816        var isHorizontal = swiper.isHorizontal();
7817        var transform = swiper.translate;
7818        var center = isHorizontal ? -transform + (swiperWidth / 2) : -transform + (swiperHeight / 2);
7819        var rotate = isHorizontal ? params.rotate : -params.rotate;
7820        var translate = params.depth;
7821        // Each slide offset from center
7822        for (var i = 0, length = slides.length; i < length; i += 1) {
7823          var $slideEl = slides.eq(i);
7824          var slideSize = slidesSizesGrid[i];
7825          var slideOffset = $slideEl[0].swiperSlideOffset;
7826          var offsetMultiplier = ((center - slideOffset - (slideSize / 2)) / slideSize) * params.modifier;
7827  
7828          var rotateY = isHorizontal ? rotate * offsetMultiplier : 0;
7829          var rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;
7830          // var rotateZ = 0
7831          var translateZ = -translate * Math.abs(offsetMultiplier);
7832  
7833          var translateY = isHorizontal ? 0 : params.stretch * (offsetMultiplier);
7834          var translateX = isHorizontal ? params.stretch * (offsetMultiplier) : 0;
7835  
7836          // Fix for ultra small values
7837          if (Math.abs(translateX) < 0.001) { translateX = 0; }
7838          if (Math.abs(translateY) < 0.001) { translateY = 0; }
7839          if (Math.abs(translateZ) < 0.001) { translateZ = 0; }
7840          if (Math.abs(rotateY) < 0.001) { rotateY = 0; }
7841          if (Math.abs(rotateX) < 0.001) { rotateX = 0; }
7842  
7843          var slideTransform = "translate3d(" + translateX + "px," + translateY + "px," + translateZ + "px)  rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)";
7844  
7845          $slideEl.transform(slideTransform);
7846          $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;
7847          if (params.slideShadows) {
7848            // Set shadows
7849            var $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
7850            var $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
7851            if ($shadowBeforeEl.length === 0) {
7852              $shadowBeforeEl = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>"));
7853              $slideEl.append($shadowBeforeEl);
7854            }
7855            if ($shadowAfterEl.length === 0) {
7856              $shadowAfterEl = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>"));
7857              $slideEl.append($shadowAfterEl);
7858            }
7859            if ($shadowBeforeEl.length) { $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; }
7860            if ($shadowAfterEl.length) { $shadowAfterEl[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0; }
7861          }
7862        }
7863  
7864        // Set correct perspective for IE10
7865        if (Support.pointerEvents || Support.prefixedPointerEvents) {
7866          var ws = $wrapperEl[0].style;
7867          ws.perspectiveOrigin = center + "px 50%";
7868        }
7869      },
7870      setTransition: function setTransition(duration) {
7871        var swiper = this;
7872        swiper.slides
7873          .transition(duration)
7874          .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
7875          .transition(duration);
7876      },
7877    };
7878  
7879    var EffectCoverflow = {
7880      name: 'effect-coverflow',
7881      params: {
7882        coverflowEffect: {
7883          rotate: 50,
7884          stretch: 0,
7885          depth: 100,
7886          modifier: 1,
7887          slideShadows: true,
7888        },
7889      },
7890      create: function create() {
7891        var swiper = this;
7892        Utils.extend(swiper, {
7893          coverflowEffect: {
7894            setTranslate: Coverflow.setTranslate.bind(swiper),
7895            setTransition: Coverflow.setTransition.bind(swiper),
7896          },
7897        });
7898      },
7899      on: {
7900        beforeInit: function beforeInit() {
7901          var swiper = this;
7902          if (swiper.params.effect !== 'coverflow') { return; }
7903  
7904          swiper.classNames.push(((swiper.params.containerModifierClass) + "coverflow"));
7905          swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
7906  
7907          swiper.params.watchSlidesProgress = true;
7908          swiper.originalParams.watchSlidesProgress = true;
7909        },
7910        setTranslate: function setTranslate() {
7911          var swiper = this;
7912          if (swiper.params.effect !== 'coverflow') { return; }
7913          swiper.coverflowEffect.setTranslate();
7914        },
7915        setTransition: function setTransition(duration) {
7916          var swiper = this;
7917          if (swiper.params.effect !== 'coverflow') { return; }
7918          swiper.coverflowEffect.setTransition(duration);
7919        },
7920      },
7921    };
7922  
7923    var Thumbs = {
7924      init: function init() {
7925        var swiper = this;
7926        var ref = swiper.params;
7927        var thumbsParams = ref.thumbs;
7928        var SwiperClass = swiper.constructor;
7929        if (thumbsParams.swiper instanceof SwiperClass) {
7930          swiper.thumbs.swiper = thumbsParams.swiper;
7931          Utils.extend(swiper.thumbs.swiper.originalParams, {
7932            watchSlidesProgress: true,
7933            slideToClickedSlide: false,
7934          });
7935          Utils.extend(swiper.thumbs.swiper.params, {
7936            watchSlidesProgress: true,
7937            slideToClickedSlide: false,
7938          });
7939        } else if (Utils.isObject(thumbsParams.swiper)) {
7940          swiper.thumbs.swiper = new SwiperClass(Utils.extend({}, thumbsParams.swiper, {
7941            watchSlidesVisibility: true,
7942            watchSlidesProgress: true,
7943            slideToClickedSlide: false,
7944          }));
7945          swiper.thumbs.swiperCreated = true;
7946        }
7947        swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);
7948        swiper.thumbs.swiper.on('tap', swiper.thumbs.onThumbClick);
7949      },
7950      onThumbClick: function onThumbClick() {
7951        var swiper = this;
7952        var thumbsSwiper = swiper.thumbs.swiper;
7953        if (!thumbsSwiper) { return; }
7954        var clickedIndex = thumbsSwiper.clickedIndex;
7955        var clickedSlide = thumbsSwiper.clickedSlide;
7956        if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) { return; }
7957        if (typeof clickedIndex === 'undefined' || clickedIndex === null) { return; }
7958        var slideToIndex;
7959        if (thumbsSwiper.params.loop) {
7960          slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);
7961        } else {
7962          slideToIndex = clickedIndex;
7963        }
7964        if (swiper.params.loop) {
7965          var currentIndex = swiper.activeIndex;
7966          if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {
7967            swiper.loopFix();
7968            // eslint-disable-next-line
7969            swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
7970            currentIndex = swiper.activeIndex;
7971          }
7972          var prevIndex = swiper.slides.eq(currentIndex).prevAll(("[data-swiper-slide-index=\"" + slideToIndex + "\"]")).eq(0).index();
7973          var nextIndex = swiper.slides.eq(currentIndex).nextAll(("[data-swiper-slide-index=\"" + slideToIndex + "\"]")).eq(0).index();
7974          if (typeof prevIndex === 'undefined') { slideToIndex = nextIndex; }
7975          else if (typeof nextIndex === 'undefined') { slideToIndex = prevIndex; }
7976          else if (nextIndex - currentIndex < currentIndex - prevIndex) { slideToIndex = nextIndex; }
7977          else { slideToIndex = prevIndex; }
7978        }
7979        swiper.slideTo(slideToIndex);
7980      },
7981      update: function update(initial) {
7982        var swiper = this;
7983        var thumbsSwiper = swiper.thumbs.swiper;
7984        if (!thumbsSwiper) { return; }
7985  
7986        var slidesPerView = thumbsSwiper.params.slidesPerView === 'auto'
7987          ? thumbsSwiper.slidesPerViewDynamic()
7988          : thumbsSwiper.params.slidesPerView;
7989  
7990        if (swiper.realIndex !== thumbsSwiper.realIndex) {
7991          var currentThumbsIndex = thumbsSwiper.activeIndex;
7992          var newThumbsIndex;
7993          if (thumbsSwiper.params.loop) {
7994            if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) {
7995              thumbsSwiper.loopFix();
7996              // eslint-disable-next-line
7997              thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;
7998              currentThumbsIndex = thumbsSwiper.activeIndex;
7999            }
8000            // Find actual thumbs index to slide to
8001            var prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll(("[data-swiper-slide-index=\"" + (swiper.realIndex) + "\"]")).eq(0).index();
8002            var nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll(("[data-swiper-slide-index=\"" + (swiper.realIndex) + "\"]")).eq(0).index();
8003            if (typeof prevThumbsIndex === 'undefined') { newThumbsIndex = nextThumbsIndex; }
8004            else if (typeof nextThumbsIndex === 'undefined') { newThumbsIndex = prevThumbsIndex; }
8005            else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = currentThumbsIndex; }
8006            else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = nextThumbsIndex; }
8007            else { newThumbsIndex = prevThumbsIndex; }
8008          } else {
8009            newThumbsIndex = swiper.realIndex;
8010          }
8011          if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {
8012            if (thumbsSwiper.params.centeredSlides) {
8013              if (newThumbsIndex > currentThumbsIndex) {
8014                newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;
8015              } else {
8016                newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;
8017              }
8018            } else if (newThumbsIndex > currentThumbsIndex) {
8019              newThumbsIndex = newThumbsIndex - slidesPerView + 1;
8020            }
8021            thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);
8022          }
8023        }
8024  
8025        // Activate thumbs
8026        var thumbsToActivate = 1;
8027        var thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;
8028  
8029        if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {
8030          thumbsToActivate = swiper.params.slidesPerView;
8031        }
8032  
8033        thumbsSwiper.slides.removeClass(thumbActiveClass);
8034        if (thumbsSwiper.params.loop || thumbsSwiper.params.virtual) {
8035          for (var i = 0; i < thumbsToActivate; i += 1) {
8036            thumbsSwiper.$wrapperEl.children(("[data-swiper-slide-index=\"" + (swiper.realIndex + i) + "\"]")).addClass(thumbActiveClass);
8037          }
8038        } else {
8039          for (var i$1 = 0; i$1 < thumbsToActivate; i$1 += 1) {
8040            thumbsSwiper.slides.eq(swiper.realIndex + i$1).addClass(thumbActiveClass);
8041          }
8042        }
8043      },
8044    };
8045    var Thumbs$1 = {
8046      name: 'thumbs',
8047      params: {
8048        thumbs: {
8049          swiper: null,
8050          slideThumbActiveClass: 'swiper-slide-thumb-active',
8051          thumbsContainerClass: 'swiper-container-thumbs',
8052        },
8053      },
8054      create: function create() {
8055        var swiper = this;
8056        Utils.extend(swiper, {
8057          thumbs: {
8058            swiper: null,
8059            init: Thumbs.init.bind(swiper),
8060            update: Thumbs.update.bind(swiper),
8061            onThumbClick: Thumbs.onThumbClick.bind(swiper),
8062          },
8063        });
8064      },
8065      on: {
8066        beforeInit: function beforeInit() {
8067          var swiper = this;
8068          var ref = swiper.params;
8069          var thumbs = ref.thumbs;
8070          if (!thumbs || !thumbs.swiper) { return; }
8071          swiper.thumbs.init();
8072          swiper.thumbs.update(true);
8073        },
8074        slideChange: function slideChange() {
8075          var swiper = this;
8076          if (!swiper.thumbs.swiper) { return; }
8077          swiper.thumbs.update();
8078        },
8079        update: function update() {
8080          var swiper = this;
8081          if (!swiper.thumbs.swiper) { return; }
8082          swiper.thumbs.update();
8083        },
8084        resize: function resize() {
8085          var swiper = this;
8086          if (!swiper.thumbs.swiper) { return; }
8087          swiper.thumbs.update();
8088        },
8089        observerUpdate: function observerUpdate() {
8090          var swiper = this;
8091          if (!swiper.thumbs.swiper) { return; }
8092          swiper.thumbs.update();
8093        },
8094        setTransition: function setTransition(duration) {
8095          var swiper = this;
8096          var thumbsSwiper = swiper.thumbs.swiper;
8097          if (!thumbsSwiper) { return; }
8098          thumbsSwiper.setTransition(duration);
8099        },
8100        beforeDestroy: function beforeDestroy() {
8101          var swiper = this;
8102          var thumbsSwiper = swiper.thumbs.swiper;
8103          if (!thumbsSwiper) { return; }
8104          if (swiper.thumbs.swiperCreated && thumbsSwiper) {
8105            thumbsSwiper.destroy();
8106          }
8107        },
8108      },
8109    };
8110  
8111    // Swiper Class
8112  
8113    var components = [
8114      Device$1,
8115      Support$1,
8116      Browser$1,
8117      Resize,
8118      Observer$1,
8119      Virtual$1,
8120      Keyboard$1,
8121      Mousewheel$1,
8122      Navigation$1,
8123      Pagination$1,
8124      Scrollbar$1,
8125      Parallax$1,
8126      Zoom$1,
8127      Lazy$1,
8128      Controller$1,
8129      A11y,
8130      History$1,
8131      HashNavigation$1,
8132      Autoplay$1,
8133      EffectFade,
8134      EffectCube,
8135      EffectFlip,
8136      EffectCoverflow,
8137      Thumbs$1
8138    ];
8139  
8140    if (typeof Swiper.use === 'undefined') {
8141      Swiper.use = Swiper.Class.use;
8142      Swiper.installModule = Swiper.Class.installModule;
8143    }
8144  
8145    Swiper.use(components);
8146  
8147    return Swiper;
8148  
8149  }));
8150  

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.