PageSourceSearch

https://coffeedaily.co.kr/widgets/swiperSlider/skins/default/swiper.js?20211124114203

js coffeedaily.co.kr collected 2026-09-26 08:06:21 UTC 279,954 bytes, 9,395 lines download raw bytes

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

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.