1// Utility function 2function Util () {}; 3 4/* 5 class manipulation functions 6*/ 7Util.hasClass = function(el, className) { 8 if (el.classList) return el.classList.contains(className); 9 else return !!el.getAttribute('class').match(new RegExp('(\\s|^)' + className + '(\\s|$)')); 10}; 11 12Util.addClass = function(el, className) { 13 var classList = className.split(' '); 14 if (el.classList) el.classList.add(classList[0]); 15 else if (!Util.hasClass(el, classList[0])) el.setAttribute('class', el.getAttribute('class') + " " + classList[0]); 16 if (classList.length > 1) Util.addClass(el, classList.slice(1).join(' ')); 17}; 18 19Util.removeClass = function(el, className) { 20 var classList = className.split(' '); 21 if (el.classList) el.classList.remove(classList[0]); 22 else if(Util.hasClass(el, classList[0])) { 23 var reg = new RegExp('(\\s|^)' + classList[0] + '(\\s|$)'); 24 el.setAttribute('class', el.getAttribute('class').replace(reg, ' ')); 25 } 26 if (classList.length > 1) Util.removeClass(el, classList.slice(1).join(' ')); 27}; 28 29Util.toggleClass = function(el, className, bool) { 30 if(bool) Util.addClass(el, className); 31 else Util.removeClass(el, className); 32}; 33 34Util.setAttributes = function(el, attrs) { 35 for(var key in attrs) { 36 el.setAttribute(key, attrs[key]); 37 } 38}; 39 40/* 41 DOM manipulation 42*/ 43Util.getChildrenByClassName = function(el, className) { 44 var children = el.children, 45 childrenByClass = []; 46 for (var i = 0; i < el.children.length; i++) { 47 if (Util.hasClass(el.children[i], className)) childrenByClass.push(el.children[i]); 48 } 49 return childrenByClass; 50}; 51 52Util.is = function(elem, selector) { 53 if(selector.nodeType){ 54 return elem === selector; 55 } 56 57 var qa = (typeof(selector) === 'string' ? document.querySelectorAll(selector) : selector), 58 length = qa.length, 59 returnArr = []; 60 61 while(length--){ 62 if(qa[length] === elem){ 63 return true; 64 } 65 } 66 67 return false; 68}; 69 70/* 71 Animate height of an element 72*/ 73Util.setHeight = function(start, to, element, duration, cb) { 74 var change = to - start, 75 currentTime = null; 76 77 var animateHeight = function(timestamp){ 78 if (!currentTime) currentTime = timestamp; 79 var progress = timestamp - currentTime; 80 if(progress > duration) progress = duration; 81 var val = parseInt((progress/duration)*change + start); 82 element.style.height = val+"px"; 83 if(progress < duration) { 84 window.requestAnimationFrame(animateHeight); 85 } else { 86 if(cb) cb(); 87 } 88 }; 89 90 //set the height of the element before starting animation -> fix bug on Safari 91 element.style.height = start+"px"; 92 window.requestAnimationFrame(animateHeight); 93}; 94 95/* 96 Smooth Scroll 97*/ 98 99Util.scrollTo = function(final, duration, cb, scrollEl) { 100 var element = scrollEl || window; 101 var start = element.scrollTop || document.documentElement.scrollTop, 102 currentTime = null; 103 104 if(!scrollEl) start = window.scrollY || document.documentElement.scrollTop; 105 106 var animateScroll = function(timestamp){ 107 if (!currentTime) currentTime = timestamp; 108 var progress = timestamp - currentTime; 109 if(progress > duration) progress = duration; 110 var val = Math.easeInOutQuad(progress, start, final-start, duration); 111 element.scrollTo(0, val); 112 if(progress < duration) { 113 window.requestAnimationFrame(animateScroll); 114 } else { 115 cb && cb(); 116 } 117 }; 118 119 window.requestAnimationFrame(animateScroll); 120}; 121 122/* 123 Focus utility classes 124*/ 125 126//Move focus to an element 127Util.moveFocus = function (element) { 128 if( !element ) element = document.getElementsByTagName("body")[0]; 129 element.focus(); 130 if (document.activeElement !== element) { 131 element.setAttribute('tabindex','-1'); 132 element.focus(); 133 } 134}; 135 136/* 137 Misc 138*/ 139 140Util.getIndexInArray = function(array, el) { 141 return Array.prototype.indexOf.call(array, el); 142}; 143 144Util.cssSupports = function(property, value) { 145 if('CSS' in window) { 146 return CSS.supports(property, value); 147 } else { 148 var jsProperty = property.replace(/-([a-z])/g, function (g) { return g[1].toUpperCase();}); 149 return jsProperty in document.body.style; 150 } 151}; 152 153// merge a set of user options into plugin defaults 154// https://gomakethings.com/vanilla-javascript-version-of-jquery-extend/ 155Util.extend = function() { 156 // Variables 157 var extended = {}; 158 var deep = false; 159 var i = 0; 160 var length = arguments.length; 161 162 // Check if a deep merge 163 if ( Object.prototype.toString.call( arguments[0] ) === '[object Boolean]' ) { 164 deep = arguments[0]; 165 i++; 166 } 167 168 // Merge the object into the extended object 169 var merge = function (obj) { 170 for ( var prop in obj ) { 171 if ( Object.prototype.hasOwnProperty.call( obj, prop ) ) { 172 // If deep merge and property is an object, merge properties 173 if ( deep && Object.prototype.toString.call(obj[prop]) === '[object Object]' ) { 174 extended[prop] = extend( true, extended[prop], obj[prop] ); 175 } else { 176 extended[prop] = obj[prop]; 177 } 178 } 179 } 180 }; 181 182 // Loop through each object and conduct a merge 183 for ( ; i < length; i++ ) { 184 var obj = arguments[i]; 185 merge(obj); 186 } 187 188 return extended; 189};
190 191// Check if Reduced Motion is enabled 192Util.osHasReducedMotion = function() { 193 if(!window.matchMedia) return false; 194 var matchMediaObj = window.matchMedia('(prefers-reduced-motion: reduce)'); 195 if(matchMediaObj) return matchMediaObj.matches; 196 return false; // return false if not supported 197}; 198 199/* 200 Polyfills 201*/ 202//Closest() method 203if (!Element.prototype.matches) { 204 Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; 205} 206 207if (!Element.prototype.closest) { 208 Element.prototype.closest = function(s) { 209 var el = this; 210 if (!document.documentElement.contains(el)) return null; 211 do { 212 if (el.matches(s)) return el; 213 el = el.parentElement || el.parentNode; 214 } while (el !== null && el.nodeType === 1); 215 return null; 216 }; 217} 218 219//Custom Event() constructor 220if ( typeof window.CustomEvent !== "function" ) { 221 222 function CustomEvent ( event, params ) { 223 params = params || { bubbles: false, cancelable: false, detail: undefined }; 224 var evt = document.createEvent( 'CustomEvent' ); 225 evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail ); 226 return evt; 227 } 228 229 CustomEvent.prototype = window.Event.prototype; 230 231 window.CustomEvent = CustomEvent; 232} 233 234/* 235 Animation curves 236*/ 237Math.easeInOutQuad = function (t, b, c, d) { 238 t /= d/2; 239 if (t < 1) return c/2*t*t + b; 240 t--; 241 return -c/2 * (t*(t-2) - 1) + b; 242}; 243 244Math.easeInQuart = function (t, b, c, d) { 245 t /= d; 246 return c*t*t*t*t + b; 247}; 248 249Math.easeOutQuart = function (t, b, c, d) { 250 t /= d; 251 t--; 252 return -c * (t*t*t*t - 1) + b; 253}; 254 255Math.easeInOutQuart = function (t, b, c, d) { 256 t /= d/2; 257 if (t < 1) return c/2*t*t*t*t + b; 258 t -= 2; 259 return -c/2 * (t*t*t*t - 2) + b; 260}; 261 262Math.easeOutElastic = function (t, b, c, d) { 263 var s=1.70158;var p=d*0.7;var a=c; 264 if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; 265 if (a < Math.abs(c)) { a=c; var s=p/4; } 266 else var s = p/(2*Math.PI) * Math.asin (c/a); 267 return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; 268}; 269 270 271/* JS Utility Classes */ 272 273// make focus ring visible only for keyboard navigation (i.e., tab key) 274(function() { 275 var focusTab = document.getElementsByClassName('js-tab-focus'), 276 shouldInit = false, 277 outlineStyle = false, 278 eventDetected = false; 279 280 function detectClick() { 281 if(focusTab.length > 0) { 282 resetFocusStyle(false); 283 window.addEventListener('keydown', detectTab); 284 } 285 window.removeEventListener('mousedown', detectClick); 286 outlineStyle = false; 287 eventDetected = true; 288 }; 289 290 function detectTab(event) { 291 if(event.keyCode !== 9) return; 292 resetFocusStyle(true); 293 window.removeEventListener('keydown', detectTab); 294 window.addEventListener('mousedown', detectClick); 295 outlineStyle = true; 296 }; 297 298 function resetFocusStyle(bool) { 299 var outlineStyle = bool ? '' : 'none'; 300 for(var i = 0; i < focusTab.length; i++) { 301 focusTab[i].style.setProperty('outline', outlineStyle); 302 } 303 }; 304 305 function initFocusTabs() { 306 if(shouldInit) { 307 if(eventDetected) resetFocusStyle(outlineStyle); 308 return; 309 } 310 shouldInit = focusTab.length > 0; 311 window.addEventListener('mousedown', detectClick); 312 }; 313 314 initFocusTabs(); 315 window.addEventListener('initFocusTabs', initFocusTabs); 316}()); 317 318function resetFocusTabsStyle() { 319 window.dispatchEvent(new CustomEvent('initFocusTabs')); 320}; 321// File#: _1_accordion 322// Usage: codyhouse.co/license 323(function() { 324 var Accordion = function(element) { 325 this.element = element; 326 this.items = Util.getChildrenByClassName(this.element, 'js-accordion__item'); 327 this.version = this.element.getAttribute('data-version') ? '-'+this.element.getAttribute('data-version') : ''; 328 this.showClass = 'accordion'+this.version+'__item--is-open'; 329 this.animateHeight = (this.element.getAttribute('data-animation') == 'on'); 330 this.multiItems = !(this.element.getAttribute('data-multi-items') == 'off'); 331 // deep linking options 332 this.deepLinkOn = this.element.getAttribute('data-deep-link') == 'on'; 333 // init accordion 334 this.initAccordion(); 335 }; 336 337 Accordion.prototype.initAccordion = function() { 338 //set initial aria attributes 339 for( var i = 0; i < this.items.length; i++) { 340 var button = this.items[i].getElementsByTagName('button')[0], 341 content = this.items[i].getElementsByClassName('js-accordion__panel')[0], 342 isOpen = Util.hasClass(this.items[i], this.showClass) ? 'true' : 'false'; 343 Util.setAttributes(button, {'aria-expanded': isOpen, 'aria-controls': 'accordion-content-'+i, 'id': 'accordion-header-'+i}); 344 Util.addClass(button, 'js-accordion__trigger'); 345 Util.setAttributes(content, {'aria-labelledby': 'accordion-header-'+i, 'id': 'accordion-content-'+i}); 346 } 347 348 //listen for Accordion events 349 this.initAccordionEvents(); 350 351 // check deep linking option 352 this.initDeepLink(); 353 }; 354 355 Accordion.prototype.initAccordionEvents = function() { 356 var self = this; 357 358 this.element.addEventListener('click', function(event) { 359 var trigger = event.target.closest('.js-accordion__trigger'); 360 //check index to make sure the click didn't happen inside a children accordion 361 if( trigger && Util.getIndexInArray(self.items, trigger.parentElement) >= 0) self.triggerAccordion(trigger); 362 });
363 }; 364 365 Accordion.prototype.triggerAccordion = function(trigger) { 366 var bool = (trigger.getAttribute('aria-expanded') === 'true'); 367 368 this.animateAccordion(trigger, bool, false); 369 370 if(!bool && this.deepLinkOn) { 371 history.replaceState(null, '', '#'+trigger.getAttribute('aria-controls')); 372 } 373 }; 374 375 Accordion.prototype.animateAccordion = function(trigger, bool, deepLink) { 376 var self = this; 377 var item = trigger.closest('.js-accordion__item'), 378 content = item.getElementsByClassName('js-accordion__panel')[0], 379 ariaValue = bool ? 'false' : 'true'; 380 381 if(!bool) Util.addClass(item, this.showClass); 382 trigger.setAttribute('aria-expanded', ariaValue); 383 self.resetContentVisibility(item, content, bool); 384 385 if( !this.multiItems && !bool || deepLink) this.closeSiblings(item); 386 }; 387 388 Accordion.prototype.resetContentVisibility = function(item, content, bool) { 389 Util.toggleClass(item, this.showClass, !bool); 390 content.removeAttribute("style"); 391 if(bool && !this.multiItems) { // accordion item has been closed -> check if there's one open to move inside viewport 392 this.moveContent(); 393 } 394 }; 395 396 Accordion.prototype.closeSiblings = function(item) { 397 //if only one accordion can be open -> search if there's another one open 398 var index = Util.getIndexInArray(this.items, item); 399 for( var i = 0; i < this.items.length; i++) { 400 if(Util.hasClass(this.items[i], this.showClass) && i != index) { 401 this.animateAccordion(this.items[i].getElementsByClassName('js-accordion__trigger')[0], true, false); 402 return false; 403 } 404 } 405 }; 406 407 Accordion.prototype.moveContent = function() { // make sure title of the accordion just opened is inside the viewport 408 var openAccordion = this.element.getElementsByClassName(this.showClass); 409 if(openAccordion.length == 0) return; 410 var boundingRect = openAccordion[0].getBoundingClientRect(); 411 if(boundingRect.top < 0 || boundingRect.top > window.innerHeight) { 412 var windowScrollTop = window.scrollY || document.documentElement.scrollTop; 413 window.scrollTo(0, boundingRect.top + windowScrollTop); 414 } 415 }; 416 417 Accordion.prototype.initDeepLink = function() { 418 if(!this.deepLinkOn) return; 419 var hash = window.location.hash.substr(1); 420 if(!hash || hash == '') return; 421 var trigger = this.element.querySelector('.js-accordion__trigger[aria-controls="'+hash+'"]'); 422 if(trigger && trigger.getAttribute('aria-expanded') !== 'true') { 423 this.animateAccordion(trigger, false, true); 424 setTimeout(function(){trigger.scrollIntoView(true);}); 425 } 426 }; 427 428 window.Accordion = Accordion; 429 430 //initialize the Accordion objects 431 var accordions = document.getElementsByClassName('js-accordion'); 432 if( accordions.length > 0 ) { 433 for( var i = 0; i < accordions.length; i++) { 434 (function(i){new Accordion(accordions[i]);})(i); 435 } 436 } 437}()); 438// File#: _1_countup 439// Usage: codyhouse.co/license 440(function() { 441 var CountUp = function(opts) { 442 this.options = Util.extend(CountUp.defaults , opts); 443 this.element = this.options.element; 444 this.initialValue = parseFloat(this.options.initial); 445 this.finalValue = parseFloat(this.element.textContent); 446 this.deltaValue = parseFloat(this.options.delta); 447 this.intervalId; 448 this.animationTriggered = false; 449 // animation will run only on browsers supporting IntersectionObserver 450 this.canAnimate = ('IntersectionObserver' in window && 'IntersectionObserverEntry' in window && 'intersectionRatio' in window.IntersectionObserverEntry.prototype);
451 initCountUp(this); 452 }; 453 454 CountUp.prototype.reset = function() { // reset element to its initial value 455 if(!this.canAnimate) return; 456 window.cancelAnimationFrame(this.intervalId); 457 this.element.textContent = this.initialValue; 458 }; 459 460 CountUp.prototype.restart = function() { // restart element animation 461 countUpAnimate(this); 462 }; 463 464 function initCountUp(countup) { 465 // reset initial value 466 countup.initialValue = getCountupStart(countup); 467 if(!countup.canAnimate) { // IntersectionObserver not supported 468 countUpShow(countup); 469 return; 470 } 471 472 // reset countUp for SR 473 initCountUpSr(countup); 474 475 // listen for the element to enter the viewport -> start animation 476 var observer = new IntersectionObserver(countupObserve.bind(countup), { threshold: [0, 0.1] }); 477 observer.observe(countup.element); 478 479 // listen to events 480 countup.element.addEventListener('countUpReset', function(){countup.reset();}); 481 countup.element.addEventListener('countUpRestart', function(){countup.restart();}); 482 }; 483 484 function countUpShow(countup) { // reveal countup after it has been initialized 485 Util.addClass(countup.element.closest('.countup'), 'countup--is-visible'); 486 }; 487 488 function countupObserve(entries, observer) { // observe countup position -> start animation when inside viewport 489 if(entries[0].intersectionRatio.toFixed(1) > 0 && !this.animationTriggered) { 490 countUpAnimate(this); 491 } 492 }; 493 494 function countUpAnimate(countup) { // animate countup 495 countup.element.textContent = countup.initialValue; 496 countUpShow(countup); 497 window.cancelAnimationFrame(countup.intervalId); 498 var currentTime = null; 499 500 function runCountUp(timestamp) { 501 if (!currentTime) currentTime = timestamp; 502 var progress = timestamp - currentTime; 503 if(progress > countup.options.duration) progress = countup.options.duration; 504 var val = getValEaseOut(progress, countup.initialValue, countup.finalValue - countup.initialValue, countup.options.duration); 505 countup.element.textContent = getCountUpValue(val, countup); 506 if(progress < countup.options.duration) { 507 countup.intervalId = window.requestAnimationFrame(runCountUp); 508 } else { 509 countUpComplete(countup); 510 } 511 }; 512 513 countup.intervalId = window.requestAnimationFrame(runCountUp); 514 }; 515 516 function getCountUpValue(val, countup) { // reset new countup value to proper decimal places+separator 517 if(countup.options.decimal) {val = parseFloat(val.toFixed(countup.options.decimal));} 518 else {val = parseInt(val);} 519 if(countup.options.separator) val = val.toLocaleString('en'); 520 return val; 521 } 522 523 function countUpComplete(countup) { // emit event when animation is over 524 countup.element.dispatchEvent(new CustomEvent('countUpComplete')); 525 countup.animationTriggered = true; 526 }; 527 528 function initCountUpSr(countup) { // make sure countup is accessible 529 // hide elements that will be animated to SR 530 countup.element.setAttribute('aria-hidden', 'true'); 531 // create new element with visible final value - accessible to SR only 532 var srValue = document.createElement('span'); 533 srValue.textContent = countup.finalValue; 534 Util.addClass(srValue, 'sr-only'); 535 countup.element.parentNode.insertBefore(srValue, countup.element.nextSibling); 536 }; 537 538 function getCountupStart(countup) { 539 return countup.deltaValue > 0 ? countup.finalValue - countup.deltaValue : countup.initialValue; 540 }; 541 542 function getValEaseOut(t, b, c, d) { 543 t /= d; 544 return -c * t*(t-2) + b; 545 }; 546 547 CountUp.defaults = { 548 element : '', 549 separator : false, 550 duration: 1500, 551 decimal: false, 552 initial: 0, 553 delta: 0 554 }; 555 556 window.CountUp = CountUp; 557 558 //initialize the CountUp objects 559 var countUp = document.getElementsByClassName('js-countup'); 560 if( countUp.length > 0 ) { 561 for( var i = 0; i < countUp.length; i++) {(function(i){ 562 var separator = (countUp[i].getAttribute('data-countup-sep')) ? countUp[i].getAttribute('data-countup-sep') : false, 563 duration = (countUp[i].getAttribute('data-countup-duration')) ? countUp[i].getAttribute('data-countup-duration') : CountUp.defaults.duration, 564 decimal = (countUp[i].getAttribute('data-countup-decimal')) ? countUp[i].getAttribute('data-countup-decimal') : false, 565 initial = (countUp[i].getAttribute('data-countup-start')) ? countUp[i].getAttribute('data-countup-start') : 0, 566 delta = (countUp[i].getAttribute('data-countup-delta')) ? countUp[i].getAttribute('data-countup-delta') : 0; 567 new CountUp({element: countUp[i], separator : separator, duration: duration, decimal
567: decimal, initial: initial, delta: delta}); 568 })(i);} 569 } 570}()); 571// File#: _1_filter-navigation 572// Usage: codyhouse.co/license 573(function() { 574 var FilterNav = function(element) { 575 this.element = element; 576 this.wrapper = this.element.getElementsByClassName('js-filter-nav__wrapper')[0]; 577 this.nav = this.element.getElementsByClassName('js-filter-nav__nav')[0]; 578 this.list = this.nav.getElementsByClassName('js-filter-nav__list')[0]; 579 this.control = this.element.getElementsByClassName('js-filter-nav__control')[0]; 580 this.modalClose = this.element.getElementsByClassName('js-filter-nav__close-btn')[0]; 581 this.placeholder = this.element.getElementsByClassName('js-filter-nav__placeholder')[0]; 582 this.marker = this.element.getElementsByClassName('js-filter-nav__marker'); 583 this.layout = 'expanded'; 584 initFilterNav(this); 585 }; 586 587 function initFilterNav(element) { 588 checkLayout(element); // init layout 589 if(element.layout == 'expanded') placeMarker(element); 590 element.element.addEventListener('update-layout', function(event){ // on resize - modify layout 591 checkLayout(element); 592 }); 593 594 // update selected item 595 element.wrapper.addEventListener('click', function(event){ 596 var newItem = event.target.closest('.js-filter-nav__btn'); 597 if(newItem) { 598 updateCurrentItem(element, newItem); 599 return; 600 } 601 // close modal list - mobile version only 602 if(Util.hasClass(event.target, 'js-filter-nav__wrapper') || event.target.closest('.js-filter-nav__close-btn')) toggleModalList(element, false); 603 }); 604 605 // open modal list - mobile version only 606 element.control.addEventListener('click', function(event){ 607 toggleModalList(element, true); 608 }); 609 610 // listen for key events 611 window.addEventListener('keyup', function(event){ 612 // listen for esc key 613 if( (event.keyCode && event.keyCode == 27) || (event.key && event.key.toLowerCase() == 'escape' )) { 614 // close navigation on mobile if open 615 if(element.control.getAttribute('aria-expanded') == 'true' && isVisible(element.control)) { 616 toggleModalList(element, false); 617 } 618 } 619 // listen for tab key 620 if( (event.keyCode && event.keyCode == 9) || (event.key && event.key.toLowerCase() == 'tab' )) { 621 // close navigation on mobile if open when nav loses focus 622 if(element.control.getAttribute('aria-expanded') == 'true' && isVisible(element.control) && !document.activeElement.closest('.js-filter-nav__wrapper')) toggleModalList(element, false); 623 } 624 }); 625 }; 626 627 function updateCurrentItem(element, btn) { 628 if(btn.getAttribute('aria-current') == 'true') { 629 toggleModalList(element, false); 630 return; 631 } 632 var activeBtn = element.wrapper.querySelector('[aria-current]'); 633 if(activeBtn) activeBtn.removeAttribute('aria-current'); 634 btn.setAttribute('aria-current', 'true'); 635 // update trigger label on selection (visible on mobile only) 636 element.placeholder.textContent = btn.textContent; 637 toggleModalList(element, false); 638 if(element.layout == 'expanded') placeMarker(element); 639 }; 640 641 function toggleModalList(element, bool) { 642 element.control.setAttribute('aria-expanded', bool); 643 Util.toggleClass(element.wrapper, 'filter-nav__wrapper--is-visible', bool); 644 if(bool) { 645 element.nav.querySelectorAll('[href], button:not([disabled])')[0].focus(); 646 } else if(isVisible(element.control)) { 647 element.control.focus(); 648 } 649 }; 650 651 function isVisible(element) { 652 return (element.offsetWidth || element.offsetHeight || element.getClientRects().length); 653 }; 654 655 function checkLayout(element) { 656 if(element.layout == 'expanded' && switchToCollapsed(element)) { // check if there's enough space 657 element.layout = 'collapsed'; 658 Util.removeClass(element.element, 'filter-nav--expanded'); 659 Util.addClass(element.element, 'filter-nav--collapsed'); 660 Util.removeClass(element.modalClose, 'is-hidden'); 661 Util.removeClass(element.control, 'is-hidden'); 662 } else if(element.layout == 'collapsed' && switchToExpanded(element)) { 663 element.layout = 'expanded'; 664 Util.addClass(element.element, 'filter-nav--expanded'); 665 Util.removeClass(element.element, 'filter-nav--collapsed'); 666 Util.addClass(element.modalClose, 'is-hidden'); 667 Util.addClass(element.control, 'is-hidden'); 668 } 669 // place background element 670 if(element.layout == 'expanded') placeMarker(element); 671 }; 672 673 function switchToCollapsed(element) { 674 return element.nav.scrollWidth > element.nav.offsetWidth; 675 }; 676 677 function switchToExpanded(element) { 678 element.element.style.visibility = 'hidden'; 679 Util.addClass(element.element, 'filter-nav--expanded'); 680 Util.removeClass(element.element, 'filter-nav--collapsed'); 681 var switchLayout = element.nav.scrollWidth <= element.nav.offsetWidth; 682 Util.removeClass(element.element, 'filter-nav--expanded'); 683 Util.addClass(element.element, 'filter-nav--collapsed'); 684 element.element.style.visibility = 'visible'; 685 return switchLayout; 686 }; 687 688 function placeMarker(element) { 689 var activeElement = element.wrapper.querySelector('.js-filter-nav__btn[aria-current="true"]'); 690 if(element.marker.length == 0 || !activeElement ) return; 691 element.marker[0].style.width = activeElement.offsetWidth+'px'; 692 element.marker[0].style.transform = 'translateX('+(activeElement.getBoundingClientRect().left - element.list.getBoundingClientRect().left)+'px)'; 693 }; 694 695 var filterNav = document.getElementsByClassName('js-filter-nav'); 696 if(filterNav.length > 0) { 697 var filterNavArray = []; 698 for(var i = 0; i < filterNav.length; i++) { 699 filterNavArray.push(new FilterNav(filterNav[i])); 700 } 701 702 var resizingId = false, 703 customEvent = new CustomEvent('update-layout'); 704 705 window.addEventListener('resize', function() { 706 clearTimeout(resizingId); 707 resizingId = setTimeout(doneResizing, 100); 708 });
709 710 // wait for font to be loaded 711 if(document.fonts) { 712 document.fonts.onloadingdone = function (fontFaceSetEvent) { 713 doneResizing(); 714 }; 715 } 716 717 function doneResizing() { 718 for( var i = 0; i < filterNavArray.length; i++) { 719 (function(i){filterNavArray[i].element.dispatchEvent(customEvent)})(i); 720 }; 721 }; 722 } 723}()); 724// File#: _1_filter 725// Usage: codyhouse.co/license 726 727(function() { 728 var Filter = function(opts) { 729 this.options = Util.extend(Filter.defaults , opts); // used to store custom filter/sort functions 730 this.element = this.options.element; 731 this.elementId = this.element.getAttribute('id'); 732 this.items = this.element.querySelectorAll('.js-filter__item'); 733 this.controllers = document.querySelectorAll('[aria-controls="'+this.elementId+'"]'); // controllers wrappers 734 this.fallbackMessage = document.querySelector('[data-fallback-gallery-id="'+this.elementId+'"]'); 735 this.filterString = []; // combination of different filter values 736 this.sortingString = ''; // sort value - will include order and type of argument (e.g., number or string) 737 // store info about sorted/filtered items 738 this.filterList = []; // list of boolean for each this.item -> true if still visible , otherwise false 739 this.sortingList = []; // list of new ordered this.item -> each element is [item, originalIndex] 740 741 // store grid info for animation 742 this.itemsGrid = []; // grid coordinates 743 this.itemsInitPosition = []; // used to store coordinates of this.items before animation 744 this.itemsIterPosition = []; // used to store coordinates of this.items before animation - intermediate state 745 this.itemsFinalPosition = []; // used to store coordinates of this.items after filtering 746 747 // animation off 748 this.animateOff = this.element.getAttribute('data-filter-animation') == 'off'; 749 // used to update this.itemsGrid on resize 750 this.resizingId = false; 751 // default acceleration style - improve animation 752 this.accelerateStyle = 'will-change: transform, opacity; transform: translateZ(0); backface-visibility: hidden;'; 753 754 // handle multiple changes 755 this.animating = false; 756 this.reanimate = false; 757 758 initFilter(this); 759 }; 760 761 function initFilter(filter) { 762 resetFilterSortArray(filter, true, true); // init array filter.filterList/filter.sortingList 763 createGridInfo(filter); // store grid coordinates in filter.itemsGrid 764 initItemsOrder(filter); // add data-orders so that we can reset the sorting 765 766 // events handling - filter update 767 for(var i = 0; i < filter.controllers.length; i++) { 768 filter.filterString[i] = ''; // reset filtering 769 770 // get proper filter/sorting string based on selected controllers 771 (function(i){ 772 filter.controllers[i].addEventListener('change', function(event) { 773 if(event.target.tagName.toLowerCase() == 'select') { // select elements 774 (!event.target.getAttribute('data-filter')) 775 ? setSortingString(filter, event.target.value, event.target.options[event.target.selectedIndex]) 776 : setFilterString(filter, i, 'select'); 777 } else if(event.target.tagName.toLowerCase() == 'input' && (event.target.getAttribute('type') == 'radio' || event.target.getAttribute('type') == 'checkbox') ) { // input (radio/checkboxed) elements 778 (!event.target.getAttribute('data-filter')) 779 ? setSortingString(filter, event.target.getAttribute('data-sort'), event.target) 780 : setFilterString(filter, i, 'input'); 781 } else { 782 // generic inout element 783 (!filter.controllers[i].getAttribute('data-filter')) 784 ? setSortingString(filter, filter.controllers[i].getAttribute('data-sort'), filter.controllers[i]) 785 : setFilterString(filter, i, 'custom'); 786 } 787 788 updateFilterArray(filter); 789 }); 790 791 filter.controllers[i].addEventListener('click', function(event) { // retunr if target is select/input elements 792 var filterEl = event.target.closest('[data-filter]'); 793 var sortEl = event.target.closest('[data-sort]'); 794 if(!filterEl && !sortEl) return; 795 if(filterEl && ( filterEl.tagName.toLowerCase() == 'input' || filterEl.tagName.toLowerCase() == 'select')) return; 796 if(sortEl && (sortEl.tagName.toLowerCase() == 'input' || sortEl.tagName.toLowerCase() == 'select')) return; 797 if(sortEl && Util.hasClass(sortEl, 'js-filter__custom-control')) return; 798 if(filterEl && Util.hasClass(filterEl, 'js-filter__custom-control')) return; 799 // this will be executed only for a list of buttons ->
799 no inputs 800 event.preventDefault(); 801 resetControllersList(filter, i, filterEl, sortEl); 802 sortEl 803 ? setSortingString(filter, sortEl.getAttribute('data-sort'), sortEl) 804 : setFilterString(filter, i, 'button'); 805 updateFilterArray(filter); 806 }); 807 808 // target search inputs -> update them on 'input' 809 filter.controllers[i].addEventListener('input', function(event) { 810 if(event.target.tagName.toLowerCase() == 'input' && (event.target.getAttribute('type') == 'search' || event.target.getAttribute('type') == 'text') ) { 811 setFilterString(filter, i, 'custom'); 812 updateFilterArray(filter); 813 } 814 }); 815 })(i); 816 } 817 818 // handle resize - update grid coordinates in filter.itemsGrid 819 window.addEventListener('resize', function() { 820 clearTimeout(filter.resizingId); 821 filter.resizingId = setTimeout(function(){createGridInfo(filter)}, 300); 822 }); 823 824 // check if there are filters/sorting values already set 825 checkInitialFiltering(filter); 826 827 // reset filtering results if filter selection was changed by an external control (e.g., form reset) 828 filter.element.addEventListener('update-filter-results', function(event){ 829 // reset filters first 830 for(var i = 0; i < filter.controllers.length; i++) filter.filterString[i] = ''; 831 filter.sortingString = ''; 832 checkInitialFiltering(filter); 833 }); 834 }; 835 836 function checkInitialFiltering(filter) { 837 for(var i = 0; i < filter.controllers.length; i++) { // check if there's a selected option 838 // buttons list 839 var selectedButton = filter.controllers[i].getElementsByClassName('js-filter-selected'); 840 if(selectedButton.length > 0) { 841 var sort = selectedButton[0].getAttribute('data-sort'); 842 sort 843 ? setSortingString(filter, selectedButton[0].getAttribute('data-sort'), selectedButton[0]) 844 : setFilterString(filter, i, 'button'); 845 continue; 846 } 847 848 // input list 849 var selectedInput = filter.controllers[i].querySelectorAll('input:checked'); 850 if(selectedInput.length > 0) { 851 var sort = selectedInput[0].getAttribute('data-sort'); 852 sort 853 ? setSortingString(filter, sort, selectedInput[0]) 854 : setFilterString(filter, i, 'input'); 855 continue; 856 } 857 // select item 858 if(filter.controllers[i].tagName.toLowerCase() == 'select') { 859 var sort = filter.controllers[i].getAttribute('data-sort'); 860 sort 861 ? setSortingString(filter, filter.controllers[i].value, filter.controllers[i].options[filter.controllers[i].selectedIndex]) 862 : setFilterString(filter, i, 'select'); 863 continue; 864 } 865 // check if there's a generic custom input 866 var radioInput = filter.controllers[i].querySelector('input[type="radio"]'), 867 checkboxInput = filter.controllers[i].querySelector('input[type="checkbox"]'); 868 if(!radioInput && !checkboxInput) { 869 var sort = filter.controllers[i].getAttribute('data-sort'); 870 var filterString = filter.controllers[i].getAttribute('data-filter'); 871 if(sort) setSortingString(filter, sort, filter.controllers[i]); 872 else if(filterString) setFilterString(filter, i, 'custom'); 873 } 874 } 875 876 updateFilterArray(filter); 877 }; 878 879 function setSortingString(filter, value, item) { 880 // get sorting string value-> sortName:order:type 881 var order = item.getAttribute('data-sort-order') ? 'desc' : 'asc'; 882 var type = item.getAttribute('data-sort-number') ? 'number' : 'string'; 883 filter.sortingString = value+':'+order+':'+type; 884 }; 885 886 function setFilterString(filter, index, type) { 887 // get filtering array -> [filter1:filter2, filter3, filter4:filter5] 888 if(type == 'input') { 889 var checkedInputs = filter.controllers[index].querySelectorAll('input:checked'); 890 filter.filterString[index] = ''; 891 for(var i = 0; i < checkedInputs.length; i++) { 892 filter.filterString[index] = filter.filterString[index] + checkedInputs[i].getAttribute('data-filter') + ':'; 893 } 894 } else if(type == 'select') { 895 if(filter.controllers[index].multiple) { // select with multiple options 896 filter.filterString[index] = getMultipleSelectValues(filter.controllers[index]); 897 } else { // select with single option 898 filter.filterString[index] = filter.controllers[index].value; 899 } 900 } else if(type == 'button') { 901 var selectedButtons = filter.controllers[index].querySelectorAll('.js-filter-selected'); 902 filter.filterString[index] = ''; 903 for(var i = 0; i < selectedButtons.length; i++) { 904 filter.filterString[index] = filter.filterString[index] + selectedButtons[i].getAttribute('data-filter') + ':'; 905 } 906 } else if(type == 'custom') { 907 filter.filterString[index] = filter.controllers[index].getAttribute('data-filter'); 908 } 909 }; 910 911 function resetControllersList(filter, index, target1, target2) { 912 // for a <button>s list -> toggle js-filter-selected + custom classes 913 var multi = filter.controllers[index].getAttribute('data-filter-checkbox'), 914 customClass = filter.controllers[index].getAttribute('data-selected-class'); 915 916 customClass = (customClass) ? 'js-filter-selected '+ customClass : 'js-filter-selected'; 917 if(multi == 'true') { // multiple options can be on 918 (target1) 919 ? Util.toggleClass(target1, customClass, !Util.hasClass(target1, 'js-filter-selected')) 920 : Util.toggleClass(target2, customClass, !Util.hasClass(target2, 'js-filter-selected')); 921 } else { // only one element at the time 922 // remove the class from all siblings 923 var selectedOption = filter.controllers[index].querySelector('.js-filter-selected'); 924 if(selectedOption) Util.removeClass(selectedOption, customClass); 925 (target1) 926 ? Util.addClass(target1, customClass) 927 : Util.addClass(target2, customClass); 928 } 929 }; 930 931 function updateFilterArray(filter) { // sort/filter strings have been updated -> so you can update the gallery 932 if(filter.animating) { 933 filter.reanimate = true; 934 return; 935 } 936 filter.animating = true; 937 filter.reanimate = false; 938 createGridInfo(filter); // get new grid coordinates 939 sortingGallery(filter); // update sorting list 940 filteringGallery(filter); // update filter list 941 resetFallbackMessage(filter, true); // toggle fallback message 942 if(reducedMotion || filter.animateOff) { 943 resetItems(filter); 944 } else { 945 updateItemsAttributes(filter); 946 } 947 }; 948 949 function sortingGallery(filter) { 950 // use sorting string to reorder gallery 951 var sortOptions = filter.sortingString.split(':'); 952 if(sortOptions[0] == '' || sortOptions[0] == '*') { 953 // no sorting needed 954 restoreSortOrder(filter); 955 } else { // need to sort 956 if(filter.options[sortOptions[0]]) { // custom sort function -> user takes care of it 957 filter.sortingList = filter.options[sortOptions[0]](filter.sortingList); 958 } else { 959 filter.sortingList.sort(function(left, right) { 960 var leftVal = left[0].getAttribute('data-sort-'+sortOptions[0]), 961 rightVal = right[0].getAttribute('data-sort-'+sortOptions[0]); 962 if(sortOptions[2] == 'number') { 963 leftVal = parseFloat(leftVal); 964 rightVal = parseFloat(rightVal); 965 } 966 if(sortOptions[1] == 'desc') return leftVal <= rightVal ? 1 : -1; 967 else return leftVal >= rightVal ? 1 : -1; 968 }); 969 } 970 } 971 }; 972 973 function filteringGallery(filter) { 974 // use filtering string to reorder gallery 975 resetFilterSortArray(filter, true, false); 976 // we can have multiple filters 977 for(var i = 0; i < filter.filterString.length; i++) { 978 //check if multiple filters inside the same controller 979 if(filter.filterString[i] != '' && filter.filterString[i] != '*' && filter.filterString[i] != ' ') { 980 singleFilterGallery(filter, filter.filterString[i].split(':')); 981 } 982 } 983 }; 984 985 function singleFilterGallery(filter, subfilter) { 986 if(!subfilter || subfilter == '' || subfilter == '*') return; 987 // check if we have custom options 988 var customFilterArray = []; 989 for(var j = 0; j < subfilter.length; j++) { 990 if(filter.options[subfilter[j]]) { // custom function 991 customFilterArray[subfilter[j]] = filter.options[subfilter[j]](filter.items); 992 } 993 } 994 995 for(var i = 0; i < filter.items.length; i++) { 996 var filterValues = filter.items[i].getAttribute('data-filter').split(' '); 997 var present = false; 998 for(var j = 0; j < subfilter.length; j++) { 999 if(filter.options[subfilter[j]] && customFilterArray[subfilter[j]][i]) { // custom function 1000 present = true; 1001 break; 1002 } else if(subfilter[j] == '*' || filterValues.indexOf(subfilter[j]) > -1) { 1003 present = true; 1004 break; 1005 } 1006 } 1007 filter.filterList[i] = !present ? false : filter.filterList[i]; 1008 } 1009 }; 1010 1011 function updateItemsAttributes(filter) { // set items before triggering the update animation 1012 // get offset of all elements before animation 1013 storeOffset(filter, filter.itemsInitPosition); 1014 // set height of container
1015 filter.element.setAttribute('style', 'height: '+parseFloat(filter.element.offsetHeight)+'px; width: '+parseFloat(filter.element.offsetWidth)+'px;'); 1016 1017 for(var i = 0; i < filter.items.length; i++) { // remove is-hidden class from items now visible and scale to zero 1018 if( Util.hasClass(filter.items[i], 'is-hidden') && filter.filterList[i]) { 1019 filter.items[i].setAttribute('data-scale', 'on'); 1020 filter.items[i].setAttribute('style', filter.accelerateStyle+'transform: scale(0.5); opacity: 0;') 1021 Util.removeClass(filter.items[i], 'is-hidden'); 1022 } 1023 } 1024 // get new elements offset 1025 storeOffset(filter, filter.itemsIterPosition); 1026 // translate items so that they are in the right initial position 1027 for(var i = 0; i < filter.items.length; i++) { 1028 if( filter.items[i].getAttribute('data-scale') != 'on') { 1029 filter.items[i].setAttribute('style', filter.accelerateStyle+'transform: translateX('+parseInt(filter.itemsInitPosition[i][0] - filter.itemsIterPosition[i][0])+'px) translateY('+parseInt(filter.itemsInitPosition[i][1] - filter.itemsIterPosition[i][1])+'px);'); 1030 } 1031 } 1032 1033 animateItems(filter) 1034 }; 1035 1036 function animateItems(filter) { 1037 var transitionValue = 'transform '+filter.options.duration+'ms cubic-bezier(0.455, 0.03, 0.515, 0.955), opacity '+filter.options.duration+'ms'; 1038 1039 // get new index of items in the list 1040 var j = 0; 1041 for(var i = 0; i < filter.sortingList.length; i++) { 1042 var item = filter.items[filter.sortingList[i][1]]; 1043 1044 if(Util.hasClass(item, 'is-hidden') || !filter.filterList[filter.sortingList[i][1]]) { 1045 // item is hidden or was previously hidden -> final position equal to first one 1046 filter.itemsFinalPosition[filter.sortingList[i][1]] = filter.itemsIterPosition[filter.sortingList[i][1]]; 1047 if(item.getAttribute('data-scale') == 'on') j = j + 1; 1048 } else { 1049 filter.itemsFinalPosition[filter.sortingList[i][1]] = [filter.itemsGrid[j][0], filter.itemsGrid[j][1]]; // left/top 1050 j = j + 1; 1051 } 1052 } 1053 1054 setTimeout(function(){ 1055 for(var i = 0; i < filter.items.length; i++) { 1056 if(filter.filterList[i] && filter.items[i].getAttribute('data-scale') == 'on') { // scale up item 1057 filter.items[i].setAttribute('style', filter.accelerateStyle+'transition: '+transitionValue+'; transform: translateX('+parseInt(filter.itemsFinalPosition[i][0] - filter.itemsIterPosition[i][0])+'px) translateY('+parseInt(filter.itemsFinalPosition[i][1] - filter.itemsIterPosition[i][1])+'px) scale(1); opacity: 1;'); 1058 } else if(filter.filterList[i]) { // translate item 1059 filter.items[i].setAttribute('style', filter.accelerateStyle+'transition: '+transitionValue+'; transform: translateX('+parseInt(filter.itemsFinalPosition[i][0] - filter.itemsIterPosition[i][0])+'px) translateY('+parseInt(filter.itemsFinalPosition[i][1] - filter.itemsIterPosition[i][1])+'px);'); 1060 } else { // scale down item 1061 filter.items[i].setAttribute('style', filter.accelerateStyle+'transition: '+transitionValue+'; transform: scale(0.5); opacity: 0;'); 1062 } 1063 }; 1064 }, 50); 1065 1066 // wait for the end of transition of visible elements 1067 setTimeout(function(){ 1068 resetItems(filter); 1069 }, (filter.options.duration + 100)); 1070 }; 1071 1072 function resetItems(filter) { 1073 // animation was off or animation is over -> reset attributes 1074 for(var i = 0; i < filter.items.length; i++) { 1075 filter.items[i].removeAttribute('style'); 1076 Util.toggleClass(filter.items[i], 'is-hidden', !filter.filterList[i]); 1077 filter.items[i].removeAttribute('data-scale'); 1078 } 1079 1080 for(var i = 0; i < filter.items.length; i++) {// reorder 1081 filter.element.appendChild(filter.items[filter.sortingList[i][1]]); 1082 } 1083 1084 filter.items = []; 1085 filter.items = filter.element.querySelectorAll('.js-filter__item'); 1086 resetFilterSortArray(filter, false, true); 1087 filter.element.removeAttribute('style'); 1088 filter.animating = false; 1089 if(filter.reanimate) { 1090 updateFilterArray(filter); 1091 } 1092 1093 resetFallbackMessage(filter, false); // toggle fallback message 1094 1095 // emit custom event - end of filtering 1096 filter.element.dispatchEvent(new CustomEvent('filter-selection-updated')); 1097 }; 1098 1099 function resetFilterSortArray(filter, filtering, sorting) { 1100 for(var i = 0; i < filter.items.length; i++) { 1101 if(filtering) filter.filterList[i] = true; 1102 if(sorting) filter.sortingList[i] = [filter.items[i], i]; 1103 } 1104 }; 1105 1106 function createGridInfo(filter) { 1107 var containerWidth = parseFloat(window.getComputedStyle(filter.element).getPropertyValue('width')), 1108 itemStyle, itemWidth, itemHeight, marginX, marginY, colNumber; 1109 1110 // get offset first visible element 1111 for(var i = 0; i < filter.items.length; i++) { 1112 if( !Util.hasClass(filter.items[i], 'is-hidden') ) { 1113 itemStyle = window.getComputedStyle(filter.items[i]), 1114 itemWidth = parseFloat(itemStyle.getPropertyValue('width')), 1115 itemHeight = parseFloat(itemStyle.getPropertyValue('height')), 1116 marginX = parseFloat(itemStyle.getPropertyValue('margin-left')) + parseFloat(itemStyle.getPropertyValue('margin-right')), 1117 marginY = parseFloat(itemStyle.getPropertyValue('margin-bottom')) + parseFloat(itemStyle.getPropertyValue('margin-top')); 1118 if(marginX == 0 && marginY == 0) { 1119 // grid is set using the gap property and not margins 1120 var margins = resetMarginValues(filter); 1121 marginX = margins[0]; 1122 marginY = margins[1]; 1123 } 1124 var colNumber = parseInt((containerWidth + marginX)/(itemWidth+marginX)); 1125 filter.itemsGrid[0] = [filter.items[i].offsetLeft, filter.items[i].offsetTop]; // left, top 1126 break; 1127 } 1128 } 1129 1130 for(var i = 1; i < filter.items.length; i++) { 1131 var x = i < colNumber ? i : i % colNumber, 1132 y = i < colNumber ? 0 : Math.floor(i/colNumber); 1133 filter.itemsGrid[i] = [filter.itemsGrid[0][0] + x*(itemWidth+marginX), filter.itemsGrid[0][1] + y*(itemHeight+marginY)]; 1134 } 1135 }; 1136 1137 function storeOffset(filter, array) { 1138 for(var i = 0; i < filter.items.length; i++) { 1139 array[i] = [filter.items[i].offsetLeft, filter.items[i].offsetTop]; 1140 } 1141 }; 1142 1143 function initItemsOrder(filter) { 1144 for(var i = 0; i < filter.items.length; i++) { 1145 filter.items[i].setAttribute('data-init-sort-order', i); 1146 } 1147 }; 1148 1149 function restoreSortOrder(filter) { 1150 for(var i = 0; i < filter.items.length; i++) { 1151 filter.sortingList[parseInt(filter.items[i].getAttribute('data-init-sort-order'))] = [filter.items[i], i]; 1152 } 1153 }; 1154 1155 function resetFallbackMessage(filter, bool) { 1156 if(!filter.fallbackMessage) return; 1157 var show = true; 1158 for(var i = 0; i < filter.filterList.length; i++) { 1159 if(filter.filterList[i]) { 1160 show = false; 1161 break; 1162 } 1163 }; 1164 if(bool) { // reset visibility before animation is triggered 1165 if(!show) Util.addClass(filter.fallbackMessage, 'is-hidden'); 1166 return; 1167 } 1168 Util.toggleClass(filter.fallbackMessage, 'is-hidden', !show); 1169 }; 1170 1171 function getMultipleSelectValues(multipleSelect) { 1172 // get selected options of a <select multiple> element 1173 var options = multipleSelect.options, 1174 value = ''; 1175 for(var i = 0; i < options.length; i++) { 1176 if(options[i].selected) { 1177 if(value != '') value = value + ':'; 1178 value = value + options[i].value; 1179 } 1180 } 1181 return value; 1182 }; 1183 1184 function resetMarginValues(filter) { 1185 var gapX = getComputedStyle(filter.element).getPropertyValue('--gap-x'), 1186 gapY = getComputedStyle(filter.element).getPropertyValue('--gap-y'), 1187 gap = getComputedStyle(filter.element).getPropertyValue('--gap'), 1188 gridGap = [0, 0]; 1189 // tif the gap property is used to create the grid (not margin left/right) -> get gap values rather than margins 1190 // check if the --gap/--gap-x/--gap-y 1191 var newDiv = document.createElement('div'), 1192 cssText = 'position: absolute; opacity: 0; width: 0px; height: 0px'; 1193 if(gapX && gapY) { 1194 cssText = 'position: absolute; opacity: 0; width: '+gapX+'; height: '+gapY; 1195 } else if(gap) { 1196 cssText = 'position: absolute; opacity: 0; width: '+gap+'; height: '+gap; 1197 } else if(gapX) { 1198 cssText = 'position: absolute; opacity: 0; width: '+gapX+'; height: 0px'; 1199 } else if(gapY) { 1200 cssText = 'position: absolute; opacity: 0; width: 0px; height: '+gapY; 1201 } 1202 newDiv.style.cssText = cssText; 1203 document.body.appendChild(newDiv); 1204 gridGap = [newDiv.offsetWidth, newDiv.offsetHeight]; 1205 document.body.removeChild(newDiv); 1206 return gridGap; 1207 }; 1208 1209 Filter.defaults = { 1210 element : false, 1211 duration: 400 1212 }; 1213 1214 window.Filter = Filter; 1215 1216 // init Filter object 1217 var filterGallery = document.getElementsByClassName('js-filter'), 1218 reducedMotion = Util.osHasReducedMotion(); 1219 if( filterGallery.length > 0 ) { 1220 for( var i = 0; i < filterGallery.length; i++) { 1221 var duration = filterGallery[i].getAttribute('data-filter-duration'); 1222 if(!duration) duration = Filter.defaults.duration; 1223 new Filter({element: filterGallery[i], duration: duration}); 1224 } 1225 } 1226}()); 1227// File#: _1_modal-window 1228// Usage: codyhouse.co/license 1229(function() { 1230 var Modal = function(element) { 1231 this.element = element; 1232 this.triggers = document.querySelectorAll('[aria-controls="'+this.element.getAttribute('id')+'"]'); 1233 this.firstFocusable = null; 1234 this.lastFocusable = null; 1235 this.moveFocusEl = null; // focus will be moved to this element when modal is open 1236 this.modalFocus = this.element.getAttribute('data-modal-first-focus') ? this.element.querySelector(this.element.getAttribute('data-modal-first-focus')) : null; 1237 this.selectedTrigger = null; 1238 this.preventScrollEl = this.getPreventScrollEl();
1239 this.showClass = "modal--is-visible"; 1240 this.initModal(); 1241 }; 1242 1243 Modal.prototype.getPreventScrollEl = function() { 1244 var scrollEl = false; 1245 var querySelector = this.element.getAttribute('data-modal-prevent-scroll'); 1246 if(querySelector) scrollEl = document.querySelector(querySelector); 1247 return scrollEl; 1248 }; 1249 1250 Modal.prototype.initModal = function() { 1251 var self = this; 1252 //open modal when clicking on trigger buttons 1253 if ( this.triggers ) { 1254 for(var i = 0; i < this.triggers.length; i++) { 1255 this.triggers[i].addEventListener('click', function(event) { 1256 event.preventDefault(); 1257 if(Util.hasClass(self.element, self.showClass)) { 1258 self.closeModal(); 1259 return; 1260 } 1261 self.selectedTrigger = event.target; 1262 self.showModal(); 1263 self.initModalEvents(); 1264 }); 1265 } 1266 } 1267 1268 // listen to the openModal event -> open modal without a trigger button 1269 this.element.addEventListener('openModal', function(event){ 1270 if(event.detail) self.selectedTrigger = event.detail; 1271 self.showModal(); 1272 self.initModalEvents(); 1273 }); 1274 1275 // listen to the closeModal event -> close modal without a trigger button 1276 this.element.addEventListener('closeModal', function(event){ 1277 if(event.detail) self.selectedTrigger = event.detail; 1278 self.closeModal(); 1279 }); 1280 1281 // if modal is open by default -> initialise modal events 1282 if(Util.hasClass(this.element, this.showClass)) this.initModalEvents(); 1283 }; 1284 1285 Modal.prototype.showModal = function() { 1286 var self = this; 1287 Util.addClass(this.element, this.showClass); 1288 this.getFocusableElements(); 1289 if(this.moveFocusEl) { 1290 this.moveFocusEl.focus(); 1291 // wait for the end of transitions before moving focus 1292 this.element.addEventListener("transitionend", function cb(event) { 1293 self.moveFocusEl.focus(); 1294 self.element.removeEventListener("transitionend", cb); 1295 }); 1296 } 1297 this.emitModalEvents('modalIsOpen'); 1298 // change the overflow of the preventScrollEl 1299 if(this.preventScrollEl) this.preventScrollEl.style.overflow = 'hidden'; 1300 }; 1301 1302 Modal.prototype.closeModal = function() { 1303 if(!Util.hasClass(this.element, this.showClass)) return; 1304 console.log('close') 1305 Util.removeClass(this.element, this.showClass); 1306 this.firstFocusable = null; 1307 this.lastFocusable = null; 1308 this.moveFocusEl = null; 1309 if(this.selectedTrigger) this.selectedTrigger.focus(); 1310 //remove listeners 1311 this.cancelModalEvents(); 1312 this.emitModalEvents('modalIsClose'); 1313 // change the overflow of the preventScrollEl 1314 if(this.preventScrollEl) this.preventScrollEl.style.overflow = ''; 1315 }; 1316 1317 Modal.prototype.initModalEvents = function() { 1318 //add event listeners 1319 this.element.addEventListener('keydown', this); 1320 this.element.addEventListener('click', this); 1321 }; 1322 1323 Modal.prototype.cancelModalEvents = function() { 1324 //remove event listeners 1325 this.element.removeEventListener('keydown', this); 1326 this.element.removeEventListener('click', this); 1327 }; 1328 1329 Modal.prototype.handleEvent = function (event) { 1330 switch(event.type) { 1331 case 'click': { 1332 this.initClick(event); 1333 } 1334 case 'keydown': { 1335 this.initKeyDown(event); 1336 } 1337 } 1338 }; 1339 1340 Modal.prototype.initKeyDown = function(event) { 1341 if( event.keyCode && event.keyCode == 9 || event.key && event.key == 'Tab' ) { 1342 //trap focus inside modal 1343 this.trapFocus(event); 1344 } else if( (event.keyCode && event.keyCode == 13 || event.key && event.key == 'Enter') && event.target.closest('.js-modal__close')) { 1345 event.preventDefault(); 1346 this.closeModal(); // close modal when pressing Enter on close button 1347 } 1348 }; 1349 1350 Modal.prototype.initClick = function(event) { 1351 //close modal when clicking on close button or modal bg layer 1352 if( !event.target.closest('.js-modal__close') && !Util.hasClass(event.target, 'js-modal') ) return; 1353 event.preventDefault(); 1354 this.closeModal(); 1355 }; 1356 1357 Modal.prototype.trapFocus = function(event) { 1358 if( this.firstFocusable == document.activeElement && event.shiftKey) { 1359 //on Shift+Tab ->
1359 focus last focusable element when focus moves out of modal 1360 event.preventDefault(); 1361 this.lastFocusable.focus(); 1362 } 1363 if( this.lastFocusable == document.activeElement && !event.shiftKey) { 1364 //on Tab -> focus first focusable element when focus moves out of modal 1365 event.preventDefault(); 1366 this.firstFocusable.focus(); 1367 } 1368 } 1369 1370 Modal.prototype.getFocusableElements = function() { 1371 //get all focusable elements inside the modal 1372 var allFocusable = this.element.querySelectorAll(focusableElString); 1373 this.getFirstVisible(allFocusable); 1374 this.getLastVisible(allFocusable); 1375 this.getFirstFocusable(); 1376 }; 1377 1378 Modal.prototype.getFirstVisible = function(elements) { 1379 //get first visible focusable element inside the modal 1380 for(var i = 0; i < elements.length; i++) { 1381 if( isVisible(elements[i]) ) { 1382 this.firstFocusable = elements[i]; 1383 break; 1384 } 1385 } 1386 }; 1387 1388 Modal.prototype.getLastVisible = function(elements) { 1389 //get last visible focusable element inside the modal 1390 for(var i = elements.length - 1; i >= 0; i--) { 1391 if( isVisible(elements[i]) ) { 1392 this.lastFocusable = elements[i]; 1393 break; 1394 } 1395 } 1396 }; 1397 1398 Modal.prototype.getFirstFocusable = function() { 1399 if(!this.modalFocus || !Element.prototype.matches) { 1400 this.moveFocusEl = this.firstFocusable; 1401 return; 1402 } 1403 var containerIsFocusable = this.modalFocus.matches(focusableElString); 1404 if(containerIsFocusable) { 1405 this.moveFocusEl = this.modalFocus; 1406 } else { 1407 this.moveFocusEl = false; 1408 var elements = this.modalFocus.querySelectorAll(focusableElString); 1409 for(var i = 0; i < elements.length; i++) { 1410 if( isVisible(elements[i]) ) { 1411 this.moveFocusEl = elements[i]; 1412 break; 1413 } 1414 } 1415 if(!this.moveFocusEl) this.moveFocusEl = this.firstFocusable; 1416 } 1417 }; 1418 1419 Modal.prototype.emitModalEvents = function(eventName) { 1420 var event = new CustomEvent(eventName, {detail: this.selectedTrigger}); 1421 this.element.dispatchEvent(event); 1422 }; 1423 1424 function isVisible(element) { 1425 return element.offsetWidth || element.offsetHeight || element.getClientRects().length; 1426 }; 1427 1428 window.Modal = Modal; 1429 1430 //initialize the Modal objects 1431 var modals = document.getElementsByClassName('js-modal'); 1432 // generic focusable elements string selector 1433 var focusableElString = '[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex]:not([tabindex="-1"]), [contenteditable], audio[controls], video[controls], summary'; 1434 if( modals.length > 0 ) { 1435 var modalArrays = []; 1436 for( var i = 0; i < modals.length; i++) { 1437 (function(i){modalArrays.push(new Modal(modals[i]));})(i); 1438 } 1439 1440 window.addEventListener('keydown', function(event){ //close modal window on esc 1441 if(event.keyCode && event.keyCode == 27 || event.key && event.key.toLowerCase() == 'escape') { 1442 for( var i = 0; i < modalArrays.length; i++) { 1443 (function(i){modalArrays[i].closeModal();})(i); 1444 }; 1445 } 1446 }); 1447 } 1448}()); 1449// File#: _1_swipe-content 1450(function() { 1451 var SwipeContent = function(element) { 1452 this.element = element; 1453 this.delta = [false, false]; 1454 this.dragging = false; 1455 this.intervalId = false; 1456 initSwipeContent(this); 1457 }; 1458 1459 function initSwipeContent(content) { 1460 content.element.addEventListener('mousedown', handleEvent.bind(content)); 1461 content.element.addEventListener('touchstart', handleEvent.bind(content)); 1462 }; 1463 1464 function initDragging(content) { 1465 //add event listeners 1466 content.element.addEventListener('mousemove', handleEvent.bind(content)); 1467 content.element.addEventListener('touchmove', handleEvent.bind(content)); 1468 content.element.addEventListener('mouseup', handleEvent.bind(content)); 1469 content.element.addEventListener('mouseleave', handleEvent.bind(content)); 1470 content.element.addEventListener('touchend', handleEvent.bind(content)); 1471 }; 1472 1473 function cancelDragging(content) { 1474 //remove event listeners 1475 if(content.intervalId) { 1476 (!window.requestAnimationFrame) ? clearInterval(content.intervalId) : window.cancelAnimationFrame(content.intervalId); 1477 content.intervalId = false; 1478 } 1479 content.element.removeEventListener('mousemove', handleEvent.bind(content)); 1480 content.element.removeEventListener('touchmove', handleEvent.bind(content)); 1481 content.element.removeEventListener('mouseup', handleEvent.bind(content)); 1482 content.element.removeEventListener('mouseleave', handleEvent.bind(content)); 1483 content.element.removeEventListener('touchend', handleEvent.bind(content)); 1484 }; 1485 1486 function handleEvent(event) { 1487 switch(event.type) { 1488 case 'mousedown': 1489 case 'touchstart': 1490 startDrag(this, event); 1491 break; 1492 case 'mousemove': 1493 case 'touchmove': 1494 drag(this, event); 1495 break; 1496 case 'mouseup': 1497 case 'mouseleave': 1498 case 'touchend': 1499 endDrag(this, event); 1500 break; 1501 } 1502 }; 1503 1504 function startDrag(content, event) { 1505 content.dragging = true; 1506 // listen to drag movements 1507 initDragging(content); 1508 content.delta = [parseInt(unify(event).clientX), parseInt(unify(event).clientY)]; 1509 // emit drag start event 1510 emitSwipeEvents(content, 'dragStart', content.delta, event.target); 1511 }; 1512 1513 function endDrag(content, event) { 1514 cancelDragging(content);
1515 // credits: https://css-tricks.com/simple-swipe-with-vanilla-javascript/ 1516 var dx = parseInt(unify(event).clientX), 1517 dy = parseInt(unify(event).clientY); 1518 1519 // check if there was a left/right swipe 1520 if(content.delta && (content.delta[0] || content.delta[0] === 0)) { 1521 var s = getSign(dx - content.delta[0]); 1522 1523 if(Math.abs(dx - content.delta[0]) > 30) { 1524 (s < 0) ? emitSwipeEvents(content, 'swipeLeft', [dx, dy]) : emitSwipeEvents(content, 'swipeRight', [dx, dy]); 1525 } 1526 1527 content.delta[0] = false; 1528 } 1529 // check if there was a top/bottom swipe 1530 if(content.delta && (content.delta[1] || content.delta[1] === 0)) { 1531 var y = getSign(dy - content.delta[1]); 1532 1533 if(Math.abs(dy - content.delta[1]) > 30) { 1534 (y < 0) ? emitSwipeEvents(content, 'swipeUp', [dx, dy]) : emitSwipeEvents(content, 'swipeDown', [dx, dy]); 1535 } 1536 1537 content.delta[1] = false; 1538 } 1539 // emit drag end event 1540 emitSwipeEvents(content, 'dragEnd', [dx, dy]); 1541 content.dragging = false; 1542 }; 1543 1544 function drag(content, event) { 1545 if(!content.dragging) return; 1546 // emit dragging event with coordinates 1547 (!window.requestAnimationFrame) 1548 ? content.intervalId = setTimeout(function(){emitDrag.bind(content, event);}, 250) 1549 : content.intervalId = window.requestAnimationFrame(emitDrag.bind(content, event)); 1550 }; 1551 1552 function emitDrag(event) { 1553 emitSwipeEvents(this, 'dragging', [parseInt(unify(event).clientX), parseInt(unify(event).clientY)]); 1554 }; 1555 1556 function unify(event) { 1557 // unify mouse and touch events 1558 return event.changedTouches ? event.changedTouches[0] : event; 1559 }; 1560 1561 function emitSwipeEvents(content, eventName, detail, el) { 1562 var trigger = false; 1563 if(el) trigger = el; 1564 // emit event with coordinates 1565 var event = new CustomEvent(eventName, {detail: {x: detail[0], y: detail[1], origin: trigger}}); 1566 content.element.dispatchEvent(event); 1567 }; 1568 1569 function getSign(x) { 1570 if(!Math.sign) { 1571 return ((x > 0) - (x < 0)) || +x; 1572 } else { 1573 return Math.sign(x); 1574 } 1575 }; 1576 1577 window.SwipeContent = SwipeContent; 1578 1579 //initialize the SwipeContent objects 1580 var swipe = document.getElementsByClassName('js-swipe-content'); 1581 if( swipe.length > 0 ) { 1582 for( var i = 0; i < swipe.length; i++) { 1583 (function(i){new SwipeContent(swipe[i]);})(i); 1584 } 1585 } 1586}()); 1587// File#: _2_anim-card 1588// Usage: codyhouse.co/license 1589(function() { 1590 var AnimCards = function(element) { 1591 this.element = element; 1592 this.list = this.element.getElementsByTagName('ul')[0]; 1593 this.cards = this.list.children; 1594 this.reverseDirection = Util.hasClass(this.element, 'anim-cards--reverse'); 1595 this.translate = 0; // store container translate value 1596 this.animationId = false; 1597 this.animating = false; 1598 this.paused = false; 1599 // change speed of animation 1600 this.animationSpeed = 1; // > 1 to increse speed, < 1 to reduce; always > 0 1601 initAnimCardsEvents(this); 1602 }; 1603 1604 function initAnimCardsEvents(cards) { 1605 // init observer 1606 var observer = new IntersectionObserver(animCardsObserve.bind(cards)); 1607 observer.observe(cards.element); 1608 1609 cards.element.addEventListener('update-card-width', function(event){ // reset animation on resize 1610 if(cards.animating) { 1611 cancelPrevAnimation(cards); 1612 if(!cards.paused) initAnimCards(cards); 1613 } 1614 }); 1615 1616 // play/pause button 1617 cards.element.addEventListener('anim-cards', function(event) { 1618 playCards(cards); 1619 }); 1620 cards.element.addEventListener('pause-cards', function(event) { 1621 pauseCards(cards); 1622 }); 1623 1624 // pause on hover 1625 var pauseHover = cards.element.getAttribute('data-anim-cards-pause-hover'); 1626 if(pauseHover && pauseHover == 'on') { 1627 cards.element.addEventListener('mouseenter', function(){ 1628 pauseCards(cards); 1629 }); 1630 1631 cards.element.addEventListener('mouseleave', function(){ 1632 playCards(cards); 1633 }); 1634 } 1635 }; 1636 1637 function pauseCards(cards) { // pause cards - play/pause button or mouseenter 1638 cards.paused = true; 1639 if(cards.animating) { 1640 cancelPrevAnimation(cards); 1641 cards.timestamp = false; 1642 } 1643 }; 1644 1645 function playCards(cards) { // play cards - play/pause button or mouseleave 1646 cards.paused = false; 1647 if(cards.animating) initAnimCards(cards); 1648 }; 1649 1650 function animCardsObserve(entries) { 1651 if(entries[0].isIntersecting) { 1652 this.animating = true; 1653 if(!this.paused) initAnimCards(this); // init animation 1654 } else { 1655 this.animating = false; 1656 cancelPrevAnimation(this); 1657 } 1658 }; 1659 1660 function initAnimCards(cards) { 1661 if(cards.paused) return; 1662 cards.cardWidth = getAnimCardsWidth(cards); 1663 cards.animationId = window.requestAnimationFrame(triggerAnimCards.bind(cards)); 1664 }; 1665 1666 function triggerAnimCards(timestamp) { 1667 cancelPrevAnimation(this); 1668 if(!this.timestamp) this.timestamp = timestamp; 1669 var translateIncrease = (this.timestamp - timestamp)*0.06*this.animationSpeed; 1670 this.timestamp = timestamp; 1671 updateAnimCardsTranslate(this, translateIncrease); 1672 updateAnimCardsList(this); 1673 setTranslate(this); 1674 this.animationId = window.requestAnimationFrame(triggerAnimCards.bind(this)); 1675 }; 1676 1677 function updateAnimCardsTranslate(cards, translate) { 1678 cards.translate = cards.reverseDirection ? cards.translate - translate : cards.translate + translate; 1679 cards.translate = Math.round(Math.abs(cards.translate)); 1680 if(!cards.reverseDirection) cards.translate = cards.translate*-1; 1681 }; 1682 1683 function updateAnimCardsList(cards) { 1684 if(Math.abs(cards.translate) <= cards.cardWidth) return; 1685 // need to remove first item from the list and append it to the end of list 1686 cards.translate = Math.abs(cards.translate) - cards.cardWidth; 1687 if(!cards.reverseDirection) cards.translate = cards.translate*-1; 1688 var clone = cards.cards[0].cloneNode(true); 1689 cards.list.removeChild(cards.cards[0]); 1690 cards.list.appendChild(clone); 1691 }; 1692 1693 function setTranslate(cards) { 1694 cards.list.style.transform = 'translateX('+cards.translate+'px)'; 1695 cards.list.style.msTransform = 'translateX('+cards.translate+'px)'; 1696 }; 1697 1698 function getAnimCardsWidth(cards) { 1699 return parseFloat(window.getComputedStyle(cards.cards[0]).marginRight) + cards.cards[0].offsetWidth; 1700 }; 1701 1702 function cancelPrevAnimation(cards) { 1703 if(cards.animationId) { 1704 window.cancelAnimationFrame(cards.animationId); 1705 cards.animationId = false; 1706 } 1707 }; 1708 1709 function initAnimCardsController(controller) { 1710 // play/pause btn controller 1711 var cardsContainer = document.getElementById(controller.getAttribute('aria-controls')); 1712 if(!cardsContainer) return; 1713 var cardsList = cardsContainer.getElementsByClassName('js-anim-cards'); 1714 if(cardsList.length < 1) return; 1715 1716 // detect click 1717 controller.addEventListener('click', function(event){ 1718 var playAnimation = controller.getAttribute('aria-pressed') == 'true'; 1719 var animEvent = playAnimation ? 'anim-cards' : 'pause-cards';
1720 playAnimation ? controller.setAttribute('aria-pressed', 'false') : controller.setAttribute('aria-pressed', 'true'); 1721 for(var i = 0; i < cardsList.length; i++) { 1722 cardsList[i].dispatchEvent(new CustomEvent(animEvent)); 1723 } 1724 }); 1725 }; 1726 1727 //initialize the AnimCards objects 1728 var animCards = document.getElementsByClassName('js-anim-cards'), 1729 requestAnimationFrameSupported = window.requestAnimationFrame, 1730 reducedMotion = Util.osHasReducedMotion(), 1731 intersectionObserverSupported = ('IntersectionObserver' in window && 'IntersectionObserverEntry' in window && 'intersectionRatio' in window.IntersectionObserverEntry.prototype); 1732 1733 if( animCards.length > 0 ) { 1734 var animCardsArray = []; 1735 for( var i = 0; i < animCards.length; i++) { 1736 if(!requestAnimationFrameSupported || reducedMotion || !intersectionObserverSupported) { 1737 // animation is off if requestAnimationFrame/IntersectionObserver is not supported or reduced motion is on 1738 Util.addClass(animCards[i], 'anim-cards--anim-off'); 1739 } else {(function(i){animCardsArray.push(new AnimCards(animCards[i]));})(i);} 1740 } 1741 1742 if(animCardsArray.length > 0) { 1743 var resizingId = false, 1744 customEvent = new CustomEvent('update-card-width'); 1745 1746 window.addEventListener('resize', function() { 1747 clearTimeout(resizingId); 1748 resizingId = setTimeout(doneResizing, 500); 1749 }); 1750 1751 function doneResizing() { 1752 for( var i = 0; i < animCardsArray.length; i++) { 1753 (function(i){animCardsArray[i].element.dispatchEvent(customEvent)})(i); 1754 }; 1755 }; 1756 }; 1757 1758 // check play/pause buttons 1759 var animCardsControl = document.getElementsByClassName('js-anim-cards-control'); 1760 if(animCardsControl.length > 0) { 1761 for( var i = 0; i < animCardsControl.length; i++) { 1762 if(!requestAnimationFrameSupported || reducedMotion || !intersectionObserverSupported) { 1763 Util.addClass(animCardsControl[i], 'is-hidden'); 1764 } else { 1765 (function(i){initAnimCardsController(animCardsControl[i]);})(i); 1766 } 1767 } 1768 } 1769 } 1770}()); 1771// File#: _2_carousel 1772// Usage: codyhouse.co/license 1773(function() { 1774 var Carousel = function(opts) { 1775 this.options = Util.extend(Carousel.defaults , opts); 1776 this.element = this.options.element; 1777 this.listWrapper = this.element.getElementsByClassName('carousel__wrapper')[0]; 1778 this.list = this.element.getElementsByClassName('carousel__list')[0]; 1779 this.items = this.element.getElementsByClassName('carousel__item'); 1780 this.initItems = []; // store only the original elements - will need this for cloning 1781 this.itemsNb = this.items.length; //original number of items 1782 this.visibItemsNb = 1; // tot number of visible items 1783 this.itemsWidth = 1; // this will be updated with the right width of items 1784 this.itemOriginalWidth = false; // store the initial width to use it on resize 1785 this.selectedItem = 0; // index of first visible item 1786 this.translateContainer = 0; // this will be the amount the container has to be translated each time a new group has to be shown (negative) 1787 this.containerWidth = 0; // this will be used to store the total width of the carousel (including the overflowing part) 1788 this.ariaLive = false; 1789 // navigation 1790 this.controls = this.element.getElementsByClassName('js-carousel__control'); 1791 this.animating = false; 1792 // autoplay 1793 this.autoplayId = false; 1794 this.autoplayPaused = false; 1795 //drag 1796 this.dragStart = false; 1797 // resize 1798 this.resizeId = false; 1799 // used to re-initialize js 1800 this.cloneList = []; 1801 // store items min-width 1802 this.itemAutoSize = false; 1803 // store translate value (loop = off) 1804 this.totTranslate = 0; 1805 // modify loop option if navigation is on 1806 if(this.options.nav) this.options.loop = false; 1807 // store counter elements (if present) 1808 this.counter = this.element.getElementsByClassName('js-carousel__counter'); 1809 this.counterTor = this.element.getElementsByClassName('js-carousel__counter-tot');
1810 initCarouselLayout(this); // get number visible items + width items 1811 setItemsWidth(this, true); 1812 insertBefore(this, this.visibItemsNb); // insert clones before visible elements 1813 updateCarouselClones(this); // insert clones after visible elements 1814 resetItemsTabIndex(this); // make sure not visible items are not focusable 1815 initAriaLive(this); // set aria-live region for SR 1816 initCarouselEvents(this); // listen to events 1817 initCarouselCounter(this); 1818 Util.addClass(this.element, 'carousel--loaded'); 1819 }; 1820 1821 //public carousel functions 1822 Carousel.prototype.showNext = function() { 1823 showNextItems(this); 1824 }; 1825 1826 Carousel.prototype.showPrev = function() { 1827 showPrevItems(this); 1828 }; 1829 1830 Carousel.prototype.startAutoplay = function() { 1831 startAutoplay(this); 1832 }; 1833 1834 Carousel.prototype.pauseAutoplay = function() { 1835 pauseAutoplay(this); 1836 }; 1837 1838 //private carousel functions 1839 function initCarouselLayout(carousel) { 1840 // evaluate size of single elements + number of visible elements 1841 var itemStyle = window.getComputedStyle(carousel.items[0]), 1842 containerStyle = window.getComputedStyle(carousel.listWrapper), 1843 itemWidth = parseFloat(itemStyle.getPropertyValue('width')), 1844 itemMargin = parseFloat(itemStyle.getPropertyValue('margin-right')), 1845 containerPadding = parseFloat(containerStyle.getPropertyValue('padding-left')), 1846 containerWidth = parseFloat(containerStyle.getPropertyValue('width')); 1847 1848 if(!carousel.itemAutoSize) { 1849 carousel.itemAutoSize = itemWidth; 1850 } 1851 1852 // if carousel.listWrapper is hidden -> make sure to retrieve the proper width 1853 containerWidth = getCarouselWidth(carousel, containerWidth); 1854 1855 if( !carousel.itemOriginalWidth) { // on resize -> use initial width of items to recalculate 1856 carousel.itemOriginalWidth = itemWidth; 1857 } else { 1858 itemWidth = carousel.itemOriginalWidth; 1859 } 1860 1861 if(carousel.itemAutoSize) { 1862 carousel.itemOriginalWidth = parseInt(carousel.itemAutoSize); 1863 itemWidth = carousel.itemOriginalWidth; 1864 } 1865 // make sure itemWidth is smaller than container width 1866 if(containerWidth < itemWidth) { 1867 carousel.itemOriginalWidth = containerWidth 1868 itemWidth = carousel.itemOriginalWidth; 1869 } 1870 // get proper width of elements 1871 carousel.visibItemsNb = parseInt((containerWidth - 2*containerPadding + itemMargin)/(itemWidth+itemMargin)); 1872 carousel.itemsWidth = parseFloat( (((containerWidth - 2*containerPadding + itemMargin)/carousel.visibItemsNb) - itemMargin).toFixed(1)); 1873 carousel.containerWidth = (carousel.itemsWidth+itemMargin)* carousel.items.length; 1874 carousel.translateContainer = 0 - ((carousel.itemsWidth+itemMargin)* carousel.visibItemsNb); 1875 // flexbox fallback 1876 if(!flexSupported) carousel.list.style.width = (carousel.itemsWidth + itemMargin)*carousel.visibItemsNb*3+'px'; 1877 1878 // this is used when loop == off 1879 carousel.totTranslate = 0 - carousel.selectedItem*(carousel.itemsWidth+itemMargin); 1880 if(carousel.items.length <= carousel.visibItemsNb) carousel.totTranslate = 0; 1881 1882 centerItems(carousel); // center items if carousel.items.length < visibItemsNb 1883 alignControls(carousel); // check if controls need to be aligned to a different element 1884 }; 1885 1886 function setItemsWidth(carousel, bool) { 1887 for(var i = 0; i < carousel.items.length; i++) { 1888 carousel.items[i].style.width = carousel.itemsWidth+"px"; 1889 if(bool) carousel.initItems.push(carousel.items[i]); 1890 } 1891 }; 1892 1893 function updateCarouselClones(carousel) { 1894 if(!carousel.options.loop) return; 1895 // take care of clones after visible items (needs to run after the update of clones before visible items) 1896 if(carousel.items.length < carousel.visibItemsNb*3) { 1897 insertAfter(carousel, carousel.visibItemsNb*3 - carousel.items.length, carousel.items.length - carousel.visibItemsNb*2); 1898 } else if(carousel.items.length > carousel.visibItemsNb*3 ) { 1899 removeClones(carousel, carousel.visibItemsNb*3, carousel.items.length - carousel.visibItemsNb*3); 1900 } 1901 // set proper translate value for the container 1902 setTranslate(carousel, 'translateX('+carousel.translateContainer+'px)'); 1903 }; 1904 1905 function initCarouselEvents(carousel) { 1906 // listen for click on previous/next arrow 1907 // dots navigation 1908 if(carousel.options.nav) { 1909 carouselCreateNavigation(carousel); 1910 carouselInitNavigationEvents(carousel); 1911 } 1912 1913 if(carousel.controls.length > 0) { 1914 carousel.controls[0].addEventListener('click', function(event){ 1915 event.preventDefault(); 1916 showPrevItems(carousel); 1917 updateAriaLive(carousel); 1918 }); 1919 carousel.controls[1].addEventListener('click', function(event){ 1920 event.preventDefault(); 1921 showNextItems(carousel); 1922 updateAriaLive(carousel); 1923 }); 1924 1925 // update arrow visility -> loop == off only 1926 resetCarouselControls(carousel); 1927 // emit custom event - items visible 1928 emitCarouselActiveItemsEvent(carousel) 1929 } 1930 // autoplay 1931 if(carousel.options.autoplay) { 1932 startAutoplay(carousel); 1933 // pause autoplay if user is interacting with the carousel 1934 carousel.element.addEventListener('mouseenter', function(event){ 1935 pauseAutoplay(carousel);
1936 carousel.autoplayPaused = true; 1937 }); 1938 carousel.element.addEventListener('focusin', function(event){ 1939 pauseAutoplay(carousel); 1940 carousel.autoplayPaused = true; 1941 }); 1942 carousel.element.addEventListener('mouseleave', function(event){ 1943 carousel.autoplayPaused = false; 1944 startAutoplay(carousel); 1945 }); 1946 carousel.element.addEventListener('focusout', function(event){ 1947 carousel.autoplayPaused = false; 1948 startAutoplay(carousel); 1949 }); 1950 } 1951 // drag events 1952 if(carousel.options.drag && window.requestAnimationFrame) { 1953 //init dragging 1954 new SwipeContent(carousel.element); 1955 carousel.element.addEventListener('dragStart', function(event){ 1956 if(event.detail.origin && event.detail.origin.closest('.js-carousel__control')) return; 1957 if(event.detail.origin && event.detail.origin.closest('.js-carousel__navigation')) return; 1958 if(event.detail.origin && !event.detail.origin.closest('.carousel__wrapper')) return; 1959 Util.addClass(carousel.element, 'carousel--is-dragging'); 1960 pauseAutoplay(carousel); 1961 carousel.dragStart = event.detail.x; 1962 animateDragEnd(carousel); 1963 }); 1964 carousel.element.addEventListener('dragging', function(event){ 1965 if(!carousel.dragStart) return; 1966 if(carousel.animating || Math.abs(event.detail.x - carousel.dragStart) < 10) return; 1967 var translate = event.detail.x - carousel.dragStart + carousel.translateContainer; 1968 if(!carousel.options.loop) { 1969 translate = event.detail.x - carousel.dragStart + carousel.totTranslate; 1970 } 1971 setTranslate(carousel, 'translateX('+translate+'px)'); 1972 }); 1973 } 1974 // reset on resize 1975 window.addEventListener('resize', function(event){ 1976 pauseAutoplay(carousel); 1977 clearTimeout(carousel.resizeId); 1978 carousel.resizeId = setTimeout(function(){ 1979 resetCarouselResize(carousel); 1980 // reset dots navigation 1981 resetDotsNavigation(carousel); 1982 resetCarouselControls(carousel); 1983 setCounterItem(carousel); 1984 startAutoplay(carousel); 1985 centerItems(carousel); // center items if carousel.items.length < visibItemsNb 1986 alignControls(carousel); 1987 // emit custom event - items visible 1988 emitCarouselActiveItemsEvent(carousel) 1989 }, 250) 1990 }); 1991 // keyboard navigation 1992 carousel.element.addEventListener('keydown', function(event){ 1993 if(event.keyCode && event.keyCode == 39 || event.key && event.key.toLowerCase() == 'arrowright') { 1994 carousel.showNext(); 1995 } else if(event.keyCode && event.keyCode == 37 || event.key && event.key.toLowerCase() == 'arrowleft') { 1996 carousel.showPrev(); 1997 } 1998 }); 1999 }; 2000 2001 function showPrevItems(carousel) { 2002 if(carousel.animating) return; 2003 carousel.animating = true; 2004 carousel.selectedItem = getIndex(carousel, carousel.selectedItem - carousel.visibItemsNb); 2005 animateList(carousel, '0', 'prev'); 2006 }; 2007 2008 function showNextItems(carousel) { 2009 if(carousel.animating) return; 2010 carousel.animating = true; 2011 carousel.selectedItem = getIndex(carousel, carousel.selectedItem + carousel.visibItemsNb); 2012 animateList(carousel, carousel.translateContainer*2+'px', 'next'); 2013 }; 2014 2015 function animateDragEnd(carousel) { // end-of-dragging animation 2016 carousel.element.addEventListener('dragEnd', function cb(event){ 2017 carousel.element.removeEventListener('dragEnd', cb); 2018 Util.removeClass(carousel.element, 'carousel--is-dragging'); 2019 if(event.detail.x - carousel.dragStart < -40) { 2020 carousel.animating = false; 2021 showNextItems(carousel); 2022 } else if(event.detail.x - carousel.dragStart > 40) { 2023 carousel.animating = false; 2024 showPrevItems(carousel); 2025 } else if(event.detail.x - carousel.dragStart == 0) { // this is just a click -> no dragging 2026 return; 2027 } else { // not dragged enought -> do not update carousel, just reset 2028 carousel.animating = true; 2029 animateList(carousel, carousel.translateContainer+'px', false); 2030 } 2031 carousel.dragStart = false; 2032 });
2033 }; 2034 2035 function animateList(carousel, translate, direction) { // takes care of changing visible items 2036 pauseAutoplay(carousel); 2037 Util.addClass(carousel.list, 'carousel__list--animating'); 2038 var initTranslate = carousel.totTranslate; 2039 if(!carousel.options.loop) { 2040 translate = noLoopTranslateValue(carousel, direction); 2041 } 2042 setTimeout(function() {setTranslate(carousel, 'translateX('+translate+')');}); 2043 if(transitionSupported) { 2044 carousel.list.addEventListener('transitionend', function cb(event){ 2045 if(event.propertyName && event.propertyName != 'transform') return; 2046 Util.removeClass(carousel.list, 'carousel__list--animating'); 2047 carousel.list.removeEventListener('transitionend', cb); 2048 animateListCb(carousel, direction); 2049 }); 2050 } else { 2051 animateListCb(carousel, direction); 2052 } 2053 if(!carousel.options.loop && (initTranslate == carousel.totTranslate)) { 2054 // translate value was not updated -> trigger transitionend event to restart carousel 2055 carousel.list.dispatchEvent(new CustomEvent('transitionend')); 2056 } 2057 resetCarouselControls(carousel); 2058 setCounterItem(carousel); 2059 // emit custom event - items visible 2060 emitCarouselActiveItemsEvent(carousel) 2061 }; 2062 2063 function noLoopTranslateValue(carousel, direction) { 2064 var translate = carousel.totTranslate; 2065 if(direction == 'next') { 2066 translate = carousel.totTranslate + carousel.translateContainer; 2067 } else if(direction == 'prev') { 2068 translate = carousel.totTranslate - carousel.translateContainer; 2069 } else if(direction == 'click') { 2070 translate = carousel.selectedDotIndex*carousel.translateContainer; 2071 } 2072 if(translate > 0) { 2073 translate = 0; 2074 carousel.selectedItem = 0; 2075 } 2076 if(translate < - carousel.translateContainer - carousel.containerWidth) { 2077 translate = - carousel.translateContainer - carousel.containerWidth; 2078 carousel.selectedItem = carousel.items.length - carousel.visibItemsNb; 2079 } 2080 if(carousel.visibItemsNb > carousel.items.length) translate = 0; 2081 carousel.totTranslate = translate; 2082 return translate + 'px'; 2083 }; 2084 2085 function animateListCb(carousel, direction) { // reset actions after carousel has been updated 2086 if(direction) updateClones(carousel, direction); 2087 carousel.animating = false; 2088 // reset autoplay 2089 startAutoplay(carousel); 2090 // reset tab index 2091 resetItemsTabIndex(carousel); 2092 }; 2093 2094 function updateClones(carousel, direction) { 2095 if(!carousel.options.loop) return; 2096 // at the end of each animation, we need to update the clones before and after the visible items 2097 var index = (direction == 'next') ? 0 : carousel.items.length - carousel.visibItemsNb; 2098 // remove clones you do not need anymore 2099 removeClones(carousel, index, false); 2100 // add new clones 2101 (direction == 'next') ? insertAfter(carousel, carousel.visibItemsNb, 0) : insertBefore(carousel, carousel.visibItemsNb); 2102 //reset transform 2103 setTranslate(carousel, 'translateX('+carousel.translateContainer+'px)'); 2104 }; 2105 2106 function insertBefore(carousel, nb, delta) { 2107 if(!carousel.options.loop) return; 2108 var clones = document.createDocumentFragment(); 2109 var start = 0; 2110 if(delta) start = delta; 2111 for(var i = start; i < nb; i++) { 2112 var index = getIndex(carousel, carousel.selectedItem - i - 1), 2113 clone = carousel.initItems[index].cloneNode(true); 2114 Util.addClass(clone, 'js-clone'); 2115 clones.insertBefore(clone, clones.firstChild); 2116 } 2117 carousel.list.insertBefore(clones, carousel.list.firstChild); 2118 emitCarouselUpdateEvent(carousel); 2119 }; 2120 2121 function insertAfter(carousel, nb, init) { 2122 if(!carousel.options.loop) return; 2123 var clones = document.createDocumentFragment(); 2124 for(var i = init; i < nb + init; i++) { 2125 var index = getIndex(carousel, carousel.selectedItem + carousel.visibItemsNb + i), 2126 clone = carousel.initItems[index].cloneNode(true); 2127 Util.addClass(clone, 'js-clone'); 2128 clones.appendChild(clone); 2129 }
2130 carousel.list.appendChild(clones); 2131 emitCarouselUpdateEvent(carousel); 2132 }; 2133 2134 function removeClones(carousel, index, bool) { 2135 if(!carousel.options.loop) return; 2136 if( !bool) { 2137 bool = carousel.visibItemsNb; 2138 } 2139 for(var i = 0; i < bool; i++) { 2140 if(carousel.items[index]) carousel.list.removeChild(carousel.items[index]); 2141 } 2142 }; 2143 2144 function resetCarouselResize(carousel) { // reset carousel on resize 2145 var visibleItems = carousel.visibItemsNb; 2146 // get new items min-width value 2147 resetItemAutoSize(carousel); 2148 initCarouselLayout(carousel); 2149 setItemsWidth(carousel, false); 2150 resetItemsWidth(carousel); // update the array of original items -> array used to create clones 2151 if(carousel.options.loop) { 2152 if(visibleItems > carousel.visibItemsNb) { 2153 removeClones(carousel, 0, visibleItems - carousel.visibItemsNb); 2154 } else if(visibleItems < carousel.visibItemsNb) { 2155 insertBefore(carousel, carousel.visibItemsNb, visibleItems); 2156 } 2157 updateCarouselClones(carousel); // this will take care of translate + after elements 2158 } else { 2159 // reset default translate to a multiple value of (itemWidth + margin) 2160 var translate = noLoopTranslateValue(carousel); 2161 setTranslate(carousel, 'translateX('+translate+')'); 2162 } 2163 resetItemsTabIndex(carousel); // reset focusable elements 2164 }; 2165 2166 function resetItemAutoSize(carousel) { 2167 if(!cssPropertiesSupported) return; 2168 // remove inline style 2169 carousel.items[0].removeAttribute('style'); 2170 // get original item width 2171 carousel.itemAutoSize = getComputedStyle(carousel.items[0]).getPropertyValue('width'); 2172 }; 2173 2174 function resetItemsWidth(carousel) { 2175 for(var i = 0; i < carousel.initItems.length; i++) { 2176 carousel.initItems[i].style.width = carousel.itemsWidth+"px"; 2177 } 2178 }; 2179 2180 function resetItemsTabIndex(carousel) { 2181 var carouselActive = carousel.items.length > carousel.visibItemsNb; 2182 var j = carousel.items.length; 2183 for(var i = 0; i < carousel.items.length; i++) { 2184 if(carousel.options.loop) { 2185 if(i < carousel.visibItemsNb || i >= 2*carousel.visibItemsNb ) { 2186 carousel.items[i].setAttribute('tabindex', '-1'); 2187 } else { 2188 if(i < j) j = i; 2189 carousel.items[i].removeAttribute('tabindex'); 2190 } 2191 } else { 2192 if( (i < carousel.selectedItem || i >= carousel.selectedItem + carousel.visibItemsNb) && carouselActive) { 2193 carousel.items[i].setAttribute('tabindex', '-1'); 2194 } else { 2195 if(i < j) j = i; 2196 carousel.items[i].removeAttribute('tabindex'); 2197 } 2198 } 2199 } 2200 resetVisibilityOverflowItems(carousel, j); 2201 }; 2202 2203 function startAutoplay(carousel) { 2204 if(carousel.options.autoplay && !carousel.autoplayId && !carousel.autoplayPaused) { 2205 carousel.autoplayId = setInterval(function(){ 2206 showNextItems(carousel); 2207 }, carousel.options.autoplayInterval); 2208 } 2209 }; 2210 2211 function pauseAutoplay(carousel) { 2212 if(carousel.options.autoplay) { 2213 clearInterval(carousel.autoplayId); 2214 carousel.autoplayId = false; 2215 } 2216 }; 2217 2218 function initAriaLive(carousel) { // create an aria-live region for SR 2219 if(!carousel.options.ariaLive) return; 2220 // create an element that will be used to announce the new visible slide to SR 2221 var srLiveArea = document.createElement('div'); 2222 Util.setAttributes(srLiveArea, {'class': 'sr-only js-carousel__aria-live', 'aria-live': 'polite', 'aria-atomic': 'true'}); 2223 carousel.element.appendChild(srLiveArea); 2224 carousel.ariaLive = srLiveArea; 2225 }; 2226 2227 function updateAriaLive(carousel) { // announce to SR which items are now visible 2228 if(!carousel.options.ariaLive) return; 2229 carousel.ariaLive.innerHTML = 'Item '+(carousel.selectedItem + 1)+' selected. '+carousel.visibItemsNb+' items of '+carou
2229sel.initItems.length+' visible'; 2230 }; 2231 2232 function getIndex(carousel, index) { 2233 if(index < 0) index = getPositiveValue(index, carousel.itemsNb); 2234 if(index >= carousel.itemsNb) index = index % carousel.itemsNb; 2235 return index; 2236 }; 2237 2238 function getPositiveValue(value, add) { 2239 value = value + add; 2240 if(value > 0) return value; 2241 else return getPositiveValue(value, add); 2242 }; 2243 2244 function setTranslate(carousel, translate) { 2245 carousel.list.style.transform = translate; 2246 carousel.list.style.msTransform = translate; 2247 }; 2248 2249 function getCarouselWidth(carousel, computedWidth) { // retrieve carousel width if carousel is initially hidden 2250 var closestHidden = carousel.listWrapper.closest('.sr-only'); 2251 if(closestHidden) { // carousel is inside an .sr-only (visually hidden) element 2252 Util.removeClass(closestHidden, 'sr-only'); 2253 computedWidth = carousel.listWrapper.offsetWidth; 2254 Util.addClass(closestHidden, 'sr-only'); 2255 } else if(isNaN(computedWidth)){ 2256 computedWidth = getHiddenParentWidth(carousel.element, carousel); 2257 } 2258 return computedWidth; 2259 }; 2260 2261 function getHiddenParentWidth(element, carousel) { 2262 var parent = element.parentElement; 2263 if(parent.tagName.toLowerCase() == 'html') return 0; 2264 var style = window.getComputedStyle(parent); 2265 if(style.display == 'none' || style.visibility == 'hidden') { 2266 parent.setAttribute('style', 'display: block!important; visibility: visible!important;'); 2267 var computedWidth = carousel.listWrapper.offsetWidth; 2268 parent.style.display = ''; 2269 parent.style.visibility = ''; 2270 return computedWidth; 2271 } else { 2272 return getHiddenParentWidth(parent, carousel); 2273 } 2274 }; 2275 2276 function resetCarouselControls(carousel) { 2277 if(carousel.options.loop) return; 2278 // update arrows status 2279 if(carousel.controls.length > 0) { 2280 (carousel.totTranslate == 0) 2281 ? carousel.controls[0].setAttribute('disabled', true) 2282 : carousel.controls[0].removeAttribute('disabled'); 2283 (carousel.totTranslate == (- carousel.translateContainer - carousel.containerWidth) || carousel.items.length <= carousel.visibItemsNb) 2284 ? carousel.controls[1].setAttribute('disabled', true) 2285 : carousel.controls[1].removeAttribute('disabled'); 2286 } 2287 // update carousel dots 2288 if(carousel.options.nav) { 2289 var selectedDot = carousel.navigation.getElementsByClassName(carousel.options.navigationItemClass+'--selected'); 2290 if(selectedDot.length > 0) Util.removeClass(selectedDot[0], carousel.options.navigationItemClass+'--selected'); 2291 2292 var newSelectedIndex = getSelectedDot(carousel); 2293 if(carousel.totTranslate == (- carousel.translateContainer - carousel.containerWidth)) { 2294 newSelectedIndex = carousel.navDots.length - 1; 2295 } 2296 Util.addClass(carousel.navDots[newSelectedIndex], carousel.options.navigationItemClass+'--selected'); 2297 } 2298 2299 (carousel.totTranslate == 0 && (carousel.totTranslate == (- carousel.translateContainer - carousel.containerWidth) || carousel.items.length <= carousel.visibItemsNb)) 2300 ? Util.addClass(carousel.element, 'carousel--hide-controls') 2301 : Util.removeClass(carousel.element, 'carousel--hide-controls'); 2302 }; 2303 2304 function emitCarouselUpdateEvent(carousel) { 2305 carousel.cloneList = []; 2306 var clones = carousel.element.querySelectorAll('.js-clone'); 2307 for(var i = 0; i < clones.length; i++) { 2308 Util.removeClass(clones[i], 'js-clone'); 2309 carousel.cloneList.push(clones[i]); 2310 } 2311 emitCarouselEvents(carousel, 'carousel-updated', carousel.cloneList); 2312 }; 2313 2314 function carouselCreateNavigation(carousel) { 2315 if(carousel.element.getElementsByClassName('js-carousel__navigation').length > 0) return; 2316 2317 var navigation = document.createElement('ol'), 2318 navChildren = ''; 2319 2320 var navClasses = carousel.options.navigationClass+' js-carousel__navigation'; 2321 if(carousel.items.length <= carousel.visibItemsNb) { 2322 navClasses = navClasses + ' is-hidden'; 2323 } 2324 navigation.setAttribute('class', navClasses); 2325
2326 var dotsNr = Math.ceil(carousel.items.length/carousel.visibItemsNb), 2327 selectedDot = getSelectedDot(carousel), 2328 indexClass = carousel.options.navigationPagination ? '' : 'sr-only' 2329 for(var i = 0; i < dotsNr; i++) { 2330 var className = (i == selectedDot) ? 'class="'+carousel.options.navigationItemClass+' '+carousel.options.navigationItemClass+'--selected js-carousel__nav-item"' : 'class="'+carousel.options.navigationItemClass+' js-carousel__nav-item"'; 2331 navChildren = navChildren + '<li '+className+'><button class="reset js-tab-focus" style="outline: none;"><span class="'+indexClass+'">'+ (i+1) + '</span></button></li>'; 2332 } 2333 navigation.innerHTML = navChildren; 2334 carousel.element.appendChild(navigation); 2335 }; 2336 2337 function carouselInitNavigationEvents(carousel) { 2338 carousel.navigation = carousel.element.getElementsByClassName('js-carousel__navigation')[0]; 2339 carousel.navDots = carousel.element.getElementsByClassName('js-carousel__nav-item'); 2340 carousel.navIdEvent = carouselNavigationClick.bind(carousel); 2341 carousel.navigation.addEventListener('click', carousel.navIdEvent); 2342 }; 2343 2344 function carouselRemoveNavigation(carousel) { 2345 if(carousel.navigation) carousel.element.removeChild(carousel.navigation); 2346 if(carousel.navIdEvent) carousel.navigation.removeEventListener('click', carousel.navIdEvent); 2347 }; 2348 2349 function resetDotsNavigation(carousel) { 2350 if(!carousel.options.nav) return; 2351 carouselRemoveNavigation(carousel); 2352 carouselCreateNavigation(carousel); 2353 carouselInitNavigationEvents(carousel); 2354 }; 2355 2356 function carouselNavigationClick(event) { 2357 var dot = event.target.closest('.js-carousel__nav-item'); 2358 if(!dot) return; 2359 if(this.animating) return; 2360 this.animating = true; 2361 var index = Util.getIndexInArray(this.navDots, dot); 2362 this.selectedDotIndex = index; 2363 this.selectedItem = index*this.visibItemsNb; 2364 animateList(this, false, 'click'); 2365 }; 2366 2367 function getSelectedDot(carousel) { 2368 return Math.ceil(carousel.selectedItem/carousel.visibItemsNb); 2369 }; 2370 2371 function initCarouselCounter(carousel) { 2372 if(carousel.counterTor.length > 0) carousel.counterTor[0].textContent = carousel.itemsNb; 2373 setCounterItem(carousel); 2374 }; 2375 2376 function setCounterItem(carousel) { 2377 if(carousel.counter.length == 0) return; 2378 var totalItems = carousel.selectedItem + carousel.visibItemsNb; 2379 if(totalItems > carousel.items.length) totalItems = carousel.items.length; 2380 carousel.counter[0].textContent = totalItems; 2381 }; 2382 2383 function centerItems(carousel) { 2384 if(!carousel.options.justifyContent) return; 2385 Util.toggleClass(carousel.list, 'justify-center', carousel.items.length < carousel.visibItemsNb); 2386 }; 2387 2388 function alignControls(carousel) { 2389 if(carousel.controls.length < 1 || !carousel.options.alignControls) return; 2390 if(!carousel.controlsAlignEl) { 2391 carousel.controlsAlignEl = carousel.element.querySelector(carousel.options.alignControls); 2392 } 2393 if(!carousel.controlsAlignEl) return; 2394 var translate = (carousel.element.offsetHeight - carousel.controlsAlignEl.offsetHeight); 2395 for(var i = 0; i < carousel.controls.length; i++) { 2396 carousel.controls[i].style.marginBottom = translate + 'px'; 2397 } 2398 }; 2399 2400 function emitCarouselActiveItemsEvent(carousel) { 2401 emitCarouselEvents(carousel, 'carousel-active-items', {firstSelectedItem: carousel.selectedItem, visibleItemsNb: carousel.visibItemsNb}); 2402 }; 2403 2404 function emitCarouselEvents(carousel, eventName, eventDetail) { 2405 var event = new CustomEvent(eventName, {detail: eventDetail}); 2406 carousel.element.dispatchEvent(event); 2407 }; 2408 2409 function resetVisibilityOverflowItems(carousel, j) { 2410 if(!carousel.options.overflowItems) return; 2411 var itemWidth = carousel.containerWidth/carousel.items.length, 2412 delta = (window.innerWidth - itemWidth*carousel.visibItemsNb)/2, 2413 overflowItems = Math.ceil(delta/itemWidth);
2414 2415 for(var i = 0; i < overflowItems; i++) { 2416 var indexPrev = j - 1 - i; // prev element 2417 if(indexPrev >= 0 ) carousel.items[indexPrev].removeAttribute('tabindex'); 2418 var indexNext = j + carousel.visibItemsNb + i; // next element 2419 if(indexNext < carousel.items.length) carousel.items[indexNext].removeAttribute('tabindex'); 2420 } 2421 }; 2422 2423 Carousel.defaults = { 2424 element : '', 2425 autoplay : false, 2426 autoplayInterval: 5000, 2427 loop: true, 2428 nav: false, 2429 navigationItemClass: 'carousel__nav-item', 2430 navigationClass: 'carousel__navigation', 2431 navigationPagination: false, 2432 drag: false, 2433 justifyContent: false, 2434 alignControls: false, 2435 overflowItems: false 2436 }; 2437 2438 window.Carousel = Carousel; 2439 2440 //initialize the Carousel objects 2441 var carousels = document.getElementsByClassName('js-carousel'), 2442 flexSupported = Util.cssSupports('align-items', 'stretch'), 2443 transitionSupported = Util.cssSupports('transition'), 2444 cssPropertiesSupported = ('CSS' in window && CSS.supports('color', 'var(--color-var)')); 2445 2446 if( carousels.length > 0) { 2447 for( var i = 0; i < carousels.length; i++) { 2448 (function(i){ 2449 var autoplay = (carousels[i].getAttribute('data-autoplay') && carousels[i].getAttribute('data-autoplay') == 'on') ? true : false, 2450 autoplayInterval = (carousels[i].getAttribute('data-autoplay-interval')) ? carousels[i].getAttribute('data-autoplay-interval') : 5000, 2451 drag = (carousels[i].getAttribute('data-drag') && carousels[i].getAttribute('data-drag') == 'on') ? true : false, 2452 loop = (carousels[i].getAttribute('data-loop') && carousels[i].getAttribute('data-loop') == 'off') ? false : true, 2453 nav = (carousels[i].getAttribute('data-navigation') && carousels[i].getAttribute('data-navigation') == 'on') ? true : false, 2454 navigationItemClass = carousels[i].getAttribute('data-navigation-item-class') ? carousels[i].getAttribute('data-navigation-item-class') : 'carousel__nav-item', 2455 navigationClass = carousels[i].getAttribute('data-navigation-class') ? carousels[i].getAttribute('data-navigation-class') : 'carousel__navigation', 2456 navigationPagination = (carousels[i].getAttribute('data-navigation-pagination') && carousels[i].getAttribute('data-navigation-pagination') == 'on') ? true : false, 2457 overflowItems = (carousels[i].getAttribute('data-overflow-items') && carousels[i].getAttribute('data-overflow-items') == 'on') ? true : false, 2458 alignControls = carousels[i].getAttribute('data-align-controls') ? carousels[i].getAttribute('data-align-controls') : false, 2459 justifyContent = (carousels[i].getAttribute('data-justify-content') && carousels[i].getAttribute('data-justify-content') == 'on') ? true : false; 2460 new Carousel({element: carousels[i], autoplay : autoplay, autoplayInterval : autoplayInterval, drag: drag, ariaLive: true, loop: loop, nav: nav, navigationItemClass: navigationItemClass, navigationPagination: navigationPagination, navigationClass: navigationClass, overflowItems: overflowItems, justifyContent: justifyContent, alignControls: alignControls}); 2461 })(i); 2462 } 2463 }; 2464}()); 2465// File#: _2_filterable-product-gallery 2466// Usage: codyhouse.co/license 2467// File#: _2_slideshow-preview-mode 2468// Usage: codyhouse.co/license 2469(function() { 2470 var SlideshowPrew = function(opts) { 2471 this.options = Util.extend(SlideshowPrew.defaults , opts); 2472 this.element = this.options.element; 2473 this.list = this.element.getElementsByClassName('js-slideshow-pm__list')[0]; 2474 this.items = this.list.getElementsByClassName('js-slideshow-pm__item'); 2475 this.controls = this.element.getElementsByClassName('js-slideshow-pm__control'); 2476 this.selectedSlide = 0; 2477 this.autoplayId = false; 2478 this.autoplayPaused = false; 2479 this.navigation = false; 2480 this.navCurrentLabel = false; 2481 this.ariaLive = false; 2482 this.moveFocus = false; 2483 this.animating = false; 2484 this.supportAnimation = Util.cssSupports('transition'); 2485 this.itemWidth = false; 2486 this.itemMargin = false; 2487 this.containerWidth = false; 2488 this.resizeId = false; 2489 // we will need this to implement keyboard nav 2490 this.firstFocusable = false; 2491 this.lastFocusable = false; 2492 // fallback for browsers not supporting flexbox 2493 initSlideshow(this); 2494 initSlideshowEvents(this); 2495 initAnimationEndEvents(this); 2496 Util.addClass(this.element, 'slideshow-pm--js-loaded'); 2497 }; 2498 2499 SlideshowPrew.prototype.showNext = function(autoplay) { 2500 showNewItem(this, this.selectedSlide + 1, 'next', autoplay); 2501 }; 2502 2503 SlideshowPrew.prototype.showPrev = function() { 2504 showNewItem(this, this.selectedSlide - 1, 'prev'); 2505 }; 2506 2507 SlideshowPrew.prototype.showItem = function(index) { 2508 showNewItem(this, index, false); 2509 }; 2510 2511 SlideshowPrew.prototype.startAutoplay = function() { 2512 var self = this; 2513 if(this.options.autoplay && !this.autoplayId && !this.autoplayPaused) { 2514 self.autoplayId = setInterval(function(){ 2515 self.showNext(true); 2516 }, self.options.autoplayInterval); 2517 } 2518 }; 2519 2520 SlideshowPrew.prototype.pauseAutoplay = function() { 2521 var self = this; 2522 if(this.options.autoplay) { 2523 clearInterval(self.autoplayId); 2524 self.autoplayId = false; 2525 } 2526 }; 2527 2528 function initSlideshow(slideshow) { // basic slideshow settings 2529 // if no slide has been selected -> select the first one 2530 if(slideshow.element.getElementsByClassName('slideshow-pm__item--selected').length < 1) Util.addClass(slideshow.items[0], 'slideshow-pm__item--selected'); 2531 slideshow.selectedSlide = Util.getIndexInArray(slideshow.items, slideshow.element.getElementsByClassName('slideshow-pm__item--selected')[0]); 2532 // now set translate value to the container element 2533 setTranslateValue(slideshow); 2534 setTranslate(slideshow); 2535 resetSlideshowNav(slideshow, 0, slideshow.selectedSlide); 2536 setFocusableElements(slideshow); 2537 // if flexbox is not supported, set a width for the list element 2538 if(!flexSupported) resetSlideshowFlexFallback(slideshow); 2539 // now add class to animate while translating 2540 setTimeout(function(){Util.addClass(slideshow.list, 'slideshow-pm__list--has-transition');}, 50); 2541 // add arai-hidden to not selected slides 2542 for(var i = 0; i < slideshow.items.length; i++) { 2543 (i == slideshow.selectedSlide) ? slideshow.items[i].removeAttribute('aria-hidden') : slideshow.items[i].setAttribute('aria-hidden', 'true'); 2544 } 2545 // create an element that will be used to announce the new visible slide to SR 2546 var srLiveArea = document.createElement('div');
2547 Util.setAttributes(srLiveArea, {'class': 'sr-only js-slideshow-pm__aria-live', 'aria-live': 'polite', 'aria-atomic': 'true'}); 2548 slideshow.element.appendChild(srLiveArea); 2549 slideshow.ariaLive = srLiveArea; 2550 }; 2551 2552 function initSlideshowEvents(slideshow) { 2553 // if slideshow navigation is on -> create navigation HTML and add event listeners 2554 if(slideshow.options.navigation) { 2555 var navigation = document.createElement('ol'), 2556 navChildren = ''; 2557 2558 navigation.setAttribute('class', 'slideshow-pm__navigation'); 2559 for(var i = 0; i < slideshow.items.length; i++) { 2560 var className = (i == slideshow.selectedSlide) ? 'class="slideshow-pm__nav-item slideshow-pm__nav-item--selected js-slideshow-pm__nav-item"' : 'class="slideshow-pm__nav-item js-slideshow-pm__nav-item"', 2561 navCurrentLabel = (i == slideshow.selectedSlide) ? '<span class="sr-only js-slideshow-pm__nav-current-label">Current Item</span>' : ''; 2562 navChildren = navChildren + '<li '+className+'><button class="reset"><span class="sr-only">'+ (i+1) + '</span>'+navCurrentLabel+'</button></li>'; 2563 } 2564 2565 navigation.innerHTML = navChildren; 2566 slideshow.navCurrentLabel = navigation.getElementsByClassName('js-slideshow-pm__nav-current-label')[0]; 2567 slideshow.element.appendChild(navigation); 2568 slideshow.navigation = slideshow.element.getElementsByClassName('js-slideshow-pm__nav-item'); 2569 2570 navigation.addEventListener('click', function(event){ 2571 navigateSlide(slideshow, event, true); 2572 }); 2573 navigation.addEventListener('keyup', function(event){ 2574 navigateSlide(slideshow, event, (event.key.toLowerCase() == 'enter')); 2575 }); 2576 } 2577 // slideshow arrow controls 2578 if(slideshow.controls.length > 0) { 2579 slideshow.controls[0].addEventListener('click', function(event){ 2580 event.preventDefault(); 2581 slideshow.showPrev(); 2582 updateAriaLive(slideshow); 2583 }); 2584 slideshow.controls[1].addEventListener('click', function(event){ 2585 event.preventDefault(); 2586 slideshow.showNext(false); 2587 updateAriaLive(slideshow); 2588 }); 2589 } 2590 // navigate slideshow when clicking on preview 2591 if(slideshow.options.prewNav) { 2592 slideshow.element.addEventListener('click', function(event){ 2593 var item = event.target.closest('.js-slideshow-pm__item'); 2594 if(item && !Util.hasClass(item, 'slideshow-pm__item--selected')) { 2595 slideshow.showItem(Util.getIndexInArray(slideshow.items, item)); 2596 } 2597 }); 2598 } 2599 // swipe events 2600 if(slideshow.options.swipe) { 2601 //init swipe 2602 new SwipeContent(slideshow.element); 2603 slideshow.element.addEventListener('swipeLeft', function(event){ 2604 slideshow.showNext(false); 2605 }); 2606 slideshow.element.addEventListener('swipeRight', function(event){ 2607 slideshow.showPrev(); 2608 }); 2609 } 2610 // autoplay 2611 if(slideshow.options.autoplay) { 2612 slideshow.startAutoplay(); 2613 // pause autoplay if user is interacting with the slideshow 2614 slideshow.element.addEventListener('mouseenter', function(event){ 2615 slideshow.pauseAutoplay(); 2616 slideshow.autoplayPaused = true; 2617 }); 2618 slideshow.element.addEventListener('focusin', function(event){ 2619 slideshow.pauseAutoplay(); 2620 slideshow.autoplayPaused = true; 2621 }); 2622 slideshow.element.addEventListener('mouseleave', function(event){ 2623 slideshow.autoplayPaused = false; 2624 slideshow.startAutoplay(); 2625 }); 2626 slideshow.element.addEventListener('focusout', function(event){ 2627 slideshow.autoplayPaused = false; 2628 slideshow.startAutoplay(); 2629 }); 2630 } 2631 // keyboard navigation 2632 initKeyboardEvents(slideshow); 2633 // reset on resize 2634 window.addEventListener('resize', function(event){ 2635 slideshow.pauseAutoplay(); 2636 clearTimeout(slideshow.resizeId); 2637 slideshow.resizeId = setTimeout(function(){ 2638 resetSlideshowResize(slideshow); 2639 setTimeout(function(){slideshow.startAutoplay();}, 60); 2640 }, 250) 2641 }); 2642 }; 2643 2644 function initKeyboardEvents(slideshow) { 2645 // tab on selected slide -> if last focusable -> move to prev or next arrow 2646 // tab + shift selected slide -> if first focusable -> move to container 2647 if(slideshow.controls.length > 0) { 2648 // tab+shift on prev arrow -> move focus to last focusable element inside the selected slide (or to the slider container) 2649 slideshow.controls[0].addEventListener('keydown', function(event){ 2650 if( (event.keyCode && event.keyCode == 9 || event.key && event.key == 'Tab') && event.shiftKey ) moveFocusToLast(slideshow); 2651 }); 2652 // tab+shift on next arrow -> if first slide selectes -> move focus to last focusable element inside the selected slide (or to the slider container) 2653 slideshow.controls[1].addEventListener('keydown', function(event){ 2654 if( (event.keyCode && event.keyCode == 9 || event.key && event.key == 'Tab') && event.shiftKey && (slideshow.selectedSlide == 0)) moveFocusToLast(slideshow); 2655 }); 2656 }
2657 // check tab is pressed when focus is inside selected slide 2658 slideshow.element.addEventListener('keydown', function(event){ 2659 if( event.keyCode && event.keyCode == 9 || event.key && event.key == 'Tab' ) { 2660 var target = event.target.closest('.js-slideshow-pm__item'); 2661 if(target && Util.hasClass(target, 'slideshow-pm__item--selected')) moveFocusOutsideSlide(slideshow, event); 2662 else if(target || Util.hasClass(event.target, 'js-slideshow-pm') && !event.shiftKey) moveFocusToSelectedSlide(slideshow); 2663 } 2664 }); 2665 2666 // detect tab moves to slideshow 2667 window.addEventListener('keyup', function(event){ 2668 if( event.keyCode && event.keyCode == 9 || event.key && event.key == 'Tab') { 2669 var target = event.target.closest('.js-slideshow-prew__item'); 2670 if(target || Util.hasClass(event.target, 'js-slideshow-prew') && !event.shiftKey) moveFocusToSelectedSlide(slideshow); 2671 } 2672 }); 2673 }; 2674 2675 function moveFocusToLast(slideshow) { 2676 event.preventDefault(); 2677 if(slideshow.lastFocusable) { 2678 slideshow.lastFocusable.focus(); 2679 } else { 2680 Util.moveFocus(slideshow.element); 2681 } 2682 }; 2683 2684 function moveFocusToSelectedSlide(slideshow) { // focus is inside a slide that is not selected 2685 event.preventDefault(); 2686 if(slideshow.firstFocusable) { 2687 slideshow.firstFocusable.focus(); 2688 } else if(slideshow.controls.length > 0) { 2689 (slideshow.selectedSlide == 0) ? slideshow.controls[1].getElementsByTagName('button')[0].focus() : slideshow.controls[0].getElementsByTagName('button')[0].focus(); 2690 } else if(slideshow.options.navigation) { 2691 slideshow.navigation.getElementsByClassName('js-slideshow-pm__nav-item')[0].getElementsByTagName('button')[0].focus(); 2692 } 2693 }; 2694 2695 function moveFocusOutsideSlide(slideshow, event) { 2696 if(event.shiftKey && slideshow.firstFocusable && event.target == slideshow.firstFocusable) { 2697 // shift+tab -> focus was on first foucusable element inside selected slide -> move to container 2698 event.preventDefault(); 2699 Util.moveFocus(slideshow.element); 2700 } else if( !event.shiftKey && slideshow.lastFocusable && event.target == slideshow.lastFocusable) { 2701 event.preventDefault(); 2702 2703 if(slideshow.selectedSlide != 0) slideshow.controls[0].getElementsByTagName('button')[0].focus(); 2704 else slideshow.controls[1].getElementsByTagName('button')[0].focus(); 2705 } 2706 }; 2707 2708 function initAnimationEndEvents(slideshow) { 2709 slideshow.list.addEventListener('transitionend', function(){ 2710 setTimeout(function(){ // add a delay between the end of animation and slideshow reset - improve animation performance 2711 resetAnimationEnd(slideshow); 2712 }, 100); 2713 }); 2714 }; 2715 2716 function resetAnimationEnd(slideshow) { 2717 if(slideshow.moveFocus) Util.moveFocus(slideshow.items[slideshow.selectedSlide]); 2718 slideshow.items[slideshow.selectedSlide].removeAttribute('aria-hidden'); 2719 slideshow.animating = false; 2720 slideshow.moveFocus = false; 2721 slideshow.startAutoplay(); 2722 }; 2723 2724 function navigateSlide(slideshow, event, keyNav) { 2725 // user has interacted with the slideshow navigation -> update visible slide 2726 var target = event.target.closest('.js-slideshow-pm__nav-item'); 2727 if(keyNav && target && !Util.hasClass(target, 'slideshow-pm__nav-item--selected')) { 2728 slideshow.showItem(Util.getIndexInArray(slideshow.navigation, target)); 2729 slideshow.moveFocus = true; 2730 updateAriaLive(slideshow); 2731 } 2732 }; 2733 2734 function showNewItem(slideshow, index, bool, autoplay) { 2735 if(slideshow.animating && slideshow.supportAnimation) return; 2736 if(autoplay) { 2737 if(index < 0) index = slideshow.items.length - 1; 2738 else if(index >= slideshow.items.length) index = 0; 2739 } 2740 if(index < 0 || index >= slideshow.items.length) return; 2741 slideshow.animating = true; 2742 Util.removeClass(slideshow.items[slideshow.selectedSlide], 'slideshow-pm__item--selected'); 2743 slideshow.items[slideshow.selectedSlide].setAttribute('aria-hidden', 'true'); //hide to sr element that is exiting the viewport 2744 Util.addClass(slideshow.items[index], 'slideshow-pm__item--selected'); 2745 resetSlideshowNav(slideshow, index, slideshow.selectedSlide); 2746 slideshow.selectedSlide = index; 2747 setTranslate(slideshow); 2748 slideshow.pauseAutoplay(); 2749 setFocusableElements(slideshow); 2750 if(!transitionSupported) resetAnimationEnd(slideshow); 2751 }; 2752 2753 function updateAriaLive(slideshow) { 2754 slideshow.ariaLive.innerHTML = 'Item '+(slideshow.selectedSlide + 1)+' of '+slideshow.items.length; 2755 }; 2756 2757 function resetSlideshowResize(slideshow) { 2758 Util.removeClass(slideshow.list, 'slideshow-pm__list--has-transition'); 2759 setTimeout(function(){ 2760 setTranslateValue(slideshow); 2761 setTranslate(slideshow); 2762 Util.addClass(slideshow.list, 'slideshow-pm__list--has-transition'); 2763 }, 30) 2764 }; 2765 2766 function setTranslateValue(slideshow) { 2767 var itemStyle = window.getComputedStyle(slideshow.items[slideshow.selectedSlide]); 2768 2769 slideshow.itemWidth = parseFloat(itemStyle.getPropertyValue('width')); 2770 slideshow.itemMargin = parseFloat(itemStyle.getPropertyValue('margin-right')); 2771 slideshow.containerWidth = parseFloat(window.getComputedStyle(slideshow.element).getPropertyValue('width')); 2772 }; 2773 2774 function setTranslate(slideshow) { 2775 var translate = parseInt(((slideshow.itemWidth + slideshow.itemMargin) *
2775slideshow.selectedSlide * (-1)) + ((slideshow.containerWidth - slideshow.itemWidth)*0.5)); 2776 slideshow.list.style.transform = 'translateX('+translate+'px)'; 2777 slideshow.list.style.msTransform = 'translateX('+translate+'px)'; 2778 }; 2779 2780 function resetSlideshowNav(slideshow, newIndex, oldIndex) { 2781 if(slideshow.navigation) { 2782 Util.removeClass(slideshow.navigation[oldIndex], 'slideshow-pm__nav-item--selected'); 2783 Util.addClass(slideshow.navigation[newIndex], 'slideshow-pm__nav-item--selected'); 2784 slideshow.navCurrentLabel.parentElement.removeChild(slideshow.navCurrentLabel); 2785 slideshow.navigation[newIndex].getElementsByTagName('button')[0].appendChild(slideshow.navCurrentLabel); 2786 } 2787 if(slideshow.controls.length > 0) { 2788 Util.toggleClass(slideshow.controls[0], 'slideshow-pm__control--active', newIndex != 0); 2789 Util.toggleClass(slideshow.controls[1], 'slideshow-pm__control--active', newIndex != (slideshow.items.length - 1)); 2790 } 2791 }; 2792 2793 function setFocusableElements(slideshow) { 2794 //get all focusable elements inside the selected slide 2795 var allFocusable = slideshow.items[slideshow.selectedSlide].querySelectorAll('[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex]:not([tabindex="-1"]), [contenteditable], audio[controls], video[controls], summary'); 2796 getFirstVisible(slideshow, allFocusable); 2797 getLastVisible(slideshow, allFocusable); 2798 }; 2799 2800 function getFirstVisible(slideshow, elements) { 2801 slideshow.firstFocusable = false; 2802 //get first visible focusable element inside the selected slide 2803 for(var i = 0; i < elements.length; i++) { 2804 if( elements[i].offsetWidth || elements[i].offsetHeight || elements[i].getClientRects().length ) { 2805 slideshow.firstFocusable = elements[i]; 2806 return true; 2807 } 2808 } 2809 }; 2810 2811 function getLastVisible(slideshow, elements) { 2812 //get last visible focusable element inside the selected slide 2813 slideshow.lastFocusable = false; 2814 for(var i = elements.length - 1; i >= 0; i--) { 2815 if( elements[i].offsetWidth || elements[i].offsetHeight || elements[i].getClientRects().length ) { 2816 slideshow.lastFocusable = elements[i]; 2817 return true; 2818 } 2819 } 2820 }; 2821 2822 function resetSlideshowFlexFallback(slideshow) {
2823 slideshow.list.style.width = ((slideshow.items.length+1)*(slideshow.itemMargin+slideshow.itemWidth))+'px'; 2824 for(var i = 0; i < slideshow.items.length; i++) {slideshow.items[i].style.width = slideshow.itemWidth+'px';} 2825 }; 2826 2827 SlideshowPrew.defaults = { 2828 element : '', 2829 navigation : true, 2830 autoplay : false, 2831 autoplayInterval: 5000, 2832 prewNav: false, 2833 swipe: false 2834 }; 2835 2836 window.SlideshowPrew = SlideshowPrew; 2837 2838 // initialize the slideshowsPrew objects 2839 var slideshowsPrew = document.getElementsByClassName('js-slideshow-pm'), 2840 flexSupported = Util.cssSupports('align-items', 'stretch'), 2841 transitionSupported = Util.cssSupports('transition'); 2842 if( slideshowsPrew.length > 0 ) { 2843 for( var i = 0; i < slideshowsPrew.length; i++) { 2844 (function(i){ 2845 var navigation = (slideshowsPrew[i].getAttribute('data-navigation') && slideshowsPrew[i].getAttribute('data-navigation') == 'off') ? false : true, 2846 autoplay = (slideshowsPrew[i].getAttribute('data-autoplay') && slideshowsPrew[i].getAttribute('data-autoplay') == 'on') ? true : false, 2847 autoplayInterval = (slideshowsPrew[i].getAttribute('data-autoplay-interval')) ? slideshowsPrew[i].getAttribute('data-autoplay-interval') : 5000, 2848 prewNav = (slideshowsPrew[i].getAttribute('data-pm-nav') && slideshowsPrew[i].getAttribute('data-pm-nav') == 'on' ) ? true : false, 2849 swipe = (slideshowsPrew[i].getAttribute('data-swipe') && slideshowsPrew[i].getAttribute('data-swipe') == 'on') ? true : false; 2850 new SlideshowPrew({element: slideshowsPrew[i], navigation: navigation, autoplay : autoplay, autoplayInterval : autoplayInterval, swipe : swipe, prewNav: prewNav}); 2851 })(i); 2852 } 2853 } 2854 2855}()); 2856 2857/** 2858 * 2859 - ultra slim jQuery lightbox 2860 * Version 1.7.13 - http://noelboss.github.io/featherlight/ 2861 * 2862 * Copyright 2018, Noël Raoul Bossart (http://www.noelboss.com) 2863 * MIT Licensed. 2864**/ 2865!function(a){"use strict";function b(a,c){if(!(this instanceof b)){var d=new b(a,c);return d.open(),d}this.id=b.id++,this.setup(a,c),this.chainCallbacks(b._callbackChain)}function c(a,b){var c={};for(var d in a)d in b&&(c[d]=a[d],delete a[d]);return c}function d(a,b){var c={},d=new RegExp("^"+b+"([A-Z])(.*)");for(var e in a){var f=e.match(d);if(f){var g=(f[1]+f[2].replace(/([A-Z])/g,"-$1")).toLowerCase();c[g]=a[e]}}return c}if("undefined"==typeof a)return void("console"in window&&window.console.info("Too much lightness, Featherlight needs jQuery."));if(a.fn.jquery.match(/-ajax/))return void("console"in window&&window.console.info("Featherlight needs regular jQuery, not the slim version."));var e=[],f=function(b){return e=a.grep(e,function(a){return a!==b&&a.$instance.closest("body").length>0})},g={allow:1,allowfullscreen:1,frameborder:1,height:1,longdesc:1,marginheight:1,marginwidth:1,mozallowfullscreen:1,name:1,referrerpolicy:1,sandbox:1,scrolling:1,src:1,srcdoc:1,style:1,webkitallowfullscreen:1,width:1}
vendor: 8,351 bytes, lines 2865-2866
2865,h={keyup:"onKeyUp",resize:"onResize"},i=function(c){a.each(b.opened().reverse(),function(){return c.isDefaultPrevented()||!1!==this[h[c.type]](c)?void 0:(c.preventDefault(),c.stopPropagation(),!1)})},j=function(c){if(c!==b._globalHandlerInstalled){b._globalHandlerInstalled=c;var d=a.map(h,function(a,c){return c+"."+b.prototype.namespace}).join(" ");a(window)[c?"on":"off"](d,i)}};b.prototype={constructor:b,namespace:"featherlight",targetAttr:"data-featherlight",variant:null,resetCss:!1,background:null,openTrigger:"click",closeTrigger:"click",filter:null,root:"body",openSpeed:250,closeSpeed:250,closeOnClick:"background",closeOnEsc:!0,closeIcon:"✕",loading:"",persist:!1,otherClose:null,beforeOpen:a.noop,beforeContent:a.noop,beforeClose:a.noop,afterOpen:a.noop,afterContent:a.noop,afterClose:a.noop,onKeyUp:a.noop,onResize:a.noop,type:null,contentFilters:["jquery","image","html","ajax","iframe","text"],setup:function(b,c){"object"!=typeof b||b instanceof a!=!1||c||(c=b,b=void 0);var d=a.extend(this,c,{target:b}),e=d.resetCss?d.namespace+"-reset":d.namespace,f=a(d.background||['<div class="'+e+"-loading "+e+'">','<div class="'+e+'-content">','<button class="'+e+"-close-icon "+d.namespace+'-close" aria-label="Close">',d.closeIcon,"</button>",'<div class="'+d.namespace+'-inner">'+d.loading+"</div>","</div>","</div>"].join("")),g="."+d.namespace+"-close"+(d.otherClose?","+d.otherClose:"");return d.$instance=f.clone().addClass(d.variant),d.$instance.on(d.closeTrigger+"."+d.namespace,function(b){if(!b.isDefaultPrevented()){var c=a(b.target);("background"===d.closeOnClick&&c.is("."+d.namespace)||"anywhere"===d.closeOnClick||c.closest(g).length)&&(d.close(b),b.preventDefault())}}),this},getContent:function(){if(this.persist!==!1&&this.$content)return this.$content;var b=this,c=this.constructor.contentFilters,d=function(a){return b.$currentTarget&&b.$currentTarget.attr(a)},e=d(b.targetAttr),f=b.target||e||"",g=c[b.type];if(!g&&f in c&&(g=c[f],f=b.target&&e),f=f||d("href")||"",!g)for(var h in c)b[h]&&(g=c[h],f=b[h]);if(!g){var i=f;if(f=null,a.each(b.contentFilters,function(){return g=c[this],g.test&&(f=g.test(i)),!f&&g.regex&&i.match&&i.match(g.regex)&&(f=i),!f}),!f)return"console"in window&&window.console.error("Featherlight: no content filter found "+(i?' for "'+i+'"':" (no target specified)")),!1}return g.process.call(b,f)},setContent:function(b){return this.$instance.removeClass(this.namespace+"-loading"),this.$instance.toggleClass(this.namespace+"-iframe",b.is("iframe")),this.$instance.find("."+this.namespace+"-inner").not(b).slice(1).remove().end().replaceWith(a.contains(this.$instance[0],b[0])?"":b),this.$content=b.addClass(this.namespace+"-inner"),this},open:function(b){var c=this;if(c.$instance.hide().appendTo(c.root),!(b&&b.isDefaultPrevented()||c.beforeOpen(b)===!1)){b&&b.preventDefault();var d=c.getContent();if(d)return e.push(c),j(!0),c.$instance.fadeIn(c.openSpeed),c.beforeContent(b),a.when(d).always(function(a){c.setContent(a),c.afterContent(b)}).then(c.$instance.promise()).done(function(){c.afterOpen(b)})}return c.$instance.detach(),a.Deferred().reject().promise()},close:function(b){var c=this,d=a.Deferred();return c.beforeClose(b)===!1?d.reject():(0===f(c).length&&j(!1),c.$instance.fadeOut(c.closeSpeed,function(){c.$instance.detach(),c.afterClose(b),d.resolve()})),d.promise()},resize:function(a,b){if(a&&b){this.$content.css("width","").css("height","");var c=Math.max(a/(this.$content.parent().width()-1),b/(this.$content.parent().height()-1));c>1&&(c=b/Math.floor(b/c),this.$content.css("width",""+a/c+"px").css("height",""+b/c+"px"))}},chainCallbacks:function(b){for(var c in b)this[c]=a.proxy(b[c],this,a.proxy(this[c],this))}},a.extend(b,{id:0,autoBind:"[data-featherlight]",defaults:b.prototype,contentFilters:{jquery:{regex:/^[#.]\w/,test:function(b){return b instanceof a&&b},process:function(b){return this.persist!==!1?a(b):a(b).clone(!0)}},image:{regex:/\.(png|jpg|jpeg|gif|tiff?|bmp|svg)(\?\S*)?$/i,process:function(b){var c=this,d=a.Deferred(),e=new Image,f=a('<img src="'+b+'" alt="" class="'+c.namespace+'-image" />');return e.onload=function(){f.naturalWidth=e.width,f.naturalHeight=e.height,d.resolve(f)},e.onerror=function(){d.reject(f)},e.src=b,d.promise()}},html:{regex:/^\s*<[\w!][^<]*>/,process:function(b){return a(b)}},ajax:{regex:/./,process:function(b){var c=a.Deferred(),d=a("<div></div>").load(b,function(a,b){"error"!==b&&c.resolve(d.contents()),c.fail()});return c.promise()}},iframe:{process:function(b){var e=new a.Deferred,f=a("<iframe/>"),h=d(this,"iframe"),i=c(h,g);return f.hide().attr("src",b).attr(i).css(h).on("load",function(){e.resolve(f.show())}).appendTo(this.$instance.find("."+this.namespace+"-content")),e.promise()}},text:{process:function(b){return a("<div>",{text:b})}}},functionAttributes:["beforeOpen","afterOpen","beforeContent","afterContent","beforeClose","afterClose"],readElementConfig:function(b,c){var d=this,e=new RegExp("^data-"+c+"-(.*)"),f={};return b&&b.attributes&&a.each(b.attributes,function(){var b=this.name.match(e);if(b){var c=this.value,g=a.camelCase(b[1]);if(a.inArray(g,d.functionAttributes)>=0)c=new Function(c);else try{c=JSON.parse(c)}catch(h){}f[g]=c}}),f},extend:function(b,c){var d=function(){this.constructor=b};return d.prototype=this.prototype,b.prototype=new d,b.__super__=this.prototype,a.extend(b,this,c),b.defaults=b.prototype,b},attach:function(b,c,d){var e=this;"object"!=typeof c||c instanceof a!=!1||d||(d=c,c=void 0),d=a.extend({},d);var f,g=d.namespace||e.defaults.namespace,h=a.extend({},e.defaults,e.readElementConfig(b[0],g),d),i=function(g){var i=a(g.currentTarget),j=a.extend({$source:b,$currentTarget:i},e.readElementConfig(b[0],h.namespace),e.readElementConfig(g.currentTarget,h.namespace),d),k=f||i.data("featherlight-persisted")||new e(c,j);"shared"===k.persist?f=k:k.persist!==!1&&i.data("featherlight-persisted",k),j.$currentTarget.blur&&j.$currentTarget.blur(),k.open(g)};return b.on(h.openTrigger+"."+h.namespace,h.filter,i),{filter:h.filter,handler:i}},current:function(){var a=this.opened();return a[a.length-1]||null},opened:function(){var b=this;return f(),a.grep(e,function(a){return a instanceof b})},close:function(a){var b=this.current();return b?b.close(a):void 0},_onReady:function(){var b=this;if(b.autoBind){var c=a(b.autoBind);c.each(function(){b.attach(a(this))}),a(document).on("click",b.autoBind,function(d){if(!d.isDefaultPrevented()){var e=a(d.currentTarget),f=c.length;if(c=c.add(e),f!==c.length){var g=b.attach(e);(!g.filter||a(d.target).parentsUntil(e,g.filter).length>0)&&g.handler(d)}}})}},_callbackChain:{onKeyUp:function(b,c){return 27===c.keyCode?(this.closeOnEsc&&a.featherlight.close(c),!1):b(c)},beforeOpen:function(b,c){return a(document.documentElement).addClass("with-featherlight"),this._previouslyActive=document.activeElement,this._$previouslyTabbable=a("a, input, select, textarea, iframe, button, iframe, [contentEditable=true]").not("[tabindex]").not(this.$instance.find("button")),this._$previouslyWithTabIndex=a("[tabindex]").not('[tabindex="-1"]'),this._previousWithTabIndices=this._$previouslyWithTabIndex.map(function(b,c){return a(c).attr("tabindex")}),this._$previouslyWithTabIndex.add(this._$previouslyTabbable).attr("tabindex",-1),document.activeElement.blur&&document.activeElement.blur(),b(c)},afterClose:function(c,d){var e=c(d),f=this;return this._$previouslyTabbable.removeAttr("tabindex"),this._$previouslyWithTabIndex.each(function(b,c){a(c).attr("tabindex",f._previousWithTabIndices[b])}),this._previouslyActive.focus(),0===b.opened().length&&a(document.documentElement).removeClass("with-featherlight"),e},onResize:function(a,b){return this.resize(this.$content.naturalWidth,this.$content.naturalHeight),a(b)},afterContent:function(a,b){var c=a(b);return this.$instance.find("[autofocus]:not([disabled])").focus(),this.onResize(b),c}}}),a.featherlight=b,a.fn.featherlight=function(a,c){return b.attach(this,a,c),this},a(document).ready(function(){b._onReady()})}(jQuery); 2866window.FontAwesomeKitConfig = {"asyncLoading":{"enabled":false},"autoA11y":{"enabled":true},"baseUrl":"https://ka-f.fontawesome.com","baseUrlKit":"https://kit.fontawesome.com","detectConflictsUntil":null,"iconUploads":{},"id":84529708,"license":"free","method":"css","minify":{"enabled":true},"token":"b50c4bb10d","v4FontFaceShim":{"enabled":true}
2866,"v4shim":{"enabled":true},"version":"5.15.3"}; 2867!function(t){"function"==typeof define&&define.amd?define("kit-loader",t):t()}((function(){"use strict";function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(e)}function e(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function n(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function r(t){for(var r=1;r<arguments.length;r++){var o=null!=arguments[r]?arguments[r]:{};r%2?n(Object(o),!0).forEach((function(n){e(t,n,o[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(o)):n(Object(o)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(o,e))}))}return t}function o(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(t)))return;var n=[],r=!0,o=!1,i=void 0;try{for(var c,a=t[Symbol.iterator]();!(r=(c=a.next()).done)&&(n.push(c.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{r||null==a.return||a.return()}finally{if(o)throw i}}return n}(t,e)||function(t,e){if(!t)return;if("string"==typeof t)return i(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Array.from(t);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return i(t,e)}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n<e;n++)r[n]=t[n];return r}function c(t,e){var n=e&&e.addOn||"",r=e&&e.baseFilename||t.license+n,o=e&&e.minify?".min":"",i=e&&e.fileSuffix||t.method,c=e&&e.subdir||t.method;return t.baseUrl+"/releases/"+("latest"===t.version?"latest":"v".concat(t.version))+"/"+c+"/"+r+o+"."+i}function a(t){return t.baseUrlKit+"/"+t.token+"/"+t.id+"/kit-upload.css"}function u(t,e){var n=e||["fa"],r="."+Array.prototype.join.call(n,",."),o=t.querySelectorAll(r);Array.prototype.forEach.call(o,(function(e){var n=e.getAttribute("title");e.setAttribute("aria-hidden","true");var r=!e.nextElementSibling||!e.nextElementSibling.classList.contains("sr-only");if(n&&r){var o=t.createElement("span");o.innerHTML=n,o.classList.add("sr-only"),e.parentNode.insertBefore(o,e.nextSibling)}}))}var f,s=function(){},d="undefined"!=typeof global&&void 0!==global.process&&"function"==typeof global.process.emit,l="undefined"==typeof setImmediate?setTimeout:setImmediate,h=[];function m(){for(var t=0;t<h.length;t++)h[t][0](h[t][1]);h=[],f=!1}function p(t,e){h.push([t,e]),f||(f=!0,l(m,0))}function y(t){var e=t.owner,n=e._state,r=e._data,o=t[n],i=t.then;if("function"==typeof o){n="fulfilled";try{r=o(r)}catch(t){w(i,t)}}b(i,r)||("fulfilled"===n&&v(i,r),"rejected"===n&&w(i,r))}function b(e,n){var r;try{if(e===n)throw new TypeError("A promises callback cannot return that same promise.");if(n&&("function"==typeof n||"object"===t(n))){var o=n.then;if("function"==typeof o)return o.call(n,(function(t){r||(r=!0,n===t?g(e,t):v(e,t))}),(function(t){r||(r=!0,w(e,t))})),!0}}catch(t){return r||w(e,t),!0}return!1}function v(t,e){t!==e&&b(t,e)||g(t,e)}function g(t,e){"pending"===t._state&&(t._state="settled",t._data=e,p(S,t))}function w(t,e){"pending"===t._state&&(t._state="settled",t._data=e,p(O,t))}function A(t){t._then=t._then.forEach(y)}function S(t){t._state="fulfilled",A(t)}function O(t){t._state="rejected",A(t),!t._handled&&d&&global.process.emit("unhandledRejection",t._data,t)}function j(t){global.process.emit("rejectionHandled",t)}function E(t){if("function"!=typeof t)throw new TypeError("Promise resolver "+t+" is not a function");if(this instanceof E==!1)throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object c
2867onstructor cannot be called as a function.");this._then=[],function(t,e){function n(t){w(e,t)}try{t((function(t){v(e,t)}),n)}catch(t){n(t)}}(t,this)}E.prototype={constructor:E,_state:"pending",_then:null,_data:void 0,_handled:!1,then:function(t,e){var n={owner:this,then:new this.constructor(s),fulfilled:t,rejected:e};return!e&&!t||this._handled||(this._handled=!0,"rejected"===this._state&&d&&p(j,this)),"fulfilled"===this._state||"rejected"===this._state?p(y,n):this._then.push(n),n.then},catch:function(t){return this.then(null,t)}},E.all=function(t){if(!Array.isArray(t))throw new TypeError("You must pass an array to Promise.all().");return new E((function(e,n){var r=[],o=0;function i(t){return o++,function(n){r[t]=n,--o||e(r)}}for(var c,a=0;a<t.length;a++)(c=t[a])&&"function"==typeof c.then?c.then(i(a),n):r[a]=c;o||e(r)}))},E.race=function(t){if(!Array.isArray(t))throw new TypeError("You must pass an array to Promise.race().");return new E((function(e,n){for(var r,o=0;o<t.length;o++)(r=t[o])&&"function"==typeof r.then?r.then(e,n):e(r)}))},E.resolve=function(e){return e&&"object"===t(e)&&e.constructor===E?e:new E((function(t){t(e)}))}
2867,E.reject=function(t){return new E((function(e,n){n(t)}))};var _="function"==typeof Promise?Promise:E;function P(t,e){var n=e.fetch,r=e.XMLHttpRequest,o=e.token,i=t;return"URLSearchParams"in window?(i=new URL(t)).searchParams.set("token",o):i=i+"?token="+encodeURIComponent(o),i=i.toString(),new _((function(t,e){if("function"==typeof n)n(i,{mode:"cors",cache:"default"}).then((function(t){if(t.ok)return t.text();throw new Error("")})).then((function(e){t(e)})).catch(e);else if("function"==typeof r){var o=new r;o.addEventListener("loadend",(function(){this.responseText?t(this.responseText):e(new Error(""))}));["abort","error","timeout"].map((function(t){o.addEventListener(t,(function(){e(new Error(""))}))})),o.open("GET",i),o.send()}else{e(new Error(""))}}))}function C(t,e,n){var r=t;return[[/(url\("?)\.\.\/\.\.\/\.\./g,function(t,n){return"".concat(n).concat(e)}],[/(url\("?)\.\.\/webfonts/g,function(t,r){return"".concat(r).concat(e,"/releases/v").concat(n,"/webfonts")}],[/(url\("?)https:\/\/kit-free([^.])*\.fontawesome\.com/g,function(t,n){return"".concat(n).concat(e)}
2867]].forEach((function(t){var e=o(t,2),n=e[0],i=e[1];r=r.replace(n,i)})),r}function F(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},o=e.document||o,i=u.bind(u,o,["fa","fab","fas","far","fal","fad","fak"]),f=Object.keys(t.iconUploads||{}).length>0;t.autoA11y.enabled&&n(i);var s=[{id:"fa-main",addOn:void 0}];t.v4shim.enabled&&s.push({id:"fa-v4-shims",addOn:"-v4-shims"}),t.v4FontFaceShim.enabled&&s.push({id:"fa-v4-font-face",addOn:"-v4-font-face"}),f&&s.push({id:"fa-kit-upload",customCss:!0});var d=s.map((function(n){return new _((function(o,i){P(n.customCss?a(t):c(t,{addOn:n.addOn,minify:t.minify.enabled}),e).then((function(i){o(U(i,r(r({},e),{},{baseUrl:t.baseUrl,version:t.version,id:n.id,contentFilter:function(t,e){return C(t,e.baseUrl,e.version)}})))})).catch(i)}))}));return _.all(d)}function U(t,e){var n=e.contentFilter||function(t,e){return t},r=document.createElement("style"),o=document.createTextNode(n(t,e));return r.appendChild(o),r.media="all",e.id&&r.setAttribute("id",e.id),e&&e.detectingConflicts&&e.detectionIgnoreAttr&&r.setAttributeNode(document.createAttribute(e.detectionIgnoreAttr)),r}function k(t,e){e.autoA11y=t.autoA11y.enabled,"pro"===t.license&&(e.autoFetchSvg=!0,e.fetchSvgFrom=t.baseUrl+"/releases/"+("latest"===t.version?"latest":"v".concat(t.version))+"/svgs",e.fetchUploadedSvgFrom=t.uploadsUrl);var n=[];return t.v4shim.enabled&&n.push(new _((function(n,o){P(c(t,{addOn:"-v4-shims",minify:t.minify.enabled}),e).then((function(t){n(I(t,r(r({},e),{},{id:"fa-v4-shims"})))})).catch(o)}))),n.push(new _((function(n,o){P(c(t,{minify:t.minify.enabled}),e).then((function(t){var o=I(t,r(r({},e),{},{id:"fa-main"}));n(function(t,e){var n=e&&void 0!==e.autoFetchSvg?e.autoFetchSvg:void 0,r=e&&void 0!==e.autoA11y?e.autoA11y:void 0;void 0!==r&&t.setAttribute("data-auto-a11y",r?"true":"false");n&&(t.setAttributeNode(document.createAttribute("data-auto-fetch-svg")),t.setAttribute("data-fetch-svg-from",e.fetchSvgFrom),t.setAttribute("data-fetch-uploaded-svg-from",e.fetchUploadedSvgFrom));return t}(o,e))})).catch(o)}))),_.all(n)}function I(t,e){var n=document.createElement("SCRIPT"),r=document.createTextNode(t);return n.appendChild(r),n.referrerPolicy="strict-origin",e.id&&n.setAttribute("id",e.id),e&&e.detectingConflicts&&e.detectionIgnoreAttr&&n.setAttributeNode(document.createAttribute(e.detectionIgnoreAttr)),n}function L(t){var e,n=[],r=document,o=r.documentElement.doScroll,i=(o?/^loaded|^c/:/^loaded|^i|^c/).test(r.readyState);i||r.addEventListener("DOMContentLoaded",e=function(){for(r.removeEventListener("DOMContentLoaded",e),i=1;e=n.shift();)e()}),i?setTimeout(t,0):n.push(t)}function T(t){"undefined"!=typeof MutationObserver&&new MutationObserver(t).observe(document,{childList:!0,subtree:!0})}try{if(window.FontAwesomeKitConfig){var x=window.FontAwesomeKitConfig,M={detectingConflicts:x.detectConflictsUntil&&new Date<=new Date(x.detectConflictsUntil),detectionIgnoreAttr:"data-fa-detection-ignore",fetch:window.fetch,token:x.token,XMLHttpRequest:window.XMLHttpRequest,document:document},D=document.currentScript,N=D?D.parentElement:document.head;(function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return"js"===t.method?k(t,e):"css"===t.method?F(t,e,(function(t){L(t),T(t)})):void 0})(x,M).then((function(t){t.map((function(t){try{N.insertBefore(t,D?D.nextSibling:null)}catch(e){N.appendChild(t)}})),M.detectingConflicts&&D&&L((function(){D.setAttributeNode(document.createAttribute(M.detectionIgnoreAttr));var t=function(t,e){var n=document.createElement("script");return e&&e.detectionIgnoreAttr&&n.setAttributeNode(document.createAttribute(e.detectionIgnoreAttr)),n.src=c(t,{baseFilename:"conflict-detection",fileSuffix:"js",subdir:"js",minify:t.minify.enabled}),n}(x,M);document.body.appendChild(t)}))})).catch((function(t){console.error("".concat("Font Awesome Kit:"," ").concat(t))}))}}catch(t){console.error("".concat("Font Awesome Kit:"," ").concat(t))}})); 2868/** 2869* jquery-match-height master by @liabru 2870* http://brm.io/jquery-match-height/ 2871* License: MIT 2872*/ 2873 2874;(function(factory) { // eslint-disable-line no-extra-semi 2875 'use strict'; 2876 if (typeof define === 'function' && define.amd) { 2877 // AMD 2878 define(['jquery'], factory); 2879 } else if (typeof module !== 'undefined' && module.exports) { 2880 // CommonJS 2881 module.exports = factory(require('jquery')); 2882 } else { 2883 // Global 2884 factory(jQuery); 2885 } 2886})(function($) { 2887 /* 2888 * internal 2889 */ 2890 2891 var _previousResizeWidth = -1, 2892 _updateTimeout = -1; 2893 2894 /* 2895 * _parse 2896 * value parse utility function 2897 */ 2898 2899 var _parse = function(value) { 2900 // parse value and convert NaN to 0 2901 return parseFloat(value) || 0; 2902 }; 2903 2904 /* 2905 * _rows 2906 * utility function returns array of jQuery selections representing each row 2907 * (as displayed after float wrapping applied by browser) 2908 */ 2909 2910 var _rows = function(elements) { 2911 var tolerance = 1, 2912 $elements = $(elements), 2913 lastTop = null, 2914 rows = []; 2915 2916 // group elements by their top position 2917 $elements.each(function(){ 2918 var $that = $(this), 2919 top = $that.offset().top - _parse($that.css('margin-top')), 2920 lastRow = rows.length > 0 ? rows[rows.length - 1] : null; 2921 2922 if (lastRow === null) { 2923 // first item on the row, so just push it 2924 rows.push($that); 2925 } else { 2926 // if the row top is the same, add to the row group 2927 if (Math.floor(Math.abs(lastTop - top)) <= tolerance) { 2928 rows[rows.length - 1] = lastRow.add($that); 2929 } else { 2930 // otherwise start a new row group 2931 rows.push($that); 2932 } 2933 } 2934 2935 // keep track of the last row top 2936 lastTop = top; 2937 }); 2938 2939 return rows; 2940 }; 2941 2942 /* 2943 * _parseOptions 2944 * handle plugin options 2945 */ 2946 2947 var _parseOptions = function(options) { 2948 var opts = { 2949 byRow: true, 2950 property: 'height', 2951 target: null, 2952 remove: false 2953 }; 2954 2955 if (typeof options === 'object') { 2956 return $.extend(opts, options); 2957 } 2958 2959 if (typeof options === 'boolean') { 2960 opts.byRow = options; 2961 } else if (options === 'remove') { 2962 opts.remove = true; 2963 } 2964 2965 return opts; 2966 }; 2967 2968 /* 2969 * matchHeight 2970 * plugin definition 2971 */ 2972 2973 var matchHeight = $.fn.matchHeight = function(options) { 2974 var opts = _parseOptions(options); 2975 2976 // handle remove 2977 if (opts.remove) { 2978 var that = this; 2979 2980 // remove fixed height from all selected elements 2981 this.css(opts.property, ''); 2982 2983 // remove selected elements from all groups 2984 $.each(matchHeight._groups, function(key, group) { 2985 group.elements = group.elements.not(that); 2986 }); 2987 2988 // TODO: cleanup empty groups 2989 2990 return this; 2991 } 2992 2993 if (this.length <= 1 && !opts.target) { 2994 return this; 2995 } 2996 2997 // keep track of this group so we can re-apply later on load and resize events 2998 matchHeight._groups.push({ 2999 elements: this, 3000 options: opts 3001 }); 3002 3003 // match each element's height to the tallest element in the selection 3004 matchHeight._apply(this, opts); 3005 3006 return this; 3007 }; 3008 3009 /* 3010 * plugin global options 3011 */ 3012 3013 matchHeight.version = 'master'; 3014 matchHeight._groups = []; 3015 matchHeight._throttle = 80; 3016 matchHeight._maintainScroll = false; 3017 matchHeight._beforeUpdate = null; 3018 matchHeight._afterUpdate = null; 3019 matchHeight._rows = _rows; 3020 matchHeight._parse = _parse; 3021 matchHeight._parseOptions = _parseOptions; 3022 3023 /* 3024 * matchHeight._apply 3025 * apply matchHeight to given elements 3026 */ 3027 3028 matchHeight._apply = function(elements, options) { 3029 var opts = _parseOptions(options), 3030 $elements = $(elements), 3031 rows = [$elements]; 3032 3033 // take note of scroll position 3034 var scrollTop = $(window).scrollTop(), 3035 htmlHeight = $('html').outerHeight(true); 3036 3037 // get hidden parents 3038 var $hiddenParents = $elements.parents().filter(':hidden'); 3039 3040 // cache the original inline style 3041 $hiddenParents.each(function() { 3042 var $that = $(this); 3043 $that.data('style-cache', $that.attr('style')); 3044 }); 3045 3046 // temporarily must force hidden parents visible 3047 $hiddenParents.css('display', 'block'); 3048 3049 // get rows if using byRow, otherwise assume one row 3050 if (opts.byRow && !opts.target) { 3051 3052 // must first force an arbitrary equal height so floating elements break evenly 3053 $elements.each(function() { 3054 var $that = $(this), 3055 display = $that.css('display'); 3056 3057 // temporarily force a usable display value 3058 if (display !== 'inline-block' && display !== 'flex' && display !== 'inline-flex') { 3059 display = 'block'; 3060 } 3061 3062 // cache the original inline style 3063 $that.data('style-cache', $that.attr('style')); 3064 3065 $that.css({ 3066 'display': display, 3067 'padding-top': '0', 3068 'padding-bottom': '0', 3069 'margin-top': '0', 3070 'margin-bottom': '0', 3071 'border-top-width': '0', 3072 'border-bottom-width': '0', 3073 'height': '100px', 3074 'overflow': 'hidden' 3075 }); 3076 }); 3077 3078 // get the array of rows (based on element top position) 3079 rows = _rows($elements); 3080 3081 // revert original inline styles 3082 $elements.each(function() { 3083 var $that = $(this); 3084 $that.attr('style', $that.data('style-cache') || ''); 3085 }); 3086 } 3087 3088 $.each(rows, function(key, row) { 3089 var $row = $(row), 3090 targetHeight = 0; 3091 3092 if (!opts.target) { 3093 // skip apply to rows with only one item 3094 if (opts.byRow && $row.length <= 1) { 3095 $row.css(opts.property, ''); 3096 return; 3097 } 3098 3099 // iterate the row and find the max height 3100 $row.each(function(){ 3101 var $that = $(this), 3102 style = $that.attr('style'), 3103 display = $that.css('display'); 3104 3105 // temporarily force a usable display value 3106 if (display !== 'inline-block' && display !== 'flex' && display !== 'inline-flex') { 3107 display = 'block'; 3108 } 3109 3110 // ensure we get the correct actual height (and not a previously set height value) 3111 var css = { 'display': display }; 3112 css[opts.property] = ''; 3113 $that.css(css); 3114 3115 // find the max height (including padding, but not margin) 3116 if ($that.outerHeight(false) > targetHeight) { 3117 targetHeight = $that.outerHeight(false); 3118 } 3119 3120 // revert styles 3121 if (style) { 3122 $that.attr('style', style); 3123 } else { 3124 $that.css('display', ''); 3125 } 3126 }); 3127 } else { 3128 // if target set, use the height of the target element 3129 targetHeight = opts.target.outerHeight(false); 3130 } 3131 3132 // iterate the row and apply the height to all elements 3133 $row.each(function(){ 3134 var $that = $(this), 3135 verticalPadding = 0; 3136 3137 // don't apply to a target 3138 if (opts.target && $that.is(opts.target)) { 3139 return; 3140 } 3141 3142 // handle padding and border correctly (required when not using border-box) 3143 if ($that.css('box-sizing') !== 'border-box') { 3144 verticalPadding += _parse($that.css('border-top-width')) + _parse($that.css('border-bottom-width')); 3145 verticalPadding += _parse($that.css('padding-top')) + _parse($that.css('padding-bottom')); 3146 } 3147 3148 // set the height (accounting for padding and border) 3149 $that.css(opts.property, (targetHeight - verticalPadding) + 'px'); 3150 }); 3151 }); 3152 3153 // revert hidden parents 3154 $hiddenParents.each(function() { 3155 var $that = $(this); 3156 $that.attr('style', $that.data('style-cache') || null); 3157 }); 3158 3159 // restore scroll position if enabled 3160 if (matchHeight._maintainScroll) { 3161 $(window).scrollTop((scrollTop / htmlHeight) * $('html').outerHeight(true)); 3162 } 3163 3164 return this; 3165 }; 3166 3167 /* 3168 * matchHeight._applyDataApi 3169 * applies matchHeight to all elements with a data-match-height attribute 3170 */ 3171 3172 matchHeight._applyDataApi = function() { 3173 var groups = {}; 3174 3175 // generate groups by their groupId set by elements using data-match-height 3176 $('[data-match-height], [data-mh]').each(function() { 3177 var $this = $(this), 3178 groupId = $this.attr('data-mh') || $this.attr('data-match-height'); 3179 3180 if (groupId in groups) { 3181 groups[groupId] = groups[groupId].add($this); 3182 } else { 3183 groups[groupId] = $this; 3184 } 3185 }); 3186 3187 // apply matchHeight to each group 3188 $.each(groups, function() { 3189 this.matchHeight(true); 3190 }); 3191 }; 3192 3193 /* 3194 * matchHeight._update 3195 * updates matchHeight on all current groups with their correct options 3196 */ 3197 3198 3199 var _update = function(event) { 3200 if (matchHeight._beforeUpdate) { 3201 matchHeight._beforeUpdate(event, matchHeight._groups); 3202 } 3203 3204 $.each(matchHeight._groups, function() { 3205 matchHeight._apply(this.elements, this.options); 3206 }); 3207 3208 if (matchHeight._afterUpdate) { 3209 matchHeight._afterUpdate(event, matchHeight._groups); 3210 } 3211 }; 3212 3213 matchHeight._update = function(throttle, event) { 3214 // prevent update if fired from a resize event 3215 // where the viewport width hasn't actually changed 3216 // fixes an event looping bug in IE8 3217 if (event && event.type === 'resize') { 3218 var windowWidth = $(window).width(); 3219 if (windowWidth === _previousResizeWidth) { 3220 return; 3221 } 3222 _previousResizeWidth = windowWidth; 3223 } 3224 3225 // throttle updates 3226 if (!throttle) { 3227 _update(event); 3228 } else if (_updateTimeout === -1) { 3229 _updateTimeout = setTimeout(function() { 3230 _update(event); 3231 _updateTimeout = -1; 3232 }, matchHeight._throttle); 3233 } 3234 }; 3235 3236 /* 3237 * bind events 3238 */ 3239 3240 // apply on DOM ready event 3241 $(matchHeight._applyDataApi);
3242 3243 // use on or bind where supported 3244 var on = $.fn.on ? 'on' : 'bind'; 3245 3246 // update heights on load and resize events 3247 $(window)[on]('load', function(event) { 3248 matchHeight._update(false, event); 3249 }); 3250 3251 // throttled update heights on resize events 3252 $(window)[on]('resize orientationchange', function(event) { 3253 matchHeight._update(true, event); 3254 }); 3255 3256}); 3257// 3258// SmoothScroll for websites v1.4.10 (Balazs Galambosi) 3259// http://www.smoothscroll.net/ 3260// 3261// Licensed under the terms of the MIT license. 3262// 3263// You may use it in your theme if you credit me. 3264// It is also free to use on any individual website. 3265// 3266// Exception: 3267// The only restriction is to not publish any 3268// extension for browsers or native application 3269// without getting a written permission first. 3270// 3271 3272(function () { 3273 3274// Scroll Variables (tweakable) 3275var defaultOptions = { 3276 3277 // Scrolling Core 3278 frameRate : 150, // [Hz] 3279 animationTime : 1000, // [ms] 3280 stepSize : 50, // [px] 3281 3282 // Pulse (less tweakable) 3283 // ratio of "tail" to "acceleration" 3284 pulseAlgorithm : true, 3285 pulseScale : 4, 3286 pulseNormalize : 1, 3287 3288 // Acceleration 3289 accelerationDelta : 50, // 50 3290 accelerationMax : 3, // 3 3291 3292 // Keyboard Settings 3293 keyboardSupport : true, // option 3294 arrowScroll : 50, // [px] 3295 3296 // Other 3297 fixedBackground : true, 3298 excluded : '' 3299}; 3300 3301var options = defaultOptions; 3302 3303 3304// Other Variables 3305var isExcluded = false; 3306var isFrame = false; 3307var direction = { x: 0, y: 0 }; 3308var initDone = false; 3309var root = document.documentElement; 3310var activeElement; 3311var observer; 3312var refreshSize; 3313var deltaBuffer = []; 3314var deltaBufferTimer; 3315var isMac = /^Mac/.test(navigator.platform); 3316 3317var key = { left: 37, up: 38, right: 39, down: 40, spacebar: 32, 3318 pageup: 33, pagedown: 34, end: 35, home: 36 }; 3319var arrowKeys = { 37: 1, 38: 1, 39: 1, 40: 1 }; 3320 3321/*********************************************** 3322 * INITIALIZE 3323 ***********************************************/ 3324 3325/** 3326 * Tests if smooth scrolling is allowed. Shuts down everything if not. 3327 */ 3328function initTest() { 3329 if (options.keyboardSupport) { 3330 addEvent('keydown', keydown); 3331 } 3332} 3333 3334/** 3335 * Sets up scrolls array, determines if frames are involved. 3336 */ 3337function init() { 3338 3339 if (initDone || !document.body) return; 3340 3341 initDone = true; 3342 3343 var body = document.body; 3344 var html = document.documentElement; 3345 var windowHeight = window.innerHeight; 3346 var scrollHeight = body.scrollHeight; 3347 3348 // check compat mode for root element 3349 root = (document.compatMode.indexOf('CSS') >= 0) ? html : body; 3350 activeElement = body; 3351 3352 initTest(); 3353 3354 // Checks if this script is running in a frame 3355 if (top != self) { 3356 isFrame = true; 3357 } 3358 3359 /** 3360 * Safari 10 fixed it, Chrome fixed it in v45: 3361 * This fixes a bug where the areas left and right to 3362 * the content does not trigger the onmousewheel event 3363 * on some pages. e.g.: html, body { height: 100% } 3364 */ 3365 else if (isOldSafari && 3366 scrollHeight > windowHeight && 3367 (body.offsetHeight <= windowHeight || 3368 html.offsetHeight <= windowHeight)) { 3369 3370 var fullPageElem = document.createElement('div'); 3371 fullPageElem.style.cssText = 'position:absolute; z-index:-10000; ' + 3372 'top:0; left:0; right:0; height:' + 3373 root.scrollHeight + 'px'; 3374 document.body.appendChild(fullPageElem); 3375 3376 // DOM changed (throttled) to fix height 3377 var pendingRefresh; 3378 refreshSize = function () { 3379 if (pendingRefresh) return; // could also be: clearTimeout(pendingRefresh); 3380 pendingRefresh = setTimeout(function () { 3381 if (isExcluded) return; // could be running after cleanup 3382 fullPageElem.style.height = '0'; 3383 fullPageElem.style.height = root.scrollHeight + 'px'; 3384 pendingRefresh = null; 3385 }, 500); // act rarely to stay fast 3386 }; 3387 3388 setTimeout(refreshSize, 10); 3389 3390 addEvent('resize', refreshSize); 3391 3392 // TODO: attributeFilter? 3393 var config = { 3394 attributes: true, 3395 childList: true, 3396 characterData: false 3397 // subtree: true 3398 }; 3399 3400 observer = new MutationObserver(refreshSize); 3401 observer.observe(body, config); 3402 3403 if (root.offsetHeight <= windowHeight) { 3404 var clearfix = document.createElement('div'); 3405 clearfix.style.clear = 'both'; 3406 body.appendChild(clearfix); 3407 } 3408 } 3409 3410 // disable fixed background
3411 if (!options.fixedBackground && !isExcluded) { 3412 body.style.backgroundAttachment = 'scroll'; 3413 html.style.backgroundAttachment = 'scroll'; 3414 } 3415} 3416 3417/** 3418 * Removes event listeners and other traces left on the page. 3419 */ 3420function cleanup() { 3421 observer && observer.disconnect(); 3422 removeEvent(wheelEvent, wheel); 3423 removeEvent('mousedown', mousedown); 3424 removeEvent('keydown', keydown); 3425 removeEvent('resize', refreshSize); 3426 removeEvent('load', init); 3427} 3428 3429 3430/************************************************ 3431 * SCROLLING 3432 ************************************************/ 3433 3434var que = []; 3435var pending = false; 3436var lastScroll = Date.now(); 3437 3438/** 3439 * Pushes scroll actions to the scrolling queue. 3440 */ 3441function scrollArray(elem, left, top) { 3442 3443 directionCheck(left, top); 3444 3445 if (options.accelerationMax != 1) { 3446 var now = Date.now(); 3447 var elapsed = now - lastScroll; 3448 if (elapsed < options.accelerationDelta) { 3449 var factor = (1 + (50 / elapsed)) / 2; 3450 if (factor > 1) { 3451 factor = Math.min(factor, options.accelerationMax); 3452 left *= factor; 3453 top *= factor; 3454 } 3455 } 3456 lastScroll = Date.now(); 3457 } 3458 3459 // push a scroll command 3460 que.push({ 3461 x: left, 3462 y: top, 3463 lastX: (left < 0) ? 0.99 : -0.99, 3464 lastY: (top < 0) ? 0.99 : -0.99, 3465 start: Date.now() 3466 }); 3467 3468 // don't act if there's a pending queue 3469 if (pending) { 3470 return; 3471 } 3472 3473 var scrollRoot = getScrollRoot(); 3474 var isWindowScroll = (elem === scrollRoot || elem === document.body); 3475 3476 // if we haven't already fixed the behavior, 3477 // and it needs fixing for this sesh 3478 if (elem.$scrollBehavior == null && isScrollBehaviorSmooth(elem)) { 3479 elem.$scrollBehavior = elem.style.scrollBehavior; 3480 elem.style.scrollBehavior = 'auto'; 3481 } 3482 3483 var step = function (time) { 3484 3485 var now = Date.now(); 3486 var scrollX = 0; 3487 var scrollY = 0; 3488 3489 for (var i = 0; i < que.length; i++) { 3490 3491 var item = que[i]; 3492 var elapsed = now - item.start; 3493 var finished = (elapsed >= options.animationTime); 3494 3495 // scroll position: [0, 1] 3496 var position = (finished) ? 1 : elapsed / options.animationTime; 3497 3498 // easing [optional] 3499 if (options.pulseAlgorithm) { 3500 position = pulse(position); 3501 } 3502 3503 // only need the difference 3504 var x = (item.x * position - item.lastX) >> 0; 3505 var y = (item.y * position - item.lastY) >> 0; 3506 3507 // add this to the total scrolling 3508 scrollX += x; 3509 scrollY += y; 3510 3511 // update last values 3512 item.lastX += x; 3513 item.lastY += y; 3514 3515 // delete and step back if it's over 3516 if (finished) { 3517 que.splice(i, 1); i--; 3518 } 3519 } 3520 3521 // scroll left and top 3522 if (isWindowScroll) { 3523 window.scrollBy(scrollX, scrollY); 3524 } 3525 else { 3526 if (scrollX) elem.scrollLeft += scrollX; 3527 if (scrollY) elem.scrollTop += scrollY; 3528 } 3529 3530 // clean up if there's nothing left to do 3531 if (!left && !top) { 3532 que = []; 3533 } 3534 3535 if (que.length) { 3536 requestFrame(step, elem, (1000 / options.frameRate + 1)); 3537 } else { 3538 pending = false; 3539 // restore default behavior at the end of scrolling sesh 3540 if (elem.$scrollBehavior != null) { 3541 elem.style.scrollBehavior = elem.$scrollBehavior; 3542 elem.$scrollBehavior = null; 3543 } 3544 } 3545 }; 3546 3547 // start a new queue of actions 3548 requestFrame(step, elem, 0); 3549 pending = true; 3550} 3551 3552 3553/*********************************************** 3554 * EVENTS 3555 ***********************************************/ 3556 3557/** 3558 * Mouse wheel handler. 3559 * @param {Object} event 3560 */ 3561function wheel(event) { 3562 3563 if (!initDone) { 3564 init(); 3565 } 3566 3567 var target = event.target; 3568 3569 // leave early if default action is prevented 3570 // or it's a zooming event with CTRL 3571 if (event.defaultPrevented || event.ctrlKey) { 3572 return true; 3573 } 3574 3575 // leave embedded content alone (flash & pdf) 3576 if (isNodeName(activeElement, 'embed') || 3577 (isNodeName(target, 'embed') && /\.pdf/i.test(target.src)) || 3578 isNodeName(activeElement, 'object') || 3579 target.shadowRoot) { 3580 return true; 3581 } 3582 3583 var deltaX = -event.wheelDeltaX || event.deltaX || 0; 3584 var deltaY = -event.wheelDeltaY || event.deltaY || 0; 3585 3586 if (isMac) { 3587 if (event.wheelDeltaX && isDivisible(event.wheelDeltaX, 120)) { 3588 deltaX = -120 * (event.wheelDeltaX / Math.abs(event.wheelDeltaX)); 3589 } 3590 if (event.wheelDeltaY && isDivisible(event.wheelDeltaY, 120)) { 3591 deltaY = -120 * (event.wheelDeltaY / Math.abs(event.wheelDeltaY)); 3592 } 3593 } 3594 3595 // use wheelDelta if deltaX/Y is not available 3596 if (!deltaX && !deltaY) { 3597 deltaY = -event.wheelDelta || 0; 3598 } 3599 3600 // line based scrolling (Firefox mostly) 3601 if (event.deltaMode === 1) { 3602 deltaX *= 40; 3603 deltaY *= 40; 3604 } 3605 3606 var overflowing = overflowingAncestor(target); 3607 3608 // nothing to do if there's no element that's scrollable 3609 if (!overflowing) { 3610 // except Chrome iframes seem to eat wheel events, which we need to 3611 // propagate up, if the iframe has nothing overflowing to scroll 3612 if (isFrame && isChrome) { 3613 // change target to iframe element itself for the parent frame 3614 Object.defineProperty(event, "target", {value: window.frameElement}); 3615 return parent.wheel(event); 3616 } 3617 return true; 3618 } 3619 3620 // check if it's a touchpad scroll that should be ignored 3621 if (isTouchpad(deltaY)) { 3622 return true; 3623 } 3624 3625 // scale by step size 3626 // delta is 120 most of the time
3627 // synaptics seems to send 1 sometimes 3628 if (Math.abs(deltaX) > 1.2) { 3629 deltaX *= options.stepSize / 120; 3630 } 3631 if (Math.abs(deltaY) > 1.2) { 3632 deltaY *= options.stepSize / 120; 3633 } 3634 3635 scrollArray(overflowing, deltaX, deltaY); 3636 event.preventDefault(); 3637 scheduleClearCache(); 3638} 3639 3640/** 3641 * Keydown event handler. 3642 * @param {Object} event 3643 */ 3644function keydown(event) { 3645 3646 var target = event.target; 3647 var modifier = event.ctrlKey || event.altKey || event.metaKey || 3648 (event.shiftKey && event.keyCode !== key.spacebar); 3649 3650 // our own tracked active element could've been removed from the DOM 3651 if (!document.body.contains(activeElement)) { 3652 activeElement = document.activeElement; 3653 } 3654 3655 // do nothing if user is editing text 3656 // or using a modifier key (except shift) 3657 // or in a dropdown 3658 // or inside interactive elements 3659 var inputNodeNames = /^(textarea|select|embed|object)$/i; 3660 var buttonTypes = /^(button|submit|radio|checkbox|file|color|image)$/i; 3661 if ( event.defaultPrevented || 3662 inputNodeNames.test(target.nodeName) || 3663 isNodeName(target, 'input') && !buttonTypes.test(target.type) || 3664 isNodeName(activeElement, 'video') || 3665 isInsideYoutubeVideo(event) || 3666 target.isContentEditable || 3667 modifier ) { 3668 return true; 3669 } 3670 3671 // [spacebar] should trigger button press, leave it alone 3672 if ((isNodeName(target, 'button') || 3673 isNodeName(target, 'input') && buttonTypes.test(target.type)) && 3674 event.keyCode === key.spacebar) { 3675 return true; 3676 } 3677 3678 // [arrwow keys] on radio buttons should be left alone 3679 if (isNodeName(target, 'input') && target.type == 'radio' && 3680 arrowKeys[event.keyCode]) { 3681 return true; 3682 } 3683 3684 var shift, x = 0, y = 0; 3685 var overflowing = overflowingAncestor(activeElement); 3686 3687 if (!overflowing) { 3688 // Chrome iframes seem to eat key events, which we need to 3689 // propagate up, if the iframe has nothing overflowing to scroll 3690 return (isFrame && isChrome) ? parent.keydown(event) : true; 3691 } 3692 3693 var clientHeight = overflowing.clientHeight; 3694 3695 if (overflowing == document.body) { 3696 clientHeight = window.innerHeight; 3697 } 3698 3699 switch (event.keyCode) { 3700 case key.up: 3701 y = -options.arrowScroll; 3702 break; 3703 case key.down: 3704 y = options.arrowScroll; 3705 break; 3706 case key.spacebar: // (+ shift) 3707 shift = event.shiftKey ? 1 : -1; 3708 y = -shift * clientHeight * 0.9; 3709 break; 3710 case key.pageup: 3711 y = -clientHeight * 0.9; 3712 break; 3713 case key.pagedown: 3714 y = clientHeight * 0.9; 3715 break; 3716 case key.home: 3717 if (overflowing == document.body && document.scrollingElement) 3718 overflowing = document.scrollingElement; 3719 y = -overflowing.scrollTop; 3720 break; 3721 case key.end: 3722 var scroll = overflowing.scrollHeight - overflowing.scrollTop; 3723 var scrollRemaining = scroll - clientHeight; 3724 y = (scrollRemaining > 0) ? scrollRemaining + 10 : 0; 3725 break; 3726 case key.left: 3727 x = -options.arrowScroll; 3728 break; 3729 case key.right: 3730 x = options.arrowScroll; 3731 break; 3732 default: 3733 return true; // a key we don't care about 3734 } 3735 3736 scrollArray(overflowing, x, y); 3737 event.preventDefault(); 3738 scheduleClearCache(); 3739} 3740 3741/** 3742 * Mousedown event only for updating activeElement 3743 */ 3744function mousedown(event) { 3745 activeElement = event.target; 3746} 3747 3748 3749/*********************************************** 3750 * OVERFLOW 3751 ***********************************************/ 3752 3753var uniqueID = (function () { 3754 var i = 0; 3755 return function (el) { 3756 return el.uniqueID || (el.uniqueID = i++); 3757 }; 3758})(); 3759 3760var cacheX = {}; // cleared out after a scrolling session 3761var cacheY = {}; // cleared out after a scrolling session 3762var clearCacheTimer; 3763var smoothBehaviorForElement = {}; 3764 3765//setInterval(function () { cache = {}; }, 10 * 1000); 3766 3767function scheduleClearCache() { 3768 clearTimeout(clearCacheTimer); 3769 clearCacheTimer = setInterval(function () { 3770 cacheX = cacheY = smoothBehaviorForElement = {}; 3771 }, 1*1000); 3772} 3773
3774function setCache(elems, overflowing, x) { 3775 var cache = x ? cacheX : cacheY; 3776 for (var i = elems.length; i--;) 3777 cache[uniqueID(elems[i])] = overflowing; 3778 return overflowing; 3779} 3780 3781function getCache(el, x) { 3782 return (x ? cacheX : cacheY)[uniqueID(el)]; 3783} 3784 3785// (body) (root) 3786// | hidden | visible | scroll | auto | 3787// hidden | no | no | YES | YES | 3788// visible | no | YES | YES | YES | 3789// scroll | no | YES | YES | YES | 3790// auto | no | YES | YES | YES | 3791 3792function overflowingAncestor(el) { 3793 var elems = []; 3794 var body = document.body; 3795 var rootScrollHeight = root.scrollHeight; 3796 do { 3797 var cached = getCache(el, false); 3798 if (cached) { 3799 return setCache(elems, cached); 3800 } 3801 elems.push(el); 3802 if (rootScrollHeight === el.scrollHeight) { 3803 var topOverflowsNotHidden = overflowNotHidden(root) && overflowNotHidden(body); 3804 var isOverflowCSS = topOverflowsNotHidden || overflowAutoOrScroll(root); 3805 if (isFrame && isContentOverflowing(root) || 3806 !isFrame && isOverflowCSS) { 3807 return setCache(elems, getScrollRoot()); 3808 } 3809 } else if (isContentOverflowing(el) && overflowAutoOrScroll(el)) { 3810 return setCache(elems, el); 3811 } 3812 } while ((el = el.parentElement)); 3813} 3814 3815function isContentOverflowing(el) { 3816 return (el.clientHeight + 10 < el.scrollHeight); 3817} 3818 3819// typically for <body> and <html> 3820function overflowNotHidden(el) { 3821 var overflow = getComputedStyle(el, '').getPropertyValue('overflow-y'); 3822 return (overflow !== 'hidden'); 3823} 3824 3825// for all other elements 3826function overflowAutoOrScroll(el) { 3827 var overflow = getComputedStyle(el, '').getPropertyValue('overflow-y'); 3828 return (overflow === 'scroll' || overflow === 'auto'); 3829} 3830 3831// for all other elements 3832function isScrollBehaviorSmooth(el) { 3833 var id = uniqueID(el); 3834 if (smoothBehaviorForElement[id] == null) { 3835 var scrollBehavior = getComputedStyle(el, '')['scroll-behavior']; 3836 smoothBehaviorForElement[id] = ('smooth' == scrollBehavior); 3837 } 3838 return smoothBehaviorForElement[id]; 3839} 3840 3841 3842/*********************************************** 3843 * HELPERS 3844 ***********************************************/ 3845 3846function addEvent(type, fn, arg) { 3847 window.addEventListener(type, fn, arg || false); 3848} 3849 3850function removeEvent(type, fn, arg) { 3851 window.removeEventListener(type, fn, arg || false); 3852} 3853 3854function isNodeName(el, tag) {
3855 return el && (el.nodeName||'').toLowerCase() === tag.toLowerCase(); 3856} 3857 3858function directionCheck(x, y) { 3859 x = (x > 0) ? 1 : -1; 3860 y = (y > 0) ? 1 : -1; 3861 if (direction.x !== x || direction.y !== y) { 3862 direction.x = x; 3863 direction.y = y; 3864 que = []; 3865 lastScroll = 0; 3866 } 3867} 3868 3869if (window.localStorage && localStorage.SS_deltaBuffer) { 3870 try { // #46 Safari throws in private browsing for localStorage 3871 deltaBuffer = localStorage.SS_deltaBuffer.split(','); 3872 } catch (e) { } 3873} 3874 3875function isTouchpad(deltaY) { 3876 if (!deltaY) return; 3877 if (!deltaBuffer.length) { 3878 deltaBuffer = [deltaY, deltaY, deltaY]; 3879 } 3880 deltaY = Math.abs(deltaY); 3881 deltaBuffer.push(deltaY); 3882 deltaBuffer.shift(); 3883 clearTimeout(deltaBufferTimer); 3884 deltaBufferTimer = setTimeout(function () { 3885 try { // #46 Safari throws in private browsing for localStorage 3886 localStorage.SS_deltaBuffer = deltaBuffer.join(','); 3887 } catch (e) { } 3888 }, 1000); 3889 var dpiScaledWheelDelta = deltaY > 120 && allDeltasDivisableBy(deltaY); // win64 3890 var tp = !allDeltasDivisableBy(120) && !allDeltasDivisableBy(100) && !dpiScaledWheelDelta; 3891 if (deltaY < 50) return true; 3892 return tp; 3893} 3894 3895function isDivisible(n, divisor) { 3896 return (Math.floor(n / divisor) == n / divisor); 3897} 3898 3899function allDeltasDivisableBy(divisor) { 3900 return (isDivisible(deltaBuffer[0], divisor) && 3901 isDivisible(deltaBuffer[1], divisor) && 3902 isDivisible(deltaBuffer[2], divisor)); 3903} 3904 3905function isInsideYoutubeVideo(event) { 3906 var elem = event.target; 3907 var isControl = false; 3908 if (document.URL.indexOf ('www.youtube.com/watch') != -1) { 3909 do { 3910 isControl = (elem.classList && 3911 elem.classList.contains('html5-video-controls')); 3912 if (isControl) break; 3913 } while ((elem = elem.parentNode)); 3914 } 3915 return isControl; 3916} 3917 3918var requestFrame = (function () { 3919 return (window.requestAnimationFrame || 3920 window.webkitRequestAnimationFrame || 3921 window.mozRequestAnimationFrame || 3922 function (callback, element, delay) { 3923 window.setTimeout(callback, delay || (1000/60)); 3924 }); 3925})(); 3926 3927var MutationObserver = (window.MutationObserver || 3928 window.WebKitMutationObserver || 3929 window.MozMutationObserver); 3930 3931var getScrollRoot = (function() { 3932 var SCROLL_ROOT = document.scrollingElement; 3933 return function() { 3934 if (!SCROLL_ROOT) { 3935 var dummy = document.createElement('div'); 3936 dummy.style.cssText = 'height:10000px;width:1px;'; 3937 document.body.appendChild(dummy); 3938 var bodyScrollTop = document.body.scrollTop; 3939 var docElScrollTop = document.documentElement.scrollTop; 3940 window.scrollBy(0, 3); 3941 if (document.body.scrollTop != bodyScrollTop) 3942 (SCROLL_ROOT = document.body); 3943 else 3944 (SCROLL_ROOT = document.documentElement); 3945 window.scrollBy(0, -3); 3946 document.body.removeChild(dummy); 3947 } 3948 return SCROLL_ROOT; 3949 }; 3950})(); 3951 3952 3953/*********************************************** 3954 * PULSE (by Michael Herf) 3955 ***********************************************/ 3956 3957/** 3958 * Viscous fluid with a pulse for part and decay for the rest. 3959 * - Applies a fixed force over an interval (a damped acceleration), and 3960 * - Lets the exponential bleed away the velocity over a longer interval 3961 * - Michael Herf, http://stereopsis.com/stopping/ 3962 */ 3963function pulse_(x) { 3964 var val, start, expx; 3965 // test 3966 x = x * options.pulseScale; 3967 if (x < 1) { // acceleartion 3968 val = x - (1 - Math.exp(-x)); 3969 } else { // tail 3970 // the previous animation ended here: 3971 start = Math.exp(-1); 3972 // simple viscous drag 3973 x -= 1; 3974 expx = 1 - Math.exp(-x); 3975 val = start + (expx * (1 - start)); 3976 } 3977 return val * options.pulseNormalize; 3978} 3979 3980function pulse(x) { 3981 if (x >= 1) return 1; 3982 if (x <= 0) return 0; 3983 3984 if (options.pulseNormalize == 1) { 3985 options.pulseNormalize /= pulse_(1); 3986 } 3987 return pulse_(x); 3988} 3989 3990 3991/*********************************************** 3992 * FIRST RUN 3993 ***********************************************/ 3994 3995var userAgent = window.navigator.userAgent; 3996var isEdge = /Edge/.test(userAgent); // thank you MS 3997var isChrome = /chrome/i.test(userAgent) && !isEdge; 3998var isSafari = /safari/i.test(userAgent) && !isEdge; 3999var isMobile = /mobile/i.test(userAgent); 4000var isIEWin7 = /Windows NT 6.1/i.test(userAgent) && /rv:11/i.test(userAgent); 4001var isOldSafari = isSafari && (/Version\/8/i.test(userAgent) || /Version\/9/i.test(userAgent)); 4002var isEnabledForBrowser = (isChrome || isSafari || isIEWin7) && !isMobile; 4003 4004var supportsPassive = false; 4005try { 4006 window.addEventListener("test", null, Object.defineProperty({}, 'passive', { 4007 get: function () { 4008 supportsPassive = true; 4009 } 4010 })); 4011} catch(e) {} 4012 4013var wheelOpt = supportsPassive ? { passive: false } : false; 4014var wheelEvent = 'onwheel' in document.createElement('div') ? 'wheel' : 'mousewheel'; 4015 4016if (wheelEvent && isEnabledForBrowser) { 4017 addEvent(wheelEvent, wheel, wheelOpt); 4018 addEvent('mousedown', mousedown);
4019 addEvent('load', init); 4020} 4021 4022 4023/*********************************************** 4024 * PUBLIC INTERFACE 4025 ***********************************************/ 4026 4027function SmoothScroll(optionsToSet) { 4028 for (var key in optionsToSet) 4029 if (defaultOptions.hasOwnProperty(key)) 4030 options[key] = optionsToSet[key]; 4031} 4032SmoothScroll.destroy = cleanup; 4033 4034if (window.SmoothScrollOptions) // async API 4035 SmoothScroll(window.SmoothScrollOptions); 4036 4037if (typeof define === 'function' && define.amd) 4038 define(function() { 4039 return SmoothScroll; 4040 }); 4041else if ('object' == typeof exports) 4042 module.exports = SmoothScroll; 4043else 4044 window.SmoothScroll = SmoothScroll; 4045 4046})(); 4047/** 4048 * Swiper 7.2.0 4049 * Most modern mobile touch slider and framework with hardware accelerated transitions 4050 * https://swiperjs.com 4051 * 4052 * Copyright 2014-2021 Vladimir Kharlampidi 4053 * 4054 * Released under the MIT License 4055 * 4056 * Released on: October 27, 2021 4057 */ 4058 4059!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Swiper=t()}(this,(function(){"use strict";function e(e){return null!==e&&"object"==typeof e&&"constructor"in e&&e.constructor===Object}function t(s={},a={}){Object.keys(a).forEach((i=>{void 0===s[i]?s[i]=a[i]:e(a[i])&&e(s[i])&&Object.keys(a[i]).length>0&&t(s[i],a[i])}))}const s={body:{},addEventListener(){},removeEventListener(){},activeElement:{blur(){},nodeName:""},querySelector:()=>null,querySelectorAll:()=>[],getElementById:()=>null,createEvent:()=>({initEvent(){}}),createElement:()=>({children:[],childNodes:[],style:{},setAttribute(){},getElementsByTagName:()=>[]}),createElementNS:()=>({}),importNode:()=>null,location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""}};function a(){const e="undefined"!=typeof document?document:{};return t(e,s),e}const i={document:s,navigator:{userAgent:""},location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""},history:{replaceState(){},pushState(){},go(){},back(){}},CustomEvent:function(){return this},addEventListener(){},removeEventListener(){},getComputedStyle:()=>({getPropertyValue:()=>""}),Image(){},Date(){},screen:{},setTimeout(){},clearTimeout(){},matchMedia:()=>({}),requestAnimationFrame:e=>"undefined"==typeof setTimeout?(e(),null):setTimeout(e,0),cancelAnimationFrame(e){"undefined"!=typeof setTimeout&&clearTimeout(e)}};function r(){const e="undefined"!=typeof window?window:{};return t(e,i),e}class n extends Array{constructor(e){super(...e||[]),function(e){const t=e.__proto__;Object.defineProperty(e,"__proto__",{get:()=>t,set(e){t.__proto__=e}})}(this)}}function l(e=[]){const t=[];return e.forEach((e=>{Array.isArray(e)?t.push(...l(e)):t.push(e)})),t}function o(e,t){return Array.prototype.filter.call(e,t)}function d(e,t){const s=r(),i=a();let l=[];if(!t&&e instanceof n)return e;if(!e)return new n(l);if("string"==typeof e){const s=e.trim();if(s.indexOf("<")>=0&&s.indexOf(">")>=0){let e="div";0===s.indexOf("<li")&&(e="ul"),0===s.indexOf("<tr")&&(e="tbody"),0!==s.indexOf("<td")&&0!==s.indexOf("<th")||(e="tr"),0===s.indexOf("<tbody")&&(e="table"),0===s.indexOf("<option")&&(e="select");const t=i.createElement(e);t.innerHTML=s;for(let e=0;e<t.childNodes.length;e+=1)l.push(t.childNodes[e])}else l=function(e,t){if("string"!=typeof e)return[e];const s=[],a=t.querySelectorAll(e);for(let e=0;e<a.length;e+=1)s.push(a[e]);return s}(e.trim(),t||i)}else if(e.nodeType||e===s||e===i)l.push(e);else if(Array.isArray(e)){if(e instanceof n)return e;l=e}return new n(function(e){const t=[];for(let s=0;s<e.length;s+=1)-1===t.indexOf(e[s])&&t.push(e[s]);return t}(l))}d.fn=n.prototype;const c={addClass:function(...e){const t=l(e.map((e=>e.split(" "))));return this.forEach((e=>{e.classList.add(...t)})),this},removeClass:function(...e){const t=l(e.map((e=>e.split(" "))));return this.forEach((e=>{e.classList.remove(...t)})),this},hasClass:function(...e){const t=l(e.map((e=>e.split(" "))));return o(this,(e=>t.filter((t=>e.classList.contains(t))).length>0)).length>0},toggleClass:function(...e){const t=l(e.map((e=>e.split(" "))));this.forEach((e=>{t.forEach((t=>{e.classList.toggle(t)}))}
4059))},attr:function(e,t){if(1===arguments.length&&"string"==typeof e)return this[0]?this[0].getAttribute(e):void 0;for(let s=0;s<this.length;s+=1)if(2===arguments.length)this[s].setAttribute(e,t);else for(const t in e)this[s][t]=e[t],this[s].setAttribute(t,e[t]);return this},removeAttr:function(e){for(let t=0;t<this.length;t+=1)this[t].removeAttribute(e);return this},transform:function(e){for(let t=0;t<this.length;t+=1)this[t].style.transform=e;return this},transition:function(e){for(let t=0;t<this.length;t+=1)this[t].style.transitionDuration="string"!=typeof e?`${e}ms`:e;return this},on:function(...e){let[t,s,a,i]=e;function r(e){const t=e.target;if(!t)return;const i=e.target.dom7EventData||[];if(i.indexOf(e)<0&&i.unshift(e),d(t).is(s))a.apply(t,i);else{const e=d(t).parents();for(let t=0;t<e.length;t+=1)d(e[t]).is(s)&&a.apply(e[t],i)}}function n(e){const t=e&&e.target&&e.target.dom7EventData||[];t.indexOf(e)<0&&t.unshift(e),a.apply(this,t)}"function"==typeof e[1]&&([t,a,i]=e,s=void 0),i||(i=!1);const l=t.split(" ");let o;for(let e=0;e<this.length;e+=1){const t=this[e];if(s)for(o=0;o<l.length;o+=1){const e=l[o];t.dom7LiveListeners||(t.dom7LiveListeners={}),t.dom7LiveListeners[e]||(t.dom7LiveListeners[e]=[]),t.dom7LiveListeners[e].push({listener:a,proxyListener:r}),t.addEventListener(e,r,i)}else for(o=0;o<l.length;o+=1){const e=l[o];t.dom7Listeners||(t.dom7Listeners={}),t.dom7Listeners[e]||(t.dom7Listeners[e]=[]),t.dom7Listeners[e].push({listener:a,proxyListener:n}),t.addEventListener(e,n,i)}}return this},off:function(...e){let[t,s,a,i]=e;"function"==typeof e[1]&&([t,a,i]=e,s=void 0),i||(i=!1);const r=t.split(" ");for(let e=0;e<r.length;e+=1){const t=r[e];for(let e=0;e<this.length;e+=1){const r=this[e];let n;if(!s&&r.dom7Listeners?n=r.dom7Listeners[t]:s&&r.dom7LiveListeners&&(n=r.dom7LiveListeners[t]),n&&n.length)for(let e=n.length-1;e>=0;e-=1){const s=n[e];a&&s.listener===a||a&&s.listener&&s.listener.dom7proxy&&s.listener.dom7proxy===a?(r.removeEventListener(t,s.proxyListener,i),n.splice(e,1)):a||(r.removeEventListener(t,s.proxyListener,i),n.splice(e,1))}}}return this},trigger:function(...e){const t=r(),s=e[0].split(" "),a=e[1];for(let i=0;i<s.length;i+=1){const r=s[i];for(let s=0;s<this.length;s+=1){const i=this[s];if(t.CustomEvent){const s=new t.CustomEvent(r,{detail:a,bubbles:!0,cancelable:!0});i.dom7EventData=e.filter(((e,t)=>t>0)),i.dispatchEvent(s),i.dom7EventData=[],delete i.dom7EventData}}}return this},transitionEnd:function(e){const t=this;return e&&t.on("transitionend",(function s(a){a.target===this&&(e.call(this,a),t.off("transitionend",s))})),this},outerWidth:function(e){if(this.length>0){if(e){const e=this.styles();return this[0].offsetWidth+parseFloat(e.getPropertyValue("margin-right"))+parseFloat(e.getPropertyValue("margin-left"))}return this[0].offsetWidth}return null},outerHeight:function(e){if(this.length>0){if(e){const e=this.styles();return this[0].offsetHeight+parseFloat(e.getPropertyValue("margin-top"))+parseFloat(e.getPropertyValue("margin-bottom"))}return this[0].offsetHeight}return null},styles:function(){const e=r();return this[0]?e.getComputedStyle(this[0],null):{}},offset:function(){if(this.length>0){const e=r(),t=a(),s=this[0],i=s.getBoundingClientRect(),n=t.body,l=s.clientTop||n.clientTop||0,o=s.clientLeft||n.clientLeft||0,d=s===e?e.scrollY:s.scrollTop,c=s===e?e.scrollX:s.scrollLeft;return{top:i.top+d-l,left:i.left+c-o}}return null},css:function(e,t){const s=r();let a;if(1===arguments.length){if("string"!=typeof e){for(a=0;a<this.length;a+=1)for(const t in e)this[a].style[t]=e[t];return this}if(this[0])return s.getComputedStyle(this[0],null).getPropertyValue(e)}if(2===arguments.length&&"string"==typeof e){for(a=0;a<this.length;a+=1)this[a].style[e]=t;return this}return this},each:function(e){return e?(this.forEach(((t,s)=>{e.apply(t,[t,s])})),this):this},html:function(e){if(void 0===e)return this[0]?this[0].innerHTML:null;for(let t=0;t<this.length;t+=1)this[t].innerHTML=e;return this},text:function(e){if(void 0===e)return this[0]?this[0].textContent.trim():null;for(let t=0;t<this.length;t+=1)this[t].textContent=e;return this},is:function(e){const t=r(),s=a(),i=this[0];let l,o;if(!i||void 0===e)return!1;if("string"==typeof e){if(i.matches)return i.matches(e);if(i.webkitMatchesSelector)return i.webkitMatchesSelector(e);
4059if(i.msMatchesSelector)return i.msMatchesSelector(e);for(l=d(e),o=0;o<l.length;o+=1)if(l[o]===i)return!0;return!1}if(e===s)return i===s;if(e===t)return i===t;if(e.nodeType||e instanceof n){for(l=e.nodeType?[e]:e,o=0;o<l.length;o+=1)if(l[o]===i)return!0;return!1}return!1},index:function(){let e,t=this[0];if(t){for(e=0;null!==(t=t.previousSibling);)1===t.nodeType&&(e+=1);return e}},eq:function(e){if(void 0===e)return this;const t=this.length;if(e>t-1)return d([]);if(e<0){const s=t+e;return d(s<0?[]:[this[s]])}return d([this[e]])},append:function(...e){let t;const s=a();for(let a=0;a<e.length;a+=1){t=e[a];for(let e=0;e<this.length;e+=1)if("string"==typeof t){const a=s.createElement("div");for(a.innerHTML=t;a.firstChild;)this[e].appendChild(a.firstChild)}else if(t instanceof n)for(let s=0;s<t.length;s+=1)this[e].appendChild(t[s]);else this[e].appendChild(t)}return this},prepend:function(e){const t=a();let s,i;for(s=0;s<this.length;s+=1)if("string"==typeof e){const a=t.createElement("div");for(a.innerHTML=e,i=a.childNodes.length-1;i>=0;i-=1)this[s].insertBefore(a.childNodes[i],this[s].childNodes[0])}else if(e instanceof n)for(i=0;i<e.length;i+=1)this[s].insertBefore(e[i],this[s].childNodes[0]);else this[s].insertBefore(e,this[s].childNodes[0]);return this},next:function(e){return this.length>0?e?this[0].nextElementSibling&&d(this[0].nextElementSibling).is(e)?d([this[0].nextElementSibling]):d([]):this[0].nextElementSibling?d([this[0].nextElementSibling]):d([]):d([])},nextAll:function(e){const t=[];let s=this[0];if(!s)return d([]);for(;s.nextElementSibling;){const a=s.nextElementSibling;e?d(a).is(e)&&t.push(a):t.push(a),s=a}return d(t)},prev:function(e){if(this.length>0){const t=this[0];return e?t.previousElementSibling&&d(t.previousElementSibling).is(e)?d([t.previousElementSibling]):d([]):t.previousElementSibling?d([t.previousElementSibling]):d([])}return d([])},prevAll:function(e){const t=[];let s=this[0];if(!s)return d([]);for(;s.previousElementSibling;){const a=s.previousElementSibling;e?d(a).is(e)&&t.push(a):t.push(a),s=a}return d(t)},parent:function(e){const t=[];for(let s=0;s<this.length;s+=1)null!==this[s].parentNode&&(e?d(this[s].parentNode).is(e)&&t.push(this[s].parentNode):t.push(this[s].parentNode));return d(t)},parents:function(e){const t=[];for(let s=0;s<this.length;s+=1){let a=this[s].parentNode;for(;a;)e?d(a).is(e)&&t.push(a):t.push(a),a=a.parentNode}return d(t)},closest:function(e){let t=this;return void 0===e?d([]):(t.is(e)||(t=t.parents(e).eq(0)),t)},find:function(e){const t=[];for(let s=0;s<this.length;s+=1){const a=this[s].querySelectorAll(e);for(let e=0;e<a.length;e+=1)t.push(a[e])}return d(t)},children:function(e){const t=[];for(let s=0;s<this.length;s+=1){const a=this[s].children;for(let s=0;s<a.length;s+=1)e&&!d(a[s]).is(e)||t.push(a[s])}return d(t)},filter:function(e){return d(o(this,e))},remove:function(){for(let e=0;e<this.length;e+=1)this[e].parentNode&&this[e].parentNode.removeChild(this[e]);return this}};function p(e,t=0){return setTimeout(e,t)}function u(){return Date.now()}function h(e,t="x"){const s=r();let a,i,n;const l=function(e){const t=r();let s;return t.getComputedStyle&&(s=t.getComputedStyle(e,null)),!s&&e.currentStyle&&(s=e.currentStyle),s||(s=e.style),s}(e);return s.WebKitCSSMatrix?(i=l.transform||l.webkitTransform,i.split(",").length>6&&(i=i.split(", ").map((e=>e.replace(",","."))).join(", ")),n=new s.WebKitCSSMatrix("none"===i?"":i)):(n=l.MozTransform||l.OTransform||l.MsTransform||l.msTransform||l.transform||l.getPropertyValue("transform").replace("translate(","matrix(1, 0, 0, 1,"),a=n.toString().split(",")),"x"===t&&(i=s.WebKitCSSMatrix?n.m41:16===a.length?parseFloat(a[12]):parseFloat(a[4])),"y"===t&&(i=s.WebKitCSSMatrix?n.m42:16===a.length?parseFloat(a[13]):parseFloat(a[5])),i||0}function m(e){return"object"==typeof e&&null!==e&&e.constructor&&"Object"===Object.prototype.toString.call(e).slice(8,-1)}function f(...e){const t=Object(e[0]),s=["__proto__","constructor","prototype"];for(let i=1;i<e.length;i+=1){const r=e[i];if(null!=r&&(a=r,!("undefined"!=typeof window&&void 0!==window.HTMLElement?a instanceof HTMLElement:a&&(1===a.nodeType||11===a.nodeType)))){const e=Object.keys(Object(r)).filter((e=>s.indexOf(e)<0));for(let s=0,a=e.length;s<a;s+=1){const a=e[s],i=Object.getOwnPropertyDescriptor(r,a);
4059void 0!==i&&i.enumerable&&(m(t[a])&&m(r[a])?r[a].__swiper__?t[a]=r[a]:f(t[a],r[a]):!m(t[a])&&m(r[a])?(t[a]={},r[a].__swiper__?t[a]=r[a]:f(t[a],r[a])):t[a]=r[a])}}}var a;return t}function g(e,t,s){e.style.setProperty(t,s)}function v({swiper:e,targetPosition:t,side:s}){const a=r(),i=-e.translate;let n,l=null;const o=e.params.speed;e.wrapperEl.style.scrollSnapType="none",a.cancelAnimationFrame(e.cssModeFrameID);const d=t>i?"next":"prev",c=(e,t)=>"next"===d&&e>=t||"prev"===d&&e<=t,p=()=>{n=(new Date).getTime(),null===l&&(l=n);const r=Math.max(Math.min((n-l)/o,1),0),d=.5-Math.cos(r*Math.PI)/2;let u=i+d*(t-i);if(c(u,t)&&(u=t),e.wrapperEl.scrollTo({[s]:u}),c(u,t))return e.wrapperEl.style.overflow="hidden",e.wrapperEl.style.scrollSnapType="",setTimeout((()=>{e.wrapperEl.style.overflow="",e.wrapperEl.scrollTo({[s]:u})})),void a.cancelAnimationFrame(e.cssModeFrameID);e.cssModeFrameID=a.requestAnimationFrame(p)};p()}let w,b,x;function y(){return w||(w=function(){const e=r(),t=a();return{smoothScroll:t.documentElement&&"scrollBehavior"in t.documentElement.style,touch:!!("ontouchstart"in e||e.DocumentTouch&&t instanceof e.DocumentTouch),passiveListener:function(){let t=!1;try{const s=Object.defineProperty({},"passive",{get(){t=!0}});e.addEventListener("testPassiveListener",null,s)}catch(e){}return t}(),gestures:"ongesturestart"in e}}()),w}function E(e={}){return b||(b=function({userAgent:e}={}){const t=y(),s=r(),a=s.navigator.platform,i=e||s.navigator.userAgent,n={ios:!1,android:!1},l=s.screen.width,o=s.screen.height,d=i.match(/(Android);?[\s\/]+([\d.]+)?/);let c=i.match(/(iPad).*OS\s([\d_]+)/);const p=i.match(/(iPod)(.*OS\s([\d_]+))?/),u=!c&&i.match(/(iPhone\sOS|iOS)\s([\d_]+)/),h="Win32"===a;let m="MacIntel"===a;return!c&&m&&t.touch&&["1024x1366","1366x1024","834x1194","1194x834","834x1112","1112x834","768x1024","1024x768","820x1180","1180x820","810x1080","1080x810"].indexOf(`${l}x${o}`)>=0&&(c=i.match(/(Version)\/([\d.]+)/),c||(c=[0,1,"13_0_0"]),m=!1),d&&!h&&(n.os="android",n.android=!0),(c||u||p)&&(n.os="ios",n.ios=!0),n}(e)),b}function T(){return x||(x=function(){const e=r();return{isSafari:function(){const t=e.navigator.userAgent.toLowerCase();return t.indexOf("safari")>=0&&t.indexOf("chrome")<0&&t.indexOf("android")<0}(),isWebView:/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(e.navigator.userAgent)}}()),x}Object.keys(c).forEach((e=>{Object.defineProperty(d.fn,e,{value:c[e],writable:!0})}));var C={on(e,t,s){const a=this;if("function"!=typeof t)return a;const i=s?"unshift":"push";return e.split(" ").forEach((e=>{a.eventsListeners[e]||(a.eventsListeners[e]=[]),a.eventsListeners[e][i](t)})),a},once(e,t,s){const a=this;if("function"!=typeof t)return a;function i(...s){a.off(e,i),i.__emitterProxy&&delete i.__emitterProxy,t.apply(a,s)}return i.__emitterProxy=t,a.on(e,i,s)},onAny(e,t){const s=this;if("function"!=typeof e)return s;const a=t?"unshift":"push";return s.eventsAnyListeners.indexOf(e)<0&&s.eventsAnyListeners[a](e),s},offAny(e){const t=this;if(!t.eventsAnyListeners)return t;const s=t.eventsAnyListeners.indexOf(e);return s>=0&&t.eventsAnyListeners.splice(s,1),t},off(e,t){const s=this;return s.eventsListeners?(e.split(" ").forEach((e=>{void 0===t?s.eventsListeners[e]=[]:s.eventsListeners[e]&&s.eventsListeners[e].forEach(((a,i)=>{(a===t||a.__emitterProxy&&a.__emitterProxy===t)&&s.eventsListeners[e].splice(i,1)}))})),s):s},emit(...e){const t=this;if(!t.eventsListeners)return t;let s,a,i;"string"==typeof e[0]||Array.isArray(e[0])?(s=e[0],a=e.slice(1,e.length),i=t):(s=e[0].events,a=e[0].data,i=e[0].context||t),a.unshift(i);return(Array.isArray(s)?s:s.split(" ")).forEach((e=>{t.eventsAnyListeners&&t.eventsAnyListeners.length&&t.eventsAnyListeners.forEach((t=>{t.apply(i,[e,...a])})),t.eventsListeners&&t.eventsListeners[e]&&t.eventsListeners[e].forEach((e=>{e.apply(i,a)}))})),t}};function $({swiper:e,runCallbacks:t,direction:s,step:a}){const{activeIndex:i,previousIndex:r}=e;let n=s;if(n||(n=i>r?"next":i<r?"prev":"reset"),e.emit(`transition${a}`),t&&i!==r){if("reset"===n)return void e.emit(`slideResetTransition${a}`);e.emit(`slideChangeTransition${a}`),"next"===n?e.emit(`slideNextTransition${a}`):e.emit(`slidePrevTransition${a}`)}}function S(e){const t=this,s=a(),i=r(),n=t.touchEventsData,{params:l,touches:o,enabled:c}=t;if(!c)return;if(t.animating&&l.preventInteractionOnTransition)return;!t.animating&&l.cssMode&&l.loop&&t.loopFix();let p=e;p.originalEvent&&(p=p.originalEvent);let h=d(p.target);if("wrapper"===l.touchEventsTarget&&!h.closest(t.wrapperEl).length)return;if(n.isTouchEvent="touchstart"===p.type,!n.isTouchEvent&&"which"in p&&3===p.which)return;if(!n.isTouchEvent&&"button"in p&&p.button>0)return;if(n.isTouched&&n.isMoved)return;
4059!!l.noSwipingClass&&""!==l.noSwipingClass&&p.target&&p.target.shadowRoot&&e.path&&e.path[0]&&(h=d(e.path[0]));const m=l.noSwipingSelector?l.noSwipingSelector:`.${l.noSwipingClass}`,f=!(!p.target||!p.target.shadowRoot);if(l.noSwiping&&(f?function(e,t=this){return function t(s){return s&&s!==a()&&s!==r()?(s.assignedSlot&&(s=s.assignedSlot),s.closest(e)||t(s.getRootNode().host)):null}(t)}(m,p.target):h.closest(m)[0]))return void(t.allowClick=!0);if(l.swipeHandler&&!h.closest(l.swipeHandler)[0])return;o.currentX="touchstart"===p.type?p.targetTouches[0].pageX:p.pageX,o.currentY="touchstart"===p.type?p.targetTouches[0].pageY:p.pageY;const g=o.currentX,v=o.currentY,w=l.edgeSwipeDetection||l.iOSEdgeSwipeDetection,b=l.edgeSwipeThreshold||l.iOSEdgeSwipeThreshold;if(w&&(g<=b||g>=i.innerWidth-b)){if("prevent"!==w)return;e.preventDefault()}if(Object.assign(n,{isTouched:!0,isMoved:!1,allowTouchCallbacks:!0,isScrolling:void 0,startMoving:void 0}),o.startX=g,o.startY=v,n.touchStartTime=u(),t.allowClick=!0,t.updateSize(),t.swipeDirection=void 0,l.threshold>0&&(n.allowThresholdMove=!1),"touchstart"!==p.type){let e=!0;h.is(n.focusableElements)&&(e=!1),s.activeElement&&d(s.activeElement).is(n.focusableElements)&&s.activeElement!==h[0]&&s.activeElement.blur();const a=e&&t.allowTouchMove&&l.touchStartPreventDefault;!l.touchStartForcePreventDefault&&!a||h[0].isContentEditable||p.preventDefault()}t.emit("touchStart",p)}function M(e){const t=a(),s=this,i=s.touchEventsData,{params:r,touches:n,rtlTranslate:l,enabled:o}=s;if(!o)return;let c=e;if(c.originalEvent&&(c=c.originalEvent),!i.isTouched)return void(i.startMoving&&i.isScrolling&&s.emit("touchMoveOpposite",c));if(i.isTouchEvent&&"touchmove"!==c.type)return;const p="touchmove"===c.type&&c.targetTouches&&(c.targetTouches[0]||c.changedTouches[0]),h="touchmove"===c.type?p.pageX:c.pageX,m="touchmove"===c.type?p.pageY:c.pageY;if(c.preventedByNestedSwiper)return n.startX=h,void(n.startY=m);if(!s.allowTouchMove)return s.allowClick=!1,void(i.isTouched&&(Object.assign(n,{startX:h,startY:m,currentX:h,currentY:m}),i.touchStartTime=u()));if(i.isTouchEvent&&r.touchReleaseOnEdges&&!r.loop)if(s.isVertical()){if(m<n.startY&&s.translate<=s.maxTranslate()||m>n.startY&&s.translate>=s.minTranslate())return i.isTouched=!1,void(i.isMoved=!1)}else if(h<n.startX&&s.translate<=s.maxTranslate()||h>n.startX&&s.translate>=s.minTranslate())return;if(i.isTouchEvent&&t.activeElement&&c.target===t.activeElement&&d(c.target).is(i.focusableElements))return i.isMoved=!0,void(s.allowClick=!1);if(i.allowTouchCallbacks&&s.emit("touchMove",c),c.targetTouches&&c.targetTouches.length>1)return;n.currentX=h,n.currentY=m;const f=n.currentX-n.startX,g=n.currentY-n.startY;if(s.params.threshold&&Math.sqrt(f**2+g**2)<s.params.threshold)return;if(void 0===i.isScrolling){let e;s.isHorizontal()&&n.currentY===n.startY||s.isVertical()&&n.currentX===n.startX?i.isScrolling=!1:f*f+g*g>=25&&(e=180*Math.atan2(Math.abs(g),Math.abs(f))/Math.PI,i.isScrolling=s.isHorizontal()?e>r.touchAngle:90-e>r.touchAngle)}if(i.isScrolling&&s.emit("touchMoveOpposite",c),void 0===i.startMoving&&(n.currentX===n.startX&&n.currentY===n.startY||(i.startMoving=!0)),i.isScrolling)return void(i.isTouched=!1);if(!i.startMoving)return;s.allowClick=!1,!r.cssMode&&c.cancelable&&c.preventDefault(),r.touchMoveStopPropagation&&!r.nested&&c.stopPropagation(),i.isMoved||(r.loop&&!r.cssMode&&s.loopFix(),i.startTranslate=s.getTranslate(),s.setTransition(0),s.animating&&s.$wrapperEl.trigger("webkitTransitionEnd transitionend"),i.allowMomentumBounce=!1,!r.grabCursor||!0!==s.allowSlideNext&&!0!==s.allowSlidePrev||s.setGrabCursor(!0),s.emit("sliderFirstMove",c)),s.emit("sliderMove",c),i.isMoved=!0;let v=s.isHorizontal()?f:g;n.diff=v,v*=r.touchRatio,l&&(v=-v),s.swipeDirection=v>0?"prev":"next",i.currentTranslate=v+i.startTranslate;let w=!0,b=r.resistanceRatio;if(r.touchReleaseOnEdges&&(b=0),v>0&&i.currentTranslate>s.minTranslate()?(w=!1,r.resistance&&(i.currentTranslate=s.minTranslate()-1+(-s.minTranslate()+i.startTranslate+v)**b)):v<0&&i.currentTranslate<s.maxTranslate()&&(w=!1,r.resistance&&(i.currentTranslate=s.maxTranslate()+1-(s.maxTranslate()-i.startTranslate-v)**b)),w&&(c.preventedByNestedSwiper=!0),!s.allowSlideNext&&"next"===s.swipeDirection&&i.currentTranslate<i.startTranslate&&(i.currentTranslate=i.startTranslate),!s.allowSlidePrev&&"prev"===s.swipeDirection&&i.currentTranslate>i.startTranslate&&(i.currentTranslate=i.startTranslate),s.allowSlidePrev||s.allowSlideNext||(i.currentTranslate=i.startTranslate),r.threshold>0){if(!(Math.abs(v)>r.threshold||i.allowThresholdMove))return void(i.currentTranslate=i.startTranslate);
4059if(!i.allowThresholdMove)return i.allowThresholdMove=!0,n.startX=n.currentX,n.startY=n.currentY,i.currentTranslate=i.startTranslate,void(n.diff=s.isHorizontal()?n.currentX-n.startX:n.currentY-n.startY)}r.followFinger&&!r.cssMode&&((r.freeMode&&r.freeMode.enabled&&s.freeMode||r.watchSlidesProgress)&&(s.updateActiveIndex(),s.updateSlidesClasses()),s.params.freeMode&&r.freeMode.enabled&&s.freeMode&&s.freeMode.onTouchMove(),s.updateProgress(i.currentTranslate),s.setTranslate(i.currentTranslate))}function P(e){const t=this,s=t.touchEventsData,{params:a,touches:i,rtlTranslate:r,slidesGrid:n,enabled:l}=t;if(!l)return;let o=e;if(o.originalEvent&&(o=o.originalEvent),s.allowTouchCallbacks&&t.emit("touchEnd",o),s.allowTouchCallbacks=!1,!s.isTouched)return s.isMoved&&a.grabCursor&&t.setGrabCursor(!1),s.isMoved=!1,void(s.startMoving=!1);a.grabCursor&&s.isMoved&&s.isTouched&&(!0===t.allowSlideNext||!0===t.allowSlidePrev)&&t.setGrabCursor(!1);const d=u(),c=d-s.touchStartTime;if(t.allowClick&&(t.updateClickedSlide(o),t.emit("tap click",o),c<300&&d-s.lastClickTime<300&&t.emit("doubleTap doubleClick",o)),s.lastClickTime=u(),p((()=>{t.destroyed||(t.allowClick=!0)})),!s.isTouched||!s.isMoved||!t.swipeDirection||0===i.diff||s.currentTranslate===s.startTranslate)return s.isTouched=!1,s.isMoved=!1,void(s.startMoving=!1);let h;if(s.isTouched=!1,s.isMoved=!1,s.startMoving=!1,h=a.followFinger?r?t.translate:-t.translate:-s.currentTranslate,a.cssMode)return;if(t.params.freeMode&&a.freeMode.enabled)return void t.freeMode.onTouchEnd({currentPos:h});let m=0,f=t.slidesSizesGrid[0];for(let e=0;e<n.length;e+=e<a.slidesPerGroupSkip?1:a.slidesPerGroup){const t=e<a.slidesPerGroupSkip-1?1:a.slidesPerGroup;void 0!==n[e+t]?h>=n[e]&&h<n[e+t]&&(m=e,f=n[e+t]-n[e]):h>=n[e]&&(m=e,f=n[n.length-1]-n[n.length-2])}const g=(h-n[m])/f,v=m<a.slidesPerGroupSkip-1?1:a.slidesPerGroup;if(c>a.longSwipesMs){if(!a.longSwipes)return void t.slideTo(t.activeIndex);"next"===t.swipeDirection&&(g>=a.longSwipesRatio?t.slideTo(m+v):t.slideTo(m)),"prev"===t.swipeDirection&&(g>1-a.longSwipesRatio?t.slideTo(m+v):t.slideTo(m))}else{if(!a.shortSwipes)return void t.slideTo(t.activeIndex);t.navigation&&(o.target===t.navigation.nextEl||o.target===t.navigation.prevEl)?o.target===t.navigation.nextEl?t.slideTo(m+v):t.slideTo(m):("next"===t.swipeDirection&&t.slideTo(m+v),"prev"===t.swipeDirection&&t.slideTo(m))}}function k(){const e=this,{params:t,el:s}=e;if(s&&0===s.offsetWidth)return;t.breakpoints&&e.setBreakpoint();const{allowSlideNext:a,allowSlidePrev:i,snapGrid:r}=e;e.allowSlideNext=!0,e.allowSlidePrev=!0,e.updateSize(),e.updateSlides(),e.updateSlidesClasses(),("auto"===t.slidesPerView||t.slidesPerView>1)&&e.isEnd&&!e.isBeginning&&!e.params.centeredSlides?e.slideTo(e.slides.length-1,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0),e.autoplay&&e.autoplay.running&&e.autoplay.paused&&e.autoplay.run(),e.allowSlidePrev=i,e.allowSlideNext=a,e.params.watchOverflow&&r!==e.snapGrid&&e.checkOverflow()}function z(e){const t=this;t.enabled&&(t.allowClick||(t.params.preventClicks&&e.preventDefault(),t.params.preventClicksPropagation&&t.animating&&(e.stopPropagation(),e.stopImmediatePropagation())))}function O(){const e=this,{wrapperEl:t,rtlTranslate:s,enabled:a}=e;if(!a)return;let i;e.previousTranslate=e.translate,e.isHorizontal()?e.translate=-t.scrollLeft:e.translate=-t.scrollTop,-0===e.translate&&(e.translate=0),e.updateActiveIndex(),e.updateSlidesClasses();const r=e.maxTranslate()-e.minTranslate();i=0===r?0:(e.translate-e.minTranslate())/r,i!==e.progress&&e.updateProgress(s?-e.translate:e.translate),e.emit("setTranslate",e.translate,!1)}let I=!1;function L(){}const A=(e,t)=>{const s=a(),{params:i,touchEvents:r,el:n,wrapperEl:l,device:o,support:d}=e,c=!!i.nested,p="on"===t?"addEventListener":"removeEventListener",u=t;if(d.touch){const t=!("touchstart"!==r.start||!d.passiveListener||!i.passiveListeners)&&{passive:!0,capture:!1};n[p](r.start,e.onTouchStart,t),n[p](r.move,e.onTouchMove,d.passiveListener?{passive:!1,capture:c}:c),n[p](r.end,e.onTouchEnd,t),r.cancel&&n[p](r.cancel,e.onTouchEnd,t)}else n[p](r.start,e.onTouchStart,!1),s[p](r.move,e.onTouchMove,c),s[p](r.end,e.onTouchEnd,!1);(i.preventClicks||i.preventClicksPropagation)&&n[p]("click",e.onClick,!0),i.cssMode&&l[p]("scroll",e.onScroll),i.updateOnWindowResize?e[u](o.ios||o.android?"resize orientationchange observerUpdate":"resize observerUpdate",k,!0):e[u]("observerUpdate",k,!0)};const D=(e,t)=>e.grid&&t.grid&&t.grid.rows>1;var G={init:!0,direction:"horizontal",touchEventsTarget:"wrapper",initialSlide:0,speed:300,cssMode:!1,updateOnWindowResize:!0,resizeObserver:!0,nested:!1,createElements:!1,enabled:!0,focusableElements:"input, select, option, textarea, button, video, label",width:null,height:null,preventInteractionOnTransition:!1,userAgent:null,url:null,edgeSwipeDetection:!1,edgeSwipeThreshold:20,autoHeight:!1,setWrapperSize:!1,virtualTranslate:!1,effect:"slide",breakpoints:void 0,breakpointsBase:"window",
4059spaceBetween:0,slidesPerView:1,slidesPerGroup:1,slidesPerGroupSkip:0,slidesPerGroupAuto:!1,centeredSlides:!1,centeredSlidesBounds:!1,slidesOffsetBefore:0,slidesOffsetAfter:0,normalizeSlideIndex:!0,centerInsufficientSlides:!1,watchOverflow:!0,roundLengths:!1,touchRatio:1,touchAngle:45,simulateTouch:!0,shortSwipes:!0,longSwipes:!0,longSwipesRatio:.5,longSwipesMs:300,followFinger:!0,allowTouchMove:!0,threshold:0,touchMoveStopPropagation:!1,touchStartPreventDefault:!0,touchStartForcePreventDefault:!1,touchReleaseOnEdges:!1,uniqueNavElements:!0,resistance:!0,resistanceRatio:.85,watchSlidesProgress:!1,grabCursor:!1,preventClicks:!0,preventClicksPropagation:!0,slideToClickedSlide:!1,preloadImages:!0,updateOnImagesReady:!0,loop:!1,loopAdditionalSlides:0,loopedSlides:null,loopFillGroupWithBlank:!1,loopPreventsSlide:!0,allowSlidePrev:!0,allowSlideNext:!0,swipeHandler:null,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:null,passiveListeners:!0,containerModifierClass:"swiper-",slideClass:"swiper-slide",slideBlankClass:"swiper-slide-invisible-blank",slideActiveClass:"swiper-slide-active",slideDuplicateActiveClass:"swiper-slide-duplicate-active",slideVisibleClass:"swiper-slide-visible",slideDuplicateClass:"swiper-slide-duplicate",slideNextClass:"swiper-slide-next",slideDuplicateNextClass:"swiper-slide-duplicate-next",slidePrevClass:"swiper-slide-prev",slideDuplicatePrevClass:"swiper-slide-duplicate-prev",wrapperClass:"swiper-wrapper",runCallbacksOnInit:!0,_emitClasses:!1};function N(e,t){return function(s={}){const a=Object.keys(s)[0],i=s[a];"object"==typeof i&&null!==i?(["navigation","pagination","scrollbar"].indexOf(a)>=0&&!0===e[a]&&(e[a]={auto:!0}),a in e&&"enabled"in i?(!0===e[a]&&(e[a]={enabled:!0}),"object"!=typeof e[a]||"enabled"in e[a]||(e[a].enabled=!0),e[a]||(e[a]={enabled:!1}),f(t,s)):f(t,s)):f(t,s)}}const B={eventsEmitter:C,update:{updateSize:function(){const e=this;let t,s;const a=e.$el;t=void 0!==e.params.width&&null!==e.params.width?e.params.width:a[0].clientWidth,s=void 0!==e.params.height&&null!==e.params.height?e.params.height:a[0].clientHeight,0===t&&e.isHorizontal()||0===s&&e.isVertical()||(t=t-parseInt(a.css("padding-left")||0,10)-parseInt(a.css("padding-right")||0,10),s=s-parseInt(a.css("padding-top")||0,10)-parseInt(a.css("padding-bottom")||0,10),Number.isNaN(t)&&(t=0),Number.isNaN(s)&&(s=0),Object.assign(e,{width:t,height:s,size:e.isHorizontal()?t:s}))},updateSlides:function(){const e=this;function t(t){return e.isHorizontal()?t:{width:"height","margin-top":"margin-left","margin-bottom ":"margin-right","margin-left":"margin-top","margin-right":"margin-bottom","padding-left":"padding-top","padding-right":"padding-bottom",marginRight:"marginBottom"}[t]}function s(e,s){return parseFloat(e.getPropertyValue(t(s))||0)}const a=e.params,{$wrapperEl:i,size:r,rtlTranslate:n,wrongRTL:l}=e,o=e.virtual&&a.virtual.enabled,d=o?e.virtual.slides.length:e.slides.length,c=i.children(`.${e.params.slideClass}`),p=o?e.virtual.slides.length:c.length;let u=[];const h=[],m=[];let f=a.slidesOffsetBefore;"function"==typeof f&&(f=a.slidesOffsetBefore.call(e));let v=a.slidesOffsetAfter;"function"==typeof v&&(v=a.slidesOffsetAfter.call(e));const w=e.snapGrid.length,b=e.slidesGrid.length;let x=a.spaceBetween,y=-f,E=0,T=0;if(void 0===r)return;"string"==typeof x&&x.indexOf("%")>=0&&(x=parseFloat(x.replace("%",""))/100*r),e.virtualSize=-x,n?c.css({marginLeft:"",marginBottom:"",marginTop:""}):c.css({marginRight:"",marginBottom:"",marginTop:""}),a.centeredSlides&&a.cssMode&&(g(e.wrapperEl,"--swiper-centered-offset-before",""),g(e.wrapperEl,"--swiper-centered-offset-after",""));const C=a.grid&&a.grid.rows>1&&e.grid;let $;C&&e.grid.initSlides(p);const S="auto"===a.slidesPerView&&a.breakpoints&&Object.keys(a.breakpoints).filter((e=>void 0!==a.breakpoints[e].slidesPerView)).length>0;for(let i=0;i<p;i+=1){$=0;const n=c.eq(i);if(C&&e.grid.updateSlide(i,n,p,t),"none"!==n.css("display")){if("auto"===a.slidesPerView){S&&(c[i].style[t("width")]="");const r=getComputedStyle(n[0]),l=n[0].style.transform,o=n[0].style.webkitTransform;if(l&&(n[0].style.transform="none"),o&&(n[0].style.webkitTransform="none"),a.roundLengths)$=e.isHorizontal()?n.outerWidth(!0):n.outerHeight(!0);else{const e=s(r,"width"),t=s(r,"padding-left"),a=s(r,"padding-right"),i=s(r,"margin-left"),l=s(r,"margin-right"),o=r.getPropertyValue("box-sizing");if(o&&"border-box"===o)$=e+i+l;else{const{clientWidth:s,offsetWidth:r}=n[0];$=e+t+a+i+l+(r-s)}}l&&(n[0].style.transform=l),o&&(n[0].style.webkitTransform=o),a.roundLengths&&($=Math.floor($))}else $=(r-(a.slidesPerView-1)*x)/a.slidesPerView,a.roundLengths&&($=Math.floor($)),c[i]&&(c[i].style[t("width")]=`${$}px`);c[i]&&(c[i].swiperSlideSize=$),m.push($),a.centeredSlides?(y=y+$/2+E/2+x,0===E&&0!==i&&(y=y-r/2-x),0===i&&(y=y-r/2-x),Math.abs(y)<.001&&(y=0),a.roundLengths&&(y=Math.floor(y)),T%a.slidesPerGroup==0&&u.push(y),h.push(y)):(a.roun
4059dLengths&&(y=Math.floor(y)),(T-Math.min(e.params.slidesPerGroupSkip,T))%e.params.slidesPerGroup==0&&u.push(y),h.push(y),y=y+$+x),e.virtualSize+=$+x,E=$,T+=1}}if(e.virtualSize=Math.max(e.virtualSize,r)+v,n&&l&&("slide"===a.effect||"coverflow"===a.effect)&&i.css({width:`${e.virtualSize+a.spaceBetween}px`}),a.setWrapperSize&&i.css({[t("width")]:`${e.virtualSize+a.spaceBetween}px`}),C&&e.grid.updateWrapperSize($,u,t),!a.centeredSlides){const t=[];for(let s=0;s<u.length;s+=1){let i=u[s];a.roundLengths&&(i=Math.floor(i)),u[s]<=e.virtualSize-r&&t.push(i)}u=t,Math.floor(e.virtualSize-r)-Math.floor(u[u.length-1])>1&&u.push(e.virtualSize-r)}if(0===u.length&&(u=[0]),0!==a.spaceBetween){const s=e.isHorizontal()&&n?"marginLeft":t("marginRight");c.filter(((e,t)=>!a.cssMode||t!==c.length-1)).css({[s]:`${x}px`})}if(a.centeredSlides&&a.centeredSlidesBounds){let e=0;m.forEach((t=>{e+=t+(a.spaceBetween?a.spaceBetween:0)})),e-=a.spaceBetween;const t=e-r;u=u.map((e=>e<0?-f:e>t?t+v:e))}if(a.centerInsufficientSlides){let e=0;if(m.forEach((t=>{e+=t+(a.spaceBetween?a.spaceBetween:0)})),e-=a.spaceBetween,e<r){const t=(r-e)/2;u.forEach(((e,s)=>{u[s]=e-t})),h.forEach(((e,s)=>{h[s]=e+t}))}}if(Object.assign(e,{slides:c,snapGrid:u,slidesGrid:h,slidesSizesGrid:m}),a.centeredSlides&&a.cssMode&&!a.centeredSlidesBounds){g(e.wrapperEl,"--swiper-centered-offset-before",-u[0]+"px"),g(e.wrapperEl,"--swiper-centered-offset-after",e.size/2-m[m.length-1]/2+"px");const t=-e.snapGrid[0],s=-e.slidesGrid[0];e.snapGrid=e.snapGrid.map((e=>e+t)),e.slidesGrid=e.slidesGrid.map((e=>e+s))}p!==d&&e.emit("slidesLengthChange"),u.length!==w&&(e.params.watchOverflow&&e.checkOverflow(),e.emit("snapGridLengthChange")),h.length!==b&&e.emit("slidesGridLengthChange"),a.watchSlidesProgress&&e.updateSlidesOffset()},updateAutoHeight:function(e){const t=this,s=[],a=t.virtual&&t.params.virtual.enabled;let i,r=0;"number"==typeof e?t.setTransition(e):!0===e&&t.setTransition(t.params.speed);const n=e=>a?t.slides.filter((t=>parseInt(t.getAttribute("data-swiper-slide-index"),10)===e))[0]:t.slides.eq(e)[0];if("auto"!==t.params.slidesPerView&&t.params.slidesPerView>1)if(t.params.centeredSlides)t.visibleSlides.each((e=>{s.push(e)}));else for(i=0;i<Math.ceil(t.params.slidesPerView);i+=1){const e=t.activeIndex+i;if(e>t.slides.length&&!a)break;s.push(n(e))}else s.push(n(t.activeIndex));for(i=0;i<s.length;i+=1)if(void 0!==s[i]){const e=s[i].offsetHeight;r=e>r?e:r}r&&t.$wrapperEl.css("height",`${r}px`)},updateSlidesOffset:function(){const e=this,t=e.slides;for(let s=0;s<t.length;s+=1)t[s].swiperSlideOffset=e.isHorizontal()?t[s].offsetLeft:t[s].offsetTop},updateSlidesProgress:function(e=this&&this.translate||0){const t=this,s=t.params,{slides:a,rtlTranslate:i,snapGrid:r}=t;if(0===a.length)return;void 0===a[0].swiperSlideOffset&&t.updateSlidesOffset();let n=-e;i&&(n=e),a.removeClass(s.slideVisibleClass),t.visibleSlidesIndexes=[],t.visibleSlides=[];for(let e=0;e<a.length;e+=1){const l=a[e];let o=l.swiperSlideOffset;s.cssMode&&s.centeredSlides&&(o-=a[0].swiperSlideOffset);const d=(n+(s.centeredSlides?t.minTranslate():0)-o)/(l.swiperSlideSize+s.spaceBetween),c=(n-r[0]+(s.centeredSlides?t.minTranslate():0)-o)/(l.swiperSlideSize+s.spaceBetween),p=-(n-o),u=p+t.slidesSizesGrid[e];(p>=0&&p<t.size-1||u>1&&u<=t.size||p<=0&&u>=t.size)&&(t.visibleSlides.push(l),t.visibleSlidesIndexes.push(e),a.eq(e).addClass(s.slideVisibleClass)),l.progress=i?-d:d,l.originalProgress=i?-c:c}t.visibleSlides=d(t.visibleSlides)},updateProgress:function(e){const t=this;if(void 0===e){const s=t.rtlTranslate?-1:1;e=t&&t.translate&&t.translate*s||0}const s=t.params,a=t.maxTranslate()-t.minTranslate();let{progress:i,isBeginning:r,isEnd:n}=t;const l=r,o=n;0===a?(i=0,r=!0,n=!0):(i=(e-t.minTranslate())/a,r=i<=0,n=i>=1),Object.assign(t,{progress:i,isBeginning:r,isEnd:n}),(s.watchSlidesProgress||s.centeredSlides&&s.autoHeight)&&t.updateSlidesProgress(e),r&&!l&&t.emit("reachBeginning toEdge"),n&&!o&&t.emit("reachEnd toEdge"),(l&&!r||o&&!n)&&t.emit("fromEdge"),t.emit("progress",i)},updateSlidesClasses:function(){const e=this,{slides:t,params:s,$wrapperEl:a,activeIndex:i,realIndex:r}=e,n=e.virtual&&s.virtual.enabled;let l;t.removeClass(`${s.slideActiveClass} ${s.slideNextClass} ${s.slidePrevClass} ${s.slideDuplicateActiveClass} ${s.slideDuplicateNextClass} ${s.slideDuplicatePrevClass}`),l=n?e.$wrapperEl.find(`.${s.slideClass}[data-swiper-slide-index="${i}"]`):t.eq(i),l.addClass(s.slideActiveClass),s.loop&&(l.hasClass(s.slideDuplicateClass)?a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${r}"]`).addClass(s.slideDuplicateActiveClass):a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${r}"]`).addClass(s.slideDuplicateActiveClass));let o=l.nextAll(`.${s.slideClass}`).eq(0).addClass(s.slideNextClass);s.loop&&0===o.length&&(o=t.eq(0),o.addClass(s.slideNextClass));let d=l.prevAll(`.${s.slideClass}`).eq(0).addClass(s.slidePrevClass);s.loop&&0===d.length&&(d=t.eq(-1),d.addClass(s.slidePrevClass)),s.loop&&(o.hasClass(s.slideDuplicateClass)?a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${o.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicateNextClass):a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${o.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicateNextClass),d.hasClass(s.slideDuplicateClass)?a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${d.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicatePrevClass):a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${d.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicatePrevClass)),e.emitSlidesClasses()},updateActiveIndex:function(e){const t=this,s=t.rtlTranslate?t.translate:-t.translate,{slidesGrid:a,snapGrid:i,params:r,activeIndex:n,realIndex:l,snapIndex:o}=t;let d,c=e;if(void 0===c){for(let e=0;e<a.length;e+=1)void 0!==a[e+1]?s>=a[e]&&s<a[e+1]-(a[e+1]-a[e])/2?c=e:s>
4059=a[e]&&s<a[e+1]&&(c=e+1):s>=a[e]&&(c=e);r.normalizeSlideIndex&&(c<0||void 0===c)&&(c=0)}if(i.indexOf(s)>=0)d=i.indexOf(s);else{const e=Math.min(r.slidesPerGroupSkip,c);d=e+Math.floor((c-e)/r.slidesPerGroup)}if(d>=i.length&&(d=i.length-1),c===n)return void(d!==o&&(t.snapIndex=d,t.emit("snapIndexChange")));const p=parseInt(t.slides.eq(c).attr("data-swiper-slide-index")||c,10);Object.assign(t,{snapIndex:d,realIndex:p,previousIndex:n,activeIndex:c}),t.emit("activeIndexChange"),t.emit("snapIndexChange"),l!==p&&t.emit("realIndexChange"),(t.initialized||t.params.runCallbacksOnInit)&&t.emit("slideChange")},updateClickedSlide:function(e){const t=this,s=t.params,a=d(e.target).closest(`.${s.slideClass}`)[0];let i,r=!1;if(a)for(let e=0;e<t.slides.length;e+=1)if(t.slides[e]===a){r=!0,i=e;break}if(!a||!r)return t.clickedSlide=void 0,void(t.clickedIndex=void 0);t.clickedSlide=a,t.virtual&&t.params.virtual.enabled?t.clickedIndex=parseInt(d(a).attr("data-swiper-slide-index"),10):t.clickedIndex=i,s.slideToClickedSlide&&void 0!==t.clickedIndex&&t.clickedIndex!==t.activeIndex&&t.slideToClickedSlide()}},translate:{getTranslate:function(e=(this.isHorizontal()?"x":"y")){const{params:t,rtlTranslate:s,translate:a,$wrapperEl:i}=this;if(t.virtualTranslate)return s?-a:a;if(t.cssMode)return a;let r=h(i[0],e);return s&&(r=-r),r||0},setTranslate:function(e,t){const s=this,{rtlTranslate:a,params:i,$wrapperEl:r,wrapperEl:n,progress:l}=s;let o,d=0,c=0;s.isHorizontal()?d=a?-e:e:c=e,i.roundLengths&&(d=Math.floor(d),c=Math.floor(c)),i.cssMode?n[s.isHorizontal()?"scrollLeft":"scrollTop"]=s.isHorizontal()?-d:-c:i.virtualTranslate||r.transform(`translate3d(${d}px, ${c}px, 0px)`),s.previousTranslate=s.translate,s.translate=s.isHorizontal()?d:c;const p=s.maxTranslate()-s.minTranslate();o=0===p?0:(e-s.minTranslate())/p,o!==l&&s.updateProgress(e),s.emit("setTranslate",s.translate,t)},minTranslate:function(){return-this.snapGrid[0]},maxTranslate:function(){return-this.snapGrid[this.snapGrid.length-1]},translateTo:function(e=0,t=this.params.speed,s=!0,a=!0,i){const r=this,{params:n,wrapperEl:l}=r;if(r.animating&&n.preventInteractionOnTransition)return!1;const o=r.minTranslate(),d=r.maxTranslate();let c;if(c=a&&e>o?o:a&&e<d?d:e,r.updateProgress(c),n.cssMode){const e=r.isHorizontal();if(0===t)l[e?"scrollLeft":"scrollTop"]=-c;else{if(!r.support.smoothScroll)return v({swiper:r,targetPosition:-c,side:e?"left":"top"}),!0;l.scrollTo({[e?"left":"top"]:-c,behavior:"smooth"})}return!0}return 0===t?(r.setTransition(0),r.setTranslate(c),s&&(r.emit("beforeTransitionStart",t,i),r.emit("transitionEnd"))):(r.setTransition(t),r.setTranslate(c),s&&(r.emit("beforeTransitionStart",t,i),r.emit("transitionStart")),r.animating||(r.animating=!0,r.onTranslateToWrapperTransitionEnd||(r.onTranslateToWrapperTransitionEnd=function(e){r&&!r.destroyed&&e.target===this&&(r.$wrapperEl[0].removeEventListener("transitionend",r.onTranslateToWrapperTransitionEnd),r.$wrapperEl[0].removeEventListener("webkitTransitionEnd",r.onTranslateToWrapperTransitionEnd),r.onTranslateToWrapperTransitionEnd=null,delete r.onTranslateToWrapperTransitionEnd,s&&r.emit("transitionEnd"))}),r.$wrapperEl[0].addEventListener("transitionend",r.onTranslateToWrapperTransitionEnd),r.$wrapperEl[0].addEventListener("webkitTransitionEnd",r.onTranslateToWrapperTransitionEnd))),!0}},transition:{setTransition:function(e,t){const s=this;s.params.cssMode||s.$wrapperEl.transition(e),s.emit("setTransition",e,t)},transitionStart:function(e=!0,t){const s=this,{params:a}=s;a.cssMode||(a.autoHeight&&s.updateAutoHeight(),$({swiper:s,runCallbacks:e,direction:t,step:"Start"}))},transitionEnd:function(e=!0,t){const s=this,{params:a}=s;s.animating=!1,a.cssMode||(s.setTransition(0),$({swiper:s,runCallbacks:e,direction:t,step:"End"}))}},slide:{slideTo:function(e=0,t=this.params.speed,s=!0,a,i){if("number"!=typeof e&&"string"!=typeof e)throw new Error(`The 'index' argument cannot have type other than 'number' or 'string'. [${typeof e}] given.`);if("string"==typeof e){const t=parseInt(e,10);if(!isFinite(t))throw new Error(`The passed-in 'index' (string) couldn't be converted to 'number'. [${e}] given.`);e=t}const r=this;let n=e;n<0&&(n=0);const{params:l,snapGrid:o,slidesGrid:d,previousIndex:c,activeIndex:p,rtlTranslate:u,wrapperEl:h,enabled:m}=r;if(r.animating&&l.preventInteractionOnTransition||!m&&!a&&!i)return!1;const f=Math.min(r.params.slidesPerGroupSkip,n);let g=f+Math.floor((n-f)/r.params.slidesPerGroup);g>=o.length&&(g=o.length-1),(p||l.initialSlide||0)===(c||0)&&s&&r.emit("beforeSlideChangeStart");const w=-o[g];if(r.updateProgress(w),l.normalizeSlideIndex)for(let e=0;e<d.length;e+=1){const t=-Math.floor(100*w),s=Math.floor(100*d[e]),a=Math.floor(100*d[e+1]);void 0!==d[e+1]?t>=s&&t<a-(a-s)/2?n=e:t>=s&&t<a&&(n=e+1):t>=s&&(n=e)}if(r.initialized&&n!==p){if(!r.allowSlideNext&&w<r.translate&&w<r.minTranslate())return!1;if(!r.allowSlidePrev&&w>r.translate&&w>r.maxTranslate()&&(p||0)!==n)return!1}let b;if(b=n>p?"next":n<p?"prev":"reset",u&&-w===r.translate||!u&&w===r.translate)return r.updateActiveIndex(n),l.autoHeight&&r.updateAutoHeight(),r.updateSlidesClasses(),"slide"!==l.effect&&r.setTranslate(w),"reset"!==b&&(r.transitionStart(s,b),r.transitionEnd(s,b)),!1;
4059if(l.cssMode){const e=r.isHorizontal(),s=u?w:-w;if(0===t){const t=r.virtual&&r.params.virtual.enabled;t&&(r.wrapperEl.style.scrollSnapType="none",r._immediateVirtual=!0),h[e?"scrollLeft":"scrollTop"]=s,t&&requestAnimationFrame((()=>{r.wrapperEl.style.scrollSnapType="",r._swiperImmediateVirtual=!1}))}else{if(!r.support.smoothScroll)return v({swiper:r,targetPosition:s,side:e?"left":"top"}),!0;h.scrollTo({[e?"left":"top"]:s,behavior:"smooth"})}return!0}return 0===t?(r.setTransition(0),r.setTranslate(w),r.updateActiveIndex(n),r.updateSlidesClasses(),r.emit("beforeTransitionStart",t,a),r.transitionStart(s,b),r.transitionEnd(s,b)):(r.setTransition(t),r.setTranslate(w),r.updateActiveIndex(n),r.updateSlidesClasses(),r.emit("beforeTransitionStart",t,a),r.transitionStart(s,b),r.animating||(r.animating=!0,r.onSlideToWrapperTransitionEnd||(r.onSlideToWrapperTransitionEnd=function(e){r&&!r.destroyed&&e.target===this&&(r.$wrapperEl[0].removeEventListener("transitionend",r.onSlideToWrapperTransitionEnd),r.$wrapperEl[0].removeEventListener("webkitTransitionEnd",r.onSlideToWrapperTransitionEnd),r.onSlideToWrapperTransitionEnd=null,delete r.onSlideToWrapperTransitionEnd,r.transitionEnd(s,b))}),r.$wrapperEl[0].addEventListener("transitionend",r.onSlideToWrapperTransitionEnd),r.$wrapperEl[0].addEventListener("webkitTransitionEnd",r.onSlideToWrapperTransitionEnd))),!0},slideToLoop:function(e=0,t=this.params.speed,s=!0,a){const i=this;let r=e;return i.params.loop&&(r+=i.loopedSlides),i.slideTo(r,t,s,a)},slideNext:function(e=this.params.speed,t=!0,s){const a=this,{animating:i,enabled:r,params:n}=a;if(!r)return a;let l=n.slidesPerGroup;"auto"===n.slidesPerView&&1===n.slidesPerGroup&&n.slidesPerGroupAuto&&(l=Math.max(a.slidesPerViewDynamic("current",!0),1));const o=a.activeIndex<n.slidesPerGroupSkip?1:l;if(n.loop){if(i&&n.loopPreventsSlide)return!1;a.loopFix(),a._clientLeft=a.$wrapperEl[0].clientLeft}return a.slideTo(a.activeIndex+o,e,t,s)},slidePrev:function(e=this.params.speed,t=!0,s){const a=this,{params:i,animating:r,snapGrid:n,slidesGrid:l,rtlTranslate:o,enabled:d}=a;if(!d)return a;if(i.loop){if(r&&i.loopPreventsSlide)return!1;a.loopFix(),a._clientLeft=a.$wrapperEl[0].clientLeft}function c(e){return e<0?-Math.floor(Math.abs(e)):Math.floor(e)}const p=c(o?a.translate:-a.translate),u=n.map((e=>c(e)));let h=n[u.indexOf(p)-1];if(void 0===h&&i.cssMode){let e;
4059n.forEach(((t,s)=>{p>=t&&(e=s)})),void 0!==e&&(h=n[e>0?e-1:e])}let m=0;return void 0!==h&&(m=l.indexOf(h),m<0&&(m=a.activeIndex-1),"auto"===i.slidesPerView&&1===i.slidesPerGroup&&i.slidesPerGroupAuto&&(m=m-a.slidesPerViewDynamic("previous",!0)+1,m=Math.max(m,0))),a.slideTo(m,e,t,s)},slideReset:function(e=this.params.speed,t=!0,s){return this.slideTo(this.activeIndex,e,t,s)},slideToClosest:function(e=this.params.speed,t=!0,s,a=.5){const i=this;let r=i.activeIndex;const n=Math.min(i.params.slidesPerGroupSkip,r),l=n+Math.floor((r-n)/i.params.slidesPerGroup),o=i.rtlTranslate?i.translate:-i.translate;if(o>=i.snapGrid[l]){const e=i.snapGrid[l];o-e>(i.snapGrid[l+1]-e)*a&&(r+=i.params.slidesPerGroup)}else{const e=i.snapGrid[l-1];o-e<=(i.snapGrid[l]-e)*a&&(r-=i.params.slidesPerGroup)}return r=Math.max(r,0),r=Math.min(r,i.slidesGrid.length-1),i.slideTo(r,e,t,s)},slideToClickedSlide:function(){const e=this,{params:t,$wrapperEl:s}=e,a="auto"===t.slidesPerView?e.slidesPerViewDynamic():t.slidesPerView;let i,r=e.clickedIndex;if(t.loop){if(e.animating)return;i=parseInt(d(e.clickedSlide).attr("data-swiper-slide-index"),10),t.centeredSlides?r<e.loopedSlides-a/2||r>e.slides.length-e.loopedSlides+a/2?(e.loopFix(),r=s.children(`.${t.slideClass}[data-swiper-slide-index="${i}"]:not(.${t.slideDuplicateClass})`).eq(0).index(),p((()=>{e.slideTo(r)}))):e.slideTo(r):r>e.slides.length-a?(e.loopFix(),r=s.children(`.${t.slideClass}[data-swiper-slide-index="${i}"]:not(.${t.slideDuplicateClass})`).eq(0).index(),p((()=>{e.slideTo(r)}))):e.slideTo(r)}else e.slideTo(r)}},loop:{loopCreate:function(){const e=this,t=a(),{params:s,$wrapperEl:i}=e,r=d(i.children()[0].parentNode);r.children(`.${s.slideClass}.${s.slideDuplicateClass}`).remove();let n=r.children(`.${s.slideClass}`);if(s.loopFillGroupWithBlank){const e=s.slidesPerGroup-n.length%s.slidesPerGroup;if(e!==s.slidesPerGroup){for(let a=0;a<e;a+=1){const e=d(t.createElement("div")).addClass(`${s.slideClass} ${s.slideBlankClass}`);r.append(e)}n=r.children(`.${s.slideClass}`)}}"auto"!==s.slidesPerView||s.loopedSlides||(s.loopedSlides=n.length),e.loopedSlides=Math.ceil(parseFloat(s.loopedSlides||s.slidesPerView,10)),e.loopedSlides+=s.loopAdditionalSlides,e.loopedSlides>n.length&&(e.loopedSlides=n.length);const l=[],o=[];n.each(((t,s)=>{const a=d(t);s<e.loopedSlides&&o.push(t),s<n.length&&s>=n.length-e.loopedSlides&&l.push(t),a.attr("data-swiper-slide-index",s)}));for(let e=0;e<o.length;e+=1)r.append(d(o[e].cloneNode(!0)).addClass(s.slideDuplicateClass));for(let e=l.length-1;e>=0;e-=1)r.prepend(d(l[e].cloneNode(!0)).addClass(s.slideDuplicateClass))},loopFix:function(){const e=this;e.emit("beforeLoopFix");const{activeIndex:t,slides:s,loopedSlides:a,allowSlidePrev:i,allowSlideNext:r,snapGrid:n,rtlTranslate:l}=e;let o;e.allowSlidePrev=!0,e.allowSlideNext=!0;const d=-n[t]-e.getTranslate();if(t<a){o=s.length-3*a+t,o+=a;e.slideTo(o,0,!1,!0)&&0!==d&&e.setTranslate((l?-e.translate:e.translate)-d)}else if(t>=s.length-a){o=-s.length+t+a,o+=a;e.slideTo(o,0,!1,!0)&&0!==d&&e.setTranslate((l?-e.translate:e.translate)-d)}e.allowSlidePrev=i,e.allowSlideNext=r,e.emit("loopFix")},loopDestroy:function(){const{$wrapperEl:e,params:t,slides:s}=this;e.children(`.${t.slideClass}.${t.slideDuplicateClass},.${t.slideClass}.${t.slideBlankClass}`).remove(),s.removeAttr("data-swiper-slide-index")}},grabCursor:{setGrabCursor:function(e){const t=this;if(t.support.touch||!t.params.simulateTouch||t.params.watchOverflow&&t.isLocked||t.params.cssMode)return;const s="container"===t.params.touchEventsTarget?t.el:t.wrapperEl;s.style.cursor="move",s.style.cursor=e?"-webkit-grabbing":"-webkit-grab",s.style.cursor=e?"-moz-grabbin":"-moz-grab",s.style.cursor=e?"grabbing":"grab"},unsetGrabCursor:function(){const e=this;e.support.touch||e.params.watchOverflow&&e.isLocked||e.params.cssMode||(e["container"===e.params.touchEventsTarget?"el":"wrapperEl"].style.cursor="")}},events:{attachEvents:function(){const e=this,t=a(),{params:s,support:i}=e;e.onTouchStart=S.bind(e),e.onTouchMove=M.bind(e),e.onTouchEnd=P.bind(e),s.cssMode&&(e.onScroll=O.bind(e)),e.onClick=z.bind(e),i.touch&&!I&&(t.addEventListener("touchstart",L),I=!0),A(e,"on")},detachEvents:function(){A(this,"off")}},breakpoints:{setBreakpoint:function(){const e=this,{activeIndex:t,initialized:s,loopedSlides:a=0,params:i,$el:r}=e,n=i.breakpoints;if(!n||n&&0===Object.keys(n).length)return;
4059const l=e.getBreakpoint(n,e.params.breakpointsBase,e.el);if(!l||e.currentBreakpoint===l)return;const o=(l in n?n[l]:void 0)||e.originalParams,d=D(e,i),c=D(e,o),p=i.enabled;d&&!c?(r.removeClass(`${i.containerModifierClass}grid ${i.containerModifierClass}grid-column`),e.emitContainerClasses()):!d&&c&&(r.addClass(`${i.containerModifierClass}grid`),(o.grid.fill&&"column"===o.grid.fill||!o.grid.fill&&"column"===i.grid.fill)&&r.addClass(`${i.containerModifierClass}grid-column`),e.emitContainerClasses());const u=o.direction&&o.direction!==i.direction,h=i.loop&&(o.slidesPerView!==i.slidesPerView||u);u&&s&&e.changeDirection(),f(e.params,o);const m=e.params.enabled;Object.assign(e,{allowTouchMove:e.params.allowTouchMove,allowSlideNext:e.params.allowSlideNext,allowSlidePrev:e.params.allowSlidePrev}),p&&!m?e.disable():!p&&m&&e.enable(),e.currentBreakpoint=l,e.emit("_beforeBreakpoint",o),h&&s&&(e.loopDestroy(),e.loopCreate(),e.updateSlides(),e.slideTo(t-a+e.loopedSlides,0,!1)),e.emit("breakpoint",o)},getBreakpoint:function(e,t="window",s){if(!e||"container"===t&&!s)return;let a=!1;const i=r(),n="window"===t?i.innerHeight:s.clientHeight,l=Object.keys(e).map((e=>{if("string"==typeof e&&0===e.indexOf("@")){const t=parseFloat(e.substr(1));return{value:n*t,point:e}}return{value:e,point:e}}));l.sort(((e,t)=>parseInt(e.value,10)-parseInt(t.value,10)));for(let e=0;e<l.length;e+=1){const{point:r,value:n}=l[e];"window"===t?i.matchMedia(`(min-width: ${n}px)`).matches&&(a=r):n<=s.clientWidth&&(a=r)}return a||"max"}},checkOverflow:{checkOverflow:function(){const e=this,{isLocked:t,params:s}=e,{slidesOffsetBefore:a}=s;if(a){const t=e.slides.length-1,s=e.slidesGrid[t]+e.slidesSizesGrid[t]+2*a;e.isLocked=e.size>s}else e.isLocked=1===e.snapGrid.length;!0===s.allowSlideNext&&(e.allowSlideNext=!e.isLocked),!0===s.allowSlidePrev&&(e.allowSlidePrev=!e.isLocked),t&&t!==e.isLocked&&(e.isEnd=!1),t!==e.isLocked&&e.emit(e.isLocked?"lock":"unlock")}},classes:{addClasses:function(){const e=this,{classNames:t,params:s,rtl:a,$el:i,device:r,support:n}=e,l=function(e,t){const s=[];return e.forEach((e=>{"object"==typeof e?Object.keys(e).forEach((a=>{e[a]&&s.push(t+a)})):"string"==typeof e&&s.push(t+e)})),s}(["initialized",s.direction,{"pointer-events":!n.touch},{"free-mode":e.params.freeMode&&s.freeMode.enabled},{autoheight:s.autoHeight},{rtl:a},{grid:s.grid&&s.grid.rows>1},{"grid-column":s.grid&&s.grid.rows>1&&"column"===s.grid.fill},{android:r.android},{ios:r.ios},{"css-mode":s.cssMode},{centered:s.cssMode&&s.centeredSlides}],s.containerModifierClass);t.push(...l),i.addClass([...t].join(" ")),e.emitContainerClasses()},removeClasses:function(){const{$el:e,classNames:t}=this;e.removeClass(t.join(" ")),this.emitContainerClasses()}},images:{loadImage:function(e,t,s,a,i,n){const l=r();let o;function c(){n&&n()}d(e).parent("picture")[0]||e.complete&&i?c():t?(o=new l.Image,o.onload=c,o.onerror=c,a&&(o.sizes=a),s&&(o.srcset=s),t&&(o.src=t)):c()},preloadImages:function(){const e=this;function t(){null!=e&&e&&!e.destroyed&&(void 0!==e.imagesLoaded&&(e.imagesLoaded+=1),e.imagesLoaded===e.imagesToLoad.length&&(e.params.updateOnImagesReady&&e.update(),e.emit("imagesReady")))}e.imagesToLoad=e.$el.find("img");for(let s=0;s<e.imagesToLoad.length;s+=1){const a=e.imagesToLoad[s];e.loadImage(a,a.currentSrc||a.getAttribute("src"),a.srcset||a.getAttribute("srcset"),a.sizes||a.getAttribute("sizes"),!0,t)}}}},X={};class H{constructor(...e){let t,s;if(1===e.length&&e[0].constructor&&"Object"===Object.prototype.toString.call(e[0]).slice(8,-1)?s=e[0]:[t,s]=e,s||(s={}),s=f({},s),t&&!s.el&&(s.el=t),s.el&&d(s.el).length>1){const e=[];return d(s.el).each((t=>{const a=f({},s,{el:t});e.push(new H(a))})),e}const a=this;a.__swiper__=!0,a.support=y(),a.device=E({userAgent:s.userAgent}),a.browser=T(),a.eventsListeners={},a.eventsAnyListeners=[],a.modules=[...a.__modules__],s.modules&&Array.isArray(s.modules)&&a.modules.push(...s.modules);const i={};a.modules.forEach((e=>{e({swiper:a,extendParams:N(s,i),on:a.on.bind(a),once:a.once.bind(a),off:a.off.bind(a),emit:a.emit.bind(a)})}));const r=f({},G,i);return a.params=f({},r,X,s),a.originalParams=f({},a.params),a.passedParams=f({}
4059,s),a.params&&a.params.on&&Object.keys(a.params.on).forEach((e=>{a.on(e,a.params.on[e])})),a.params&&a.params.onAny&&a.onAny(a.params.onAny),a.$=d,Object.assign(a,{enabled:a.params.enabled,el:t,classNames:[],slides:d(),slidesGrid:[],snapGrid:[],slidesSizesGrid:[],isHorizontal:()=>"horizontal"===a.params.direction,isVertical:()=>"vertical"===a.params.direction,activeIndex:0,realIndex:0,isBeginning:!0,isEnd:!1,translate:0,previousTranslate:0,progress:0,velocity:0,animating:!1,allowSlideNext:a.params.allowSlideNext,allowSlidePrev:a.params.allowSlidePrev,touchEvents:function(){const e=["touchstart","touchmove","touchend","touchcancel"],t=["pointerdown","pointermove","pointerup"];return a.touchEventsTouch={start:e[0],move:e[1],end:e[2],cancel:e[3]},a.touchEventsDesktop={start:t[0],move:t[1],end:t[2]},a.support.touch||!a.params.simulateTouch?a.touchEventsTouch:a.touchEventsDesktop}(),touchEventsData:{isTouched:void 0,isMoved:void 0,allowTouchCallbacks:void 0,touchStartTime:void 0,isScrolling:void 0,currentTranslate:void 0,startTranslate:void 0,allowThresholdMove:void 0,focusableElements:a.params.focusableElements,lastClickTime:u(),clickTimeout:void 0,velocities:[],allowMomentumBounce:void 0,isTouchEvent:void 0,startMoving:void 0},allowClick:!0,allowTouchMove:a.params.allowTouchMove,touches:{startX:0,startY:0,currentX:0,currentY:0,diff:0},imagesToLoad:[],imagesLoaded:0}),a.emit("_swiper"),a.params.init&&a.init(),a}enable(){const e=this;e.enabled||(e.enabled=!0,e.params.grabCursor&&e.setGrabCursor(),e.emit("enable"))}disable(){const e=this;e.enabled&&(e.enabled=!1,e.params.grabCursor&&e.unsetGrabCursor(),e.emit("disable"))}setProgress(e,t){const s=this;e=Math.min(Math.max(e,0),1);const a=s.minTranslate(),i=(s.maxTranslate()-a)*e+a;s.translateTo(i,void 0===t?0:t),s.updateActiveIndex(),s.updateSlidesClasses()}emitContainerClasses(){const e=this;if(!e.params._emitClasses||!e.el)return;const t=e.el.className.split(" ").filter((t=>0===t.indexOf("swiper")||0===t.indexOf(e.params.containerModifierClass)));e.emit("_containerClasses",t.join(" "))}getSlideClasses(e){const t=this;return e.className.split(" ").filter((e=>0===e.indexOf("swiper-slide")||0===e.indexOf(t.params.slideClass))).join(" ")}emitSlidesClasses(){const e=this;if(!e.params._emitClasses||!e.el)return;const t=[];e.slides.each((s=>{const a=e.getSlideClasses(s);t.push({slideEl:s,classNames:a}),e.emit("_slideClass",s,a)})),e.emit("_slideClasses",t)}slidesPerViewDynamic(e="current",t=!1){const{params:s,slides:a,slidesGrid:i,slidesSizesGrid:r,size:n,activeIndex:l}=this;let o=1;if(s.centeredSlides){let e,t=a[l].swiperSlideSize;for(let s=l+1;s<a.length;s+=1)a[s]&&!e&&(t+=a[s].swiperSlideSize,o+=1,t>n&&(e=!0));for(let s=l-1;s>=0;s-=1)a[s]&&!e&&(t+=a[s].swiperSlideSize,o+=1,t>n&&(e=!0))}else if("current"===e)for(let e=l+1;e<a.length;e+=1){(t?i[e]+r[e]-i[l]<n:i[e]-i[l]<n)&&(o+=1)}else for(let e=l-1;e>=0;e-=1){i[l]-i[e]<n&&(o+=1)}return o}update(){const e=this;if(!e||e.destroyed)return;const{snapGrid:t,params:s}=e;function a(){const t=e.rtlTranslate?-1*e.translate:e.translate,s=Math.min(Math.max(t,e.maxTranslate()),e.minTranslate());e.setTranslate(s),e.updateActiveIndex(),e.updateSlidesClasses()}let i;s.breakpoints&&e.setBreakpoint(),e.updateSize(),e.updateSlides(),e.updateProgress(),e.updateSlidesClasses(),e.params.freeMode&&e.params.freeMode.enabled?(a(),e.params.autoHeight&&e.updateAutoHeight()):(i=("auto"===e.params.slidesPerView||e.params.slidesPerView>1)&&e.isEnd&&!e.params.centeredSlides?e.slideTo(e.slides.length-1,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0),i||a()),s.watchOverflow&&t!==e.snapGrid&&e.checkOverflow(),e.emit("update")}changeDirection(e,t=!0){const s=this,a=s.params.direction;return e||(e="horizontal"===a?"vertical":"horizontal"),e===a||"horizontal"!==e&&"vertical"!==e||(s.$el.removeClass(`${s.params.containerModifierClass}${a}`).addClass(`${s.params.containerModifierClass}${e}`),s.emitContainerClasses(),s.params.direction=e,s.slides.each((t=>{"vertical"===e?t.style.width="":t.style.height=""})),s.emit("changeDirection"),t&&s.update()),s}mount(e){const t=this;if(t.mounted)return!0;const s=d(e||t.params.el);if(!(e=s[0]))return!1;e.swiper=t;const i=()=>`.${(t.params.wrapperClass||"").trim().split(" ").join(".")}`;let r=(()=>
4059{if(e&&e.shadowRoot&&e.shadowRoot.querySelector){const t=d(e.shadowRoot.querySelector(i()));return t.children=e=>s.children(e),t}return s.children(i())})();if(0===r.length&&t.params.createElements){const e=a().createElement("div");r=d(e),e.className=t.params.wrapperClass,s.append(e),s.children(`.${t.params.slideClass}`).each((e=>{r.append(e)}))}return Object.assign(t,{$el:s,el:e,$wrapperEl:r,wrapperEl:r[0],mounted:!0,rtl:"rtl"===e.dir.toLowerCase()||"rtl"===s.css("direction"),rtlTranslate:"horizontal"===t.params.direction&&("rtl"===e.dir.toLowerCase()||"rtl"===s.css("direction")),wrongRTL:"-webkit-box"===r.css("display")}),!0}init(e){const t=this;if(t.initialized)return t;return!1===t.mount(e)||(t.emit("beforeInit"),t.params.breakpoints&&t.setBreakpoint(),t.addClasses(),t.params.loop&&t.loopCreate(),t.updateSize(),t.updateSlides(),t.params.watchOverflow&&t.checkOverflow(),t.params.grabCursor&&t.enabled&&t.setGrabCursor(),t.params.preloadImages&&t.preloadImages(),t.params.loop?t.slideTo(t.params.initialSlide+t.loopedSlides,0,t.params.runCallbacksOnInit,!1,!0):t.slideTo(t.params.initialSlide,0,t.params.runCallbacksOnInit,!1,!0),t.attachEvents(),t.initialized=!0,t.emit("init"),t.emit("afterInit")),t}destroy(e=!0,t=!0){const s=this,{params:a,$el:i,$wrapperEl:r,slides:n}=s;return void 0===s.params||s.destroyed||(s.emit("beforeDestroy"),s.initialized=!1,s.detachEvents(),a.loop&&s.loopDestroy(),t&&(s.removeClasses(),i.removeAttr("style"),r.removeAttr("style"),n&&n.length&&n.removeClass([a.slideVisibleClass,a.slideActiveClass,a.slideNextClass,a.slidePrevClass].join(" ")).removeAttr("style").removeAttr("data-swiper-slide-index")),s.emit("destroy"),Object.keys(s.eventsListeners).forEach((e=>{s.off(e)})),!1!==e&&(s.$el[0].swiper=null,function(e){const t=e;Object.keys(t).forEach((e=>{try{t[e]=null}catch(e){}try{delete t[e]}catch(e){}}))}(s)),s.destroyed=!0),null}static extendDefaults(e){f(X,e)}static get extendedDefaults(){return X}static get defaults(){return G}static installModule(e){H.prototype.__modules__||(H.prototype.__modules__=[]);const t=H.prototype.__modules__;"function"==typeof e&&t.indexOf(e)<0&&t.push(e)}static use(e){return Array.isArray(e)?(e.forEach((e=>H.installModule(e))),H):(H.installModule(e),H)}}function Y(e,t,s,i){const r=a();
4059return e.params.createElements&&Object.keys(i).forEach((a=>{if(!s[a]&&!0===s.auto){let n=e.$el.children(`.${i[a]}`)[0];n||(n=r.createElement("div"),n.className=i[a],e.$el.append(n)),s[a]=n,t[a]=n}})),s}function W(e=""){return`.${e.trim().replace(/([\.:!\/])/g,"\\$1").replace(/ /g,".")}`}function R(e){const t=this,{$wrapperEl:s,params:a}=t;if(a.loop&&t.loopDestroy(),"object"==typeof e&&"length"in e)for(let t=0;t<e.length;t+=1)e[t]&&s.append(e[t]);else s.append(e);a.loop&&t.loopCreate(),a.observer||t.update()}function j(e){const t=this,{params:s,$wrapperEl:a,activeIndex:i}=t;s.loop&&t.loopDestroy();let r=i+1;if("object"==typeof e&&"length"in e){for(let t=0;t<e.length;t+=1)e[t]&&a.prepend(e[t]);r=i+e.length}else a.prepend(e);s.loop&&t.loopCreate(),s.observer||t.update(),t.slideTo(r,0,!1)}function _(e,t){const s=this,{$wrapperEl:a,params:i,activeIndex:r}=s;let n=r;i.loop&&(n-=s.loopedSlides,s.loopDestroy(),s.slides=a.children(`.${i.slideClass}`));const l=s.slides.length;if(e<=0)return void s.prependSlide(t);if(e>=l)return void s.appendSlide(t);let o=n>e?n+1:n;const d=[];for(let t=l-1;t>=e;t-=1){const e=s.slides.eq(t);e.remove(),d.unshift(e)}if("object"==typeof t&&"length"in t){for(let e=0;e<t.length;e+=1)t[e]&&a.append(t[e]);o=n>e?n+t.length:n}else a.append(t);for(let e=0;e<d.length;e+=1)a.append(d[e]);i.loop&&s.loopCreate(),i.observer||s.update(),i.loop?s.slideTo(o+s.loopedSlides,0,!1):s.slideTo(o,0,!1)}function V(e){const t=this,{params:s,$wrapperEl:a,activeIndex:i}=t;let r=i;s.loop&&(r-=t.loopedSlides,t.loopDestroy(),t.slides=a.children(`.${s.slideClass}`));let n,l=r;if("object"==typeof e&&"length"in e){for(let s=0;s<e.length;s+=1)n=e[s],t.slides[n]&&t.slides.eq(n).remove(),n<l&&(l-=1);l=Math.max(l,0)}else n=e,t.slides[n]&&t.slides.eq(n).remove(),n<l&&(l-=1),l=Math.max(l,0);s.loop&&t.loopCreate(),s.observer||t.update(),s.loop?t.slideTo(l+t.loopedSlides,0,!1):t.slideTo(l,0,!1)}function q(){const e=this,t=[];for(let s=0;s<e.slides.length;s+=1)t.push(s);e.removeSlide(t)}function F(e){const{effect:t,swiper:s,on:a,setTranslate:i,setTransition:r,overwriteParams:n,perspective:l}=e;a("beforeInit",(()=>{if(s.params.effect!==t)return;s.classNames.push(`${s.params.containerModifierClass}${t}`),l&&l()&&s.classNames.push(`${s.params.containerModifierClass}3d`);const e=n?n():{};Object.assign(s.params,e),Object.assign(s.originalParams,e)})),a("setTranslate",(()=>{s.params.effect===t&&i()})),a("setTransition",((e,a)=>{s.params.effect===t&&r(a)}))}function U(e,t){return e.transformEl?t.find(e.transformEl).css({"backface-visibility":"hidden","-webkit-backface-visibility":"hidden"}):t}function K({swiper:e,duration:t,transformEl:s,allSlides:a}){const{slides:i,activeIndex:r,$wrapperEl:n}=e;if(e.params.virtualTranslate&&0!==t){let t,l=!1;t=a?s?i.find(s):i:s?i.eq(r).find(s):i.eq(r),t.transitionEnd((()=>{if(l)return;if(!e||e.destroyed)return;l=!0,e.animating=!1;const t=["webkitTransitionEnd","transitionend"];for(let e=0;e<t.length;e+=1)n.trigger(t[e])}))}}function Z(e,t,s){const a="swiper-slide-shadow"+(s?`-${s}`:""),i=e.transformEl?t.find(e.transformEl):t;let r=i.children(`.${a}`);return r.length||(r=d(`<div class="swiper-slide-shadow${s?`-${s}`:""}"></div>`),i.append(r)),r}Object.keys(B).forEach((e=>{Object.keys(B[e]).forEach((t=>{H.prototype[t]=B[e][t]}))})),H.use([function({swiper:e,on:t,emit:s}){const a=r();let i=null;const n=()=>{e&&!e.destroyed&&e.initialized&&(s("beforeResize"),s("resize"))},l=()=>{e&&!e.destroyed&&e.initialized&&s("orientationchange")};t("init",(()=>{e.params.resizeObserver&&void 0!==a.ResizeObserver?e&&!e.destroyed&&e.initialized&&(i=new ResizeObserver((t=>{const{width:s,height:a}=e;let i=s,r=a;t.forEach((({contentBoxSize:t,contentRect:s,target:a})=>{a&&a!==e.el||(i=s?s.width:(t[0]||t).inlineSize,r=s?s.height:(t[0]||t).blockSize)})),i===s&&r===a||n()})),i.observe(e.el)):(a.addEventListener("resize",n),a.addEventListener("orientationchange",l))})),t("destroy",(()=>{i&&i.unobserve&&e.el&&(i.unobserve(e.el),i=null),a.removeEventListener("resize",n),a.removeEventListener("orientationchange",l)}))},function({swiper:e,extendParams:t,on:s,emit:a}){const i=[],n=r(),l=(e,t={})=>{const s=new(n.MutationObserver||n.WebkitMutationObserver)((e=>{if(1===e.length)return void a("observerUpdate",e[0]);const t=function(){a("observerUpdate",e[0])};n.requestAnimationFrame?n.requestAnimationFrame(t):n.setTimeout(t,0)}));s.observe(e,{attributes:void 0===t.attributes||t.attributes,childList:void 0===t.childList||t.childList,characterData:void 0===t.characterData||t.characterData}),i.push(s)};t({observer:!1,observeParents:!1,observeSlideChildren:!1}),s("init",(()=>{if(e.params.observer){if(e.params.observeParents){const t=e.$el.parents();for(let e=0;e<t.length;e+=1)l(t[e])}l(e.$el[0],{childList:e.params.observeSlideChildren}),l(e.$wrapperEl[0],{attributes:!1})}})),s("destroy",(()=>
4059{i.forEach((e=>{e.disconnect()})),i.splice(0,i.length)}))}]);const J=[function({swiper:e,extendParams:t,on:s}){let a;function i(t,s){const a=e.params.virtual;if(a.cache&&e.virtual.cache[s])return e.virtual.cache[s];const i=a.renderSlide?d(a.renderSlide.call(e,t,s)):d(`<div class="${e.params.slideClass}" data-swiper-slide-index="${s}">${t}</div>`);return i.attr("data-swiper-slide-index")||i.attr("data-swiper-slide-index",s),a.cache&&(e.virtual.cache[s]=i),i}function r(t){const{slidesPerView:s,slidesPerGroup:a,centeredSlides:r}=e.params,{addSlidesBefore:n,addSlidesAfter:l}=e.params.virtual,{from:o,to:d,slides:c,slidesGrid:p,offset:u}=e.virtual;e.params.cssMode||e.updateActiveIndex();const h=e.activeIndex||0;let m,f,g;m=e.rtlTranslate?"right":e.isHorizontal()?"left":"top",r?(f=Math.floor(s/2)+a+l,g=Math.floor(s/2)+a+n):(f=s+(a-1)+l,g=a+n);const v=Math.max((h||0)-g,0),w=Math.min((h||0)+f,c.length-1),b=(e.slidesGrid[v]||0)-(e.slidesGrid[0]||0);function x(){e.updateSlides(),e.updateProgress(),e.updateSlidesClasses(),e.lazy&&e.params.lazy.enabled&&e.lazy.load()}if(Object.assign(e.virtual,{from:v,to:w,offset:b,slidesGrid:e.slidesGrid}),o===v&&d===w&&!t)return e.slidesGrid!==p&&b!==u&&e.slides.css(m,`${b}px`),void e.updateProgress();if(e.params.virtual.renderExternal)return e.params.virtual.renderExternal.call(e,{offset:b,from:v,to:w,slides:function(){const e=[];for(let t=v;t<=w;t+=1)e.push(c[t]);return e}()}),void(e.params.virtual.renderExternalUpdate&&x());const y=[],E=[];if(t)e.$wrapperEl.find(`.${e.params.slideClass}`).remove();else for(let t=o;t<=d;t+=1)(t<v||t>w)&&e.$wrapperEl.find(`.${e.params.slideClass}[data-swiper-slide-index="${t}"]`).remove();for(let e=0;e<c.length;e+=1)e>=v&&e<=w&&(void 0===d||t?E.push(e):(e>d&&E.push(e),e<o&&y.push(e)));E.forEach((t=>{e.$wrapperEl.append(i(c[t],t))})),y.sort(((e,t)=>t-e)).forEach((t=>{e.$wrapperEl.prepend(i(c[t],t))})),e.$wrapperEl.children(".swiper-slide").css(m,`${b}px`),x()}t({virtual:{enabled:!1,slides:[],cache:!0,renderSlide:null,renderExternal:null,renderExternalUpdate:!0,addSlidesBefore:0,addSlidesAfter:0}}),e.virtual={cache:{},from:void 0,to:void 0,slides:[],offset:0,slidesGrid:[]},s("beforeInit",(()=>{e.params.virtual.enabled&&(e.virtual.slides=e.params.virtual.slides,e.classNames.push(`${e.params.containerModifierClass}virtual`),e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0,e.params.initialSlide||r())})),s("setTranslate",(()=>{e.params.virtual.enabled&&(e.params.cssMode&&!e._immediateVirtual?(clearTimeout(a),a=setTimeout((()=>{r()}),100)):r())})),s("init update resize",(()=>{e.params.virtual.enabled&&e.params.cssMode&&g(e.wrapperEl,"--swiper-virtual-size",`${e.virtualSize}px`)})),Object.assign(e.virtual,{appendSlide:function(t){if("object"==typeof t&&"length"in t)for(let s=0;s<t.length;s+=1)t[s]&&e.virtual.slides.push(t[s]);else e.virtual.slides.push(t);r(!0)},prependSlide:function(t){const s=e.activeIndex;let a=s+1,i=1;if(Array.isArray(t)){for(let s=0;s<t.length;s+=1)t[s]&&e.virtual.slides.unshift(t[s]);a=s+t.length,i=t.length}else e.virtual.slides.unshift(t);if(e.params.virtual.cache){const t=e.virtual.cache,s={};Object.keys(t).forEach((e=>{const a=t[e],r=a.attr("data-swiper-slide-index");r&&a.attr("data-swiper-slide-index",parseInt(r,10)+i),s[parseInt(e,10)+i]=a})),e.virtual.cache=s}r(!0),e.slideTo(a,0)},removeSlide:function(t){if(null==t)return;let s=e.activeIndex;if(Array.isArray(t))for(let a=t.length-1;a>=0;a-=1)e.virtual.slides.splice(t[a],1),e.params.virtual.cache&&delete e.virtual.cache[t[a]],t[a]<s&&(s-=1),s=Math.max(s,0);else e.virtual.slides.splice(t,1),e.params.virtual.cache&&delete e.virtual.cache[t],t<s&&(s-=1),s=Math.max(s,0);r(!0),e.slideTo(s,0)},removeAllSlides:function(){e.virtual.slides=[],e.params.virtual.cache&&(e.virtual.cache={}),r(!0),e.slideTo(0,0)},update:r})},function({swiper:e,extendParams:t,on:s,emit:i}){const n=a(),l=r();function o(t){if(!e.enabled)return;const{rtlTranslate:s}=e;let a=t;a.originalEvent&&(a=a.originalEvent);const r=a.keyCode||a.charCode,o=e.params.keyboard.pageUpDown,d=o&&33===r,c=o&&34===r,p=37===r,u=39===r,h=38===r,m=40===r;if(!e.allowSlideNext&&(e.isHorizontal()&&u||e.isVertical()&&m||c))return!1;if(!e.allowSlidePrev&&(e.isHorizontal()&&p||e.isVertical()&&h||d))return!1;if(!(a.shiftKey||a.altKey||a.ctrlKey||a.metaKey||n.activeElement&&n.activeElement.nodeName&&("input"===n.activeElement.nodeName.toLowerCase()||"textarea"===n.activeElement.nodeName.toLowerCase()))){if(e.params.keyboard.onlyInViewport&&(d||c||p||u||h||m)){let t=!1;if(e.$el.parents(`.${e.params.slideClass}`).length>0&&0===e.$el.parents(`.${e.params.slideActiveClass}`).length)return;
4059const a=e.$el,i=a[0].clientWidth,r=a[0].clientHeight,n=l.innerWidth,o=l.innerHeight,d=e.$el.offset();s&&(d.left-=e.$el[0].scrollLeft);const c=[[d.left,d.top],[d.left+i,d.top],[d.left,d.top+r],[d.left+i,d.top+r]];for(let e=0;e<c.length;e+=1){const s=c[e];if(s[0]>=0&&s[0]<=n&&s[1]>=0&&s[1]<=o){if(0===s[0]&&0===s[1])continue;t=!0}}if(!t)return}e.isHorizontal()?((d||c||p||u)&&(a.preventDefault?a.preventDefault():a.returnValue=!1),((c||u)&&!s||(d||p)&&s)&&e.slideNext(),((d||p)&&!s||(c||u)&&s)&&e.slidePrev()):((d||c||h||m)&&(a.preventDefault?a.preventDefault():a.returnValue=!1),(c||m)&&e.slideNext(),(d||h)&&e.slidePrev()),i("keyPress",r)}}function c(){e.keyboard.enabled||(d(n).on("keydown",o),e.keyboard.enabled=!0)}function p(){e.keyboard.enabled&&(d(n).off("keydown",o),e.keyboard.enabled=!1)}e.keyboard={enabled:!1},t({keyboard:{enabled:!1,onlyInViewport:!0,pageUpDown:!0}}),s("init",(()=>{e.params.keyboard.enabled&&c()})),s("destroy",(()=>{e.keyboard.enabled&&p()})),Object.assign(e.keyboard,{enable:c,disable:p})},function({swiper:e,extendParams:t,on:s,emit:a}){const i=r();let n;t({mousewheel:{enabled:!1,releaseOnEdges:!1,invert:!1,forceToAxis:!1,sensitivity:1,eventsTarget:"container",thresholdDelta:null,thresholdTime:null}}),e.mousewheel={enabled:!1};let l,o=u();const c=[];function h(){e.enabled&&(e.mouseEntered=!0)}function m(){e.enabled&&(e.mouseEntered=!1)}function f(t){return!(e.params.mousewheel.thresholdDelta&&t.delta<e.params.mousewheel.thresholdDelta)&&(!(e.params.mousewheel.thresholdTime&&u()-o<e.params.mousewheel.thresholdTime)&&(t.delta>=6&&u()-o<60||(t.direction<0?e.isEnd&&!e.params.loop||e.animating||(e.slideNext(),a("scroll",t.raw)):e.isBeginning&&!e.params.loop||e.animating||(e.slidePrev(),a("scroll",t.raw)),o=(new i.Date).getTime(),!1)))}function g(t){let s=t,i=!0;if(!e.enabled)return;const r=e.params.mousewheel;e.params.cssMode&&s.preventDefault();let o=e.$el;if("container"!==e.params.mousewheel.eventsTarget&&(o=d(e.params.mousewheel.eventsTarget)),!e.mouseEntered&&!o[0].contains(s.target)&&!r.releaseOnEdges)return!0;s.originalEvent&&(s=s.originalEvent);let h=0;const m=e.rtlTranslate?-1:1,g=function(e){let t=0,s=0,a=0,i=0;return"detail"in e&&(s=e.detail),"wheelDelta"in e&&(s=-e.wheelDelta/120),"wheelDeltaY"in e&&(s=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(t=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=s,s=0),a=10*t,i=10*s,"deltaY"in e&&(i=e.deltaY),"deltaX"in e&&(a=e.deltaX),e.shiftKey&&!a&&(a=i,i=0),(a||i)&&e.deltaMode&&(1===e.deltaMode?(a*=40,i*=40):(a*=800,i*=800)),a&&!t&&(t=a<1?-1:1),i&&!s&&(s=i<1?-1:1),{spinX:t,spinY:s,pixelX:a,pixelY:i}}(s);if(r.forceToAxis)if(e.isHorizontal()){if(!(Math.abs(g.pixelX)>Math.abs(g.pixelY)))return!0;h=-g.pixelX*m}else{if(!(Math.abs(g.pixelY)>Math.abs(g.pixelX)))return!0;h=-g.pixelY}else h=Math.abs(g.pixelX)>Math.abs(g.pixelY)?-g.pixelX*m:-g.pixelY;if(0===h)return!0;r.invert&&(h=-h);let v=e.getTranslate()+h*r.sensitivity;if(v>=e.minTranslate()&&(v=e.minTranslate()),v<=e.maxTranslate()&&(v=e.maxTranslate()),i=!!e.params.loop||!(v===e.minTranslate()||v===e.maxTranslate()),i&&e.params.nested&&s.stopPropagation(),e.params.freeMode&&e.params.freeMode.enabled){const t={time:u(),delta:Math.abs(h),direction:Math.sign(h)},i=l&&t.time<l.time+500&&t.delta<=l.delta&&t.direction===l.direction;if(!i){l=void 0,e.params.loop&&e.loopFix();let o=e.getTranslate()+h*r.sensitivity;const d=e.isBeginning,u=e.isEnd;if(o>=e.minTranslate()&&(o=e.minTranslate()),o<=e.maxTranslate()&&(o=e.maxTranslate()),e.setTransition(0),e.setTranslate(o),e.updateProgress(),e.updateActiveIndex(),e.updateSlidesClasses(),(!d&&e.isBeginning||!u&&e.isEnd)&&e.updateSlidesClasses(),e.params.freeMode.sticky){clearTimeout(n),n=void 0,c.length>=15&&c.shift();const s=c.length?c[c.length-1]:void 0,a=c[0];if(c.push(t),s&&(t.delta>s.delta||t.direction!==s.direction))c.splice(0);else if(c.length>=15&&t.time-a.time<500&&a.delta-t.delta>=1&&t.delta<=6){const s=h>0?.8:.2;l=t,c.splice(0),n=p((()=>{e.slideToClosest(e.params.speed,!0,void 0,s)}),0)}n||(n=p((()=>{l=t,c.splice(0),e.slideToClosest(e.params.speed,!0,void 0,.5)}),500))}if(i||a("scroll",s),e.params.autoplay&&e.params.autoplayDisableOnInteraction&&e.autoplay.stop(),o===e.minTranslate()||o===e.maxTranslate())return!0}}else{const s={time:u(),delta:Math.abs(h),direction:Math.sign(h),raw:t};c.length>=2&&c.shift();const a=c.length?c[c.length-1]:void 0;if(c.push(s),a?(s.direction!==a.direction||s.delta>a.delta||s.time>a.time+150)&&f(s):f(s),function(t){const s=e.params.mousewheel;if(t.direction<0){if(e.isEnd&&!e.params.loop&&s.releaseOnEdges)return!0}else if(e.isBeginning&&!e.params.loop&&s.releaseOnEdges)return!0;return!1}(s))return!0}return s.preventDefault?s.preventDefault():s.returnValue=!1,!1}function v(t){let s=e.$el;"container"!==e.params.mousewheel.eventsTarget&&(s=d(e.params.mousewheel.eventsTarget)),s[t]("mouseenter",h),s[t]("mouseleave",m),s[t]("wheel",g)}function w(){return e.params.cssMode?(e.wrapperEl.removeEventListener("wheel",g),!0):!e.mousewheel.enabled&&(v("on"),e.mousewheel.enabled=!0,!0)}function b(){return e.params.cssMode?(e.wrapperEl.addEventListener(event,g),!0):!!e.mousewheel.enabled&&(v("off"),e.mousewheel.enabled=!1,!0)}s("init",(()=>{!e.params.mousewheel.enabled&&e.params.cssMode&&b(),e.params.mousewheel.enabled&&w()})),s("destroy",(()=>{e.params.cssMode&&w(),e.mousewheel.enabled&&b()})),Object.assign(e.mousewheel,{enable:w,disable:b})},function({swiper:e,extendParams:t,on:s,emit:a}){function i(t){let s;return t&&(s=d(t),e.params.uniqueNavElements&&"string"==typeof t&&s.length>1&&1===e.$el.find(t).length&&(s=e.$el.find(t))),s}function r(t,s){const a=e.params.navigation;t&&t.length>0&&(t[s?"addClass":"removeClass"](a.disabledClass),t[0]&&"BUTTON"===t[0].tagName&&(t[0].disabled=s),e.params.watchOverflow&&e.enabled&&t[e.isLocked?"addClass":"removeClass"](a.lockClass))}function n(){if(e.params.loop)return;const{$nextEl:t,$prevEl:s}=e.navigation;r(s,e.isBeginning),r(t,e.isEnd)}function l(t){t.preventDefault(),e.isBeginning&&!e.params.loop||e.slidePrev()}function o(t){t.preventDefault(),e.isEnd&&!e.params.loop||e.slideNext()}function c(){const t=e.params.navigation;if(e.params.navigation=Y(e,e.originalParams.navigation,e.params.navigation,{nextEl:"swiper-button-next",prevEl:"swiper-button-prev"}),!t.nextEl&&!t.prevEl)return;const s=i(t.nextEl),a=i(t.prevEl);s&&s.length>0&&s.on("click",o),a&&a.length>0&&a.on("click",l),Object.assign(e.navigation,{$nextEl:s,nextEl:s&&s[0],$prevEl:a,prevEl:a&&a[0]}),e.enabled||(s&&s.addClass(t.lockClass),a&&a.addClass(t.lockClass))}function p(){const{$nextEl:t,$prevEl:s}=e.navigation;t&&t.length&&(t.off("click",o),t.removeClass(e.params.navigation.disabledClass)),s&&s.length&&(s.off("
4059click",l),s.removeClass(e.params.navigation.disabledClass))}t({navigation:{nextEl:null,prevEl:null,hideOnClick:!1,disabledClass:"swiper-button-disabled",hiddenClass:"swiper-button-hidden",lockClass:"swiper-button-lock"}}),e.navigation={nextEl:null,$nextEl:null,prevEl:null,$prevEl:null},s("init",(()=>{c(),n()})),s("toEdge fromEdge lock unlock",(()=>{n()})),s("destroy",(()=>{p()})),s("enable disable",(()=>{const{$nextEl:t,$prevEl:s}=e.navigation;t&&t[e.enabled?"removeClass":"addClass"](e.params.navigation.lockClass),s&&s[e.enabled?"removeClass":"addClass"](e.params.navigation.lockClass)})),s("click",((t,s)=>{const{$nextEl:i,$prevEl:r}=e.navigation,n=s.target;if(e.params.navigation.hideOnClick&&!d(n).is(r)&&!d(n).is(i)){if(e.pagination&&e.params.pagination&&e.params.pagination.clickable&&(e.pagination.el===n||e.pagination.el.contains(n)))return;let t;i?t=i.hasClass(e.params.navigation.hiddenClass):r&&(t=r.hasClass(e.params.navigation.hiddenClass)),a(!0===t?"navigationShow":"navigationHide"),i&&i.toggleClass(e.params.navigation.hiddenClass),r&&r.toggleClass(e.params.navigation.hiddenClass)}})),Object.assign(e.navigation,{update:n,init:c,destroy:p})},function({swiper:e,extendParams:t,on:s,emit:a}){const i="swiper-pagination";let r;t({pagination:{el:null,bulletElement:"span",clickable:!1,hideOnClick:!1,renderBullet:null,renderProgressbar:null,renderFraction:null,renderCustom:null,progressbarOpposite:!1,type:"bullets",dynamicBullets:!1,dynamicMainBullets:1,formatFractionCurrent:e=>e,formatFractionTotal:e=>e,bulletClass:`${i}-bullet`,bulletActiveClass:`${i}-bullet-active`,modifierClass:`${i}-`,currentClass:`${i}-current`,totalClass:`${i}-total`,hiddenClass:`${i}-hidden`,progressbarFillClass:`${i}-progressbar-fill`,progressbarOppositeClass:`${i}-progressbar-opposite`,clickableClass:`${i}-clickable`,lockClass:`${i}-lock`,horizontalClass:`${i}-horizontal`,verticalClass:`${i}-vertical`}}),e.pagination={el:null,$el:null,bullets:[]};let n=0;function l(){return!e.params.pagination.el||!e.pagination.el||!e.pagination.$el||0===e.pagination.$el.length}function o(t,s){const{bulletActiveClass:a}=e.params.pagination;t[s]().addClass(`${a}-${s}`)[s]().addClass(`${a}-${s}-${s}`)}function c(){const t=e.rtl,s=e.params.pagination;if(l())return;const i=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:e.slides.length,c=e.pagination.$el;let p;const u=e.params.loop?Math.ceil((i-2*e.loopedSlides)/e.params.slidesPerGroup):e.snapGrid.length;if(e.params.loop?(p=Math.ceil((e.activeIndex-e.loopedSlides)/e.params.slidesPerGroup),p>i-1-2*e.loopedSlides&&(p-=i-2*e.loopedSlides),p>u-1&&(p-=u),p<0&&"bullets"!==e.params.paginationType&&(p=u+p)):p=void 0!==e.snapIndex?e.snapIndex:e.activeIndex||0,"bullets"===s.type&&e.pagination.bullets&&e.pagination.bullets.length>0){const a=e.pagination.bullets;let i,l,u;if(s.dynamicBullets&&(r=a.eq(0)[e.isHorizontal()?"outerWidth":"outerHeight"](!0),c.css(e.isHorizontal()?"width":"height",r*(s.dynamicMainBullets+4)+"px"),s.dynamicMainBullets>1&&void 0!==e.previousIndex&&(n+=p-e.previousIndex,n>s.dynamicMainBullets-1?n=s.dynamicMainBullets-1:n<0&&(n=0)),i=p-n,l=i+(Math.min(a.length,s.dynamicMainBullets)-1),u=(l+i)/2),a.removeClass(["","-next","-next-next","-prev","-prev-prev","-main"].map((e=>`${s.bulletActiveClass}${e}`)).join(" ")),c.length>1)a.each((e=>{const t=d(e),a=t.index();a===p&&t.addClass(s.bulletActiveClass),s.dynamicBullets&&(a>=i&&a<=l&&t.addClass(`${s.bulletActiveClass}-main`),a===i&&o(t,"prev"),a===l&&o(t,"next"))}));else{const t=a.eq(p),r=t.index();if(t.addClass(s.bulletActiveClass),s.dynamicBullets){const t=a.eq(i),n=a.eq(l);for(let e=i;e<=l;e+=1)a.eq(e).addClass(`${s.bulletActiveClass}-main`);if(e.params.loop)if(r>=a.length-s.dynamicMainBullets){for(let e=s.dynamicMainBullets;e>=0;e-=1)a.eq(a.length-e).addClass(`${s.bulletActiveClass}-main`);a.eq(a.length-s.dynamicMainBullets-1).addClass(`${s.bulletActiveClass}-prev`)}else o(t,"prev"),o(n,"next");else o(t,"prev"),o(n,"next")}}if(s.dynamicBullets){const i=Math.min(a.length,s.dynamicMainBullets+4),n=(r*i-r)/2-u*r,l=t?"right":"left";a.css(e.isHorizontal()?l:"top",`${n}px`)}}if("fraction"===s.type&&(c.find(W(s.currentClass)).text(s.formatFractionCurrent(p+1)),c.find(W(s.totalClass)).text(s.formatFractionTotal(u))),"progressbar"===s.type){let t;t=s.progressbarOpposite?e.isHorizontal()?"vertical":"horizontal":e.isHorizontal()?"horizontal":"vertical";const a=(p+1)/u;let i=1,r=1;"horizontal"===t?i=a:r=a,c.find(W(s.progressbarFillClass)).transform(`translate3d(0,
40590,0) scaleX(${i}) scaleY(${r})`).transition(e.params.speed)}"custom"===s.type&&s.renderCustom?(c.html(s.renderCustom(e,p+1,u)),a("paginationRender",c[0])):a("paginationUpdate",c[0]),e.params.watchOverflow&&e.enabled&&c[e.isLocked?"addClass":"removeClass"](s.lockClass)}function p(){const t=e.params.pagination;if(l())return;const s=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:e.slides.length,i=e.pagination.$el;let r="";if("bullets"===t.type){let a=e.params.loop?Math.ceil((s-2*e.loopedSlides)/e.params.slidesPerGroup):e.snapGrid.length;e.params.freeMode&&e.params.freeMode.enabled&&!e.params.loop&&a>s&&(a=s);for(let s=0;s<a;s+=1)t.renderBullet?r+=t.renderBullet.call(e,s,t.bulletClass):r+=`<${t.bulletElement} class="${t.bulletClass}"></${t.bulletElement}>`;i.html(r),e.pagination.bullets=i.find(W(t.bulletClass))}"fraction"===t.type&&(r=t.renderFraction?t.renderFraction.call(e,t.currentClass,t.totalClass):`<span class="${t.currentClass}"></span> / <span class="${t.totalClass}"></span>`,i.html(r)),"progressbar"===t.type&&(r=t.renderProgressbar?t.renderProgressbar.call(e,t.progressbarFillClass):`<span class="${t.progressbarFillClass}"></span>`,i.html(r)),"custom"!==t.type&&a("paginationRender",e.pagination.$el[0])}function u(){e.params.pagination=Y(e,e.originalParams.pagination,e.params.pagination,{el:"swiper-pagination"});const t=e.params.pagination;if(!t.el)return;let s=d(t.el);0!==s.length&&(e.params.uniqueNavElements&&"string"==typeof t.el&&s.length>1&&(s=e.$el.find(t.el),s.length>1&&(s=s.filter((t=>d(t).parents(".swiper")[0]===e.el)))),"bullets"===t.type&&t.clickable&&s.addClass(t.clickableClass),s.addClass(t.modifierClass+t.type),s.addClass(t.modifierClass+e.params.direction),"bullets"===t.type&&t.dynamicBullets&&(s.addClass(`${t.modifierClass}${t.type}-dynamic`),n=0,t.dynamicMainBullets<1&&(t.dynamicMainBullets=1)),"progressbar"===t.type&&t.progressbarOpposite&&s.addClass(t.progressbarOppositeClass),t.clickable&&s.on("click",W(t.bulletClass),(function(t){t.preventDefault();let s=d(this).index()*e.params.slidesPerGroup;e.params.loop&&(s+=e.loopedSlides),e.slideTo(s)})),Object.assign(e.pagination,{$el:s,el:s[0]}),e.enabled||s.addClass(t.lockClass))}function h(){const t=e.params.pagination;if(l())return;const s=e.pagination.$el;s.removeClass(t.hiddenClass),s.removeClass(t.modifierClass+t.type),s.removeClass(t.modifierClass+e.params.direction),e.pagination.bullets&&e.pagination.bullets.removeClass&&e.pagination.bullets.removeClass(t.bulletActiveClass),t.clickable&&s.off("click",W(t.bulletClass))}s("init",(()=>{u(),p(),c()})),s("activeIndexChange",(()=>{(e.params.loop||void 0===e.snapIndex)&&c()})),s("snapIndexChange",(()=>{e.params.loop||c()})),s("slidesLengthChange",(()=>{e.params.loop&&(p(),c())})),s("snapGridLengthChange",(()=>{e.params.loop||(p(),c())})),s("destroy",(()=>{h()})),s("enable disable",(()=>{const{$el:t}=e.pagination;t&&t[e.enabled?"removeClass":"addClass"](e.params.pagination.lockClass)})),s("lock unlock",(()=>{c()})),s("click",((t,s)=>{const i=s.target,{$el:r}=e.pagination;if(e.params.pagination.el&&e.params.pagination.hideOnClick&&r.length>0&&!d(i).hasClass(e.params.pagination.bulletClass)){if(e.navigation&&(e.navigation.nextEl&&i===e.navigation.nextEl||e.navigation.prevEl&&i===e.navigation.prevEl))return;const t=r.hasClass(e.params.pagination.hiddenClass);a(!0===t?"paginationShow":"paginationHide"),r.toggleClass(e.params.pagination.hiddenClass)}})),Object.assign(e.pagination,{render:p,update:c,init:u,destroy:h})},function({swiper:e,extendParams:t,on:s,emit:i}){const r=a();let n,l,o,c,u=!1,h=null,m=null;function f(){if(!e.params.scrollbar.el||!e.scrollbar.el)return;const{scrollbar:t,rtlTranslate:s,progress:a}=e,{$dragEl:i,$el:r}=t,n=e.params.scrollbar;let d=l,c=(o-l)*a;s?(c=-c,c>0?(d=l-c,c=0):-c+l>o&&(d=o+c)):c<0?(d=l+c,c=0):c+l>o&&(d=o-c),e.isHorizontal()?(i.transform(`translate3d(${c}px, 0, 0)`),i[0].style.width=`${d}px`):(i.transform(`translate3d(0px, ${c}px, 0)`),i[0].style.height=`${d}px`),n.hide&&(clearTimeout(h),r[0].style.opacity=1,h=setTimeout((()=>{r[0].style.opacity=0,r.transition(400)}),1e3))}function g(){if(!e.params.scrollbar.el||!e.scrollbar.el)return;const{scrollbar:t}=e,{$dragEl:s,$el:a}=t;s[0].style.width="",s[0].style.height="",o=e.isHorizontal()?a[0].offsetWidth:a[0].offsetHeight,c=e.size/(e.virtualSize+e.params.slidesOffsetBefore-(e.params.centeredSlides?e.snapGrid[0]:0)),l="auto"===e.params.scrollbar.dragSize?o*c:parseInt(e.params.scrollbar.dragSize,10),e.isHorizontal()?s[0].style.width=`${l}px`:s[0].style.height=`${l}px`,a[0].style.display=c>=1?"none":"",e.params.scrollbar.hide&&(a[0].style.opacity=0),e.params.watchOverflow&&e.enabled&&t.$el[e.isLocked?"addClass":"removeClass"](e.params.scrollbar.lockClass)}function v(t){return e.isHorizontal()?"touchstart"===t.type||"touchmove"===t.type?t.targetTouches[0].clientX:t.clientX:"touchstart"===t.type||"touchmove"===t.type?t.targetTouches[0].clientY:t.clientY}function w(t){const{scrollbar:s,rtlTranslate:a}=e,{$el:i}=s;let r;r=(v(t)-i.offset()[e.isHorizontal()?"left":"top"]-(null!==n?n:l/2))/(o-l),r=Math.max(Math.min(r,1),0),a&&(r=1-r);const d=e.minTranslate()+(e.maxTranslate()-e.minTranslate())*r;e.updateProgress(d),e.setTranslate(d),e.updateActiveIndex(),e.updateSlidesClasses()}function b(t){const s=e.params.scrollbar,{scrollbar:a,$wrapperEl:r}=e,{$el:l,$dragEl:o}=a;u=!0,n=t.target===o[0]||t.target===o?v(t)-t.target.getBoundingClientRect()[e.isHorizontal()?"left":"top"]:null,t.preventDefault(),t.stopPropagation(),r.transition(100),o.transition(100),w(t),
4059clearTimeout(m),l.transition(0),s.hide&&l.css("opacity",1),e.params.cssMode&&e.$wrapperEl.css("scroll-snap-type","none"),i("scrollbarDragStart",t)}function x(t){const{scrollbar:s,$wrapperEl:a}=e,{$el:r,$dragEl:n}=s;u&&(t.preventDefault?t.preventDefault():t.returnValue=!1,w(t),a.transition(0),r.transition(0),n.transition(0),i("scrollbarDragMove",t))}function y(t){const s=e.params.scrollbar,{scrollbar:a,$wrapperEl:r}=e,{$el:n}=a;u&&(u=!1,e.params.cssMode&&(e.$wrapperEl.css("scroll-snap-type",""),r.transition("")),s.hide&&(clearTimeout(m),m=p((()=>{n.css("opacity",0),n.transition(400)}),1e3)),i("scrollbarDragEnd",t),s.snapOnRelease&&e.slideToClosest())}function E(t){const{scrollbar:s,touchEventsTouch:a,touchEventsDesktop:i,params:n,support:l}=e,o=s.$el[0],d=!(!l.passiveListener||!n.passiveListeners)&&{passive:!1,capture:!1},c=!(!l.passiveListener||!n.passiveListeners)&&{passive:!0,capture:!1};if(!o)return;const p="on"===t?"addEventListener":"removeEventListener";l.touch?(o[p](a.start,b,d),o[p](a.move,x,d),o[p](a.end,y,c)):(o[p](i.start,b,d),r[p](i.move,x,d),r[p](i.end,y,c))}function T(){const{scrollbar:t,$el:s}=e;e.params.scrollbar=Y(e,e.originalParams.scrollbar,e.params.scrollbar,{el:"swiper-scrollbar"});const a=e.params.scrollbar;if(!a.el)return;let i=d(a.el);e.params.uniqueNavElements&&"string"==typeof a.el&&i.length>1&&1===s.find(a.el).length&&(i=s.find(a.el));let r=i.find(`.${e.params.scrollbar.dragClass}`);0===r.length&&(r=d(`<div class="${e.params.scrollbar.dragClass}"></div>`),i.append(r)),Object.assign(t,{$el:i,el:i[0],$dragEl:r,dragEl:r[0]}),a.draggable&&e.params.scrollbar.el&&E("on"),i&&i[e.enabled?"removeClass":"addClass"](e.params.scrollbar.lockClass)}function C(){e.params.scrollbar.el&&E("off")}t({scrollbar:{el:null,dragSize:"auto",hide:!1,draggable:!1,snapOnRelease:!0,lockClass:"swiper-scrollbar-lock",dragClass:"swiper-scrollbar-drag"}}),e.scrollbar={el:null,dragEl:null,$el:null,$dragEl:null},s("init",(()=>{T(),g(),f()})),s("update resize observerUpdate lock unlock",(()=>{g()})),s("setTranslate",(()=>{f()})),s("setTransition",((t,s)=>{!function(t){e.params.scrollbar.el&&e.scrollbar.el&&e.scrollbar.$dragEl.transition(t)}(s)})),s("enable disable",(()=>{const{$el:t}=e.scrollbar;t&&t[e.enabled?"removeClass":"addClass"](e.params.scrollbar.lockClass)})),s("destroy",(()=>{C()})),Object.assign(e.scrollbar,{updateSize:g,setTranslate:f,init:T,destroy:C})},function({swiper:e,extendParams:t,on:s}){t({parallax:{enabled:!1}});const a=(t,s)=>{const{rtl:a}=e,i=d(t),r=a?-1:1,n=i.attr("data-swiper-parallax")||"0";let l=i.attr("data-swiper-parallax-x"),o=i.attr("data-swiper-parallax-y");const c=i.attr("data-swiper-parallax-scale"),p=i.attr("data-swiper-parallax-opacity");if(l||o?(l=l||"0",o=o||"0"):e.isHorizontal()?(l=n,o="0"):(o=n,l="0"),l=l.indexOf("%")>=0?parseInt(l,10)*s*r+"%":l*s*r+"px",o=o.indexOf("%")>=0?parseInt(o,10)*s+"%":o*s+"px",null!=p){const e=p-(p-1)*(1-Math.abs(s));i[0].style.opacity=e}if(null==c)i.transform(`translate3d(${l}, ${o}, 0px)`);else{const e=c-(c-1)*(1-Math.abs(s));i.transform(`translate3d(${l}, ${o}, 0px) scale(${e})`)}},i=()=>{const{$el:t,slides:s,progress:i,snapGrid:r}=e;t.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((e=>{a(e,i)})),s.each(((t,s)=>{let n=t.progress;e.params.slidesPerGroup>1&&"auto"!==e.params.slidesPerView&&(n+=Math.ceil(s/2)-i*(r.length-1)),n=Math.min(Math.max(n,-1),1),d(t).find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((e=>{a(e,n)}))}))};s("beforeInit",(()=>{e.params.parallax.enabled&&(e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0)})),s("init",(()=>{e.params.parallax.enabled&&i()})),s("setTranslate",(()=>{e.params.parallax.enabled&&i()})),s("setTransition",((t,s)=>{e.params.parallax.enabled&&((t=e.params.speed)=>{const{$el:s}=e;s.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((e=>{const s=d(e);let a=parseInt(s.attr("data-swiper-parallax-duration"),10)||t;0===t&&(a=0),s.transition(a)}))})(s)}))},function({swiper:e,extendParams:t,on:s,emit:a}){const i=r();t({zoom:{enabled:!1,maxRatio:3,minRatio:1,toggle:!0,containerClass:"swiper-zoom-container",zoomedSlideClass:"swiper-slide-zoomed"}}),e.zoom={enabled:!1};let n,l,o,c=1,p=!1;const u={$slideEl:void 0,slideWidth:void 0,slideHeight:void 0,$imageEl:void 0,$imageWrapEl:void 0,maxRatio:3},m={isTouched:void 0,isMoved:void 0,currentX:void 0,currentY:void 0,minX:void 0,minY:void 0,maxX:void 0,maxY:void 0,width:void 0,height:void 0,startX:void 0,startY:void 0,touchesStart:{},touchesCurrent:{}},f={x:void 0,y:void 0,prevPositionX:void 0,prevPositionY:void 0,prevTime:void 0};let g=1;function v(e){if(e.targetTouches.length<2)return 1;const t=e.targetTouches[0].pageX,s=e.targetTouches[0].pageY,a=e.targetTouches[1].pageX,i=e.targetTouches[1].pageY;return Math.sqrt((a-t)**2+(i-s)**2)}function w(t){const s=e.support,a=e.params.zoom;if(l=!1,o=!1,!s.gestures){if("touchstart"!==t.type||"touchstart"===t.type&&t.targetTouches.length<2)return;l=!0,u.scaleStart=v(t)}u.$slideEl&&u.$slideEl.length||(u.$slideEl=d(t.target).closest(`.${e.params.slideClass}`),0===u.$slideEl.length&&(u.$slideEl=e.slides.eq(e.activeIndex)),u.$imageEl=u.$slideEl.find(`.${a.containerClass}`).eq(0).find("img, svg, canvas, picture, .swiper-zoom-target"),u.$imageWrapEl=u.$imageEl.parent(`.${a.containerClass}`),u.maxRatio=u.$imageWrapEl.attr("data-swiper-zoom")||a.maxRatio,0!==u.$imageWrapEl.length)?(u.$imageEl&&u.$imageEl.transition(0),p=!0):u.$imageEl=void 0}function b(t){const s=e.support,a=e.params.zoom,i=e.zoom;if(!s.gestures){if("touchmove"!==t.type||"touchmove"===t.type&&t.targetTouches.length<2)return;o=!0,u.scaleMove=v(t)}u.$imageEl&&0!==u.$imageEl.length?(s.gestures?i.scale=t.scale*c:i.scale=u.scaleMove/u.scaleStart*c,i.scale>u.maxRatio&&(i.scale=u.maxRatio-1+(i.scale-u.maxRatio+1)**.5),i.scale<a.minRatio&&(i.scale=a.minRatio+1-(a.minRatio-i.scale+1)**.5),u.$imageEl.transform(`translate3d(0,
40590,0) scale(${i.scale})`)):"gesturechange"===t.type&&w(t)}function x(t){const s=e.device,a=e.support,i=e.params.zoom,r=e.zoom;if(!a.gestures){if(!l||!o)return;if("touchend"!==t.type||"touchend"===t.type&&t.changedTouches.length<2&&!s.android)return;l=!1,o=!1}u.$imageEl&&0!==u.$imageEl.length&&(r.scale=Math.max(Math.min(r.scale,u.maxRatio),i.minRatio),u.$imageEl.transition(e.params.speed).transform(`translate3d(0,0,0) scale(${r.scale})`),c=r.scale,p=!1,1===r.scale&&(u.$slideEl=void 0))}function y(t){const s=e.zoom;if(!u.$imageEl||0===u.$imageEl.length)return;if(e.allowClick=!1,!m.isTouched||!u.$slideEl)return;m.isMoved||(m.width=u.$imageEl[0].offsetWidth,m.height=u.$imageEl[0].offsetHeight,m.startX=h(u.$imageWrapEl[0],"x")||0,m.startY=h(u.$imageWrapEl[0],"y")||0,u.slideWidth=u.$slideEl[0].offsetWidth,u.slideHeight=u.$slideEl[0].offsetHeight,u.$imageWrapEl.transition(0));const a=m.width*s.scale,i=m.height*s.scale;if(!(a<u.slideWidth&&i<u.slideHeight)){if(m.minX=Math.min(u.slideWidth/2-a/2,0),m.maxX=-m.minX,m.minY=Math.min(u.slideHeight/2-i/2,0),m.maxY=-m.minY,m.touchesCurrent.x="touchmove"===t.type?t.targetTouches[0].pageX:t.pageX,m.touchesCurrent.y="touchmove"===t.type?t.targetTouches[0].pageY:t.pageY,!m.isMoved&&!p){if(e.isHorizontal()&&(Math.floor(m.minX)===Math.floor(m.startX)&&m.touchesCurrent.x<m.touchesStart.x||Math.floor(m.maxX)===Math.floor(m.startX)&&m.touchesCurrent.x>m.touchesStart.x))return void(m.isTouched=!1);if(!e.isHorizontal()&&(Math.floor(m.minY)===Math.floor(m.startY)&&m.touchesCurrent.y<m.touchesStart.y||Math.floor(m.maxY)===Math.floor(m.startY)&&m.touchesCurrent.y>m.touchesStart.y))return void(m.isTouched=!1)}t.cancelable&&t.preventDefault(),t.stopPropagation(),m.isMoved=!0,m.currentX=m.touchesCurrent.x-m.touchesStart.x+m.startX,m.currentY=m.touchesCurrent.y-m.touchesStart.y+m.startY,m.currentX<m.minX&&(m.currentX=m.minX+1-(m.minX-m.currentX+1)**.8),m.currentX>m.maxX&&(m.currentX=m.maxX-1+(m.currentX-m.maxX+1)**.8),m.currentY<m.minY&&(m.currentY=m.minY+1-(m.minY-m.currentY+1)**.8),m.currentY>m.maxY&&(m.currentY=m.maxY-1+(m.currentY-m.maxY+1)**.8),f.prevPositionX||(f.prevPositionX=m.touchesCurrent.x),f.prevPositionY||(f.prevPositionY=m.touchesCurrent.y),f.prevTime||(f.prevTime=Date.now()),f.x=(m.touchesCurrent.x-f.prevPositionX)/(Date.now()-f.prevTime)/2,f.y=(m.touchesCurrent.y-f.prevPositionY)/(Date.now()-f.prevTime)/2,Math.abs(m.touchesCurrent.x-f.prevPositionX)<2&&(f.x=0),Math.abs(m.touchesCurrent.y-f.prevPositionY)<2&&(f.y=0),f.prevPositionX=m.touchesCurrent.x,f.prevPositionY=m.touchesCurrent.y,f.prevTime=Date.now(),u.$imageWrapEl.transform(`translate3d(${m.currentX}px, ${m.currentY}px,0)`)}}function E(){const t=e.zoom;u.$slideEl&&e.previousIndex!==e.activeIndex&&(u.$imageEl&&u.$imageEl.transform("translate3d(0,0,0) scale(1)"),u.$imageWrapEl&&u.$imageWrapEl.transform("translate3d(0,0,0)"),t.scale=1,c=1,u.$slideEl=void 0,u.$imageEl=void 0,u.$imageWrapEl=void 0)}function T(t){const s=e.zoom,a=e.params.zoom;if(u.$slideEl||(t&&t.target&&(u.$slideEl=d(t.target).closest(`.${e.params.slideClass}`)),u.$slideEl||(e.params.virtual&&e.params.virtual.enabled&&e.virtual?u.$slideEl=e.$wrapperEl.children(`.${e.params.slideActiveClass}`):u.$slideEl=e.slides.eq(e.activeIndex)),u.$imageEl=u.$slideEl.find(`.${a.containerClass}`).eq(0).find("img, svg, canvas, picture, .swiper-zoom-target"),u.$imageWrapEl=u.$imageEl.parent(`.${a.containerClass}`)),!u.$imageEl||0===u.$imageEl.length||!u.$imageWrapEl||0===u.$imageWrapEl.length)return;let r,n,l,o,p,h,f,g,v,w,b,x,y,E,T,C,$,S;e.params.cssMode&&(e.wrapperEl.style.overflow="hidden",e.wrapperEl.style.touchAction="none"),u.$slideEl.addClass(`${a.zoomedSlideClass}`),void 0===m.touchesStart.x&&t?(r="touchend"===t.type?t.changedTouches[0].pageX:t.pageX,n="touchend"===t.type?t.changedTouches[0].pageY:t.pageY):(r=m.touchesStart.x,n=m.touchesStart.y),s.scale=u.$imageWrapEl.attr("data-swiper-zoom")||a.maxRatio,c=u.$imageWrapEl.attr("data-swiper-zoom")||a.maxRatio,t?($=u.$slideEl[0].offsetWidth,S=u.$slideEl[0].offsetHeight,l=u.$slideEl.offset().left+i.scrollX,o=u.$slideEl.offset().top+i.scrollY,p=l+$/2-r,h=o+S/2-n,v=u.$imageEl[0].offsetWidth,w=u.$imageEl[0].offsetHeight,b=v*s.scale,x=w*s.scale,y=Math.min($/2-b/2,0),E=Math.min(S/2-x/2,0),T=-y,C=-E,f=p*s.scale,g=h*s.scale,f<y&&(f=y),f>T&&(f=T),g<E&&(g=E),g>C&&(g=C)):(f=0,g=0),u.$imageWrapEl.transition(300).transform(`translate3d(${f}px, ${g}
4059px,0)`),u.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${s.scale})`)}function C(){const t=e.zoom,s=e.params.zoom;u.$slideEl||(e.params.virtual&&e.params.virtual.enabled&&e.virtual?u.$slideEl=e.$wrapperEl.children(`.${e.params.slideActiveClass}`):u.$slideEl=e.slides.eq(e.activeIndex),u.$imageEl=u.$slideEl.find(`.${s.containerClass}`).eq(0).find("img, svg, canvas, picture, .swiper-zoom-target"),u.$imageWrapEl=u.$imageEl.parent(`.${s.containerClass}`)),u.$imageEl&&0!==u.$imageEl.length&&u.$imageWrapEl&&0!==u.$imageWrapEl.length&&(e.params.cssMode&&(e.wrapperEl.style.overflow="",e.wrapperEl.style.touchAction=""),t.scale=1,c=1,u.$imageWrapEl.transition(300).transform("translate3d(0,0,0)"),u.$imageEl.transition(300).transform("translate3d(0,0,0) scale(1)"),u.$slideEl.removeClass(`${s.zoomedSlideClass}`),u.$slideEl=void 0)}function $(t){const s=e.zoom;s.scale&&1!==s.scale?C():T(t)}function S(){const t=e.support;return{passiveListener:!("touchstart"!==e.touchEvents.start||!t.passiveListener||!e.params.passiveListeners)&&{passive:!0,capture:!1},activeListenerWithCapture:!t.passiveListener||{passive:!1,capture:!0}}}function M(){return`.${e.params.slideClass}`}function P(t){const{passiveListener:s}=S(),a=M();e.$wrapperEl[t]("gesturestart",a,w,s),e.$wrapperEl[t]("gesturechange",a,b,s),e.$wrapperEl[t]("gestureend",a,x,s)}function k(){n||(n=!0,P("on"))}function z(){n&&(n=!1,P("off"))}function O(){const t=e.zoom;if(t.enabled)return;t.enabled=!0;const s=e.support,{passiveListener:a,activeListenerWithCapture:i}=S(),r=M();s.gestures?(e.$wrapperEl.on(e.touchEvents.start,k,a),e.$wrapperEl.on(e.touchEvents.end,z,a)):"touchstart"===e.touchEvents.start&&(e.$wrapperEl.on(e.touchEvents.start,r,w,a),e.$wrapperEl.on(e.touchEvents.move,r,b,i),e.$wrapperEl.on(e.touchEvents.end,r,x,a),e.touchEvents.cancel&&e.$wrapperEl.on(e.touchEvents.cancel,r,x,a)),e.$wrapperEl.on(e.touchEvents.move,`.${e.params.zoom.containerClass}`,y,i)}function I(){const t=e.zoom;if(!t.enabled)return;const s=e.support;t.enabled=!1;const{passiveListener:a,activeListenerWithCapture:i}=S(),r=M();s.gestures?(e.$wrapperEl.off(e.touchEvents.start,k,a),e.$wrapperEl.off(e.touchEvents.end,z,a)):"touchstart"===e.touchEvents.start&&(e.$wrapperEl.off(e.touchEvents.start,r,w,a),e.$wrapperEl.off(e.touchEvents.move,r,b,i),e.$wrapperEl.off(e.touchEvents.end,r,x,a),e.touchEvents.cancel&&e.$wrapperEl.off(e.touchEvents.cancel,r,x,a)),e.$wrapperEl.off(e.touchEvents.move,`.${e.params.zoom.containerClass}`,y,i)}Object.defineProperty(e.zoom,"scale",{get:()=>g,set(e){if(g!==e){const t=u.$imageEl?u.$imageEl[0]:void 0,s=u.$slideEl?u.$slideEl[0]:void 0;a("zoomChange",e,t,s)}g=e}}),s("init",(()=>{e.params.zoom.enabled&&O()})),s("destroy",(()=>{I()})),s("touchStart",((t,s)=>{e.zoom.enabled&&function(t){const s=e.device;u.$imageEl&&0!==u.$imageEl.length&&(m.isTouched||(s.android&&t.cancelable&&t.preventDefault(),m.isTouched=!0,m.touchesStart.x="touchstart"===t.type?t.targetTouches[0].pageX:t.pageX,m.touchesStart.y="touchstart"===t.type?t.targetTouches[0].pageY:t.pageY))}(s)})),s("touchEnd",((t,s)=>{e.zoom.enabled&&function(){const t=e.zoom;if(!u.$imageEl||0===u.$imageEl.length)return;if(!m.isTouched||!m.isMoved)return m.isTouched=!1,void(m.isMoved=!1);m.isTouched=!1,m.isMoved=!1;let s=300,a=300;const i=f.x*s,r=m.currentX+i,n=f.y*a,l=m.currentY+n;0!==f.x&&(s=Math.abs((r-m.currentX)/f.x)),0!==f.y&&(a=Math.abs((l-m.currentY)/f.y));const o=Math.max(s,a);m.currentX=r,m.currentY=l;const d=m.width*t.scale,c=m.height*t.scale;m.minX=Math.min(u.slideWidth/2-d/2,0),m.maxX=-m.minX,m.minY=Math.min(u.slideHeight/2-c/2,0),m.maxY=-m.minY,m.currentX=Math.max(Math.min(m.currentX,m.maxX),m.minX),m.currentY=Math.max(Math.min(m.currentY,m.maxY),m.minY),u.$imageWrapEl.transition(o).transform(`translate3d(${m.currentX}px, ${m.currentY}px,0)`)}()})),s("doubleTap",((t,s)=>{!e.animating&&e.params.zoom.enabled&&e.zoom.enabled&&e.params.zoom.toggle&&$(s)})),s("transitionEnd",(()=>{e.zoom.enabled&&e.params.zoom.enabled&&E()})),s("slideChange",(()=>{e.zoom.enabled&&e.params.zoom.enabled&&e.params.cssMode&&E()})),Object.assign(e.zoom,{enable:O,disable:I,in:T,out:C,toggle:$})},function({swiper:e,extendParams:t,on:s,emit:a}){t({lazy:{checkInView:!1,enabled:!1,loadPrevNext:!1,loadPrevNextAmount:1,loadOnTransitionStart:!1,scrollingElement:"",elementClass:"swiper-lazy",loadingClass:"swiper-lazy-loading",loadedClass:"swiper-lazy-loaded",preloaderClass:"swiper-lazy-preloader"}}),e.lazy={};let i=!1,n=!1;function l(t,s=!0){const i=e.params.lazy;if(void 0===t)return;if(0===e.slides.length)return;const r=e.virtual&&e.params.virtual.enabled?e.$wrapperEl.children(`.${e.params.slideClass}[data-swiper-slide-index="${t}"]`):e.slides.eq(t),n=r.find(`.${i.elementClass}:not(.${i.loadedClass}):not(.${i.loadingClass})`);!r.hasClass(i.elementClass)||r.hasClass(i.loadedClass)||r.hasClass(i.loadingClass)||n.push(r[0]),0!==n.length&&n.each((t=>{const n=d(t);n.addClass(i.loadingClass);const o=n.attr("data-background"),c=n.attr("data-src"),p=n.attr("data-srcset"),u=n.attr("data-sizes"),h=n.parent("picture");
4059e.loadImage(n[0],c||o,p,u,!1,(()=>{if(null!=e&&e&&(!e||e.params)&&!e.destroyed){if(o?(n.css("background-image",`url("${o}")`),n.removeAttr("data-background")):(p&&(n.attr("srcset",p),n.removeAttr("data-srcset")),u&&(n.attr("sizes",u),n.removeAttr("data-sizes")),h.length&&h.children("source").each((e=>{const t=d(e);t.attr("data-srcset")&&(t.attr("srcset",t.attr("data-srcset")),t.removeAttr("data-srcset"))})),c&&(n.attr("src",c),n.removeAttr("data-src"))),n.addClass(i.loadedClass).removeClass(i.loadingClass),r.find(`.${i.preloaderClass}`).remove(),e.params.loop&&s){const t=r.attr("data-swiper-slide-index");if(r.hasClass(e.params.slideDuplicateClass)){l(e.$wrapperEl.children(`[data-swiper-slide-index="${t}"]:not(.${e.params.slideDuplicateClass})`).index(),!1)}else{l(e.$wrapperEl.children(`.${e.params.slideDuplicateClass}[data-swiper-slide-index="${t}"]`).index(),!1)}}a("lazyImageReady",r[0],n[0]),e.params.autoHeight&&e.updateAutoHeight()}})),a("lazyImageLoad",r[0],n[0])}))}function o(){const{$wrapperEl:t,params:s,slides:a,activeIndex:i}=e,r=e.virtual&&s.virtual.enabled,o=s.lazy;let c=s.slidesPerView;function p(e){if(r){if(t.children(`.${s.slideClass}[data-swiper-slide-index="${e}"]`).length)return!0}else if(a[e])return!0;return!1}function u(e){return r?d(e).attr("data-swiper-slide-index"):d(e).index()}if("auto"===c&&(c=0),n||(n=!0),e.params.watchSlidesProgress)t.children(`.${s.slideVisibleClass}`).each((e=>{l(r?d(e).attr("data-swiper-slide-index"):d(e).index())}));else if(c>1)for(let e=i;e<i+c;e+=1)p(e)&&l(e);else l(i);if(o.loadPrevNext)if(c>1||o.loadPrevNextAmount&&o.loadPrevNextAmount>1){const e=o.loadPrevNextAmount,t=c,s=Math.min(i+t+Math.max(e,t),a.length),r=Math.max(i-Math.max(t,e),
40590);for(let e=i+c;e<s;e+=1)p(e)&&l(e);for(let e=r;e<i;e+=1)p(e)&&l(e)}else{const e=t.children(`.${s.slideNextClass}`);e.length>0&&l(u(e));const a=t.children(`.${s.slidePrevClass}`);a.length>0&&l(u(a))}}function c(){const t=r();if(!e||e.destroyed)return;const s=e.params.lazy.scrollingElement?d(e.params.lazy.scrollingElement):d(t),a=s[0]===t,n=a?t.innerWidth:s[0].offsetWidth,l=a?t.innerHeight:s[0].offsetHeight,p=e.$el.offset(),{rtlTranslate:u}=e;let h=!1;u&&(p.left-=e.$el[0].scrollLeft);const m=[[p.left,p.top],[p.left+e.width,p.top],[p.left,p.top+e.height],[p.left+e.width,p.top+e.height]];for(let e=0;e<m.length;e+=1){const t=m[e];if(t[0]>=0&&t[0]<=n&&t[1]>=0&&t[1]<=l){if(0===t[0]&&0===t[1])continue;h=!0}}const f=!("touchstart"!==e.touchEvents.start||!e.support.passiveListener||!e.params.passiveListeners)&&{passive:!0,capture:!1};h?(o(),s.off("scroll",c,f)):i||(i=!0,s.on("scroll",c,f))}s("beforeInit",(()=>{e.params.lazy.enabled&&e.params.preloadImages&&(e.params.preloadImages=!1)})),s("init",(()=>{e.params.lazy.enabled&&(e.params.lazy.checkInView?c():o())})),s("scroll",(()=>{e.params.freeMode&&e.params.freeMode.enabled&&!e.params.freeMode.sticky&&o()})),s("scrollbarDragMove resize _freeModeNoMomentumRelease",(()=>{e.params.lazy.enabled&&(e.params.lazy.checkInView?c():o())})),s("transitionStart",(()=>{e.params.lazy.enabled&&(e.params.lazy.loadOnTransitionStart||!e.params.lazy.loadOnTransitionStart&&!n)&&(e.params.lazy.checkInView?c():o())})),s("transitionEnd",(()=>{e.params.lazy.enabled&&!e.params.lazy.loadOnTransitionStart&&(e.params.lazy.checkInView?c():o())})),s("slideChange",(()=>{const{lazy:t,cssMode:s,watchSlidesProgress:a,touchReleaseOnEdges:i,resistanceRatio:r}=e.params;t.enabled&&(s||a&&(i||0===r))&&o()})),Object.assign(e.lazy,{load:o,loadInSlide:l})},function({swiper:e,extendParams:t,on:s}){function a(e,t){const s=function(){let e,t,s;return(a,i)=>{for(t=-1,e=a.length;e-t>1;)s=e+t>>1,a[s]<=i?t=s:e=s;return e}}();let a,i;return this.x=e,this.y=t,this.lastIndex=e.length-1,this.interpolate=function(e){return e?(i=s(this.x,e),a=i-1,(e-this.x[a])*(this.y[i]-this.y[a])/(this.x[i]-this.x[a])+this.y[a]):0},this}function i(){e.controller.control&&e.controller.spline&&(e.controller.spline=void 0,delete e.controller.spline)}t({controller:{control:void 0,inverse:!1,by:"slide"}}),e.controller={control:void 0},s("beforeInit",(()=>{e.controller.control=e.params.controller.control})),s("update",(()=>{i()})),s("resize",(()=>{i()})),s("observerUpdate",(()=>{i()})),s("setTranslate",((t,s,a)=>{e.controller.control&&e.controller.setTranslate(s,a)})),s("setTransition",((t,s,a)=>{e.controller.control&&e.controller.setTransition(s,a)})),Object.assign(e.controller,{setTranslate:function(t,s){const i=e.controller.control;let r,n;const l=e.constructor;function o(t){const s=e.rtlTranslate?-e.translate:e.translate;"slide"===e.params.controller.by&&(!function(t){e.controller.spline||(e.controller.spline=e.params.loop?new a(e.slidesGrid,t.slidesGrid):new a(e.snapGrid,t.snapGrid))}(t),n=-e.controller.spline.interpolate(-s)),n&&"container"!==e.params.controller.by||(r=(t.maxTranslate()-t.minTranslate())/(e.maxTranslate()-e.minTranslate()),n=(s-e.minTranslate())*r+t.minTranslate()),e.params.controller.inverse&&(n=t.maxTranslate()-n),t.updateProgress(n),t.setTranslate(n,e),t.updateActiveIndex(),t.updateSlidesClasses()}if(Array.isArray(i))for(let e=0;e<i.length;e+=1)i[e]!==s&&i[e]instanceof l&&o(i[e]);else i instanceof l&&s!==i&&o(i)},setTransition:function(t,s){const a=e.constructor,i=e.controller.control;let r;function n(s){s.setTransition(t,e),0!==t&&(s.transitionStart(),s.params.autoHeight&&p((()=>{s.updateAutoHeight()})),s.$wrapperEl.transitionEnd((()=>{i&&(s.params.loop&&"slide"===e.params.controller.by&&s.loopFix(),s.transitionEnd())})))}if(Array.isArray(i))for(r=0;r<i.length;r+=1)i[r]!==s&&i[r]instanceof a&&n(i[r]);else i instanceof a&&s!==i&&n(i)}})},function({swiper:e,extendParams:t,on:s}){t({a11y:{enabled:!0,notificationClass:"swiper-notification",prevSlideMessage:"Previous slide",nextSlideMessage:"Next slide",firstSlideMessage:"This is the first slide",lastSlideMessage:"This is the last slide",paginationBulletMessage:"Go to slide {{index}}",slideLabelMessage:"{{index}} / {{slidesLength}}",containerMessage:null,containerRoleDescriptionMessage:null,itemRoleDescriptionMessage:null,slideRole:"group"}});let a=null;function i(e){const t=a;0!==t.length&&(t.html(""),t.html(e))}function r(e){e.attr("tabIndex","0")}function n(e){e.attr("tabIndex","-1")}function l(e,t){e.attr("role",t)}function o(e,t){e.attr("aria-roledescription",t)}function c(e,t){e.attr("aria-label",t)}function p(e){e.attr("aria-disabled",!0)}function u(e){e.attr("aria-disabled",!1)}function h(t){if(13!==t.keyCode&&32!==t.keyCode)return;const s=e.params.a11y,a=d(t.target);e.navigation&&e.navigation.$nextEl&&a.is(e.navigation.$nextEl)&&(e.isEnd&&!e.params.loop||e.slideNext(),e.isEnd?i(s.lastSlideMessage):i(s.nextSlideMessage)),e.navigation&&e.navigation.$prevEl&&a.is(e.navigation.$prevEl)&&(e.isBeginning&&!e.params.loop||e.slidePrev(),e.isBeginning?i(s.firstSlideMessage):i(s.prevSlideMessage)),e.pagination&&a.is(W(e.params.pagination.bulletClass))&&a[0].click()}function m(){if(e.params.loop||!e.navigation)return;const{$nextEl:t,$prevEl:s}=e.navigation;s&&s.length>0&&(e.isBeginning?(p(s),n(s)):(u(s),r(s))),t&&t.length>0&&(e.isEnd?(p(t),n(t)):(u(t),r(t)))}function f(){return e.pagination&&e.params.pagination.clickable&&e.pagination.bullets&&e.pagination.bullets.length}const g=(e,t,s)=>
4059{r(e),"BUTTON"!==e[0].tagName&&(l(e,"button"),e.on("keydown",h)),c(e,s),function(e,t){e.attr("aria-controls",t)}(e,t)};function v(){const t=e.params.a11y;e.$el.append(a);const s=e.$el;t.containerRoleDescriptionMessage&&o(s,t.containerRoleDescriptionMessage),t.containerMessage&&c(s,t.containerMessage);const i=e.$wrapperEl,r=i.attr("id")||`swiper-wrapper-${function(e=16){return"x".repeat(e).replace(/x/g,(()=>Math.round(16*Math.random()).toString(16)))}(16)}`,n=e.params.autoplay&&e.params.autoplay.enabled?"off":"polite";var p;p=r,i.attr("id",p),function(e,t){e.attr("aria-live",t)}(i,n),t.itemRoleDescriptionMessage&&o(d(e.slides),t.itemRoleDescriptionMessage),l(d(e.slides),t.slideRole);const u=e.params.loop?e.slides.filter((t=>!t.classList.contains(e.params.slideDuplicateClass))).length:e.slides.length;let m,v;e.slides.each(((s,a)=>{const i=d(s),r=e.params.loop?parseInt(i.attr("data-swiper-slide-index"),10):a;c(i,t.slideLabelMessage.replace(/\{\{index\}\}/,r+1).replace(/\{\{slidesLength\}\}/,u))})),e.navigation&&e.navigation.$nextEl&&(m=e.navigation.$nextEl),e.navigation&&e.navigation.$prevEl&&(v=e.navigation.$prevEl),m&&m.length&&g(m,r,t.nextSlideMessage),v&&v.length&&g(v,r,t.prevSlideMessage),f()&&e.pagination.$el.on("keydown",W(e.params.pagination.bulletClass),h)}s("beforeInit",(()=>{a=d(`<span class="${e.params.a11y.notificationClass}" aria-live="assertive" aria-atomic="true"></span>`)})),s("afterInit",(()=>{e.params.a11y.enabled&&(v(),m())})),s("toEdge",(()=>{e.params.a11y.enabled&&m()})),s("fromEdge",(()=>{e.params.a11y.enabled&&m()})),s("paginationUpdate",(()=>{e.params.a11y.enabled&&function(){const t=e.params.a11y;f()&&e.pagination.bullets.each((s=>{const a=d(s);r(a),e.params.pagination.renderBullet||(l(a,"button"),c(a,t.paginationBulletMessage.replace(/\{\{index\}\}/,a.index()+1)))}))}()})),s("destroy",(()=>{e.params.a11y.enabled&&function(){let t,s;a&&a.length>0&&a.remove(),e.navigation&&e.navigation.$nextEl&&(t=e.navigation.$nextEl),e.navigation&&e.navigation.$prevEl&&(s=e.navigation.$prevEl),t&&t.off("keydown",h),s&&s.off("keydown",h),f()&&e.pagination.$el.off("keydown",W(e.params.pagination.bulletClass),h)}()}))},function({swiper:e,extendParams:t,on:s}){t({history:{enabled:!1,root:"",replaceState:!1,key:"slides"}});let a=!1,i={};const n=e=>e.toString().replace(/\s+/g,"-").replace(/[^\w-]+/g,"").replace(/--+/g,"-").replace(/^-+/,"").replace(/-+$/,""),l=e=>{const t=r();let s;s=e?new URL(e):t.location;const a=s.pathname.slice(1).split("/").filter((e=>""!==e)),i=a.length;return{key:a[i-2],value:a[i-1]}},o=(t,s)=>{const i=r();if(!a||!e.params.history.enabled)return;let l;l=e.params.url?new URL(e.params.url):i.location;const o=e.slides.eq(s);let d=n(o.attr("data-history"));if(e.params.history.root.length>0){let s=e.params.history.root;"/"===s[s.length-1]&&(s=s.slice(0,s.length-1)),d=`${s}/${t}/${d}`}else l.pathname.includes(t)||(d=`${t}/${d}`);const c=i.history.state;c&&c.value===d||(e.params.history.replaceState?i.history.replaceState({value:d},null,d):i.history.pushState({value:d},null,d))},d=(t,s,a)=>{if(s)for(let i=0,r=e.slides.length;i<r;i+=1){const r=e.slides.eq(i);if(n(r.attr("data-history"))===s&&!r.hasClass(e.params.slideDuplicateClass)){const s=r.index();e.slideTo(s,t,a)}}else e.slideTo(0,t,a)},c=()=>{i=l(e.params.url),d(e.params.speed,e.paths.value,!1)};s("init",(()=>{e.params.history.enabled&&(()=>{const t=r();if(e.params.history){if(!t.history||!t.history.pushState)return e.params.history.enabled=!1,void(e.params.hashNavigation.enabled=!0);a=!0,i=l(e.params.url),(i.key||i.value)&&(d(0,i.value,e.params.runCallbacksOnInit),e.params.history.replaceState||t.addEventListener("popstate",c))}})()})),s("destroy",(()=>{e.params.history.enabled&&(()=>{const t=r();e.params.history.replaceState||t.removeEventListener("popstate",c)})()})),s("transitionEnd _freeModeNoMomentumRelease",(()=>{a&&o(e.params.history.key,e.activeIndex)})),s("slideChange",(()=>{a&&e.params.cssMode&&o(e.params.history.key,e.activeIndex)}))},function({swiper:e,extendParams:t,emit:s,on:i}){let n=!1;const l=a(),o=r();t({hashNavigation:{enabled:!1,replaceState:!1,watchState:!1}});const c=()=>{s("hashChange");const t=l.location.hash.replace("#","");if(t!==e.slides.eq(e.activeIndex).attr("data-hash")){const s=e.$wrapperEl.children(`.${e.params.slideClass}[data-hash="${t}"]`).index();if(void 0===s)return;e.slideTo(s)}},p=()=>
4059{if(n&&e.params.hashNavigation.enabled)if(e.params.hashNavigation.replaceState&&o.history&&o.history.replaceState)o.history.replaceState(null,null,`#${e.slides.eq(e.activeIndex).attr("data-hash")}`||""),s("hashSet");else{const t=e.slides.eq(e.activeIndex),a=t.attr("data-hash")||t.attr("data-history");l.location.hash=a||"",s("hashSet")}};i("init",(()=>{e.params.hashNavigation.enabled&&(()=>{if(!e.params.hashNavigation.enabled||e.params.history&&e.params.history.enabled)return;n=!0;const t=l.location.hash.replace("#","");if(t){const s=0;for(let a=0,i=e.slides.length;a<i;a+=1){const i=e.slides.eq(a);if((i.attr("data-hash")||i.attr("data-history"))===t&&!i.hasClass(e.params.slideDuplicateClass)){const t=i.index();e.slideTo(t,s,e.params.runCallbacksOnInit,!0)}}}e.params.hashNavigation.watchState&&d(o).on("hashchange",c)})()})),i("destroy",(()=>{e.params.hashNavigation.enabled&&e.params.hashNavigation.watchState&&d(o).off("hashchange",c)})),i("transitionEnd _freeModeNoMomentumRelease",(()=>{n&&p()})),i("slideChange",(()=>{n&&e.params.cssMode&&p()}))},function({swiper:e,extendParams:t,on:s,emit:i}){let r;function n(){const t=e.slides.eq(e.activeIndex);let s=e.params.autoplay.delay;t.attr("data-swiper-autoplay")&&(s=t.attr("data-swiper-autoplay")||e.params.autoplay.delay),clearTimeout(r),r=p((()=>{let t;e.params.autoplay.reverseDirection?e.params.loop?(e.loopFix(),t=e.slidePrev(e.params.speed,!0,!0),i("autoplay")):e.isBeginning?e.params.autoplay.stopOnLastSlide?o():(t=e.slideTo(e.slides.length-1,e.params.speed,!0,!0),i("autoplay")):(t=e.slidePrev(e.params.speed,!0,!0),i("autoplay")):e.params.loop?(e.loopFix(),t=e.slideNext(e.params.speed,!0,!0),i("autoplay")):e.isEnd?e.params.autoplay.stopOnLastSlide?o():(t=e.slideTo(0,e.params.speed,!0,!0),i("autoplay")):(t=e.slideNext(e.params.speed,!0,!0),i("autoplay")),(e.params.cssMode&&e.autoplay.running||!1===t)&&n()}),s)}function l(){return void 0===r&&(!e.autoplay.running&&(e.autoplay.running=!0,i("autoplayStart"),n(),!0))}function o(){return!!e.autoplay.running&&(void 0!==r&&(r&&(clearTimeout(r),r=void 0),e.autoplay.running=!1,i("autoplayStop"),!0))}function d(t){e.autoplay.running&&(e.autoplay.paused||(r&&clearTimeout(r),e.autoplay.paused=!0,0!==t&&e.params.autoplay.waitForTransition?["transitionend","webkitTransitionEnd"].forEach((t=>{e.$wrapperEl[0].addEventListener(t,u)})):(e.autoplay.paused=!1,n())))}function c(){const t=a();"hidden"===t.visibilityState&&e.autoplay.running&&d(),"visible"===t.visibilityState&&e.autoplay.paused&&(n(),e.autoplay.paused=!1)}function u(t){e&&!e.destroyed&&e.$wrapperEl&&t.target===e.$wrapperEl[0]&&(["transitionend","webkitTransitionEnd"].forEach((t=>{e.$wrapperEl[0].removeEventListener(t,u)})),e.autoplay.paused=!1,e.autoplay.running?n():o())}function h(){e.params.autoplay.disableOnInteraction?o():d(),["transitionend","webkitTransitionEnd"].forEach((t=>{e.$wrapperEl[0].removeEventListener(t,u)}))}function m(){e.params.autoplay.disableOnInteraction||(e.autoplay.paused=!1,n())}e.autoplay={running:!1,paused:!1},t({autoplay:{enabled:!1,delay:3e3,waitForTransition:!0,disableOnInteraction:!0,stopOnLastSlide:!1,reverseDirection:!1,pauseOnMouseEnter:!1}}),s("init",(()=>{if(e.params.autoplay.enabled){l();a().addEventListener("visibilitychange",c),e.params.autoplay.pauseOnMouseEnter&&(e.$el.on("mouseenter",h),e.$el.on("mouseleave",m))}})),s("beforeTransitionStart",((t,s,a)=>{e.autoplay.running&&(a||!e.params.autoplay.disableOnInteraction?e.autoplay.pause(s):o())})),s("sliderFirstMove",(()=>{e.autoplay.running&&(e.params.autoplay.disableOnInteraction?o():d())})),s("touchEnd",(()=>{e.params.cssMode&&e.autoplay.paused&&!e.params.autoplay.disableOnInteraction&&n()})),s("destroy",(()=>{e.$el.off("mouseenter",h),e.$el.off("mouseleave",m),e.autoplay.running&&o();a().removeEventListener("visibilitychange",c)})),Object.assign(e.autoplay,{pause:d,run:n,start:l,stop:o})},function({swiper:e,extendParams:t,on:s}){t({thumbs:{swiper:null,multipleActiveThumbs:!0,autoScrollOffset:0,slideThumbActiveClass:"swiper-slide-thumb-active",thumbsContainerClass:"swiper-thumbs"}});let a=!1,i=!1;function r(){const t=e.thumbs.swiper;if(!t)return;const s=t.clickedIndex,a=t.clickedSlide;if(a&&d(a).hasClass(e.params.thumbs.slideThumbActiveClass))return;if(null==s)return;let i;if(i=t.params.loop?parseInt(d(t.clickedSlide).attr("data-swiper-slide-index"),10):s,e.params.loop){let t=e.activeIndex;e.slides.eq(t).hasClass(e.params.slideDuplicateClass)&&(e.loopFix(),e._clientLeft=e.$wrapperEl[0].clientLeft,t=e.activeIndex);const s=e.slides.eq(t).prevAll(`[data-swiper-slide-index="${i}"]`).eq(0).index(),a=e.slides.eq(t).nextAll(`[data-swiper-slide-index="${i}"]`).eq(0).index();i=void 0===s?a:void 0===a?s:a-t<t-s?a:s}e.slideTo(i)}function n(){const{thumbs:t}=e.params;if(a)return!1;a=!0;const s=e.constructor;if(t.swiper instanceof s)e.thumbs.swiper=t.swiper,Object.assign(e.thumbs.swiper.originalParams,{watchSlidesProgress:!0,slideToClickedSlide:!1}),Object.assign(e.thumbs.swiper.params,{watchSlidesProgress:!0,slideToClickedSlide:!1});else if(m(t.swiper)){const a=Object.assign({},t.swiper);Object.assign(a,{watchSlidesProgress:!0,slideToClickedSlide:!1}),e.thumbs.swiper=new s(a),i=!0}return e.thumbs.swiper.$el.addClass(e.params.thumbs.thumbsContainerClass),e.thumbs.swiper.on("tap",r),!0}function l(t){const s=e.thumbs.swiper;if(!s)return;const a="auto"===s.params.slidesPerView?s.slidesPerViewDynamic():s.params.slidesPerView,i=e.params.thumbs.autoScrollOffset,r=i&&!s.params.loop;if(e.realIndex!==s.realIndex||r){let n,l,o=s.activeIndex;if(s.params.loop){s.slides.eq(o).hasClass(s.params.slideDuplicateClass)&&(s.loopFix(),s._clientLeft=s.$wrapperEl[0].clientLeft,o=s.activeIndex);const t=s.slides.eq(o).prevAll(`[data-swiper-slide-index="${e.realIndex}"]`).eq(0).index(),a=s.slides.eq(o).nextAll(`[data-swiper-slide-index="${e.realIndex}"]`).eq(0).index();n=void 0===t?a:void 0===a?t:a-o==o-t?s.params.slidesPerGroup>1?a:o:a-o<o-t?a:t,l=e.activeIndex>e.previousIndex?"next":"prev"}else n=e.realIndex,l=n>e.previousIndex?"next":"prev";r&&(n+="next"===l?i:-1*i),s.visibleSlidesIndexes&&s.visibleSlidesIndexes.indexOf(n)<0&&(s.params.centeredSlides?n=n>o?n-Math.floor(a/2)+1:n+Math.floor(a/2)-1:n>o&&s.params.slidesPerGroup,s.slideTo(n,t?0:void 0))}let n=1;const l=e.params.thumbs.slideThumbActiveClass;if(e.params.slidesPerView>1&&!e.params.centeredSlides&&(n=e.params.slidesPerView),e.params.thumbs.multipleActiveThumbs||(n=1),n=Math.floor(n),s.slides.removeClass(l),s.params.loop||s.params.virtual&&s.params.virtual.enabled)for(let t=0;t<n;t+=1)s.$wrapperEl.children(`[data-swiper-slide-index="${e.realIndex+t}"]`).addClass(l);else for(let t=0;t<n;t+=1)s.slides.eq(e.realIndex+t).addClass(l)}e.thumbs={swiper:null},s("beforeInit",(()=>{const{thumbs:t}=e.params;t&&t.swiper&&(n(),l(!0))})),s("slideChange update resize observerUpdate",(()=>{e.thumbs.swiper&&l()})),s("setTransition",((t,s)=>{const a=e.thumbs.swiper;a&&a.setTransition(s)})),s("beforeDestroy",(()=>{const t=e.thumbs.swiper;t&&i&&t&&t.destroy()})),Object.assign(e.thumbs,{init:n,update:l})},function({swiper:e,extendParams:t,emit:s,once:a}){t({freeMode:{enabled:!1,momentum:!0,momentumRatio:1,momentumBounce:!0,momentumBounceRatio:1,momentumVelocityRatio:1,sticky:!1,minimumVelocity:.02}}),Object.assign(e,{freeMode:{onTouchMove:function(){const{touchEventsData:t,touches:s}=e;
40590===t.velocities.length&&t.velocities.push({position:s[e.isHorizontal()?"startX":"startY"],time:t.touchStartTime}),t.velocities.push({position:s[e.isHorizontal()?"currentX":"currentY"],time:u()})},onTouchEnd:function({currentPos:t}){const{params:i,$wrapperEl:r,rtlTranslate:n,snapGrid:l,touchEventsData:o}=e,d=u()-o.touchStartTime;if(t<-e.minTranslate())e.slideTo(e.activeIndex);else if(t>-e.maxTranslate())e.slides.length<l.length?e.slideTo(l.length-1):e.slideTo(e.slides.length-1);else{if(i.freeMode.momentum){if(o.velocities.length>1){const t=o.velocities.pop(),s=o.velocities.pop(),a=t.position-s.position,r=t.time-s.time;e.velocity=a/r,e.velocity/=2,Math.abs(e.velocity)<i.freeMode.minimumVelocity&&(e.velocity=0),(r>150||u()-t.time>300)&&(e.velocity=0)}else e.velocity=0;e.velocity*=i.freeMode.momentumVelocityRatio,o.velocities.length=0;let t=1e3*i.freeMode.momentumRatio;const d=e.velocity*t;let c=e.translate+d;n&&(c=-c);let p,h=!1;const m=20*Math.abs(e.velocity)*i.freeMode.momentumBounceRatio;let f;if(c<e.maxTranslate())i.freeMode.momentumBounce?(c+e.maxTranslate()<-m&&(c=e.maxTranslate()-m),p=e.maxTranslate(),h=!0,o.allowMomentumBounce=!0):c=e.maxTranslate(),i.loop&&i.centeredSlides&&(f=!0);else if(c>e.minTranslate())i.freeMode.momentumBounce?(c-e.minTranslate()>m&&(c=e.minTranslate()+m),p=e.minTranslate(),h=!0,o.allowMomentumBounce=!0):c=e.minTranslate(),i.loop&&i.centeredSlides&&(f=!0);else if(i.freeMode.sticky){let t;for(let e=0;e<l.length;e+=1)if(l[e]>-c){t=e;break}c=Math.abs(l[t]-c)<Math.abs(l[t-1]-c)||"next"===e.swipeDirection?l[t]:l[t-1],c=-c}if(f&&a("transitionEnd",(()=>{e.loopFix()})),0!==e.velocity){if(t=n?Math.abs((-c-e.translate)/e.velocity):Math.abs((c-e.translate)/e.velocity),i.freeMode.sticky){const s=Math.abs((n?-c:c)-e.translate),a=e.slidesSizesGrid[e.activeIndex];t=s<a?i.speed:s<2*a?1.5*i.speed:2.5*i.speed}}else if(i.freeMode.sticky)return void e.slideToClosest();i.freeMode.momentumBounce&&h?(e.updateProgress(p),e.setTransition(t),e.setTranslate(c),e.transitionStart(!0,e.swipeDirection),e.animating=!0,r.transitionEnd((()=>{e&&!e.destroyed&&o.allowMomentumBounce&&(s("momentumBounce"),e.setTransition(i.speed),setTimeout((()=>{e.setTranslate(p),r.transitionEnd((()=>{e&&!e.destroyed&&e.transitionEnd()}))}),0))}))):e.velocity?(s("_freeModeNoMomentumRelease"),e.updateProgress(c),e.setTransition(t),e.setTranslate(c),e.transitionStart(!0,e.swipeDirection),e.animating||(e.animating=!0,r.transitionEnd((()=>{e&&!e.destroyed&&e.transitionEnd()})))):e.updateProgress(c),e.updateActiveIndex(),e.updateSlidesClasses()}else{if(i.freeMode.sticky)return void e.slideToClosest();i.freeMode&&s("_freeModeNoMomentumRelease")}(!i.freeMode.momentum||d>=i.longSwipesMs)&&(e.updateProgress(),e.updateActiveIndex(),e.updateSlidesClasses())}}}})},function({swiper:e,extendParams:t}){let s,a,i;t({grid:{rows:1,fill:"column"}}),e.grid={initSlides:t=>{const{slidesPerView:r}=e.params,{rows:n,fill:l}=e.params.grid;a=s/n,i=Math.floor(t/n),s=Math.floor(t/n)===t/n?t:Math.ceil(t/n)*n,"auto"!==r&&"row"===l&&(s=Math.max(s,r*n))},updateSlide:(t,r,n,l)=>{const{slidesPerGroup:o,spaceBetween:d}=e.params,{rows:c,fill:p}=e.params.grid;let u,h,m;if("row"===p&&o>1){const e=Math.floor(t/(o*c)),a=t-c*o*e,i=0===e?o:Math.min(Math.ceil((n-e*c*o)/c),o);m=Math.floor(a/i),h=a-m*i+e*o,u=h+m*s/c,r.css({"-webkit-order":u,order:u})}else"column"===p?(h=Math.floor(t/c),m=t-h*c,(h>i||h===i&&m===c-1)&&(m+=1,m>=c&&(m=0,h+=1))):(m=Math.floor(t/a),h=t-m*a);r.css(l("margin-top"),0!==m?d&&`${d}px`:"")},updateWrapperSize:(t,a,i)=>{const{spaceBetween:r,centeredSlides:n,roundLengths:l}=e.params,{rows:o}=e.params.grid;if(e.virtualSize=(t+r)*s,e.virtualSize=Math.ceil(e.virtualSize/o)-r,e.$wrapperEl.css({[i("width")]:`${e.virtualSize+r}px`}),n){a.splice(0,a.length);const t=[];for(let s=0;s<a.length;s+=1){let i=a[s];l&&(i=Math.floor(i)),a[s]<e.virtualSize+a[0]&&t.push(i)}a.push(...t)}}}},function({swiper:e}){Object.assign(e,{appendSlide:R.bind(e),prependSlide:j.bind(e),addSlide:_.bind(e),removeSlide:V.bind(e),removeAllSlides:q.bind(e)})},function({swiper:e,extendParams:t,on:s}){t({fadeEffect:{crossFade:!1,transformEl:null}}),F({effect:"fade",swiper:e,on:s,setTranslate:()=>{const{slides:t}=e,s=e.params.fadeEffect;for(let a=0;a<t.length;a+=1){const t=e.slides.eq(a);let i=-t[0].swiperSlideOffset;e.params.virtualTranslate||(i-=e.translate);let r=0;e.isHorizontal()||(r=i,i=0);const n=e.params.fadeEffect.crossFade?Math.max(1-Math.abs(t[0].progress),0):1+Math.min(Math.max(t[0].progress,-1),0);
4059U(s,t).css({opacity:n}).transform(`translate3d(${i}px, ${r}px, 0px)`)}},setTransition:t=>{const{transformEl:s}=e.params.fadeEffect;(s?e.slides.find(s):e.slides).transition(t),K({swiper:e,duration:t,transformEl:s,allSlides:!0})},overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!e.params.cssMode})})},function({swiper:e,extendParams:t,on:s}){t({cubeEffect:{slideShadows:!0,shadow:!0,shadowOffset:20,shadowScale:.94}}),F({effect:"cube",swiper:e,on:s,setTranslate:()=>{const{$el:t,$wrapperEl:s,slides:a,width:i,height:r,rtlTranslate:n,size:l,browser:o}=e,c=e.params.cubeEffect,p=e.isHorizontal(),u=e.virtual&&e.params.virtual.enabled;let h,m=0;c.shadow&&(p?(h=s.find(".swiper-cube-shadow"),0===h.length&&(h=d('<div class="swiper-cube-shadow"></div>'),s.append(h)),h.css({height:`${i}px`})):(h=t.find(".swiper-cube-shadow"),0===h.length&&(h=d('<div class="swiper-cube-shadow"></div>'),t.append(h))));for(let e=0;e<a.length;e+=1){const t=a.eq(e);let s=e;u&&(s=parseInt(t.attr("data-swiper-slide-index"),10));let i=90*s,r=Math.floor(i/360);n&&(i=-i,r=Math.floor(-i/360));const o=Math.max(Math.min(t[0].progress,1),-1);let h=0,f=0,g=0;s%4==0?(h=4*-r*l,g=0):(s-1)%4==0?(h=0,g=4*-r*l):(s-2)%4==0?(h=l+4*r*l,g=l):(s-3)%4==0&&(h=-l,g=3*l+4*l*r),n&&(h=-h),p||(f=h,h=0);const v=`rotateX(${p?0:-i}deg) rotateY(${p?i:0}deg) translate3d(${h}px, ${f}px, ${g}px)`;if(o<=1&&o>-1&&(m=90*s+90*o,n&&(m=90*-s-90*o)),t.transform(v),c.slideShadows){let e=p?t.find(".swiper-slide-shadow-left"):t.find(".swiper-slide-shadow-top"),s=p?t.find(".swiper-slide-shadow-right"):t.find(".swiper-slide-shadow-bottom");0===e.length&&(e=d(`<div class="swiper-slide-shadow-${p?"left":"top"}"></div>`),t.append(e)),0===s.length&&(s=d(`<div class="swiper-slide-shadow-${p?"right":"bottom"}"></div>`),t.append(s)),e.length&&(e[0].style.opacity=Math.max(-o,0)),s.length&&(s[0].style.opacity=Math.max(o,0))}}if(s.css({"-webkit-transform-origin":`50% 50% -${l/2}px`,"transform-origin":`50% 50% -${l/2}px`}),c.shadow)if(p)h.transform(`translate3d(0px, ${i/2+c.shadowOffset}px, ${-i/2}px) rotateX(90deg) rotateZ(0deg) scale(${c.shadowScale})`);else{const e=Math.abs(m)-90*Math.floor(Math.abs(m)/90),t=1.5-(Math.sin(2*e*Math.PI/360)/2+Math.cos(2*e*Math.PI/360)/2),s=c.shadowScale,a=c.shadowScale/t,i=c.shadowOffset;h.transform(`scale3d(${s}, 1, ${a}) translate3d(0px, ${r/2+i}px, ${-r/2/a}px) rotateX(-90deg)`)}const f=o.isSafari||o.isWebView?-l/2:0;s.transform(`translate3d(0px,0,${f}px) rotateX(${e.isHorizontal()?0:m}deg) rotateY(${e.isHorizontal()?-m:0}deg)`)},setTransition:t=>{const{$el:s,slides:a}=e;a.transition(t).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(t),e.params.cubeEffect.shadow&&!e.isHorizontal()&&s.find(".swiper-cube-shadow").transition(t)},perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,resistanceRatio:0,spaceBetween:0,centeredSlides:!1,virtualTranslate:!0})})},function({swiper:e,extendParams:t,on:s}){t({flipEffect:{slideShadows:!0,limitRotation:!0,transformEl:null}}),F({effect:"flip",swiper:e,on:s,setTranslate:()=>{const{slides:t,rtlTranslate:s}=e,a=e.params.flipEffect;for(let i=0;i<t.length;i+=1){const r=t.eq(i);let n=r[0].progress;e.params.flipEffect.limitRotation&&(n=Math.max(Math.min(r[0].progress,1),-1));const l=r[0].swiperSlideOffset;let o=-180*n,d=0,c=e.params.cssMode?-l-e.translate:-l,p=0;if(e.isHorizontal()?s&&(o=-o):(p=c,c=0,d=-o,o=0),r[0].style.zIndex=-Math.abs(Math.round(n))+t.length,a.slideShadows){let t=e.isHorizontal()?r.find(".swiper-slide-shadow-left"):r.find(".swiper-slide-shadow-top"),s=e.isHorizontal()?r.find(".swiper-slide-shadow-right"):r.find(".swiper-slide-shadow-bottom");0===t.length&&(t=Z(a,r,e.isHorizontal()?"left":"top")),0===s.length&&(s=Z(a,r,e.isHorizontal()?"right":"bottom")),t.length&&(t[0].style.opacity=Math.max(-n,0)),s.length&&(s[0].style.opacity=Math.max(n,0))}const u=`translate3d(${c}px, ${p}px, 0px) rotateX(${d}deg) rotateY(${o}deg)`;U(a,r).transform(u)}},setTransition:t=>{const{transformEl:s}=e.params.flipEffect;(s?e.slides.find(s):e.slides).transition(t).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(t),K({swiper:e,duration:t,transformEl:s})},perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!e.params.cssMode})})},function({swiper:e,extendParams:t,on:s}){t({coverflowEffect:{rotate:50,stretch:0,depth:100,scale:1,modifier:1,slideShadows:!0,transformEl:null}}),F({effect:"coverflow",swiper:e,on:s,setTranslate:()=>{const{width:t,height:s,slides:a,slidesSizesGrid:i}=e,r=e.params.coverflowEffect,n=e.isHorizontal(),l=e.translate,o=n?t/2-l:s/2-l,d=n?r.rotate:-r.rotate,c=r.depth;for(let e=0,t=a.length;e<t;e+=1){const t=a.eq(e),s=i[e],l=(o-t[0].swiperSlideOffset-s/2)/s*r.modifier;let p=n?d*l:0,u=n?0:d*l,h=-c*Math.abs(l),m=r.stretch;"string"==typeof m&&-1!==m.indexOf("%")&&(m=parseFloat(r.stretch)/100*s);let f=n?0:m*l,g=n?m*l:0,v=1-(1-r.scale)*Math.abs(l);Math.abs(g)<.001&&(g=0),Math.abs(f)<.001&&(f=0),Math.abs(h)<.001&&(h=0),Math.abs(p)<.001&&(p=0),Math.abs(u)<.001&&(u=0),Math.abs(v)<.001&&(v=0);const w=`translate3d(${g}px,${f}px,${h}px) rotateX(${u}deg) rotateY(${p}deg) scale(${v})`;if(U(r,t).transform(w),t[0].style.zIndex=1-Math.abs(Math.round(l)),r.slideShadows){let e=n?t.find(".swiper-slide-shadow-left"):t.find(".swiper-slide-shadow-top"),s=n?t.find(".swiper-slide-shadow-right"):t.find(".swiper-slide-shadow-bottom");0===e.length&&(e=Z(r,t,n?"left":"top")),0===s.length&&(s=Z(r,t,n?"right":"bottom")),e.length&&(e[0].style.opacity=l>0?l:0),s.length&&(s[0].style.opacity=-l>0?-l:0)}}},setTransition:t=>{const{transformEl:s}=e.params.coverflowEffect;(s?e.slides.find(s):e.slides).transition(t).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(t)},perspective:()=>!0,overwriteParams:()=>({watchSlidesProgress:!0})})},function({swiper:e,extendParams:t,on:s}){t({creativeEffect:{transformEl:null,limitProgress:1,shadowPerProgress:!1,progressMultiplier:1,perspective:!0,prev:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1},next:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1}}});const a=e=>"string"==typeof e?e:`${e}px`;F({effect:"creative",swiper:e,on:s,setTranslate:()=>{const{slides:t,$wrapperEl:s,slidesSizesGrid:i}=e,r=e.params.creativeEffect,{progressMultiplier:n}=r,l=e.params.centeredSlides;if(l){const t=i[0]/2-e.params.slidesOffsetBefore||0;s.transform(`translateX(calc(50% - ${t}px))`)}for(let s=0;s<t.length;s+=1){const i=t.eq(s),o=i[0].progress,d=Math.min(Math.max(i[0].progress,-r.limitProgress),r.limitProgress);let c=d;l||(c=Math.min(Math.max(i[0].originalProgress,-r.limitProgress),r.limitProgress));const p=i[0].swiperSlideOffset,u=[e.params.cssMode?-p-e.translate:-p,0,0],h=[0,0,0];let m=!1;e.isHorizontal()||(u[1]=u[0],u[0]=0);
4059let f={translate:[0,0,0],rotate:[0,0,0],scale:1,opacity:1};d<0?(f=r.next,m=!0):d>0&&(f=r.prev,m=!0),u.forEach(((e,t)=>{u[t]=`calc(${e}px + (${a(f.translate[t])} * ${Math.abs(d*n)}))`})),h.forEach(((e,t)=>{h[t]=f.rotate[t]*Math.abs(d*n)})),i[0].style.zIndex=-Math.abs(Math.round(o))+t.length;const g=u.join(", "),v=`rotateX(${h[0]}deg) rotateY(${h[1]}deg) rotateZ(${h[2]}deg)`,w=c<0?`scale(${1+(1-f.scale)*c*n})`:`scale(${1-(1-f.scale)*c*n})`,b=c<0?1+(1-f.opacity)*c*n:1-(1-f.opacity)*c*n,x=`translate3d(${g}) ${v} ${w}`;if(m&&f.shadow||!m){let e=i.children(".swiper-slide-shadow");if(0===e.length&&f.shadow&&(e=Z(r,i)),e.length){const t=r.shadowPerProgress?d*(1/r.limitProgress):d;e[0].style.opacity=Math.min(Math.max(Math.abs(t),0),1)}}const y=U(r,i);y.transform(x).css({opacity:b}),f.origin&&y.css("transform-origin",f.origin)}},setTransition:t=>{const{transformEl:s}=e.params.creativeEffect;(s?e.slides.find(s):e.slides).transition(t).find(".swiper-slide-shadow").transition(t),K({swiper:e,duration:t,transformEl:s,allSlides:!0})},perspective:()=>e.params.creativeEffect.perspective,overwriteParams:()=>({watchSlidesProgress:!0,virtualTranslate:!e.params.cssMode})})},function({swiper:e,extendParams:t,on:s}){t({cardsEffect:{slideShadows:!0,transformEl:null}}),F({effect:"cards",swiper:e,on:s,setTranslate:()=>{const{slides:t,activeIndex:s}=e,a=e.params.cardsEffect,{startTranslate:i,isTouched:r}=e.touchEventsData,n=e.translate;for(let l=0;l<t.length;l+=1){const o=t.eq(l),d=o[0].progress,c=Math.min(Math.max(d,-4),4);let p=o[0].swiperSlideOffset;e.params.centeredSlides&&!e.params.cssMode&&e.$wrapperEl.transform(`translateX(${e.minTranslate()}px)`),e.params.centeredSlides&&e.params.cssMode&&(p-=t[0].swiperSlideOffset);let u=e.params.cssMode?-p-e.translate:-p,h=0;const m=-100*Math.abs(c);let f=1,g=-2*c,v=8-.75*Math.abs(c);const w=(l===s||l===s-1)&&c>0&&c<1&&(r||e.params.cssMode)&&n<i,b=(l===s||l===s+1)&&c<0&&c>-1&&(r||e.params.cssMode)&&n>i;if(w||b){const e=(1-Math.abs((Math.abs(c)-.5)/.5))**.5;g+=-28*c*e,f+=-.5*e,v+=96*e,h=-25*e*Math.abs(c)+"%"}if(u=c<0?`calc(${u}px + (${v*Math.abs(c)}%))`:c>0?`calc(${u}px + (-${v*Math.abs(c)}%))`:`${u}px`,!e.isHorizontal()){const e=h;h=u,u=e}const x=`\n translate3d(${u}, ${h}, ${m}px)\n rotateZ(${g}deg)\n scale(${c<0?""+(1+(1-f)*c):""+(1-(1-f)*c)})\n `;if(a.slideShadows){let e=o.find(".swiper-slide-shadow");0===e.length&&(e=Z(a,o)),e.length&&(e[0].style.opacity=Math.min(Math.max((Math.abs(c)-.5)/.5,0),1))}o[0].style.zIndex=-Math.abs(Math.round(d))+t.length;U(a,o).transform(x)}},setTransition:t=>{const{transformEl:s}=e.params.cardsEffect;(s?e.slides.find(s):e.slides).transition(t).find(".swiper-slide-shadow").transition(t),K({swiper:e,duration:t,transformEl:s})},perspective:()=>!0,overwriteParams:()=>({watchSlidesProgress:!0,virtualTranslate:!e.params.cssMode})})}];return H.use(J),H})); 4060//# sourceMappingURL=swiper-bundle.min.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.