{"version":3,"sources":["../../node_modules/browser-pack/_prelude.js","../../modules/accordion/accordion.js","../../modules/addtocalendar/addtocalendar.js","../../modules/all-properties-map/all-properties-map.js","../../modules/card-filters/card-filters.js","../../modules/card-tabs/card-tabs.js","../../modules/cart/cart.js","../../modules/concierge/concierge.js","../../modules/contact-info/contact-info.js","../../modules/custom-filters/custom-filters.js","../../modules/date-picker/date-picker.js","../../modules/directory/directory.js","../../modules/event-filter/event-filter.js","../../modules/favorite-row/favorite-row.js","../../modules/fields/fields.js","../../modules/filters/filters.js","../../modules/form/form.js","../../modules/gravity-form/gravity-form.js","../../modules/header/header.js","../../modules/hero-image/hero-image.js","../../modules/hero-slider/hero-slider.js","../../modules/intro/intro.js","../../modules/load-more-posts/load-more-posts.js","../../modules/load-more/load-more.js","../../modules/modal/modal.js","../../modules/movie-list/movie-list.js","../../modules/promo-popup/promo-popup.js","../../modules/queue/queue.js","../../modules/reserve/reserve.js","../../modules/rewards-form/rewards-form.js","../../modules/rsvp/rsvp.js","../../modules/search-form/search-form.js","../../modules/search-results/search-results.js","../../modules/select-field/select-field.js","../../modules/sidebar/sidebar.js","../../modules/subscribe/subscribe.js","../../modules/text-animation/text-animation.js","../../modules/timer/timer.js","../../modules/truncate/truncate.js","../../modules/two-up-rows/two-up-rows.js","../../modules/video/video.js","../../node_modules/desandro-matches-selector/matches-selector.js","../../node_modules/ev-emitter/ev-emitter.js","../../node_modules/fizzy-ui-utils/utils.js","../../node_modules/flickity/js/add-remove-cell.js","../../node_modules/flickity/js/animate.js","../../node_modules/flickity/js/cell.js","../../node_modules/flickity/js/drag.js","../../node_modules/flickity/js/flickity.js","../../node_modules/flickity/js/index.js","../../node_modules/flickity/js/lazyload.js","../../node_modules/flickity/js/page-dots.js","../../node_modules/flickity/js/player.js","../../node_modules/flickity/js/prev-next-button.js","../../node_modules/flickity/js/slide.js","../../node_modules/get-size/get-size.js","../../node_modules/lodash.throttle/index.js","../../node_modules/shave/dist/shave.js","../../node_modules/svg-pan-zoom/src/browserify.js","../../node_modules/svg-pan-zoom/src/control-icons.js","../../node_modules/svg-pan-zoom/src/shadow-viewport.js","../../node_modules/svg-pan-zoom/src/svg-pan-zoom.js","../../node_modules/svg-pan-zoom/src/svg-utilities.js","../../node_modules/svg-pan-zoom/src/uniwheel.js","../../node_modules/svg-pan-zoom/src/utilities.js","../../node_modules/tiny-date-picker/dist/tiny-date-picker.js","../../node_modules/unidragger/unidragger.js","../../node_modules/unipointer/unipointer.js","../../src/js/lib/init-modules.js","../../src/js/main.js"],"names":["Accordion","el","$","find","on","$parent","this","parent","$button","slideToggle","toggleClass","hasClass","attr","window","global","module","exports","AddToCalendar","t","activeClass","list","querySelector","toggle","link","querySelectorAll","addEventListener","activeEl","document","activeElement","documentElement","classList","console","log","parentNode","e","target","contains","remove","tabIndex","timeout","openPopup","clearTimeout","add","closePopup","setTimeout","relatedTarget","forEach","Map","$el","$pins","id","filter","type","CardFilters","selectFieldEl","selectFieldElMobile","selectFieldElCurrent","filterEl","selectComponent","SelectField","filtersComponent","Filters","innerHTML","selectedIndex","filterByValue","value","onChange","bind","require","CardTabs","cards","Array","prototype","slice","call","$mobileFilter","$currentFilter","$items","firstItem","val","text","selectedFilter","addClass","removeClass","elem","event","screen","width","preventDefault","form","closest","submit","Concierge","start","getAttribute","end","closeButton","init","closeModal","load","insertAfter","first","throttle","offsetTop","innerHeight","offset","pageYOffset","ContactInfo","mapContainer","mapLat","mapLng","styles","featureType","elementType","stylers","visibility","mapProp","center","google","maps","LatLng","zoom","mapTypeControl","map","setOptions","Marker","position","$posts","children","$maps","$cards","length","$activePost","$activeMap","$activeCard","activeFilter","filterPost","filterMap","filterCard","split","singleValue","$newMap","$newCard","formatDate","date","getMonth","getDate","getFullYear","DatePicker","settings","isOpen","isEventsBound","dayEl","Date","parseInt","TIMESTAMP_DATA","isDayOfWeek","dateObject","arrayOfWeekdays","indexOf","getDay","filterDates","context","dateClose","days","DAY_SELECTOR","DAY_CLASS","TinyDatePicker","NEXT_CLASS","PREV_CLASS","defaultSettings","format","toLocaleDateString","mode","min","lang","today","clear","close","onOpen","onSelectYear","onSelectMonth","disabled","parse","str","replace","isNaN","onOpenCallback","extend","datepicker","focus","key","which","keyCode","stopPropagation","open","current","selected","parentElement","removeChild","undefined","onClose","alreadyInit","getSelectedDate","selectedDate","Directory","panzoom","options","zoomEnabled","contain","fit","controlIconsEnabled","minZoom","maxZoom","beforePan","oldPan","newPan","currentZoom","getZoom","x","y","sizes","getSizes","rightLimit","bottomLimit","height","Math","max","getBoundingClientRect","style","svgPanZoom","zoomInButton","zoomOutButton","zoomIn","zoomOut","getPoint","pt","createSVGPoint","matrixTransform","getScreenCTM","inverse","keyboardHandlers","panBy","pz","svgIDs","item","push","svgGroups","group","setAttribute","getMonthName","EventFilter","dateLabel","currentPage","calendarTrigger","calendarToggle","calendar","month","getUTCMonth","day","returnDate","location","href","checkFilterDate","url","clickOutside","FavoriteRow","slider","childElementCount","Flickity","cellAlign","prevNextButtons","pageDots","wrapAround","arrowShape","x0","x1","y1","x2","y2","x3","Fields","formSelects","formListSelect","markupSelect","formNativeSelect","formOptionsSelect","formPlaceholder","placeholderField","i","outerHTML","mobile","getUrlParameter","name","regex","RegExp","results","exec","decodeURIComponent","category","$filters","$active","itemSelector","data","$subFilters","$category","selectFilter","eq","$target","$newTargets","trigger","revertDate","selectAll","selector","disableButton","button","DISABLE_CLASS","enableButton","Form","datePickers","forms","buttons","areFormsEnabled","reserveChangeCheckbox","rewardsFormSubmit","checkbox","checked","args","setSeconds","getSeconds","getTimezoneOffset","unavailable","inRange","dt","GravityForm","$gform_upload_custom","$description_elm","$rules_text_elm","hide","append","Header","headerHeight","$document","$body","$html","$main","$menu","$toggle","$menuItems","$allMenuItems","$activeMenuItems","$searchIcon","$searchCloseIcon","$window","onTop","$link","siblings","$this","hash","substring","openSubmenu","closeSubmenu","each","$index","$item","toggleSubmenu","last","is","has","$page","smoothScroll","element","getElementById","scrollIntoView","top","parseFloat","css","animate","scrollTop","toggleFixedHeader","condition","HeroImage","adaptiveHeight","setGallerySize","autoPlay","HeroSlider","slides","videos","flickity","resize","ready","sideLinks","viewport","sideSelectedLink","dots","dot","createElement","buttonText","replaceAll","className","removeAttribute","appendChild","click","change","index","setHeights","playVideo","removeAttr","reset","cell","maxCellHeight","innerWidth","play","video","pause","Intro","urlFull","checkURLRedirect","includes","$secondaryBrandElm","LoadMorePosts","pageNumber","$loadMoreButton","$excludePost","$list","loadPosts","wp","ajax","dataType","ajaxUrl","excludePost","action","success","html","fadeIn","hasNextPage","error","LoadMore","filterClass","$allItems","update","showItems","PER_PAGE","count","$nextElement","prevObject","not","fadeOut","Modal","triggerSelector","MovieList","$size","size","$start","$loadMore","currentSlide","ceil","slideBreakpoint","groupCells","prevButton","insertBefore","select","PromoPopup","SHOW_POPUP","POPUP_OPEN_TIME","checkPopupClosed","localStorage","getItem","closePromoPopup","setItem","now","visibleTime","dataLayer","promo_popup_visible_time","popupOverlayElm","buttonClosePopup","email","res","result","first_name","last_name","wait_time","async","Reserve","JSON","dateOpen","dataInterval","input","HOUR_IN_MINS","generateTimeList","selectEls","selectEl","timeSelectComponent","updateTimePicker","datePicker","changeTimeRange","time","timeStart","convertTime","timeEnd","intervals","timeRange","getTimeRange","items","string","arr","parseTime","number","hour","floor","minute","interval","range","getMatchingTimeRange","dayIndex","generateSelectFieldDropdown","generateSelectFieldNative","desktopList","mobileList","timeField","selectFirstItem","RewardsRegister","dateField","timeSelect","timeFieldSelect","timeFieldName","populateTimeField","Object","keys","slots","slot","generateFieldData","generateBlankFields","markup","populateMobileFields","populateDesktopFields","destroy","fieldMobile","opt","textContent","required","RSVP","body","content","activeButton","overlay","SearchForm","$closeIcon","$input","SearchResults","resultsEmpty","resultsList","buttonDidYouMean","searchBottom","searchHeader","searchFavoriteGroup","cardSimple","search_message","show","fieldDesktop","fieldCurrent","onClickActive","isActive","activeItem","onSelectDesktop","removeSelectActive","callback","onSelectMobile","currentItem","onClickOutside","hasAttribute","$activeItem","$prevItem","$nextItem","$dropdown","apply","prev","outerHeight","next","dropdownItems","activeState","selectDesktop","selectMobile","keyboardAccessible","getName","selectedItem","otherItem","removeEventListener","off","Sidebar","URL","searchParams","get","main","Subscribe","formEl","msgEl","inputEmail","inputFirstName","inputLastName","thankYouPage","dataset","validity","typeMismatch","valueMissing","reportValidity","headers","Content-Type","contentType","serialize","code","message","TextAnimation","texts","firstText","Timer","$timer","TIMER_SELECTOR","expire","setInterval","remaining","seconds","minutes","clearInterval","Truncate","maxHeight","shave","TwoUpRows","inViewPort","rect","Video","$videoInner","$video","$modal","$iconClose","$overlayClose","openModal","factory","define","amd","matchesSelector","matchesMethod","ElemProto","Element","matches","prefixes","prefix","method","EvEmitter","proto","eventName","listener","events","_events","listeners","once","onceEvents","_onceEvents","splice","emitEvent","onceListeners","allOff","fizzyUIUtils","utils","a","b","prop","modulo","num","div","arraySlice","makeArray","obj","isArray","removeFrom","ary","getParent","getQueryElement","handleEvent","filterFindElements","elems","ffElems","HTMLElement","childElems","debounceMethod","_class","methodName","threshold","timeoutName","arguments","_this","docReady","readyState","toDashed","match","$1","$2","toLowerCase","htmlInit","WidgetClass","namespace","dashedNamespace","dataAttr","dataAttrElems","jsDashElems","concat","dataOptionsAttr","jQuery","instance","getCellsFragment","cells","fragment","createDocumentFragment","insert","_makeCells","len","isAppend","insertCellElement","endCells","_sizeCells","cellChange","prepend","getCells","minCellIndex","cellSizeChange","getCell","getSize","changedCellIndex","isPositioningSlider","prevSelectedElem","selectedElement","_positionCells","_getWrapShiftCells","getCellSlideIndex","positionSliderAtSelected","animatePrototype","startAnimation","isAnimating","restingFrames","applyDragForce","applySelectedAttraction","previousX","integratePhysics","positionSlider","settle","requestAnimationFrame","slideableWidth","shiftWrapCells","setTranslateX","dispatchScrollEvent","is3d","cursorPosition","rightToLeft","translateX","getPositionValue","transform","firstSlide","positionX","progress","slidesWidth","dispatchEvent","selectedSlide","velocity","percentPosition","round","isPointerDown","isFreeScrolling","beforeGap","_shiftCells","beforeShiftCells","afterGap","afterShiftCells","gap","shift","cellShift","wrapShift","outerWidth","_unshiftCells","getFrictionFactor","applyForce","force","getRestingPosition","isDraggable","dragVelocity","dragX","dragForce","distance","selectedAttraction","Cell","create","unselect","side","originSide","setPosition","updateTarget","renderPosition","setDefaultTarget","marginProperty","Unidragger","getScrollPosition","pageXOffset","defaults","draggable","dragThreshold","createMethods","_touchActionValue","isTouch","isTouchmoveScrollCanceled","_createDrag","onActivateDrag","_uiChangeDrag","onDeactivateDrag","updateDraggable","handles","bindHandles","unbindHandles","bindDrag","unbindDrag","pointerDown","pointer","_pointerDownDefault","okayPointerDown","_pointerDownPreventDefault","pointerDownFocus","pointerDownBlur","pointerDownScroll","pointerDownPointer","pageX","pageY","_bindPostStartEvents","focusNodes","INPUT","TEXTAREA","SELECT","nodeName","isTouchStart","isTouchPointer","pointerType","isFocusNode","hasDragStarted","moveVector","abs","pointerUp","isTouchScrolling","_dragPointerUp","pointerDone","dragStart","dragStartPosition","pointerMove","_dragPointerMove","_dragMove","dragMove","previousDragX","direction","originBound","endBound","getLastSlide","dragMoveTime","dragEnd","freeScroll","dragEndRestingSelect","restingX","dragEndBoostSelect","isDragSelect","getSlideDistance","positiveResting","_getClosestResting","negativeResting","increment","minDistance","Infinity","d","md","isWrapAround","slideIndex","slide","wrap","delta","staticClick","clickedCell","getParentCell","cellElem","cellIndex","onscroll","scroll","scrollMoveX","scrollMoveY","_pointerDone","Slide","_Flickity","moveElements","toElem","queryElement","flickityGUID","instances","option","$element","constructor","_create","getComputedStyle","GUID","accessibility","freeScrollFriction","friction","namespaceJQueryEvents","guid","_createSlider","watchCSS","activate","opts","_filterFindCellElements","reloadCells","selectInitialIndex","isInitActivated","cellSelector","positionCells","getLastCell","cellX","startCell","updateSlides","_containSlides","isOriginLeft","nextMargin","canCellFit","_getCanCellFit","addCell","slideWidth","firstMargin","updateSelectedSlide","percentMatch","percent","_init","reposition","setCellAlign","cellAlignShorthands","left","right","shorthand","gapX","_getGapCells","isRightToLeft","beginMargin","endMargin","contentWidth","isContentSmaller","beginBound","emitArgs","$event","jQEvent","Event","isWrap","isInstant","_wrapSelect","prevIndex","wrapIndex","backWrapDelta","forewardWrapDelta","previous","unselectSelectedSlide","selectedCells","selectedElements","getCellElements","selectedCell","initialIndex","queryCell","selectCell","getAdjacentCellElements","adjCount","cellElems","uiChange","childUIPointerDown","onresize","deactivate","onkeydown","isNotFocused","handler","37","leftMethod","39","rightMethod","prevScrollY","preventScroll","scrollTo","removeData","bridget","setJQuery","jq","getCellLazyImages","lazyloadAttr","srcAttr","srcsetAttr","imgs","LazyLoader","img","_createLazyload","lazyLoad","lazyImages","lazyCellImages","src","srcset","onload","complete","onerror","Unipointer","PageDots","holder","handleClick","onClick","setDots","bindStartEvent","unbindStartEvent","addDots","removeDots","newDots","updateSelected","selectedDot","onTap","_createPageDots","activatePageDots","updateSelectedPageDots","updatePageDots","deactivatePageDots","Player","state","onVisibilityChange","visibilityChange","onVisibilityPlay","visibilityPlay","hidden","tick","stop","unpause","pauseAutoPlayOnHover","_createPlayer","player","activatePlayer","stopPlayer","deactivatePlayer","playPlayer","pausePlayer","unpausePlayer","onmouseenter","onmouseleave","PrevNextButton","getArrowMovements","shape","svgURI","isEnabled","isPrevious","leftDirection","isLeft","disable","svg","createSVG","createElementNS","path","pathMovements","onclick","enable","lastIndex","boundIndex","_createPrevNextButtons","nextButton","activatePrevNextButtons","deactivatePrevNextButtons","lastCell","lastMargin","getStyleSize","noop","getZeroSize","measurementsLength","measurements","getStyle","logError","setup","isSetup","padding","borderStyle","borderWidth","boxSizing","isBoxSizeOuter","nodeType","display","offsetWidth","offsetHeight","isBorderBox","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingTop","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","debounce","func","wait","invokeFunc","lastArgs","thisArg","lastThis","lastInvokeTime","leadingEdge","timerId","timerExpired","leading","remainingWait","timeSinceLastCall","lastCallTime","timeSinceLastInvoke","maxing","nativeMin","maxWait","shouldInvoke","trailingEdge","trailing","cancel","flush","debounced","isInvoking","TypeError","FUNC_ERROR_TEXT","toNumber","isObject","nativeMax","isObjectLike","isSymbol","objectToString","symbolTag","NAN","other","valueOf","reTrim","isBinary","reIsBinary","test","reIsOctal","freeParseInt","reIsBadHex","freeGlobal","freeSelf","self","root","Function","objectProto","toString","Error","els","character","classname","spaces","charHtml","span","textProp","fullText","words","heightStyle","maxHeightStyle","pivot","join","insertAdjacentHTML","diff","shavedText","createTextNode","elWithShavedText","insertAdjacentElement","SvgPanZoom","SvgUtils","defs","svgNS","zoomGroup","_createZoomIn","_createZoomReset","_createZoomOut","controlIcons","getPublicInstance","zoomInBackground","zoomInShape","resetPanZoomControl","resetPanZoomControlBackground","resetPanZoomControlShape1","resetPanZoomControlShape2","zoomOutBackground","zoomOutShape","Utils","ShadowViewport","originalState","updateCTMCached","proxy","updateCTM","createRequestAnimationFrame","refreshRate","viewBox","cacheViewBox","newCTM","processCTM","setCTM","svgViewBox","viewBoxValues","v","updateCTMOnNextFrame","simpleViewBoxCache","bBox","getBBox","getViewBox","getCTM","newScale","f","offsetX","offsetY","getOriginalState","getState","getRelativeZoom","computeRelativeZoom","scale","getPan","safeCTM","createSVGMatrix","c","willZoom","isZoomDifferent","willPan","isPanDifferent","beforeZoom","updateCache","onZoom","preventPan","preventPanX","preventPanY","isNumber","onPan","pendingUpdate","ctm","onUpdatedCTM","Wheel","ControlIcons","optionsDefaults","viewportSelector","panEnabled","dblClickZoomEnabled","mouseWheelZoomEnabled","preventMouseEventsDefault","zoomScaleSensitivity","customEventsHandler","eventsListenerElement","passiveListenerOption","passive","that","setupSvgAttributes","boundingClientRectNormalized","getBoundingClientRectNormalized","getOrCreateViewport","oldScale","oldPoint","newPoint","point","publicInstance","setBeforeZoom","setOnZoom","setBeforePan","setOnPan","setOnUpdatedCTM","lastMouseWheelEventTime","setupHandlers","prevEvt","eventListeners","mousedown","evt","handleMouseDown","touchstart","mouseup","handleMouseUp","touchend","mousemove","handleMouseMove","touchmove","mouseleave","touchleave","touchcancel","svgElement","haltEventListeners","hasOwnProperty","enableMouseWheelZoom","wheelListener","handleMouseWheel","isPassiveListener","disableMouseWheelZoom","returnValue","deltaY","timeDelta","divider","deltaMode","wheelDelta","inversedScreenCTM","relativeMousePoint","getEventPoint","pow","zoomAtPoint","zoomScale","zoomAbsolute","oldCTM","relativePoint","modifier","translate","multiply","absolute","getSvgCenterPoint","publicZoom","computeFromRelativeZoom","publicZoomAtPoint","getType","resetZoom","resetPan","pan","handleDblClick","zoomFactor","shiftKey","mouseAndTouchNormalize","isDblClick","firstEventCTM","stateOrigin","viewportCTM","updateBBox","disableControlIcons","enableControlIcons","instancesStore","pi","enablePan","disablePan","isPanEnabled","fn","enableZoom","disableZoom","isZoomEnabled","isControlIconsEnabled","enableDblClickZoom","disableDblClickZoom","isDblClickZoomEnabled","isMouseWheelZoomEnabled","setZoomScaleSensitivity","setMinZoom","setMaxZoom","zoomBy","zoomAtPointBy","realZoom","elementOrSelector","getSvg","_browser","documentMode","xmlNS","xmlnsNS","xlinkNS","evNS","clientWidth","clientHeight","isElement","childNodes","viewportId","toISOString","svgChildren","classNames","setAttributeNS","internetExplorerRedisplayInterval","refreshDefsGlobal","allDefs","allDefsCount","thisDefs","matrix","s","clientX","clientY","createCallback","originalEvent","srcElement","deltaX","delatZ","support","wheelDeltaX","detail","fns","getCallback","removeCallback","_addWheelListener","cb","_addEventListener","activeListenerOption","_removeWheelListener","_removeEventListener","addWheelListener","removeWheelListener","onmousewheel","requestTimeout","source","o","SVGElement","SVGSVGElement","n","isFinite","String","tagName","contentDocument","getSVGDocument","touches","timeStampDiff","timeStamp","touchesDistance","sqrt","getTime","later","setHours","datesEq","date1","date2","toDateString","shiftDay","setDate","shiftMonth","dayOfMonth","setMonth","shiftYear","setFullYear","setYear","year","dateOrParse","dropTime","constrainDate","bufferFn","ms","cp","o1","o2","DatePickerOptions","english","makeInRangeFn","hilightedDate","dateClass","dp","render","dayNames","dayOffset","hilightedMonth","months","mapDays","isNotInMonth","isDisabled","isToday","keyDown","shiftBy","Key","up","down","esc","setState","selectToday","showMonthPicker","view","showYearPicker","gotoNextMonth","gotoPrevMonth","selectDay","currentDate","iter","onChooseMonth","render$1","currentMonth","keyDown$1","render$2","currentYear","selectedYear","mapYears","onChooseYear","keyDown$2","shiftedYear","BaseMode","emit","detatchInputEvents","closing","shouldFocusOnBlur","shouldFocusOnRender","updateInput","adjustPosition","containerHTML","attachToDom","CustomEvent","bubbles","simulated","computeSelectedDate","currentView","views","createContainerElement","attachContainerEvents","isVisible","hasFocus","focused","shouldHide","becauseOfBlur","focusInput","firstChild","hadFocus","focusCurrent","attachInputEvents","bufferShow","calEl","ontouchstart","enter","onKeyDown","navigator","userAgent","MSStream","blur","ModalMode","readonly","DropdownMode","defineProperty","autoPosition","inputPos","win","adjustCalY","adjustCalX","cal","scrollLeft","inputLeft","maxRight","calRight","shiftedLeft","inputTop","calHeight","belowTop","aboveTop","isAbove","PermanentMode","Mode","Emitter","onOne","handlers","onMany","arg","h","emitter","me","params","cancelable","createEvent","initCustomEvent","dayPicker","dp-day","dp-next","dp-prev","dp-today","dp-clear","dp-close","dp-cal-month","dp-cal-year","monthPicker","dp-month","yearPicker","dp-year","_bindHandles","isAdd","bindMethod","touchAction","handle","_bindStartEvent","PointerEvent","cursorNodes","OPTION","clickTypes","radio","image","file","isCursorNode","isClickType","isOkay","_pointerReset","isDragging","_dragStart","_dragEnd","_staticClick","isPreventingClicks","isIgnoringMouseUp","getPointerPoint","startEvent","getTouch","touch","identifier","pointerIdentifier","onmousedown","_pointerDown","changedTouches","onpointerdown","pointerId","postStartEvents","pointerdown","_boundPointerEvents","_unbindPostStartEvents","onmousemove","_pointerMove","onpointermove","ontouchmove","onmouseup","_pointerUp","onpointerup","ontouchend","onpointercancel","_pointerCancel","ontouchcancel","pointerCancel","initializeModules","modules","Module","mod"],"mappings":"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","file":"bundle.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i start && offset < end) {\n\t\t\t\tt.el.classList.add( t.activeClass );\n\t\t\t} else {\n\t\t\t\tt.el.classList.remove( t.activeClass );\n\t\t\t}\n\t\t}, 300));\n\t}\n};\n\nConcierge.prototype.closeModal = function() {\n\tvar t = this;\n\tt.el.classList.remove( t.activeClass );\n\tsetTimeout(function () {\n\t\tt.el.remove();\n\t},300);\n};\n\nmodule.exports = Concierge;\n","function ContactInfo(el) {\n var mapContainer = el.querySelector('[data-map]');\n if( mapContainer ) {\n var mapLat = mapContainer.getAttribute('data-lat'),\n mapLng = mapContainer.getAttribute('data-lng');\n if( mapLat && mapLng ) {\n var styles = [\n {\n featureType: \"poi.business\",\n elementType: \"labels\",\n stylers: [\n { visibility: \"off\" }\n ]\n }\n ];\n var mapProp = {\n center: new google.maps.LatLng(mapLat,mapLng),\n zoom: 15,\n mapTypeControl: false\n };\n var map = new google.maps.Map(mapContainer,mapProp);\n map.setOptions({styles: styles});\n var marker = new google.maps.Marker({\n position: new google.maps.LatLng(mapLat,mapLng),\n map: map,\n });\n }\n }\n}\n\nmodule.exports = ContactInfo;","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction Filters(el) {\n\tvar t = this;\n\tt.$el = $(el);\n\tt.$posts = $('.js-directory-post-filters').children();\n\tt.$maps = $('.js-directory-map-filters svg').children();\n\tt.$cards = $('.js-card-filters').children();\n\n\tif ( t.$posts.length ) {\n\t\tt.$activePost = t.$posts.filter('.directory__item--active');\n\t}\n\tif ( t.$maps.length ) {\n\t\tt.$activeMap = t.$maps.filter('js-active');\n\t}\n\n\tif ( t.$cards.length ) {\n\t\tt.$activeCard = t.$cards.filter('.small-card--active');\n\t}\n}\n\nFilters.prototype.filterByValue = function(value) {\n\tvar t = this;\n\n\tif( t.activeFilter == value ) {\n\t\treturn;\n\t}\n\n\tif( t.$posts.length ) {\n\t\tt.filterPost(value);\n\t}\n\n\tif( t.$maps.length ) {\n\t\tt.filterMap(value);\n\t}\n\n\tif( t.$cards.length ) {\n\t\tt.filterCard(value);\n\t}\n\n\tt.activeFilter = value;\n};\n\nFilters.prototype.filterPost = function(value) {\n\tvar t = this;\n\tt.$activePost.removeClass('directory__item--active');\n\tt.$posts.removeClass('directory__item--active')\n\tt.$activePost = $(value.split('|').map(function(singleValue) {\n\t\tvar $newPosts = t.$posts.filter( '[data-filter-type*=\"|' + singleValue + '|\"]' );\n\t\t$newPosts.addClass('directory__item--active');\n\t}));\n};\n\nFilters.prototype.filterMap = function(value) {\n\tvar t = this;\n\tt.$maps.removeClass('js-active');\n\tt.$activeMap = $(value.split('|').map(function(singleValue) {\n\t\tvar $newMap = t.$maps.filter( '[data-filter*=\"' + singleValue + '\"]' );\n\t\t$newMap.addClass('js-active');\n\t\treturn $newMap;\n\t}));\n};\n\nFilters.prototype.filterCard = function(value) {\n\tvar t = this;\n\n\tif( value == 'all' ) {\n\t\tt.$el.addClass('card-filter-all');\n\t\tt.$cards.addClass('small-card--active');\n\t} else {\n\t\tt.$el.removeClass('card-filter-all');\n\t\tt.$cards.removeClass('small-card--active');\n\t\tt.$newCard = t.$cards.filter( '[data-filter-type*=\"|' + value + '|\"]' );\n\t\tt.$activeCard.removeClass('small-card--active');\n\t\tt.$newCard.addClass('small-card--active');\n\t\tt.$activeCard = t.$newCard;\n\t}\n};\n\nmodule.exports = Filters;\n","var TinyDatePicker = require('tiny-date-picker');\nvar $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nvar NEXT_CLASS = 'dp-next',\n\tPREV_CLASS = 'dp-prev',\n\tDAY_CLASS = 'dp-day',\n\tDAY_SELECTOR = '.' + DAY_CLASS,\n\tTIMESTAMP_DATA = 'data-date';\n\nfunction formatDate(date) {\n\treturn (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear();\n}\n\nfunction DatePicker(el, settings) {\n\tthis.el = el;\n\tthis.isOpen = false;\n\tthis.init(settings);\n\tthis.isEventsBound = false;\n}\n\nDatePicker.prototype.init = function(settings) {\n\tvar t = this,\n\t\tdefaultSettings = {\n\t\t\tformat: function (date) {\n\t\t\t\treturn date.toLocaleDateString();\n\t\t\t},\n\t\t\tmode: 'dp-below',\n\t\t\tmin: formatDate(new Date()),\n lang: {\n days: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n today: '',\n clear: '',\n close: ''\n },\n\t\t\tonOpen: t.onOpen.bind(t),\n\t\t\tonSelectYear: t.filter.bind(t),\n\t\t\tonSelectMonth: t.filter.bind(t),\n\t\t\tdisabled: [],\n\t\t\tparse: function(str) {\n\t\t\t\tif (! str) {\n\t\t\t\t\treturn new Date();\n\t\t\t\t}\n\t\t\t\tvar date = new Date(str.replace('-', '/'));\n\t\t\t\treturn isNaN(date) ? new Date() : date;\n\t\t\t}\n\t\t};\n\n\tif (! settings) {\n\t\tsettings = {};\n\t}\n\n\tif (settings.onOpen) {\n\t\tsettings.onOpenCallback = settings.onOpen;\n\t\tsettings.onOpen = defaultSettings.onOpen;\n\t}\n\n\tt.settings = $.extend({}, defaultSettings, settings);\n\n\tt.datepicker = new TinyDatePicker(t.el, t.settings);\n\n\tt.datepicker.on('close', function() {\n t.isOpen = false;\n t.el.focus();\n });\n\n\tt.datepicker.on('open', function(context) {\n document.querySelector('.dp-current').focus();\n document.querySelector('.dp').addEventListener('keydown', function(e) {\n var key = e.which || e.keyCode;\n\n if (key === 13) {\n e.stopPropagation();\n e.preventDefault();\n } else if (key === 9) {\n e.stopPropagation();\n t.el.focus();\n }\n });\n\n t.isOpen = true;\n });\n\n\tt.el.addEventListener('keydown', function(e) {\n\t if (!t.isOpen) {\n var key = e.which || e.keyCode;\n\n if (key === 32) {\n t.datepicker.open();\n }\n }\n });\n\n\tt.el.addEventListener('change', function() {\n\t\tvar\n\t\t\tcurrent, selected,\n\t\t\tdate = new Date(t.el.value);\n\n\t\tif (isDayOfWeek(date, t.settings.disabled)) {\n\t\t\tcurrent = t.datepicker.el.querySelector('.dp-current');\n\t\t\tselected = t.datepicker.el.querySelector('.dp-selected');\n\t\t\tif (current) {\n\t\t\t\tcurrent.classList.remove('dp-current');\n\t\t\t}\n\t\t\tif (selected) {\n\t\t\t\tselected.classList.remove('dp-selected');\n\t\t\t}\n\t\t\tt.el.value = '';\n\t\t\tt.filter(t.datepicker);\n\t\t} else {\n\t\t\tt.close();\n\t\t}\n\n\t});\n};\n\nDatePicker.prototype.filter = function(context) {\n\tfilterDates(context, this.settings.disabled);\n};\n\nDatePicker.prototype.toggle = function () {\n\tif (this.datepicker.el) {\n\t\tthis.close();\n\t} else {\n\t\tthis.datepicker.open();\n\t}\n\tvar iconCalendar = document.querySelector('.js-calendar-toggle');\n\ticonCalendar.classList.toggle('card-tabs__calendar--active');\n};\n\nDatePicker.prototype.close = function () {\n\tvar el = this.datepicker.el;\n\tel && el.parentElement.removeChild(el);\n\tthis.datepicker.el = undefined;\n\tif (this.settings.onClose) {\n\t\tthis.settings.onClose();\n\t}\n};\n\nDatePicker.prototype.onOpen = function(context) {\n\tvar t = this;\n\tfilterDates(context, t.settings.disabled);\n\n\tif (t.isEventsBound) {\n\t\treturn;\n\t}\n\n\tcontext.el.addEventListener('click', function(e) {\n\t\tif (e.target.classList.contains(NEXT_CLASS) ||\n\t\t\te.target.classList.contains(PREV_CLASS)) {\n\t\t\tfilterDates(context, t.settings.disabled);\n\t\t}\n\t});\n\n\tcontext.el.addEventListener('keydown', function(e) {\n\t\tthis.filter(context);\n\t}.bind(t));\n\n\tt.alreadyInit = true;\n};\n\nDatePicker.prototype.getSelectedDate = function () {\n\treturn this.datepicker.selectedDate;\n};\n\nfunction getDate(dayEl) {\n\treturn new Date(parseInt(dayEl.getAttribute(TIMESTAMP_DATA)));\n}\n\nfunction isDayOfWeek(dateObject, arrayOfWeekdays) {\n\treturn arrayOfWeekdays.indexOf(dateObject.getDay()) !== -1;\n}\n\nfunction filterDates(context, dateClose) {\n\tvar days = Array.prototype.slice.call(context.el.querySelectorAll(DAY_SELECTOR));\n\tif( dateClose.length && days ) {\n\t\tvar closeDays = days.filter(function(dayEl) {\n\t\t\treturn isDayOfWeek(getDate(dayEl), dateClose);\n\t\t});\n\t\tcloseDays.forEach(function(dayEl) {\n\t\t\tdayEl.classList.add(DAY_CLASS + '-disabled');\n\t\t});\n\t}\n}\n\n\nmodule.exports = DatePicker;\n","var SelectField = require('modules/select-field');\nvar Filters = require('modules/custom-filters');\nvar svgPanZoom = require('svg-pan-zoom');\n\nfunction Directory(el) {\n\tvar t = this,\n\t\tselectFieldEl = el.querySelector('.js-directory-dropdown'),\n\t\tselectFieldElMobile = selectFieldEl.querySelector('[data-field-mobile]'),\n\t\tselectFieldElCurrent = selectFieldEl.querySelector('[data-field-current]'),\n\t\tselectComponent = new SelectField(selectFieldEl),\n\t\tfiltersComponent = new Filters(el);\n\n\tt.el = el;\n\tt.map = t.el.querySelector('.js-directory-map-filters svg');\n\tt.panzoom = null;\n\n\tif( t.map ) {\n\t\tvar options = {\n\t\t\tzoomEnabled: true,\n\t\t\tcontain: true,\n\t\t\tfit: true,\n\t\t\tcontrolIconsEnabled: false,\n\t\t\tminZoom: 1,\n\t\t\tmaxZoom: 10,\n\t\t\tbeforePan: function( oldPan, newPan ){\n\t\t\t\tvar currentZoom = t.panzoom.getZoom();\n\t\t\t\tif (currentZoom <= 1.00001) {\n\t\t\t\t\treturn {x: 0, y:0};\n\t\t\t\t}\n\n\t\t\t\tvar sizes = this.getSizes(),\n\t\t\t\t\tleftLimit = 0,\n\t\t\t\t\trightLimit = -(sizes.width * (currentZoom - 1)),\n\t\t\t\t\ttopLimit = 0,\n\t\t\t\t\tbottomLimit = -(sizes.height * (currentZoom - 1));\n\n\t\t\t\treturn {\n\t\t\t\t\tx: Math.min(leftLimit, Math.max(rightLimit, newPan.x)),\n\t\t\t\t\ty: Math.min(topLimit, Math.max(bottomLimit, newPan.y))\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\theight = t.map.getBoundingClientRect().height;\n\n\t\tif( height ) {\n\t\t\tt.map.parentNode.style.height = height + 'px';\n\t\t}\n\t\tt.panzoom = svgPanZoom(t.map, options);\n\t\tt.zoomInButton = t.el.querySelector('[data-zoom-in]');\n\t\tt.zoomOutButton = t.el.querySelector('[data-zoom-out]');\n\n\t\tif( t.zoomInButton ) {\n\t\t\tt.zoomInButton.addEventListener('click', function(event) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tt.panzoom.zoomIn();\n\t\t\t});\n\t\t}\n\n\t\tif( t.zoomOutButton ) {\n\t\t\tt.zoomOutButton.addEventListener('click', function(event) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tt.panzoom.zoomOut();\n\t\t\t});\n\t\t}\n\n\t\t// move svg using arrow key.\n\t\tt.getPoint = function(x, y) {\n\t\t\tvar pt = t.map.createSVGPoint();\n\t\t\tpt.x = x;\n\t\t\tpt.y = y;\n\n\t\t\treturn pt.matrixTransform(t.map.getScreenCTM().inverse());\n\t\t};\n\n\t\tt.keyboardHandlers = function(e) {\n\t\t\tvar key = e.which || e.keyCode,\n\t\t\t\tstep = 15;\n\n\t\t\tif (key >= 37 && key <= 40) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\n\t\t\tswitch (key) {\n\t\t\t\tcase 37:\t// left\n\t\t\t\t\tt.panzoom.panBy({x: step, y: 0});\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase 38:\t// up\n\t\t\t\t\tt.panzoom.panBy({x: 0, y: step});\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase 39:\t// right\n\t\t\t\t\tt.panzoom.panBy({x: -step, y: 0});\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase 40:\t// down\n\t\t\t\t\tt.panzoom.panBy({x: 0, y: -step});\n\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t};\n\n\t\tt.zoomInButton.addEventListener('keydown', t.keyboardHandlers);\n\t\tt.zoomOutButton.addEventListener('keydown', t.keyboardHandlers);\n\t}\n\n\twindow.pz = t.panzoom;\n\n\n\n\t// Generate array list for SVG groups\n\tif( selectFieldElMobile ) {\n\t\tt.list = Array.prototype.slice.call( selectFieldElMobile.children );\n\t\tt.svgIDs = [];\n\t\tt.list.forEach( function(item) {\n\t\t\tvar value = item.getAttribute('value');\n\t\t\tif( value ) {\n\t\t\t\tvalue.split('|').map(function(singleValue) {\n\t\t\t\t\tt.svgIDs.push(singleValue);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\t// Check and append data filter to matching filter group\n\tif( t.svgIDs && t.map ) {\n\t\tt.svgGroups = Array.prototype.slice.call( t.map.querySelectorAll('g'));\n\t\tif( t.svgGroups ) {\n\t\t\tt.svgGroups.forEach( function(group) {\n\t\t\t\tvar id = group.getAttribute('id');\n\t\t\t\tif( t.svgIDs.indexOf(id) != -1) {\n\t\t\t\t\tgroup.setAttribute('data-filter', id);\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\tfiltersComponent.filterByValue(selectFieldElMobile.value);\n\tselectComponent.onChange(filtersComponent.filterByValue.bind(filtersComponent));\n}\nmodule.exports = Directory;\n","var DatePicker = require('modules/date-picker');\nvar $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction getMonthName(date) {\n\tvar monthNames = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\n\treturn monthNames[date.getMonth()];\n}\n\nfunction formatDate(date) {\n\treturn getMonthName(date) + ' ' + date.getDate() + ', ' + date.getFullYear();\n}\n\nfunction EventFilter(el) {\n\tthis.el = el;\n\tthis.toggle = this.el.querySelector('.js-calendar-toggle');\n\tthis.event = Array.prototype.slice.call(this.el.querySelectorAll('[data-date-start]'));\n\tthis.selectedDate = this.el.querySelector('.js-selected-date');\n\tthis.dateLabel = this.el.querySelector('.js-today-date');\n\tthis.currentPage = 0;\n\n\tthis.calendarTrigger();\n\t// this.clickOutside();\n}\n\nEventFilter.prototype.calendarTrigger = function() {\n\tvar t = this;\n\tif ( t.toggle ) {\n\t\tt.calendarToggle();\n\t}\n};\n\nEventFilter.prototype.calendarToggle = function() {\n\tvar t = this;\n\n\tt.calendar = new DatePicker(t.selectedDate, {\n\t\tformat: function(selectedDate) {\n\t\t\treturn formatDate(selectedDate);\n\t\t}\n\t});\n\n\tt.selectedDate.addEventListener('change', function() {\n\t\tvar date = new Date(t.selectedDate.value),\n\t\t\tmonth = date.getUTCMonth() + 1,\n\t\t\tday = date.getDate();\n\n\t\tif (day < 10) {\n\t\t\tday = '0' + day;\n\t\t}\n\n\t\tif (month < 10) {\n\t\t\tmonth = '0' + month;\n\t\t}\n\t\tvar returnDate = month + '/' + day + '/' + date.getFullYear();\n\t\tlocation.href = '?date=' + returnDate;\n\t});\n\n\tt.toggle.addEventListener('click', t.calendar.toggle.bind(t.calendar));\n};\n\nEventFilter.prototype.checkFilterDate = function() {\n\tvar field = 'date',\n\t\turl = window.location.href;\n\tif( url.indexOf('?' + field + '=') !== -1 ) {\n\t\treturn true;\n\t} else if( url.indexOf('&' + field + '=') !== -1 ) {\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nEventFilter.prototype.clickOutside = function() {\n\tvar t = this;\n\tdocument.addEventListener('click', function (e) {\n\t\tif ( e.target !== t.toggle.parentNode.querySelector('.dp-below') && e.target != t.calendar ) {\n\t\t\tt.calendar.close();\n\t\t\tt.toggle.classList.remove('card-tabs__calendar--active');\n\t\t}\n\t});\n};\nmodule.exports = EventFilter;\n","var Flickity = require('flickity');\n\nfunction FavoriteRow(el) {\n\tvar t = this;\n\n\tt.slider = el.querySelector('[data-favorite-slider]');\n\tif ( t.slider && t.slider.childElementCount > 3 ) {\n\t\tvar slider = new Flickity( t.slider, {\n\t\t\tcellAlign: 'center',\n\t\t\tcontain: true,\n\t\t\tprevNextButtons: true,\n\t\t\tpageDots: false,\n\t\t\twrapAround: true,\n\t\t\tarrowShape: {\n\t\t\t\tx0: 10,\n\t\t\t\tx1: 55, y1: 50,\n\t\t\t\tx2: 55, y2: 45,\n\t\t\t\tx3: 15\n\t\t\t}\n\t\t});\n\t}\n}\n\nmodule.exports = FavoriteRow;\n","function Fields(el) {\n\tvar formSelects = Array.prototype.slice.call(el.querySelectorAll('.ginput_container_select'));\n\tif ( formSelects ) {\n\t\t// Create markup for select\n\t\tformSelects.forEach(function(elem) {\n\t\t\tvar formNativeSelect = elem.querySelector('select'),\n\t\t\t\tformOptionsSelect = formNativeSelect.querySelectorAll('option'),\n\t\t\t\tformPlaceholder = formNativeSelect.getAttribute('data-placeholder'),\n\t\t\t\tformListSelect,\n\t\t\t\tmarkupSelect,\n\t\t\t\tplaceholderField = '';\n\t\t\tformNativeSelect.setAttribute('data-field-mobile', '');\n\t\t\tformListSelect = '
';\n\t\t\tif( formPlaceholder ) {\n\t\t\t\tplaceholderField = '' + formPlaceholder + '';\n\t\t\t}\n\t\t\tmarkupSelect = '
' + placeholderField + '
' +\n\t\t\t\tformNativeSelect.outerHTML + '
' + formListSelect;\n\t\t\telem.innerHTML = markupSelect;\n\n\t\t\t// Select first item\n\t\t\tvar current = el.querySelector('[data-field-current]'),\n\t\t\t\t\tmobile = el.querySelector('[data-field-mobile]'),\n\t\t\t\t\tdesktop = el.querySelector('[data-field-desktop]');\n\n\t\t\tcurrent.innerHTML = mobile.querySelector('option').innerHTML;\n\t\t\tmobile.selectedIndex = 0;\n\t\t});\n\t}\n}\n\nmodule.exports = Fields;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction getUrlParameter(name) {\n\tname = name.replace(/[\\[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\n\tvar regex = new RegExp('[\\\\?&]' + name + '=([^&#]*)');\n\tvar results = regex.exec(window.location.href);\n\treturn results === null ? '' : decodeURIComponent(results[1].replace(/\\+/g, ' '));\n}\n\nfunction Filters(el) {\n\tvar t = this,\n\t\t\tcategory = getUrlParameter('category');\n\tt.$el = $(el);\n\tt.$filters = t.$el.find('[data-filter]');\n\tt.$active = t.$filters.filter('.filters__item--active');\n\tt.activeFilter = null;\n\tt.itemSelector = t.$el.data('item-selector');\n\tt.$items = false;\n\n\tif (t.itemSelector) {\n\t\tt.$items = $(t.$el.data('item-selector'));\n\t\tt.$subFilters = t.$items.find('[data-filter]');\n\t}\n\n\tif ( category ) {\n\t\tt.$category = t.$el.find('[data-filter=\"'+ category + '\"]');\n\t\tt.selectFilter(t.$category);\n\t} else {\n\t\tt.selectFilter(t.$filters.eq(0));\n\t}\n\n\tt.$filters.on('click', function(e) {\n\t\tvar $target = $(e.target);\n\n\t\tif ($target.hasClass('js-filters-button')) {\n\t\t $target = $target.closest('.js-filters-item');\n }\n\n\t\tt.selectFilter($target);\n\t});\n\n\tt.$subFilters.on('click', function(e) {\n\t\tvar $target = $(e.target);\n\n if ($target.hasClass('filters_button')) {\n $target = $target.closest('.filters_item');\n }\n\n\t\tt.selectFilter($target);\n\t});\n\n}\n\nFilters.prototype.selectFilter = function ($target) {\n\tvar t = this,\n\t\tselectedFilter = $target.data('filter');\n\n\tif (selectedFilter == t.activeFilter) {\n\t\treturn;\n\t}\n\n\tt.$active.removeClass('filters__item--active');\n\tt.$active.removeClass('bd-second-accent');\n\t// Find other targets, if possible\n\tvar $newTargets = $('[data-filter=\"' + selectedFilter + '\"]');\n\tif( $newTargets.length ) {\n\t\t$newTargets.addClass('filters__item--active');\n\t\t$newTargets.addClass('bd-second-accent');\n\t}\n\n\tif ( t.$items ) {\n\t\tt.$items.removeClass( 'js-filter-visible' );\n\t\tt.$items.filter( '[data-filter-type*=\"|' + selectedFilter + '|\"]' ).addClass( 'js-filter-visible' );\n\t}\n\n\tt.activeFilter = selectedFilter;\n\tt.$active = $newTargets;\n\n\tt.$el.trigger('change');\n\n\n};\n\nmodule.exports = Filters;\n","var DatePicker = require('modules/date-picker');\nvar DISABLE_CLASS = 'button--disabled';\n\nfunction formatDate(date) {\n\tvar month = date.getMonth() + 1;\n\tif (month < 10) {\n\t\tmonth = '0' + month;\n\t}\n\treturn date.getFullYear() + '-' + month + '-' + (date.getDate() < 10 ? '0' : '') + date.getDate();\n}\n\nfunction revertDate(date) {\n\treturn formatDate(date).replace(/-/g, '/');\n}\n\nfunction selectAll(selector, parent) {\n\treturn Array.prototype.slice.call(parent.querySelectorAll(selector));\n}\n\nfunction disableButton(button) {\n\tbutton.disabled = true;\n\tbutton.classList.add(DISABLE_CLASS);\n}\n\nfunction enableButton(button) {\n\tbutton.disabled = false;\n\tbutton.classList.remove(DISABLE_CLASS);\n}\n\nfunction Form(el) {\n\tvar t = this;\n\tvar datePickers = selectAll('.js-date-picker', el);\n\tvar forms = selectAll('form', el);\n\tvar buttons = selectAll('button, input[type=\"submit\"], a.button, .js-button', el);\n\tvar areFormsEnabled = true;\n\n\tvar reserveChangeCheckbox = selectAll('.js-reserve-change-checkbox', el);\n\tvar rewardsFormSubmit = selectAll('.js-rewards-form-submit', el);\n\tif (rewardsFormSubmit) {\n\t\trewardsFormSubmit.map(disableButton);\n\t}\n\n\tif (reserveChangeCheckbox) {\n\t\treserveChangeCheckbox.map(function (checkbox) {\n\t\t\tcheckbox.addEventListener('change', function(e) {\n\t\t\t\tif (e.target.checked) {\n\t\t\t\t\trewardsFormSubmit.map(enableButton);\n\t\t\t\t} else {\n\t\t\t\t\trewardsFormSubmit.map(disableButton);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tforms.map(function(form) {\n\t\tform.addEventListener('submit', function(e) {\n\t\t\tif (!areFormsEnabled) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tareFormsEnabled = false;\n\t\t\tbuttons.map(disableButton);\n\t\t});\n\t});\n\n\t// Enable Date Picker\n\tif( datePickers ) {\n\t\tdatePickers.forEach( function(elem) {\n\t\t\tvar args = {\n\t\t\t\tformat: formatDate\n\t\t\t};\n\t\t\tvar min = elem.getAttribute('data-min');\n\n\t\t\tif ( ! min ) {\n\t\t\t\tmin = new Date();\n\t\t\t\tvar offset = elem.getAttribute('data-offset') || 0;\n\t\t\t\tmin.setSeconds(min.getSeconds() + min.getTimezoneOffset() * 60 + parseInt(offset));\n\t\t\t\tmin = formatDate(min);\n\t\t\t} else {\n\t\t\t\tmin = min.replace('-', '/');\n\t\t\t}\n\t\t\targs.min = min;\n\t\t\targs.max = elem.getAttribute('data-max');\n\t\t\tif (args.max) {\n\t\t\t\targs.max = args.max.replace('-', '/');\n\t\t\t}\n\n\t\t\tvar unavailable = elem.getAttribute('data-unavailable');\n\n\t\t\tif (unavailable) {\n\t\t\t\tunavailable = unavailable.split(',');\n\t\t\t\targs.inRange = function(dt) {\n\t\t\t\t\treturn unavailable.indexOf(revertDate(dt)) === -1;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tt.calendar = new DatePicker(elem, args);\n });\n }\n}\n\nmodule.exports = Form;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction GravityForm(el) {\n\tvar $el = $(el);\n\tif ($el) {\n\t\tvar $gform_upload_custom = $el.find('.gform_upload_custom_rules');\n\t\tif ($gform_upload_custom) {\n\t\t\tvar $description_elm = $gform_upload_custom.find('div.gfield_description');\n\t\t\tvar $rules_text_elm = $gform_upload_custom.find('span.gform_fileupload_rules');\n\t\t\tif ($rules_text_elm && $description_elm && $description_elm.text() !== '') {\n\t\t\t\t$description_elm.hide();\n\t\t\t\t$rules_text_elm.append($description_elm.text());\n\t\t\t}\n\t\t}\n\t}\n}\n\nmodule.exports = GravityForm;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar throttle = require('lodash.throttle');\n\nfunction Header(el) {\n\tvar t = this;\n\n\tt.$el = $(el);\n\tt.headerHeight = 60;\n\tt.$document = $(document);\n\tt.$body = $('body');\n\tt.$html = $('html');\n\tt.$main = $('.main');\n\tt.$menu = t.$el.find('.header__menu');\n\tt.$toggle = t.$el.find('.js-nav-trigger');\n\tt.$menuItems = t.$el.find('.menu-item-has-children > a');\n\tt.$allMenuItems = t.$el.find('.menu-item > a');\n\tt.$activeMenuItems = t.$el.find('.current-menu-item');\n\tt.$searchIcon = t.$el.find('.js-search-enable');\n\tt.$searchCloseIcon = $('.js-search-disable');\n\tt.$window = $(window);\n\n\t// Update fixed header\n\tt.onTop();\n\tt.$document.on('scroll', throttle(t.onTop.bind(t), 200));\n\n\t// Toggle menu active in mobile\n\tif( t.$toggle.length ) {\n\t\tt.$toggle.on('click', function() {\n\t\t\tt.$html.toggleClass('js-menu-active');\n\t\t});\n\t}\n\n\t// Enable dropdown menu\n\tif( t.$menuItems.length ) {\n\t\tt.$menuItems.on('click', function(e) {\n\t\t\tvar $link = $(this);\n\n\t\t\tif (t.$window.width() <= 768) {\n\t\t\t\te.preventDefault();\n\t\t\t\t$link.parent().toggleClass('menu-item--open').siblings().removeClass('menu-item--open');\n\t\t\t}\n\t\t});\n\n\t\tt.$el.find('.menu-item-has-children ul li a').on('click', function() {\n\t\t\t$(this).closest('.menu-item-has-children').toggleClass('menu-item--open');\n\t\t\tvar $this = $(this),\n\t\t\thref = $this.attr('href'),\n\t\t\thash = href.substring(href.indexOf('#')+1);\n\t\t\tvar $page = t.$main.find('[name=\"' + hash + '\"]');\n\t\t\t$page[0].focus();\n\t\t});\n\n\t\t// Enable press space key to open submenu\n t.openSubmenu = function($parent) {\n var $link = $parent.find('> a');\n\n if ($parent.hasClass('menu-item-has-children')) {\n $link.attr('aria-expanded', 'true');\n $parent.addClass('menu-item--open');\n }\n };\n\n t.closeSubmenu = function($parent) {\n $parent.each(function($index, $item) {\n var $link = $($item).find('> a');\n if ($($item).hasClass('menu-item-has-children')) {\n $link.attr('aria-expanded', 'false');\n $($item).removeClass('menu-item--open');\n }\n });\n };\n\n t.toggleSubmenu = function($parent) {\n if ($parent.hasClass('menu-item--open')) {\n t.closeSubmenu($parent);\n } else {\n t.openSubmenu($parent);\n }\n };\n\n t.$allMenuItems.on('focus', function(e) {\n var $link = $(this);\n\n t.openSubmenu($link.parent());\n t.closeSubmenu($link.parent().siblings());\n });\n\n t.$allMenuItems.last().on('blur', function(e) {\n\t\t\tt.closeSubmenu(t.$el.find('.menu-item'));\n\t\t});\n\n $(document).on('click', function(e) {\n if (!t.$menu.is(e.target) && !t.$menu.has(e.target).length) {\n t.closeSubmenu(t.$el.find('.menu-item-has-children'));\n }\n });\n\t}\n\n\t// Remove active on same link if matching hash\n\tif( t.$activeMenuItems ) {\n\t\tvar link = t.$activeMenuItems.find('> a').attr('href'),\n\t\t\tchildren = t.$activeMenuItems.find('.menu-item a');\n\n\t\tif( link != undefined && children.length ) {\n\t\t\tchildren.each( function() {\n\t\t\t\tvar $this = $(this),\n\t\t\t\t\thref = $this.attr('href'),\n\t\t\t\t\thash = href.substring(href.indexOf('#')+1);\n\n\t\t\t\t// Add smooth scroll in current active page\n\t\t\t\tif( hash.length ) {\n\t\t\t\t\t$this.on('click', function(event) {\n\t\t\t\t\t\tvar $page = t.$main.find('[name=\"' + hash + '\"]');\n\t\t\t\t\t\tif( $page.length ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tt.smoothScroll($page);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\t// Enable search\n\tif( t.$searchIcon.length ) {\n\t\tt.$searchIcon.on('click', function() {\n\t\t\tt.$html.addClass('js-search-active').trigger('searchActive');\n\t\t});\n\t}\n\n\tt.$html.on('searchInactive', function() {\n t.$searchIcon.focus();\n });\n\n\t// Find location hash and smooth scroll\n\tif( window.location.hash ) {\n\t\t// Fragment exists\n\t\tvar $target = t.$main.find('[name=\"' + window.location.hash.slice(1) + '\"]');\n\t\tif( $target.length ) {\n\t\t\t$(window).load(function() {\n\t\t\t\tt.smoothScroll($target);\n\t\t\t});\n\t\t}\n\t}\n\n\t$(window).on('load', function () {\n\t\tvar hash = window.location.hash;\n\t\tif (hash !== '') {\n\t\t\tsetTimeout(function () {\n\t\t\t\tvar id = hash.replace('#', '');\n\t\t\t\tvar element = document.getElementById(id);\n\t\t\t\tif (element && element.scrollIntoView) {\n\t\t\t\t\telement.scrollIntoView();\n\t\t\t\t}\n\t\t\t}, 0);\n\t\t}\n\t});\n}\n\nHeader.prototype.smoothScroll = function(target) {\n\tvar t = this;\n\tvar offset = target.offset().top - parseFloat(t.$el.css('paddingTop')) - t.$menu.height() - 1;\n\t$('html, body').animate({\n\t\tscrollTop: offset\n\t}, 1000);\n\treturn false;\n};\n\nHeader.prototype.toggleFixedHeader = function(condition) {\n\tthis.$body.toggleClass('fixed-header', condition);\n};\n\nHeader.prototype.onTop = function() {\n\tvar t = this;\n\tt.toggleFixedHeader(t.$document.scrollTop() > t.$el.height());\n};\n\nmodule.exports = Header;\n","var Flickity = require('flickity');\n\nfunction HeroImage(el) {\n var t = this;\n\n t.slider = el.querySelector('.js-slider');\n\n if( t.slider && t.slider.childElementCount > 1 ) {\n var slider = new Flickity( t.slider, {\n cellAlign: 'center',\n contain: true,\n adaptiveHeight: true,\n prevNextButtons: false,\n pageDots: false,\n setGallerySize: true,\n autoPlay: 5000\n } );\n }\n\n}\n\nmodule.exports = HeroImage;","var Flickity = require('flickity');\nvar throttle = require('lodash.throttle');\n\nfunction HeroSlider(el) {\n var t = this;\n\n t.slider = el.querySelector('[data-slider]');\n t.slides = Array.prototype.slice.call(el.querySelectorAll('.hero-slider__item'));\n t.videos = Array.prototype.slice.call(el.querySelectorAll('.js-video'));\n\n if ( t.slider && t.slider.childElementCount > 1 ) {\n t.flickity = new Flickity( t.slider, {\n cellAlign: 'center',\n contain: true,\n adaptiveHeight: false,\n prevNextButtons: false,\n pageDots: true,\n\t\t\tresize: false,\n\t\t\t// Improve accessibility for slider\n\t\t\ton: {\n\t\t\t\tready: function() {\n\t\t\t\t\tconst sideLinks = this.viewport.querySelectorAll('.hero-slider__item a');\n\t\t\t\t\tconst sideSelectedLink = this.viewport.querySelector('.hero-slider__item.is-selected a');\n\t\t\t\t\tif (sideLinks.length > 0) {\n\t\t\t\t\t\tsideLinks.forEach(function(item) {\n\t\t\t\t\t\t\titem.setAttribute('tabindex', -1);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (sideSelectedLink) {\n\t\t\t\t\t\tsideSelectedLink.setAttribute('tabindex', 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.pageDots.dots.forEach(function(dot) {\n\t\t\t\t\t\tvar button = document.createElement('button');\n\t\t\t\t\t\tvar buttonText = dot.getAttribute('aria-label').replaceAll('Page', 'Slide');\n\t\t\t\t\t\tbutton.setAttribute('aria-label', buttonText);\n\t\t\t\t\t\tbutton.className = 'dot-button';\n\t\t\t\t\t\tdot.removeAttribute('aria-label');\n\n\t\t\t\t\t\tdot.appendChild(button);\n\n\t\t\t\t\t\tdot.addEventListener('click', function(e) {\n\t\t\t\t\t\t\tdot.click();\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tchange: function(index) {\n\t\t\t\t\tthis.viewport.querySelectorAll('.hero-slider__item a').forEach(function(item) {\n\t\t\t\t\t\titem.setAttribute('tabindex', -1);\n\t\t\t\t\t});\n\t\t\t\t\tthis.viewport.querySelector('.hero-slider__item.is-selected a').setAttribute('tabindex', 0);\n\t\t\t\t}\n\t\t\t}\n });\n\n t.setHeights();\n t.playVideo();\n\n window.addEventListener( 'resize', throttle(function() {\n \t\tt.setHeights(true);\n \t\tt.flickity.resize();\n \t\tt.setHeights();\n \t\tt.slider.removeAttr('tabindex');\n\t\t}, 100));\n\n\t\twindow.addEventListener( 'load', function () {\n\t\t\tt.slider.removeAttribute('tabindex');\n\t\t});\n }\n}\n\nHeroSlider.prototype.setHeights = function(reset) {\n\tvar t = this;\n\tt.slides.map( function( cell ) {\n\t\tif (reset) {\n\t\t\tcell.style.height = '';\n\t\t} else {\n\t\t\tcell.style.height = t.flickity.maxCellHeight + 'px';\n\t\t}\n\t} );\n};\n\nHeroSlider.prototype.playVideo = function() {\n\tvar t = this;\n\tif (t.videos.length && window.innerWidth >= 799) {\n\t if (typeof t.videos[0] !== 'undefined') {\n t.videos[0].play();\n }\n\n\t\tt.flickity.on( 'change', function() {\n\t\t\tt.videos.forEach( function(video) {\n\t\t\t\tvideo.pause();\n\t\t\t});\n\t\t\tt.videos[t.flickity.selectedIndex].play();\n\t\t});\n\t}\n};\n\nmodule.exports = HeroSlider;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction Intro(el) {\n\tvar urlFull = window.location.href;\n\tvar checkURLRedirect = urlFull && urlFull.includes('#id=');\n\tif ($(el) && $(el).hasClass('intro--reservation') && checkURLRedirect) {\n\t\tvar $secondaryBrandElm = $(el).find('.intro__header');\n\t\tif ($secondaryBrandElm && $secondaryBrandElm.hasClass('intro__header')) {\n\t\t\t$secondaryBrandElm.removeClass('intro__header');\n\t\t}\n\t}\n}\n\nmodule.exports = Intro;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null),\n\twp = (typeof window !== \"undefined\" ? window['wpVars'] : typeof global !== \"undefined\" ? global['wpVars'] : null);\n\nfunction LoadMorePosts( el ) {\n\tvar t = this;\n\tt.$el = $(el);\n\tt.pageNumber = 1;\n\t// Collect data\n\tt.$loadMoreButton = t.$el.find('.js-load-more-toggle');\n\tt.$excludePost = t.$el.data('exclude-post');\n\tt.$list = t.$el.find('.js-load-post');\n\tif( t.$loadMoreButton ) {\n\t\tt.$loadMoreButton.on(\"click\", function( e ) {\n\t\t\te.preventDefault();\n\t\t\tt.$loadMoreButton.attr( \"disabled\", true );\n\t\t\tt.loadPosts();\n\t\t});\n\t}\n}\n\nLoadMorePosts.prototype.loadPosts = function() {\n\tvar t = this;\n\tt.pageNumber++;\n\t$.ajax({\n\t\ttype: \"POST\",\n\t\tdataType: \"json\",\n\t\turl: wp.ajaxUrl,\n\t\tdata: {\n\t\t\tpageNumber: t.pageNumber,\n\t\t\texcludePost: t.$excludePost,\n\t\t\taction: 'load_post_ajax'\n\t\t},\n\t\tsuccess: function( data ) {\n\t\t\tif (! data.html) {\n\t\t\t\tconsole.log( 'An error occurred while getting post items. Please try again or contact site administrator.' );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tt.$loadMoreButton.attr( \"disabled\", false );\n\t\t\tt.$list.append( data.html ).fadeIn( 300 );\n\t\t\tif (! data.hasNextPage) {\n\t\t\t\tt.$loadMoreButton.hide();\n\t\t\t}\n\t\t},\n\t\terror : function() {\n\t\t\tconsole.log( 'An error occurred while getting post items. Please try again or contact site administrator.' );\n\t\t}\n\t});\n\treturn false;\n};\n\nmodule.exports = LoadMorePosts;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nvar PER_PAGE = 5;\n\nfunction LoadMore(el) {\n\tvar itemSelector, filterClass, filterSelector,\n\t\tt = this;\n\n\tt.$el = $(el);\n\tt.currentPage = 0;\n\n\tt.filterClass = t.$el.data('filter-class');\n\titemSelector = t.$el.data('item-selector');\n\tt.$allItems = $(itemSelector);\n\n\tt.update();\n\n\tt.$filters = $(t.$el.data('filters-selector'));\n\n\tt.$el.on('click', t.showItems.bind(t));\n\n\tt.$filters.on('change', t.update.bind(t));\n}\n\nLoadMore.prototype.showItems = function (e) {\n\tvar count,\n\t\tt = this;\n\tt.currentPage ++;\n\tcount = t.currentPage * PER_PAGE;\n\tvar $nextElement = t.$items.slice(0, count).prevObject.not('.js-load-more-visible').first();\n\tt.$items.slice(0, count).addClass('js-load-more-visible');\n\tif (count < t.$items.length) {\n\t\tt.$el.fadeIn(300);\n\t} else {\n\t\tt.$el.fadeOut(300);\n\t}\n\n\tif (e && e.type) {\n\t if ($nextElement.length) {\n\t\t\tsetTimeout(function () {\n\t\t\t\t\t$nextElement.find('a')[0].focus();\n\t\t\t}, 400);\n\t }\n\t}\n\n\treturn count;\n};\n\nLoadMore.prototype.update = function () {\n\tvar t = this;\n\tif (t.$items) {\n\t\tt.$items.removeClass('js-load-more-visible');\n\t}\n\n\tt.$items = t.$allItems.filter('.' + t.filterClass);\n\tt.currentPage = 0;\n\tt.showItems();\n};\n\nmodule.exports = LoadMore;\n","function Modal(el) {\n\tvar trigger,\n\t\ttriggerSelector = el.getAttribute('data-modal-trigger');\n\n\tel.addEventListener('click', function(e) {\n\t\tif (e.target === el) {\n\t\t\tel.classList.remove('js-active');\n\t\t}\n\t});\n\n\tif (! triggerSelector) {\n\t\treturn;\n\t}\n\n\ttrigger = document.querySelector(triggerSelector);\n\ttrigger.addEventListener('click', function() {\n\t\tel.classList.add('js-active');\n\t});\n}\n\nmodule.exports = Modal;\n","var Flickity = require('flickity'),\n\t$ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction MovieList(el) {\n\tvar t = this,\n\t\t$el = $(el),\n\t\t$size = $el.find(\".movie-list__list .js-movie-item\").size(),\n\t\t$start = 5,\n\t\t$loadMore = $el.find('.js-load-more'),\n\t\tcurrentSlide = Math.ceil($el.find('.js-current-date').index() / 5) - 1;\n\n\tt.slider = el.querySelector('[data-slider]');\n\tt.slideBreakpoint = 768;\n\n\tvar slider = new Flickity(t.slider, {\n\t\tcellAlign: 'left',\n\t\tcontain: true,\n\t\tadaptiveHeight: true,\n\t\tprevNextButtons: true,\n\t\tpageDots: false,\n\t\tsetGallerySize: true,\n\t\tgroupCells: $(window).width() > t.slideBreakpoint ? 5 : 2,\n\t\t// Improve accessibility for slider\n\t\ton: {\n\t\t\tready: function() {\n\t\t\t\t$(this.prevButton.element).insertBefore(this.viewport);\n\t\t\t\t$(this.viewport).find('.movie-list__nav-item a').attr('tabindex', '-1');\n\t\t\t\t$(this.viewport).find('.movie-list__nav-item.is-selected a').attr('tabindex', '0');\n\t\t\t},\n\t\t\tchange: function(index) {\n\t\t\t\t$(this.viewport).find('.movie-list__nav-item a').attr('tabindex', '-1');\n\t\t\t\t$(this.viewport).find('.movie-list__nav-item.is-selected a').attr('tabindex', '0');\n\t\t\t}\n\t\t}\n\t});\n\n\tslider.select(currentSlide);\n\n\t$el.find('.movie-list__list .js-movie-item:lt(' + $start + ')').addClass('movie-item--show');\n\t$loadMore.on('click', function () {\n\t\tif ($start + 5 < $size) {\n\t\t\t$start = $start + 5;\n\t\t} else {\n\t\t\t$start = $size;\n\t\t}\n\t\t$el.find('.movie-list__list .js-movie-item:lt(' + $start + ')').addClass('movie-item--show');\n\t\tif ( $start == $size ) {\n\t\t\t$loadMore.hide();\n\t\t}\n\t});\n}\n\nmodule.exports = MovieList;\n","function PromoPopup(el) {\n\t\tvar HIDDEN_CLASS = 'promo-popup__hidden';\n\t\tvar POPUP_OVERLAY_SELECTOR = '.js-promo-popup-overlay';\n\t\tvar BUTTON_CLOSE_POPUP_SELECTOR = '.js-promo-popup-close';\n\t\tvar SHOW_POPUP = false;\n\t\tvar POPUP_OPEN_TIME = null;\n\n\t\tvar checkPopupClosed = localStorage.getItem('closedPopup');\n\n\t\tif (checkPopupClosed) {\n\t\t\t\tel.classList.add(HIDDEN_CLASS);\n\t\t}\n\n\t\t// Delay 3 seconds because it's delayed in CSS\n\t\tsetTimeout(function () {\n\t\t\tSHOW_POPUP = checkPopupClosed === null;\n\t\t\tPOPUP_OPEN_TIME = new Date();\n\t\t}, 3000);\n\n\t\tvar closePromoPopup = function () {\n\t\t\tif (!SHOW_POPUP) { return false; }\n\t\t\t\tel.classList.add(HIDDEN_CLASS);\n\t\t\t\tlocalStorage.setItem('closedPopup', true);\n\t\t\t\tvar now = new Date();\n\t\t\t\tvar visibleTime = (now - POPUP_OPEN_TIME) / 1000;\n\t\t\t\tif (SHOW_POPUP && visibleTime) {\n\t\t\t\t\twindow.dataLayer = window.dataLayer || [];\n\t\t\t\t\twindow.dataLayer.push({'promo_popup_visible_time': visibleTime});\n\t\t\t\t}\n\t\t};\n\n\t\tvar popupOverlayElm = document.querySelector(POPUP_OVERLAY_SELECTOR);\n\n\t\tif (popupOverlayElm) {\n\t\t\t\tpopupOverlayElm.addEventListener('click', function () {\n\t\t\t\t\t\tclosePromoPopup();\n\t\t\t\t});\n\t\t}\n\n\t\tvar buttonClosePopup = document.querySelector(BUTTON_CLOSE_POPUP_SELECTOR);\n\t\tif (buttonClosePopup) {\n\t\t\t\tbuttonClosePopup.addEventListener('click', function () {\n\t\t\t\t\t\tclosePromoPopup();\n\t\t\t\t});\n\t\t}\n\n}\n\nmodule.exports = PromoPopup;\n","module.exports = function(el) {\n\tif (location.hash) {\n\t\tvar email = location.hash.replace('#', '');\n\t\treturn $.ajax({\n\t\t\ttype: 'GET',\n\t\t\turl: '/wp-json/crr/v1/queue/' + email,\n\t\t\tsuccess: function (res) {\n\t\t\t\tif (res && res.result) {\n\t\t\t\t\t$('body').addClass('is-queue');\n\t\t\t\t\t$('.js-email').text(email);\n\t\t\t\t\tif (res.result.first_name) {\n\t\t\t\t\t\t$('.js-first-name').text(res.result.first_name);\n\t\t\t\t\t}\n\t\t\t\t\tif (res.result.last_name) {\n\t\t\t\t\t\t$('.js-last-name').text(res.result.last_name);\n\t\t\t\t\t}\n\t\t\t\t\tif (res.result.wait_time){\n\t\t\t\t\t\t$('.js-wait').text(res.result.wait_time);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tdataType: 'json',\n\t\t\tasync: false\n\t\t});\n\t}\n};\n","var DatePicker = require('modules/date-picker');\nvar SelectField = require('modules/select-field');\n\nfunction Reserve(el) {\n var t = this,\n\t\t\tselectComponent;\n\n t.el = el;\n t.dateClose = JSON.parse( t.el.getAttribute('data-close') );\n t.dateOpen = JSON.parse( t.el.getAttribute('data-open') );\n t.dataInterval = t.el.getAttribute('data-intervals');\n\tt.input = document.querySelector('[data-inputpicker]');\n\tt.alreadyInit = false;\n\tt.HOUR_IN_MINS = 60;\n\n\tif( !t.dataInterval ) {\n\t\tt.dataInterval = 0.5;\n\t} else {\n\t\tt.dataInterval = t.dataInterval;\n\t}\n\n\tif( t.dateOpen ) {\n\t\tt.generateTimeList();\n\t}\n\n\t// Update Select Field components\n\tvar selectEls = Array.prototype.slice.call( el.querySelectorAll('.js-reserve-field') );\n\tif( selectEls ) {\n\t\tselectEls.forEach( function(selectEl) {\n\t\t\tselectComponent = new SelectField( selectEl );\n\t\t\tif (selectEl.classList.contains('js-time-field')) {\n\t\t\t\tt.timeSelectComponent = selectComponent;\n\t\t\t}\n\t\t});\n\t}\n\n\tif (t.input) {\n\t\tt.updateTimePicker();\n\t\tt.input.addEventListener('change', this.updateTimePicker.bind(this));\n\n\t\tt.datePicker = new DatePicker(t.input, {\n\t\t\t 'disabled': t.dateClose ? t.dateClose : []\n\t\t});\n\t}\n}\n\nReserve.prototype.updateTimePicker = function () {\n\tvar t = this;\n\tvar date = new Date(t.input.value);\n\tif ( date ) {\n\t\tt.changeTimeRange( date.getDay() );\n\t}\n};\n\nReserve.prototype.generateTimeList = function() {\n\tvar t = this;\n\tfor( var i = 0; i < t.dateOpen.length; i++ ) {\n\t\tvar time = t.dateOpen[i].time;\n\t\tif( time && time.start && time.end ) {\n\t\t\tvar timeStart = t.convertTime( time.start ),\n\t\t\t\ttimeEnd = t.convertTime( time.end ),\n\t\t\t\tintervals = parseFloat(t.dataInterval) * t.HOUR_IN_MINS;\n\n\t\t\tvar timeRange = t.getTimeRange(timeStart, timeEnd, intervals);\n\t\t\tt.dateOpen[i].items = timeRange;\n\t\t}\n\t}\n};\n\nReserve.prototype.convertTime = function(string) {\n\tvar t = this,\n\t\t\tarr = string.split(':'),\n\t\t\thour = parseInt(arr[0]) * t.HOUR_IN_MINS,\n\t\t\tminute = parseInt(arr[1]);\n\treturn hour + minute;\n};\n\nReserve.prototype.parseTime = function(number) {\n\tvar hour = Math.floor(number / 60),\n\t\t\toffset = 'am',\n\t\t\tminute = number % 60;\n\n\tif (hour % 12 === 0) {\n\t\toffset = hour / 12 === 1 ? 'pm' : 'am';\n\t\thour = 12;\n\t} else if (hour > 12) {\n\t\thour = hour % 12;\n\t\toffset = \"pm\";\n\t}\n\n\tif (hour < 10) {\n\t\thour = '0' + hour;\n\t}\n\n\tif (minute < 10) {\n\t\tminute = '0' + minute;\n\t}\n\n\treturn hour + ':' + minute + offset;\n};\n\nReserve.prototype.getTimeRange = function(start, end, interval) {\n\tvar t = this,\n\t\t\trange = [];\n\twhile( start <= end ) {\n\t\trange.push( t.parseTime(start) );\n\t\tstart += interval;\n\t}\n\treturn range;\n};\n\nReserve.prototype.getMatchingTimeRange = function(dayIndex) {\n\tvar t = this;\n\tfor( var i = 0; i < t.dateOpen.length; i++ ) {\n\t\tif( dayIndex === t.dateOpen[i].day ) {\n\t\t\treturn t.dateOpen[i].items;\n\t\t}\n\t}\n};\n\nReserve.prototype.generateSelectFieldDropdown = function(arr) {\n\tvar list = '';\n\tfor( var i = 0; i < arr.length; i++ ) {\n\t\tlist += '
  • ' + arr[i] + '
  • ';\n\t}\n\treturn list ;\n};\n\nReserve.prototype.generateSelectFieldNative = function(arr) {\n\tvar options = '';\n\tfor( var i = 0; i < arr.length; i++ ) {\n\t\toptions += '';\n\t}\n\treturn options;\n};\n\nReserve.prototype.changeTimeRange = function(dayIndex) {\n\tvar t = this,\n\t\ttimeRange = t.getMatchingTimeRange( dayIndex),\n\t\tdesktopList = t.generateSelectFieldDropdown(timeRange),\n\t\tmobileList = t.generateSelectFieldNative(timeRange),\n\t\ttimeField = t.el.querySelector('.js-time-field');\n\n\tif( timeField && timeRange ) {\n\t\t// Append new time range\n\t\ttimeField.querySelector('[data-field-desktop]').innerHTML = desktopList;\n\t\ttimeField.querySelector('[data-field-mobile]').innerHTML = mobileList;\n\n\t\tt.timeSelectComponent.selectFirstItem();\n\t}\n};\n\nmodule.exports = Reserve;\n","var SelectField = require('modules/select-field');\nvar TinyDatePicker = require('tiny-date-picker');\n\nfunction RewardsRegister(el) {\n\tvar t = this;\n\tt.el = el;\n\tt.dateField = t.el.querySelector('.js-date');\n\tt.timeSelect = null;\n\n\tif (! t.dateField) {\n\t\treturn;\n\t}\n\tt.timeField = t.el.querySelector('.js-time');\n\n\tif (! t.timeField) {\n\t\treturn;\n\t}\n\n\tt.timeFieldSelect = t.timeField.querySelector('[data-field-mobile]');\n\tt.timeFieldName = t.timeField.querySelector('[data-field-mobile]').name;\n\n\tt.populateTimeField();\n\n\tt.dateField.addEventListener('change', t.populateTimeField.bind(t));\n}\n\nRewardsRegister.prototype.populateTimeField = function () {\n\tvar t = this;\n\tvar date = t.dateField.value;\n\n\t$.ajax({\n\t\ttype: 'GET',\n\t\turl: '/wp-json/crr/v2/slots/' + date,\n\t\tsuccess: function(data) {\n\t\t\tt.timeField.innerHTML = '';\n\n\t\t\tif (data) {\n\t\t\t\tvar list = [];\n\t\t\t\tObject.keys(data.slots).map(function(time) {\n\t\t\t\t\tvar slot = data.slots[time];\n\t\t\t\t\tlist.push({\n\t\t\t\t\t\tvalue: time,\n\t\t\t\t\t\ttext: slot\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tt.generateFieldData( list, data.selected );\n\t\t\t}\n\t\t},\n\t\tdataType: 'json'\n\t});\n};\n\nRewardsRegister.prototype.generateBlankFields = function() {\n\tvar t = this;\n\tvar markup = document.createElement('div');\n\tmarkup.className = 'select-field';\n\tmarkup.innerHTML = '
    Time (Select date first)
    ';\n\tt.timeField.appendChild(markup);\n};\n\nRewardsRegister.prototype.generateFieldData = function( arr, selected ) {\n\tvar t = this;\n\n\tt.generateBlankFields();\n\tt.populateMobileFields( arr, t.timeField.querySelector('.select-field__mobile') );\n\tt.populateDesktopFields( arr, t.timeField.querySelector('.select-field__desktop') );\n\n\tvar selectFieldEl = t.timeField.querySelector('.select-field');\n\n\tif (t.timeSelect) {\n\t\tt.timeSelect.destroy();\n\t}\n\n\tt.timeSelect = new SelectField(selectFieldEl);\n\tif (selected) {\n\t\tt.timeSelect.fieldMobile.value = selected;\n\t}\n\n\tif (arr.length) {\n\t\tt.timeSelect.selectFirstItem();\n\t}\n};\n\nRewardsRegister.prototype.populateDesktopFields = function( arr, target) {\n\tvar t = this;\n\tvar list = document.createElement('ul');\n\tlist.className = 'caption c-secondary-brand select-field__dropdown';\n\tlist.setAttribute('data-field-desktop', '');\n\tarr.map( function( item ) {\n\t\tvar opt = document.createElement('li');\n\t\topt.setAttribute('data-value', item.value);\n\t\topt.textContent = item.text;\n\t\topt.className = 'select-field__dropdown-item';\n\t\tlist.appendChild(opt);\n\t});\n\ttarget.appendChild(list);\n};\n\nRewardsRegister.prototype.populateMobileFields = function( arr, target ) {\n\tvar t = this;\n\tvar select = document.createElement('select');\n\tselect.className = 'caption c-secondary-brand js-field-mobile';\n\tselect.setAttribute('data-field-mobile', '');\n\tselect.name = t.timeFieldName;\n\tselect.required = true;\n\tarr.map( function( item ) {\n\t\tvar opt = document.createElement('option');\n\t\topt.value = item.value;\n\t\topt.textContent = item.text;\n\t\tselect.appendChild(opt);\n\n\t});\n\ttarget.appendChild( select );\n};\n\nmodule.exports = RewardsRegister;\n","function RSVP(el) {\n\tvar t = this;\n\tt.el = el;\n\tt.body = document.body;\n\tt.content = el.querySelector('.js-rsvp-content');\n\tt.activeButton = document.querySelector('.js-rsvp-open');\n\tt.overlay = document.querySelector('.js-rsvp-overlay');\n\n\tif( t.activeButton ) {\n\t\tt.activeButton.addEventListener('click', function() {\n\t\t\tt.body.classList.add('js-rsvp-active');\n\t\t});\n\t}\n\n\tt.overlay.addEventListener('click', function() {\n\t\tt.body.classList.remove('js-rsvp-active');\n\t});\n\n}\nmodule.exports = RSVP;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar throttle = require('lodash.throttle');\n\nfunction SearchForm(el) {\n var t = this;\n\n t.$el = $(el);\n t.$document = $(document);\n t.$html = $('html');\n t.$closeIcon = t.$el.find('.js-search-disable');\n t.$input = t.$el.find('.js-search-form-input');\n\n // Focus to input if search form is active\n t.$html.on('searchActive', function() {\n t.$input.focus();\n });\n\n // Close modal on click to close icon or press escape\n t.$closeIcon.on('click', function() {\n t.close();\n });\n\n t.$document.on('keyup', function(e) {\n var key = e.which || e.keyCode;\n\n if (key === 27) {\n if (t.isOpen()) {\n t.close();\n e.stopPropagation();\n }\n }\n });\n\n\tvar search_message = $('.js-search-message');\n\n\tif (!search_message.length && $('.js-search-form')[0]) {\n\t\t$('.js-search-form')[0].focus();\n\t}\n}\n\nSearchForm.prototype.isOpen = function() {\n return this.$html.hasClass('js-search-active');\n};\n\nSearchForm.prototype.open = function() {\n this.$html.addClass('js-search-active').trigger('searchActive');\n};\n\nSearchForm.prototype.close = function() {\n this.$html.removeClass('js-search-active').trigger('searchInactive');\n};\n\nmodule.exports = SearchForm;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction SearchResults(el) {\n var $el = $(el);\n\n var resultsEmpty = $el.find('.js-search-results-empty');\n var resultsList = $el.find('.js-search-results-list');\n var buttonDidYouMean = $el.find('.js-did-you-mean');\n var searchBottom = $el.find('.js-search-bottom');\n\n var searchHeader = resultsList.find('.js-search-header');\n var searchFavoriteGroup = resultsList.find('.search-results__favorite-group');\n var cardSimple = resultsList.find('.card-simple');\n var search_message = $('.js-search-result');\n\n if (search_message.length && search_message[0]) {\n search_message[0].focus();\n }\n\n if (resultsList) {\n resultsEmpty.hide();\n }\n\n if (buttonDidYouMean.length > 0) {\n searchHeader.hide();\n searchBottom.hide();\n searchFavoriteGroup.hide();\n cardSimple.hide();\n resultsEmpty.show();\n }\n}\n\nmodule.exports = SearchResults;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar TinyDatePicker = require('tiny-date-picker');\n\nfunction SelectField(el) {\n\tvar t = this;\n\tt.el = el;\n\tt.$el = $(el);\n\tt.fieldMobile = t.el.querySelector('[data-field-mobile]');\n\tt.fieldDesktop = t.el.querySelector('[data-field-desktop]');\n\tt.fieldCurrent = t.el.querySelector('[data-field-current]');\n\n\tt.onClickActive = function () {\n\t\tif (!t.isActive()) {\n\t\t\tvar data = t.fieldMobile.value;\n\t\t\tvar activeItem = $(t.fieldDesktop).find('[data-value=\"' + data + '\"]');\n\t\t\t$(t.fieldDesktop).find('.select-field__dropdown-item').removeClass('active').removeAttr('id');\n\t\t\tactiveItem.addClass('active').attr('id', 'selected-option');\n\t\t}\n\n\t\tt.el.classList.toggle('select-field--active');\n\t};\n\n\tt.onSelectDesktop = function (e) {\n\t\tif (e.keyCode === 13 || !e.keyCode) {\n\t\t\tvar data = this.getAttribute('data-value');\n\t\t\tt.removeSelectActive();\n\t\t\tthis.classList.add('active');\n\t\t\tthis.setAttribute('id','selected-option');\n\t\t\tt.fieldCurrent.innerHTML = this.innerHTML;\n\t\t\tt.fieldMobile.value = data;\n\t\t\tif (t.callback) {\n\t\t\t\tt.callback(t.fieldMobile.value);\n\t\t\t}\n\t\t\tt.el.classList.remove('select-field--active');\n\t\t}\n\t};\n\n\tt.onSelectMobile = function () {\n\t\tvar data = this.value,\n\t\t\tcurrentItem = t.fieldMobile.querySelector('[value=\"' + data + '\"]');\n\t\tt.fieldCurrent.innerHTML = currentItem.innerHTML;\n\t\tt.removeSelectActive();\n\t\tt.fieldDesktop.querySelector('[data-value=\"' + data + '\"]').classList.add('active');\n\t\tif (t.callback) {\n\t\t\tt.callback(t.fieldMobile.value);\n\t\t}\n\t};\n\n\tt.onClickOutside = function (e) {\n\t\tif (!e.target.hasAttribute('data-field-current') && e.target != t.fieldMobile || e.target != t.fieldCurrent && e.target != t.fieldMobile) {\n\t\t\tt.el.classList.remove('select-field--active');\n\t\t}\n\t};\n\n\tt.keyboardHandlers = function (e) {\n\t\tvar key = e.which || e.keyCode,\n\t\t\tactiveItem, $activeItem, $prevItem, $nextItem, $dropdown, index, add;\n\n\t\tswitch (key) {\n\t\t\tcase (32 || 13): // space\n\t\t\t\tif (!t.isActive()) {\n\t\t\t\t\tt.onClickActive();\n\t\t\t\t} else {\n\t\t\t\t\tactiveItem = t.fieldDesktop.querySelector('.select-field__dropdown-item.active');\n\t\t\t\t\tt.onSelectDesktop.apply(activeItem);\n\t\t\t\t}\n\n\t\t\t\te.preventDefault();\n\n\t\t\t\tbreak;\n\t\t\tcase 27: // escape\n\t\t\t\tif (t.isActive()) {\n\t\t\t\t\tt.onClickActive();\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tcase 38: // up\n\t\t\t\tif (!t.isActive()) {\n\t\t\t\t\tt.onClickActive();\n\t\t\t\t} else {\n\t\t\t\t\t$activeItem = t.$el.find('.select-field__dropdown-item.active');\n\t\t\t\t\t$prevItem = $activeItem.prev();\n\n\t\t\t\t\tif ($prevItem.length) {\n\t\t\t\t\t\t$activeItem.removeClass('active').removeAttr('id');\n\t\t\t\t\t\t$prevItem.addClass('active').attr('id', 'selected-option');\n\n\t\t\t\t\t\t\t$dropdown = t.$el.find('.select-field__dropdown');\n\t\t\t\t\t\tindex = t.$el.find('.select-field__dropdown-item').index($prevItem);\n\t\t\t\t\t\tadd = ($prevItem.outerHeight(true) - $prevItem.outerHeight()) / 2 * index;\n\n\t\t\t\t\t\tif ($dropdown.scrollTop() > $prevItem.position().top + add) {\n\t\t\t\t\t\t\t$dropdown.scrollTop($prevItem.position().top + add);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\te.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase (40): // down\n\t\t\t\tif (!t.isActive()) {\n\t\t\t\t\tt.onClickActive();\n\t\t\t\t} else {\n\t\t\t\t\t$activeItem = t.$el.find('.select-field__dropdown-item.active');\n\t\t\t\t\t$nextItem = $activeItem.next();\n\n\t\t\t\t\tif ($nextItem.length) {\n\t\t\t\t\t\t$activeItem.removeClass('active').removeAttr('id');\n\t\t\t\t\t\t$nextItem.addClass('active').attr('id', 'selected-option');\n\n\t\t\t\t\t\t$dropdown = t.$el.find('.select-field__dropdown');\n\t\t\t\t\t\tindex = t.$el.find('.select-field__dropdown-item').index($nextItem);\n\t\t\t\t\t\tadd = ($nextItem.outerHeight(true) - $nextItem.outerHeight()) * index;\n\n\t\t\t\t\t\tif ($dropdown.height() < $nextItem.position().top + $nextItem.outerHeight(true) + add) {\n\t\t\t\t\t\t\t$dropdown.scrollTop($nextItem.position().top + $nextItem.outerHeight(true) + add - $dropdown.outerHeight(true));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\te.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase 13: // enter\n\t\t\t\tif (t.isActive()) {\n\t\t\t\t\tactiveItem = t.fieldDesktop.querySelector('.select-field__dropdown-item.active');\n\t\t\t\t\tt.onSelectDesktop.apply(activeItem);\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tif (t.fieldMobile && t.fieldDesktop && t.fieldCurrent) {\n\t\tt.dropdownItems = Array.prototype.slice.call(t.fieldDesktop.querySelectorAll('li'));\n\t\t// If not placeholder then select first item\n\t\tif (t.fieldCurrent.innerHTML === '') {\n\t\t\tt.selectFirstItem();\n\t\t}\n\n\t\t// Add active state to field group\n\t\tt.activeState();\n\n\t\t// Close Drop down when click outside\n\t\tt.clickOutside();\n\n\t\t// If select on desktop\n\t\tt.selectDesktop();\n\n\t\t// If select on mobile\n\t\tt.selectMobile();\n\n\t\t// Keyboard accessibility\n\t\tt.keyboardAccessible();\n\t}\n}\n\nSelectField.prototype.getName = function() {\n\treturn this.fieldMobile.name;\n};\n\nSelectField.prototype.selectFirstItem = function() {\n\tvar t = this,\n\t\tselectedItem = t.fieldDesktop.querySelector('li:first-child');\n\n\tif (t.fieldMobile.value) {\n\t\tselectedItem = t.fieldDesktop.querySelector('li[data-value=\"' + t.fieldMobile.value + '\"]');\n\t} else if (selectedItem) {\n\t\tt.fieldMobile.value = selectedItem.getAttribute('data-value');\n\t}\n\n\tif (selectedItem) {\n\t\tt.fieldCurrent.innerHTML = selectedItem.innerHTML;\n\t}\n};\n\nSelectField.prototype.activeState = function() {\n\tvar t = this;\n\tt.fieldCurrent.addEventListener('click', t.onClickActive);\n};\n\nSelectField.prototype.selectDesktop = function() {\n\tvar t = this;\n\tt.$el.on('click keydown', '.select-field__dropdown-item', t.onSelectDesktop);\n};\n\nSelectField.prototype.selectMobile = function() {\n\tvar t = this;\n\tt.fieldMobile.addEventListener('change', t.onSelectMobile);\n};\n\nSelectField.prototype.removeSelectActive = function() {\n\tvar t = this;\n\tt.dropdownItems.forEach(function (otherItem) {\n\t\totherItem.classList.remove('active');\n\t\totherItem.removeAttribute('id');\n\t});\n};\n\nSelectField.prototype.clickOutside = function() {\n\tvar t = this;\n\tdocument.addEventListener('click', t.onClickOutside);\n};\n\nSelectField.prototype.onChange = function(callback) {\n\tthis.callback = callback;\n};\n\nSelectField.prototype.isActive = function() {\n\treturn this.$el.hasClass('select-field--active');\n};\n\nSelectField.prototype.keyboardAccessible = function() {\n\tthis.fieldCurrent.addEventListener('keydown', this.keyboardHandlers);\n};\n\nSelectField.prototype.destroy = function () {\n\tvar t = this;\n\tt.fieldCurrent.removeEventListener('click', t.onClickActive);\n\tt.$el.off('click', '.select-field__dropdown-item', t.onSelectDesktop);\n\tt.fieldMobile.removeEventListener('change', t.onSelectMobile);\n\tdocument.removeEventListener('click', t.onClickOutside);\n\n\tt.el = null;\n\tt.$el = null;\n\tt.fieldMobile = null;\n\tt.fieldDesktop = null;\n\tt.fieldCurrent = null;\n\tt.callback = null;\n\tt.dropdownItems = null;\n};\n\nmodule.exports = SelectField;\n","function Sidebar(el) {\n var location = window.location.href;\n var url = new URL(location);\n var ref = url.searchParams.get('ref');\n\n if (ref === 'sidebar') {\n var main = document.querySelector('.blog-wrapper__main');\n\n if (main) {\n main.scrollIntoView();\n }\n }\n}\n\nmodule.exports = Sidebar;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null)\n\nfunction Subscribe (el) {\n\tvar formEl = $('.js-subscribe-form')\n\tvar msgEl = $('.js-subscribe-form-msg')\n\tvar inputEmail = el.querySelector('input[type=\"email\"]')\n\tvar inputFirstName = el.querySelector('input[name=\"first_name\"]')\n\tvar inputLastName = el.querySelector('input[name=\"last_name\"]')\n\tvar thankYouPage = el.dataset.thankYouPage\n\n\tformEl.on('submit', function (e) {\n\t\te.preventDefault()\n\n\t\tif (inputEmail.validity.typeMismatch || inputEmail.validity.valueMissing) {\n\t\t\tinputEmail.reportValidity()\n\t\t}\n\n\t\tif (inputFirstName.validity.typeMismatch || inputFirstName.validity.valueMissing) {\n\t\t\tinputFirstName.reportValidity()\n\t\t}\n\n\t\tif (inputLastName.validity.typeMismatch || inputLastName.validity.valueMissing) {\n\t\t\tinputLastName.reportValidity()\n\t\t}\n\n\t\tmsgEl.removeClass('is-error')\n\t\tmsgEl.removeClass('is-success')\n\n\t\tvar ajaxUrl = formEl.attr('action')\n\n\t\tif (inputEmail) {\n\t\t\t$.ajax({\n\t\t\t\ttype: 'POST',\n\t\t\t\theaders: {'Content-Type': 'application/x-www-form-urlencoded'},\n\t\t\t\tcontentType: 'application/x-www-form-urlencoded; charset=utf-8',\n\t\t\t\tdataType: 'json',\n\t\t\t\turl: ajaxUrl,\n\t\t\t\tdata: formEl.serialize(),\n\t\t\t\tsuccess: function (res) {\n\t\t\t\t\tif (res.code == 4001 || res.code == 4002 || res.code == 4400) {\n\t\t\t\t\t\tmsgEl.addClass('is-error')\n\t\t\t\t\t\tmsgEl.html(res.message)\n\t\t\t\t\t}\n\n\t\t\t\t\tif (res.success) {\n\t\t\t\t\t\tif (thankYouPage) {\n\t\t\t\t\t\t\tlocation.href = thankYouPage\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmsgEl.addClass('is-success')\n\t\t\t\t\t\t\tmsgEl.html('Subscribe success.')\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmsgEl.addClass('is-error')\n\t\t\t\t\t\tmsgEl.html(res.message)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn false\n\t\t}\n\t})\n}\n\nmodule.exports = Subscribe\n","function TextAnimation(el) {\n\tvar texts = $('.js-text-animation');\n\t$(texts).each(function(){\n\t\t$('.text-animation__message').append('' + $(this).text() + '');\n\t\t$(this).remove();\n\t});\n\tvar firstText = $('.text-animation__message-text--first').text();\n\tsetTimeout(function(){\n\t\t$('.text-animation__message-text--first').css('opacity', '0');\n\t}, 1500);\n\tsetTimeout(function(){\n\t\t$('.text-animation__message-text--first').remove();\n\t}, 2000);\n\t$('.text-animation__message').append('' + firstText + '');\n}\n\nmodule.exports = TextAnimation;\n","var TIMER_SELECTOR = '.js-timer';\nvar $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction Timer(el) {\n\tvar $el = $(el);\n\tvar $timer = $el.find(TIMER_SELECTOR);\n\tvar expire = $el.data('timer');\n\tvar interval = null\n\n\tif (expire) {\n\t\tinterval = setInterval(function() {\n\t\t\tvar now = Math.ceil(Date.now() / 1000);\n\t\t\tvar remaining = expire - now;\n\t\t\tvar seconds = remaining % 60;\n\t\t\tvar minutes = Math.floor(remaining / 60);\n\n\t\t\tif (seconds < 10) {\n\t\t\t\tseconds = '0' + seconds;\n\t\t\t}\n\n\t\t\tif ( minutes < 10) {\n\t\t\t\tminutes = '0' + minutes;\n\t\t\t}\n\n\t\t\t$timer.text(minutes + ':' + seconds);\n\n\t\t\tif (remaining <= 0) {\n\t\t\t\tclearInterval(interval);\n\t\t\t\tinterval = null;\n\t\t\t\twindow.location = window.location.href;\n\t\t\t}\n\t\t}, 1000);\n\t}\n}\n\nmodule.exports = Timer;\n","var shave = require('shave');\n\nfunction Truncate( el ) {\n\tvar maxHeight = el.getAttribute('data-max-height');\n\tvar maxHeightNumber = ( maxHeight ) ? maxHeight : 60;\n\tshave( el, maxHeightNumber );\n}\n\nmodule.exports = Truncate;\n","function TwoUpRows(el) {\n function inViewPort() {\n var rect = el.getBoundingClientRect();\n return ( rect.top - innerHeight < 0 ) && ( ( rect.top + rect.height ) > 0 );\n }\n window.addEventListener('scroll', function () {\n if( inViewPort() ) {\n el.classList.add('two-up-rows--animate');\n }\n })\n}\n\nmodule.exports = TwoUpRows;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction Video(el) {\n\tvar t = this;\n\tt.$el = $(el);\n\tt.$videoInner = t.$el.find('.js-video-inner');\n\tt.$video = t.$el.find('.js-video-modal-video iframe');\n\tt.$modal = t.$el.find('.js-video-modal');\n\tt.$iconClose = t.$el.find('.js-video-modal-close');\n\tt.$overlayClose = t.$el.find('.js-video-modal-overlay');\n\n\tt.$videoInner.on('click', function () {\n\t\tt.openModal();\n\t});\n\n\tt.$iconClose.on('click', function () {\n\t\tt.closeModal();\n\t});\n\n\tt.$overlayClose.on('click', function () {\n\t\tt.closeModal();\n\t});\n}\n\n\nVideo.prototype.openModal = function () {\n\tvar t = this;\n\tt.$modal.addClass('video-modal--active');\n};\n\nVideo.prototype.closeModal = function () {\n\tvar t = this;\n\tt.$modal.removeClass('video-modal--active');\n\tt.$video.attr('src', t.$video.attr('src'));\n};\n\nmodule.exports = Video;\n","/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n /*global define: false, module: false */\n 'use strict';\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.matchesSelector = factory();\n }\n\n}( window, function factory() {\n 'use strict';\n\n var matchesMethod = ( function() {\n var ElemProto = window.Element.prototype;\n // check for the standard method name first\n if ( ElemProto.matches ) {\n return 'matches';\n }\n // check un-prefixed\n if ( ElemProto.matchesSelector ) {\n return 'matchesSelector';\n }\n // check vendor prefixes\n var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n for ( var i=0; i < prefixes.length; i++ ) {\n var prefix = prefixes[i];\n var method = prefix + 'MatchesSelector';\n if ( ElemProto[ method ] ) {\n return method;\n }\n }\n })();\n\n return function matchesSelector( elem, selector ) {\n return elem[ matchesMethod ]( selector );\n };\n\n}));\n","/**\n * EvEmitter v1.1.0\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, window */\n if ( typeof define == 'function' && define.amd ) {\n // AMD - RequireJS\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory();\n } else {\n // Browser globals\n global.EvEmitter = factory();\n }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\"use strict\";\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // set events hash\n var events = this._events = this._events || {};\n // set listeners array\n var listeners = events[ eventName ] = events[ eventName ] || [];\n // only add once\n if ( listeners.indexOf( listener ) == -1 ) {\n listeners.push( listener );\n }\n\n return this;\n};\n\nproto.once = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // add event\n this.on( eventName, listener );\n // set once flag\n // set onceEvents hash\n var onceEvents = this._onceEvents = this._onceEvents || {};\n // set onceListeners object\n var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n // set flag\n onceListeners[ listener ] = true;\n\n return this;\n};\n\nproto.off = function( eventName, listener ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n var index = listeners.indexOf( listener );\n if ( index != -1 ) {\n listeners.splice( index, 1 );\n }\n\n return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n // copy over to avoid interference if .off() in listener\n listeners = listeners.slice(0);\n args = args || [];\n // once stuff\n var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n for ( var i=0; i < listeners.length; i++ ) {\n var listener = listeners[i]\n var isOnce = onceListeners && onceListeners[ listener ];\n if ( isOnce ) {\n // remove listener\n // remove before trigger to prevent recursion\n this.off( eventName, listener );\n // unset once flag\n delete onceListeners[ listener ];\n }\n // trigger listener\n listener.apply( this, args );\n }\n\n return this;\n};\n\nproto.allOff = function() {\n delete this._events;\n delete this._onceEvents;\n};\n\nreturn EvEmitter;\n\n}));\n","/**\n * Fizzy UI utils v2.0.7\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'desandro-matches-selector/matches-selector'\n ], function( matchesSelector ) {\n return factory( window, matchesSelector );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('desandro-matches-selector')\n );\n } else {\n // browser global\n window.fizzyUIUtils = factory(\n window,\n window.matchesSelector\n );\n }\n\n}( window, function factory( window, matchesSelector ) {\n\n'use strict';\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n for ( var prop in b ) {\n a[ prop ] = b[ prop ];\n }\n return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n if ( Array.isArray( obj ) ) {\n // use object if already an array\n return obj;\n }\n // return empty array if undefined or null. #6\n if ( obj === null || obj === undefined ) {\n return [];\n }\n\n var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n if ( isArrayLike ) {\n // convert nodeList to array\n return arraySlice.call( obj );\n }\n\n // array of single index\n return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n var index = ary.indexOf( obj );\n if ( index != -1 ) {\n ary.splice( index, 1 );\n }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n while ( elem.parentNode && elem != document.body ) {\n elem = elem.parentNode;\n if ( matchesSelector( elem, selector ) ) {\n return elem;\n }\n }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n if ( typeof elem == 'string' ) {\n return document.querySelector( elem );\n }\n return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n // make array of elems\n elems = utils.makeArray( elems );\n var ffElems = [];\n\n elems.forEach( function( elem ) {\n // check that elem is an actual element\n if ( !( elem instanceof HTMLElement ) ) {\n return;\n }\n // add elem if no selector\n if ( !selector ) {\n ffElems.push( elem );\n return;\n }\n // filter & find items if we have a selector\n // filter\n if ( matchesSelector( elem, selector ) ) {\n ffElems.push( elem );\n }\n // find children\n var childElems = elem.querySelectorAll( selector );\n // concat childElems to filterFound array\n for ( var i=0; i < childElems.length; i++ ) {\n ffElems.push( childElems[i] );\n }\n });\n\n return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n threshold = threshold || 100;\n // original method\n var method = _class.prototype[ methodName ];\n var timeoutName = methodName + 'Timeout';\n\n _class.prototype[ methodName ] = function() {\n var timeout = this[ timeoutName ];\n clearTimeout( timeout );\n\n var args = arguments;\n var _this = this;\n this[ timeoutName ] = setTimeout( function() {\n method.apply( _this, args );\n delete _this[ timeoutName ];\n }, threshold );\n };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n var readyState = document.readyState;\n if ( readyState == 'complete' || readyState == 'interactive' ) {\n // do async to allow for other scripts to run. metafizzy/flickity#441\n setTimeout( callback );\n } else {\n document.addEventListener( 'DOMContentLoaded', callback );\n }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n return $1 + '-' + $2;\n }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n utils.docReady( function() {\n var dashedNamespace = utils.toDashed( namespace );\n var dataAttr = 'data-' + dashedNamespace;\n var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n var elems = utils.makeArray( dataAttrElems )\n .concat( utils.makeArray( jsDashElems ) );\n var dataOptionsAttr = dataAttr + '-options';\n var jQuery = window.jQuery;\n\n elems.forEach( function( elem ) {\n var attr = elem.getAttribute( dataAttr ) ||\n elem.getAttribute( dataOptionsAttr );\n var options;\n try {\n options = attr && JSON.parse( attr );\n } catch ( error ) {\n // log error, do not initialize\n if ( console ) {\n console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n ': ' + error );\n }\n return;\n }\n // initialize\n var instance = new WidgetClass( elem, options );\n // make available via $().data('namespace')\n if ( jQuery ) {\n jQuery.data( elem, namespace, instance );\n }\n });\n\n });\n};\n\n// ----- ----- //\n\nreturn utils;\n\n}));\n","// add, remove cell\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, utils ) {\n return factory( window, Flickity, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, utils ) {\n\n'use strict';\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n var fragment = document.createDocumentFragment();\n cells.forEach( function( cell ) {\n fragment.appendChild( cell.element );\n });\n return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nvar proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {Element, Array, NodeList} elems\n * @param {Integer} index\n */\nproto.insert = function( elems, index ) {\n var cells = this._makeCells( elems );\n if ( !cells || !cells.length ) {\n return;\n }\n var len = this.cells.length;\n // default to append\n index = index === undefined ? len : index;\n // add cells with document fragment\n var fragment = getCellsFragment( cells );\n // append to slider\n var isAppend = index == len;\n if ( isAppend ) {\n this.slider.appendChild( fragment );\n } else {\n var insertCellElement = this.cells[ index ].element;\n this.slider.insertBefore( fragment, insertCellElement );\n }\n // add to this.cells\n if ( index === 0 ) {\n // prepend, add to start\n this.cells = cells.concat( this.cells );\n } else if ( isAppend ) {\n // append, add to end\n this.cells = this.cells.concat( cells );\n } else {\n // insert in this.cells\n var endCells = this.cells.splice( index, len - index );\n this.cells = this.cells.concat( cells ).concat( endCells );\n }\n\n this._sizeCells( cells );\n this.cellChange( index, true );\n};\n\nproto.append = function( elems ) {\n this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {Element, Array, NodeList} elems\n */\nproto.remove = function( elems ) {\n var cells = this.getCells( elems );\n if ( !cells || !cells.length ) {\n return;\n }\n\n var minCellIndex = this.cells.length - 1;\n // remove cells from collection & DOM\n cells.forEach( function( cell ) {\n cell.remove();\n var index = this.cells.indexOf( cell );\n minCellIndex = Math.min( index, minCellIndex );\n utils.removeFrom( this.cells, cell );\n }, this );\n\n this.cellChange( minCellIndex, true );\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n var cell = this.getCell( elem );\n if ( !cell ) {\n return;\n }\n cell.getSize();\n\n var index = this.cells.indexOf( cell );\n this.cellChange( index );\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n */\nproto.cellChange = function( changedCellIndex, isPositioningSlider ) {\n var prevSelectedElem = this.selectedElement;\n this._positionCells( changedCellIndex );\n this._getWrapShiftCells();\n this.setGallerySize();\n // update selectedIndex\n // try to maintain position & select previous selected element\n var cell = this.getCell( prevSelectedElem );\n if ( cell ) {\n this.selectedIndex = this.getCellSlideIndex( cell );\n }\n this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n this.emitEvent( 'cellChange', [ changedCellIndex ] );\n // position slider\n this.select( this.selectedIndex );\n // do not position slider after lazy load\n if ( isPositioningSlider ) {\n this.positionSliderAtSelected();\n }\n};\n\n// ----- ----- //\n\nreturn Flickity;\n\n}));\n","// animate\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'fizzy-ui-utils/utils'\n ], function( utils ) {\n return factory( window, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.animatePrototype = factory(\n window,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, utils ) {\n\n'use strict';\n\n// -------------------------- animate -------------------------- //\n\nvar proto = {};\n\nproto.startAnimation = function() {\n if ( this.isAnimating ) {\n return;\n }\n\n this.isAnimating = true;\n this.restingFrames = 0;\n this.animate();\n};\n\nproto.animate = function() {\n this.applyDragForce();\n this.applySelectedAttraction();\n\n var previousX = this.x;\n\n this.integratePhysics();\n this.positionSlider();\n this.settle( previousX );\n // animate next frame\n if ( this.isAnimating ) {\n var _this = this;\n requestAnimationFrame( function animateFrame() {\n _this.animate();\n });\n }\n};\n\nproto.positionSlider = function() {\n var x = this.x;\n // wrap position around\n if ( this.options.wrapAround && this.cells.length > 1 ) {\n x = utils.modulo( x, this.slideableWidth );\n x = x - this.slideableWidth;\n this.shiftWrapCells( x );\n }\n\n this.setTranslateX( x, this.isAnimating );\n this.dispatchScrollEvent();\n};\n\nproto.setTranslateX = function( x, is3d ) {\n x += this.cursorPosition;\n // reverse if right-to-left and using transform\n x = this.options.rightToLeft ? -x : x;\n var translateX = this.getPositionValue( x );\n // use 3D tranforms for hardware acceleration on iOS\n // but use 2D when settled, for better font-rendering\n this.slider.style.transform = is3d ?\n 'translate3d(' + translateX + ',0,0)' : 'translateX(' + translateX + ')';\n};\n\nproto.dispatchScrollEvent = function() {\n var firstSlide = this.slides[0];\n if ( !firstSlide ) {\n return;\n }\n var positionX = -this.x - firstSlide.target;\n var progress = positionX / this.slidesWidth;\n this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n};\n\nproto.positionSliderAtSelected = function() {\n if ( !this.cells.length ) {\n return;\n }\n this.x = -this.selectedSlide.target;\n this.velocity = 0; // stop wobble\n this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n if ( this.options.percentPosition ) {\n // percent position, round to 2 digits, like 12.34%\n return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 )+ '%';\n } else {\n // pixel positioning\n return Math.round( position ) + 'px';\n }\n};\n\nproto.settle = function( previousX ) {\n // keep track of frames where x hasn't moved\n if ( !this.isPointerDown && Math.round( this.x * 100 ) == Math.round( previousX * 100 ) ) {\n this.restingFrames++;\n }\n // stop animating if resting for 3 or more frames\n if ( this.restingFrames > 2 ) {\n this.isAnimating = false;\n delete this.isFreeScrolling;\n // render position with translateX when settled\n this.positionSlider();\n this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n }\n};\n\nproto.shiftWrapCells = function( x ) {\n // shift before cells\n var beforeGap = this.cursorPosition + x;\n this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n // shift after cells\n var afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n for ( var i=0; i < cells.length; i++ ) {\n var cell = cells[i];\n var cellShift = gap > 0 ? shift : 0;\n cell.wrapShift( cellShift );\n gap -= cell.size.outerWidth;\n }\n};\n\nproto._unshiftCells = function( cells ) {\n if ( !cells || !cells.length ) {\n return;\n }\n for ( var i=0; i < cells.length; i++ ) {\n cells[i].wrapShift( 0 );\n }\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n this.x += this.velocity;\n this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n // my thanks to Steven Wittens, who simplified this math greatly\n return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n if ( !this.isDraggable || !this.isPointerDown ) {\n return;\n }\n // change the position to drag position by applying force\n var dragVelocity = this.dragX - this.x;\n var dragForce = dragVelocity - this.velocity;\n this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n // do not attract if pointer down or no slides\n var dragDown = this.isDraggable && this.isPointerDown;\n if ( dragDown || this.isFreeScrolling || !this.slides.length ) {\n return;\n }\n var distance = this.selectedSlide.target * -1 - this.x;\n var force = distance * this.options.selectedAttraction;\n this.applyForce( force );\n};\n\nreturn proto;\n\n}));\n","// Flickity.Cell\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'get-size/get-size'\n ], function( getSize ) {\n return factory( window, getSize );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('get-size')\n );\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.Cell = factory(\n window,\n window.getSize\n );\n }\n\n}( window, function factory( window, getSize ) {\n\n'use strict';\n\nfunction Cell( elem, parent ) {\n this.element = elem;\n this.parent = parent;\n\n this.create();\n}\n\nvar proto = Cell.prototype;\n\nproto.create = function() {\n this.element.style.position = 'absolute';\n this.element.setAttribute( 'aria-hidden', 'true' );\n this.x = 0;\n this.shift = 0;\n};\n\nproto.destroy = function() {\n // reset style\n this.unselect();\n this.element.style.position = '';\n var side = this.parent.originSide;\n this.element.style[ side ] = '';\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\nproto.setPosition = function( x ) {\n this.x = x;\n this.updateTarget();\n this.renderPosition( x );\n};\n\n// setDefaultTarget v1 method, backwards compatibility, remove in v3\nproto.updateTarget = proto.setDefaultTarget = function() {\n var marginProperty = this.parent.originSide == 'left' ? 'marginLeft' : 'marginRight';\n this.target = this.x + this.size[ marginProperty ] +\n this.size.width * this.parent.cellAlign;\n};\n\nproto.renderPosition = function( x ) {\n // render position of cell with in slider\n var side = this.parent.originSide;\n this.element.style[ side ] = this.parent.getPositionValue( x );\n};\n\nproto.select = function() {\n this.element.classList.add('is-selected');\n this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n this.element.classList.remove('is-selected');\n this.element.setAttribute( 'aria-hidden', 'true' );\n};\n\n/**\n * @param {Integer} factor - 0, 1, or -1\n**/\nproto.wrapShift = function( shift ) {\n this.shift = shift;\n this.renderPosition( this.x + this.parent.slideableWidth * shift );\n};\n\nproto.remove = function() {\n this.element.parentNode.removeChild( this.element );\n};\n\nreturn Cell;\n\n}));\n","// drag\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'unidragger/unidragger',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, Unidragger, utils ) {\n return factory( window, Flickity, Unidragger, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('unidragger'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n window.Flickity = factory(\n window,\n window.Flickity,\n window.Unidragger,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, Unidragger, utils ) {\n\n'use strict';\n\n// ----- defaults ----- //\n\nutils.extend( Flickity.defaults, {\n draggable: '>1',\n dragThreshold: 3,\n});\n\n// ----- create ----- //\n\nFlickity.createMethods.push('_createDrag');\n\n// -------------------------- drag prototype -------------------------- //\n\nvar proto = Flickity.prototype;\nutils.extend( proto, Unidragger.prototype );\nproto._touchActionValue = 'pan-y';\n\n// -------------------------- -------------------------- //\n\nvar isTouch = 'createTouch' in document;\nvar isTouchmoveScrollCanceled = false;\n\nproto._createDrag = function() {\n this.on( 'activate', this.onActivateDrag );\n this.on( 'uiChange', this._uiChangeDrag );\n this.on( 'deactivate', this.onDeactivateDrag );\n this.on( 'cellChange', this.updateDraggable );\n // TODO updateDraggable on resize? if groupCells & slides change\n // HACK - add seemingly innocuous handler to fix iOS 10 scroll behavior\n // #457, RubaXa/Sortable#973\n if ( isTouch && !isTouchmoveScrollCanceled ) {\n window.addEventListener( 'touchmove', function() {});\n isTouchmoveScrollCanceled = true;\n }\n};\n\nproto.onActivateDrag = function() {\n this.handles = [ this.viewport ];\n this.bindHandles();\n this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n this.unbindHandles();\n this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n // disable dragging if less than 2 slides. #278\n if ( this.options.draggable == '>1' ) {\n this.isDraggable = this.slides.length > 1;\n } else {\n this.isDraggable = this.options.draggable;\n }\n if ( this.isDraggable ) {\n this.element.classList.add('is-draggable');\n } else {\n this.element.classList.remove('is-draggable');\n }\n};\n\n// backwards compatibility\nproto.bindDrag = function() {\n this.options.draggable = true;\n this.updateDraggable();\n};\n\nproto.unbindDrag = function() {\n this.options.draggable = false;\n this.updateDraggable();\n};\n\nproto._uiChangeDrag = function() {\n delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.pointerDown = function( event, pointer ) {\n if ( !this.isDraggable ) {\n this._pointerDownDefault( event, pointer );\n return;\n }\n var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n\n this._pointerDownPreventDefault( event );\n this.pointerDownFocus( event );\n // blur\n if ( document.activeElement != this.element ) {\n // do not blur if already focused\n this.pointerDownBlur();\n }\n\n // stop if it was moving\n this.dragX = this.x;\n this.viewport.classList.add('is-pointer-down');\n // track scrolling\n this.pointerDownScroll = getScrollPosition();\n window.addEventListener( 'scroll', this );\n\n this._pointerDownDefault( event, pointer );\n};\n\n// default pointerDown logic, used for staticClick\nproto._pointerDownDefault = function( event, pointer ) {\n // track start event position\n // Safari 9 overrides pageX and pageY. These values needs to be copied. #779\n this.pointerDownPointer = {\n pageX: pointer.pageX,\n pageY: pointer.pageY,\n };\n // bind move and end events\n this._bindPostStartEvents( event );\n this.dispatchEvent( 'pointerDown', event, [ pointer ] );\n};\n\nvar focusNodes = {\n INPUT: true,\n TEXTAREA: true,\n SELECT: true,\n};\n\nproto.pointerDownFocus = function( event ) {\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isFocusNode ) {\n this.focus();\n }\n};\n\nproto._pointerDownPreventDefault = function( event ) {\n var isTouchStart = event.type == 'touchstart';\n var isTouchPointer = event.pointerType == 'touch';\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isTouchStart && !isTouchPointer && !isFocusNode ) {\n event.preventDefault();\n }\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.pointerUp = function( event, pointer ) {\n delete this.isTouchScrolling;\n this.viewport.classList.remove('is-pointer-down');\n this.dispatchEvent( 'pointerUp', event, [ pointer ] );\n this._dragPointerUp( event, pointer );\n};\n\nproto.pointerDone = function() {\n window.removeEventListener( 'scroll', this );\n delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.dragStart = function( event, pointer ) {\n if ( !this.isDraggable ) {\n return;\n }\n this.dragStartPosition = this.x;\n this.startAnimation();\n window.removeEventListener( 'scroll', this );\n this.dispatchEvent( 'dragStart', event, [ pointer ] );\n};\n\nproto.pointerMove = function( event, pointer ) {\n var moveVector = this._dragPointerMove( event, pointer );\n this.dispatchEvent( 'pointerMove', event, [ pointer, moveVector ] );\n this._dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n if ( !this.isDraggable ) {\n return;\n }\n event.preventDefault();\n\n this.previousDragX = this.dragX;\n // reverse if right-to-left\n var direction = this.options.rightToLeft ? -1 : 1;\n if ( this.options.wrapAround ) {\n // wrap around move. #589\n moveVector.x = moveVector.x % this.slideableWidth;\n }\n var dragX = this.dragStartPosition + moveVector.x * direction;\n\n if ( !this.options.wrapAround && this.slides.length ) {\n // slow drag\n var originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n var endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n }\n\n this.dragX = dragX;\n\n this.dragMoveTime = new Date();\n this.dispatchEvent( 'dragMove', event, [ pointer, moveVector ] );\n};\n\nproto.dragEnd = function( event, pointer ) {\n if ( !this.isDraggable ) {\n return;\n }\n if ( this.options.freeScroll ) {\n this.isFreeScrolling = true;\n }\n // set selectedIndex based on where flick will end up\n var index = this.dragEndRestingSelect();\n\n if ( this.options.freeScroll && !this.options.wrapAround ) {\n // if free-scroll & not wrap around\n // do not free-scroll if going outside of bounding slides\n // so bounding slides can attract slider, and keep it in bounds\n var restingX = this.getRestingPosition();\n this.isFreeScrolling = -restingX > this.slides[0].target &&\n -restingX < this.getLastSlide().target;\n } else if ( !this.options.freeScroll && index == this.selectedIndex ) {\n // boost selection if selected index has not changed\n index += this.dragEndBoostSelect();\n }\n delete this.previousDragX;\n // apply selection\n // TODO refactor this, selecting here feels weird\n // HACK, set flag so dragging stays in correct direction\n this.isDragSelect = this.options.wrapAround;\n this.select( index );\n delete this.isDragSelect;\n this.dispatchEvent( 'dragEnd', event, [ pointer ] );\n};\n\nproto.dragEndRestingSelect = function() {\n var restingX = this.getRestingPosition();\n // how far away from selected slide\n var distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n // get closet resting going up and going down\n var positiveResting = this._getClosestResting( restingX, distance, 1 );\n var negativeResting = this._getClosestResting( restingX, distance, -1 );\n // use closer resting for wrap-around\n var index = positiveResting.distance < negativeResting.distance ?\n positiveResting.index : negativeResting.index;\n return index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n var index = this.selectedIndex;\n var minDistance = Infinity;\n var condition = this.options.contain && !this.options.wrapAround ?\n // if contain, keep going if distance is equal to minDistance\n function( d, md ) { return d <= md; } : function( d, md ) { return d < md; };\n while ( condition( distance, minDistance ) ) {\n // measure distance to next cell\n index += increment;\n minDistance = distance;\n distance = this.getSlideDistance( -restingX, index );\n if ( distance === null ) {\n break;\n }\n distance = Math.abs( distance );\n }\n return {\n distance: minDistance,\n // selected was previous index\n index: index - increment\n };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x\n * @param {Integer} index - slide index\n */\nproto.getSlideDistance = function( x, index ) {\n var len = this.slides.length;\n // wrap around if at least 2 slides\n var isWrapAround = this.options.wrapAround && len > 1;\n var slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n var slide = this.slides[ slideIndex ];\n if ( !slide ) {\n return null;\n }\n // add distance for wrap-around slides\n var wrap = isWrapAround ? this.slideableWidth * Math.floor( index / len ) : 0;\n return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n // do not boost if no previousDragX or dragMoveTime\n if ( this.previousDragX === undefined || !this.dragMoveTime ||\n // or if drag was held for 100 ms\n new Date() - this.dragMoveTime > 100 ) {\n return 0;\n }\n\n var distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n var delta = this.previousDragX - this.dragX;\n if ( distance > 0 && delta > 0 ) {\n // boost to next if moving towards the right, and positive velocity\n return 1;\n } else if ( distance < 0 && delta < 0 ) {\n // boost to previous if moving towards the left, and negative velocity\n return -1;\n }\n return 0;\n};\n\n// ----- staticClick ----- //\n\nproto.staticClick = function( event, pointer ) {\n // get clickedCell, if cell was clicked\n var clickedCell = this.getParentCell( event.target );\n var cellElem = clickedCell && clickedCell.element;\n var cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n this.dispatchEvent( 'staticClick', event, [ pointer, cellElem, cellIndex ] );\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n var scroll = getScrollPosition();\n var scrollMoveX = this.pointerDownScroll.x - scroll.x;\n var scrollMoveY = this.pointerDownScroll.y - scroll.y;\n // cancel click/tap if scroll is too much\n if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n this._pointerDone();\n }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n return {\n x: window.pageXOffset,\n y: window.pageYOffset\n };\n}\n\n// ----- ----- //\n\nreturn Flickity;\n\n}));\n","// Flickity main\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'ev-emitter/ev-emitter',\n 'get-size/get-size',\n 'fizzy-ui-utils/utils',\n './cell',\n './slide',\n './animate'\n ], function( EvEmitter, getSize, utils, Cell, Slide, animatePrototype ) {\n return factory( window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('ev-emitter'),\n require('get-size'),\n require('fizzy-ui-utils'),\n require('./cell'),\n require('./slide'),\n require('./animate')\n );\n } else {\n // browser global\n var _Flickity = window.Flickity;\n\n window.Flickity = factory(\n window,\n window.EvEmitter,\n window.getSize,\n window.fizzyUIUtils,\n _Flickity.Cell,\n _Flickity.Slide,\n _Flickity.animatePrototype\n );\n }\n\n}( window, function factory( window, EvEmitter, getSize,\n utils, Cell, Slide, animatePrototype ) {\n\n'use strict';\n\n// vars\nvar jQuery = window.jQuery;\nvar getComputedStyle = window.getComputedStyle;\nvar console = window.console;\n\nfunction moveElements( elems, toElem ) {\n elems = utils.makeArray( elems );\n while ( elems.length ) {\n toElem.appendChild( elems.shift() );\n }\n}\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Flickity intances\nvar instances = {};\n\nfunction Flickity( element, options ) {\n var queryElement = utils.getQueryElement( element );\n if ( !queryElement ) {\n if ( console ) {\n console.error( 'Bad element for Flickity: ' + ( queryElement || element ) );\n }\n return;\n }\n this.element = queryElement;\n // do not initialize twice on same element\n if ( this.element.flickityGUID ) {\n var instance = instances[ this.element.flickityGUID ];\n instance.option( options );\n return instance;\n }\n\n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n // options\n this.options = utils.extend( {}, this.constructor.defaults );\n this.option( options );\n\n // kick things off\n this._create();\n}\n\nFlickity.defaults = {\n accessibility: true,\n // adaptiveHeight: false,\n cellAlign: 'center',\n // cellSelector: undefined,\n // contain: false,\n freeScrollFriction: 0.075, // friction when free-scrolling\n friction: 0.28, // friction when selecting\n namespaceJQueryEvents: true,\n // initialIndex: 0,\n percentPosition: true,\n resize: true,\n selectedAttraction: 0.025,\n setGallerySize: true\n // watchCSS: false,\n // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.createMethods = [];\n\nvar proto = Flickity.prototype;\n// inherit EventEmitter\nutils.extend( proto, EvEmitter.prototype );\n\nproto._create = function() {\n // add id for Flickity.data\n var id = this.guid = ++GUID;\n this.element.flickityGUID = id; // expando\n instances[ id ] = this; // associate via id\n // initial properties\n this.selectedIndex = 0;\n // how many frames slider has been in same position\n this.restingFrames = 0;\n // initial physics properties\n this.x = 0;\n this.velocity = 0;\n this.originSide = this.options.rightToLeft ? 'right' : 'left';\n // create viewport & slider\n this.viewport = document.createElement('div');\n this.viewport.className = 'flickity-viewport';\n this._createSlider();\n\n if ( this.options.resize || this.options.watchCSS ) {\n window.addEventListener( 'resize', this );\n }\n\n // add listeners from on option\n for ( var eventName in this.options.on ) {\n var listener = this.options.on[ eventName ];\n this.on( eventName, listener );\n }\n\n Flickity.createMethods.forEach( function( method ) {\n this[ method ]();\n }, this );\n\n if ( this.options.watchCSS ) {\n this.watchCSS();\n } else {\n this.activate();\n }\n\n};\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n utils.extend( this.options, opts );\n};\n\nproto.activate = function() {\n if ( this.isActive ) {\n return;\n }\n this.isActive = true;\n this.element.classList.add('flickity-enabled');\n if ( this.options.rightToLeft ) {\n this.element.classList.add('flickity-rtl');\n }\n\n this.getSize();\n // move initial cell elements so they can be loaded as cells\n var cellElems = this._filterFindCellElements( this.element.children );\n moveElements( cellElems, this.slider );\n this.viewport.appendChild( this.slider );\n this.element.appendChild( this.viewport );\n // get cells from children\n this.reloadCells();\n\n if ( this.options.accessibility ) {\n // allow element to focusable\n this.element.tabIndex = 0;\n // listen for key presses\n this.element.addEventListener( 'keydown', this );\n }\n\n this.emitEvent('activate');\n this.selectInitialIndex();\n // flag for initial activation, for using initialIndex\n this.isInitActivated = true;\n // ready event. #493\n this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n // slider element does all the positioning\n var slider = document.createElement('div');\n slider.className = 'flickity-slider';\n slider.style[ this.originSide ] = 0;\n this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n // collection of item elements\n this.cells = this._makeCells( this.slider.children );\n this.positionCells();\n this._getWrapShiftCells();\n this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n var cellElems = this._filterFindCellElements( elems );\n\n // create new Flickity for collection\n var cells = cellElems.map( function( cellElem ) {\n return new Cell( cellElem, this );\n }, this );\n\n return cells;\n};\n\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n // size all cells\n this._sizeCells( this.cells );\n // position all cells\n this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n index = index || 0;\n // also measure maxCellHeight\n // start 0 if positioning all cells\n this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n var cellX = 0;\n // get cellX\n if ( index > 0 ) {\n var startCell = this.cells[ index - 1 ];\n cellX = startCell.x + startCell.size.outerWidth;\n }\n var len = this.cells.length;\n for ( var i=index; i < len; i++ ) {\n var cell = this.cells[i];\n cell.setPosition( cellX );\n cellX += cell.size.outerWidth;\n this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n }\n // keep track of cellX for wrap-around\n this.slideableWidth = cellX;\n // slides\n this.updateSlides();\n // contain slides target\n this._containSlides();\n // update slidesWidth\n this.slidesWidth = len ? this.getLastSlide().target - this.slides[0].target : 0;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells\n */\nproto._sizeCells = function( cells ) {\n cells.forEach( function( cell ) {\n cell.getSize();\n });\n};\n\n// -------------------------- -------------------------- //\n\nproto.updateSlides = function() {\n this.slides = [];\n if ( !this.cells.length ) {\n return;\n }\n\n var slide = new Slide( this );\n this.slides.push( slide );\n var isOriginLeft = this.originSide == 'left';\n var nextMargin = isOriginLeft ? 'marginRight' : 'marginLeft';\n\n var canCellFit = this._getCanCellFit();\n\n this.cells.forEach( function( cell, i ) {\n // just add cell if first cell in slide\n if ( !slide.cells.length ) {\n slide.addCell( cell );\n return;\n }\n\n var slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n ( cell.size.outerWidth - cell.size[ nextMargin ] );\n\n if ( canCellFit.call( this, i, slideWidth ) ) {\n slide.addCell( cell );\n } else {\n // doesn't fit, new slide\n slide.updateTarget();\n\n slide = new Slide( this );\n this.slides.push( slide );\n slide.addCell( cell );\n }\n }, this );\n // last slide\n slide.updateTarget();\n // update .selectedSlide\n this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n var groupCells = this.options.groupCells;\n if ( !groupCells ) {\n return function() {\n return false;\n };\n } else if ( typeof groupCells == 'number' ) {\n // group by number. 3 -> [0,1,2], [3,4,5], ...\n var number = parseInt( groupCells, 10 );\n return function( i ) {\n return ( i % number ) !== 0;\n };\n }\n // default, group by width of slide\n // parse '75%\n var percentMatch = typeof groupCells == 'string' &&\n groupCells.match(/^(\\d+)%$/);\n var percent = percentMatch ? parseInt( percentMatch[1], 10 ) / 100 : 1;\n return function( i, slideWidth ) {\n return slideWidth <= ( this.size.innerWidth + 1 ) * percent;\n };\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n this.positionCells();\n this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n this.setCellAlign();\n this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nvar cellAlignShorthands = {\n // cell align, then based on origin side\n center: {\n left: 0.5,\n right: 0.5\n },\n left: {\n left: 0,\n right: 1\n },\n right: {\n right: 0,\n left: 1\n }\n};\n\nproto.setCellAlign = function() {\n var shorthand = cellAlignShorthands[ this.options.cellAlign ];\n this.cellAlign = shorthand ? shorthand[ this.originSide ] : this.options.cellAlign;\n};\n\nproto.setGallerySize = function() {\n if ( this.options.setGallerySize ) {\n var height = this.options.adaptiveHeight && this.selectedSlide ?\n this.selectedSlide.height : this.maxCellHeight;\n this.viewport.style.height = height + 'px';\n }\n};\n\nproto._getWrapShiftCells = function() {\n // only for wrap-around\n if ( !this.options.wrapAround ) {\n return;\n }\n // unshift previous cells\n this._unshiftCells( this.beforeShiftCells );\n this._unshiftCells( this.afterShiftCells );\n // get before cells\n // initial gap\n var gapX = this.cursorPosition;\n var cellIndex = this.cells.length - 1;\n this.beforeShiftCells = this._getGapCells( gapX, cellIndex, -1 );\n // get after cells\n // ending gap between last cell and end of gallery viewport\n gapX = this.size.innerWidth - this.cursorPosition;\n // start cloning at first cell, working forwards\n this.afterShiftCells = this._getGapCells( gapX, 0, 1 );\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n // keep adding cells until the cover the initial gap\n var cells = [];\n while ( gapX > 0 ) {\n var cell = this.cells[ cellIndex ];\n if ( !cell ) {\n break;\n }\n cells.push( cell );\n cellIndex += increment;\n gapX -= cell.size.outerWidth;\n }\n return cells;\n};\n\n// ----- contain ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n if ( !this.options.contain || this.options.wrapAround || !this.cells.length ) {\n return;\n }\n var isRightToLeft = this.options.rightToLeft;\n var beginMargin = isRightToLeft ? 'marginRight' : 'marginLeft';\n var endMargin = isRightToLeft ? 'marginLeft' : 'marginRight';\n var contentWidth = this.slideableWidth - this.getLastCell().size[ endMargin ];\n // content is less than gallery size\n var isContentSmaller = contentWidth < this.size.innerWidth;\n // bounds\n var beginBound = this.cursorPosition + this.cells[0].size[ beginMargin ];\n var endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n // contain each cell target\n this.slides.forEach( function( slide ) {\n if ( isContentSmaller ) {\n // all cells fit inside gallery\n slide.target = contentWidth * this.cellAlign;\n } else {\n // contain to bounds\n slide.target = Math.max( slide.target, beginBound );\n slide.target = Math.min( slide.target, endBound );\n }\n }, this );\n};\n\n// ----- ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n var emitArgs = event ? [ event ].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n\n if ( jQuery && this.$element ) {\n // default trigger with type if no event\n type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n var $event = type;\n if ( event ) {\n // create jQuery event\n var jQEvent = jQuery.Event( event );\n jQEvent.type = type;\n $event = jQEvent;\n }\n this.$element.trigger( $event, args );\n }\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n if ( !this.isActive ) {\n return;\n }\n index = parseInt( index, 10 );\n this._wrapSelect( index );\n\n if ( this.options.wrapAround || isWrap ) {\n index = utils.modulo( index, this.slides.length );\n }\n // bail if invalid index\n if ( !this.slides[ index ] ) {\n return;\n }\n var prevIndex = this.selectedIndex;\n this.selectedIndex = index;\n this.updateSelectedSlide();\n if ( isInstant ) {\n this.positionSliderAtSelected();\n } else {\n this.startAnimation();\n }\n if ( this.options.adaptiveHeight ) {\n this.setGallerySize();\n }\n // events\n this.dispatchEvent( 'select', null, [ index ] );\n // change event if new index\n if ( index != prevIndex ) {\n this.dispatchEvent( 'change', null, [ index ] );\n }\n // old v1 event name, remove in v3\n this.dispatchEvent('cellSelect');\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n var len = this.slides.length;\n var isWrapping = this.options.wrapAround && len > 1;\n if ( !isWrapping ) {\n return index;\n }\n var wrapIndex = utils.modulo( index, len );\n // go to shortest\n var delta = Math.abs( wrapIndex - this.selectedIndex );\n var backWrapDelta = Math.abs( ( wrapIndex + len ) - this.selectedIndex );\n var forewardWrapDelta = Math.abs( ( wrapIndex - len ) - this.selectedIndex );\n if ( !this.isDragSelect && backWrapDelta < delta ) {\n index += len;\n } else if ( !this.isDragSelect && forewardWrapDelta < delta ) {\n index -= len;\n }\n // wrap position so slider is within normal area\n if ( index < 0 ) {\n this.x -= this.slideableWidth;\n } else if ( index >= len ) {\n this.x += this.slideableWidth;\n }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n var slide = this.slides[ this.selectedIndex ];\n // selectedIndex could be outside of slides, if triggered before resize()\n if ( !slide ) {\n return;\n }\n // unselect previous selected slide\n this.unselectSelectedSlide();\n // update new selected slide\n this.selectedSlide = slide;\n slide.select();\n this.selectedCells = slide.cells;\n this.selectedElements = slide.getCellElements();\n // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n // Remove in v3?\n this.selectedCell = slide.cells[0];\n this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n if ( this.selectedSlide ) {\n this.selectedSlide.unselect();\n }\n};\n\nproto.selectInitialIndex = function() {\n var initialIndex = this.options.initialIndex;\n // already activated, select previous selectedIndex\n if ( this.isInitActivated ) {\n this.select( this.selectedIndex, false, true );\n return;\n }\n // select with selector string\n if ( initialIndex && typeof initialIndex == 'string' ) {\n var cell = this.queryCell( initialIndex );\n if ( cell ) {\n this.selectCell( initialIndex, false, true );\n return;\n }\n }\n\n var index = 0;\n // select with number\n if ( initialIndex && this.slides[ initialIndex ] ) {\n index = initialIndex;\n }\n // select instantly\n this.select( index, false, true );\n};\n\n/**\n * select slide from number or cell element\n * @param {Element or Number} elem\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n // get cell\n var cell = this.queryCell( value );\n if ( !cell ) {\n return;\n }\n\n var index = this.getCellSlideIndex( cell );\n this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n // get index of slides that has cell\n for ( var i=0; i < this.slides.length; i++ ) {\n var slide = this.slides[i];\n var index = slide.cells.indexOf( cell );\n if ( index != -1 ) {\n return i;\n }\n }\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem\n * @returns {Flickity.Cell} item\n */\nproto.getCell = function( elem ) {\n // loop through cells to get the one that matches\n for ( var i=0; i < this.cells.length; i++ ) {\n var cell = this.cells[i];\n if ( cell.element == elem ) {\n return cell;\n }\n }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {Element, Array, NodeList} elems\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n elems = utils.makeArray( elems );\n var cells = [];\n elems.forEach( function( elem ) {\n var cell = this.getCell( elem );\n if ( cell ) {\n cells.push( cell );\n }\n }, this );\n return cells;\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n return this.cells.map( function( cell ) {\n return cell.element;\n });\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem\n * @returns {Flickit.Cell} cell\n */\nproto.getParentCell = function( elem ) {\n // first check if elem is cell\n var cell = this.getCell( elem );\n if ( cell ) {\n return cell;\n }\n // try to get parent cell elem\n elem = utils.getParent( elem, '.flickity-slider > *' );\n return this.getCell( elem );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n if ( !adjCount ) {\n return this.selectedSlide.getCellElements();\n }\n index = index === undefined ? this.selectedIndex : index;\n\n var len = this.slides.length;\n if ( 1 + ( adjCount * 2 ) >= len ) {\n return this.getCellElements();\n }\n\n var cellElems = [];\n for ( var i = index - adjCount; i <= index + adjCount ; i++ ) {\n var slideIndex = this.options.wrapAround ? utils.modulo( i, len ) : i;\n var slide = this.slides[ slideIndex ];\n if ( slide ) {\n cellElems = cellElems.concat( slide.getCellElements() );\n }\n }\n return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {Element, Selector String, or Number} selector\n */\nproto.queryCell = function( selector ) {\n if ( typeof selector == 'number' ) {\n // use number as index\n return this.cells[ selector ];\n }\n if ( typeof selector == 'string' ) {\n // do not select invalid selectors from hash: #123, #/. #791\n if ( selector.match(/^[#\\.]?[\\d\\/]/) ) {\n return;\n }\n // use string as selector, get element\n selector = this.element.querySelector( selector );\n }\n // get cell from element\n return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n this.emitEvent('uiChange');\n};\n\n// keep focus on element when child UI elements are clicked\nproto.childUIPointerDown = function( event ) {\n // HACK iOS does not allow touch events to bubble up?!\n if ( event.type != 'touchstart' ) {\n event.preventDefault();\n }\n this.focus();\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n this.watchCSS();\n this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n if ( !this.isActive ) {\n return;\n }\n this.getSize();\n // wrap values\n if ( this.options.wrapAround ) {\n this.x = utils.modulo( this.x, this.slideableWidth );\n }\n this.positionCells();\n this._getWrapShiftCells();\n this.setGallerySize();\n this.emitEvent('resize');\n // update selected index for group slides, instant\n // TODO: position can be lost between groups of various numbers\n var selectedElement = this.selectedElements && this.selectedElements[0];\n this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n var watchOption = this.options.watchCSS;\n if ( !watchOption ) {\n return;\n }\n\n var afterContent = getComputedStyle( this.element, ':after' ).content;\n // activate if :after { content: 'flickity' }\n if ( afterContent.indexOf('flickity') != -1 ) {\n this.activate();\n } else {\n this.deactivate();\n }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n // only work if element is in focus\n var isNotFocused = document.activeElement && document.activeElement != this.element;\n if ( !this.options.accessibility ||isNotFocused ) {\n return;\n }\n\n var handler = Flickity.keyboardHandlers[ event.keyCode ];\n if ( handler ) {\n handler.call( this );\n }\n};\n\nFlickity.keyboardHandlers = {\n // left arrow\n 37: function() {\n var leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n this.uiChange();\n this[ leftMethod ]();\n },\n // right arrow\n 39: function() {\n var rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n this.uiChange();\n this[ rightMethod ]();\n },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n // TODO remove scrollTo once focus options gets more support\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus#Browser_compatibility\n var prevScrollY = window.pageYOffset;\n this.element.focus({ preventScroll: true });\n // hack to fix scroll jump after focus, #76\n if ( window.pageYOffset != prevScrollY ) {\n window.scrollTo( window.pageXOffset, prevScrollY );\n }\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n if ( !this.isActive ) {\n return;\n }\n this.element.classList.remove('flickity-enabled');\n this.element.classList.remove('flickity-rtl');\n this.unselectSelectedSlide();\n // destroy cells\n this.cells.forEach( function( cell ) {\n cell.destroy();\n });\n this.element.removeChild( this.viewport );\n // move child elements back into element\n moveElements( this.slider.children, this.element );\n if ( this.options.accessibility ) {\n this.element.removeAttribute('tabIndex');\n this.element.removeEventListener( 'keydown', this );\n }\n // set flags\n this.isActive = false;\n this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n this.deactivate();\n window.removeEventListener( 'resize', this );\n this.allOff();\n this.emitEvent('destroy');\n if ( jQuery && this.$element ) {\n jQuery.removeData( this.element, 'flickity' );\n }\n delete this.element.flickityGUID;\n delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nutils.extend( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {Element} elem\n * @returns {Flickity}\n */\nFlickity.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n var id = elem && elem.flickityGUID;\n return id && instances[ id ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nif ( jQuery && jQuery.bridget ) {\n jQuery.bridget( 'flickity', Flickity );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n jQuery = jq;\n};\n\nFlickity.Cell = Cell;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n}));\n","/*!\n * Flickity v2.2.1\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2019 Metafizzy\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n './drag',\n './prev-next-button',\n './page-dots',\n './player',\n './add-remove-cell',\n './lazyload'\n ], factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('./flickity'),\n require('./drag'),\n require('./prev-next-button'),\n require('./page-dots'),\n require('./player'),\n require('./add-remove-cell'),\n require('./lazyload')\n );\n }\n\n})( window, function factory( Flickity ) {\n /*jshint strict: false*/\n return Flickity;\n});\n","// lazyload\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, utils ) {\n return factory( window, Flickity, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, utils ) {\n'use strict';\n\nFlickity.createMethods.push('_createLazyload');\nvar proto = Flickity.prototype;\n\nproto._createLazyload = function() {\n this.on( 'select', this.lazyLoad );\n};\n\nproto.lazyLoad = function() {\n var lazyLoad = this.options.lazyLoad;\n if ( !lazyLoad ) {\n return;\n }\n // get adjacent cells, use lazyLoad option for adjacent count\n var adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n var cellElems = this.getAdjacentCellElements( adjCount );\n // get lazy images in those cells\n var lazyImages = [];\n cellElems.forEach( function( cellElem ) {\n var lazyCellImages = getCellLazyImages( cellElem );\n lazyImages = lazyImages.concat( lazyCellImages );\n });\n // load lazy images\n lazyImages.forEach( function( img ) {\n new LazyLoader( img, this );\n }, this );\n};\n\nfunction getCellLazyImages( cellElem ) {\n // check if cell element is lazy image\n if ( cellElem.nodeName == 'IMG' ) {\n var lazyloadAttr = cellElem.getAttribute('data-flickity-lazyload');\n var srcAttr = cellElem.getAttribute('data-flickity-lazyload-src');\n var srcsetAttr = cellElem.getAttribute('data-flickity-lazyload-srcset');\n if ( lazyloadAttr || srcAttr || srcsetAttr ) {\n return [ cellElem ];\n }\n }\n // select lazy images in cell\n var lazySelector = 'img[data-flickity-lazyload], ' +\n 'img[data-flickity-lazyload-src], img[data-flickity-lazyload-srcset]';\n var imgs = cellElem.querySelectorAll( lazySelector );\n return utils.makeArray( imgs );\n}\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n */\nfunction LazyLoader( img, flickity ) {\n this.img = img;\n this.flickity = flickity;\n this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n // get src & srcset\n var src = this.img.getAttribute('data-flickity-lazyload') ||\n this.img.getAttribute('data-flickity-lazyload-src');\n var srcset = this.img.getAttribute('data-flickity-lazyload-srcset');\n // set src & serset\n this.img.src = src;\n if ( srcset ) {\n this.img.setAttribute( 'srcset', srcset );\n }\n // remove attr\n this.img.removeAttribute('data-flickity-lazyload');\n this.img.removeAttribute('data-flickity-lazyload-src');\n this.img.removeAttribute('data-flickity-lazyload-srcset');\n};\n\nLazyLoader.prototype.onload = function( event ) {\n this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n // unbind events\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n\n var cell = this.flickity.getParentCell( this.img );\n var cellElem = cell && cell.element;\n this.flickity.cellSizeChange( cellElem );\n\n this.img.classList.add( className );\n this.flickity.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// ----- ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n}));\n","// page dots\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'unipointer/unipointer',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, Unipointer, utils ) {\n return factory( window, Flickity, Unipointer, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('unipointer'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.Unipointer,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\n'use strict';\n\nfunction PageDots( parent ) {\n this.parent = parent;\n this._create();\n}\n\nPageDots.prototype = Object.create( Unipointer.prototype );\n\nPageDots.prototype._create = function() {\n // create holder element\n this.holder = document.createElement('ol');\n this.holder.className = 'flickity-page-dots';\n // create dots, array of elements\n this.dots = [];\n // events\n this.handleClick = this.onClick.bind( this );\n this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPageDots.prototype.activate = function() {\n this.setDots();\n this.holder.addEventListener( 'click', this.handleClick );\n this.bindStartEvent( this.holder );\n // add to DOM\n this.parent.element.appendChild( this.holder );\n};\n\nPageDots.prototype.deactivate = function() {\n this.holder.removeEventListener( 'click', this.handleClick );\n this.unbindStartEvent( this.holder );\n // remove from DOM\n this.parent.element.removeChild( this.holder );\n};\n\nPageDots.prototype.setDots = function() {\n // get difference between number of slides and number of dots\n var delta = this.parent.slides.length - this.dots.length;\n if ( delta > 0 ) {\n this.addDots( delta );\n } else if ( delta < 0 ) {\n this.removeDots( -delta );\n }\n};\n\nPageDots.prototype.addDots = function( count ) {\n var fragment = document.createDocumentFragment();\n var newDots = [];\n var length = this.dots.length;\n var max = length + count;\n\n for ( var i = length; i < max; i++ ) {\n var dot = document.createElement('li');\n dot.className = 'dot';\n dot.setAttribute( 'aria-label', 'Page dot ' + ( i + 1 ) );\n fragment.appendChild( dot );\n newDots.push( dot );\n }\n\n this.holder.appendChild( fragment );\n this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n // remove from this.dots collection\n var removeDots = this.dots.splice( this.dots.length - count, count );\n // remove from DOM\n removeDots.forEach( function( dot ) {\n this.holder.removeChild( dot );\n }, this );\n};\n\nPageDots.prototype.updateSelected = function() {\n // remove selected class on previous\n if ( this.selectedDot ) {\n this.selectedDot.className = 'dot';\n this.selectedDot.removeAttribute('aria-current');\n }\n // don't proceed if no dots\n if ( !this.dots.length ) {\n return;\n }\n this.selectedDot = this.dots[ this.parent.selectedIndex ];\n this.selectedDot.className = 'dot is-selected';\n this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nPageDots.prototype.onTap = // old method name, backwards-compatible\nPageDots.prototype.onClick = function( event ) {\n var target = event.target;\n // only care about dot clicks\n if ( target.nodeName != 'LI' ) {\n return;\n }\n\n this.parent.uiChange();\n var index = this.dots.indexOf( target );\n this.parent.select( index );\n};\n\nPageDots.prototype.destroy = function() {\n this.deactivate();\n this.allOff();\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n pageDots: true\n});\n\nFlickity.createMethods.push('_createPageDots');\n\nvar proto = Flickity.prototype;\n\nproto._createPageDots = function() {\n if ( !this.options.pageDots ) {\n return;\n }\n this.pageDots = new PageDots( this );\n // events\n this.on( 'activate', this.activatePageDots );\n this.on( 'select', this.updateSelectedPageDots );\n this.on( 'cellChange', this.updatePageDots );\n this.on( 'resize', this.updatePageDots );\n this.on( 'deactivate', this.deactivatePageDots );\n};\n\nproto.activatePageDots = function() {\n this.pageDots.activate();\n};\n\nproto.updateSelectedPageDots = function() {\n this.pageDots.updateSelected();\n};\n\nproto.updatePageDots = function() {\n this.pageDots.setDots();\n};\n\nproto.deactivatePageDots = function() {\n this.pageDots.deactivate();\n};\n\n// ----- ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n}));\n","// player & autoPlay\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'ev-emitter/ev-emitter',\n 'fizzy-ui-utils/utils',\n './flickity'\n ], function( EvEmitter, utils, Flickity ) {\n return factory( EvEmitter, utils, Flickity );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('ev-emitter'),\n require('fizzy-ui-utils'),\n require('./flickity')\n );\n } else {\n // browser global\n factory(\n window.EvEmitter,\n window.fizzyUIUtils,\n window.Flickity\n );\n }\n\n}( window, function factory( EvEmitter, utils, Flickity ) {\n\n'use strict';\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( parent ) {\n this.parent = parent;\n this.state = 'stopped';\n // visibility change event handler\n this.onVisibilityChange = this.visibilityChange.bind( this );\n this.onVisibilityPlay = this.visibilityPlay.bind( this );\n}\n\nPlayer.prototype = Object.create( EvEmitter.prototype );\n\n// start play\nPlayer.prototype.play = function() {\n if ( this.state == 'playing' ) {\n return;\n }\n // do not play if page is hidden, start playing when page is visible\n var isPageHidden = document.hidden;\n if ( isPageHidden ) {\n document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n return;\n }\n\n this.state = 'playing';\n // listen to visibility change\n document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n // start ticking\n this.tick();\n};\n\nPlayer.prototype.tick = function() {\n // do not tick if not playing\n if ( this.state != 'playing' ) {\n return;\n }\n\n var time = this.parent.options.autoPlay;\n // default to 3 seconds\n time = typeof time == 'number' ? time : 3000;\n var _this = this;\n // HACK: reset ticks if stopped and started within interval\n this.clear();\n this.timeout = setTimeout( function() {\n _this.parent.next( true );\n _this.tick();\n }, time );\n};\n\nPlayer.prototype.stop = function() {\n this.state = 'stopped';\n this.clear();\n // remove visibility change event\n document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n if ( this.state == 'playing' ) {\n this.state = 'paused';\n this.clear();\n }\n};\n\nPlayer.prototype.unpause = function() {\n // re-start play if paused\n if ( this.state == 'paused' ) {\n this.play();\n }\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n var isPageHidden = document.hidden;\n this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n this.play();\n document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n pauseAutoPlayOnHover: true\n});\n\nFlickity.createMethods.push('_createPlayer');\nvar proto = Flickity.prototype;\n\nproto._createPlayer = function() {\n this.player = new Player( this );\n\n this.on( 'activate', this.activatePlayer );\n this.on( 'uiChange', this.stopPlayer );\n this.on( 'pointerDown', this.stopPlayer );\n this.on( 'deactivate', this.deactivatePlayer );\n};\n\nproto.activatePlayer = function() {\n if ( !this.options.autoPlay ) {\n return;\n }\n this.player.play();\n this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n this.player.play();\n};\n\nproto.stopPlayer = function() {\n this.player.stop();\n};\n\nproto.pausePlayer = function() {\n this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n this.player.stop();\n this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n if ( !this.options.pauseAutoPlayOnHover ) {\n return;\n }\n this.player.pause();\n this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n this.player.unpause();\n this.element.removeEventListener( 'mouseleave', this );\n};\n\n// ----- ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n}));\n","// prev/next buttons\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'unipointer/unipointer',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, Unipointer, utils ) {\n return factory( window, Flickity, Unipointer, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('unipointer'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.Unipointer,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n'use strict';\n\nvar svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( direction, parent ) {\n this.direction = direction;\n this.parent = parent;\n this._create();\n}\n\nPrevNextButton.prototype = Object.create( Unipointer.prototype );\n\nPrevNextButton.prototype._create = function() {\n // properties\n this.isEnabled = true;\n this.isPrevious = this.direction == -1;\n var leftDirection = this.parent.options.rightToLeft ? 1 : -1;\n this.isLeft = this.direction == leftDirection;\n\n var element = this.element = document.createElement('button');\n element.className = 'flickity-button flickity-prev-next-button';\n element.className += this.isPrevious ? ' previous' : ' next';\n // prevent button from submitting form http://stackoverflow.com/a/10836076/182183\n element.setAttribute( 'type', 'button' );\n // init as disabled\n this.disable();\n\n element.setAttribute( 'aria-label', this.isPrevious ? 'Previous' : 'Next' );\n\n // create arrow\n var svg = this.createSVG();\n element.appendChild( svg );\n // events\n this.parent.on( 'select', this.update.bind( this ) );\n this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPrevNextButton.prototype.activate = function() {\n this.bindStartEvent( this.element );\n this.element.addEventListener( 'click', this );\n // add to DOM\n this.parent.element.appendChild( this.element );\n};\n\nPrevNextButton.prototype.deactivate = function() {\n // remove from DOM\n this.parent.element.removeChild( this.element );\n // click events\n this.unbindStartEvent( this.element );\n this.element.removeEventListener( 'click', this );\n};\n\nPrevNextButton.prototype.createSVG = function() {\n var svg = document.createElementNS( svgURI, 'svg');\n svg.setAttribute( 'class', 'flickity-button-icon' );\n svg.setAttribute( 'viewBox', '0 0 100 100' );\n var path = document.createElementNS( svgURI, 'path');\n var pathMovements = getArrowMovements( this.parent.options.arrowShape );\n path.setAttribute( 'd', pathMovements );\n path.setAttribute( 'class', 'arrow' );\n // rotate arrow\n if ( !this.isLeft ) {\n path.setAttribute( 'transform', 'translate(100, 100) rotate(180) ' );\n }\n svg.appendChild( path );\n return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n // use shape as movement if string\n if ( typeof shape == 'string' ) {\n return shape;\n }\n // create movement string\n return 'M ' + shape.x0 + ',50' +\n ' L ' + shape.x1 + ',' + ( shape.y1 + 50 ) +\n ' L ' + shape.x2 + ',' + ( shape.y2 + 50 ) +\n ' L ' + shape.x3 + ',50 ' +\n ' L ' + shape.x2 + ',' + ( 50 - shape.y2 ) +\n ' L ' + shape.x1 + ',' + ( 50 - shape.y1 ) +\n ' Z';\n}\n\nPrevNextButton.prototype.handleEvent = utils.handleEvent;\n\nPrevNextButton.prototype.onclick = function() {\n if ( !this.isEnabled ) {\n return;\n }\n this.parent.uiChange();\n var method = this.isPrevious ? 'previous' : 'next';\n this.parent[ method ]();\n};\n\n// ----- ----- //\n\nPrevNextButton.prototype.enable = function() {\n if ( this.isEnabled ) {\n return;\n }\n this.element.disabled = false;\n this.isEnabled = true;\n};\n\nPrevNextButton.prototype.disable = function() {\n if ( !this.isEnabled ) {\n return;\n }\n this.element.disabled = true;\n this.isEnabled = false;\n};\n\nPrevNextButton.prototype.update = function() {\n // index of first or last slide, if previous or next\n var slides = this.parent.slides;\n // enable is wrapAround and at least 2 slides\n if ( this.parent.options.wrapAround && slides.length > 1 ) {\n this.enable();\n return;\n }\n var lastIndex = slides.length ? slides.length - 1 : 0;\n var boundIndex = this.isPrevious ? 0 : lastIndex;\n var method = this.parent.selectedIndex == boundIndex ? 'disable' : 'enable';\n this[ method ]();\n};\n\nPrevNextButton.prototype.destroy = function() {\n this.deactivate();\n this.allOff();\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nutils.extend( Flickity.defaults, {\n prevNextButtons: true,\n arrowShape: {\n x0: 10,\n x1: 60, y1: 50,\n x2: 70, y2: 40,\n x3: 30\n }\n});\n\nFlickity.createMethods.push('_createPrevNextButtons');\nvar proto = Flickity.prototype;\n\nproto._createPrevNextButtons = function() {\n if ( !this.options.prevNextButtons ) {\n return;\n }\n\n this.prevButton = new PrevNextButton( -1, this );\n this.nextButton = new PrevNextButton( 1, this );\n\n this.on( 'activate', this.activatePrevNextButtons );\n};\n\nproto.activatePrevNextButtons = function() {\n this.prevButton.activate();\n this.nextButton.activate();\n this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n this.prevButton.deactivate();\n this.nextButton.deactivate();\n this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// -------------------------- -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n}));\n","// slide\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.Slide = factory();\n }\n\n}( window, function factory() {\n'use strict';\n\nfunction Slide( parent ) {\n this.parent = parent;\n this.isOriginLeft = parent.originSide == 'left';\n this.cells = [];\n this.outerWidth = 0;\n this.height = 0;\n}\n\nvar proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n this.cells.push( cell );\n this.outerWidth += cell.size.outerWidth;\n this.height = Math.max( cell.size.outerHeight, this.height );\n // first cell stuff\n if ( this.cells.length == 1 ) {\n this.x = cell.x; // x comes from first cell\n var beginMargin = this.isOriginLeft ? 'marginLeft' : 'marginRight';\n this.firstMargin = cell.size[ beginMargin ];\n }\n};\n\nproto.updateTarget = function() {\n var endMargin = this.isOriginLeft ? 'marginRight' : 'marginLeft';\n var lastCell = this.getLastCell();\n var lastMargin = lastCell ? lastCell.size[ endMargin ] : 0;\n var slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n this.target = this.x + this.firstMargin + slideWidth * this.parent.cellAlign;\n};\n\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n this.cells.forEach( function( cell ) {\n cell.select();\n });\n};\n\nproto.unselect = function() {\n this.cells.forEach( function( cell ) {\n cell.unselect();\n });\n};\n\nproto.getCellElements = function() {\n return this.cells.map( function( cell ) {\n return cell.element;\n });\n};\n\nreturn Slide;\n\n}));\n","/*!\n * getSize v2.0.3\n * measure size of elements\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n/* globals console: false */\n\n( function( window, factory ) {\n /* jshint strict: false */ /* globals define, module */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.getSize = factory();\n }\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n var num = parseFloat( value );\n // not a percent like '100%', and a number\n var isValid = value.indexOf('%') == -1 && !isNaN( num );\n return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n function( message ) {\n console.error( message );\n };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n var size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n };\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n size[ measurement ] = 0;\n }\n return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n var style = getComputedStyle( elem );\n if ( !style ) {\n logError( 'Style returned ' + style +\n '. Are you running this code in a hidden iframe on Firefox? ' +\n 'See https://bit.ly/getsizebug1' );\n }\n return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n // setup once\n if ( isSetup ) {\n return;\n }\n isSetup = true;\n\n // -------------------------- box sizing -------------------------- //\n\n /**\n * Chrome & Safari measure the outer-width on style.width on border-box elems\n * IE11 & Firefox<29 measures the inner-width\n */\n var div = document.createElement('div');\n div.style.width = '200px';\n div.style.padding = '1px 2px 3px 4px';\n div.style.borderStyle = 'solid';\n div.style.borderWidth = '1px 2px 3px 4px';\n div.style.boxSizing = 'border-box';\n\n var body = document.body || document.documentElement;\n body.appendChild( div );\n var style = getStyle( div );\n // round value for browser zoom. desandro/masonry#928\n isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;\n getSize.isBoxSizeOuter = isBoxSizeOuter;\n\n body.removeChild( div );\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n setup();\n\n // use querySeletor if elem is string\n if ( typeof elem == 'string' ) {\n elem = document.querySelector( elem );\n }\n\n // do not proceed on non-objects\n if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n return;\n }\n\n var style = getStyle( elem );\n\n // if hidden, everything is 0\n if ( style.display == 'none' ) {\n return getZeroSize();\n }\n\n var size = {};\n size.width = elem.offsetWidth;\n size.height = elem.offsetHeight;\n\n var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n // get all measurements\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n var value = style[ measurement ];\n var num = parseFloat( value );\n // any 'auto', 'medium' value will be 0\n size[ measurement ] = !isNaN( num ) ? num : 0;\n }\n\n var paddingWidth = size.paddingLeft + size.paddingRight;\n var paddingHeight = size.paddingTop + size.paddingBottom;\n var marginWidth = size.marginLeft + size.marginRight;\n var marginHeight = size.marginTop + size.marginBottom;\n var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n var styleWidth = getStyleSize( style.width );\n if ( styleWidth !== false ) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n }\n\n var styleHeight = getStyleSize( style.height );\n if ( styleHeight !== false ) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n }\n\n size.innerWidth = size.width - ( paddingWidth + borderWidth );\n size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n size.outerWidth = size.width + marginWidth;\n size.outerHeight = size.height + marginHeight;\n\n return size;\n}\n\nreturn getSize;\n\n});\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = throttle;\n","/**\n shave - Shave is a javascript plugin that truncates multi-line text within a html element based on set max height\n @version v2.5.4\n @link https://github.com/dollarshaveclub/shave#readme\n @author Jeff Wainwright (jeffry.in)\n @license MIT\n**/\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = global || self, global.shave = factory());\n}(this, function () { 'use strict';\n\n function shave(target, maxHeight) {\n var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n if (!maxHeight) throw Error('maxHeight is required');\n var els = typeof target === 'string' ? document.querySelectorAll(target) : target;\n if (!els) return;\n var character = opts.character || '…';\n var classname = opts.classname || 'js-shave';\n var spaces = typeof opts.spaces === 'boolean' ? opts.spaces : true;\n var charHtml = \"\".concat(character, \"\");\n if (!('length' in els)) els = [els];\n\n for (var i = 0; i < els.length; i += 1) {\n var el = els[i];\n var styles = el.style;\n var span = el.querySelector(\".\".concat(classname));\n var textProp = el.textContent === undefined ? 'innerText' : 'textContent'; // If element text has already been shaved\n\n if (span) {\n // Remove the ellipsis to recapture the original text\n el.removeChild(el.querySelector('.js-shave-char'));\n el[textProp] = el[textProp]; // eslint-disable-line\n // nuke span, recombine text\n }\n\n var fullText = el[textProp];\n var words = spaces ? fullText.split(' ') : fullText; // If 0 or 1 words, we're done\n\n if (words.length < 2) continue; // Temporarily remove any CSS height for text height calculation\n\n var heightStyle = styles.height;\n styles.height = 'auto';\n var maxHeightStyle = styles.maxHeight;\n styles.maxHeight = 'none'; // If already short enough, we're done\n\n if (el.offsetHeight <= maxHeight) {\n styles.height = heightStyle;\n styles.maxHeight = maxHeightStyle;\n continue;\n } // Binary search for number of words which can fit in allotted height\n\n\n var max = words.length - 1;\n var min = 0;\n var pivot = void 0;\n\n while (min < max) {\n pivot = min + max + 1 >> 1; // eslint-disable-line no-bitwise\n\n el[textProp] = spaces ? words.slice(0, pivot).join(' ') : words.slice(0, pivot);\n el.insertAdjacentHTML('beforeend', charHtml);\n if (el.offsetHeight > maxHeight) max = spaces ? pivot - 1 : pivot - 2;else min = pivot;\n }\n\n el[textProp] = spaces ? words.slice(0, max).join(' ') : words.slice(0, max);\n el.insertAdjacentHTML('beforeend', charHtml);\n var diff = spaces ? \" \".concat(words.slice(max).join(' ')) : words.slice(max);\n var shavedText = document.createTextNode(diff);\n var elWithShavedText = document.createElement('span');\n elWithShavedText.classList.add(classname);\n elWithShavedText.style.display = 'none';\n elWithShavedText.appendChild(shavedText);\n el.insertAdjacentElement('beforeend', elWithShavedText);\n styles.height = heightStyle;\n styles.maxHeight = maxHeightStyle;\n }\n }\n\n return shave;\n\n}));\n","var SvgPanZoom = require(\"./svg-pan-zoom.js\");\n\nmodule.exports = SvgPanZoom;\n","var SvgUtils = require(\"./svg-utilities\");\n\nmodule.exports = {\n enable: function(instance) {\n // Select (and create if necessary) defs\n var defs = instance.svg.querySelector(\"defs\");\n if (!defs) {\n defs = document.createElementNS(SvgUtils.svgNS, \"defs\");\n instance.svg.appendChild(defs);\n }\n\n // Check for style element, and create it if it doesn't exist\n var styleEl = defs.querySelector(\"style#svg-pan-zoom-controls-styles\");\n if (!styleEl) {\n var style = document.createElementNS(SvgUtils.svgNS, \"style\");\n style.setAttribute(\"id\", \"svg-pan-zoom-controls-styles\");\n style.setAttribute(\"type\", \"text/css\");\n style.textContent =\n \".svg-pan-zoom-control { cursor: pointer; fill: black; fill-opacity: 0.333; } .svg-pan-zoom-control:hover { fill-opacity: 0.8; } .svg-pan-zoom-control-background { fill: white; fill-opacity: 0.5; } .svg-pan-zoom-control-background { fill-opacity: 0.8; }\";\n defs.appendChild(style);\n }\n\n // Zoom Group\n var zoomGroup = document.createElementNS(SvgUtils.svgNS, \"g\");\n zoomGroup.setAttribute(\"id\", \"svg-pan-zoom-controls\");\n zoomGroup.setAttribute(\n \"transform\",\n \"translate(\" +\n (instance.width - 70) +\n \" \" +\n (instance.height - 76) +\n \") scale(0.75)\"\n );\n zoomGroup.setAttribute(\"class\", \"svg-pan-zoom-control\");\n\n // Control elements\n zoomGroup.appendChild(this._createZoomIn(instance));\n zoomGroup.appendChild(this._createZoomReset(instance));\n zoomGroup.appendChild(this._createZoomOut(instance));\n\n // Finally append created element\n instance.svg.appendChild(zoomGroup);\n\n // Cache control instance\n instance.controlIcons = zoomGroup;\n },\n\n _createZoomIn: function(instance) {\n var zoomIn = document.createElementNS(SvgUtils.svgNS, \"g\");\n zoomIn.setAttribute(\"id\", \"svg-pan-zoom-zoom-in\");\n zoomIn.setAttribute(\"transform\", \"translate(30.5 5) scale(0.015)\");\n zoomIn.setAttribute(\"class\", \"svg-pan-zoom-control\");\n zoomIn.addEventListener(\n \"click\",\n function() {\n instance.getPublicInstance().zoomIn();\n },\n false\n );\n zoomIn.addEventListener(\n \"touchstart\",\n function() {\n instance.getPublicInstance().zoomIn();\n },\n false\n );\n\n var zoomInBackground = document.createElementNS(SvgUtils.svgNS, \"rect\"); // TODO change these background space fillers to rounded rectangles so they look prettier\n zoomInBackground.setAttribute(\"x\", \"0\");\n zoomInBackground.setAttribute(\"y\", \"0\");\n zoomInBackground.setAttribute(\"width\", \"1500\"); // larger than expected because the whole group is transformed to scale down\n zoomInBackground.setAttribute(\"height\", \"1400\");\n zoomInBackground.setAttribute(\"class\", \"svg-pan-zoom-control-background\");\n zoomIn.appendChild(zoomInBackground);\n\n var zoomInShape = document.createElementNS(SvgUtils.svgNS, \"path\");\n zoomInShape.setAttribute(\n \"d\",\n \"M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z\"\n );\n zoomInShape.setAttribute(\"class\", \"svg-pan-zoom-control-element\");\n zoomIn.appendChild(zoomInShape);\n\n return zoomIn;\n },\n\n _createZoomReset: function(instance) {\n // reset\n var resetPanZoomControl = document.createElementNS(SvgUtils.svgNS, \"g\");\n resetPanZoomControl.setAttribute(\"id\", \"svg-pan-zoom-reset-pan-zoom\");\n resetPanZoomControl.setAttribute(\"transform\", \"translate(5 35) scale(0.4)\");\n resetPanZoomControl.setAttribute(\"class\", \"svg-pan-zoom-control\");\n resetPanZoomControl.addEventListener(\n \"click\",\n function() {\n instance.getPublicInstance().reset();\n },\n false\n );\n resetPanZoomControl.addEventListener(\n \"touchstart\",\n function() {\n instance.getPublicInstance().reset();\n },\n false\n );\n\n var resetPanZoomControlBackground = document.createElementNS(\n SvgUtils.svgNS,\n \"rect\"\n ); // TODO change these background space fillers to rounded rectangles so they look prettier\n resetPanZoomControlBackground.setAttribute(\"x\", \"2\");\n resetPanZoomControlBackground.setAttribute(\"y\", \"2\");\n resetPanZoomControlBackground.setAttribute(\"width\", \"182\"); // larger than expected because the whole group is transformed to scale down\n resetPanZoomControlBackground.setAttribute(\"height\", \"58\");\n resetPanZoomControlBackground.setAttribute(\n \"class\",\n \"svg-pan-zoom-control-background\"\n );\n resetPanZoomControl.appendChild(resetPanZoomControlBackground);\n\n var resetPanZoomControlShape1 = document.createElementNS(\n SvgUtils.svgNS,\n \"path\"\n );\n resetPanZoomControlShape1.setAttribute(\n \"d\",\n \"M33.051,20.632c-0.742-0.406-1.854-0.609-3.338-0.609h-7.969v9.281h7.769c1.543,0,2.701-0.188,3.473-0.562c1.365-0.656,2.048-1.953,2.048-3.891C35.032,22.757,34.372,21.351,33.051,20.632z\"\n );\n resetPanZoomControlShape1.setAttribute(\n \"class\",\n \"svg-pan-zoom-control-element\"\n );\n resetPanZoomControl.appendChild(resetPanZoomControlShape1);\n\n var resetPanZoomControlShape2 = document.createElementNS(\n SvgUtils.svgNS,\n \"path\"\n );\n resetPanZoomControlShape2.setAttribute(\n \"d\",\n \"M170.231,0.5H15.847C7.102,0.5,0.5,5.708,0.5,11.84v38.861C0.5,56.833,7.102,61.5,15.847,61.5h154.384c8.745,0,15.269-4.667,15.269-10.798V11.84C185.5,5.708,178.976,0.5,170.231,0.5z M42.837,48.569h-7.969c-0.219-0.766-0.375-1.383-0.469-1.852c-0.188-0.969-0.289-1.961-0.305-2.977l-0.047-3.211c-0.03-2.203-0.41-3.672-1.142-4.406c-0.732-0.734-2.103-1.102-4.113-1.102h-7.05v13.547h-7.055V14.022h16.524c2.361,0.047,4.178,0.344,5.45,0.891c1.272,0.547,2.351,1.352,3.234,2.414c0.731,0.875,1.31,1.844,1.737,2.906s0.64,2.273,0.64,3.633c0,1.641-0.414,3.254-1.242,4.84s-2.195,2.707-4.102,3.363c1.594,0.641,2.723,1.551,3.387,2.73s0.996,2.98,0.996,5.402v2.32c0,1.578,0.063,2.648,0.19,3.211c0.19,0.891,0.635,1.547,1.333,1.969V48.569z M75.579,48.569h-26.18V14.022h25.336v6.117H56.454v7.336h16.781v6H56.454v8.883h19.125V48.569z M104.497,46.331c-2.44,2.086-5.887,3.129-10.34,3.129c-4.548,0-8.125-1.027-10.731-3.082s-3.909-4.879-3.909-8.473h6.891c0.224,1.578,0.662,2.758,1.316,3.539c1.196,1.422,3.246,2.133,6.15,2.133c1.739,0,3.151-0.188,4.236-0.562c2.058-0.719,3.087-2.055,3.087-4.008c0-1.141-0.504-2.023-1.512-2.648c-1.008-0.609-2.607-1.148-4.796-1.617l-3.74-0.82c-3.676-0.812-6.201-1.695-7.576-2.648c-2.328-1.594-3.492-4.086-3.492-7.477c0-3.094,1.139-5.664,3.417-7.711s5.623-3.07,10.036-3.07c3.685,0,6.829,0.965,9.431,2.895c2.602,1.93,3.966,4.73,4.093,8.402h-6.938c-0.128-2.078-1.057-3.555-2.787-4.43c-1.154-0.578-2.587-0.867-4.301-0.867c-1.907,0-3.428,0.375-4.565,1.125c-1.138,0.75-1.706,1.797-1.706,3.141c0,1.234,0.561,2.156,1.682,2.766c0.721,0.406,2.25,0.883,4.589,1.43l6.063,1.43c2.657,0.625,4.648,1.461,5.975,2.508c2.059,1.625,3.089,3.977,3.089,7.055C108.157,41.624,106.937,44.245,104.497,46.331z M139.61,48.569h-26.18V14.022h25.336v6.117h-18.281v7.336h16.781v6h-16.781v8.883h19.125V48.569z M170.337,20.14h-10.336v28.43h-7.266V20.14h-10.383v-6.117h27.984V20.14z\"\n );\n resetPanZoomControlShape2.setAttribute(\n \"class\",\n \"svg-pan-zoom-control-element\"\n );\n resetPanZoomControl.appendChild(resetPanZoomControlShape2);\n\n return resetPanZoomControl;\n },\n\n _createZoomOut: function(instance) {\n // zoom out\n var zoomOut = document.createElementNS(SvgUtils.svgNS, \"g\");\n zoomOut.setAttribute(\"id\", \"svg-pan-zoom-zoom-out\");\n zoomOut.setAttribute(\"transform\", \"translate(30.5 70) scale(0.015)\");\n zoomOut.setAttribute(\"class\", \"svg-pan-zoom-control\");\n zoomOut.addEventListener(\n \"click\",\n function() {\n instance.getPublicInstance().zoomOut();\n },\n false\n );\n zoomOut.addEventListener(\n \"touchstart\",\n function() {\n instance.getPublicInstance().zoomOut();\n },\n false\n );\n\n var zoomOutBackground = document.createElementNS(SvgUtils.svgNS, \"rect\"); // TODO change these background space fillers to rounded rectangles so they look prettier\n zoomOutBackground.setAttribute(\"x\", \"0\");\n zoomOutBackground.setAttribute(\"y\", \"0\");\n zoomOutBackground.setAttribute(\"width\", \"1500\"); // larger than expected because the whole group is transformed to scale down\n zoomOutBackground.setAttribute(\"height\", \"1400\");\n zoomOutBackground.setAttribute(\"class\", \"svg-pan-zoom-control-background\");\n zoomOut.appendChild(zoomOutBackground);\n\n var zoomOutShape = document.createElementNS(SvgUtils.svgNS, \"path\");\n zoomOutShape.setAttribute(\n \"d\",\n \"M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z\"\n );\n zoomOutShape.setAttribute(\"class\", \"svg-pan-zoom-control-element\");\n zoomOut.appendChild(zoomOutShape);\n\n return zoomOut;\n },\n\n disable: function(instance) {\n if (instance.controlIcons) {\n instance.controlIcons.parentNode.removeChild(instance.controlIcons);\n instance.controlIcons = null;\n }\n }\n};\n","var SvgUtils = require(\"./svg-utilities\"),\n Utils = require(\"./utilities\");\n\nvar ShadowViewport = function(viewport, options) {\n this.init(viewport, options);\n};\n\n/**\n * Initialization\n *\n * @param {SVGElement} viewport\n * @param {Object} options\n */\nShadowViewport.prototype.init = function(viewport, options) {\n // DOM Elements\n this.viewport = viewport;\n this.options = options;\n\n // State cache\n this.originalState = { zoom: 1, x: 0, y: 0 };\n this.activeState = { zoom: 1, x: 0, y: 0 };\n\n this.updateCTMCached = Utils.proxy(this.updateCTM, this);\n\n // Create a custom requestAnimationFrame taking in account refreshRate\n this.requestAnimationFrame = Utils.createRequestAnimationFrame(\n this.options.refreshRate\n );\n\n // ViewBox\n this.viewBox = { x: 0, y: 0, width: 0, height: 0 };\n this.cacheViewBox();\n\n // Process CTM\n var newCTM = this.processCTM();\n\n // Update viewport CTM and cache zoom and pan\n this.setCTM(newCTM);\n\n // Update CTM in this frame\n this.updateCTM();\n};\n\n/**\n * Cache initial viewBox value\n * If no viewBox is defined, then use viewport size/position instead for viewBox values\n */\nShadowViewport.prototype.cacheViewBox = function() {\n var svgViewBox = this.options.svg.getAttribute(\"viewBox\");\n\n if (svgViewBox) {\n var viewBoxValues = svgViewBox\n .split(/[\\s\\,]/)\n .filter(function(v) {\n return v;\n })\n .map(parseFloat);\n\n // Cache viewbox x and y offset\n this.viewBox.x = viewBoxValues[0];\n this.viewBox.y = viewBoxValues[1];\n this.viewBox.width = viewBoxValues[2];\n this.viewBox.height = viewBoxValues[3];\n\n var zoom = Math.min(\n this.options.width / this.viewBox.width,\n this.options.height / this.viewBox.height\n );\n\n // Update active state\n this.activeState.zoom = zoom;\n this.activeState.x = (this.options.width - this.viewBox.width * zoom) / 2;\n this.activeState.y = (this.options.height - this.viewBox.height * zoom) / 2;\n\n // Force updating CTM\n this.updateCTMOnNextFrame();\n\n this.options.svg.removeAttribute(\"viewBox\");\n } else {\n this.simpleViewBoxCache();\n }\n};\n\n/**\n * Recalculate viewport sizes and update viewBox cache\n */\nShadowViewport.prototype.simpleViewBoxCache = function() {\n var bBox = this.viewport.getBBox();\n\n this.viewBox.x = bBox.x;\n this.viewBox.y = bBox.y;\n this.viewBox.width = bBox.width;\n this.viewBox.height = bBox.height;\n};\n\n/**\n * Returns a viewbox object. Safe to alter\n *\n * @return {Object} viewbox object\n */\nShadowViewport.prototype.getViewBox = function() {\n return Utils.extend({}, this.viewBox);\n};\n\n/**\n * Get initial zoom and pan values. Save them into originalState\n * Parses viewBox attribute to alter initial sizes\n *\n * @return {CTM} CTM object based on options\n */\nShadowViewport.prototype.processCTM = function() {\n var newCTM = this.getCTM();\n\n if (this.options.fit || this.options.contain) {\n var newScale;\n if (this.options.fit) {\n newScale = Math.min(\n this.options.width / this.viewBox.width,\n this.options.height / this.viewBox.height\n );\n } else {\n newScale = Math.max(\n this.options.width / this.viewBox.width,\n this.options.height / this.viewBox.height\n );\n }\n\n newCTM.a = newScale; //x-scale\n newCTM.d = newScale; //y-scale\n newCTM.e = -this.viewBox.x * newScale; //x-transform\n newCTM.f = -this.viewBox.y * newScale; //y-transform\n }\n\n if (this.options.center) {\n var offsetX =\n (this.options.width -\n (this.viewBox.width + this.viewBox.x * 2) * newCTM.a) *\n 0.5,\n offsetY =\n (this.options.height -\n (this.viewBox.height + this.viewBox.y * 2) * newCTM.a) *\n 0.5;\n\n newCTM.e = offsetX;\n newCTM.f = offsetY;\n }\n\n // Cache initial values. Based on activeState and fix+center opitons\n this.originalState.zoom = newCTM.a;\n this.originalState.x = newCTM.e;\n this.originalState.y = newCTM.f;\n\n return newCTM;\n};\n\n/**\n * Return originalState object. Safe to alter\n *\n * @return {Object}\n */\nShadowViewport.prototype.getOriginalState = function() {\n return Utils.extend({}, this.originalState);\n};\n\n/**\n * Return actualState object. Safe to alter\n *\n * @return {Object}\n */\nShadowViewport.prototype.getState = function() {\n return Utils.extend({}, this.activeState);\n};\n\n/**\n * Get zoom scale\n *\n * @return {Float} zoom scale\n */\nShadowViewport.prototype.getZoom = function() {\n return this.activeState.zoom;\n};\n\n/**\n * Get zoom scale for pubilc usage\n *\n * @return {Float} zoom scale\n */\nShadowViewport.prototype.getRelativeZoom = function() {\n return this.activeState.zoom / this.originalState.zoom;\n};\n\n/**\n * Compute zoom scale for pubilc usage\n *\n * @return {Float} zoom scale\n */\nShadowViewport.prototype.computeRelativeZoom = function(scale) {\n return scale / this.originalState.zoom;\n};\n\n/**\n * Get pan\n *\n * @return {Object}\n */\nShadowViewport.prototype.getPan = function() {\n return { x: this.activeState.x, y: this.activeState.y };\n};\n\n/**\n * Return cached viewport CTM value that can be safely modified\n *\n * @return {SVGMatrix}\n */\nShadowViewport.prototype.getCTM = function() {\n var safeCTM = this.options.svg.createSVGMatrix();\n\n // Copy values manually as in FF they are not itterable\n safeCTM.a = this.activeState.zoom;\n safeCTM.b = 0;\n safeCTM.c = 0;\n safeCTM.d = this.activeState.zoom;\n safeCTM.e = this.activeState.x;\n safeCTM.f = this.activeState.y;\n\n return safeCTM;\n};\n\n/**\n * Set a new CTM\n *\n * @param {SVGMatrix} newCTM\n */\nShadowViewport.prototype.setCTM = function(newCTM) {\n var willZoom = this.isZoomDifferent(newCTM),\n willPan = this.isPanDifferent(newCTM);\n\n if (willZoom || willPan) {\n // Before zoom\n if (willZoom) {\n // If returns false then cancel zooming\n if (\n this.options.beforeZoom(\n this.getRelativeZoom(),\n this.computeRelativeZoom(newCTM.a)\n ) === false\n ) {\n newCTM.a = newCTM.d = this.activeState.zoom;\n willZoom = false;\n } else {\n this.updateCache(newCTM);\n this.options.onZoom(this.getRelativeZoom());\n }\n }\n\n // Before pan\n if (willPan) {\n var preventPan = this.options.beforePan(this.getPan(), {\n x: newCTM.e,\n y: newCTM.f\n }),\n // If prevent pan is an object\n preventPanX = false,\n preventPanY = false;\n\n // If prevent pan is Boolean false\n if (preventPan === false) {\n // Set x and y same as before\n newCTM.e = this.getPan().x;\n newCTM.f = this.getPan().y;\n\n preventPanX = preventPanY = true;\n } else if (Utils.isObject(preventPan)) {\n // Check for X axes attribute\n if (preventPan.x === false) {\n // Prevent panning on x axes\n newCTM.e = this.getPan().x;\n preventPanX = true;\n } else if (Utils.isNumber(preventPan.x)) {\n // Set a custom pan value\n newCTM.e = preventPan.x;\n }\n\n // Check for Y axes attribute\n if (preventPan.y === false) {\n // Prevent panning on x axes\n newCTM.f = this.getPan().y;\n preventPanY = true;\n } else if (Utils.isNumber(preventPan.y)) {\n // Set a custom pan value\n newCTM.f = preventPan.y;\n }\n }\n\n // Update willPan flag\n // Check if newCTM is still different\n if ((preventPanX && preventPanY) || !this.isPanDifferent(newCTM)) {\n willPan = false;\n } else {\n this.updateCache(newCTM);\n this.options.onPan(this.getPan());\n }\n }\n\n // Check again if should zoom or pan\n if (willZoom || willPan) {\n this.updateCTMOnNextFrame();\n }\n }\n};\n\nShadowViewport.prototype.isZoomDifferent = function(newCTM) {\n return this.activeState.zoom !== newCTM.a;\n};\n\nShadowViewport.prototype.isPanDifferent = function(newCTM) {\n return this.activeState.x !== newCTM.e || this.activeState.y !== newCTM.f;\n};\n\n/**\n * Update cached CTM and active state\n *\n * @param {SVGMatrix} newCTM\n */\nShadowViewport.prototype.updateCache = function(newCTM) {\n this.activeState.zoom = newCTM.a;\n this.activeState.x = newCTM.e;\n this.activeState.y = newCTM.f;\n};\n\nShadowViewport.prototype.pendingUpdate = false;\n\n/**\n * Place a request to update CTM on next Frame\n */\nShadowViewport.prototype.updateCTMOnNextFrame = function() {\n if (!this.pendingUpdate) {\n // Lock\n this.pendingUpdate = true;\n\n // Throttle next update\n this.requestAnimationFrame.call(window, this.updateCTMCached);\n }\n};\n\n/**\n * Update viewport CTM with cached CTM\n */\nShadowViewport.prototype.updateCTM = function() {\n var ctm = this.getCTM();\n\n // Updates SVG element\n SvgUtils.setCTM(this.viewport, ctm, this.defs);\n\n // Free the lock\n this.pendingUpdate = false;\n\n // Notify about the update\n if (this.options.onUpdatedCTM) {\n this.options.onUpdatedCTM(ctm);\n }\n};\n\nmodule.exports = function(viewport, options) {\n return new ShadowViewport(viewport, options);\n};\n","var Wheel = require(\"./uniwheel\"),\n ControlIcons = require(\"./control-icons\"),\n Utils = require(\"./utilities\"),\n SvgUtils = require(\"./svg-utilities\"),\n ShadowViewport = require(\"./shadow-viewport\");\n\nvar SvgPanZoom = function(svg, options) {\n this.init(svg, options);\n};\n\nvar optionsDefaults = {\n viewportSelector: \".svg-pan-zoom_viewport\", // Viewport selector. Can be querySelector string or SVGElement\n panEnabled: true, // enable or disable panning (default enabled)\n controlIconsEnabled: false, // insert icons to give user an option in addition to mouse events to control pan/zoom (default disabled)\n zoomEnabled: true, // enable or disable zooming (default enabled)\n dblClickZoomEnabled: true, // enable or disable zooming by double clicking (default enabled)\n mouseWheelZoomEnabled: true, // enable or disable zooming by mouse wheel (default enabled)\n preventMouseEventsDefault: true, // enable or disable preventDefault for mouse events\n zoomScaleSensitivity: 0.1, // Zoom sensitivity\n minZoom: 0.5, // Minimum Zoom level\n maxZoom: 10, // Maximum Zoom level\n fit: true, // enable or disable viewport fit in SVG (default true)\n contain: false, // enable or disable viewport contain the svg (default false)\n center: true, // enable or disable viewport centering in SVG (default true)\n refreshRate: \"auto\", // Maximum number of frames per second (altering SVG's viewport)\n beforeZoom: null,\n onZoom: null,\n beforePan: null,\n onPan: null,\n customEventsHandler: null,\n eventsListenerElement: null,\n onUpdatedCTM: null\n};\n\nvar passiveListenerOption = { passive: true };\n\nSvgPanZoom.prototype.init = function(svg, options) {\n var that = this;\n\n this.svg = svg;\n this.defs = svg.querySelector(\"defs\");\n\n // Add default attributes to SVG\n SvgUtils.setupSvgAttributes(this.svg);\n\n // Set options\n this.options = Utils.extend(Utils.extend({}, optionsDefaults), options);\n\n // Set default state\n this.state = \"none\";\n\n // Get dimensions\n var boundingClientRectNormalized = SvgUtils.getBoundingClientRectNormalized(\n svg\n );\n this.width = boundingClientRectNormalized.width;\n this.height = boundingClientRectNormalized.height;\n\n // Init shadow viewport\n this.viewport = ShadowViewport(\n SvgUtils.getOrCreateViewport(this.svg, this.options.viewportSelector),\n {\n svg: this.svg,\n width: this.width,\n height: this.height,\n fit: this.options.fit,\n contain: this.options.contain,\n center: this.options.center,\n refreshRate: this.options.refreshRate,\n // Put callbacks into functions as they can change through time\n beforeZoom: function(oldScale, newScale) {\n if (that.viewport && that.options.beforeZoom) {\n return that.options.beforeZoom(oldScale, newScale);\n }\n },\n onZoom: function(scale) {\n if (that.viewport && that.options.onZoom) {\n return that.options.onZoom(scale);\n }\n },\n beforePan: function(oldPoint, newPoint) {\n if (that.viewport && that.options.beforePan) {\n return that.options.beforePan(oldPoint, newPoint);\n }\n },\n onPan: function(point) {\n if (that.viewport && that.options.onPan) {\n return that.options.onPan(point);\n }\n },\n onUpdatedCTM: function(ctm) {\n if (that.viewport && that.options.onUpdatedCTM) {\n return that.options.onUpdatedCTM(ctm);\n }\n }\n }\n );\n\n // Wrap callbacks into public API context\n var publicInstance = this.getPublicInstance();\n publicInstance.setBeforeZoom(this.options.beforeZoom);\n publicInstance.setOnZoom(this.options.onZoom);\n publicInstance.setBeforePan(this.options.beforePan);\n publicInstance.setOnPan(this.options.onPan);\n publicInstance.setOnUpdatedCTM(this.options.onUpdatedCTM);\n\n if (this.options.controlIconsEnabled) {\n ControlIcons.enable(this);\n }\n\n // Init events handlers\n this.lastMouseWheelEventTime = Date.now();\n this.setupHandlers();\n};\n\n/**\n * Register event handlers\n */\nSvgPanZoom.prototype.setupHandlers = function() {\n var that = this,\n prevEvt = null; // use for touchstart event to detect double tap\n\n this.eventListeners = {\n // Mouse down group\n mousedown: function(evt) {\n var result = that.handleMouseDown(evt, prevEvt);\n prevEvt = evt;\n return result;\n },\n touchstart: function(evt) {\n var result = that.handleMouseDown(evt, prevEvt);\n prevEvt = evt;\n return result;\n },\n\n // Mouse up group\n mouseup: function(evt) {\n return that.handleMouseUp(evt);\n },\n touchend: function(evt) {\n return that.handleMouseUp(evt);\n },\n\n // Mouse move group\n mousemove: function(evt) {\n return that.handleMouseMove(evt);\n },\n touchmove: function(evt) {\n return that.handleMouseMove(evt);\n },\n\n // Mouse leave group\n mouseleave: function(evt) {\n return that.handleMouseUp(evt);\n },\n touchleave: function(evt) {\n return that.handleMouseUp(evt);\n },\n touchcancel: function(evt) {\n return that.handleMouseUp(evt);\n }\n };\n\n // Init custom events handler if available\n // eslint-disable-next-line eqeqeq\n if (this.options.customEventsHandler != null) {\n this.options.customEventsHandler.init({\n svgElement: this.svg,\n eventsListenerElement: this.options.eventsListenerElement,\n instance: this.getPublicInstance()\n });\n\n // Custom event handler may halt builtin listeners\n var haltEventListeners = this.options.customEventsHandler\n .haltEventListeners;\n if (haltEventListeners && haltEventListeners.length) {\n for (var i = haltEventListeners.length - 1; i >= 0; i--) {\n if (this.eventListeners.hasOwnProperty(haltEventListeners[i])) {\n delete this.eventListeners[haltEventListeners[i]];\n }\n }\n }\n }\n\n // Bind eventListeners\n for (var event in this.eventListeners) {\n // Attach event to eventsListenerElement or SVG if not available\n (this.options.eventsListenerElement || this.svg).addEventListener(\n event,\n this.eventListeners[event],\n !this.options.preventMouseEventsDefault ? passiveListenerOption : false\n );\n }\n\n // Zoom using mouse wheel\n if (this.options.mouseWheelZoomEnabled) {\n this.options.mouseWheelZoomEnabled = false; // set to false as enable will set it back to true\n this.enableMouseWheelZoom();\n }\n};\n\n/**\n * Enable ability to zoom using mouse wheel\n */\nSvgPanZoom.prototype.enableMouseWheelZoom = function() {\n if (!this.options.mouseWheelZoomEnabled) {\n var that = this;\n\n // Mouse wheel listener\n this.wheelListener = function(evt) {\n return that.handleMouseWheel(evt);\n };\n\n // Bind wheelListener\n var isPassiveListener = !this.options.preventMouseEventsDefault;\n Wheel.on(\n this.options.eventsListenerElement || this.svg,\n this.wheelListener,\n isPassiveListener\n );\n\n this.options.mouseWheelZoomEnabled = true;\n }\n};\n\n/**\n * Disable ability to zoom using mouse wheel\n */\nSvgPanZoom.prototype.disableMouseWheelZoom = function() {\n if (this.options.mouseWheelZoomEnabled) {\n var isPassiveListener = !this.options.preventMouseEventsDefault;\n Wheel.off(\n this.options.eventsListenerElement || this.svg,\n this.wheelListener,\n isPassiveListener\n );\n this.options.mouseWheelZoomEnabled = false;\n }\n};\n\n/**\n * Handle mouse wheel event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseWheel = function(evt) {\n if (!this.options.zoomEnabled || this.state !== \"none\") {\n return;\n }\n\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n // Default delta in case that deltaY is not available\n var delta = evt.deltaY || 1,\n timeDelta = Date.now() - this.lastMouseWheelEventTime,\n divider = 3 + Math.max(0, 30 - timeDelta);\n\n // Update cache\n this.lastMouseWheelEventTime = Date.now();\n\n // Make empirical adjustments for browsers that give deltaY in pixels (deltaMode=0)\n if (\"deltaMode\" in evt && evt.deltaMode === 0 && evt.wheelDelta) {\n delta = evt.deltaY === 0 ? 0 : Math.abs(evt.wheelDelta) / evt.deltaY;\n }\n\n delta =\n -0.3 < delta && delta < 0.3\n ? delta\n : ((delta > 0 ? 1 : -1) * Math.log(Math.abs(delta) + 10)) / divider;\n\n var inversedScreenCTM = this.svg.getScreenCTM().inverse(),\n relativeMousePoint = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(\n inversedScreenCTM\n ),\n zoom = Math.pow(1 + this.options.zoomScaleSensitivity, -1 * delta); // multiplying by neg. 1 so as to make zoom in/out behavior match Google maps behavior\n\n this.zoomAtPoint(zoom, relativeMousePoint);\n};\n\n/**\n * Zoom in at a SVG point\n *\n * @param {SVGPoint} point\n * @param {Float} zoomScale Number representing how much to zoom\n * @param {Boolean} zoomAbsolute Default false. If true, zoomScale is treated as an absolute value.\n * Otherwise, zoomScale is treated as a multiplied (e.g. 1.10 would zoom in 10%)\n */\nSvgPanZoom.prototype.zoomAtPoint = function(zoomScale, point, zoomAbsolute) {\n var originalState = this.viewport.getOriginalState();\n\n if (!zoomAbsolute) {\n // Fit zoomScale in set bounds\n if (\n this.getZoom() * zoomScale <\n this.options.minZoom * originalState.zoom\n ) {\n zoomScale = (this.options.minZoom * originalState.zoom) / this.getZoom();\n } else if (\n this.getZoom() * zoomScale >\n this.options.maxZoom * originalState.zoom\n ) {\n zoomScale = (this.options.maxZoom * originalState.zoom) / this.getZoom();\n }\n } else {\n // Fit zoomScale in set bounds\n zoomScale = Math.max(\n this.options.minZoom * originalState.zoom,\n Math.min(this.options.maxZoom * originalState.zoom, zoomScale)\n );\n // Find relative scale to achieve desired scale\n zoomScale = zoomScale / this.getZoom();\n }\n\n var oldCTM = this.viewport.getCTM(),\n relativePoint = point.matrixTransform(oldCTM.inverse()),\n modifier = this.svg\n .createSVGMatrix()\n .translate(relativePoint.x, relativePoint.y)\n .scale(zoomScale)\n .translate(-relativePoint.x, -relativePoint.y),\n newCTM = oldCTM.multiply(modifier);\n\n if (newCTM.a !== oldCTM.a) {\n this.viewport.setCTM(newCTM);\n }\n};\n\n/**\n * Zoom at center point\n *\n * @param {Float} scale\n * @param {Boolean} absolute Marks zoom scale as relative or absolute\n */\nSvgPanZoom.prototype.zoom = function(scale, absolute) {\n this.zoomAtPoint(\n scale,\n SvgUtils.getSvgCenterPoint(this.svg, this.width, this.height),\n absolute\n );\n};\n\n/**\n * Zoom used by public instance\n *\n * @param {Float} scale\n * @param {Boolean} absolute Marks zoom scale as relative or absolute\n */\nSvgPanZoom.prototype.publicZoom = function(scale, absolute) {\n if (absolute) {\n scale = this.computeFromRelativeZoom(scale);\n }\n\n this.zoom(scale, absolute);\n};\n\n/**\n * Zoom at point used by public instance\n *\n * @param {Float} scale\n * @param {SVGPoint|Object} point An object that has x and y attributes\n * @param {Boolean} absolute Marks zoom scale as relative or absolute\n */\nSvgPanZoom.prototype.publicZoomAtPoint = function(scale, point, absolute) {\n if (absolute) {\n // Transform zoom into a relative value\n scale = this.computeFromRelativeZoom(scale);\n }\n\n // If not a SVGPoint but has x and y then create a SVGPoint\n if (Utils.getType(point) !== \"SVGPoint\") {\n if (\"x\" in point && \"y\" in point) {\n point = SvgUtils.createSVGPoint(this.svg, point.x, point.y);\n } else {\n throw new Error(\"Given point is invalid\");\n }\n }\n\n this.zoomAtPoint(scale, point, absolute);\n};\n\n/**\n * Get zoom scale\n *\n * @return {Float} zoom scale\n */\nSvgPanZoom.prototype.getZoom = function() {\n return this.viewport.getZoom();\n};\n\n/**\n * Get zoom scale for public usage\n *\n * @return {Float} zoom scale\n */\nSvgPanZoom.prototype.getRelativeZoom = function() {\n return this.viewport.getRelativeZoom();\n};\n\n/**\n * Compute actual zoom from public zoom\n *\n * @param {Float} zoom\n * @return {Float} zoom scale\n */\nSvgPanZoom.prototype.computeFromRelativeZoom = function(zoom) {\n return zoom * this.viewport.getOriginalState().zoom;\n};\n\n/**\n * Set zoom to initial state\n */\nSvgPanZoom.prototype.resetZoom = function() {\n var originalState = this.viewport.getOriginalState();\n\n this.zoom(originalState.zoom, true);\n};\n\n/**\n * Set pan to initial state\n */\nSvgPanZoom.prototype.resetPan = function() {\n this.pan(this.viewport.getOriginalState());\n};\n\n/**\n * Set pan and zoom to initial state\n */\nSvgPanZoom.prototype.reset = function() {\n this.resetZoom();\n this.resetPan();\n};\n\n/**\n * Handle double click event\n * See handleMouseDown() for alternate detection method\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleDblClick = function(evt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n // Check if target was a control button\n if (this.options.controlIconsEnabled) {\n var targetClass = evt.target.getAttribute(\"class\") || \"\";\n if (targetClass.indexOf(\"svg-pan-zoom-control\") > -1) {\n return false;\n }\n }\n\n var zoomFactor;\n\n if (evt.shiftKey) {\n zoomFactor = 1 / ((1 + this.options.zoomScaleSensitivity) * 2); // zoom out when shift key pressed\n } else {\n zoomFactor = (1 + this.options.zoomScaleSensitivity) * 2;\n }\n\n var point = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(\n this.svg.getScreenCTM().inverse()\n );\n this.zoomAtPoint(zoomFactor, point);\n};\n\n/**\n * Handle click event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseDown = function(evt, prevEvt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n Utils.mouseAndTouchNormalize(evt, this.svg);\n\n // Double click detection; more consistent than ondblclick\n if (this.options.dblClickZoomEnabled && Utils.isDblClick(evt, prevEvt)) {\n this.handleDblClick(evt);\n } else {\n // Pan mode\n this.state = \"pan\";\n this.firstEventCTM = this.viewport.getCTM();\n this.stateOrigin = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(\n this.firstEventCTM.inverse()\n );\n }\n};\n\n/**\n * Handle mouse move event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseMove = function(evt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n if (this.state === \"pan\" && this.options.panEnabled) {\n // Pan mode\n var point = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(\n this.firstEventCTM.inverse()\n ),\n viewportCTM = this.firstEventCTM.translate(\n point.x - this.stateOrigin.x,\n point.y - this.stateOrigin.y\n );\n\n this.viewport.setCTM(viewportCTM);\n }\n};\n\n/**\n * Handle mouse button release event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseUp = function(evt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n if (this.state === \"pan\") {\n // Quit pan mode\n this.state = \"none\";\n }\n};\n\n/**\n * Adjust viewport size (only) so it will fit in SVG\n * Does not center image\n */\nSvgPanZoom.prototype.fit = function() {\n var viewBox = this.viewport.getViewBox(),\n newScale = Math.min(\n this.width / viewBox.width,\n this.height / viewBox.height\n );\n\n this.zoom(newScale, true);\n};\n\n/**\n * Adjust viewport size (only) so it will contain the SVG\n * Does not center image\n */\nSvgPanZoom.prototype.contain = function() {\n var viewBox = this.viewport.getViewBox(),\n newScale = Math.max(\n this.width / viewBox.width,\n this.height / viewBox.height\n );\n\n this.zoom(newScale, true);\n};\n\n/**\n * Adjust viewport pan (only) so it will be centered in SVG\n * Does not zoom/fit/contain image\n */\nSvgPanZoom.prototype.center = function() {\n var viewBox = this.viewport.getViewBox(),\n offsetX =\n (this.width - (viewBox.width + viewBox.x * 2) * this.getZoom()) * 0.5,\n offsetY =\n (this.height - (viewBox.height + viewBox.y * 2) * this.getZoom()) * 0.5;\n\n this.getPublicInstance().pan({ x: offsetX, y: offsetY });\n};\n\n/**\n * Update content cached BorderBox\n * Use when viewport contents change\n */\nSvgPanZoom.prototype.updateBBox = function() {\n this.viewport.simpleViewBoxCache();\n};\n\n/**\n * Pan to a rendered position\n *\n * @param {Object} point {x: 0, y: 0}\n */\nSvgPanZoom.prototype.pan = function(point) {\n var viewportCTM = this.viewport.getCTM();\n viewportCTM.e = point.x;\n viewportCTM.f = point.y;\n this.viewport.setCTM(viewportCTM);\n};\n\n/**\n * Relatively pan the graph by a specified rendered position vector\n *\n * @param {Object} point {x: 0, y: 0}\n */\nSvgPanZoom.prototype.panBy = function(point) {\n var viewportCTM = this.viewport.getCTM();\n viewportCTM.e += point.x;\n viewportCTM.f += point.y;\n this.viewport.setCTM(viewportCTM);\n};\n\n/**\n * Get pan vector\n *\n * @return {Object} {x: 0, y: 0}\n */\nSvgPanZoom.prototype.getPan = function() {\n var state = this.viewport.getState();\n\n return { x: state.x, y: state.y };\n};\n\n/**\n * Recalculates cached svg dimensions and controls position\n */\nSvgPanZoom.prototype.resize = function() {\n // Get dimensions\n var boundingClientRectNormalized = SvgUtils.getBoundingClientRectNormalized(\n this.svg\n );\n this.width = boundingClientRectNormalized.width;\n this.height = boundingClientRectNormalized.height;\n\n // Recalculate original state\n var viewport = this.viewport;\n viewport.options.width = this.width;\n viewport.options.height = this.height;\n viewport.processCTM();\n\n // Reposition control icons by re-enabling them\n if (this.options.controlIconsEnabled) {\n this.getPublicInstance().disableControlIcons();\n this.getPublicInstance().enableControlIcons();\n }\n};\n\n/**\n * Unbind mouse events, free callbacks and destroy public instance\n */\nSvgPanZoom.prototype.destroy = function() {\n var that = this;\n\n // Free callbacks\n this.beforeZoom = null;\n this.onZoom = null;\n this.beforePan = null;\n this.onPan = null;\n this.onUpdatedCTM = null;\n\n // Destroy custom event handlers\n // eslint-disable-next-line eqeqeq\n if (this.options.customEventsHandler != null) {\n this.options.customEventsHandler.destroy({\n svgElement: this.svg,\n eventsListenerElement: this.options.eventsListenerElement,\n instance: this.getPublicInstance()\n });\n }\n\n // Unbind eventListeners\n for (var event in this.eventListeners) {\n (this.options.eventsListenerElement || this.svg).removeEventListener(\n event,\n this.eventListeners[event],\n !this.options.preventMouseEventsDefault ? passiveListenerOption : false\n );\n }\n\n // Unbind wheelListener\n this.disableMouseWheelZoom();\n\n // Remove control icons\n this.getPublicInstance().disableControlIcons();\n\n // Reset zoom and pan\n this.reset();\n\n // Remove instance from instancesStore\n instancesStore = instancesStore.filter(function(instance) {\n return instance.svg !== that.svg;\n });\n\n // Delete options and its contents\n delete this.options;\n\n // Delete viewport to make public shadow viewport functions uncallable\n delete this.viewport;\n\n // Destroy public instance and rewrite getPublicInstance\n delete this.publicInstance;\n delete this.pi;\n this.getPublicInstance = function() {\n return null;\n };\n};\n\n/**\n * Returns a public instance object\n *\n * @return {Object} Public instance object\n */\nSvgPanZoom.prototype.getPublicInstance = function() {\n var that = this;\n\n // Create cache\n if (!this.publicInstance) {\n this.publicInstance = this.pi = {\n // Pan\n enablePan: function() {\n that.options.panEnabled = true;\n return that.pi;\n },\n disablePan: function() {\n that.options.panEnabled = false;\n return that.pi;\n },\n isPanEnabled: function() {\n return !!that.options.panEnabled;\n },\n pan: function(point) {\n that.pan(point);\n return that.pi;\n },\n panBy: function(point) {\n that.panBy(point);\n return that.pi;\n },\n getPan: function() {\n return that.getPan();\n },\n // Pan event\n setBeforePan: function(fn) {\n that.options.beforePan =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n setOnPan: function(fn) {\n that.options.onPan =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n // Zoom and Control Icons\n enableZoom: function() {\n that.options.zoomEnabled = true;\n return that.pi;\n },\n disableZoom: function() {\n that.options.zoomEnabled = false;\n return that.pi;\n },\n isZoomEnabled: function() {\n return !!that.options.zoomEnabled;\n },\n enableControlIcons: function() {\n if (!that.options.controlIconsEnabled) {\n that.options.controlIconsEnabled = true;\n ControlIcons.enable(that);\n }\n return that.pi;\n },\n disableControlIcons: function() {\n if (that.options.controlIconsEnabled) {\n that.options.controlIconsEnabled = false;\n ControlIcons.disable(that);\n }\n return that.pi;\n },\n isControlIconsEnabled: function() {\n return !!that.options.controlIconsEnabled;\n },\n // Double click zoom\n enableDblClickZoom: function() {\n that.options.dblClickZoomEnabled = true;\n return that.pi;\n },\n disableDblClickZoom: function() {\n that.options.dblClickZoomEnabled = false;\n return that.pi;\n },\n isDblClickZoomEnabled: function() {\n return !!that.options.dblClickZoomEnabled;\n },\n // Mouse wheel zoom\n enableMouseWheelZoom: function() {\n that.enableMouseWheelZoom();\n return that.pi;\n },\n disableMouseWheelZoom: function() {\n that.disableMouseWheelZoom();\n return that.pi;\n },\n isMouseWheelZoomEnabled: function() {\n return !!that.options.mouseWheelZoomEnabled;\n },\n // Zoom scale and bounds\n setZoomScaleSensitivity: function(scale) {\n that.options.zoomScaleSensitivity = scale;\n return that.pi;\n },\n setMinZoom: function(zoom) {\n that.options.minZoom = zoom;\n return that.pi;\n },\n setMaxZoom: function(zoom) {\n that.options.maxZoom = zoom;\n return that.pi;\n },\n // Zoom event\n setBeforeZoom: function(fn) {\n that.options.beforeZoom =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n setOnZoom: function(fn) {\n that.options.onZoom =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n // Zooming\n zoom: function(scale) {\n that.publicZoom(scale, true);\n return that.pi;\n },\n zoomBy: function(scale) {\n that.publicZoom(scale, false);\n return that.pi;\n },\n zoomAtPoint: function(scale, point) {\n that.publicZoomAtPoint(scale, point, true);\n return that.pi;\n },\n zoomAtPointBy: function(scale, point) {\n that.publicZoomAtPoint(scale, point, false);\n return that.pi;\n },\n zoomIn: function() {\n this.zoomBy(1 + that.options.zoomScaleSensitivity);\n return that.pi;\n },\n zoomOut: function() {\n this.zoomBy(1 / (1 + that.options.zoomScaleSensitivity));\n return that.pi;\n },\n getZoom: function() {\n return that.getRelativeZoom();\n },\n // CTM update\n setOnUpdatedCTM: function(fn) {\n that.options.onUpdatedCTM =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n // Reset\n resetZoom: function() {\n that.resetZoom();\n return that.pi;\n },\n resetPan: function() {\n that.resetPan();\n return that.pi;\n },\n reset: function() {\n that.reset();\n return that.pi;\n },\n // Fit, Contain and Center\n fit: function() {\n that.fit();\n return that.pi;\n },\n contain: function() {\n that.contain();\n return that.pi;\n },\n center: function() {\n that.center();\n return that.pi;\n },\n // Size and Resize\n updateBBox: function() {\n that.updateBBox();\n return that.pi;\n },\n resize: function() {\n that.resize();\n return that.pi;\n },\n getSizes: function() {\n return {\n width: that.width,\n height: that.height,\n realZoom: that.getZoom(),\n viewBox: that.viewport.getViewBox()\n };\n },\n // Destroy\n destroy: function() {\n that.destroy();\n return that.pi;\n }\n };\n }\n\n return this.publicInstance;\n};\n\n/**\n * Stores pairs of instances of SvgPanZoom and SVG\n * Each pair is represented by an object {svg: SVGSVGElement, instance: SvgPanZoom}\n *\n * @type {Array}\n */\nvar instancesStore = [];\n\nvar svgPanZoom = function(elementOrSelector, options) {\n var svg = Utils.getSvg(elementOrSelector);\n\n if (svg === null) {\n return null;\n } else {\n // Look for existent instance\n for (var i = instancesStore.length - 1; i >= 0; i--) {\n if (instancesStore[i].svg === svg) {\n return instancesStore[i].instance.getPublicInstance();\n }\n }\n\n // If instance not found - create one\n instancesStore.push({\n svg: svg,\n instance: new SvgPanZoom(svg, options)\n });\n\n // Return just pushed instance\n return instancesStore[\n instancesStore.length - 1\n ].instance.getPublicInstance();\n }\n};\n\nmodule.exports = svgPanZoom;\n","var Utils = require(\"./utilities\"),\n _browser = \"unknown\";\n\n// http://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser\nif (/*@cc_on!@*/ false || !!document.documentMode) {\n // internet explorer\n _browser = \"ie\";\n}\n\nmodule.exports = {\n svgNS: \"http://www.w3.org/2000/svg\",\n xmlNS: \"http://www.w3.org/XML/1998/namespace\",\n xmlnsNS: \"http://www.w3.org/2000/xmlns/\",\n xlinkNS: \"http://www.w3.org/1999/xlink\",\n evNS: \"http://www.w3.org/2001/xml-events\",\n\n /**\n * Get svg dimensions: width and height\n *\n * @param {SVGSVGElement} svg\n * @return {Object} {width: 0, height: 0}\n */\n getBoundingClientRectNormalized: function(svg) {\n if (svg.clientWidth && svg.clientHeight) {\n return { width: svg.clientWidth, height: svg.clientHeight };\n } else if (!!svg.getBoundingClientRect()) {\n return svg.getBoundingClientRect();\n } else {\n throw new Error(\"Cannot get BoundingClientRect for SVG.\");\n }\n },\n\n /**\n * Gets g element with class of \"viewport\" or creates it if it doesn't exist\n *\n * @param {SVGSVGElement} svg\n * @return {SVGElement} g (group) element\n */\n getOrCreateViewport: function(svg, selector) {\n var viewport = null;\n\n if (Utils.isElement(selector)) {\n viewport = selector;\n } else {\n viewport = svg.querySelector(selector);\n }\n\n // Check if there is just one main group in SVG\n if (!viewport) {\n var childNodes = Array.prototype.slice\n .call(svg.childNodes || svg.children)\n .filter(function(el) {\n return el.nodeName !== \"defs\" && el.nodeName !== \"#text\";\n });\n\n // Node name should be SVGGElement and should have no transform attribute\n // Groups with transform are not used as viewport because it involves parsing of all transform possibilities\n if (\n childNodes.length === 1 &&\n childNodes[0].nodeName === \"g\" &&\n childNodes[0].getAttribute(\"transform\") === null\n ) {\n viewport = childNodes[0];\n }\n }\n\n // If no favorable group element exists then create one\n if (!viewport) {\n var viewportId =\n \"viewport-\" + new Date().toISOString().replace(/\\D/g, \"\");\n viewport = document.createElementNS(this.svgNS, \"g\");\n viewport.setAttribute(\"id\", viewportId);\n\n // Internet Explorer (all versions?) can't use childNodes, but other browsers prefer (require?) using childNodes\n var svgChildren = svg.childNodes || svg.children;\n if (!!svgChildren && svgChildren.length > 0) {\n for (var i = svgChildren.length; i > 0; i--) {\n // Move everything into viewport except defs\n if (svgChildren[svgChildren.length - i].nodeName !== \"defs\") {\n viewport.appendChild(svgChildren[svgChildren.length - i]);\n }\n }\n }\n svg.appendChild(viewport);\n }\n\n // Parse class names\n var classNames = [];\n if (viewport.getAttribute(\"class\")) {\n classNames = viewport.getAttribute(\"class\").split(\" \");\n }\n\n // Set class (if not set already)\n if (!~classNames.indexOf(\"svg-pan-zoom_viewport\")) {\n classNames.push(\"svg-pan-zoom_viewport\");\n viewport.setAttribute(\"class\", classNames.join(\" \"));\n }\n\n return viewport;\n },\n\n /**\n * Set SVG attributes\n *\n * @param {SVGSVGElement} svg\n */\n setupSvgAttributes: function(svg) {\n // Setting default attributes\n svg.setAttribute(\"xmlns\", this.svgNS);\n svg.setAttributeNS(this.xmlnsNS, \"xmlns:xlink\", this.xlinkNS);\n svg.setAttributeNS(this.xmlnsNS, \"xmlns:ev\", this.evNS);\n\n // Needed for Internet Explorer, otherwise the viewport overflows\n if (svg.parentNode !== null) {\n var style = svg.getAttribute(\"style\") || \"\";\n if (style.toLowerCase().indexOf(\"overflow\") === -1) {\n svg.setAttribute(\"style\", \"overflow: hidden; \" + style);\n }\n }\n },\n\n /**\n * How long Internet Explorer takes to finish updating its display (ms).\n */\n internetExplorerRedisplayInterval: 300,\n\n /**\n * Forces the browser to redisplay all SVG elements that rely on an\n * element defined in a 'defs' section. It works globally, for every\n * available defs element on the page.\n * The throttling is intentionally global.\n *\n * This is only needed for IE. It is as a hack to make markers (and 'use' elements?)\n * visible after pan/zoom when there are multiple SVGs on the page.\n * See bug report: https://connect.microsoft.com/IE/feedback/details/781964/\n * also see svg-pan-zoom issue: https://github.com/bumbu/svg-pan-zoom/issues/62\n */\n refreshDefsGlobal: Utils.throttle(\n function() {\n var allDefs = document.querySelectorAll(\"defs\");\n var allDefsCount = allDefs.length;\n for (var i = 0; i < allDefsCount; i++) {\n var thisDefs = allDefs[i];\n thisDefs.parentNode.insertBefore(thisDefs, thisDefs);\n }\n },\n this ? this.internetExplorerRedisplayInterval : null\n ),\n\n /**\n * Sets the current transform matrix of an element\n *\n * @param {SVGElement} element\n * @param {SVGMatrix} matrix CTM\n * @param {SVGElement} defs\n */\n setCTM: function(element, matrix, defs) {\n var that = this,\n s =\n \"matrix(\" +\n matrix.a +\n \",\" +\n matrix.b +\n \",\" +\n matrix.c +\n \",\" +\n matrix.d +\n \",\" +\n matrix.e +\n \",\" +\n matrix.f +\n \")\";\n\n element.setAttributeNS(null, \"transform\", s);\n if (\"transform\" in element.style) {\n element.style.transform = s;\n } else if (\"-ms-transform\" in element.style) {\n element.style[\"-ms-transform\"] = s;\n } else if (\"-webkit-transform\" in element.style) {\n element.style[\"-webkit-transform\"] = s;\n }\n\n // IE has a bug that makes markers disappear on zoom (when the matrix \"a\" and/or \"d\" elements change)\n // see http://stackoverflow.com/questions/17654578/svg-marker-does-not-work-in-ie9-10\n // and http://srndolha.wordpress.com/2013/11/25/svg-line-markers-may-disappear-in-internet-explorer-11/\n if (_browser === \"ie\" && !!defs) {\n // this refresh is intended for redisplaying the SVG during zooming\n defs.parentNode.insertBefore(defs, defs);\n // this refresh is intended for redisplaying the other SVGs on a page when panning a given SVG\n // it is also needed for the given SVG itself, on zoomEnd, if the SVG contains any markers that\n // are located under any other element(s).\n window.setTimeout(function() {\n that.refreshDefsGlobal();\n }, that.internetExplorerRedisplayInterval);\n }\n },\n\n /**\n * Instantiate an SVGPoint object with given event coordinates\n *\n * @param {Event} evt\n * @param {SVGSVGElement} svg\n * @return {SVGPoint} point\n */\n getEventPoint: function(evt, svg) {\n var point = svg.createSVGPoint();\n\n Utils.mouseAndTouchNormalize(evt, svg);\n\n point.x = evt.clientX;\n point.y = evt.clientY;\n\n return point;\n },\n\n /**\n * Get SVG center point\n *\n * @param {SVGSVGElement} svg\n * @return {SVGPoint}\n */\n getSvgCenterPoint: function(svg, width, height) {\n return this.createSVGPoint(svg, width / 2, height / 2);\n },\n\n /**\n * Create a SVGPoint with given x and y\n *\n * @param {SVGSVGElement} svg\n * @param {Number} x\n * @param {Number} y\n * @return {SVGPoint}\n */\n createSVGPoint: function(svg, x, y) {\n var point = svg.createSVGPoint();\n point.x = x;\n point.y = y;\n\n return point;\n }\n};\n","// uniwheel 0.1.2 (customized)\n// A unified cross browser mouse wheel event handler\n// https://github.com/teemualap/uniwheel\n\nmodule.exports = (function(){\n\n //Full details: https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel\n\n var prefix = \"\", _addEventListener, _removeEventListener, support, fns = [];\n var passiveListenerOption = {passive: true};\n var activeListenerOption = {passive: false};\n\n // detect event model\n if ( window.addEventListener ) {\n _addEventListener = \"addEventListener\";\n _removeEventListener = \"removeEventListener\";\n } else {\n _addEventListener = \"attachEvent\";\n _removeEventListener = \"detachEvent\";\n prefix = \"on\";\n }\n\n // detect available wheel event\n support = \"onwheel\" in document.createElement(\"div\") ? \"wheel\" : // Modern browsers support \"wheel\"\n document.onmousewheel !== undefined ? \"mousewheel\" : // Webkit and IE support at least \"mousewheel\"\n \"DOMMouseScroll\"; // let's assume that remaining browsers are older Firefox\n\n\n function createCallback(element,callback) {\n\n var fn = function(originalEvent) {\n\n !originalEvent && ( originalEvent = window.event );\n\n // create a normalized event object\n var event = {\n // keep a ref to the original event object\n originalEvent: originalEvent,\n target: originalEvent.target || originalEvent.srcElement,\n type: \"wheel\",\n deltaMode: originalEvent.type == \"MozMousePixelScroll\" ? 0 : 1,\n deltaX: 0,\n delatZ: 0,\n preventDefault: function() {\n originalEvent.preventDefault ?\n originalEvent.preventDefault() :\n originalEvent.returnValue = false;\n }\n };\n\n // calculate deltaY (and deltaX) according to the event\n if ( support == \"mousewheel\" ) {\n event.deltaY = - 1/40 * originalEvent.wheelDelta;\n // Webkit also support wheelDeltaX\n originalEvent.wheelDeltaX && ( event.deltaX = - 1/40 * originalEvent.wheelDeltaX );\n } else {\n event.deltaY = originalEvent.detail;\n }\n\n // it's time to fire the callback\n return callback( event );\n\n };\n\n fns.push({\n element: element,\n fn: fn,\n });\n\n return fn;\n }\n\n function getCallback(element) {\n for (var i = 0; i < fns.length; i++) {\n if (fns[i].element === element) {\n return fns[i].fn;\n }\n }\n return function(){};\n }\n\n function removeCallback(element) {\n for (var i = 0; i < fns.length; i++) {\n if (fns[i].element === element) {\n return fns.splice(i,1);\n }\n }\n }\n\n function _addWheelListener(elem, eventName, callback, isPassiveListener ) {\n var cb;\n\n if (support === \"wheel\") {\n cb = callback;\n } else {\n cb = createCallback(elem, callback);\n }\n\n elem[_addEventListener](\n prefix + eventName,\n cb,\n isPassiveListener ? passiveListenerOption : activeListenerOption\n );\n }\n\n function _removeWheelListener(elem, eventName, callback, isPassiveListener ) {\n\n var cb;\n\n if (support === \"wheel\") {\n cb = callback;\n } else {\n cb = getCallback(elem);\n }\n\n elem[_removeEventListener](\n prefix + eventName,\n cb,\n isPassiveListener ? passiveListenerOption : activeListenerOption\n );\n\n removeCallback(elem);\n }\n\n function addWheelListener( elem, callback, isPassiveListener ) {\n _addWheelListener(elem, support, callback, isPassiveListener );\n\n // handle MozMousePixelScroll in older Firefox\n if( support == \"DOMMouseScroll\" ) {\n _addWheelListener(elem, \"MozMousePixelScroll\", callback, isPassiveListener );\n }\n }\n\n function removeWheelListener(elem, callback, isPassiveListener){\n _removeWheelListener(elem, support, callback, isPassiveListener);\n\n // handle MozMousePixelScroll in older Firefox\n if( support == \"DOMMouseScroll\" ) {\n _removeWheelListener(elem, \"MozMousePixelScroll\", callback, isPassiveListener);\n }\n }\n\n return {\n on: addWheelListener,\n off: removeWheelListener\n };\n\n})();\n","module.exports = {\n /**\n * Extends an object\n *\n * @param {Object} target object to extend\n * @param {Object} source object to take properties from\n * @return {Object} extended object\n */\n extend: function(target, source) {\n target = target || {};\n for (var prop in source) {\n // Go recursively\n if (this.isObject(source[prop])) {\n target[prop] = this.extend(target[prop], source[prop]);\n } else {\n target[prop] = source[prop];\n }\n }\n return target;\n },\n\n /**\n * Checks if an object is a DOM element\n *\n * @param {Object} o HTML element or String\n * @return {Boolean} returns true if object is a DOM element\n */\n isElement: function(o) {\n return (\n o instanceof HTMLElement ||\n o instanceof SVGElement ||\n o instanceof SVGSVGElement || //DOM2\n (o &&\n typeof o === \"object\" &&\n o !== null &&\n o.nodeType === 1 &&\n typeof o.nodeName === \"string\")\n );\n },\n\n /**\n * Checks if an object is an Object\n *\n * @param {Object} o Object\n * @return {Boolean} returns true if object is an Object\n */\n isObject: function(o) {\n return Object.prototype.toString.call(o) === \"[object Object]\";\n },\n\n /**\n * Checks if variable is Number\n *\n * @param {Integer|Float} n\n * @return {Boolean} returns true if variable is Number\n */\n isNumber: function(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n },\n\n /**\n * Search for an SVG element\n *\n * @param {Object|String} elementOrSelector DOM Element or selector String\n * @return {Object|Null} SVG or null\n */\n getSvg: function(elementOrSelector) {\n var element, svg;\n\n if (!this.isElement(elementOrSelector)) {\n // If selector provided\n if (\n typeof elementOrSelector === \"string\" ||\n elementOrSelector instanceof String\n ) {\n // Try to find the element\n element = document.querySelector(elementOrSelector);\n\n if (!element) {\n throw new Error(\n \"Provided selector did not find any elements. Selector: \" +\n elementOrSelector\n );\n return null;\n }\n } else {\n throw new Error(\"Provided selector is not an HTML object nor String\");\n return null;\n }\n } else {\n element = elementOrSelector;\n }\n\n if (element.tagName.toLowerCase() === \"svg\") {\n svg = element;\n } else {\n if (element.tagName.toLowerCase() === \"object\") {\n svg = element.contentDocument.documentElement;\n } else {\n if (element.tagName.toLowerCase() === \"embed\") {\n svg = element.getSVGDocument().documentElement;\n } else {\n if (element.tagName.toLowerCase() === \"img\") {\n throw new Error(\n 'Cannot script an SVG in an \"img\" element. Please use an \"object\" element or an in-line SVG.'\n );\n } else {\n throw new Error(\"Cannot get SVG.\");\n }\n return null;\n }\n }\n }\n\n return svg;\n },\n\n /**\n * Attach a given context to a function\n * @param {Function} fn Function\n * @param {Object} context Context\n * @return {Function} Function with certain context\n */\n proxy: function(fn, context) {\n return function() {\n return fn.apply(context, arguments);\n };\n },\n\n /**\n * Returns object type\n * Uses toString that returns [object SVGPoint]\n * And than parses object type from string\n *\n * @param {Object} o Any object\n * @return {String} Object type\n */\n getType: function(o) {\n return Object.prototype.toString\n .apply(o)\n .replace(/^\\[object\\s/, \"\")\n .replace(/\\]$/, \"\");\n },\n\n /**\n * If it is a touch event than add clientX and clientY to event object\n *\n * @param {Event} evt\n * @param {SVGSVGElement} svg\n */\n mouseAndTouchNormalize: function(evt, svg) {\n // If no clientX then fallback\n if (evt.clientX === void 0 || evt.clientX === null) {\n // Fallback\n evt.clientX = 0;\n evt.clientY = 0;\n\n // If it is a touch event\n if (evt.touches !== void 0 && evt.touches.length) {\n if (evt.touches[0].clientX !== void 0) {\n evt.clientX = evt.touches[0].clientX;\n evt.clientY = evt.touches[0].clientY;\n } else if (evt.touches[0].pageX !== void 0) {\n var rect = svg.getBoundingClientRect();\n\n evt.clientX = evt.touches[0].pageX - rect.left;\n evt.clientY = evt.touches[0].pageY - rect.top;\n }\n // If it is a custom event\n } else if (evt.originalEvent !== void 0) {\n if (evt.originalEvent.clientX !== void 0) {\n evt.clientX = evt.originalEvent.clientX;\n evt.clientY = evt.originalEvent.clientY;\n }\n }\n }\n },\n\n /**\n * Check if an event is a double click/tap\n * TODO: For touch gestures use a library (hammer.js) that takes in account other events\n * (touchmove and touchend). It should take in account tap duration and traveled distance\n *\n * @param {Event} evt\n * @param {Event} prevEvt Previous Event\n * @return {Boolean}\n */\n isDblClick: function(evt, prevEvt) {\n // Double click detected by browser\n if (evt.detail === 2) {\n return true;\n }\n // Try to compare events\n else if (prevEvt !== void 0 && prevEvt !== null) {\n var timeStampDiff = evt.timeStamp - prevEvt.timeStamp, // should be lower than 250 ms\n touchesDistance = Math.sqrt(\n Math.pow(evt.clientX - prevEvt.clientX, 2) +\n Math.pow(evt.clientY - prevEvt.clientY, 2)\n );\n\n return timeStampDiff < 250 && touchesDistance < 10;\n }\n\n // Nothing found\n return false;\n },\n\n /**\n * Returns current timestamp as an integer\n *\n * @return {Number}\n */\n now:\n Date.now ||\n function() {\n return new Date().getTime();\n },\n\n // From underscore.\n // Returns a function, that, when invoked, will only be triggered at most once\n // during a given window of time. Normally, the throttled function will run\n // as much as it can, without ever going more than once per `wait` duration;\n // but if you'd like to disable the execution on the leading edge, pass\n // `{leading: false}`. To disable execution on the trailing edge, ditto.\n throttle: function(func, wait, options) {\n var that = this;\n var context, args, result;\n var timeout = null;\n var previous = 0;\n if (!options) {\n options = {};\n }\n var later = function() {\n previous = options.leading === false ? 0 : that.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) {\n context = args = null;\n }\n };\n return function() {\n var now = that.now();\n if (!previous && options.leading === false) {\n previous = now;\n }\n var remaining = wait - (now - previous);\n context = this; // eslint-disable-line consistent-this\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n clearTimeout(timeout);\n timeout = null;\n previous = now;\n result = func.apply(context, args);\n if (!timeout) {\n context = args = null;\n }\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n },\n\n /**\n * Create a requestAnimationFrame simulation\n *\n * @param {Number|String} refreshRate\n * @return {Function}\n */\n createRequestAnimationFrame: function(refreshRate) {\n var timeout = null;\n\n // Convert refreshRate to timeout\n if (refreshRate !== \"auto\" && refreshRate < 60 && refreshRate > 1) {\n timeout = Math.floor(1000 / refreshRate);\n }\n\n if (timeout === null) {\n return window.requestAnimationFrame || requestTimeout(33);\n } else {\n return requestTimeout(timeout);\n }\n }\n};\n\n/**\n * Create a callback that will execute after a given timeout\n *\n * @param {Function} timeout\n * @return {Function}\n */\nfunction requestTimeout(timeout) {\n return function(callback) {\n window.setTimeout(callback, timeout);\n };\n}\n","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global.TinyDatePicker = factory());\n}(this, (function () { 'use strict';\n\n /**\n * @file A generic set of mutation-free date functions.\n */\n\n /**\n * now returns the current date without any time values\n *\n * @returns {Date}\n */\n function now() {\n var dt = new Date();\n dt.setHours(0, 0, 0, 0);\n return dt;\n }\n\n /**\n * dateEq compares two dates\n *\n * @param {Date} date1 the first date\n * @param {Date} date2 the second date\n * @returns {boolean}\n */\n function datesEq(date1, date2) {\n return (date1 && date1.toDateString()) === (date2 && date2.toDateString());\n }\n\n /**\n * shiftDay shifts the specified date by n days\n *\n * @param {Date} dt\n * @param {number} n\n * @returns {Date}\n */\n function shiftDay(dt, n) {\n dt = new Date(dt);\n dt.setDate(dt.getDate() + n);\n return dt;\n }\n\n /**\n * shiftMonth shifts the specified date by a specified number of months\n *\n * @param {Date} dt\n * @param {number} n\n * @param {boolean} wrap optional, if true, does not change year\n * value, defaults to false\n * @returns {Date}\n */\n function shiftMonth(dt, n, wrap) {\n dt = new Date(dt);\n\n var dayOfMonth = dt.getDate();\n var month = dt.getMonth() + n;\n\n dt.setDate(1);\n dt.setMonth(wrap ? (12 + month) % 12 : month);\n dt.setDate(dayOfMonth);\n\n // If dayOfMonth = 31, but the target month only has 30 or 29 or whatever...\n // head back to the max of the target month\n if (dt.getDate() < dayOfMonth) {\n dt.setDate(0);\n }\n\n return dt;\n }\n\n /**\n * shiftYear shifts the specified date by n years\n *\n * @param {Date} dt\n * @param {number} n\n * @returns {Date}\n */\n function shiftYear(dt, n) {\n dt = new Date(dt);\n dt.setFullYear(dt.getFullYear() + n);\n return dt;\n }\n\n /**\n * setYear changes the specified date to the specified year\n *\n * @param {Date} dt\n * @param {number} year\n */\n function setYear(dt, year) {\n dt = new Date(dt);\n dt.setFullYear(year);\n return dt;\n }\n\n /**\n * setMonth changes the specified date to the specified month\n *\n * @param {Date} dt\n * @param {number} month\n */\n function setMonth(dt, month) {\n return shiftMonth(dt, month - dt.getMonth());\n }\n\n /**\n * dateOrParse creates a function which, given a date or string, returns a date\n *\n * @param {function} parse the function used to parse strings\n * @returns {function}\n */\n function dateOrParse(parse) {\n return function (dt) {\n return dropTime(typeof dt === 'string' ? parse(dt) : dt);\n };\n }\n\n /**\n * constrainDate returns dt or min/max depending on whether dt is out of bounds (inclusive)\n *\n * @export\n * @param {Date} dt\n * @param {Date} min\n * @param {Date} max\n * @returns {Date}\n */\n function constrainDate(dt, min, max) {\n return (dt < min) ? min :\n (dt > max) ? max :\n dt;\n }\n\n function dropTime(dt) {\n dt = new Date(dt);\n dt.setHours(0, 0, 0, 0);\n return dt;\n }\n\n /**\n * @file Utility functions for function manipulation.\n */\n\n /**\n * bufferFn buffers calls to fn so they only happen every ms milliseconds\n *\n * @param {number} ms number of milliseconds\n * @param {function} fn the function to be buffered\n * @returns {function}\n */\n function bufferFn(ms, fn) {\n var timeout = undefined;\n return function () {\n clearTimeout(timeout);\n timeout = setTimeout(fn, ms);\n };\n }\n\n /**\n * noop is a function which does nothing at all.\n */\n function noop() { }\n\n /**\n * copy properties from object o2 to object o1.\n *\n * @params {Object} o1\n * @params {Object} o2\n * @returns {Object}\n */\n function cp() {\n var args = arguments;\n var o1 = args[0];\n for (var i = 1; i < args.length; ++i) {\n var o2 = args[i] || {};\n for (var key in o2) {\n o1[key] = o2[key];\n }\n }\n return o1;\n }\n\n /**\n * @file Responsible for sanitizing and creating date picker options.\n */\n\n var english = {\n days: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n months: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n today: 'Today',\n clear: 'Clear',\n close: 'Close',\n };\n\n /**\n * DatePickerOptions constructs a new date picker options object, overriding\n * default values with any values specified in opts.\n *\n * @param {DatePickerOptions} opts\n * @returns {DatePickerOptions}\n */\n function DatePickerOptions(opts) {\n opts = opts || {};\n opts = cp(defaults(), opts);\n var parse = dateOrParse(opts.parse);\n opts.lang = cp(english, opts.lang);\n opts.parse = parse;\n opts.inRange = makeInRangeFn(opts);\n opts.min = parse(opts.min || shiftYear(now(), -100));\n opts.max = parse(opts.max || shiftYear(now(), 100));\n opts.hilightedDate = opts.parse(opts.hilightedDate);\n\n return opts;\n }\n\n function defaults() {\n return {\n lang: english,\n\n // Possible values: dp-modal, dp-below, dp-permanent\n mode: 'dp-modal',\n\n // The date to hilight initially if the date picker has no\n // initial value.\n hilightedDate: now(),\n\n format: function (dt) {\n return (dt.getMonth() + 1) + '/' + dt.getDate() + '/' + dt.getFullYear();\n },\n\n parse: function (str) {\n var date = new Date(str);\n return isNaN(date) ? now() : date;\n },\n\n dateClass: function () { },\n\n inRange: function () {\n return true;\n }\n };\n }\n\n function makeInRangeFn(opts) {\n var inRange = opts.inRange; // Cache this version, and return a variant\n\n return function (dt, dp) {\n return inRange(dt, dp) && opts.min <= dt && opts.max >= dt;\n };\n }\n\n /**\n * @file Helper functions for dealing with dom elements.\n */\n\n var Key = {\n left: 37,\n up: 38,\n right: 39,\n down: 40,\n enter: 13,\n esc: 27,\n };\n\n /**\n * on attaches an event handler to the specified element, and returns an\n * off function which can be used to remove the handler.\n *\n * @param {string} evt the name of the event to handle\n * @param {HTMLElement} el the element to attach to\n * @param {function} handler the event handler\n * @returns {function} the off function\n */\n function on(evt, el, handler) {\n el.addEventListener(evt, handler, true);\n\n return function () {\n el.removeEventListener(evt, handler, true);\n };\n }\n\n var CustomEvent = shimCustomEvent();\n\n function shimCustomEvent() {\n var CustomEvent = window.CustomEvent;\n\n if (typeof CustomEvent !== 'function') {\n CustomEvent = function (event, params) {\n params = params || {bubbles: false, cancelable: false, detail: undefined};\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n }\n\n return CustomEvent;\n }\n\n /**\n * @file Manages the calendar / day-picker view.\n */\n\n var dayPicker = {\n onKeyDown: keyDown,\n onClick: {\n 'dp-day': selectDay,\n 'dp-next': gotoNextMonth,\n 'dp-prev': gotoPrevMonth,\n 'dp-today': selectToday,\n 'dp-clear': clear,\n 'dp-close': close,\n 'dp-cal-month': showMonthPicker,\n 'dp-cal-year': showYearPicker,\n },\n render: render\n };\n\n /**\n * view renders the calendar (day picker) as an HTML string.\n *\n * @param {DatePickerContext} context the date picker being rendered\n * @returns {string}\n */\n function render(dp) {\n var opts = dp.opts;\n var lang = opts.lang;\n var state = dp.state;\n var dayNames = lang.days;\n var dayOffset = opts.dayOffset || 0;\n var selectedDate = state.selectedDate;\n var hilightedDate = state.hilightedDate;\n var hilightedMonth = hilightedDate.getMonth();\n var today = now().getTime();\n\n return (\n '
    ' +\n '
    ' +\n '' +\n '' +\n '' +\n '' +\n '
    ' +\n '
    ' +\n dayNames.map(function (name, i) {\n return (\n '' + dayNames[(i + dayOffset) % dayNames.length] + ''\n );\n }).join('') +\n mapDays(hilightedDate, dayOffset, function (date) {\n var isNotInMonth = date.getMonth() !== hilightedMonth;\n var isDisabled = !opts.inRange(date);\n var isToday = date.getTime() === today;\n var className = 'dp-day';\n className += (isNotInMonth ? ' dp-edge-day' : '');\n className += (datesEq(date, hilightedDate) ? ' dp-current' : '');\n className += (datesEq(date, selectedDate) ? ' dp-selected' : '');\n className += (isDisabled ? ' dp-day-disabled' : '');\n className += (isToday ? ' dp-day-today' : '');\n className += ' ' + opts.dateClass(date, dp);\n\n return (\n ''\n );\n }) +\n '
    ' +\n '
    ' +\n '' +\n '' +\n '' +\n '
    ' +\n '
    '\n );\n }\n\n /**\n * keyDown handles the key down event for the day-picker\n *\n * @param {Event} e\n * @param {DatePickerContext} dp\n */\n function keyDown(e, dp) {\n var key = e.keyCode;\n var shiftBy =\n (key === Key.left) ? -1 :\n (key === Key.right) ? 1 :\n (key === Key.up) ? -7 :\n (key === Key.down) ? 7 :\n 0;\n\n if (key === Key.esc) {\n dp.close();\n } else if (shiftBy) {\n e.preventDefault();\n dp.setState({\n hilightedDate: shiftDay(dp.state.hilightedDate, shiftBy)\n });\n }\n }\n\n function selectToday(e, dp) {\n dp.setState({\n selectedDate: now(),\n });\n }\n\n function clear(e, dp) {\n dp.setState({\n selectedDate: null,\n });\n }\n\n function close(e, dp) {\n dp.close();\n }\n\n function showMonthPicker(e, dp) {\n dp.setState({\n view: 'month'\n });\n }\n\n function showYearPicker(e, dp) {\n dp.setState({\n view: 'year'\n });\n }\n\n function gotoNextMonth(e, dp) {\n var hilightedDate = dp.state.hilightedDate;\n dp.setState({\n hilightedDate: shiftMonth(hilightedDate, 1)\n });\n }\n\n function gotoPrevMonth(e, dp) {\n var hilightedDate = dp.state.hilightedDate;\n dp.setState({\n hilightedDate: shiftMonth(hilightedDate, -1)\n });\n }\n\n function selectDay(e, dp) {\n dp.setState({\n selectedDate: new Date(parseInt(e.target.getAttribute('data-date'))),\n });\n }\n\n function mapDays(currentDate, dayOffset, fn) {\n var result = '';\n var iter = new Date(currentDate);\n iter.setDate(1);\n iter.setDate(1 - iter.getDay() + dayOffset);\n\n // If we are showing monday as the 1st of the week,\n // and the monday is the 2nd of the month, the sunday won't\n // show, so we need to shift backwards\n if (dayOffset && iter.getDate() === dayOffset + 1) {\n iter.setDate(dayOffset - 6);\n }\n\n // We are going to have 6 weeks always displayed to keep a consistent\n // calendar size\n for (var day = 0; day < (6 * 7); ++day) {\n result += fn(iter);\n iter.setDate(iter.getDate() + 1);\n }\n\n return result;\n }\n\n /**\n * @file Manages the month-picker view.\n */\n\n var monthPicker = {\n onKeyDown: keyDown$1,\n onClick: {\n 'dp-month': onChooseMonth\n },\n render: render$1\n };\n\n function onChooseMonth(e, dp) {\n dp.setState({\n hilightedDate: setMonth(dp.state.hilightedDate, parseInt(e.target.getAttribute('data-month'))),\n view: 'day',\n });\n }\n\n /**\n * render renders the month picker as an HTML string\n *\n * @param {DatePickerContext} dp the date picker context\n * @returns {string}\n */\n function render$1(dp) {\n var opts = dp.opts;\n var lang = opts.lang;\n var months = lang.months;\n var currentDate = dp.state.hilightedDate;\n var currentMonth = currentDate.getMonth();\n\n return (\n '
    ' +\n months.map(function (month, i) {\n var className = 'dp-month';\n className += (currentMonth === i ? ' dp-current' : '');\n\n return (\n ''\n );\n }).join('') +\n '
    '\n );\n }\n\n /**\n * keyDown handles keydown events that occur in the month picker\n *\n * @param {Event} e\n * @param {DatePickerContext} dp\n */\n function keyDown$1(e, dp) {\n var key = e.keyCode;\n var shiftBy =\n (key === Key.left) ? -1 :\n (key === Key.right) ? 1 :\n (key === Key.up) ? -3 :\n (key === Key.down) ? 3 :\n 0;\n\n if (key === Key.esc) {\n dp.setState({\n view: 'day',\n });\n } else if (shiftBy) {\n e.preventDefault();\n dp.setState({\n hilightedDate: shiftMonth(dp.state.hilightedDate, shiftBy, true)\n });\n }\n }\n\n /**\n * @file Manages the year-picker view.\n */\n\n var yearPicker = {\n render: render$2,\n onKeyDown: keyDown$2,\n onClick: {\n 'dp-year': onChooseYear\n },\n };\n\n /**\n * view renders the year picker as an HTML string.\n *\n * @param {DatePickerContext} dp the date picker context\n * @returns {string}\n */\n function render$2(dp) {\n var state = dp.state;\n var currentYear = state.hilightedDate.getFullYear();\n var selectedYear = state.selectedDate.getFullYear();\n\n return (\n '
    ' +\n mapYears(dp, function (year) {\n var className = 'dp-year';\n className += (year === currentYear ? ' dp-current' : '');\n className += (year === selectedYear ? ' dp-selected' : '');\n\n return (\n ''\n );\n }) +\n '
    '\n );\n }\n\n function onChooseYear(e, dp) {\n dp.setState({\n hilightedDate: setYear(dp.state.hilightedDate, parseInt(e.target.getAttribute('data-year'))),\n view: 'day',\n });\n }\n\n function keyDown$2(e, dp) {\n var key = e.keyCode;\n var opts = dp.opts;\n var shiftBy =\n (key === Key.left || key === Key.up) ? 1 :\n (key === Key.right || key === Key.down) ? -1 :\n 0;\n\n if (key === Key.esc) {\n dp.setState({\n view: 'day',\n });\n } else if (shiftBy) {\n e.preventDefault();\n var shiftedYear = shiftYear(dp.state.hilightedDate, shiftBy);\n\n dp.setState({\n hilightedDate: constrainDate(shiftedYear, opts.min, opts.max),\n });\n }\n }\n\n function mapYears(dp, fn) {\n var result = '';\n var max = dp.opts.max.getFullYear();\n\n for (var i = max; i >= dp.opts.min.getFullYear(); --i) {\n result += fn(i);\n }\n\n return result;\n }\n\n /**\n * @file Defines the base date picker behavior, overridden by various modes.\n */\n\n var views = {\n day: dayPicker,\n year: yearPicker,\n month: monthPicker\n };\n\n function BaseMode(input, emit, opts) {\n var detatchInputEvents; // A function that detaches all events from the input\n var closing = false; // A hack to prevent calendar from re-opening when closing.\n var selectedDate; // The currently selected date\n var dp = {\n // The root DOM element for the date picker, initialized on first open.\n el: undefined,\n opts: opts,\n shouldFocusOnBlur: true,\n shouldFocusOnRender: true,\n state: initialState(),\n adjustPosition: noop,\n containerHTML: '
    ',\n\n attachToDom: function () {\n document.body.appendChild(dp.el);\n },\n\n updateInput: function (selectedDate) {\n var e = new CustomEvent('change', {bubbles: true});\n e.simulated = true;\n input.value = selectedDate ? opts.format(selectedDate) : '';\n input.dispatchEvent(e);\n },\n\n computeSelectedDate: function () {\n return opts.parse(input.value);\n },\n\n currentView: function() {\n return views[dp.state.view];\n },\n\n open: function () {\n if (closing) {\n return;\n }\n\n if (!dp.el) {\n dp.el = createContainerElement(opts, dp.containerHTML);\n attachContainerEvents(dp);\n }\n\n selectedDate = constrainDate(dp.computeSelectedDate(), opts.min, opts.max);\n dp.state.hilightedDate = selectedDate || opts.hilightedDate;\n dp.state.view = 'day';\n\n dp.attachToDom();\n dp.render();\n\n emit('open');\n },\n\n isVisible: function () {\n return !!dp.el && !!dp.el.parentNode;\n },\n\n hasFocus: function () {\n var focused = document.activeElement;\n return dp.el &&\n dp.el.contains(focused) &&\n focused.className.indexOf('dp-focuser') < 0;\n },\n\n shouldHide: function () {\n return dp.isVisible();\n },\n\n close: function (becauseOfBlur) {\n var el = dp.el;\n\n if (!dp.isVisible()) {\n return;\n }\n\n if (el) {\n var parent = el.parentNode;\n parent && parent.removeChild(el);\n }\n\n closing = true;\n\n if (becauseOfBlur && dp.shouldFocusOnBlur) {\n focusInput(input);\n }\n\n // When we close, the input often gains refocus, which\n // can then launch the date picker again, so we buffer\n // a bit and don't show the date picker within N ms of closing\n setTimeout(function() {\n closing = false;\n }, 100);\n\n emit('close');\n },\n\n destroy: function () {\n dp.close();\n detatchInputEvents();\n },\n\n render: function () {\n if (!dp.el || !dp.el.firstChild) {\n return;\n }\n\n var hadFocus = dp.hasFocus();\n var html = dp.currentView().render(dp);\n html && (dp.el.firstChild.innerHTML = html);\n\n dp.adjustPosition();\n\n if (hadFocus || dp.shouldFocusOnRender) {\n focusCurrent(dp);\n }\n },\n\n // Conceptually similar to setState in React, updates\n // the view state and re-renders.\n setState: function (state) {\n for (var key in state) {\n dp.state[key] = state[key];\n }\n\n emit('statechange');\n dp.render();\n },\n };\n\n detatchInputEvents = attachInputEvents(input, dp);\n\n // Builds the initial view state\n // selectedDate is a special case and causes changes to hilightedDate\n // hilightedDate is set on open, so remains undefined initially\n // view is the current view (day, month, year)\n function initialState() {\n return {\n get selectedDate() {\n return selectedDate;\n },\n set selectedDate(dt) {\n if (dt && !opts.inRange(dt)) {\n return;\n }\n\n if (dt) {\n selectedDate = new Date(dt);\n dp.state.hilightedDate = selectedDate;\n } else {\n selectedDate = dt;\n }\n\n dp.updateInput(selectedDate);\n emit('select');\n dp.close();\n },\n view: 'day',\n };\n }\n\n return dp;\n }\n\n function createContainerElement(opts, containerHTML) {\n var el = document.createElement('div');\n\n el.className = opts.mode;\n el.innerHTML = containerHTML;\n\n return el;\n }\n\n function attachInputEvents(input, dp) {\n var bufferShow = bufferFn(5, function () {\n if (dp.shouldHide()) {\n dp.close();\n } else {\n dp.open();\n }\n });\n\n var off = [\n on('blur', input, bufferFn(150, function () {\n if (!dp.hasFocus()) {\n dp.close(true);\n }\n })),\n\n on('mousedown', input, function () {\n if (input === document.activeElement) {\n bufferShow();\n }\n }),\n\n on('focus', input, bufferShow),\n\n on('input', input, function (e) {\n var date = dp.opts.parse(e.target.value);\n isNaN(date) || dp.setState({\n hilightedDate: date\n });\n }),\n ];\n\n // Unregister all events that were registered above.\n return function() {\n off.forEach(function (f) {\n f();\n });\n };\n }\n\n function focusCurrent(dp) {\n var current = dp.el.querySelector('.dp-current');\n return current && current.focus();\n }\n\n function attachContainerEvents(dp) {\n var el = dp.el;\n var calEl = el.querySelector('.dp');\n\n // Hack to get iOS to show active CSS states\n el.ontouchstart = noop;\n\n function onClick(e) {\n e.target.className.split(' ').forEach(function(evt) {\n var handler = dp.currentView().onClick[evt];\n handler && handler(e, dp);\n });\n }\n\n // The calender fires a blur event *every* time we redraw\n // this means we need to buffer the blur event to see if\n // it still has no focus after redrawing, and only then\n // do we return focus to the input. A possible other approach\n // would be to set context.redrawing = true on redraw and\n // set it to false in the blur event.\n on('blur', calEl, bufferFn(150, function () {\n if (!dp.hasFocus()) {\n dp.close(true);\n }\n }));\n\n on('keydown', el, function (e) {\n if (e.keyCode === Key.enter) {\n onClick(e);\n } else {\n dp.currentView().onKeyDown(e, dp);\n }\n });\n\n // If the user clicks in non-focusable space, but\n // still within the date picker, we don't want to\n // hide, so we need to hack some things...\n on('mousedown', calEl, function (e) {\n e.target.focus && e.target.focus(); // IE hack\n if (document.activeElement !== e.target) {\n e.preventDefault();\n focusCurrent(dp);\n }\n });\n\n on('click', el, onClick);\n }\n\n function focusInput(input) {\n // When the modal closes, we need to focus the original input so the\n // user can continue tabbing from where they left off.\n input.focus();\n\n // iOS zonks out if we don't blur the input, so...\n if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {\n input.blur();\n }\n }\n\n /**\n * @file Defines the modal date picker behavior.\n */\n\n function ModalMode(input, emit, opts) {\n var dp = BaseMode(input, emit, opts);\n\n // In modal mode, users really shouldn't be able to type in\n // the input, as all input is done via the calendar.\n input.readonly = true;\n\n // In modal mode, we need to know when the user has tabbed\n // off the end of the calendar, and set focus to the original\n // input. To do this, we add a special element to the DOM.\n // When the user tabs off the bottom of the calendar, they\n // will tab onto this element.\n dp.containerHTML += '.';\n\n return dp;\n }\n\n /**\n * @file Defines the dropdown date picker behavior.\n */\n\n function DropdownMode(input, emit, opts) {\n var dp = BaseMode(input, emit, opts);\n\n dp.shouldFocusOnBlur = false;\n\n Object.defineProperty(dp, 'shouldFocusOnRender', {\n get: function() {\n return input !== document.activeElement;\n }\n });\n\n dp.adjustPosition = function () {\n autoPosition(input, dp);\n };\n\n return dp;\n }\n\n function autoPosition(input, dp) {\n var inputPos = input.getBoundingClientRect();\n var win = window;\n\n adjustCalY(dp, inputPos, win);\n adjustCalX(dp, inputPos, win);\n\n dp.el.style.visibility = '';\n }\n\n function adjustCalX(dp, inputPos, win) {\n var cal = dp.el;\n var scrollLeft = win.pageXOffset;\n var inputLeft = inputPos.left + scrollLeft;\n var maxRight = win.innerWidth + scrollLeft;\n var offsetWidth = cal.offsetWidth;\n var calRight = inputLeft + offsetWidth;\n var shiftedLeft = maxRight - offsetWidth;\n var left = calRight > maxRight && shiftedLeft > 0 ? shiftedLeft : inputLeft;\n\n cal.style.left = left + 'px';\n }\n\n function adjustCalY(dp, inputPos, win) {\n var cal = dp.el;\n var scrollTop = win.pageYOffset;\n var inputTop = scrollTop + inputPos.top;\n var calHeight = cal.offsetHeight;\n var belowTop = inputTop + inputPos.height + 8;\n var aboveTop = inputTop - calHeight - 8;\n var isAbove = (aboveTop > 0 && belowTop + calHeight > scrollTop + win.innerHeight);\n var top = isAbove ? aboveTop : belowTop;\n\n if (cal.classList) {\n cal.classList.toggle('dp-is-above', isAbove);\n cal.classList.toggle('dp-is-below', !isAbove);\n }\n cal.style.top = top + 'px';\n }\n\n /**\n * @file Defines the permanent date picker behavior.\n */\n\n function PermanentMode(root, emit, opts) {\n var dp = BaseMode(root, emit, opts);\n\n dp.close = noop;\n dp.destroy = noop;\n dp.updateInput = noop;\n dp.shouldFocusOnRender = opts.shouldFocusOnRender;\n\n dp.computeSelectedDate = function () {\n return opts.hilightedDate;\n };\n\n dp.attachToDom = function () {\n root.appendChild(dp.el);\n };\n\n dp.open();\n\n return dp;\n }\n\n /**\n * @file Defines the various date picker modes (modal, dropdown, permanent)\n */\n\n function Mode(input, emit, opts) {\n input = input && input.tagName ? input : document.querySelector(input);\n\n if (opts.mode === 'dp-modal') {\n return ModalMode(input, emit, opts);\n }\n\n if (opts.mode === 'dp-below') {\n return DropdownMode(input, emit, opts);\n }\n\n if (opts.mode === 'dp-permanent') {\n return PermanentMode(input, emit, opts);\n }\n }\n\n /**\n * @file Defines simple event emitter behavior.\n */\n\n /**\n * Emitter constructs a new emitter object which has on/off methods.\n *\n * @returns {EventEmitter}\n */\n function Emitter() {\n var handlers = {};\n\n function onOne(name, handler) {\n (handlers[name] = (handlers[name] || [])).push(handler);\n }\n\n function onMany(fns) {\n for (var name in fns) {\n onOne(name, fns[name]);\n }\n }\n\n return {\n on: function (name, handler) {\n if (handler) {\n onOne(name, handler);\n } else {\n onMany(name);\n }\n\n return this;\n },\n\n emit: function (name, arg) {\n (handlers[name] || []).forEach(function (handler) {\n handler(name, arg);\n });\n },\n\n off: function (name, handler) {\n if (!name) {\n handlers = {};\n } else if (!handler) {\n handlers[name] = [];\n } else {\n handlers[name] = (handlers[name] || []).filter(function (h) {\n return h !== handler;\n });\n }\n\n return this;\n }\n };\n }\n\n /**\n * @file The root date picker file, defines public exports for the library.\n */\n\n /**\n * The date picker language configuration\n * @typedef {Object} LangOptions\n * @property {Array.} [days] - Days of the week\n * @property {Array.} [months] - Months of the year\n * @property {string} today - The label for the 'today' button\n * @property {string} close - The label for the 'close' button\n * @property {string} clear - The label for the 'clear' button\n */\n\n /**\n * The configuration options for a date picker.\n *\n * @typedef {Object} DatePickerOptions\n * @property {LangOptions} [lang] - Configures the label text, defaults to English\n * @property {('dp-modal'|'dp-below'|'dp-permanent')} [mode] - The date picker mode, defaults to 'dp-modal'\n * @property {(string|Date)} [hilightedDate] - The date to hilight if no date is selected\n * @property {function(string|Date):Date} [parse] - Parses a date, the complement of the \"format\" function\n * @property {function(Date):string} [format] - Formats a date for displaying to user\n * @property {function(Date):string} [dateClass] - Associates a custom CSS class with a date\n * @property {function(Date):boolean} [inRange] - Indicates whether or not a date is selectable\n * @property {(string|Date)} [min] - The minimum selectable date (inclusive, default 100 years ago)\n * @property {(string|Date)} [max] - The maximum selectable date (inclusive, default 100 years from now)\n */\n\n /**\n * The state values for the date picker\n *\n * @typedef {Object} DatePickerState\n * @property {string} view - The current view 'day' | 'month' | 'year'\n * @property {Date} selectedDate - The date which has been selected by the user\n * @property {Date} hilightedDate - The date which is currently hilighted / active\n */\n\n /**\n * An instance of TinyDatePicker\n *\n * @typedef {Object} DatePicker\n * @property {DatePickerState} state - The values currently displayed.\n * @property {function} on - Adds an event handler\n * @property {function} off - Removes an event handler\n * @property {function} setState - Changes the current state of the date picker\n * @property {function} open - Opens the date picker\n * @property {function} close - Closes the date picker\n * @property {function} destroy - Destroys the date picker (removing all handlers from the input, too)\n */\n\n /**\n * TinyDatePicker constructs a new date picker for the specified input\n *\n * @param {HTMLElement | string} input The input or CSS selector associated with the datepicker\n * @param {DatePickerOptions} opts The options for initializing the date picker\n * @returns {DatePicker}\n */\n function TinyDatePicker(input, opts) {\n var emitter = Emitter();\n var options = DatePickerOptions(opts);\n var mode = Mode(input, emit, options);\n var me = {\n get state() {\n return mode.state;\n },\n on: emitter.on,\n off: emitter.off,\n setState: mode.setState,\n open: mode.open,\n close: mode.close,\n destroy: mode.destroy,\n };\n\n function emit(evt) {\n emitter.emit(evt, me);\n }\n\n return me;\n }\n\n return TinyDatePicker;\n\n})));\n","/*!\n * Unidragger v2.3.0\n * Draggable base class\n * MIT license\n */\n\n/*jshint browser: true, unused: true, undef: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'unipointer/unipointer'\n ], function( Unipointer ) {\n return factory( window, Unipointer );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('unipointer')\n );\n } else {\n // browser global\n window.Unidragger = factory(\n window,\n window.Unipointer\n );\n }\n\n}( window, function factory( window, Unipointer ) {\n\n'use strict';\n\n// -------------------------- Unidragger -------------------------- //\n\nfunction Unidragger() {}\n\n// inherit Unipointer & EvEmitter\nvar proto = Unidragger.prototype = Object.create( Unipointer.prototype );\n\n// ----- bind start ----- //\n\nproto.bindHandles = function() {\n this._bindHandles( true );\n};\n\nproto.unbindHandles = function() {\n this._bindHandles( false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd\n */\nproto._bindHandles = function( isAdd ) {\n // munge isAdd, default to true\n isAdd = isAdd === undefined ? true : isAdd;\n // bind each handle\n var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n var touchAction = isAdd ? this._touchActionValue : '';\n for ( var i=0; i < this.handles.length; i++ ) {\n var handle = this.handles[i];\n this._bindStartEvent( handle, isAdd );\n handle[ bindMethod ]( 'click', this );\n // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n if ( window.PointerEvent ) {\n handle.style.touchAction = touchAction;\n }\n }\n};\n\n// prototype so it can be overwriteable by Flickity\nproto._touchActionValue = 'none';\n\n// ----- start event ----- //\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n // track start event position\n this.pointerDownPointer = pointer;\n\n event.preventDefault();\n this.pointerDownBlur();\n // bind move and end events\n this._bindPostStartEvents( event );\n this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// nodes that have text fields\nvar cursorNodes = {\n TEXTAREA: true,\n INPUT: true,\n SELECT: true,\n OPTION: true,\n};\n\n// input types that do not have text fields\nvar clickTypes = {\n radio: true,\n checkbox: true,\n button: true,\n submit: true,\n image: true,\n file: true,\n};\n\n// dismiss inputs with text fields. flickity#403, flickity#404\nproto.okayPointerDown = function( event ) {\n var isCursorNode = cursorNodes[ event.target.nodeName ];\n var isClickType = clickTypes[ event.target.type ];\n var isOkay = !isCursorNode || isClickType;\n if ( !isOkay ) {\n this._pointerReset();\n }\n return isOkay;\n};\n\n// kludge to blur previously focused input\nproto.pointerDownBlur = function() {\n var focused = document.activeElement;\n // do not blur body for IE10, metafizzy/flickity#117\n var canBlur = focused && focused.blur && focused != document.body;\n if ( canBlur ) {\n focused.blur();\n }\n};\n\n// ----- move event ----- //\n\n/**\n * drag move\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerMove = function( event, pointer ) {\n var moveVector = this._dragPointerMove( event, pointer );\n this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n this._dragMove( event, pointer, moveVector );\n};\n\n// base pointer move logic\nproto._dragPointerMove = function( event, pointer ) {\n var moveVector = {\n x: pointer.pageX - this.pointerDownPointer.pageX,\n y: pointer.pageY - this.pointerDownPointer.pageY\n };\n // start drag if pointer has moved far enough to start drag\n if ( !this.isDragging && this.hasDragStarted( moveVector ) ) {\n this._dragStart( event, pointer );\n }\n return moveVector;\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- end event ----- //\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerUp = function( event, pointer ) {\n this.emitEvent( 'pointerUp', [ event, pointer ] );\n this._dragPointerUp( event, pointer );\n};\n\nproto._dragPointerUp = function( event, pointer ) {\n if ( this.isDragging ) {\n this._dragEnd( event, pointer );\n } else {\n // pointer didn't move enough for drag to start\n this._staticClick( event, pointer );\n }\n};\n\n// -------------------------- drag -------------------------- //\n\n// dragStart\nproto._dragStart = function( event, pointer ) {\n this.isDragging = true;\n // prevent clicks\n this.isPreventingClicks = true;\n this.dragStart( event, pointer );\n};\n\nproto.dragStart = function( event, pointer ) {\n this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\n// dragMove\nproto._dragMove = function( event, pointer, moveVector ) {\n // do not drag if not dragging yet\n if ( !this.isDragging ) {\n return;\n }\n\n this.dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n event.preventDefault();\n this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// dragEnd\nproto._dragEnd = function( event, pointer ) {\n // set flags\n this.isDragging = false;\n // re-enable clicking async\n setTimeout( function() {\n delete this.isPreventingClicks;\n }.bind( this ) );\n\n this.dragEnd( event, pointer );\n};\n\nproto.dragEnd = function( event, pointer ) {\n this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// ----- onclick ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n if ( this.isPreventingClicks ) {\n event.preventDefault();\n }\n};\n\n// ----- staticClick ----- //\n\n// triggered after pointer down & up with no/tiny movement\nproto._staticClick = function( event, pointer ) {\n // ignore emulated mouse up clicks\n if ( this.isIgnoringMouseUp && event.type == 'mouseup' ) {\n return;\n }\n\n this.staticClick( event, pointer );\n\n // set flag for emulated clicks 300ms after touchend\n if ( event.type != 'mouseup' ) {\n this.isIgnoringMouseUp = true;\n // reset flag after 300ms\n setTimeout( function() {\n delete this.isIgnoringMouseUp;\n }.bind( this ), 400 );\n }\n};\n\nproto.staticClick = function( event, pointer ) {\n this.emitEvent( 'staticClick', [ event, pointer ] );\n};\n\n// ----- utils ----- //\n\nUnidragger.getPointerPoint = Unipointer.getPointerPoint;\n\n// ----- ----- //\n\nreturn Unidragger;\n\n}));\n","/*!\n * Unipointer v2.3.0\n * base class for doing one thing with pointer event\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*global define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'ev-emitter/ev-emitter'\n ], function( EvEmitter ) {\n return factory( window, EvEmitter );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('ev-emitter')\n );\n } else {\n // browser global\n window.Unipointer = factory(\n window,\n window.EvEmitter\n );\n }\n\n}( window, function factory( window, EvEmitter ) {\n\n'use strict';\n\nfunction noop() {}\n\nfunction Unipointer() {}\n\n// inherit EvEmitter\nvar proto = Unipointer.prototype = Object.create( EvEmitter.prototype );\n\nproto.bindStartEvent = function( elem ) {\n this._bindStartEvent( elem, true );\n};\n\nproto.unbindStartEvent = function( elem ) {\n this._bindStartEvent( elem, false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd - remove if falsey\n */\nproto._bindStartEvent = function( elem, isAdd ) {\n // munge isAdd, default to true\n isAdd = isAdd === undefined ? true : isAdd;\n var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n\n // default to mouse events\n var startEvent = 'mousedown';\n if ( window.PointerEvent ) {\n // Pointer Events\n startEvent = 'pointerdown';\n } else if ( 'ontouchstart' in window ) {\n // Touch Events. iOS Safari\n startEvent = 'touchstart';\n }\n elem[ bindMethod ]( startEvent, this );\n};\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// returns the touch that we're keeping track of\nproto.getTouch = function( touches ) {\n for ( var i=0; i < touches.length; i++ ) {\n var touch = touches[i];\n if ( touch.identifier == this.pointerIdentifier ) {\n return touch;\n }\n }\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n // dismiss clicks from right or middle buttons\n var button = event.button;\n if ( button && ( button !== 0 && button !== 1 ) ) {\n return;\n }\n this._pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n this._pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n this._pointerDown( event, event );\n};\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto._pointerDown = function( event, pointer ) {\n // dismiss right click and other pointers\n // button = 0 is okay, 1-4 not\n if ( event.button || this.isPointerDown ) {\n return;\n }\n\n this.isPointerDown = true;\n // save pointer identifier to match up touch events\n this.pointerIdentifier = pointer.pointerId !== undefined ?\n // pointerId for pointer events, touch.indentifier for touch events\n pointer.pointerId : pointer.identifier;\n\n this.pointerDown( event, pointer );\n};\n\nproto.pointerDown = function( event, pointer ) {\n this._bindPostStartEvents( event );\n this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// hash of events to be bound after start event\nvar postStartEvents = {\n mousedown: [ 'mousemove', 'mouseup' ],\n touchstart: [ 'touchmove', 'touchend', 'touchcancel' ],\n pointerdown: [ 'pointermove', 'pointerup', 'pointercancel' ],\n};\n\nproto._bindPostStartEvents = function( event ) {\n if ( !event ) {\n return;\n }\n // get proper events to match start event\n var events = postStartEvents[ event.type ];\n // bind events to node\n events.forEach( function( eventName ) {\n window.addEventListener( eventName, this );\n }, this );\n // save these arguments\n this._boundPointerEvents = events;\n};\n\nproto._unbindPostStartEvents = function() {\n // check for _boundEvents, in case dragEnd triggered twice (old IE8 bug)\n if ( !this._boundPointerEvents ) {\n return;\n }\n this._boundPointerEvents.forEach( function( eventName ) {\n window.removeEventListener( eventName, this );\n }, this );\n\n delete this._boundPointerEvents;\n};\n\n// ----- move event ----- //\n\nproto.onmousemove = function( event ) {\n this._pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerMove( event, event );\n }\n};\n\nproto.ontouchmove = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerMove( event, touch );\n }\n};\n\n/**\n * pointer move\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerMove = function( event, pointer ) {\n this.pointerMove( event, pointer );\n};\n\n// public\nproto.pointerMove = function( event, pointer ) {\n this.emitEvent( 'pointerMove', [ event, pointer ] );\n};\n\n// ----- end event ----- //\n\n\nproto.onmouseup = function( event ) {\n this._pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerUp( event, event );\n }\n};\n\nproto.ontouchend = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerUp( event, touch );\n }\n};\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerUp = function( event, pointer ) {\n this._pointerDone();\n this.pointerUp( event, pointer );\n};\n\n// public\nproto.pointerUp = function( event, pointer ) {\n this.emitEvent( 'pointerUp', [ event, pointer ] );\n};\n\n// ----- pointer done ----- //\n\n// triggered on pointer up & pointer cancel\nproto._pointerDone = function() {\n this._pointerReset();\n this._unbindPostStartEvents();\n this.pointerDone();\n};\n\nproto._pointerReset = function() {\n // reset properties\n this.isPointerDown = false;\n delete this.pointerIdentifier;\n};\n\nproto.pointerDone = noop;\n\n// ----- pointer cancel ----- //\n\nproto.onpointercancel = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerCancel( event, event );\n }\n};\n\nproto.ontouchcancel = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerCancel( event, touch );\n }\n};\n\n/**\n * pointer cancel\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerCancel = function( event, pointer ) {\n this._pointerDone();\n this.pointerCancel( event, pointer );\n};\n\n// public\nproto.pointerCancel = function( event, pointer ) {\n this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// ----- ----- //\n\n// utility function for getting x/y coords from event\nUnipointer.getPointerPoint = function( pointer ) {\n return {\n x: pointer.pageX,\n y: pointer.pageY\n };\n};\n\n// ----- ----- //\n\nreturn Unipointer;\n\n}));\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\n/**\n * Finds all elements with a \"data-module-init\" attribute\n * and calls the corresponding script\n */\nfunction initializeModules() {\n var modules = document.querySelectorAll( \"[data-module-init]\" );\n\n for ( var i = 0; i < modules.length; i++ ) {\n var el = modules[ i ];\n var $el = $( el );\n var name = el.getAttribute( \"data-module-init\" );\n\n // Find the module script\n try {\n var Module = require( \"modules/\" + name );\n } catch ( e ) {\n console.log( e.toString() );\n var Module = false;\n }\n\n // Initialize the module with the calling element\n if ( typeof Module === \"function\" && !$el.data( \"module\" ) ) {\n var mod = new Module( el );\n\n // Save module instance to jQuery data\n $( el ).data( \"module\", mod );\n }\n }\n}\n\nmodule.exports = initializeModules;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar initializeModules = require( \"./lib/init-modules.js\" );\n\n$(function() {\n\tinitializeModules();\n});\n"]}