{"version":3,"file":"controllers.js","mappings":"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","sources":["webpack://mixkit/./app/components/components/ sync _controller.js$","webpack://mixkit/./app/javascript/controllers/ sync _controller\\.js$","webpack://mixkit/./node_modules/search-insights/dist/search-insights-browser.mjs","webpack://mixkit/./node_modules/search-insights/index-browser.mjs","webpack://mixkit/./app/components/components/algolia_analytics_controller.js","webpack://mixkit/./app/components/components/analytics/ecommerce_item_events_controller.js","webpack://mixkit/./app/components/components/audio_player_controller.js","webpack://mixkit/./app/components/components/cookiebot_controller.js","webpack://mixkit/./app/components/components/download/button_controller.js","webpack://mixkit/./app/components/components/download/modal_controller.js","webpack://mixkit/./app/components/components/download/video_options_controller.js","webpack://mixkit/./app/components/components/elements/link_controller.js","webpack://mixkit/./app/javascript/lib/elementsToastBanner.js","webpack://mixkit/./app/components/components/elements/toast_banner_controller.js","webpack://mixkit/./app/components/components/elements/video_preview_controller.js","webpack://mixkit/./app/components/components/filter/button_controller.js","webpack://mixkit/./app/components/components/filter/selector_controller.js","webpack://mixkit/./app/components/components/global/google_analytics_3_event_controller.js","webpack://mixkit/./app/components/components/global/header_controller.js","webpack://mixkit/./app/components/components/global/meta_links_controller.js","webpack://mixkit/./app/javascript/lib/originalSource.js","webpack://mixkit/./app/components/components/global/original_source_capture_controller.js","webpack://mixkit/./app/components/components/global/slider_controller.js","webpack://mixkit/./app/components/components/global/sub_navigation/sub_navigation_controller.js","webpack://mixkit/./app/components/components/item_grid/video_player_controller.js","webpack://mixkit/./app/components/components/license/modal_controller.js","webpack://mixkit/./app/components/components/new_search/form_controller.js","webpack://mixkit/./app/components/components/search/form_controller.js","webpack://mixkit/./app/components/components/video_player/video_player_controller.js","webpack://mixkit/./app/javascript/controllers/google_analytics_3_loader_controller.js","webpack://mixkit/./app/javascript/lib/load_script.js","webpack://mixkit/./app/javascript/controllers/google_analytics_controller.js","webpack://mixkit/./app/javascript/controllers/microsoft_clarity_controller.js","webpack://mixkit/./app/javascript/controllers/modal_controller.js","webpack://mixkit/./app/javascript/controllers/read_more_controller.js","webpack://mixkit/./app/javascript/lib/consent.js","webpack://mixkit/./app/javascript/lib/errors.js","webpack://mixkit/./app/javascript/lib/getCookieDomains.js","webpack://mixkit/./app/javascript/lib/googleAnalytics3.js","webpack://mixkit/./app/javascript/lib/linkHelpers.js","webpack://mixkit/./app/javascript/lib/localStorageWrapper.js","webpack://mixkit/../src/index.ts","webpack://mixkit/./node_modules/@envato/cookie-consent/node_modules/js-cookie/src/js.cookie.js","webpack://mixkit/./node_modules/@envato/gtm-analytics/src/defaultConfig.js","webpack://mixkit/./node_modules/@envato/gtm-analytics/src/index.js","webpack://mixkit/./node_modules/@envato/gtm-analytics/src/normalization.js","webpack://mixkit/./node_modules/@envato/gtm-analytics/src/sendAnalyticsEvent.js","webpack://mixkit/./node_modules/@envato/gtm-analytics/src/standardisedClickTracking.js","webpack://mixkit/./node_modules/@envato/gtm-analytics/src/util.js","webpack://mixkit/./node_modules/@hotwired/stimulus/dist/stimulus.js","webpack://mixkit/./node_modules/lodash/_Symbol.js","webpack://mixkit/./node_modules/lodash/_baseGetTag.js","webpack://mixkit/./node_modules/lodash/_baseTrim.js","webpack://mixkit/./node_modules/lodash/_freeGlobal.js","webpack://mixkit/./node_modules/lodash/_getRawTag.js","webpack://mixkit/./node_modules/lodash/_objectToString.js","webpack://mixkit/./node_modules/lodash/_root.js","webpack://mixkit/./node_modules/lodash/_trimmedEndIndex.js","webpack://mixkit/./node_modules/lodash/debounce.js","webpack://mixkit/./node_modules/lodash/isObject.js","webpack://mixkit/./node_modules/lodash/isObjectLike.js","webpack://mixkit/./node_modules/lodash/isSymbol.js","webpack://mixkit/./node_modules/lodash/now.js","webpack://mixkit/./node_modules/lodash/throttle.js","webpack://mixkit/./node_modules/lodash/toNumber.js","webpack://mixkit/./node_modules/stimulus/dist/stimulus.js","webpack://mixkit/./node_modules/tiny-slider/dist/tiny-slider.js","webpack://mixkit/WaveSurfer/webpack/universalModuleDefinition","webpack://mixkit/WaveSurfer/src/drawer.canvasentry.js","webpack://mixkit/WaveSurfer/src/drawer.js","webpack://mixkit/WaveSurfer/src/drawer.multicanvas.js","webpack://mixkit/WaveSurfer/src/mediaelement-webaudio.js","webpack://mixkit/WaveSurfer/src/mediaelement.js","webpack://mixkit/WaveSurfer/src/peakcache.js","webpack://mixkit/WaveSurfer/src/util/absMax.js","webpack://mixkit/WaveSurfer/src/util/clamp.js","webpack://mixkit/WaveSurfer/src/util/fetch.js","webpack://mixkit/WaveSurfer/src/util/frame.js","webpack://mixkit/WaveSurfer/src/util/get-id.js","webpack://mixkit/WaveSurfer/src/util/index.js","webpack://mixkit/WaveSurfer/src/util/max.js","webpack://mixkit/WaveSurfer/src/util/min.js","webpack://mixkit/WaveSurfer/src/util/observer.js","webpack://mixkit/WaveSurfer/src/util/orientation.js","webpack://mixkit/WaveSurfer/src/util/prevent-click.js","webpack://mixkit/WaveSurfer/src/util/request-animation-frame.js","webpack://mixkit/WaveSurfer/src/util/silence-mode.js","webpack://mixkit/WaveSurfer/src/util/style.js","webpack://mixkit/WaveSurfer/src/wavesurfer.js","webpack://mixkit/WaveSurfer/src/webaudio.js","webpack://mixkit/WaveSurfer/node_modules/debounce/index.js","webpack://mixkit/WaveSurfer/webpack/bootstrap","webpack://mixkit/WaveSurfer/webpack/startup","webpack://mixkit/./node_modules/js-cookie/dist/js.cookie.mjs","webpack://mixkit/webpack/bootstrap","webpack://mixkit/webpack/runtime/compat get default export","webpack://mixkit/webpack/runtime/define property getters","webpack://mixkit/webpack/runtime/global","webpack://mixkit/webpack/runtime/hasOwnProperty shorthand","webpack://mixkit/webpack/runtime/make namespace object","webpack://mixkit/./node_modules/stimulus/dist/webpack-helpers.js","webpack://mixkit/./app/javascript/controllers/index.js"],"sourcesContent":["var map = {\n\t\"./algolia_analytics_controller.js\": 3788,\n\t\"./analytics/ecommerce_item_events_controller.js\": 1946,\n\t\"./audio_player_controller.js\": 8557,\n\t\"./cookiebot_controller.js\": 3064,\n\t\"./download/button_controller.js\": 3826,\n\t\"./download/modal_controller.js\": 4169,\n\t\"./download/video_options_controller.js\": 9444,\n\t\"./elements/link_controller.js\": 5575,\n\t\"./elements/toast_banner_controller.js\": 1575,\n\t\"./elements/video_preview_controller.js\": 3889,\n\t\"./filter/button_controller.js\": 9288,\n\t\"./filter/selector_controller.js\": 3711,\n\t\"./global/google_analytics_3_event_controller.js\": 2482,\n\t\"./global/header_controller.js\": 2630,\n\t\"./global/meta_links_controller.js\": 2784,\n\t\"./global/original_source_capture_controller.js\": 1304,\n\t\"./global/slider_controller.js\": 370,\n\t\"./global/sub_navigation/sub_navigation_controller.js\": 2470,\n\t\"./item_grid/video_player_controller.js\": 9955,\n\t\"./license/modal_controller.js\": 4870,\n\t\"./new_search/form_controller.js\": 2691,\n\t\"./search/form_controller.js\": 5708,\n\t\"./video_player/video_player_controller.js\": 6320\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 6484;","var map = {\n\t\"./google_analytics_3_loader_controller.js\": 8171,\n\t\"./google_analytics_controller.js\": 9809,\n\t\"./microsoft_clarity_controller.js\": 8978,\n\t\"./modal_controller.js\": 2400,\n\t\"./read_more_controller.js\": 9931\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 5124;","var version=\"2.17.2\";function extractAdditionalParams(e){return e.reduce(function(e,t){var n=e.events,e=e.additionalParams;return\"index\"in t?{additionalParams:e,events:n.concat([t])}:{events:n,additionalParams:t}},{events:[],additionalParams:void 0})}var supportsCookies=function(){try{return Boolean(navigator.cookieEnabled)}catch(e){return!1}},supportsSendBeacon=function(){try{return Boolean(navigator.sendBeacon)}catch(e){return!1}},supportsXMLHttpRequest=function(){try{return Boolean(XMLHttpRequest)}catch(e){return!1}},supportsNativeFetch=function(){try{return void 0!==fetch}catch(e){return!1}},LocalStorage=function(){};function ensureLocalStorage(){try{var e=\"__test_localStorage__\";return globalThis.localStorage.setItem(e,e),globalThis.localStorage.removeItem(e),globalThis.localStorage}catch(e){}}LocalStorage.get=function(e){var t=null==(t=this.store)?void 0:t.getItem(e);if(!t)return null;try{return JSON.parse(t)}catch(e){return null}},LocalStorage.set=function(t,e){var n;try{null!=(n=this.store)&&n.setItem(t,JSON.stringify(e))}catch(e){console.error(\"Unable to set \"+t+\" in localStorage, storage may be full.\")}},LocalStorage.remove=function(e){var t;null!=(t=this.store)&&t.removeItem(e)},LocalStorage.store=ensureLocalStorage();var STORE=\"AlgoliaObjectQueryCache\",LIMIT=5e3,FREE=1e3;function getCache(){var e;return null!=(e=LocalStorage.get(STORE))?e:{}}function setCache(e){LocalStorage.set(STORE,limited(e))}function limited(e){return Object.keys(e).length>LIMIT?purgeOldest(e):e}function purgeOldest(e){e=Object.entries(e).sort(function(e,t){e=e[1][1];return t[1][1]-e});return e.slice(0,e.length-FREE-1).reduce(function(e,t){var n=t[0],t=t[1];return Object.assign(Object.assign({},e),((e={})[n]=t,e))},{})}function makeKey(e,t){return e+\"_\"+t}function storeQueryForObject(e,t,n){var i=getCache();i[makeKey(e,t)]=[n,Date.now()],setCache(i)}function getQueryForObject(e,t){return getCache()[makeKey(e,t)]}function removeQueryForObjects(t,e){var n=getCache();e.forEach(function(e){delete n[makeKey(t,e)]}),setCache(n)}var isUndefined=function(e){return void 0===e},isNumber=function(e){return\"number\"==typeof e},isFunction=function(e){return\"function\"==typeof e},isPromise=function(e){return\"function\"==typeof(null==e?void 0:e.then)};function getFunctionalInterface(i){return function(e){for(var t=[],n=arguments.length-1;0<n--;)t[n]=arguments[n+1];if(e&&isFunction(i[e]))return i[e].apply(i,t);console.warn(\"The method `\"+e+\"` doesn't exist.\")}}var DEFAULT_ALGOLIA_AGENTS=[\"insights-js (\"+version+\")\",\"insights-js-browser-esm (\"+version+\")\"];function addAlgoliaAgent(e){-1===this._ua.indexOf(e)&&this._ua.push(e)}function getVersion(e){return isFunction(e)&&e(this.version),this.version}function __rest(e,t){var n={};for(r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&\"function\"==typeof Object.getOwnPropertySymbols)for(var i=0,r=Object.getOwnPropertySymbols(e);i<r.length;i++)t.indexOf(r[i])<0&&Object.prototype.propertyIsEnumerable.call(e,r[i])&&(n[r[i]]=e[r[i]]);return n}function addQueryId(e){return e.map(function(i){var r,e;return!isValidEventForQueryIdLookup(i)||(r=[],e=null==(e=i.objectIDs)?void 0:e.map(function(e,t){var n=null==(n=i.objectData)?void 0:n[t];return null!=n&&n.queryID?n:((t=(null!=(t=getQueryForObject(i.index,e))?t:[])[0])&&r.push(e),Object.assign(Object.assign({},n),{queryID:t}))}),0===r.length)?i:Object.assign(Object.assign({},i),{objectData:e,objectIDsWithInferredQueryID:r})})}function isValidEventForQueryIdLookup(e){return!e.queryID&&\"conversion\"===e.eventType}function makeSendEvents(r){return function(e,t){var i=this;if(this._userHasOptedOut)return Promise.resolve(!1);if(!(!isUndefined(this._apiKey)&&!isUndefined(this._appId)||(null==(n=null==t?void 0:t.headers)?void 0:n[\"X-Algolia-Application-Id\"])&&(null==(n=null==t?void 0:t.headers)?void 0:n[\"X-Algolia-API-Key\"])))throw new Error(\"Before calling any methods on the analytics, you first need to call the 'init' function with appId and apiKey parameters or provide custom credentials in additional parameters.\");!this._userToken&&this._anonymousUserToken&&this.setAnonymousUserToken(!0);var n=(null!=t&&t.inferQueryID?addQueryId(e):e).map(function(e){var t=e.filters,n=__rest(e,[\"filters\"]),e=Object.assign(Object.assign({},n),{userToken:null!=(n=null==e?void 0:e.userToken)?n:i._userToken,authenticatedUserToken:null!=(n=null==e?void 0:e.authenticatedUserToken)?n:i._authenticatedUserToken});return isUndefined(t)||(e.filters=t.map(encodeURIComponent)),e});return 0===n.length?Promise.resolve(!1):(e=sendRequest(r,this._ua,this._endpointOrigin,n,this._appId,this._apiKey,null==t?void 0:t.headers),isPromise(e)?e.then(purgePurchased(n)):e)}}function purgePurchased(t){return function(e){return e&&t.filter(function(e){var t=e.eventType,n=e.eventSubtype,e=e.objectIDs;return\"conversion\"===t&&\"purchase\"===n&&(null==e?void 0:e.length)}).forEach(function(e){return removeQueryForObjects(e.index,e.objectIDs)}),e}}function sendRequest(e,t,n,i,r,o,s){var a=(s=void 0===s?{}:s)[\"X-Algolia-Application-Id\"],c=s[\"X-Algolia-API-Key\"],s=__rest(s,[\"X-Algolia-Application-Id\",\"X-Algolia-API-Key\"]),u=Object.assign({\"X-Algolia-Application-Id\":null!=a?a:r,\"X-Algolia-API-Key\":null!=c?c:o,\"X-Algolia-Agent\":encodeURIComponent(t.join(\"; \"))},s);return e(n+\"/1/events?\"+Object.keys(u).map(function(e){return e+\"=\"+u[e]}).join(\"&\"),{events:i})}function createUUID(){return\"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g,function(e){var t=16*Math.random()|0;return(\"x\"===e?t:3&t|8).toString(16)})}var COOKIE_KEY=\"_ALGOLIA\",MONTH=2592e6,setCookie=function(e,t,n){var i=new Date,n=(i.setTime(i.getTime()+n),\"expires=\"+i.toUTCString());document.cookie=e+\"=\"+t+\";\"+n+\";path=/\"},getCookie=function(e){for(var t=e+\"=\",n=document.cookie.split(\";\"),i=0;i<n.length;i++){for(var r=n[i];\" \"===r.charAt(0);)r=r.substring(1);if(0===r.indexOf(t))return r.substring(t.length,r.length)}return\"\"};function setAnonymousUserToken(e){(e=void 0!==e&&e)?this.setUserToken(\"anonymous-\"+createUUID()):supportsCookies()&&((e=getCookie(COOKIE_KEY))&&\"\"!==e&&0===e.indexOf(\"anonymous-\")?this.setUserToken(e):(e=this.setUserToken(\"anonymous-\"+createUUID()),setCookie(COOKIE_KEY,e,this._cookieDuration)))}function setUserToken(e){return this._userToken=e,isFunction(this._onUserTokenChangeCallback)&&this._onUserTokenChangeCallback(this._userToken),this._userToken}function getUserToken(e,t){return isFunction(t)&&t(null,this._userToken),this._userToken}function onUserTokenChange(e,t){this._onUserTokenChangeCallback=e,t&&t.immediate&&isFunction(this._onUserTokenChangeCallback)&&this._onUserTokenChangeCallback(this._userToken)}function setAuthenticatedUserToken(e){return this._authenticatedUserToken=e,isFunction(this._onAuthenticatedUserTokenChangeCallback)&&this._onAuthenticatedUserTokenChangeCallback(this._authenticatedUserToken),this._authenticatedUserToken}function getAuthenticatedUserToken(e,t){return isFunction(t)&&t(null,this._authenticatedUserToken),this._authenticatedUserToken}function onAuthenticatedUserTokenChange(e,t){this._onAuthenticatedUserTokenChangeCallback=e,t&&t.immediate&&isFunction(this._onAuthenticatedUserTokenChangeCallback)&&this._onAuthenticatedUserTokenChangeCallback(this._authenticatedUserToken)}function addEventType(t,e){return e.map(function(e){return Object.assign({eventType:t},e)})}function addEventTypeAndSubtype(t,n,e){return e.map(function(e){return Object.assign({eventType:t,eventSubtype:n},e)})}function clickedObjectIDsAfterSearch(){for(var i=this,e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=extractAdditionalParams(e),r=n.events,n=n.additionalParams;return r.forEach(function(e){var t=e.index,n=e.queryID;return e.objectIDs.forEach(function(e){return!i._userHasOptedOut&&storeQueryForObject(t,e,n)})}),this.sendEvents(addEventType(\"click\",r),n)}function clickedObjectIDs(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=extractAdditionalParams(e),i=n.events,n=n.additionalParams;return this.sendEvents(addEventType(\"click\",i),n)}function clickedFilters(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=extractAdditionalParams(e),i=n.events,n=n.additionalParams;return this.sendEvents(addEventType(\"click\",i),n)}function convertedObjectIDsAfterSearch(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=extractAdditionalParams(e),i=n.events,n=n.additionalParams;return this.sendEvents(addEventType(\"conversion\",i),n)}function addedToCartObjectIDsAfterSearch(){for(var o=this,e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=extractAdditionalParams(e),i=n.events,n=n.additionalParams;return i.forEach(function(e){var n=e.index,i=e.queryID,t=e.objectIDs,r=e.objectData;return t.forEach(function(e,t){t=null!=(t=null==(t=null==r?void 0:r[t])?void 0:t.queryID)?t:i;!o._userHasOptedOut&&t&&storeQueryForObject(n,e,t)})}),this.sendEvents(addEventTypeAndSubtype(\"conversion\",\"addToCart\",i),n)}function purchasedObjectIDsAfterSearch(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=extractAdditionalParams(e),i=n.events,n=n.additionalParams;return this.sendEvents(addEventTypeAndSubtype(\"conversion\",\"purchase\",i),n)}function convertedObjectIDs(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=extractAdditionalParams(e),i=n.events,n=n.additionalParams;return this.sendEvents(addEventType(\"conversion\",i),n)}function addedToCartObjectIDs(){for(var r=this,e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=extractAdditionalParams(e),i=n.events,n=n.additionalParams;return i.forEach(function(e){var n=e.index,t=e.objectIDs,i=e.objectData;return t.forEach(function(e,t){t=null==(t=null==i?void 0:i[t])?void 0:t.queryID;!r._userHasOptedOut&&t&&storeQueryForObject(n,e,t)})}),this.sendEvents(addEventTypeAndSubtype(\"conversion\",\"addToCart\",i),n)}function purchasedObjectIDs(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=extractAdditionalParams(e),i=n.events,n=n.additionalParams;return this.sendEvents(addEventTypeAndSubtype(\"conversion\",\"purchase\",i),n)}function convertedFilters(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=extractAdditionalParams(e),i=n.events,n=n.additionalParams;return this.sendEvents(addEventType(\"conversion\",i),n)}var SUPPORTED_REGIONS=[\"de\",\"us\"];function init(e){var t;if(!isUndefined((e=void 0===e?{}:e).region)&&-1===SUPPORTED_REGIONS.indexOf(e.region))throw new Error(\"optional region is incorrect, please provide either one of: \"+SUPPORTED_REGIONS.join(\", \")+\".\");if(!(isUndefined(e.cookieDuration)||isNumber(e.cookieDuration)&&isFinite(e.cookieDuration)&&Math.floor(e.cookieDuration)===e.cookieDuration))throw new Error(\"optional cookieDuration is incorrect, expected an integer.\");setOptions(this,e,{_userHasOptedOut:Boolean(e.userHasOptedOut),_region:e.region,_host:e.host,_anonymousUserToken:null==(t=e.anonymousUserToken)||t,_useCookie:null!=(t=e.useCookie)&&t,_cookieDuration:e.cookieDuration||6*MONTH}),this._endpointOrigin=this._host||(this._region?\"https://insights.\"+this._region+\".algolia.io\":\"https://insights.algolia.io\"),this._ua=[].concat(DEFAULT_ALGOLIA_AGENTS),e.authenticatedUserToken&&this.setAuthenticatedUserToken(e.authenticatedUserToken),e.userToken?this.setUserToken(e.userToken):this._userToken||this._userHasOptedOut||!this._useCookie||this.setAnonymousUserToken()}function setOptions(e,t,n){var i=t.partial,r=__rest(t,[\"partial\"]);i||Object.assign(e,n),Object.assign(e,Object.keys(r).reduce(function(e,t){return Object.assign(Object.assign({},e),((e={})[\"_\"+t]=r[t],e))},{}))}function viewedObjectIDs(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=extractAdditionalParams(e),i=n.events,n=n.additionalParams;return this.sendEvents(addEventType(\"view\",i),n)}function viewedFilters(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=extractAdditionalParams(e),i=n.events,n=n.additionalParams;return this.sendEvents(addEventType(\"view\",i),n)}var AlgoliaAnalytics=function(e){e=e.requestFn;this._endpointOrigin=\"https://insights.algolia.io\",this._anonymousUserToken=!0,this._userHasOptedOut=!1,this._useCookie=!1,this._cookieDuration=6*MONTH,this._ua=[],this.version=version,this.sendEvents=makeSendEvents(e).bind(this),this.init=init.bind(this),this.addAlgoliaAgent=addAlgoliaAgent.bind(this),this.setUserToken=setUserToken.bind(this),this.setAnonymousUserToken=setAnonymousUserToken.bind(this),this.getUserToken=getUserToken.bind(this),this.onUserTokenChange=onUserTokenChange.bind(this),this.setAuthenticatedUserToken=setAuthenticatedUserToken.bind(this),this.getAuthenticatedUserToken=getAuthenticatedUserToken.bind(this),this.onAuthenticatedUserTokenChange=onAuthenticatedUserTokenChange.bind(this),this.clickedObjectIDsAfterSearch=clickedObjectIDsAfterSearch.bind(this),this.clickedObjectIDs=clickedObjectIDs.bind(this),this.clickedFilters=clickedFilters.bind(this),this.convertedObjectIDsAfterSearch=convertedObjectIDsAfterSearch.bind(this),this.purchasedObjectIDsAfterSearch=purchasedObjectIDsAfterSearch.bind(this),this.addedToCartObjectIDsAfterSearch=addedToCartObjectIDsAfterSearch.bind(this),this.convertedObjectIDs=convertedObjectIDs.bind(this),this.addedToCartObjectIDs=addedToCartObjectIDs.bind(this),this.purchasedObjectIDs=purchasedObjectIDs.bind(this),this.convertedFilters=convertedFilters.bind(this),this.viewedObjectIDs=viewedObjectIDs.bind(this),this.viewedFilters=viewedFilters.bind(this),this.getVersion=getVersion.bind(this)};function createInsightsClient(e){var t,e=getFunctionalInterface(new AlgoliaAnalytics({requestFn:e}));if(\"object\"==typeof window&&!window.AlgoliaAnalyticsObject){for(;t=createUUID(),void 0!==window[t];);window.AlgoliaAnalyticsObject=t,window[window.AlgoliaAnalyticsObject]=e}return e.version=version,e}function processQueue(e){var n,t=e.AlgoliaAnalyticsObject;t&&(n=getFunctionalInterface(this),(e=e[t]).queue=e.queue||[],(t=e.queue).forEach(function(e){var e=[].slice.call(e),t=e[0],e=e.slice(1);n.apply(void 0,[t].concat(e))}),t.push=function(e){var e=[].slice.call(e),t=e[0],e=e.slice(1);n.apply(void 0,[t].concat(e))})}var requestWithXMLHttpRequest=function(r,o){return new Promise(function(e,t){var n=JSON.stringify(o),i=new XMLHttpRequest;i.addEventListener(\"readystatechange\",function(){4===i.readyState&&200===i.status?e(!0):4===i.readyState&&e(!1)}),i.addEventListener(\"error\",function(){return t()}),i.addEventListener(\"timeout\",function(){return e(!1)}),i.open(\"POST\",r),i.setRequestHeader(\"Content-Type\",\"application/json\"),i.send(n)})},requestWithSendBeacon=function(e,t){var n=JSON.stringify(t),n=navigator.sendBeacon(e,n);return Promise.resolve(!!n||requestWithXMLHttpRequest(e,t))},requestWithNativeFetch=function(e,i){return new Promise(function(t,n){fetch(e,{method:\"POST\",body:JSON.stringify(i),headers:{\"Content-Type\":\"application/json\"}}).then(function(e){t(200===e.status)}).catch(function(e){n(e)})})};function getRequesterForBrowser(){if(supportsSendBeacon())return requestWithSendBeacon;if(supportsXMLHttpRequest())return requestWithXMLHttpRequest;if(supportsNativeFetch())return requestWithNativeFetch;throw new Error(\"Could not find a supported HTTP request client in this environment.\")}var entryBrowser=createInsightsClient(getRequesterForBrowser());export{AlgoliaAnalytics,LocalStorage,createInsightsClient,entryBrowser as default,getFunctionalInterface,getRequesterForBrowser,processQueue};\n","export * from \"./dist/search-insights-browser.mjs\";\nimport aa from \"./dist/search-insights-browser.mjs\";\nexport default aa;\n","import { Controller } from '@hotwired/stimulus'\nimport Cookies from 'js-cookie'\nimport { Consent, consented } from 'lib/consent'\nimport algoliaSearchInsights from 'search-insights'\nimport { localStorageSet, localStorageGet } from 'lib/localStorageWrapper'\n\nconst ALGOLIA_CLICKS_LOCAL_STORAGE_KEY = 'algolia-clicks'\nconst THIRTY_MINUTES_IN_MILLISECONDS = 1800000\n\nexport default class extends Controller {\n  static values = {\n    cookieName: String,\n    userToken: String,\n    indexName: String,\n    queryId: String,\n    appId: String,\n    apiKey: String,\n    items: Array\n  }\n\n  initialize () {\n    // Little bind trick allowing our future window.addEventListener to function correctly\n    this.handleCookiebotAcceptDeclineEventAlgoliaAnalytics = this.handleCookiebotAcceptDeclineEventAlgoliaAnalytics.bind(this)\n  }\n\n  connect () {\n    // If for some reason we don't know what cookie name value to use, return early:\n    if (!this.cookieNameValue) return\n\n    // If the user has already set their consent preferences, we can start analytics work straight away.\n    if (consented(Consent.statistics)) {\n      this.initializeAlgoliaSearchAnalytics()\n    }\n\n    // Set up cookiebot event listeners for when the user modifies their consent options:\n    window.addEventListener('CookiebotOnAccept', this.handleCookiebotAcceptDeclineEventAlgoliaAnalytics)\n    window.addEventListener('CookiebotOnDecline', this.handleCookiebotAcceptDeclineEventAlgoliaAnalytics)\n  }\n\n  disconnect () {\n    window.removeEventListener('CookiebotOnAccept', this.handleCookiebotAcceptDeclineEventAlgoliaAnalytics)\n    window.removeEventListener('CookiebotOnDecline', this.handleCookiebotAcceptDeclineEventAlgoliaAnalytics)\n  }\n\n  setUserTokenCookie () {\n    if (!this.userTokenValue) return // Nothing to do here if we don't have a value to store in a cookie.\n\n    const existingCookieValue = this.getUserTokenCookie()\n\n    // If the user already has a user token cookie that differs from the userTokenValue that was rendered on this page,\n    // we want to maintain the existing cookie value and not overwrite it.\n    if (existingCookieValue && existingCookieValue !== this.userTokenValue) return\n\n    // If we're here then either there's no existing cookie, so we want to create one.\n    // OR there is an existing cookie that matches this.userTokenValue, so we want to set it again to bump its expiry date.\n    Cookies.set(this.cookieNameValue, this.userTokenValue, { secure: true, expires: 182 })\n  }\n\n  getUserTokenCookie () {\n    if (consented(Consent.statistics)) {\n      return Cookies.get(this.cookieNameValue)\n    }\n  }\n\n  removeUserTokenCookie () {\n    Cookies.remove(this.cookieNameValue)\n  }\n\n  initializeAlgoliaSearchAnalytics () {\n    // If we've already initialized the Algolia library, don't do it a second time.\n    if (this.algoliaAnalyticsInitialized) return\n\n    this.setUserTokenCookie()\n    const userToken = this.getUserTokenCookie()\n\n    // By this point we should have stored the user's token in a cookie. If we can't read it at this point then either:\n    // a) They've landed on an item page without performing a search, so they don't have a token we can track them with yet, or\n    // b) Their browser settings/extensions are blocking us from reading/writing cookies.\n    // Either way we can't do any tracking on this page, so we just return early.\n    if (!userToken) return\n\n    algoliaSearchInsights('init', {\n      appId: this.appIdValue,\n      apiKey: this.apiKeyValue,\n      useCookie: false,\n      userToken: userToken\n    })\n\n    this.algoliaAnalyticsInitialized = true\n  }\n\n  trackClick (event) {\n    // If we haven't initialized our library yet it probably means the user has opted out via Cookiebot, so we can return early here.\n    if (!this.algoliaAnalyticsInitialized) return\n\n    // Ensure the user has actually clicked on a link before we send the event tracking\n    const clickedLink = event.target.closest('a')\n    if (!clickedLink) return\n\n    const target = event.target.closest('[data-algolia-analytics-object-id]')\n    if (!target) return\n\n    const item = this.findItemByObjectId(target.dataset.algoliaAnalyticsObjectId)\n    if (!item) return\n\n    algoliaSearchInsights('clickedObjectIDsAfterSearch', {\n      eventName: 'Grid click',\n      index: this.indexNameValue,\n      queryID: this.queryIdValue,\n      objectIDs: [item.object_id],\n      positions: [item.position]\n    })\n  }\n\n  storeConversionData (event) {\n    // If we haven't initialized our library yet it probably means the user has opted out via Cookiebot, so we can return early here.\n    if (!this.algoliaAnalyticsInitialized) return\n\n    // Ensure the user has actually clicked on a link before we send the event tracking\n    const clickedLink = event.target.closest('a')\n    if (!clickedLink) return\n\n    const target = event.target.closest('[data-algolia-analytics-object-id]')\n    if (!target) return\n\n    const item = this.findItemByObjectId(target.dataset.algoliaAnalyticsObjectId)\n    if (!item) return\n\n    // We need the \"Object ID\", \"Algolia Index\" and \"Search Query ID\" for item page conversion tracking to work.\n    // However we don't have this information on the item page, and the item page isn't powered by Algolia.\n    // So the only time we have access to all this information is on the \"previous\" search result page, the one the user\n    // clicks to visit the item page.\n    // So when the user clicks on an item in search results, we store some analytics data in local storage that\n    // is then accessible on the item page.\n    // We use a basic local storage \"key\" that both algolia and item pages can compute: `itemType-itemId` example: `video-123`\n    this.localStorageSetWrapperWithExpiry(this.localStorageKeyForItem(item), {\n      queryId: this.queryIdValue,\n      index: this.indexNameValue,\n      objectId: item.object_id\n    })\n  }\n\n  findItemByObjectId (objectId) {\n    return this.itemsValue.find((item) => item.object_id === objectId)\n  }\n\n  localStorageGetWrapper (key) {\n    const allLocalStorageRaw = localStorageGet(ALGOLIA_CLICKS_LOCAL_STORAGE_KEY)\n    if (!allLocalStorageRaw) return\n\n    const allLocalStorageData = JSON.parse(allLocalStorageRaw)\n    if (!allLocalStorageData) return\n\n    return allLocalStorageData[key]\n  }\n\n  localStorageSetWrapperWithExpiry (key, values) {\n    let allLocalStorageRaw = localStorageGet(ALGOLIA_CLICKS_LOCAL_STORAGE_KEY)\n    if (!allLocalStorageRaw) allLocalStorageRaw = '{}'\n\n    let allLocalStorageData = JSON.parse(allLocalStorageRaw)\n    if (!allLocalStorageData) allLocalStorageData = {}\n\n    const timestampForThirtyMinutesAgo = Date.now() - THIRTY_MINUTES_IN_MILLISECONDS\n    // first we remove any expired entries from this object, by looking at their \"createdAt\" data.\n    Object.keys(allLocalStorageData).forEach(existingKey => {\n      if (allLocalStorageData[existingKey].createdAt < timestampForThirtyMinutesAgo) {\n        delete allLocalStorageData[existingKey]\n      }\n    })\n\n    allLocalStorageData[key] = {\n      createdAt: Date.now(),\n      ...values\n    }\n\n    // Write this back to local storage.\n    localStorageSet(ALGOLIA_CLICKS_LOCAL_STORAGE_KEY, JSON.stringify(allLocalStorageData))\n  }\n\n  localStorageKeyForItem (item) {\n    // We build a local storage \"key\" based on the current item type and item id.\n    // This lets us look up the entry by this key that we can compute from the item page.\n    return `${item.item_type}-${item.item_id}`\n  }\n\n  localStorageKeyForElement (element) {\n    // We build a local storage \"key\" based on the current item type and item id.\n    // On the item page, this lets us check localStorage to see if we have any previously-stored data for this item.\n    return `${element.dataset.algoliaAnalyticsItemType}-${element.dataset.algoliaAnalyticsItemId}`\n  }\n\n  trackConversion (event) {\n    // If we haven't initialized our library yet it probably means the user has opted out via Cookiebot, so we can return early here.\n    if (!this.algoliaAnalyticsInitialized) return\n\n    const target = event.target.closest('[data-algolia-analytics-item-id]')\n    if (!target) return\n\n    const algoliaAnalyticsClickData = this.localStorageGetWrapper(this.localStorageKeyForElement(target))\n    if (!algoliaAnalyticsClickData) return\n\n    const { queryId, index, objectId } = algoliaAnalyticsClickData\n\n    algoliaSearchInsights('convertedObjectIDsAfterSearch', {\n      eventName: 'Item download',\n      index: index,\n      queryID: queryId,\n      objectIDs: [objectId]\n    })\n  }\n\n  // When the user has provided statistics consent we can start analytics work.\n  // Or if they've declined, we delete their user token cookie.\n  handleCookiebotAcceptDeclineEventAlgoliaAnalytics () {\n    if (consented(Consent.statistics)) {\n      this.initializeAlgoliaSearchAnalytics()\n    } else {\n      this.removeUserTokenCookie()\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport { sendAnalyticsEvent } from '@envato/gtm-analytics'\n\nexport default class extends Controller {\n  static values = {\n    items: Array\n  }\n\n  connect () {\n    if (document.documentElement.hasAttribute('data-turbo-preview')) return\n\n    // On an item page, we should have a single item and we want to send a `view_item` event on page load.\n    if (this.itemsValue.length === 1) {\n      this.viewItem()\n    }\n  }\n\n  viewItem () {\n    sendAnalyticsEvent({\n      eventName: 'view_item',\n      ecommerce: {\n        items: this.itemsValue\n      }\n    })\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport WaveSurfer from 'wavesurfer.js'\nimport { googleAnalytics3Event } from 'lib/googleAnalytics3'\n\nexport default class extends Controller {\n  static targets = ['wave', 'progress']\n  static values = {\n    waveformUrl: String,\n    previewUrl: String,\n    playing: Boolean,\n    itemIdForGa3Events: String,\n    itemTypeForGa3Events: String,\n    waveColor: String,\n    loaded: Boolean,\n    readDataFromDb: Boolean\n  }\n\n  connect () {\n    // We don't want to do this expensive WaveSurver work on the turbo in-memory cached version.\n    // We wait a few more milliseconds for the network request to load, then we do the real initialization.\n    if (document.documentElement.hasAttribute('data-turbo-preview')) return\n\n    this.handleCleanupOnAnotherPlay = this.handleCleanupOnAnotherPlay.bind(this)\n\n    // All available options are here: https://wavesurfer-js.org/docs/options.html\n    this.wavesurfer = WaveSurfer.create({\n      container: this.waveTarget,\n      barWidth: 1,\n      barHeight: 0.005,\n      barMinHeight: 1,\n      barGap: 2,\n      fillParent: true, // Helps with responsiveness\n      hideScrollbar: true,\n      interact: false,\n      pixelRatio: 2,\n      scrollParent: false,\n      backend: 'MediaElement', // This allows the browser to start playing straight away.\n      normalize: false,\n      waveColor: this.waveColorValue, // We set the opacity in CSS because rgba() doesn't work here\n      progressColor: 'transparent', // Keep all progress transparent so we can style with CSS background slider\n      loaderColor: 'transparent',\n      cursorColor: 'transparent',\n      backgroundColor: 'transparent',\n      responsive: true,\n      autoCenter: true,\n      height: 100\n    })\n\n    // We now do an async fetch and json parse of the waveform data, once we've successfully\n    // obtained the waveform json data we load this instance of wavesurfer.\n    fetch(this.waveformUrlValue).then(apiResult => {\n      apiResult.json().then(jsonResult => {\n        // Successful json waveform is received, time to load this instance of wavesurfer with that data:\n        this.wavesurfer.load(this.previewUrlValue, jsonResult.data, 'none')\n\n        // Hook into wavesurfer ready state, so we can pull out the full MP3 duration.\n        // We could optionally get this from the server side json response but this works too and is less pre-processing.\n        this.wavesurfer.on('ready', () => {\n          this.wavesurfer.backend.params.interact = true\n          this.trackLength = this.wavesurfer.backend.getDuration()\n        })\n\n        // Hook into wavesurfer finish event, when the track has finished playing.\n        // Simply set the state back to paused\n        this.wavesurfer.on('finish', () => {\n          this.playingValue = false\n          this.readDataFromDbValue && this.incrementItemPreviewCount()\n        })\n\n        // Hook into wavesurfer pause event, to capture keyboard pausing.\n        this.wavesurfer.on('pause', () => {\n          this.playingValue = false\n        })\n\n        // Hook into wavesurfer play event, to capture keyboard play button.\n        this.wavesurfer.on('play', () => {\n          this.playingValue = true\n        })\n\n        // Hook into seek event, which happens when user clicks on progress bar to jump ahead/back.\n        // We get a percentage value here which we can use to update our 'progress' state, this allows us to\n        // animate the fancy background colour changing slider with CSS.\n        this.wavesurfer.on('seek', (seekPercentage) => {\n          this.setProgressBar(seekPercentage * 100)\n          if (!this.playingValue) {\n            // If the user has seeked to an audio player that isn't playing, we make it start playing from that pos\n            this.handleTogglePlay()\n          }\n        })\n\n        // Hook into audioprocess event, which fires constantly as the track is played.\n        // We use this to animate the CSS progress background colour of the widget.\n        this.wavesurfer.backend.on('audioprocess', (time) => {\n          this.setProgressBar(parseInt((time / this.trackLength) * 1000, 10) / 10)\n        })\n      }).catch(errorMessage => {\n        // We get here if we receive an invalid JSON from the waveform response\n\n      })\n    }).catch(errorMessage => {\n      // We get here if we receive an invalid API response\n\n    })\n  }\n\n  userInteraction () {\n    // When setting preload to \"none\" we're unable to interact with the audio waveform\n    // If we try to, we get an error: Failed to set the 'currentTime' property on 'HTMLMediaElement'\n    // So we listen for a user interaction on the waveform and treat that the same as a \"play\" button click.\n    if (!this.playingValue) {\n      this.handleTogglePlay()\n    }\n  }\n\n  disconnect () {\n    if (this.wavesurfer) {\n      this.wavesurfer.destroy()\n    }\n    if (window.currentWaveSurferCleanup && window.currentWaveSurferCleanup === this.handleCleanupOnAnotherPlay) {\n      // if we've left a cleanup function on `window`, delete it before the reference to `this` gets stale\n      delete window.currentWaveSurferCleanup\n    }\n  }\n\n  setProgressBar (value) {\n    this.progressTarget.style.left = `${value}%`\n  }\n\n  handleTogglePlay () {\n    if (!this.playingValue) {\n      // The user wants to play this track. First we check if any other AudioPlayers are playing, based on the global window variable:\n      if (window.currentWaveSurferCleanup && window.currentWaveSurferCleanup !== this.handleCleanupOnAnotherPlay) {\n        // if another player was active we tell it to clean up before playing this instance.\n        window.currentWaveSurferCleanup()\n      }\n\n      // Once we've finished (optionally) pausing another player above, we can play this instance of wavesurfer.\n      const playPromise = this.wavesurfer.play()\n      if (playPromise !== undefined) {\n        playPromise.then(_ => {\n          // We now mount this local handleCleanupOnAnotherPlay in window so another instance can pause us if they choose to play.\n          window.currentWaveSurferCleanup = this.handleCleanupOnAnotherPlay\n          if (!this.loadedValue) {\n            this.loadedValue = true\n            this.logAudioPreviewEvent()\n          }\n          this.playingValue = true\n        }).catch((error) => {\n          if (error.name === 'NotAllowedError') {\n            // We ignore these errors caused by certain ios devices.\n            // See: https://rollbar.com/envato/mixkit/items/9981/\n          } else {\n            throw error\n          }\n        })\n      }\n    } else {\n      // The current instance is playing, so we pause it.\n      delete window.currentWaveSurferCleanup\n      if (this.playingValue) {\n        // Only pause if audio is actually playing\n        // Re: https://developers.google.com/web/updates/2017/06/play-request-was-interrupted\n        this.wavesurfer.pause()\n      }\n      this.playingValue = false\n    }\n  }\n\n  /**\n   * This is a function that can be called by ANOTHER AudioPlayer when it decides to take over audio playback.\n   * This function is available in a global window scope, see below for how this is triggered.\n   */\n  handleCleanupOnAnotherPlay () {\n    this.wavesurfer && this.playingValue && this.wavesurfer.pause()\n  }\n\n  logAudioPreviewEvent () {\n    googleAnalytics3Event({\n      eventAction: 'play',\n      eventCategory: `${this.itemTypeForGa3EventsValue} Preview`,\n      eventLabel: this.itemIdForGa3EventsValue\n    })\n  }\n\n  incrementItemPreviewCount () {\n    if (this.itemTypeForGa3EventsValue === 'music' || this.itemTypeForGa3EventsValue === 'sfx') {\n      return fetch('/api/v1/audio_items/increment_preview_count/', {\n        method: 'PATCH',\n        headers: {\n          'Content-Type': 'application/json'\n        },\n        body: JSON.stringify({\n          audio_item_id: this.itemIdForGa3EventsValue,\n          audio_item_type: this.itemTypeForGa3EventsValue\n        })\n      })\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n  openSettings () {\n    if (window.Cookiebot) {\n      window.Cookiebot.renew()\n      window.addEventListener('CookiebotOnLoad', () => window.location.reload())\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport { handleError } from 'lib/errors'\n\nexport default class extends Controller {\n  static values = {\n    modalUrl: String\n  }\n\n  getGlobalModalController () {\n    return this.application.controllers.find(controller => controller.context.identifier === 'modal')\n  }\n\n  openDownloadModal (event) {\n    event.preventDefault()\n\n    // Reach out to the existing other global modal controller\n    const modalController = this.getGlobalModalController()\n\n    // Render modal on the screen\n    modalController.showModal()\n\n    // Fetch the modal content defined in the button data-attribute\n    fetch(this.modalUrlValue)\n      .then(\n        // Extract the modal response message if we get a 200 success\n        response => {\n          if (response.ok) {\n            return response.text()\n          } else {\n            const msg = `Status: ${response.status} while fetching '${this.modalUrlValue}'`\n            throw new Error(msg)\n          }\n        })\n      .then(\n        // Populate our modal with the content from the API response\n        html => modalController.setContentHtml(html))\n      .catch(\n        // If we get a 404 or the network request fails we log the error to rollbar and hide the modal\n        error => {\n          handleError(error)\n          modalController.hideModal()\n        })\n\n    return false\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport { sendAnalyticsEvent } from '@envato/gtm-analytics'\nimport { googleAnalytics3Event } from 'lib/googleAnalytics3'\n\nexport default class extends Controller {\n  static values = {\n    ga3EventAction: String,\n    ga3EventCategory: String,\n    url: String,\n    itemId: String,\n    itemResolution: String,\n    downloadContext: String,\n    elementsItemId: String\n  }\n\n  connect () {\n    this.runDownloadProcess()\n  }\n\n  runDownloadProcess () {\n    googleAnalytics3Event({\n      eventAction: this.ga3EventActionValue,\n      eventCategory: this.ga3EventCategoryValue,\n      eventLabel: this.itemIdValue\n    })\n\n    sendAnalyticsEvent({\n      eventName: 'download',\n      itemId: this.itemIdValue,\n      itemResolution: this.itemResolutionValue,\n      context: this.downloadContextValue,\n      elementsItemId: this.elementsItemIdValue,\n      customConfig: { skipNormalizationForAttributes: ['elementsItemId'] },\n      callback: () => {\n        this.downloadTheFile()\n      }\n    })\n  }\n\n  downloadTheFile () {\n    // This is a function we call to force the browser to download a file.\n    // It's in a timeout to allow the browser to render the modal images correctly\n    setTimeout(() => {\n      window.location.href = this.urlValue\n    }, 500)\n  }\n\n  getGlobalModalController () {\n    return this.application.controllers.find(controller => controller.context.identifier === 'modal')\n  }\n\n  closeModal () {\n    // Reach out to the existing other global modal controller\n    const modalController = this.getGlobalModalController()\n\n    // Hide modal from the screen\n    modalController.hideModal()\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport { handleError } from 'lib/errors'\n\nexport default class extends Controller {\n  static targets = [\n    'downloadOption',\n    'selectedTypeLabel'\n  ]\n\n  connect () {\n    this.updateButtonLabelWithSelectedType()\n  }\n\n  getSelectedDownloadOption () {\n    return this.downloadOptionTargets.find(downloadOption => downloadOption.checked)\n  }\n\n  updateButtonLabelWithSelectedType () {\n    this.selectedTypeLabelTarget.innerHTML = this.getSelectedDownloadOption().dataset.label\n  }\n\n  selectDownloadOption () {\n    this.updateButtonLabelWithSelectedType()\n  }\n\n  getGlobalModalController () {\n    return this.application.controllers.find(controller => controller.context.identifier === 'modal')\n  }\n\n  downloadSelectedOption (event) {\n    event.preventDefault()\n\n    // Reach out to the existing other global modal controller\n    const modalController = this.getGlobalModalController()\n\n    // Render modal on the screen\n    modalController.showModal()\n\n    const modalUrl = this.getSelectedDownloadOption().value\n    // Fetch the modal content defined in the button data-attribute\n    fetch(modalUrl)\n      .then(\n        // Extract the modal response message if we get a 200 success\n        response => {\n          if (response.ok) {\n            return response.text()\n          } else {\n            const msg = `Status: ${response.status} while fetching '${modalUrl}'`\n            throw new Error(msg)\n          }\n        })\n      .then(\n        // Populate our modal with the content from the API response\n        html => modalController.setContentHtml(html))\n      .catch(\n        // If we get a 404 or the network request fails we log the error to rollbar and hide the modal\n        error => {\n          handleError(error)\n          modalController.hideModal()\n        })\n\n    return false\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport { googleAnalytics3Event } from 'lib/googleAnalytics3'\n\nexport default class extends Controller {\n  static values = {\n    campaign: String,\n    uri: String\n  }\n\n  setOriginalSource ({ detail: { originalSource } }) {\n    const anchor = this.element\n    const params = new URLSearchParams(anchor.search)\n\n    if (originalSource) {\n      params.set('utm_content', originalSource)\n    } else {\n      params.delete('utm_content')\n    }\n\n    anchor.search = params.toString()\n  }\n\n  logClickEvent () {\n    googleAnalytics3Event({\n      eventAction: 'Elements Click',\n      eventCategory: this.campaignValue,\n      eventLabel: this.uriValue\n    })\n  }\n}\n","import { localStorageSet, localStorageGet } from 'lib/localStorageWrapper'\n\nconst ELEMENTS_TOAST_BANNER_DISMISSAL_KEY = 'elements-toast-banner-dismissal'\nconst THIRTY_DAYS_IN_MILLISECONDS = 2592000000\n\nexport const shouldDisplayElementsToastBanner = () => {\n  let timestampWhenBannerDismissed = localStorageGet(ELEMENTS_TOAST_BANNER_DISMISSAL_KEY)\n\n  timestampWhenBannerDismissed = parseInt(timestampWhenBannerDismissed)\n  const isBannerNeverBeenDismissed = isNaN(timestampWhenBannerDismissed)\n\n  const timestampForThirtyDaysAgo = Date.now() - THIRTY_DAYS_IN_MILLISECONDS\n  const isBannerDismissedMoreThanThirtyDaysAgo = timestampWhenBannerDismissed < timestampForThirtyDaysAgo\n\n  return isBannerNeverBeenDismissed || isBannerDismissedMoreThanThirtyDaysAgo\n}\n\nexport const markElementsToastBannerDismissed = () => {\n  localStorageSet(ELEMENTS_TOAST_BANNER_DISMISSAL_KEY, Date.now().toString())\n}\n","import { Controller } from '@hotwired/stimulus'\nimport { Consent, deferRun } from 'lib/consent'\nimport { shouldDisplayElementsToastBanner, markElementsToastBannerDismissed } from 'lib/elementsToastBanner'\n\nexport default class extends Controller {\n  static values = {\n    visible: String\n  }\n\n  connect () {\n    deferRun(() => { this._checkLocalStorageAndDisplayBanner() }, Consent.marketing)\n  }\n\n  dismiss () {\n    deferRun(markElementsToastBannerDismissed, Consent.marketing)\n    this.visibleValue = 'false'\n  }\n\n  _checkLocalStorageAndDisplayBanner () {\n    if (shouldDisplayElementsToastBanner()) this._displayBanner()\n  }\n\n  _displayBanner () {\n    this.visibleValue = 'true'\n  }\n}\n","import { Controller } from 'stimulus'\nimport { googleAnalytics3Event } from 'lib/googleAnalytics3'\n\nexport default class extends Controller {\n  static targets = ['video']\n  static values = {\n    loaded: Boolean,\n    itemId: String,\n    itemType: String,\n    playing: Boolean\n  }\n\n  mouseOver () {\n    this.playVideo()\n  }\n\n  mouseOut () {\n    this.pauseVideo()\n  }\n\n  playVideo () {\n    if (this.hasVideoTarget) {\n      const videoPromise = this.videoTarget.play()\n      if (typeof videoPromise !== 'undefined') {\n        videoPromise.then(() => {\n          if (!this.loadedValue) {\n            this.loadedValue = true\n            this.logVideoPreviewEvent()\n          }\n          this.playingValue = true\n        }).catch(() => {})\n      }\n    }\n  }\n\n  pauseVideo () {\n    if (this.hasVideoTarget && this.playingValue) {\n      // Only pause if video is actually playing\n      // Re: https://developers.google.com/web/updates/2017/06/play-request-was-interrupted\n      this.videoTarget.pause()\n    }\n    this.playingValue = false\n  }\n\n  logVideoPreviewEvent () {\n    googleAnalytics3Event({\n      eventAction: 'hover',\n      eventCategory: 'Elements Video Preview',\n      eventLabel: this.itemIdValue,\n      nonInteraction: true\n    })\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n  getGlobalModalController () {\n    return this.application.controllers.find(controller => controller.context.identifier === 'modal')\n  }\n\n  openFilterModal (event) {\n    event.preventDefault()\n\n    // Reach out to the existing other global modal controller\n    const modalController = this.getGlobalModalController()\n\n    // Render modal on the screen\n    modalController.showModal()\n\n    const facetSelector = document.getElementById('filter-modal-template').content.children[0].cloneNode(true)\n    //\n    modalController.setContentNode(facetSelector)\n\n    return false\n  }\n\n  closeModal () {\n    // Reach out to the existing other global modal controller\n    const modalController = this.getGlobalModalController()\n\n    // Hide our modal\n    modalController.close()\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport { googleAnalytics3Event } from 'lib/googleAnalytics3'\n\nexport default class extends Controller {\n  static values = {\n    applicable: Boolean, // This tells us if the user has changed filters, so we can show the apply button\n    baseUri: String, // This is the URL we'll use to append our search params\n    facets: Array, // This contains a JSON representation of all our filter options, we'll use this to craft our filter URL on apply button push\n    filtersApplied: Boolean // If filters have already been applied at time of page load, so we can show the \"clear\" button\n  }\n\n  applyFilters () {\n    this.logFilterApplyButtonPress(() => {\n      window.location.assign(this.buildFilterUri())\n    })\n  }\n\n  clearFilters () {\n    window.location.assign(this.baseUriValue)\n  }\n\n  changeFilter () {\n    this.applicableValue = true\n  }\n\n  buildFilterUri () {\n    const facetUriParams = [] // Using [] as URLSearchParams doesn't like multiple tags[] values it seems\n    for (const facet of this.facetsValue) {\n      // Build the URL parameter key. This will be  facet[]= or facet= based on the multi_select option\n      const facetUrlSlug = facet.multi_select ? `${facet.facet}[]` : facet.facet\n      for (const possibleFacetValue of facet.options) {\n        // check if this option is ticked in the dom\n        const facetInDom = document.getElementById(`facet-${facet.facet}-${possibleFacetValue.slug}`)\n        const isFacetTicked = facetInDom.checked\n        // If we have a default option (e.g. orientation=all) we can skip adding that to the query param\n        const isFacetTheDefaultOption = possibleFacetValue.default\n        if (isFacetTicked && !isFacetTheDefaultOption) {\n          facetUriParams.push({\n            key: facetUrlSlug,\n            value: facetInDom.dataset.facet\n          })\n        }\n      }\n    }\n\n    return this.baseUriValue + '?' + facetUriParams.map(param => `${param.key}=${encodeURIComponent(param.value)}`).join('&')\n  }\n\n  logFilterApplyButtonPress (callback) {\n    googleAnalytics3Event({\n      eventAction: 'click',\n      eventCategory: 'Search Filter Apply',\n      callback\n    })\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport { googleAnalytics3Event } from 'lib/googleAnalytics3'\n\nexport default class extends Controller {\n  static values = {\n    action: String,\n    category: String,\n    label: String,\n    value: String,\n    nonInteraction: String\n  }\n\n  connect () {\n    googleAnalytics3Event({\n      eventAction: this.actionValue,\n      eventCategory: this.categoryValue,\n      eventLabel: this.labelValue,\n      eventValue: this.valueValue,\n      nonInteraction: this.nonInteractionValue\n    })\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n  static values = {\n    menuOpen: Boolean\n  }\n\n  static classes = ['search']\n\n  initialize () {\n    // We don't want to setup any event listeners during the turbo in memory cache loading time.\n    // We wait a few more milliseconds for the network request to load, then we allow this block of code to run.\n    if (document.documentElement.hasAttribute('data-turbo-preview')) return\n\n    // Turbo caches our pages in browser memory, and briefly displays them to the user when re-visiting a cached page.\n    // On a mobile device, this has an odd side effect of the mobile nav showing as the old open cached state.\n    document.addEventListener('turbo:before-cache', () => {\n      this.menuOpenValue = false\n    }, { once: true })\n\n    window.addEventListener('resize', this.handleWindowResize)\n  }\n\n  dynamicSearchScroll () {\n    if (window.scrollY > 210) {\n      this.element.classList.add(this.searchClass)\n    } else {\n      this.element.classList.remove(this.searchClass)\n    }\n  }\n\n  toggleMobileMenu (event) {\n    event.preventDefault()\n    this.menuOpenValue = !this.menuOpenValue\n    return false\n  }\n\n  handleWindowResize = () => {\n    if (window.innerWidth >= 1000) {\n      this.menuOpenValue = false\n    }\n  };\n}\n","import { Controller } from 'stimulus'\nconst throttle = require('lodash/throttle')\n\n// We use this to calculate the room required to fit the \"...\" link in\n// needs to be size of button + any margins\nconst metaLinkMargin = 10\nconst moreDropdownSpacing = 32 + metaLinkMargin\n\nexport default class extends Controller {\n  static targets = ['metaWrapper', 'link', 'more', 'moreLinks']\n  static values = {\n    showMore: Boolean\n  }\n\n  initialize () {\n    this.layout = throttle(this.layout, 200)\n  }\n\n  connect () {\n    // We don't want to do this expensive work on the turbo in-memory cached version.\n    // We wait a few more milliseconds for the network request to load, then we do the real initialization.\n    if (document.documentElement.hasAttribute('data-turbo-preview')) return\n\n    this.layout()\n  }\n\n  layout () {\n    // Everytime the browser resizes this function gets called, so we want\n    // to reset all the things so on the last resize movement, so the\n    // correct mutations are performed to the data and DOM.\n    this.moreLinksTarget.innerHTML = ''\n    this.showMoreValue = false\n    const metaWrapperWidth = Math.floor(this.metaWrapperTarget.offsetWidth) || 0\n    if (metaWrapperWidth <= 0) {\n      return\n    }\n    const navChildren = this.linkTargets\n    let visibleElementsWidth = 0\n    const linksToShowInMore = []\n\n    navChildren.forEach((child, index) => {\n      child.removeAttribute('data-hidden')\n      const bounding = child.getBoundingClientRect()\n      visibleElementsWidth += bounding.width + metaLinkMargin\n\n      if (visibleElementsWidth + moreDropdownSpacing > metaWrapperWidth) {\n        // This nav drop down isn't going to fit on the page, so we mark is as hidden and move it into a \"more\" dropdown\n        child.setAttribute('data-hidden', 'true')\n        linksToShowInMore.push(child.cloneNode(true))\n      }\n    })\n    linksToShowInMore.forEach(child => {\n      this.moreLinksTarget.appendChild(child)\n    })\n    // We have some links in our more links div, lets show em.\n    if (linksToShowInMore.length) {\n      this.showMoreValue = true\n    }\n  }\n}\n","const ORIGINAL_UTM_SOURCE_KEY = 'original-utm-source'\n\nexport function removeOriginalSource () {\n  try {\n    window.sessionStorage.removeItem(ORIGINAL_UTM_SOURCE_KEY)\n  } catch (e) {\n    return null\n  }\n}\n\nexport function storeOriginalSource (originalSource) {\n  try {\n    window.sessionStorage.setItem(ORIGINAL_UTM_SOURCE_KEY, originalSource)\n  } catch (e) {\n    return null\n  }\n}\n\nexport function retrieveOriginalSource () {\n  try {\n    return window.sessionStorage.getItem(ORIGINAL_UTM_SOURCE_KEY)\n  } catch (e) {\n    return null\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport { Consent, consented } from 'lib/consent'\nimport { storeOriginalSource, removeOriginalSource, retrieveOriginalSource } from 'lib/originalSource'\n\n// This controller captures the `utm_source` parameter when a user follows a link from a\n// marketing channel, e.g. YouTube, TikTok etc.\n//\n// Since we don't have cross domain linking enabled we need to forward this parameter to track\n// where traffic referred to Elements originated from.\n//\n// In order to achieve this we store the last `utm_source` seen in sessionStorage and\n// dispatch an event for elements link controllers to add this value as the `utm_content`\n// parameter.\n//\n// We use an event and dynamically update in order to honour CookieBot with respect to\n// tracking marketing statistics via the sessionStorage key.\n//\n// Also because there is a potential race condition between this controller connecting and\n// the elements links controllers connecting on the page we defer updating the links until\n// the page has finished loading via the turbo:load event.\n//\nexport default class extends Controller {\n  initialize () {\n    // Little bind trick allowing our future window.addEventListener to function correctly\n    this.updateOriginalSourceTracking = this.updateOriginalSourceTracking.bind(this)\n  }\n\n  connect () {\n    // Set up cookiebot event listeners for when the user modifies their consent options:\n    window.addEventListener('CookiebotOnAccept', this.updateOriginalSourceTracking)\n    window.addEventListener('CookiebotOnDecline', this.updateOriginalSourceTracking)\n  }\n\n  disconnect () {\n    window.removeEventListener('CookiebotOnAccept', this.updateOriginalSourceTracking)\n    window.removeEventListener('CookiebotOnDecline', this.updateOriginalSourceTracking)\n  }\n\n  trackOriginalSource () {\n    const utmSource = new URL(window.location).searchParams.get('utm_source')\n    if (utmSource) {\n      storeOriginalSource(utmSource)\n    } else if (document.referrer) {\n      const referrerDomain = new URL(document.referrer).host\n      storeOriginalSource(referrerDomain)\n    }\n  }\n\n  stopTrackingOriginalSource () {\n    removeOriginalSource()\n  }\n\n  // Raise global event allow any elements links to update\n  dispatchUpdateOriginalSourceEvent () {\n    const originalSource = retrieveOriginalSource()\n    window.dispatchEvent(new CustomEvent('updateOriginalSource', { detail: { originalSource: originalSource } }))\n  }\n\n  // Called when any of the following events occur:\n  //   - The document has finished loading, in the case consent has been given we need to dispatch immediately\n  //   - CookieBot consent has been accepted\n  //   - CookieBot consent has been declined\n  updateOriginalSourceTracking () {\n    if (consented(Consent.statistics)) {\n      this.trackOriginalSource()\n    } else {\n      this.stopTrackingOriginalSource()\n    }\n    this.dispatchUpdateOriginalSourceEvent()\n  }\n}\n","import { Controller } from 'stimulus'\nimport { tns } from 'tiny-slider'\n\nexport default class extends Controller {\n  static targets = ['track', 'slideItem']\n  static classes = ['initialized']\n  static values = {\n    mobileColumnCount: { type: Number, default: 2 }\n  }\n\n  connect () {\n    // We don't want to do this expensive work on the turbo in-memory cached version.\n    // We wait a few more milliseconds for the network request to load, then we do the real initialization.\n    if (document.documentElement.hasAttribute('data-turbo-preview')) return\n\n    this.initializeSlider()\n  }\n\n  initializeSlider () {\n    this.slider = tns({\n      container: this.trackTarget,\n      loop: true,\n      touch: true,\n      mouseDrag: false,\n      controls: false,\n      center: false,\n      nav: false,\n      slideBy: 'page',\n      items: this.mobileColumnCountValue,\n      responsive: {\n        420: {\n          items: 2\n        },\n        700: {\n          items: 3\n        },\n        1000: {\n          items: 4\n        }\n      }\n    })\n\n    if (this.slider) {\n      this.element.classList.add(this.initializedClass)\n    }\n  }\n\n  nextSlide () {\n    this.slider && this.slider.goTo('next')\n  }\n\n  prevSlide () {\n    this.slider && this.slider.goTo('prev')\n  }\n}\n","import { Controller } from 'stimulus'\nconst throttle = require('lodash/throttle')\n\nconst moreDropdownSpacing = 150\n// Copied from SCSS mixin value: $desktopWidth: 1000px;\nconst desktopBreakpoint = 1000\n\nconst getColumnCount = (itemCount) => {\n  if (itemCount > 20) return 3\n  if (itemCount > 8) return 2\n  if (itemCount > 0) return 1\n  return 0 // We use column-count=\"0\" as a special case to hide the dynamic \"more\" drop down listing\n}\n\nexport default class extends Controller {\n    static targets = ['nav', 'link', 'more', 'moreLinks', 'template']\n\n    initialize () {\n      this.layout = throttle(this.layout, 200)\n    }\n\n    getGlobalModalController () {\n      return this.application.controllers.find(controller => controller.context.identifier === 'modal')\n    }\n\n    // This is fired from the DOM: data-action=\"click->global--navigation#openModal\"\n    // On mobile screens we want to open a modal and populate it with content.\n    openModal (event) {\n      if (window.innerWidth >= desktopBreakpoint) {\n        return\n      }\n      event.preventDefault()\n      // Reach out to the existing other global modal controller\n      const modalController = this.getGlobalModalController()\n\n      // Create the modal content wrapping element:\n      const modalWrapper = this.templateTarget.content.children[0].cloneNode(true)\n\n      // Add all the child links to the modal:\n      event.target.parentNode.querySelectorAll('a').forEach(childToClone => {\n        if (!childToClone.href.match(/#$/)) { // Stop \"More Videos\" link from appearing in modal, as it's not clickable\n          modalWrapper.appendChild(childToClone.cloneNode(true))\n        }\n      })\n\n      // Close button:\n      const modalCloseButton = modalWrapper.getElementsByClassName('global-navigation__modal-close-button')[0]\n      const closeModal = this.closeModal.bind(this)\n      modalCloseButton.addEventListener('click', closeModal)\n\n      // Render modal on the screen\n      modalController.showModal()\n\n      // Display the content in the modal:\n      modalController.setContentNode(modalWrapper)\n      return false\n    }\n\n    closeModal () {\n      const modalController = this.getGlobalModalController()\n      modalController.close()\n    }\n\n    layout () {\n      const containerWidth = Math.floor(this.navTarget.offsetWidth) || 0\n      if (containerWidth <= 0) {\n        return\n      }\n      const navChildren = this.linkTargets\n      let visibleElementsWidth = 0\n      const linksToShowInMore = []\n      // Make all children visible, so our calculations below work:\n      navChildren.forEach(child => {\n        child.removeAttribute('data-hidden')\n      })\n      // Figure out which child elements to hide, but only when in desktop mode.\n      if (containerWidth >= desktopBreakpoint) {\n        navChildren.forEach((child, index) => {\n          child.removeAttribute('data-hidden')\n          child.removeAttribute('data-dropdown-direction')\n          const bounding = child.getBoundingClientRect()\n          visibleElementsWidth += bounding.width\n          if (visibleElementsWidth + moreDropdownSpacing > containerWidth) {\n            // This nav drop down isn't going to fit on the page, so we mark is as hidden and move it into a \"more\" dropdown\n            child.setAttribute('data-hidden', 'true')\n            child.querySelectorAll('a').forEach(childToClone => {\n              if (!childToClone.href.match(/#$/)) { // Stop \"More Videos\" link from appearing in drop down, as it's not clickable\n                linksToShowInMore.push(childToClone.cloneNode(true))\n              }\n            })\n          } else {\n            // Figure out if this dropdown is going to be too close to right edge, in which case we need to make it open to the left\n            if (bounding.left + 500 > window.innerWidth) {\n              child.setAttribute('data-dropdown-direction', 'left')\n            }\n\n            child.setAttribute('data-columns', getColumnCount(child.querySelectorAll('a').length))\n          }\n        })\n      }\n\n      this.moreTarget.setAttribute('data-columns', getColumnCount(linksToShowInMore.length))\n      this.moreLinksTarget.innerHTML = ''\n      linksToShowInMore.forEach(child => {\n        this.moreLinksTarget.appendChild(child)\n      })\n    }\n\n    connect () {\n      // We don't want to do this expensive work on the turbo in-memory cached version.\n      // We wait a few more milliseconds for the network request to load, then we do the real initialization.\n      if (document.documentElement.hasAttribute('data-turbo-preview')) return\n\n      this.layout()\n    }\n}\n","import { Controller } from 'stimulus'\nimport { googleAnalytics3Event } from 'lib/googleAnalytics3'\n\nexport default class extends Controller {\n  static targets = ['video']\n  static values = {\n    loaded: Boolean,\n    itemId: String,\n    itemType: String,\n    playing: Boolean\n  }\n\n  mouseOver () {\n    this.playVideo()\n  }\n\n  mouseOut () {\n    this.pauseVideo()\n  }\n\n  fullScreen () {\n    // User is requesting the video tag go full screen.\n    if (this.hasVideoTarget) {\n      // Now we tell our video tag to go full screen, hopefully it works!\n      if (this.videoTarget.requestFullscreen) {\n        this.videoTarget.requestFullscreen()\n      } else if (this.videoTarget.mozRequestFullScreen) {\n        this.videoTarget.mozRequestFullScreen()\n      } else if (this.videoTarget.webkitRequestFullscreen) {\n        this.videoTarget.webkitRequestFullscreen()\n      } else if (this.videoTarget.msRequestFullscreen) {\n        this.videoTarget.msRequestFullscreen()\n      } else if (this.videoTarget.webkitEnterFullScreen) {\n        this.videoTarget.webkitEnterFullScreen()\n      }\n    }\n  }\n\n  playVideo () {\n    if (this.hasVideoTarget) {\n      const videoPromise = this.videoTarget.play()\n      if (typeof videoPromise !== 'undefined') {\n        videoPromise.then(() => {\n          if (!this.loadedValue) {\n            this.loadedValue = true\n            this.logVideoPreviewEvent()\n          }\n          this.playingValue = true\n        }).catch(() => {})\n      }\n    }\n  }\n\n  pauseVideo () {\n    if (this.hasVideoTarget && this.playingValue) {\n      // Only pause if video is actually playing\n      // Re: https://developers.google.com/web/updates/2017/06/play-request-was-interrupted\n      this.videoTarget.pause()\n    }\n    this.playingValue = false\n  }\n\n  logVideoPreviewEvent () {\n    googleAnalytics3Event({\n      eventAction: 'hover',\n      // event category should be something like:\n      // \"Video Preview\"\n      // \"videoTemplate/Premiere Pro Preview\"\n      eventCategory: `${this.itemTypeValue} Preview`,\n      eventLabel: this.itemIdValue,\n      nonInteraction: true\n    })\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport { handleError } from 'lib/errors'\n\n// These are all the supported license types for modals\nconst allLicenseTypes = ['videoFree', 'videoRestricted', 'musicFree', 'sfxFree', 'videoTemplateFree', 'artFree']\n\nexport default class extends Controller {\n  static values = {\n    anchor: Boolean\n  }\n\n  getGlobalModalController () {\n    return this.application.controllers.find(controller => controller.context.identifier === 'modal')\n  }\n\n  open (event) {\n    event && event.preventDefault()\n    // We need to get licenseType from `data-license=\"sfxFree\"` prop on the card itself.\n    // This is accessible via `event.currentTarget` which is the element the event listener was registered on.\n    // So when clicking a child <h2> or <button> this still allows us to access the prop on the parent DOM node.\n    const licenseType = event.currentTarget.dataset.license\n    this.displayLicenseModal(licenseType)\n    return false\n  }\n\n  displayLicenseModal (licenseType) {\n    if (!allLicenseTypes.includes(licenseType)) {\n      // invalid license type\n      return\n    }\n\n    // Reach out to the existing other global modal controller\n    const modalController = this.getGlobalModalController()\n\n    // Render modal on the screen\n    modalController.showModal()\n\n    if (this.shouldWeUpdateModalUrlAnchor()) {\n      // Update the current browser anchor with the license type\n      window.location.hash = licenseType\n    }\n\n    // Fetch the modal content defined in the button data-attribute\n    fetch(`/license/modal/${licenseType}/`)\n      .then(\n        // Extract the modal response message if we get a 200 success\n        response => {\n          if (response.ok) {\n            return response.text()\n          } else {\n            const msg = `Status: ${response.status} while fetching modal for '${licenseType}'`\n            throw new Error(msg)\n          }\n        })\n      .then(\n        // Populate our modal with the content from the API response\n        html => modalController.setContentHtml(html))\n      .catch(\n        // If we get a 404 or the network request fails we log the error to rollbar and hide the modal\n        error => {\n          handleError(error)\n          modalController.hideModal()\n        })\n\n    return false\n  }\n\n  openModalByAnchor () {\n    if (this.shouldWeUpdateModalUrlAnchor() && window.location.hash.length > 0) {\n      const licenseType = window.location.hash.substr(1)\n      this.displayLicenseModal(licenseType)\n    }\n  }\n\n  shouldWeUpdateModalUrlAnchor () {\n    return this.anchorValue\n  }\n\n  // On the license page we'd like to listen for the modal closed event and remove the #anchor from the URL\n  modalHasBeenClosed () {\n    if (this.shouldWeUpdateModalUrlAnchor()) {\n      // We have to use pushState() here because window.location.hash = '' leaves a '#' in the url and causes a scroll-up\n      window.history.pushState({ turbolinks: {} }, document.title, window.location.pathname)\n    }\n  }\n\n  close () {\n    // Reach out to the existing other global modal controller\n    const modalController = this.getGlobalModalController()\n\n    // Close the modal\n    modalController.close()\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport { sendAnalyticsEvent } from '@envato/gtm-analytics'\nimport { userTextInputToUrlSlug, getItemSearchPath } from 'lib/linkHelpers'\nimport { googleAnalytics3Event } from 'lib/googleAnalytics3'\n\nexport default class extends Controller {\n  static targets = [\n    'input',\n    'headerLabel',\n    'headerOptions',\n    'itemTypeSelector',\n    'autocompleteResults',\n    'autocompleteButton',\n    'popularSearchTermsForItemType'\n  ]\n\n  static values = {\n    itemType: String,\n    autocomplete: Object,\n    autocompleteIndex: Number,\n    hasAutocompleteResults: Boolean,\n    showClearButton: Boolean\n  }\n\n  static classes = [\n    'expandedItemTypeSelector',\n    'hiddenPopularSearchTerms'\n  ]\n\n  connect () {\n    this.cachedAutocompleteData = {}\n    this.setHeaderLabel()\n    this.setPopularSearchTerms()\n  }\n\n  setHeaderLabel () {\n    if (this.hasHeaderLabelTarget) {\n      const searchItemType = this.itemTypeValue\n      const currentElement = this.headerOptionsTarget.querySelector('.new-search-form__item-type-option--current')\n      if (currentElement) {\n        currentElement.classList.remove('new-search-form__item-type-option--current')\n      }\n      const newElementToHighlight = this.headerOptionsTarget.querySelector(`[data-type=\"${searchItemType}\"]`)\n      if (newElementToHighlight) {\n        newElementToHighlight.classList.add('new-search-form__item-type-option--current')\n        this.headerLabelTarget.innerText = newElementToHighlight.innerText\n      }\n    }\n  }\n\n  setPopularSearchTerms () {\n    const searchItemType = this.itemTypeValue\n    const popularSearchTermsForItemTypeTargets = this.popularSearchTermsForItemTypeTargets\n\n    if (popularSearchTermsForItemTypeTargets && Array.isArray(popularSearchTermsForItemTypeTargets)) {\n      popularSearchTermsForItemTypeTargets.forEach((popularSearchTermForItemType) => {\n        if (searchItemType === popularSearchTermForItemType.dataset.itemType) {\n          popularSearchTermForItemType.classList.remove(this.hiddenPopularSearchTermsClass)\n        } else {\n          popularSearchTermForItemType.classList.add(this.hiddenPopularSearchTermsClass)\n        }\n      })\n    }\n  }\n\n  expandItemTypeSelector (event) {\n    if (this.hasItemTypeSelectorTarget) {\n      this.itemTypeSelectorTarget.classList.add(this.expandedItemTypeSelectorClass)\n    }\n  }\n\n  collapseItemTypeSelector (event) {\n    if (this.hasItemTypeSelectorTarget) {\n      this.itemTypeSelectorTarget.classList.remove(this.expandedItemTypeSelectorClass)\n    }\n  }\n\n  itemTypeChange (event) {\n    event.preventDefault()\n    event.stopImmediatePropagation()\n    const newItemType = event.target.getAttribute('data-type')\n    this.itemTypeValue = newItemType\n    this.inputTarget.value = ''\n    this.setHeaderLabel()\n    this.setPopularSearchTerms()\n    this.inputTarget.focus()\n    this.collapseItemTypeSelector()\n    return false\n  }\n\n  logGaSearchEvent ({ searchTerm, searchType, callback }) {\n    googleAnalytics3Event({\n      eventAction: searchTerm,\n      eventCategory: `Search Query (${searchType})`,\n      eventLabel: this.itemTypeValue\n    })\n\n    sendAnalyticsEvent({\n      eventName: 'search',\n      context: this.getElementAnalyticsContext(this.element), // TODO: move this functionality into gtm-analytics package\n      itemCategory: this.getGa4ItemCategory(this.itemTypeValue),\n      searchType,\n      searchTerm,\n      callback\n    })\n  }\n\n  getElementAnalyticsContext (element) {\n    return element.closest('[data-analytics-context]')?.dataset.analyticsContext\n  }\n\n  getGa4ItemCategory (itemTypeValue) {\n    // We need to convert 'item_type_software' to 'item type, software'. See specs for examples.\n    if (itemTypeValue.startsWith('video_templates_')) {\n      const commaIndex = 'video_templates'.length\n      itemTypeValue = itemTypeValue.slice(0, commaIndex) + ',' + itemTypeValue.slice(commaIndex)\n    }\n    return itemTypeValue.replace(/_+/g, ' ')\n  }\n\n  async search (event) {\n    event.preventDefault()\n    if (this.isAutoCompleteItemType()) {\n      // User is submitting the form on an autocomplete item type\n      const searchMatches = await this.findAutoCompleteMatches()\n      if (searchMatches.length > 0 && typeof searchMatches[this.autocompleteIndexValue] !== 'undefined') {\n        // User has pressed enter with an auto complete search match highligted, we're going to search for that.\n        this.redirectToAutoCompleteResult(searchMatches[this.autocompleteIndexValue].label, searchMatches[this.autocompleteIndexValue].url)\n        return\n      } else {\n        // No matches found, so we're doing a normal search without auto completed option available.\n        // This bubbles down to the normal getItemSearchPath() below\n      }\n    }\n\n    const searchItemType = this.itemTypeValue\n    const searchUrlSlug = userTextInputToUrlSlug(this.inputTarget.value)\n    if (searchUrlSlug.length > 0) {\n      const destinationUrl = getItemSearchPath({ itemType: searchItemType, searchTermUrlSlug: searchUrlSlug })\n      this.logGaSearchEvent({\n        searchTerm: this.inputTarget.value,\n        searchType: 'free text',\n        callback: () => {\n          window.location.assign(destinationUrl)\n        }\n      })\n    }\n    return false\n  }\n\n  clearSearchTerms () {\n    this.inputTarget.value = ''\n    this.showClearButtonValue = false\n  }\n\n  isAutoCompleteItemType () {\n    return typeof this.autocompleteValue[this.itemTypeValue] !== 'undefined'\n  }\n\n  async handleAutocomplete (event) {\n    let keyCode\n\n    if (event.key !== undefined) {\n      keyCode = event.key\n    } else if (event.keyIdentifier !== undefined) {\n      keyCode = event.keyIdentifier\n    } else if (event.keyCode !== undefined) {\n      keyCode = event.keyCode\n    }\n\n    if (this.isAutoCompleteItemType()) {\n      const searchMatches = await this.findAutoCompleteMatches()\n\n      // For auto complete item types, we want to capture when user presses up or down, change which option is highlighted\n      if (keyCode === 40 || keyCode === 38 || keyCode === 'ArrowDown' || keyCode === 'ArrowUp') {\n        event.preventDefault()\n        if (keyCode === 40 || keyCode === 'ArrowDown') {\n          // User pressed down arrow.\n          if (this.autocompleteIndexValue < searchMatches.length - 1) {\n            this.autocompleteIndexValue++\n          }\n        }\n        if (keyCode === 38 || keyCode === 'ArrowUp') {\n          // User pressed up arrow.\n          if (this.autocompleteIndexValue > 0) {\n            this.autocompleteIndexValue--\n          }\n        }\n      } else if (keyCode === 13 || keyCode === 'Enter') {\n        // User pressed enter, this is handled by a normal <form> submit above\n      } else {\n        // Another type of keypress, we reset our autocomplete index to 0 & reset the autocomplete results HTML\n        this.autocompleteIndexValue = 0\n        this.autocompleteResultsTarget.innerHTML = ''\n      }\n\n      // Add data attribute to dom so we can hide/show the results dropdown nicely\n      this.hasAutocompleteResultsValue = searchMatches.length > 0\n\n      // Now render our search results on the page\n      searchMatches.forEach((result, index) => {\n        const existingAutocompleteResultButton = document.querySelector(`[data-url='${result.url}']`)\n\n        if (existingAutocompleteResultButton) {\n          // This search match is already rendered, so just update the class\n          if (index === this.autocompleteIndexValue) {\n            existingAutocompleteResultButton.classList.add('new-search-form__autocomplete-result--current')\n          } else {\n            existingAutocompleteResultButton.classList.remove('new-search-form__autocomplete-result--current')\n          }\n        } else {\n          // This search match isn't yet rendered, so construct from the template\n          const autocompleteResultButton = this.autocompleteButtonTarget.content.children[0].cloneNode()\n          autocompleteResultButton.innerHTML = `${result.label.slice(0, result.resultIndexStart)}<strong>${result.label.slice(result.resultIndexStart, result.resultIndexEnd)}</strong>${result.label.slice(result.resultIndexEnd)}`\n          autocompleteResultButton.dataset.label = result.label\n          autocompleteResultButton.dataset.url = result.url\n          autocompleteResultButton.dataset.index = index\n          if (index === this.autocompleteIndexValue) {\n            autocompleteResultButton.classList.add('new-search-form__autocomplete-result--current')\n          }\n          this.autocompleteResultsTarget.appendChild(autocompleteResultButton)\n        }\n      })\n    }\n  }\n\n  async getAutocompleteData (itemType) {\n    if (typeof this.cachedAutocompleteData[itemType] !== 'undefined') {\n      // We're already cached! return it\n      return this.cachedAutocompleteData[itemType]\n    }\n    // Not cached yet, fetch + cache + return.\n    const response = await fetch(this.autocompleteValue[itemType])\n    const data = await response.json()\n    this.cachedAutocompleteData[itemType] = data\n    return this.cachedAutocompleteData[itemType]\n  }\n\n  async findAutoCompleteMatches () {\n    if (this.inputTarget.value.length === 0) return []\n\n    const dataSource = await this.getAutocompleteData(this.itemTypeValue)\n    const searchQueryBits = userTextInputToUrlSlug(this.inputTarget.value).split('-')\n    return dataSource.reduce((acc, item) => {\n      let weFoundAPartialMatch = false // This is a flag to figure out if the current search word has matched or not\n      searchQueryBits.forEach(searchQueryBit => {\n        if (!weFoundAPartialMatch) {\n          const resultIndex = item.label.toLowerCase().indexOf(searchQueryBit)\n          if (resultIndex !== -1) {\n            item.resultIndexStart = resultIndex\n            item.resultIndexEnd = resultIndex + searchQueryBit.length\n            acc.push(item)\n            weFoundAPartialMatch = true\n          }\n        }\n      })\n      return acc\n    }, [])\n      .sort((a, b) => a.label.length - b.label.length)\n      .slice(0, 10)\n  }\n\n  clickAutocompleteResult (event) {\n    event.preventDefault()\n    this.redirectToAutoCompleteResult(event.currentTarget.dataset.label, event.currentTarget.dataset.url)\n    return false\n  }\n\n  redirectToAutoCompleteResult (label, url) {\n    this.logGaSearchEvent({\n      searchTerm: label,\n      searchType: 'autocomplete',\n      callback: () => {\n        window.location.assign(url)\n      }\n    })\n  }\n\n  hoverAutocompleteResult (event) {\n    this.autocompleteIndexValue = event.target.dataset.index\n\n    for (const result of this.autocompleteResultsTarget.children) {\n      result.classList.remove('new-search-form__autocomplete-result--current')\n    }\n\n    event.target.classList.add('new-search-form__autocomplete-result--current')\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport { sendAnalyticsEvent } from '@envato/gtm-analytics'\nimport { userTextInputToUrlSlug, getItemSearchPath } from 'lib/linkHelpers'\nimport { googleAnalytics3Event } from 'lib/googleAnalytics3'\n\nexport default class extends Controller {\n  static targets = ['input', 'headerLabel', 'headerOptions', 'autocompleteResults', 'autocompleteButton']\n  static values = {\n    itemType: String,\n    autocomplete: Object,\n    autocompleteIndex: Number,\n    hasAutocompleteResults: Boolean,\n    showClearButton: Boolean\n  }\n\n  connect () {\n    this.cachedAutocompleteData = {}\n    this.setHeaderLabel()\n  }\n\n  setHeaderLabel () {\n    if (this.hasHeaderLabelTarget) {\n      const searchItemType = this.itemTypeValue\n      const currentElement = this.headerOptionsTarget.querySelector('.search-form__item-type-option--current')\n      if (currentElement) {\n        currentElement.classList.remove('search-form__item-type-option--current')\n      }\n      const newElementToHighlight = this.headerOptionsTarget.querySelector(`[data-type=\"${searchItemType}\"]`)\n      if (newElementToHighlight) {\n        newElementToHighlight.classList.add('search-form__item-type-option--current')\n        this.headerLabelTarget.innerText = newElementToHighlight.innerText\n      }\n    }\n  }\n\n  itemTypeChange (event) {\n    event.preventDefault()\n    const newItemType = event.target.getAttribute('data-type')\n    this.itemTypeValue = newItemType\n    this.inputTarget.value = ''\n    this.setHeaderLabel()\n    this.inputTarget.focus()\n    // Close any previously open auto complete drop downs when changing item types\n    this.autocompleteIndexValue = 0\n    this.autocompleteResultsTarget.innerHTML = ''\n    return false\n  }\n\n  logGaSearchEvent ({ searchTerm, searchType, callback }) {\n    googleAnalytics3Event({\n      eventAction: searchTerm,\n      eventCategory: `Search Query (${searchType})`,\n      eventLabel: this.itemTypeValue\n    })\n\n    sendAnalyticsEvent({\n      eventName: 'search',\n      context: this.getElementAnalyticsContext(this.element), // TODO: move this functionality into gtm-analytics package\n      itemCategory: this.getGa4ItemCategory(this.itemTypeValue),\n      searchType,\n      searchTerm,\n      callback\n    })\n  }\n\n  getElementAnalyticsContext (element) {\n    return element.closest('[data-analytics-context]')?.dataset.analyticsContext\n  }\n\n  getGa4ItemCategory (itemTypeValue) {\n    // We need to convert 'item_type_software' to 'item type, software'. See specs for examples.\n    if (itemTypeValue.startsWith('video_templates_')) {\n      const commaIndex = 'video_templates'.length\n      itemTypeValue = itemTypeValue.slice(0, commaIndex) + ',' + itemTypeValue.slice(commaIndex)\n    }\n    return itemTypeValue.replace(/_+/g, ' ')\n  }\n\n  async search (event) {\n    event.preventDefault()\n    if (this.isAutoCompleteItemType()) {\n      // User is submitting the form on an autocomplete item type\n      const searchMatches = await this.findAutoCompleteMatches()\n      if (searchMatches.length > 0 && typeof searchMatches[this.autocompleteIndexValue] !== 'undefined') {\n        // User has pressed enter with an auto complete search match highligted, we're going to search for that.\n        this.redirectToAutoCompleteResult(searchMatches[this.autocompleteIndexValue].label, searchMatches[this.autocompleteIndexValue].url)\n        return\n      } else {\n        // No matches found, so we're doing a normal search without auto completed option available.\n        // This bubbles down to the normal getItemSearchPath() below\n      }\n    }\n\n    const searchItemType = this.itemTypeValue\n    const searchUrlSlug = userTextInputToUrlSlug(this.inputTarget.value)\n    if (searchUrlSlug.length > 0) {\n      const destinationUrl = getItemSearchPath({ itemType: searchItemType, searchTermUrlSlug: searchUrlSlug })\n      this.logGaSearchEvent({\n        searchTerm: this.inputTarget.value,\n        searchType: 'free text',\n        callback: () => {\n          window.location.assign(destinationUrl)\n        }\n      })\n    }\n    return false\n  }\n\n  clearSearchTerms () {\n    this.inputTarget.value = ''\n    this.showClearButtonValue = false\n  }\n\n  isAutoCompleteItemType () {\n    return typeof this.autocompleteValue[this.itemTypeValue] !== 'undefined'\n  }\n\n  async handleAutocomplete (event) {\n    let keyCode\n\n    if (event.key !== undefined) {\n      keyCode = event.key\n    } else if (event.keyIdentifier !== undefined) {\n      keyCode = event.keyIdentifier\n    } else if (event.keyCode !== undefined) {\n      keyCode = event.keyCode\n    }\n\n    if (this.isAutoCompleteItemType()) {\n      const searchMatches = await this.findAutoCompleteMatches()\n\n      // For auto complete item types, we want to capture when user presses up or down, change which option is highlighted\n      if (keyCode === 40 || keyCode === 38 || keyCode === 'ArrowDown' || keyCode === 'ArrowUp') {\n        event.preventDefault()\n        if (keyCode === 40 || keyCode === 'ArrowDown') {\n          // User pressed down arrow.\n          if (this.autocompleteIndexValue < searchMatches.length - 1) {\n            this.autocompleteIndexValue++\n          }\n        }\n        if (keyCode === 38 || keyCode === 'ArrowUp') {\n          // User pressed up arrow.\n          if (this.autocompleteIndexValue > 0) {\n            this.autocompleteIndexValue--\n          }\n        }\n      } else if (keyCode === 13 || keyCode === 'Enter') {\n        // User pressed enter, this is handled by a normal <form> submit above\n      } else {\n        // Another type of keypress, we reset our autocomplete index to 0 & reset the autocomplete results HTML\n        this.autocompleteIndexValue = 0\n        this.autocompleteResultsTarget.innerHTML = ''\n      }\n\n      // Add data attribute to dom so we can hide/show the results dropdown nicely\n      this.hasAutocompleteResultsValue = searchMatches.length > 0\n\n      // Now render our search results on the page\n      searchMatches.forEach((result, index) => {\n        const existingAutocompleteResultButton = document.querySelector(`[data-url='${result.url}']`)\n\n        if (existingAutocompleteResultButton) {\n          // This search match is already rendered, so just update the class\n          if (index === this.autocompleteIndexValue) {\n            existingAutocompleteResultButton.classList.add('search-form__autocomplete-result--current')\n          } else {\n            existingAutocompleteResultButton.classList.remove('search-form__autocomplete-result--current')\n          }\n        } else {\n          // This search match isn't yet rendered, so construct from the template\n          const autocompleteResultButton = this.autocompleteButtonTarget.content.children[0].cloneNode()\n          autocompleteResultButton.innerHTML = `${result.label.slice(0, result.resultIndexStart)}<strong>${result.label.slice(result.resultIndexStart, result.resultIndexEnd)}</strong>${result.label.slice(result.resultIndexEnd)}`\n          autocompleteResultButton.dataset.label = result.label\n          autocompleteResultButton.dataset.url = result.url\n          autocompleteResultButton.dataset.index = index\n          if (index === this.autocompleteIndexValue) {\n            autocompleteResultButton.classList.add('search-form__autocomplete-result--current')\n          }\n          this.autocompleteResultsTarget.appendChild(autocompleteResultButton)\n        }\n      })\n    }\n  }\n\n  async getAutocompleteData (itemType) {\n    if (typeof this.cachedAutocompleteData[itemType] !== 'undefined') {\n      // We're already cached! return it\n      return this.cachedAutocompleteData[itemType]\n    }\n    // Not cached yet, fetch + cache + return.\n    const response = await fetch(this.autocompleteValue[itemType])\n    const data = await response.json()\n    this.cachedAutocompleteData[itemType] = data\n    return this.cachedAutocompleteData[itemType]\n  }\n\n  async findAutoCompleteMatches () {\n    if (this.inputTarget.value.length === 0) return []\n\n    const dataSource = await this.getAutocompleteData(this.itemTypeValue)\n    const searchQueryBits = userTextInputToUrlSlug(this.inputTarget.value).split('-')\n    return dataSource.reduce((acc, item) => {\n      let weFoundAPartialMatch = false // This is a flag to figure out if the current search word has matched or not\n      searchQueryBits.forEach(searchQueryBit => {\n        if (!weFoundAPartialMatch) {\n          const resultIndex = item.label.toLowerCase().indexOf(searchQueryBit)\n          if (resultIndex !== -1) {\n            item.resultIndexStart = resultIndex\n            item.resultIndexEnd = resultIndex + searchQueryBit.length\n            acc.push(item)\n            weFoundAPartialMatch = true\n          }\n        }\n      })\n      return acc\n    }, [])\n      .sort((a, b) => a.label.length - b.label.length)\n      .slice(0, 10)\n  }\n\n  clickAutocompleteResult (event) {\n    event.preventDefault()\n    this.redirectToAutoCompleteResult(event.currentTarget.dataset.label, event.currentTarget.dataset.url)\n    return false\n  }\n\n  redirectToAutoCompleteResult (label, url) {\n    this.logGaSearchEvent({\n      searchTerm: label,\n      searchType: 'autocomplete',\n      callback: () => {\n        window.location.assign(url)\n      }\n    })\n  }\n\n  hoverAutocompleteResult (event) {\n    this.autocompleteIndexValue = event.target.dataset.index\n\n    for (const result of this.autocompleteResultsTarget.children) {\n      result.classList.remove('search-form__autocomplete-result--current')\n    }\n\n    event.target.classList.add('search-form__autocomplete-result--current')\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n  static targets = [\n    'video',\n    'progressBar',\n    'progress',\n    'progressTime',\n    'durationTime'\n  ]\n\n  static values = {\n    isPaused: Boolean,\n    isMousedown: Boolean\n  }\n\n  connect () {\n    this.isPausedValue = false\n  }\n\n  togglePlay () {\n    this.isPausedValue ? this.videoTarget.play() : this.videoTarget.pause()\n    this.isPausedValue = !this.isPausedValue\n  }\n\n  fullScreen () {\n    // User is requesting the video tag go full screen.\n    if (this.hasVideoTarget) {\n      // Now we tell our video tag to go full screen, hopefully it works!\n      if (this.videoTarget.requestFullscreen) {\n        this.videoTarget.requestFullscreen()\n      } else if (this.videoTarget.mozRequestFullScreen) {\n        this.videoTarget.mozRequestFullScreen()\n      } else if (this.videoTarget.webkitRequestFullscreen) {\n        this.videoTarget.webkitRequestFullscreen()\n      } else if (this.videoTarget.msRequestFullscreen) {\n        this.videoTarget.msRequestFullscreen()\n      } else if (this.videoTarget.webkitEnterFullScreen) {\n        this.videoTarget.webkitEnterFullScreen()\n      }\n    }\n  }\n\n  setVideoDuration () {\n    const videoDurationSeconds = Math.ceil(this.videoTarget.duration)\n    const minutes = Math.floor(videoDurationSeconds / 60).toString()\n    const seconds = (Math.ceil(videoDurationSeconds) - minutes * 60).toString()\n    this.durationTimeTarget.textContent = minutes + ':' + seconds.padStart(2, '0')\n  }\n\n  progressUpdate () {\n    // Progress bar\n    const percent = this.videoTarget.currentTime / this.videoTarget.duration * 100\n    this.progressBarTarget.style.flexBasis = `${percent}%`\n\n    // Time played\n    const minutes = Math.floor(this.videoTarget.currentTime / 60).toString()\n    const seconds = (Math.ceil(this.videoTarget.currentTime) - minutes * 60).toString()\n    this.progressTimeTarget.textContent = minutes + ':' + seconds.padStart(2, '0')\n  }\n\n  scrub (event) {\n    const scrubTime = event.offsetX / this.progressTarget.offsetWidth * this.videoTarget.duration\n    this.videoTarget.currentTime = scrubTime\n  }\n\n  mousemove (event) {\n    this.isMousedownValue && this.scrub(event)\n  }\n\n  mousedown () {\n    this.isMousedownValue = true\n  }\n\n  mouseup () {\n    this.isMousedownValue = false\n  }\n}\n","import Cookies from 'js-cookie'\nimport { Controller } from 'stimulus'\nimport { Consent, deferRun, userHasOptedOutOfCookiesForCategory } from 'lib/consent'\nimport { getCookieDomains } from 'lib/getCookieDomains'\nimport { loadScript } from 'lib/load_script'\n\nexport default class extends Controller {\n  static values = {\n    cookiebotEnabled: Boolean,\n    analyticsId: String,\n    analyticsEnabled: Boolean\n  }\n\n  connect () {\n    // We don't want to do this GTM loading when displaying the turbo in-memory cached version.\n    // After a few more milliseconds the network request will finish,\n    // and this connect() will run again without this preview attribute set.\n    if (document.documentElement.hasAttribute('data-turbo-preview')) return\n\n    // If we've disabled analytics for whatever reason (e.g. local dev) then we return early\n    if (!this.analyticsEnabledValue) return\n\n    const loadGTMScript = () => {\n      loadScript(`https://www.googletagmanager.com/gtag/js?id=${this.analyticsIdValue}&l=ga3dataLayer`)\n    }\n\n    if (this.cookiebotEnabledValue) {\n      // We use our handy deferRun() helper to dynamically load the GTM script.\n      // This will load the GTM script straight away if we already have consent, or wait for consent before loading it.\n      deferRun(loadGTMScript, Consent.statistics)\n    } else {\n      // Cookiebot is disabled, we just load the GTM script straight away:\n      loadGTMScript()\n    }\n\n    if (typeof window !== 'undefined') {\n      this.handleCookiebotAcceptDeclineEvent = this.handleCookiebotAcceptDeclineEvent.bind(this)\n      window.addEventListener('CookiebotOnAccept', this.handleCookiebotAcceptDeclineEvent)\n      window.addEventListener('CookiebotOnDecline', this.handleCookiebotAcceptDeclineEvent)\n    }\n  }\n\n  // On declining statistics consent, we disable\n  // tracking and delete GA-related storage\n  handleCookiebotAcceptDeclineEvent () {\n    if (userHasOptedOutOfCookiesForCategory(Consent.statistics)) {\n      // Explicitly disable GA as per documentation as an extra precaution\n      // https://developers.google.com/analytics/devguides/collection/gtagjs/user-opt-out\n      window[`ga-disable-${this.analyticsIdValue}`] = true\n\n      // Manually delete any existing GA cookies\n      ;['_ga', '_gid', '_gat'].forEach((cookieName) => {\n        // Google sets some cookies on the full current domain and some on the apex domain\n        // (e.g. some on www.example.com and some on example.com) so we loop through both to delete all cookies\n        getCookieDomains().forEach((cookieDomain) => {\n          Cookies.remove(cookieName, { path: '/', domain: cookieDomain })\n        })\n      })\n    }\n  }\n}\n","// This file was copied from market-storefront: https://github.com/envato/market-storefront/blob/main/app/javascript/utils/load_script.js\nexport const loadScript = (src) => {\n  const scriptTag = document.createElement('script')\n  const firstScriptTag = document.getElementsByTagName('script')[0]\n  scriptTag.async = true\n  scriptTag.src = src\n  if (firstScriptTag && firstScriptTag.parentNode) {\n    firstScriptTag.parentNode.insertBefore(scriptTag, firstScriptTag)\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport { standardisedClickTracking } from '@envato/gtm-analytics'\nimport { googleAnalytics3Event, googleAnalytics3, googleAnalytics3StandardisedClickTracking } from 'lib/googleAnalytics3'\n\nexport default class extends Controller {\n  static values = {\n    ga3TrackingEnabled: Boolean,\n    ga3QueryParams: Array\n  }\n\n  connect () {\n    if (this.ga3TrackingEnabledValue) {\n      this.logGa3PageView()\n      // Changing this \"analyticsProcessed\" data attribute causes the connect() to fire on each turbo page load\n      this.element.dataset.analyticsProcessed = 'true'\n    }\n  }\n\n  logGa3PageView () {\n    // We only want to send certain query strings to Google Analytics (not the entire location.search string).\n    // Right now we only want the ?page=X values to go through to GA:\n    const allowedQueryParams = this.ga3QueryParamsValue\n\n    // This loops over the available search params and builds a new list based on the \"allowedQueryParams\" above\n    const browserSearchParams = new URLSearchParams(window.location.search)\n    const searchParamsToLog = new URLSearchParams()\n    for (const [searchParam, searchParamValue] of browserSearchParams) {\n      if (allowedQueryParams.includes(searchParam)) {\n        searchParamsToLog.append(searchParam, searchParamValue)\n      }\n    }\n\n    // We then stringify any allowed search params and append that to our GA page\n    const searchStringToLog = searchParamsToLog.toString()\n    const pagePath = `${window.location.pathname}${searchStringToLog.length > 0 ? `?${searchStringToLog}` : ''}`\n\n    googleAnalytics3('set', 'page_path', pagePath)\n    googleAnalytics3Event({\n      eventAction: 'page_view',\n      eventCategory: null,\n      eventLabel: null\n    })\n  }\n\n  trackClick (event) {\n    // GA4 standardised click tracking.\n    standardisedClickTracking(event)\n\n    // GA3 standardised click tracking.\n    googleAnalytics3StandardisedClickTracking(event)\n  }\n}\n","import Cookies from 'js-cookie'\nimport { Controller } from '@hotwired/stimulus'\nimport { Consent, deferRun, userHasOptedOutOfCookiesForCategory } from 'lib/consent'\nimport { getCookieDomains } from 'lib/getCookieDomains'\n\nexport default class extends Controller {\n  static values = {\n    cookiebotEnabled: Boolean,\n    microsoftClarityEnabled: Boolean\n  }\n\n  connect () {\n    // We don't want to do this when displaying the turbo in-memory cached version.\n    // After a few more milliseconds the network request will finish,\n    // and this connect() will run again without this preview attribute set.\n    if (document.documentElement.hasAttribute('data-turbo-preview')) return\n\n    // If we've disabled Clarity for whatever reason (e.g. local dev) then we return early\n    if (!this.microsoftClarityEnabledValue) return\n\n    const allowClarityCookies = () => {\n      window.clarity('consent')\n    }\n\n    if (this.cookiebotEnabledValue) {\n      // We use our handy deferRun() helper to run this callback when we know the user's cookie preferences.\n      // This will allow MS Clarity to use cookies straight away if we already have consent, or wait for consent before using them.\n      // Clarity will still run and collect data either way.\n      deferRun(allowClarityCookies, Consent.statistics)\n    } else {\n      // Cookiebot is disabled, we just allow MS Clarity to use cookies straight away:\n      allowClarityCookies()\n    }\n\n    if (typeof window !== 'undefined') {\n      this.handleCookiebotAcceptDeclineEventClarity = this.handleCookiebotAcceptDeclineEventClarity.bind(this)\n      window.addEventListener('CookiebotOnAccept', this.handleCookiebotAcceptDeclineEventClarity)\n      window.addEventListener('CookiebotOnDecline', this.handleCookiebotAcceptDeclineEventClarity)\n    }\n  }\n\n  // On declining statistics consent, we delete Clarity-related cookies\n  handleCookiebotAcceptDeclineEventClarity () {\n    if (userHasOptedOutOfCookiesForCategory(Consent.statistics)) {\n      // Manually delete any existing Clarity cookies\n      ['_clck', '_clsk', 'CLID', 'ANONCHK', 'MR', 'MUID', 'SM'].forEach((cookieName) => {\n        // Clarity sets some cookies on the full current domain and some on the apex domain\n        // (e.g. some on www.example.com and some on example.com) so we loop through both to delete all cookies\n        getCookieDomains().forEach((cookieDomain) => {\n          Cookies.remove(cookieName, { path: '/', domain: cookieDomain })\n        })\n      })\n    }\n  }\n}\n","/* global Event */\n\nimport { Controller } from '@hotwired/stimulus'\nexport default class extends Controller {\n  static targets = ['container', 'content']\n  static values = {\n    opened: Boolean,\n    loading: Boolean\n  }\n\n  initialize () {\n    // We don't want to setup any event listeners during the turbo in memory cache loading time.\n    // We wait a few more milliseconds for the network request to load, then we allow this block of code to run.\n    if (document.documentElement.hasAttribute('data-turbo-preview')) return\n\n    // Turbo caches our pages in browser memory, and briefly displays them to the user when re-visiting a cached page.\n    // On a mobile device, this has an odd side effect of the mobile nav showing as the old open cached state.\n    document.addEventListener('turbo:before-cache', () => {\n      this.openedValue = false\n    }, { once: true })\n  }\n\n  close () {\n    this.hideModal()\n    this.emptyModalContents()\n  }\n\n  showModal () {\n    this.showLoadingSpinner()\n    this.openedValue = true\n  }\n\n  hideModal () {\n    this.hideLoadingSpinner()\n    this.openedValue = false\n    // This allows other components to \"listen\" for when the modal is closed.\n    // We use this for (e.g.) updating the #hash link when a license page modal is closed.\n    window.dispatchEvent(new Event('modalClosed'))\n  }\n\n  showLoadingSpinner () {\n    this.loadingValue = true\n  }\n\n  hideLoadingSpinner () {\n    this.loadingValue = false\n  }\n\n  emptyModalContents () {\n    this.setContentHtml('')\n  }\n\n  setContentHtml (html) {\n    this.hideLoadingSpinner()\n    this.contentTarget.innerHTML = html\n  }\n\n  setContentNode (node) {\n    this.hideLoadingSpinner()\n    this.emptyModalContents()\n    this.contentTarget.appendChild(node)\n  }\n}\n","/* global ResizeObserver */\n\n// This is some JS to help us with multi-line text truncation as seen in this demo:\n// https://paulbakaus.com/tutorials/css/multiline-truncated-text-with-show-more-button-with-just-css/\n\nimport { Controller } from 'stimulus'\nexport default class extends Controller {\n  static targets = ['content']\n  static classes = ['truncated', 'expanded']\n\n  connect () {\n    const wrapper = this.element\n\n    if (typeof ResizeObserver === 'undefined') {\n      // Some pre-2020 browsers don't support ResizeObserver, so we can't use this method to listen for the window being resized.\n      // Instead, just expand the text to begin with and don't listen for resize events.\n      wrapper.classList.add(this.expandedClass)\n      return\n    }\n\n    this.observer = new ResizeObserver(entries => {\n      for (const entry of entries) {\n        wrapper.classList[entry.target.scrollHeight > entry.contentRect.height ? 'add' : 'remove'](this.truncatedClass)\n      }\n    })\n\n    this.observer.observe(this.contentTarget)\n  }\n\n  disconnect () {\n    this.disconnectResizeObserver()\n  }\n\n  expand () {\n    this.element.classList.add(this.expandedClass)\n\n    // Once expanded there's no way to truncate the text again, so we can stop listening for resize events.\n    this.disconnectResizeObserver()\n  }\n\n  disconnectResizeObserver () {\n    if (this.observer) {\n      this.observer.disconnect()\n    }\n  }\n}\n","// This file was copied from market-storefront: https://github.com/envato/market-storefront/blob/main/app/javascript/utils/consent.js\nimport {\n  Consent as packageConsent,\n  consented as packageConsented,\n  deferRun as packageDeferRun,\n  userHasOptedOutOfCookiesForCategory as packageUserOptedOut\n} from '@envato/cookie-consent'\n\nconst checkConsentTypePresent = (consentType) => {\n  if (!consentType) {\n    throw Error('Consent type unspecified')\n  }\n}\n// Wrapping these allows for more readable mocks in tests\n// Also allows us to make sure we are always passing consentType\nexport const Consent = packageConsent\nexport const consented = (consentType) => {\n  checkConsentTypePresent(consentType)\n  return packageConsented(consentType)\n}\nexport const deferRun = (job, consentType) => {\n  checkConsentTypePresent(consentType)\n  return packageDeferRun(job, consentType)\n}\nexport const userHasOptedOutOfCookiesForCategory = (consentType) => {\n  checkConsentTypePresent(consentType)\n  return packageUserOptedOut(consentType)\n}\n","// Pass an Error object or a string message (or both) to log it to Rollbar.\n// Any additional custom attributes to log can be passed as an object literal, and a callback function can be passed too.\n// Arguments are documented here: https://docs.rollbar.com/docs/rollbarjs-configuration-reference#rollbarlog\n// This will use severity level 'error' by default, but this can be overridden by specifying a `level` in the custom attributes object.\n// e.g. `handleError('some message', { level: 'info', someOtherAttribute: 'foo' })\nconst handleError = (...args) => {\n  if (process.env.NODE_ENV === 'development') {\n    console.log(...args)\n  }\n  if (typeof window !== 'undefined' && typeof window.Rollbar !== 'undefined') {\n    window.Rollbar.error(...args)\n  }\n}\n\n// Logs a custom telemetry event to Rollbar, which will be visible on the Occurrence page for any individual error occurrence\n// https://docs.rollbar.com/docs/rollbarjs-telemetry\n// `metadata` must be an object with key/value pairs, passing a string will not work.\n// Possible values for `level` are: 'debug', 'info', 'warning', 'error', 'critical'\nconst logTelemetryEvent = (metadata, level = 'info') => {\n  if (typeof window !== 'undefined' && typeof window.Rollbar !== 'undefined') {\n    window.Rollbar.captureEvent(metadata, level)\n  }\n}\n\nexport { handleError, logTelemetryEvent }\n","export const getCookieDomains = () => {\n  // An array of cookie domains should be set as a `data-cookie-domains` attribute\n  // on the <body> tag in Layouts::AppLayout\n  if (document.body.dataset.cookieDomains) {\n    return JSON.parse(document.body.dataset.cookieDomains)\n  }\n\n  return [window.location.hostname]\n}\n","import { handleError } from 'lib/errors'\n\nconst googleAnalytics3 = (...args) => {\n  // We don't want to send any analytics events during the turbo in memory cache loading time.\n  // We wait a few more milliseconds for the network request to load, then we allow events to fire.\n  if (document.documentElement.hasAttribute('data-turbo-preview')) return\n\n  if (typeof window !== 'undefined' && typeof window.gtag3 === 'function') {\n    window.gtag3(...args)\n  }\n}\n\nconst googleAnalytics3Event = ({ eventAction, eventCategory, eventLabel, eventValue = null, nonInteraction = false, callback = null }) => {\n  // Firefox and ad blockers will prevent gtag from running at all.\n  // So we register a callback that is fired after 500ms in case gtag doesn't run at all.\n  const eventCallbackFallback = callback ? setTimeout(callback, 500) : null\n\n  // Extract the current pageType and itemType from the <body> tag, append it to every GA event we send:\n  const pageType = document.body.dataset.analyticsPageType\n  const itemType = document.body.dataset.analyticsItemType\n\n  // Push the GA event into Google Tag Manager:\n  googleAnalytics3(\n    'event',\n    eventAction,\n    {\n      event_category: eventCategory,\n      event_label: eventLabel,\n      value: eventValue,\n      non_interaction: nonInteraction,\n      event_callback: (containerId) => {\n        // This callback is fired for every \"tag\" that is registered in Google Tag Manager.\n        // e.g. once for Analytics, and once for Optimize.\n        // We have to check the container ID starts with \"UA-\" to know it's a Google Analytics callback.\n        if (containerId?.startsWith('UA-')) {\n          // This fires when the GA event has successfully been recorded.\n          // We remove our fallback timer and call the callback function if one exists\n          clearTimeout(eventCallbackFallback)\n          callback && callback()\n        }\n      },\n      // see \"custom_map\" in gtag_config for these custom dimension mappings:\n      page_type: pageType,\n      item_type: itemType\n    }\n  )\n}\n\n// Standardised Google Analytics helpers https://github.com/envato/standard-analytics\n// This function takes a click event and determines whether we should log an event to GA3.\n// We look for a \"section id\" and an \"element id\" and use that to build the event payload.\nconst googleAnalytics3StandardisedClickTracking = (event, submitEventFunction = null) => {\n  const target = event.target.closest('[data-analytics-element-id]')\n  if (!target) return\n\n  const elementId = target.dataset.analyticsElementId\n  const elementLabel = target.dataset.analyticsElementLabel\n  const section = target.closest('[data-analytics-context], [data-analytics-section-id]')\n  if (!section) {\n    handleError('Missing data-analytics-context or data-analytics-section-id for standard analytics target', { elementId, elementLabel })\n    return\n  }\n\n  const sectionId = section.dataset.analyticsContext || section.dataset.analyticsSectionId\n  const sectionLabel = section.dataset.analyticsSectionLabel\n  const tagName = target.nodeName?.toLowerCase()\n\n  if (sectionId && elementId && tagName) {\n    const submitEvent = typeof submitEventFunction === 'function' ? submitEventFunction : googleAnalytics3StandardEvent\n\n    submitEvent({\n      eventType: 'click',\n      sectionId,\n      sectionLabel,\n      elementId,\n      elementLabel,\n      tagName\n    })\n  }\n}\n\n// This function takes all of the data gathered by `googleAnalytics3StandardisedClickTracking()`\n// and builds it into our expected format for a GA3 event.\nconst googleAnalytics3StandardEvent = ({\n  elementId,\n  elementLabel,\n  elementPosition,\n  eventType,\n  pageType,\n  itemType,\n  sectionId,\n  sectionLabel,\n  tagName\n}) => {\n  googleAnalytics3Event({\n    eventCategory: [sectionId, sectionLabel].filter(Boolean).join(';'),\n    eventAction: [eventType, tagName].filter(Boolean).join(';'),\n    eventLabel: [elementId, elementLabel].filter(Boolean).join(';'),\n    eventValue: elementPosition,\n    pageType: pageType,\n    itemType: itemType\n  })\n}\n\nexport { googleAnalytics3, googleAnalytics3Event, googleAnalytics3StandardisedClickTracking, googleAnalytics3StandardEvent }\n","// This converts raw user search text <input> into a string we can safely put in the URL slug\nconst userTextInputToUrlSlug = (textInput) => {\n  if (!textInput) return ''\n  textInput = textInput.toLowerCase()\n  textInput = textInput.replace(/[^a-z0-9À-ÿ\\s-]/g, '') // remove any non alpha characters\n  textInput = textInput.replace(/\\s+/g, '-') // replace 1 or more SPACE in a row with a single -\n  textInput = textInput.replace(/-+/g, '-') // replace 1 or more HYPHEN in a row with a single -\n  textInput = textInput.replace(/^-/, '') // remove any + from start of string\n  textInput = textInput.replace(/-$/g, '') // removing any + from end of string\n  return textInput\n}\n\n// This returns the root item type path for the supplied item type\nconst getItemTypePath = ({ itemType }) => {\n  if (['video', 'videos'].includes(itemType)) {\n    return '/free-stock-video/'\n  }\n  if (itemType === 'art') {\n    return '/free-stock-art/'\n  }\n  if (itemType === 'video_templates') {\n    return '/free-video-templates/'\n  }\n  if (itemType === 'video_templates_after_effects') {\n    return '/free-after-effects-templates/'\n  }\n  if (itemType === 'video_templates_davinci_resolve') {\n    return '/free-davinci-resolve-templates/'\n  }\n  if (itemType === 'video_templates_final_cut_pro') {\n    return '/free-final-cut-pro-templates/'\n  }\n  if (itemType === 'video_templates_premiere_pro') {\n    return '/free-premiere-pro-templates/'\n  }\n  if (itemType === 'music') {\n    return '/free-stock-music/'\n  }\n  if (itemType === 'sfx') {\n    return '/free-sound-effects/'\n  }\n  if (itemType === 'icons') {\n    return 'https://www.reshot.com/free-svg-icons/'\n  }\n  return '/'\n}\n\nconst getItemSearchPath = ({ itemType, searchTermUrlSlug } = {}) => {\n  const searchSlug = itemType === 'icons' ? '' : 'discover/'\n  let searchUrl = `${getItemTypePath({ itemType })}${searchSlug}`\n  if (searchTermUrlSlug) {\n    const analyticsParams = itemType === 'icons' ? '?utm_source=mixkit&utm_campaign=mixkit-header-search' : ''\n    searchUrl = `${searchUrl}${encodeURIComponent(searchTermUrlSlug)}/${analyticsParams}`\n  }\n  return searchUrl\n}\n\nexport { userTextInputToUrlSlug, getItemSearchPath }\n","// Wrappers around localStorage access with built-in error handling.\n// Sometimes we cannot access localStorage due to the user's browser privacy\n// settings, which is their right! There's no point reporting those errors to\n// Rollbar since there's nothing we can do about that, so we catch those errors\n// and return safely here.\n// For this reason, we should never rely on localStorage being available.\n\nexport const localStorageSet = (key, value) => {\n  try {\n    window.localStorage.setItem(key, value)\n  } catch (e) {\n    // No access to localStorage. Silence this error and return safely.\n  }\n}\n\nexport const localStorageRemove = (key) => {\n  try {\n    window.localStorage.removeItem(key)\n  } catch (e) {\n    // No access to localStorage. Silence this error and return safely.\n  }\n}\n\nexport const localStorageGet = (key, defaultValue = null) => {\n  try {\n    const value = window.localStorage.getItem(key)\n\n    // If the key is not present in localStorage, the browser will return `null`\n    if (value === null) return defaultValue\n\n    return value\n  } catch (e) {\n    // No access to localStorage. Silence this error and safely return the default value.\n    return defaultValue\n  }\n}\n",null,"/*!\n * JavaScript Cookie v2.2.1\n * https://github.com/js-cookie/js-cookie\n *\n * Copyright 2006, 2015 Klaus Hartl & Fagner Brack\n * Released under the MIT license\n */\n;(function (factory) {\n\tvar registeredInModuleLoader;\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (!registeredInModuleLoader) {\n\t\tvar OldCookies = window.Cookies;\n\t\tvar api = window.Cookies = factory();\n\t\tapi.noConflict = function () {\n\t\t\twindow.Cookies = OldCookies;\n\t\t\treturn api;\n\t\t};\n\t}\n}(function () {\n\tfunction extend () {\n\t\tvar i = 0;\n\t\tvar result = {};\n\t\tfor (; i < arguments.length; i++) {\n\t\t\tvar attributes = arguments[ i ];\n\t\t\tfor (var key in attributes) {\n\t\t\t\tresult[key] = attributes[key];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction decode (s) {\n\t\treturn s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);\n\t}\n\n\tfunction init (converter) {\n\t\tfunction api() {}\n\n\t\tfunction set (key, value, attributes) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tattributes = extend({\n\t\t\t\tpath: '/'\n\t\t\t}, api.defaults, attributes);\n\n\t\t\tif (typeof attributes.expires === 'number') {\n\t\t\t\tattributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);\n\t\t\t}\n\n\t\t\t// We're using \"expires\" because \"max-age\" is not supported by IE\n\t\t\tattributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';\n\n\t\t\ttry {\n\t\t\t\tvar result = JSON.stringify(value);\n\t\t\t\tif (/^[\\{\\[]/.test(result)) {\n\t\t\t\t\tvalue = result;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\n\t\t\tvalue = converter.write ?\n\t\t\t\tconverter.write(value, key) :\n\t\t\t\tencodeURIComponent(String(value))\n\t\t\t\t\t.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);\n\n\t\t\tkey = encodeURIComponent(String(key))\n\t\t\t\t.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)\n\t\t\t\t.replace(/[\\(\\)]/g, escape);\n\n\t\t\tvar stringifiedAttributes = '';\n\t\t\tfor (var attributeName in attributes) {\n\t\t\t\tif (!attributes[attributeName]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstringifiedAttributes += '; ' + attributeName;\n\t\t\t\tif (attributes[attributeName] === true) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Considers RFC 6265 section 5.2:\n\t\t\t\t// ...\n\t\t\t\t// 3.  If the remaining unparsed-attributes contains a %x3B (\";\")\n\t\t\t\t//     character:\n\t\t\t\t// Consume the characters of the unparsed-attributes up to,\n\t\t\t\t// not including, the first %x3B (\";\") character.\n\t\t\t\t// ...\n\t\t\t\tstringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n\t\t\t}\n\n\t\t\treturn (document.cookie = key + '=' + value + stringifiedAttributes);\n\t\t}\n\n\t\tfunction get (key, json) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar jar = {};\n\t\t\t// To prevent the for loop in the first place assign an empty array\n\t\t\t// in case there are no cookies at all.\n\t\t\tvar cookies = document.cookie ? document.cookie.split('; ') : [];\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < cookies.length; i++) {\n\t\t\t\tvar parts = cookies[i].split('=');\n\t\t\t\tvar cookie = parts.slice(1).join('=');\n\n\t\t\t\tif (!json && cookie.charAt(0) === '\"') {\n\t\t\t\t\tcookie = cookie.slice(1, -1);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tvar name = decode(parts[0]);\n\t\t\t\t\tcookie = (converter.read || converter)(cookie, name) ||\n\t\t\t\t\t\tdecode(cookie);\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcookie = JSON.parse(cookie);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\n\t\t\t\t\tjar[name] = cookie;\n\n\t\t\t\t\tif (key === name) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\n\t\t\treturn key ? jar[key] : jar;\n\t\t}\n\n\t\tapi.set = set;\n\t\tapi.get = function (key) {\n\t\t\treturn get(key, false /* read as raw */);\n\t\t};\n\t\tapi.getJSON = function (key) {\n\t\t\treturn get(key, true /* read as json */);\n\t\t};\n\t\tapi.remove = function (key, attributes) {\n\t\t\tset(key, '', extend(attributes, {\n\t\t\t\texpires: -1\n\t\t\t}));\n\t\t};\n\n\t\tapi.defaults = {};\n\n\t\tapi.withConverter = init;\n\n\t\treturn api;\n\t}\n\n\treturn init(function () {});\n}));\n","const defaultConfig = {\n  elementsDomain: 'elements.envato.com',\n  marketDomains: [\n    'themeforest.net',\n    'codecanyon.net',\n    'audiojungle.net',\n    'videohive.net',\n    'graphicriver.net',\n    'photodune.net',\n    '3docean.net',\n    'marketplace.envato.com',\n    'market.envato.com',\n    'envatomarketplaces.com',\n    'market.styleguide.envato.com'\n  ],\n  tutsplusDomain: 'tutsplus.com',\n  skipNormalizationForAttributes: [ 'elements_item_id' ], // Deprecated: 'elements_item_id' will be removed from this list in the next major release.\n}\n\nmodule.exports = defaultConfig\n","const { deepNormalizeAttributes, normalizeAttributeKey, normalizeAttributeValue } = require('./normalization')\nconst sendAnalyticsEvent = require('./sendAnalyticsEvent')\nconst standardisedClickTracking = require('./standardisedClickTracking')\n\nmodule.exports = {\n  deepNormalizeAttributes,\n  normalizeAttributeKey,\n  normalizeAttributeValue,\n  sendAnalyticsEvent,\n  standardisedClickTracking\n}\n","const defaultConfig = require('./defaultConfig')\nconst { isObject } = require('./util')\n\n// Normalize event data following the specs in our implementation guide:\n// https://www.notion.so/GA4-Event-implementation-guide-3f309f96f44740c1b2f6e0fe4484310c#1bfb3e7ee4664f9da20b070df2be2fb8\n// Keys are snake_cased and values are lowercased.\n// Pass `stringifyArrays: true` to flatten arrays and convert them to comma-separated strings.\nconst deepNormalizeAttributes = (theObject, { stringifyArrays = false, customConfig = {} } = {}) => {\n  const config = { ...defaultConfig, ...customConfig }\n\n  if (Array.isArray(theObject)) {\n    if (stringifyArrays) return normalizeAttributeValue(theObject)\n\n    return theObject.map((value) => deepNormalizeAttributes(value, { stringifyArrays, customConfig }))\n  }\n\n  if (isObject(theObject)) {\n    const normalizedObject = {}\n\n    Object.entries(theObject).forEach(([key, value]) => {\n      const normalizedKey = normalizeAttributeKey(key)\n\n      if (config.skipNormalizationForAttributes.includes(key) || config.skipNormalizationForAttributes.includes(normalizedKey)) {\n        normalizedObject[normalizedKey] = value || undefined\n        return\n      }\n\n      normalizedObject[normalizedKey] = deepNormalizeAttributes(value, { stringifyArrays, customConfig })\n    })\n\n    return normalizedObject\n  }\n\n  return normalizeAttributeValue(theObject)\n}\n\nconst normalizeAttributeKey = (key) => {\n  return key\n    .replace(/\\W+|\\B(?=[A-Z])/g, '_')\n    .toLowerCase()\n    .replace(/[\\s_]+/g, '_')\n    .replace(/^_+|_+$/g, '')\n}\n\n// This `normalizeAttributeValue` function is duplicated in some other repositories, for reasons:\n// - https://github.com/envato/mixkit/blob/e2fe5c5/app/components/components/google_tag_manager_body.html.erb\n// - https://github.com/envato/tutsplus/blob/0325d08/hub/app/components/google_tag_manager_body_component/google_tag_manager_body_component.html.erb\n// - https://github.com/envato/market-storefront/blob/771cbed/app/components/shared/html_body/google_tag_manager_page_attributes_component.html.erb\n// - https://github.com/envato/marketplace/blob/0269e47/app/views/common/_set_page_attributes.html.erb\n// If it's updated here, please mention that in the changelog and let the owners of the above repos know that they should update their copy to match.\nconst normalizeAttributeValue = (value) => {\n  if (value === undefined || value === null) return undefined\n\n  let normalizedValue\n\n  if (Array.isArray(value)) {\n    normalizedValue = normalizedValue || value\n      .map(normalizeAttributeValue)\n      .filter(Boolean)\n      .join(', ')\n  }\n\n  normalizedValue = normalizedValue || value\n    .toString()\n    .toLowerCase()\n    .trim()\n    .replace(/&amp;/g, '&')\n    .replace(/&#39;/g, \"'\")\n    .replace(/\\s+/g, ' ')\n\n  if (normalizedValue === '') return undefined\n  return normalizedValue\n}\n\nmodule.exports = {\n  deepNormalizeAttributes,\n  normalizeAttributeKey,\n  normalizeAttributeValue\n}\n","const { deepNormalizeAttributes } = require('./normalization')\nconst { isNonEmptyObject } = require('./util')\n\nconst pushToDataLayer = (eventData) => {\n  window.dataLayer = window.dataLayer || []\n\n  window.dataLayer.push(eventData)\n}\n\nconst sendAnalyticsEvent = ({\n  eventName,\n  eventType = 'user',\n  callback = null,\n  ecommerce = null,\n  userAttributes = null,\n  customConfig = {},\n  ...eventAttributes\n}) => {\n  const eventData = {\n    event: 'track_event', // This may be overridden to 'e-commerce' below if this event contains ecommerce data.\n    event_name: eventName,\n    event_attributes: {\n      event_type: eventType,\n      custom_timestamp: Date.now(),\n      ...deepNormalizeAttributes(eventAttributes, { stringifyArrays: true, customConfig })\n    },\n    eventCallback: buildCallback(callback)\n  }\n\n  // Clear any previous event attributes data from the dataLayer\n  const preEventPayload = { event_attributes: null }\n\n  if (isNonEmptyObject(userAttributes)) eventData.user_attributes = deepNormalizeAttributes(userAttributes, { stringifyArrays: true, customConfig })\n\n  if (isNonEmptyObject(ecommerce)) {\n    eventData.event = 'e-commerce'\n    eventData.ecommerce = deepNormalizeAttributes(ecommerce, { customConfig })\n\n    // Clear any previous ecommerce data from the dataLayer\n    preEventPayload.ecommerce = null\n  }\n\n  pushToDataLayer(preEventPayload)\n\n  // Push the event into Google Tag Manager:\n  pushToDataLayer(eventData)\n}\n\nconst buildCallback = (originalCallback) => {\n  if (!originalCallback) return null\n\n  // GTM will not be running at all if it's blocked by Cookiebot, an ad blocker, or a browser with strong privacy settings.\n  // So we register a callback that is fired after 500ms in case GTM never gets to process the event.\n  const eventCallbackFallback = setTimeout(originalCallback, 500)\n\n  return (containerId) => {\n    // This callback is fired for every \"tag\" that is registered in Google Tag Manager.\n    // e.g. once for Analytics, and once for Optimize.\n    // We have to check the container ID starts with \"G-\" to know it's a Google Analytics callback.\n    if (containerId?.startsWith('G-')) {\n      // This fires when the GA event has successfully been recorded.\n      // We remove our fallback timer and call the callback function.\n      clearTimeout(eventCallbackFallback)\n      originalCallback()\n    }\n  }\n}\n\nmodule.exports = sendAnalyticsEvent\n","const sendAnalyticsEvent = require('./sendAnalyticsEvent')\nconst defaultConfig = require('./defaultConfig')\n\nconst standardisedClickTracking = (event, customConfig = {}) => {\n  const config = {...defaultConfig, ...customConfig}\n  // Find out if this click event has an element we want to track.\n  // Try the clicked element first, then look for any parent elements that might be trackable.\n  const element = [event.target, event.target.closest('a, [data-analytics-click-label]')].find(isElementTrackable)\n\n  // If the element that was clicked is not something we want to track, return early.\n  if (!element) return\n\n  const linkAttributes = extractLinkAttributes(element, config)\n\n  // See the GA4 Event Attributes Catalogue for a description of these attributes:\n  // https://www.notion.so/853a20e4ed93407481bd68dc0ba27741?v=dfcbd9e925d24db5bb1e14172b9dbbba\n  const attributes = {\n    eventName: 'internal_click', // This may be overridden by linkAttributes below depending on the link URL.\n    context: element.closest('[data-analytics-context]')?.dataset.analyticsContext,\n    contextDetail: element.closest('[data-analytics-context-detail]')?.dataset.analyticsContextDetail,\n    clickLabel: extractClickLabel(element),\n    clickType: element.tagName,\n    ...linkAttributes,\n    customConfig,\n  }\n\n  sendAnalyticsEvent(attributes)\n}\n\nconst extractClickLabel = (element) => (\n  [\n    element.dataset.analyticsClickLabel,\n    element.textContent?.trim(),\n    element.attributes.title?.value.trim(),\n    element.attributes['aria-label']?.value.trim(),\n    element.attributes.alt?.value.trim()\n  ].find(Boolean)\n)\n\nconst isMarketHost = (host, domains) => {\n  return domains.some(domain => host.endsWith(domain))\n}\n\nconst extractLinkAttributes = (element, config) => {\n  const linkAttributes = {}\n\n  // If this element isn't a link, it won't have any link attributes for us to extract.\n  if (!element.href) return linkAttributes\n\n  // If the `href` is just a path without a host/origin, we need to provide a base URL for it.\n  // `HTMLAnchorElement.href` is a stringifier so it _should_ always have a host:\n  // https://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement/href\n  // but we provide the URL of the current page as the optional `base` argument to cover any unexpected edge cases.\n  const targetUrl = new URL(element.href, window.location.href)\n\n  // If this is something other than a regular web link (e.g. a mailto: link), treat it as an external link\n  // and don't try to extract any web-specific attributes from it. Just set the whole thing as the linkUrl.\n  if (!['https:', 'http:'].includes(targetUrl.protocol)) {\n    linkAttributes.eventName = 'external_click'\n    linkAttributes.linkUrl = targetUrl.toString()\n    return linkAttributes\n  }\n\n  const queryParams = targetUrl.searchParams\n  queryParams.delete('_ga') // Remove _ga autolinker query param, it'll just create noise in GA\n\n  linkAttributes.linkUrl = targetUrl.origin + targetUrl.pathname\n  linkAttributes.linkDomain = targetUrl.host\n  linkAttributes.linkQuery = queryParams.toString()\n  linkAttributes.linkAnchor = targetUrl.hash\n\n  linkAttributes.eventName = extractEventName(targetUrl, config)\n\n  return linkAttributes\n}\n\nconst extractEventName = (targetUrl, {elementsDomain, marketDomains, tutsplusDomain}) => {\n  const currentUrl = window.location.host\n  // eventName will be 'internal_click' by default, but we can override it here if the URL is pointing to another site\n  if (targetUrl.host === currentUrl) return 'internal_click'\n  if (targetUrl.host.endsWith(elementsDomain)) {\n    if (currentUrl.endsWith(elementsDomain)) {\n      return 'internal_click'\n    }\n    else {\n      return 'elements_click'\n    }\n  }\n  if (isMarketHost(targetUrl.host, marketDomains)) {\n    if (isMarketHost(currentUrl, marketDomains)) {\n      return 'internal_click'\n    } else {\n      return 'market_click'\n    }\n  }\n  if (targetUrl.host === 'placeit.net') return 'placeit_click'\n  if (targetUrl.host.endsWith(tutsplusDomain) && currentUrl.endsWith(tutsplusDomain)) return 'internal_click'\n\n  return 'external_click'\n}\n\nconst isElementTrackable = (element) => {\n  // Handle undefined/null\n  if (!element) return false\n\n  // Make it possible for elements with their own custom tracking code to opt-out of these standardised events\n  // by setting a `data-analytics-has-custom-tracking=\"true\"` attribute on either the element or a parent element\n  if (element.closest('[data-analytics-has-custom-tracking=\"true\"]')) return false\n\n  // All links should be trackable\n  if (element.tagName === 'A') {\n    const elementHref = element.attributes.href?.value.trim()\n\n    if (!elementHref) return false // unless their href is missing or empty\n\n    if (isBlockedHref(elementHref)) return false\n\n    return true\n  }\n\n  // Any element with a data-analytics-click-label attribute is trackable\n  if (element.dataset.analyticsClickLabel !== undefined) return true\n\n  // Otherwise this is some other element we don't care about tracking.\n  return false\n}\n\nconst matchHrefToString = str => { return (href) => href === str }\nconst matchHrefToRegexp = re => { return (href) => re.test(href) }\n\nconst hrefBlockList = [\n  matchHrefToString('#'),\n  matchHrefToRegexp(/^javascript:/)\n]\n\nconst isBlockedHref = href => hrefBlockList.some(checkFunction => checkFunction(href))\n\nmodule.exports = standardisedClickTracking\n","const isObject = (possiblyObject) => (\n  typeof possiblyObject === 'object' &&\n  Object.prototype.toString.call(possiblyObject) === '[object Object]'\n)\n\nconst isNonEmptyObject = (possiblyObject) => (\n  isObject(possiblyObject) && Object.keys(possiblyObject).length > 0\n)\n\nmodule.exports = {\n  isObject,\n  isNonEmptyObject\n}\n","/*\nStimulus 3.2.1\nCopyright © 2023 Basecamp, LLC\n */\nclass EventListener {\n    constructor(eventTarget, eventName, eventOptions) {\n        this.eventTarget = eventTarget;\n        this.eventName = eventName;\n        this.eventOptions = eventOptions;\n        this.unorderedBindings = new Set();\n    }\n    connect() {\n        this.eventTarget.addEventListener(this.eventName, this, this.eventOptions);\n    }\n    disconnect() {\n        this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions);\n    }\n    bindingConnected(binding) {\n        this.unorderedBindings.add(binding);\n    }\n    bindingDisconnected(binding) {\n        this.unorderedBindings.delete(binding);\n    }\n    handleEvent(event) {\n        const extendedEvent = extendEvent(event);\n        for (const binding of this.bindings) {\n            if (extendedEvent.immediatePropagationStopped) {\n                break;\n            }\n            else {\n                binding.handleEvent(extendedEvent);\n            }\n        }\n    }\n    hasBindings() {\n        return this.unorderedBindings.size > 0;\n    }\n    get bindings() {\n        return Array.from(this.unorderedBindings).sort((left, right) => {\n            const leftIndex = left.index, rightIndex = right.index;\n            return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0;\n        });\n    }\n}\nfunction extendEvent(event) {\n    if (\"immediatePropagationStopped\" in event) {\n        return event;\n    }\n    else {\n        const { stopImmediatePropagation } = event;\n        return Object.assign(event, {\n            immediatePropagationStopped: false,\n            stopImmediatePropagation() {\n                this.immediatePropagationStopped = true;\n                stopImmediatePropagation.call(this);\n            },\n        });\n    }\n}\n\nclass Dispatcher {\n    constructor(application) {\n        this.application = application;\n        this.eventListenerMaps = new Map();\n        this.started = false;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.eventListeners.forEach((eventListener) => eventListener.connect());\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.eventListeners.forEach((eventListener) => eventListener.disconnect());\n        }\n    }\n    get eventListeners() {\n        return Array.from(this.eventListenerMaps.values()).reduce((listeners, map) => listeners.concat(Array.from(map.values())), []);\n    }\n    bindingConnected(binding) {\n        this.fetchEventListenerForBinding(binding).bindingConnected(binding);\n    }\n    bindingDisconnected(binding, clearEventListeners = false) {\n        this.fetchEventListenerForBinding(binding).bindingDisconnected(binding);\n        if (clearEventListeners)\n            this.clearEventListenersForBinding(binding);\n    }\n    handleError(error, message, detail = {}) {\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    clearEventListenersForBinding(binding) {\n        const eventListener = this.fetchEventListenerForBinding(binding);\n        if (!eventListener.hasBindings()) {\n            eventListener.disconnect();\n            this.removeMappedEventListenerFor(binding);\n        }\n    }\n    removeMappedEventListenerFor(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        eventListenerMap.delete(cacheKey);\n        if (eventListenerMap.size == 0)\n            this.eventListenerMaps.delete(eventTarget);\n    }\n    fetchEventListenerForBinding(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        return this.fetchEventListener(eventTarget, eventName, eventOptions);\n    }\n    fetchEventListener(eventTarget, eventName, eventOptions) {\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        let eventListener = eventListenerMap.get(cacheKey);\n        if (!eventListener) {\n            eventListener = this.createEventListener(eventTarget, eventName, eventOptions);\n            eventListenerMap.set(cacheKey, eventListener);\n        }\n        return eventListener;\n    }\n    createEventListener(eventTarget, eventName, eventOptions) {\n        const eventListener = new EventListener(eventTarget, eventName, eventOptions);\n        if (this.started) {\n            eventListener.connect();\n        }\n        return eventListener;\n    }\n    fetchEventListenerMapForEventTarget(eventTarget) {\n        let eventListenerMap = this.eventListenerMaps.get(eventTarget);\n        if (!eventListenerMap) {\n            eventListenerMap = new Map();\n            this.eventListenerMaps.set(eventTarget, eventListenerMap);\n        }\n        return eventListenerMap;\n    }\n    cacheKey(eventName, eventOptions) {\n        const parts = [eventName];\n        Object.keys(eventOptions)\n            .sort()\n            .forEach((key) => {\n            parts.push(`${eventOptions[key] ? \"\" : \"!\"}${key}`);\n        });\n        return parts.join(\":\");\n    }\n}\n\nconst defaultActionDescriptorFilters = {\n    stop({ event, value }) {\n        if (value)\n            event.stopPropagation();\n        return true;\n    },\n    prevent({ event, value }) {\n        if (value)\n            event.preventDefault();\n        return true;\n    },\n    self({ event, value, element }) {\n        if (value) {\n            return element === event.target;\n        }\n        else {\n            return true;\n        }\n    },\n};\nconst descriptorPattern = /^(?:(?:([^.]+?)\\+)?(.+?)(?:\\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/;\nfunction parseActionDescriptorString(descriptorString) {\n    const source = descriptorString.trim();\n    const matches = source.match(descriptorPattern) || [];\n    let eventName = matches[2];\n    let keyFilter = matches[3];\n    if (keyFilter && ![\"keydown\", \"keyup\", \"keypress\"].includes(eventName)) {\n        eventName += `.${keyFilter}`;\n        keyFilter = \"\";\n    }\n    return {\n        eventTarget: parseEventTarget(matches[4]),\n        eventName,\n        eventOptions: matches[7] ? parseEventOptions(matches[7]) : {},\n        identifier: matches[5],\n        methodName: matches[6],\n        keyFilter: matches[1] || keyFilter,\n    };\n}\nfunction parseEventTarget(eventTargetName) {\n    if (eventTargetName == \"window\") {\n        return window;\n    }\n    else if (eventTargetName == \"document\") {\n        return document;\n    }\n}\nfunction parseEventOptions(eventOptions) {\n    return eventOptions\n        .split(\":\")\n        .reduce((options, token) => Object.assign(options, { [token.replace(/^!/, \"\")]: !/^!/.test(token) }), {});\n}\nfunction stringifyEventTarget(eventTarget) {\n    if (eventTarget == window) {\n        return \"window\";\n    }\n    else if (eventTarget == document) {\n        return \"document\";\n    }\n}\n\nfunction camelize(value) {\n    return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase());\n}\nfunction namespaceCamelize(value) {\n    return camelize(value.replace(/--/g, \"-\").replace(/__/g, \"_\"));\n}\nfunction capitalize(value) {\n    return value.charAt(0).toUpperCase() + value.slice(1);\n}\nfunction dasherize(value) {\n    return value.replace(/([A-Z])/g, (_, char) => `-${char.toLowerCase()}`);\n}\nfunction tokenize(value) {\n    return value.match(/[^\\s]+/g) || [];\n}\n\nfunction isSomething(object) {\n    return object !== null && object !== undefined;\n}\nfunction hasProperty(object, property) {\n    return Object.prototype.hasOwnProperty.call(object, property);\n}\n\nconst allModifiers = [\"meta\", \"ctrl\", \"alt\", \"shift\"];\nclass Action {\n    constructor(element, index, descriptor, schema) {\n        this.element = element;\n        this.index = index;\n        this.eventTarget = descriptor.eventTarget || element;\n        this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error(\"missing event name\");\n        this.eventOptions = descriptor.eventOptions || {};\n        this.identifier = descriptor.identifier || error(\"missing identifier\");\n        this.methodName = descriptor.methodName || error(\"missing method name\");\n        this.keyFilter = descriptor.keyFilter || \"\";\n        this.schema = schema;\n    }\n    static forToken(token, schema) {\n        return new this(token.element, token.index, parseActionDescriptorString(token.content), schema);\n    }\n    toString() {\n        const eventFilter = this.keyFilter ? `.${this.keyFilter}` : \"\";\n        const eventTarget = this.eventTargetName ? `@${this.eventTargetName}` : \"\";\n        return `${this.eventName}${eventFilter}${eventTarget}->${this.identifier}#${this.methodName}`;\n    }\n    shouldIgnoreKeyboardEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = this.keyFilter.split(\"+\");\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        const standardFilter = filters.filter((key) => !allModifiers.includes(key))[0];\n        if (!standardFilter) {\n            return false;\n        }\n        if (!hasProperty(this.keyMappings, standardFilter)) {\n            error(`contains unknown key filter: ${this.keyFilter}`);\n        }\n        return this.keyMappings[standardFilter].toLowerCase() !== event.key.toLowerCase();\n    }\n    shouldIgnoreMouseEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = [this.keyFilter];\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        return false;\n    }\n    get params() {\n        const params = {};\n        const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`, \"i\");\n        for (const { name, value } of Array.from(this.element.attributes)) {\n            const match = name.match(pattern);\n            const key = match && match[1];\n            if (key) {\n                params[camelize(key)] = typecast(value);\n            }\n        }\n        return params;\n    }\n    get eventTargetName() {\n        return stringifyEventTarget(this.eventTarget);\n    }\n    get keyMappings() {\n        return this.schema.keyMappings;\n    }\n    keyFilterDissatisfied(event, filters) {\n        const [meta, ctrl, alt, shift] = allModifiers.map((modifier) => filters.includes(modifier));\n        return event.metaKey !== meta || event.ctrlKey !== ctrl || event.altKey !== alt || event.shiftKey !== shift;\n    }\n}\nconst defaultEventNames = {\n    a: () => \"click\",\n    button: () => \"click\",\n    form: () => \"submit\",\n    details: () => \"toggle\",\n    input: (e) => (e.getAttribute(\"type\") == \"submit\" ? \"click\" : \"input\"),\n    select: () => \"change\",\n    textarea: () => \"input\",\n};\nfunction getDefaultEventNameForElement(element) {\n    const tagName = element.tagName.toLowerCase();\n    if (tagName in defaultEventNames) {\n        return defaultEventNames[tagName](element);\n    }\n}\nfunction error(message) {\n    throw new Error(message);\n}\nfunction typecast(value) {\n    try {\n        return JSON.parse(value);\n    }\n    catch (o_O) {\n        return value;\n    }\n}\n\nclass Binding {\n    constructor(context, action) {\n        this.context = context;\n        this.action = action;\n    }\n    get index() {\n        return this.action.index;\n    }\n    get eventTarget() {\n        return this.action.eventTarget;\n    }\n    get eventOptions() {\n        return this.action.eventOptions;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    handleEvent(event) {\n        const actionEvent = this.prepareActionEvent(event);\n        if (this.willBeInvokedByEvent(event) && this.applyEventModifiers(actionEvent)) {\n            this.invokeWithEvent(actionEvent);\n        }\n    }\n    get eventName() {\n        return this.action.eventName;\n    }\n    get method() {\n        const method = this.controller[this.methodName];\n        if (typeof method == \"function\") {\n            return method;\n        }\n        throw new Error(`Action \"${this.action}\" references undefined method \"${this.methodName}\"`);\n    }\n    applyEventModifiers(event) {\n        const { element } = this.action;\n        const { actionDescriptorFilters } = this.context.application;\n        const { controller } = this.context;\n        let passes = true;\n        for (const [name, value] of Object.entries(this.eventOptions)) {\n            if (name in actionDescriptorFilters) {\n                const filter = actionDescriptorFilters[name];\n                passes = passes && filter({ name, value, event, element, controller });\n            }\n            else {\n                continue;\n            }\n        }\n        return passes;\n    }\n    prepareActionEvent(event) {\n        return Object.assign(event, { params: this.action.params });\n    }\n    invokeWithEvent(event) {\n        const { target, currentTarget } = event;\n        try {\n            this.method.call(this.controller, event);\n            this.context.logDebugActivity(this.methodName, { event, target, currentTarget, action: this.methodName });\n        }\n        catch (error) {\n            const { identifier, controller, element, index } = this;\n            const detail = { identifier, controller, element, index, event };\n            this.context.handleError(error, `invoking action \"${this.action}\"`, detail);\n        }\n    }\n    willBeInvokedByEvent(event) {\n        const eventTarget = event.target;\n        if (event instanceof KeyboardEvent && this.action.shouldIgnoreKeyboardEvent(event)) {\n            return false;\n        }\n        if (event instanceof MouseEvent && this.action.shouldIgnoreMouseEvent(event)) {\n            return false;\n        }\n        if (this.element === eventTarget) {\n            return true;\n        }\n        else if (eventTarget instanceof Element && this.element.contains(eventTarget)) {\n            return this.scope.containsElement(eventTarget);\n        }\n        else {\n            return this.scope.containsElement(this.action.element);\n        }\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    get methodName() {\n        return this.action.methodName;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nclass ElementObserver {\n    constructor(element, delegate) {\n        this.mutationObserverInit = { attributes: true, childList: true, subtree: true };\n        this.element = element;\n        this.started = false;\n        this.delegate = delegate;\n        this.elements = new Set();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.refresh();\n        }\n    }\n    pause(callback) {\n        if (this.started) {\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n        callback();\n        if (!this.started) {\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            const matches = new Set(this.matchElementsInTree());\n            for (const element of Array.from(this.elements)) {\n                if (!matches.has(element)) {\n                    this.removeElement(element);\n                }\n            }\n            for (const element of Array.from(matches)) {\n                this.addElement(element);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        if (mutation.type == \"attributes\") {\n            this.processAttributeChange(mutation.target, mutation.attributeName);\n        }\n        else if (mutation.type == \"childList\") {\n            this.processRemovedNodes(mutation.removedNodes);\n            this.processAddedNodes(mutation.addedNodes);\n        }\n    }\n    processAttributeChange(element, attributeName) {\n        if (this.elements.has(element)) {\n            if (this.delegate.elementAttributeChanged && this.matchElement(element)) {\n                this.delegate.elementAttributeChanged(element, attributeName);\n            }\n            else {\n                this.removeElement(element);\n            }\n        }\n        else if (this.matchElement(element)) {\n            this.addElement(element);\n        }\n    }\n    processRemovedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element) {\n                this.processTree(element, this.removeElement);\n            }\n        }\n    }\n    processAddedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element && this.elementIsActive(element)) {\n                this.processTree(element, this.addElement);\n            }\n        }\n    }\n    matchElement(element) {\n        return this.delegate.matchElement(element);\n    }\n    matchElementsInTree(tree = this.element) {\n        return this.delegate.matchElementsInTree(tree);\n    }\n    processTree(tree, processor) {\n        for (const element of this.matchElementsInTree(tree)) {\n            processor.call(this, element);\n        }\n    }\n    elementFromNode(node) {\n        if (node.nodeType == Node.ELEMENT_NODE) {\n            return node;\n        }\n    }\n    elementIsActive(element) {\n        if (element.isConnected != this.element.isConnected) {\n            return false;\n        }\n        else {\n            return this.element.contains(element);\n        }\n    }\n    addElement(element) {\n        if (!this.elements.has(element)) {\n            if (this.elementIsActive(element)) {\n                this.elements.add(element);\n                if (this.delegate.elementMatched) {\n                    this.delegate.elementMatched(element);\n                }\n            }\n        }\n    }\n    removeElement(element) {\n        if (this.elements.has(element)) {\n            this.elements.delete(element);\n            if (this.delegate.elementUnmatched) {\n                this.delegate.elementUnmatched(element);\n            }\n        }\n    }\n}\n\nclass AttributeObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeName = attributeName;\n        this.delegate = delegate;\n        this.elementObserver = new ElementObserver(element, this);\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    get selector() {\n        return `[${this.attributeName}]`;\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    matchElement(element) {\n        return element.hasAttribute(this.attributeName);\n    }\n    matchElementsInTree(tree) {\n        const match = this.matchElement(tree) ? [tree] : [];\n        const matches = Array.from(tree.querySelectorAll(this.selector));\n        return match.concat(matches);\n    }\n    elementMatched(element) {\n        if (this.delegate.elementMatchedAttribute) {\n            this.delegate.elementMatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementUnmatched(element) {\n        if (this.delegate.elementUnmatchedAttribute) {\n            this.delegate.elementUnmatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementAttributeChanged(element, attributeName) {\n        if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) {\n            this.delegate.elementAttributeValueChanged(element, attributeName);\n        }\n    }\n}\n\nfunction add(map, key, value) {\n    fetch(map, key).add(value);\n}\nfunction del(map, key, value) {\n    fetch(map, key).delete(value);\n    prune(map, key);\n}\nfunction fetch(map, key) {\n    let values = map.get(key);\n    if (!values) {\n        values = new Set();\n        map.set(key, values);\n    }\n    return values;\n}\nfunction prune(map, key) {\n    const values = map.get(key);\n    if (values != null && values.size == 0) {\n        map.delete(key);\n    }\n}\n\nclass Multimap {\n    constructor() {\n        this.valuesByKey = new Map();\n    }\n    get keys() {\n        return Array.from(this.valuesByKey.keys());\n    }\n    get values() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((values, set) => values.concat(Array.from(set)), []);\n    }\n    get size() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((size, set) => size + set.size, 0);\n    }\n    add(key, value) {\n        add(this.valuesByKey, key, value);\n    }\n    delete(key, value) {\n        del(this.valuesByKey, key, value);\n    }\n    has(key, value) {\n        const values = this.valuesByKey.get(key);\n        return values != null && values.has(value);\n    }\n    hasKey(key) {\n        return this.valuesByKey.has(key);\n    }\n    hasValue(value) {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.some((set) => set.has(value));\n    }\n    getValuesForKey(key) {\n        const values = this.valuesByKey.get(key);\n        return values ? Array.from(values) : [];\n    }\n    getKeysForValue(value) {\n        return Array.from(this.valuesByKey)\n            .filter(([_key, values]) => values.has(value))\n            .map(([key, _values]) => key);\n    }\n}\n\nclass IndexedMultimap extends Multimap {\n    constructor() {\n        super();\n        this.keysByValue = new Map();\n    }\n    get values() {\n        return Array.from(this.keysByValue.keys());\n    }\n    add(key, value) {\n        super.add(key, value);\n        add(this.keysByValue, value, key);\n    }\n    delete(key, value) {\n        super.delete(key, value);\n        del(this.keysByValue, value, key);\n    }\n    hasValue(value) {\n        return this.keysByValue.has(value);\n    }\n    getKeysForValue(value) {\n        const set = this.keysByValue.get(value);\n        return set ? Array.from(set) : [];\n    }\n}\n\nclass SelectorObserver {\n    constructor(element, selector, delegate, details) {\n        this._selector = selector;\n        this.details = details;\n        this.elementObserver = new ElementObserver(element, this);\n        this.delegate = delegate;\n        this.matchesByElement = new Multimap();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    get selector() {\n        return this._selector;\n    }\n    set selector(selector) {\n        this._selector = selector;\n        this.refresh();\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    matchElement(element) {\n        const { selector } = this;\n        if (selector) {\n            const matches = element.matches(selector);\n            if (this.delegate.selectorMatchElement) {\n                return matches && this.delegate.selectorMatchElement(element, this.details);\n            }\n            return matches;\n        }\n        else {\n            return false;\n        }\n    }\n    matchElementsInTree(tree) {\n        const { selector } = this;\n        if (selector) {\n            const match = this.matchElement(tree) ? [tree] : [];\n            const matches = Array.from(tree.querySelectorAll(selector)).filter((match) => this.matchElement(match));\n            return match.concat(matches);\n        }\n        else {\n            return [];\n        }\n    }\n    elementMatched(element) {\n        const { selector } = this;\n        if (selector) {\n            this.selectorMatched(element, selector);\n        }\n    }\n    elementUnmatched(element) {\n        const selectors = this.matchesByElement.getKeysForValue(element);\n        for (const selector of selectors) {\n            this.selectorUnmatched(element, selector);\n        }\n    }\n    elementAttributeChanged(element, _attributeName) {\n        const { selector } = this;\n        if (selector) {\n            const matches = this.matchElement(element);\n            const matchedBefore = this.matchesByElement.has(selector, element);\n            if (matches && !matchedBefore) {\n                this.selectorMatched(element, selector);\n            }\n            else if (!matches && matchedBefore) {\n                this.selectorUnmatched(element, selector);\n            }\n        }\n    }\n    selectorMatched(element, selector) {\n        this.delegate.selectorMatched(element, selector, this.details);\n        this.matchesByElement.add(selector, element);\n    }\n    selectorUnmatched(element, selector) {\n        this.delegate.selectorUnmatched(element, selector, this.details);\n        this.matchesByElement.delete(selector, element);\n    }\n}\n\nclass StringMapObserver {\n    constructor(element, delegate) {\n        this.element = element;\n        this.delegate = delegate;\n        this.started = false;\n        this.stringMap = new Map();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, { attributes: true, attributeOldValue: true });\n            this.refresh();\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            for (const attributeName of this.knownAttributeNames) {\n                this.refreshAttribute(attributeName, null);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        const attributeName = mutation.attributeName;\n        if (attributeName) {\n            this.refreshAttribute(attributeName, mutation.oldValue);\n        }\n    }\n    refreshAttribute(attributeName, oldValue) {\n        const key = this.delegate.getStringMapKeyForAttribute(attributeName);\n        if (key != null) {\n            if (!this.stringMap.has(attributeName)) {\n                this.stringMapKeyAdded(key, attributeName);\n            }\n            const value = this.element.getAttribute(attributeName);\n            if (this.stringMap.get(attributeName) != value) {\n                this.stringMapValueChanged(value, key, oldValue);\n            }\n            if (value == null) {\n                const oldValue = this.stringMap.get(attributeName);\n                this.stringMap.delete(attributeName);\n                if (oldValue)\n                    this.stringMapKeyRemoved(key, attributeName, oldValue);\n            }\n            else {\n                this.stringMap.set(attributeName, value);\n            }\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        if (this.delegate.stringMapKeyAdded) {\n            this.delegate.stringMapKeyAdded(key, attributeName);\n        }\n    }\n    stringMapValueChanged(value, key, oldValue) {\n        if (this.delegate.stringMapValueChanged) {\n            this.delegate.stringMapValueChanged(value, key, oldValue);\n        }\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        if (this.delegate.stringMapKeyRemoved) {\n            this.delegate.stringMapKeyRemoved(key, attributeName, oldValue);\n        }\n    }\n    get knownAttributeNames() {\n        return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)));\n    }\n    get currentAttributeNames() {\n        return Array.from(this.element.attributes).map((attribute) => attribute.name);\n    }\n    get recordedAttributeNames() {\n        return Array.from(this.stringMap.keys());\n    }\n}\n\nclass TokenListObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeObserver = new AttributeObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.tokensByElement = new Multimap();\n    }\n    get started() {\n        return this.attributeObserver.started;\n    }\n    start() {\n        this.attributeObserver.start();\n    }\n    pause(callback) {\n        this.attributeObserver.pause(callback);\n    }\n    stop() {\n        this.attributeObserver.stop();\n    }\n    refresh() {\n        this.attributeObserver.refresh();\n    }\n    get element() {\n        return this.attributeObserver.element;\n    }\n    get attributeName() {\n        return this.attributeObserver.attributeName;\n    }\n    elementMatchedAttribute(element) {\n        this.tokensMatched(this.readTokensForElement(element));\n    }\n    elementAttributeValueChanged(element) {\n        const [unmatchedTokens, matchedTokens] = this.refreshTokensForElement(element);\n        this.tokensUnmatched(unmatchedTokens);\n        this.tokensMatched(matchedTokens);\n    }\n    elementUnmatchedAttribute(element) {\n        this.tokensUnmatched(this.tokensByElement.getValuesForKey(element));\n    }\n    tokensMatched(tokens) {\n        tokens.forEach((token) => this.tokenMatched(token));\n    }\n    tokensUnmatched(tokens) {\n        tokens.forEach((token) => this.tokenUnmatched(token));\n    }\n    tokenMatched(token) {\n        this.delegate.tokenMatched(token);\n        this.tokensByElement.add(token.element, token);\n    }\n    tokenUnmatched(token) {\n        this.delegate.tokenUnmatched(token);\n        this.tokensByElement.delete(token.element, token);\n    }\n    refreshTokensForElement(element) {\n        const previousTokens = this.tokensByElement.getValuesForKey(element);\n        const currentTokens = this.readTokensForElement(element);\n        const firstDifferingIndex = zip(previousTokens, currentTokens).findIndex(([previousToken, currentToken]) => !tokensAreEqual(previousToken, currentToken));\n        if (firstDifferingIndex == -1) {\n            return [[], []];\n        }\n        else {\n            return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)];\n        }\n    }\n    readTokensForElement(element) {\n        const attributeName = this.attributeName;\n        const tokenString = element.getAttribute(attributeName) || \"\";\n        return parseTokenString(tokenString, element, attributeName);\n    }\n}\nfunction parseTokenString(tokenString, element, attributeName) {\n    return tokenString\n        .trim()\n        .split(/\\s+/)\n        .filter((content) => content.length)\n        .map((content, index) => ({ element, attributeName, content, index }));\n}\nfunction zip(left, right) {\n    const length = Math.max(left.length, right.length);\n    return Array.from({ length }, (_, index) => [left[index], right[index]]);\n}\nfunction tokensAreEqual(left, right) {\n    return left && right && left.index == right.index && left.content == right.content;\n}\n\nclass ValueListObserver {\n    constructor(element, attributeName, delegate) {\n        this.tokenListObserver = new TokenListObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.parseResultsByToken = new WeakMap();\n        this.valuesByTokenByElement = new WeakMap();\n    }\n    get started() {\n        return this.tokenListObserver.started;\n    }\n    start() {\n        this.tokenListObserver.start();\n    }\n    stop() {\n        this.tokenListObserver.stop();\n    }\n    refresh() {\n        this.tokenListObserver.refresh();\n    }\n    get element() {\n        return this.tokenListObserver.element;\n    }\n    get attributeName() {\n        return this.tokenListObserver.attributeName;\n    }\n    tokenMatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).set(token, value);\n            this.delegate.elementMatchedValue(element, value);\n        }\n    }\n    tokenUnmatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).delete(token);\n            this.delegate.elementUnmatchedValue(element, value);\n        }\n    }\n    fetchParseResultForToken(token) {\n        let parseResult = this.parseResultsByToken.get(token);\n        if (!parseResult) {\n            parseResult = this.parseToken(token);\n            this.parseResultsByToken.set(token, parseResult);\n        }\n        return parseResult;\n    }\n    fetchValuesByTokenForElement(element) {\n        let valuesByToken = this.valuesByTokenByElement.get(element);\n        if (!valuesByToken) {\n            valuesByToken = new Map();\n            this.valuesByTokenByElement.set(element, valuesByToken);\n        }\n        return valuesByToken;\n    }\n    parseToken(token) {\n        try {\n            const value = this.delegate.parseValueForToken(token);\n            return { value };\n        }\n        catch (error) {\n            return { error };\n        }\n    }\n}\n\nclass BindingObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.bindingsByAction = new Map();\n    }\n    start() {\n        if (!this.valueListObserver) {\n            this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this);\n            this.valueListObserver.start();\n        }\n    }\n    stop() {\n        if (this.valueListObserver) {\n            this.valueListObserver.stop();\n            delete this.valueListObserver;\n            this.disconnectAllActions();\n        }\n    }\n    get element() {\n        return this.context.element;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get actionAttribute() {\n        return this.schema.actionAttribute;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get bindings() {\n        return Array.from(this.bindingsByAction.values());\n    }\n    connectAction(action) {\n        const binding = new Binding(this.context, action);\n        this.bindingsByAction.set(action, binding);\n        this.delegate.bindingConnected(binding);\n    }\n    disconnectAction(action) {\n        const binding = this.bindingsByAction.get(action);\n        if (binding) {\n            this.bindingsByAction.delete(action);\n            this.delegate.bindingDisconnected(binding);\n        }\n    }\n    disconnectAllActions() {\n        this.bindings.forEach((binding) => this.delegate.bindingDisconnected(binding, true));\n        this.bindingsByAction.clear();\n    }\n    parseValueForToken(token) {\n        const action = Action.forToken(token, this.schema);\n        if (action.identifier == this.identifier) {\n            return action;\n        }\n    }\n    elementMatchedValue(element, action) {\n        this.connectAction(action);\n    }\n    elementUnmatchedValue(element, action) {\n        this.disconnectAction(action);\n    }\n}\n\nclass ValueObserver {\n    constructor(context, receiver) {\n        this.context = context;\n        this.receiver = receiver;\n        this.stringMapObserver = new StringMapObserver(this.element, this);\n        this.valueDescriptorMap = this.controller.valueDescriptorMap;\n    }\n    start() {\n        this.stringMapObserver.start();\n        this.invokeChangedCallbacksForDefaultValues();\n    }\n    stop() {\n        this.stringMapObserver.stop();\n    }\n    get element() {\n        return this.context.element;\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    getStringMapKeyForAttribute(attributeName) {\n        if (attributeName in this.valueDescriptorMap) {\n            return this.valueDescriptorMap[attributeName].name;\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        const descriptor = this.valueDescriptorMap[attributeName];\n        if (!this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), descriptor.writer(descriptor.defaultValue));\n        }\n    }\n    stringMapValueChanged(value, name, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[name];\n        if (value === null)\n            return;\n        if (oldValue === null) {\n            oldValue = descriptor.writer(descriptor.defaultValue);\n        }\n        this.invokeChangedCallback(name, value, oldValue);\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[key];\n        if (this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), oldValue);\n        }\n        else {\n            this.invokeChangedCallback(key, descriptor.writer(descriptor.defaultValue), oldValue);\n        }\n    }\n    invokeChangedCallbacksForDefaultValues() {\n        for (const { key, name, defaultValue, writer } of this.valueDescriptors) {\n            if (defaultValue != undefined && !this.controller.data.has(key)) {\n                this.invokeChangedCallback(name, writer(defaultValue), undefined);\n            }\n        }\n    }\n    invokeChangedCallback(name, rawValue, rawOldValue) {\n        const changedMethodName = `${name}Changed`;\n        const changedMethod = this.receiver[changedMethodName];\n        if (typeof changedMethod == \"function\") {\n            const descriptor = this.valueDescriptorNameMap[name];\n            try {\n                const value = descriptor.reader(rawValue);\n                let oldValue = rawOldValue;\n                if (rawOldValue) {\n                    oldValue = descriptor.reader(rawOldValue);\n                }\n                changedMethod.call(this.receiver, value, oldValue);\n            }\n            catch (error) {\n                if (error instanceof TypeError) {\n                    error.message = `Stimulus Value \"${this.context.identifier}.${descriptor.name}\" - ${error.message}`;\n                }\n                throw error;\n            }\n        }\n    }\n    get valueDescriptors() {\n        const { valueDescriptorMap } = this;\n        return Object.keys(valueDescriptorMap).map((key) => valueDescriptorMap[key]);\n    }\n    get valueDescriptorNameMap() {\n        const descriptors = {};\n        Object.keys(this.valueDescriptorMap).forEach((key) => {\n            const descriptor = this.valueDescriptorMap[key];\n            descriptors[descriptor.name] = descriptor;\n        });\n        return descriptors;\n    }\n    hasValue(attributeName) {\n        const descriptor = this.valueDescriptorNameMap[attributeName];\n        const hasMethodName = `has${capitalize(descriptor.name)}`;\n        return this.receiver[hasMethodName];\n    }\n}\n\nclass TargetObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.targetsByName = new Multimap();\n    }\n    start() {\n        if (!this.tokenListObserver) {\n            this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this);\n            this.tokenListObserver.start();\n        }\n    }\n    stop() {\n        if (this.tokenListObserver) {\n            this.disconnectAllTargets();\n            this.tokenListObserver.stop();\n            delete this.tokenListObserver;\n        }\n    }\n    tokenMatched({ element, content: name }) {\n        if (this.scope.containsElement(element)) {\n            this.connectTarget(element, name);\n        }\n    }\n    tokenUnmatched({ element, content: name }) {\n        this.disconnectTarget(element, name);\n    }\n    connectTarget(element, name) {\n        var _a;\n        if (!this.targetsByName.has(name, element)) {\n            this.targetsByName.add(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetConnected(element, name));\n        }\n    }\n    disconnectTarget(element, name) {\n        var _a;\n        if (this.targetsByName.has(name, element)) {\n            this.targetsByName.delete(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetDisconnected(element, name));\n        }\n    }\n    disconnectAllTargets() {\n        for (const name of this.targetsByName.keys) {\n            for (const element of this.targetsByName.getValuesForKey(name)) {\n                this.disconnectTarget(element, name);\n            }\n        }\n    }\n    get attributeName() {\n        return `data-${this.context.identifier}-target`;\n    }\n    get element() {\n        return this.context.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nfunction readInheritableStaticArrayValues(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return Array.from(ancestors.reduce((values, constructor) => {\n        getOwnStaticArrayValues(constructor, propertyName).forEach((name) => values.add(name));\n        return values;\n    }, new Set()));\n}\nfunction readInheritableStaticObjectPairs(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return ancestors.reduce((pairs, constructor) => {\n        pairs.push(...getOwnStaticObjectPairs(constructor, propertyName));\n        return pairs;\n    }, []);\n}\nfunction getAncestorsForConstructor(constructor) {\n    const ancestors = [];\n    while (constructor) {\n        ancestors.push(constructor);\n        constructor = Object.getPrototypeOf(constructor);\n    }\n    return ancestors.reverse();\n}\nfunction getOwnStaticArrayValues(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return Array.isArray(definition) ? definition : [];\n}\nfunction getOwnStaticObjectPairs(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return definition ? Object.keys(definition).map((key) => [key, definition[key]]) : [];\n}\n\nclass OutletObserver {\n    constructor(context, delegate) {\n        this.started = false;\n        this.context = context;\n        this.delegate = delegate;\n        this.outletsByName = new Multimap();\n        this.outletElementsByName = new Multimap();\n        this.selectorObserverMap = new Map();\n        this.attributeObserverMap = new Map();\n    }\n    start() {\n        if (!this.started) {\n            this.outletDefinitions.forEach((outletName) => {\n                this.setupSelectorObserverForOutlet(outletName);\n                this.setupAttributeObserverForOutlet(outletName);\n            });\n            this.started = true;\n            this.dependentContexts.forEach((context) => context.refresh());\n        }\n    }\n    refresh() {\n        this.selectorObserverMap.forEach((observer) => observer.refresh());\n        this.attributeObserverMap.forEach((observer) => observer.refresh());\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.disconnectAllOutlets();\n            this.stopSelectorObservers();\n            this.stopAttributeObservers();\n        }\n    }\n    stopSelectorObservers() {\n        if (this.selectorObserverMap.size > 0) {\n            this.selectorObserverMap.forEach((observer) => observer.stop());\n            this.selectorObserverMap.clear();\n        }\n    }\n    stopAttributeObservers() {\n        if (this.attributeObserverMap.size > 0) {\n            this.attributeObserverMap.forEach((observer) => observer.stop());\n            this.attributeObserverMap.clear();\n        }\n    }\n    selectorMatched(element, _selector, { outletName }) {\n        const outlet = this.getOutlet(element, outletName);\n        if (outlet) {\n            this.connectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorUnmatched(element, _selector, { outletName }) {\n        const outlet = this.getOutletFromMap(element, outletName);\n        if (outlet) {\n            this.disconnectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorMatchElement(element, { outletName }) {\n        const selector = this.selector(outletName);\n        const hasOutlet = this.hasOutlet(element, outletName);\n        const hasOutletController = element.matches(`[${this.schema.controllerAttribute}~=${outletName}]`);\n        if (selector) {\n            return hasOutlet && hasOutletController && element.matches(selector);\n        }\n        else {\n            return false;\n        }\n    }\n    elementMatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementAttributeValueChanged(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementUnmatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    connectOutlet(outlet, element, outletName) {\n        var _a;\n        if (!this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.add(outletName, outlet);\n            this.outletElementsByName.add(outletName, element);\n            (_a = this.selectorObserverMap.get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletConnected(outlet, element, outletName));\n        }\n    }\n    disconnectOutlet(outlet, element, outletName) {\n        var _a;\n        if (this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.delete(outletName, outlet);\n            this.outletElementsByName.delete(outletName, element);\n            (_a = this.selectorObserverMap\n                .get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletDisconnected(outlet, element, outletName));\n        }\n    }\n    disconnectAllOutlets() {\n        for (const outletName of this.outletElementsByName.keys) {\n            for (const element of this.outletElementsByName.getValuesForKey(outletName)) {\n                for (const outlet of this.outletsByName.getValuesForKey(outletName)) {\n                    this.disconnectOutlet(outlet, element, outletName);\n                }\n            }\n        }\n    }\n    updateSelectorObserverForOutlet(outletName) {\n        const observer = this.selectorObserverMap.get(outletName);\n        if (observer) {\n            observer.selector = this.selector(outletName);\n        }\n    }\n    setupSelectorObserverForOutlet(outletName) {\n        const selector = this.selector(outletName);\n        const selectorObserver = new SelectorObserver(document.body, selector, this, { outletName });\n        this.selectorObserverMap.set(outletName, selectorObserver);\n        selectorObserver.start();\n    }\n    setupAttributeObserverForOutlet(outletName) {\n        const attributeName = this.attributeNameForOutletName(outletName);\n        const attributeObserver = new AttributeObserver(this.scope.element, attributeName, this);\n        this.attributeObserverMap.set(outletName, attributeObserver);\n        attributeObserver.start();\n    }\n    selector(outletName) {\n        return this.scope.outlets.getSelectorForOutletName(outletName);\n    }\n    attributeNameForOutletName(outletName) {\n        return this.scope.schema.outletAttributeForScope(this.identifier, outletName);\n    }\n    getOutletNameFromOutletAttributeName(attributeName) {\n        return this.outletDefinitions.find((outletName) => this.attributeNameForOutletName(outletName) === attributeName);\n    }\n    get outletDependencies() {\n        const dependencies = new Multimap();\n        this.router.modules.forEach((module) => {\n            const constructor = module.definition.controllerConstructor;\n            const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n            outlets.forEach((outlet) => dependencies.add(outlet, module.identifier));\n        });\n        return dependencies;\n    }\n    get outletDefinitions() {\n        return this.outletDependencies.getKeysForValue(this.identifier);\n    }\n    get dependentControllerIdentifiers() {\n        return this.outletDependencies.getValuesForKey(this.identifier);\n    }\n    get dependentContexts() {\n        const identifiers = this.dependentControllerIdentifiers;\n        return this.router.contexts.filter((context) => identifiers.includes(context.identifier));\n    }\n    hasOutlet(element, outletName) {\n        return !!this.getOutlet(element, outletName) || !!this.getOutletFromMap(element, outletName);\n    }\n    getOutlet(element, outletName) {\n        return this.application.getControllerForElementAndIdentifier(element, outletName);\n    }\n    getOutletFromMap(element, outletName) {\n        return this.outletsByName.getValuesForKey(outletName).find((outlet) => outlet.element === element);\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get router() {\n        return this.application.router;\n    }\n}\n\nclass Context {\n    constructor(module, scope) {\n        this.logDebugActivity = (functionName, detail = {}) => {\n            const { identifier, controller, element } = this;\n            detail = Object.assign({ identifier, controller, element }, detail);\n            this.application.logDebugActivity(this.identifier, functionName, detail);\n        };\n        this.module = module;\n        this.scope = scope;\n        this.controller = new module.controllerConstructor(this);\n        this.bindingObserver = new BindingObserver(this, this.dispatcher);\n        this.valueObserver = new ValueObserver(this, this.controller);\n        this.targetObserver = new TargetObserver(this, this);\n        this.outletObserver = new OutletObserver(this, this);\n        try {\n            this.controller.initialize();\n            this.logDebugActivity(\"initialize\");\n        }\n        catch (error) {\n            this.handleError(error, \"initializing controller\");\n        }\n    }\n    connect() {\n        this.bindingObserver.start();\n        this.valueObserver.start();\n        this.targetObserver.start();\n        this.outletObserver.start();\n        try {\n            this.controller.connect();\n            this.logDebugActivity(\"connect\");\n        }\n        catch (error) {\n            this.handleError(error, \"connecting controller\");\n        }\n    }\n    refresh() {\n        this.outletObserver.refresh();\n    }\n    disconnect() {\n        try {\n            this.controller.disconnect();\n            this.logDebugActivity(\"disconnect\");\n        }\n        catch (error) {\n            this.handleError(error, \"disconnecting controller\");\n        }\n        this.outletObserver.stop();\n        this.targetObserver.stop();\n        this.valueObserver.stop();\n        this.bindingObserver.stop();\n    }\n    get application() {\n        return this.module.application;\n    }\n    get identifier() {\n        return this.module.identifier;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get dispatcher() {\n        return this.application.dispatcher;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get parentElement() {\n        return this.element.parentElement;\n    }\n    handleError(error, message, detail = {}) {\n        const { identifier, controller, element } = this;\n        detail = Object.assign({ identifier, controller, element }, detail);\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    targetConnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetConnected`, element);\n    }\n    targetDisconnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetDisconnected`, element);\n    }\n    outletConnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletConnected`, outlet, element);\n    }\n    outletDisconnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletDisconnected`, outlet, element);\n    }\n    invokeControllerMethod(methodName, ...args) {\n        const controller = this.controller;\n        if (typeof controller[methodName] == \"function\") {\n            controller[methodName](...args);\n        }\n    }\n}\n\nfunction bless(constructor) {\n    return shadow(constructor, getBlessedProperties(constructor));\n}\nfunction shadow(constructor, properties) {\n    const shadowConstructor = extend(constructor);\n    const shadowProperties = getShadowProperties(constructor.prototype, properties);\n    Object.defineProperties(shadowConstructor.prototype, shadowProperties);\n    return shadowConstructor;\n}\nfunction getBlessedProperties(constructor) {\n    const blessings = readInheritableStaticArrayValues(constructor, \"blessings\");\n    return blessings.reduce((blessedProperties, blessing) => {\n        const properties = blessing(constructor);\n        for (const key in properties) {\n            const descriptor = blessedProperties[key] || {};\n            blessedProperties[key] = Object.assign(descriptor, properties[key]);\n        }\n        return blessedProperties;\n    }, {});\n}\nfunction getShadowProperties(prototype, properties) {\n    return getOwnKeys(properties).reduce((shadowProperties, key) => {\n        const descriptor = getShadowedDescriptor(prototype, properties, key);\n        if (descriptor) {\n            Object.assign(shadowProperties, { [key]: descriptor });\n        }\n        return shadowProperties;\n    }, {});\n}\nfunction getShadowedDescriptor(prototype, properties, key) {\n    const shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key);\n    const shadowedByValue = shadowingDescriptor && \"value\" in shadowingDescriptor;\n    if (!shadowedByValue) {\n        const descriptor = Object.getOwnPropertyDescriptor(properties, key).value;\n        if (shadowingDescriptor) {\n            descriptor.get = shadowingDescriptor.get || descriptor.get;\n            descriptor.set = shadowingDescriptor.set || descriptor.set;\n        }\n        return descriptor;\n    }\n}\nconst getOwnKeys = (() => {\n    if (typeof Object.getOwnPropertySymbols == \"function\") {\n        return (object) => [...Object.getOwnPropertyNames(object), ...Object.getOwnPropertySymbols(object)];\n    }\n    else {\n        return Object.getOwnPropertyNames;\n    }\n})();\nconst extend = (() => {\n    function extendWithReflect(constructor) {\n        function extended() {\n            return Reflect.construct(constructor, arguments, new.target);\n        }\n        extended.prototype = Object.create(constructor.prototype, {\n            constructor: { value: extended },\n        });\n        Reflect.setPrototypeOf(extended, constructor);\n        return extended;\n    }\n    function testReflectExtension() {\n        const a = function () {\n            this.a.call(this);\n        };\n        const b = extendWithReflect(a);\n        b.prototype.a = function () { };\n        return new b();\n    }\n    try {\n        testReflectExtension();\n        return extendWithReflect;\n    }\n    catch (error) {\n        return (constructor) => class extended extends constructor {\n        };\n    }\n})();\n\nfunction blessDefinition(definition) {\n    return {\n        identifier: definition.identifier,\n        controllerConstructor: bless(definition.controllerConstructor),\n    };\n}\n\nclass Module {\n    constructor(application, definition) {\n        this.application = application;\n        this.definition = blessDefinition(definition);\n        this.contextsByScope = new WeakMap();\n        this.connectedContexts = new Set();\n    }\n    get identifier() {\n        return this.definition.identifier;\n    }\n    get controllerConstructor() {\n        return this.definition.controllerConstructor;\n    }\n    get contexts() {\n        return Array.from(this.connectedContexts);\n    }\n    connectContextForScope(scope) {\n        const context = this.fetchContextForScope(scope);\n        this.connectedContexts.add(context);\n        context.connect();\n    }\n    disconnectContextForScope(scope) {\n        const context = this.contextsByScope.get(scope);\n        if (context) {\n            this.connectedContexts.delete(context);\n            context.disconnect();\n        }\n    }\n    fetchContextForScope(scope) {\n        let context = this.contextsByScope.get(scope);\n        if (!context) {\n            context = new Context(this, scope);\n            this.contextsByScope.set(scope, context);\n        }\n        return context;\n    }\n}\n\nclass ClassMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    has(name) {\n        return this.data.has(this.getDataKey(name));\n    }\n    get(name) {\n        return this.getAll(name)[0];\n    }\n    getAll(name) {\n        const tokenString = this.data.get(this.getDataKey(name)) || \"\";\n        return tokenize(tokenString);\n    }\n    getAttributeName(name) {\n        return this.data.getAttributeNameForKey(this.getDataKey(name));\n    }\n    getDataKey(name) {\n        return `${name}-class`;\n    }\n    get data() {\n        return this.scope.data;\n    }\n}\n\nclass DataMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.getAttribute(name);\n    }\n    set(key, value) {\n        const name = this.getAttributeNameForKey(key);\n        this.element.setAttribute(name, value);\n        return this.get(key);\n    }\n    has(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.hasAttribute(name);\n    }\n    delete(key) {\n        if (this.has(key)) {\n            const name = this.getAttributeNameForKey(key);\n            this.element.removeAttribute(name);\n            return true;\n        }\n        else {\n            return false;\n        }\n    }\n    getAttributeNameForKey(key) {\n        return `data-${this.identifier}-${dasherize(key)}`;\n    }\n}\n\nclass Guide {\n    constructor(logger) {\n        this.warnedKeysByObject = new WeakMap();\n        this.logger = logger;\n    }\n    warn(object, key, message) {\n        let warnedKeys = this.warnedKeysByObject.get(object);\n        if (!warnedKeys) {\n            warnedKeys = new Set();\n            this.warnedKeysByObject.set(object, warnedKeys);\n        }\n        if (!warnedKeys.has(key)) {\n            warnedKeys.add(key);\n            this.logger.warn(message, object);\n        }\n    }\n}\n\nfunction attributeValueContainsToken(attributeName, token) {\n    return `[${attributeName}~=\"${token}\"]`;\n}\n\nclass TargetSet {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(targetName) {\n        return this.find(targetName) != null;\n    }\n    find(...targetNames) {\n        return targetNames.reduce((target, targetName) => target || this.findTarget(targetName) || this.findLegacyTarget(targetName), undefined);\n    }\n    findAll(...targetNames) {\n        return targetNames.reduce((targets, targetName) => [\n            ...targets,\n            ...this.findAllTargets(targetName),\n            ...this.findAllLegacyTargets(targetName),\n        ], []);\n    }\n    findTarget(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findElement(selector);\n    }\n    findAllTargets(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector);\n    }\n    getSelectorForTargetName(targetName) {\n        const attributeName = this.schema.targetAttributeForScope(this.identifier);\n        return attributeValueContainsToken(attributeName, targetName);\n    }\n    findLegacyTarget(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.deprecate(this.scope.findElement(selector), targetName);\n    }\n    findAllLegacyTargets(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector).map((element) => this.deprecate(element, targetName));\n    }\n    getLegacySelectorForTargetName(targetName) {\n        const targetDescriptor = `${this.identifier}.${targetName}`;\n        return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor);\n    }\n    deprecate(element, targetName) {\n        if (element) {\n            const { identifier } = this;\n            const attributeName = this.schema.targetAttribute;\n            const revisedAttributeName = this.schema.targetAttributeForScope(identifier);\n            this.guide.warn(element, `target:${targetName}`, `Please replace ${attributeName}=\"${identifier}.${targetName}\" with ${revisedAttributeName}=\"${targetName}\". ` +\n                `The ${attributeName} attribute is deprecated and will be removed in a future version of Stimulus.`);\n        }\n        return element;\n    }\n    get guide() {\n        return this.scope.guide;\n    }\n}\n\nclass OutletSet {\n    constructor(scope, controllerElement) {\n        this.scope = scope;\n        this.controllerElement = controllerElement;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(outletName) {\n        return this.find(outletName) != null;\n    }\n    find(...outletNames) {\n        return outletNames.reduce((outlet, outletName) => outlet || this.findOutlet(outletName), undefined);\n    }\n    findAll(...outletNames) {\n        return outletNames.reduce((outlets, outletName) => [...outlets, ...this.findAllOutlets(outletName)], []);\n    }\n    getSelectorForOutletName(outletName) {\n        const attributeName = this.schema.outletAttributeForScope(this.identifier, outletName);\n        return this.controllerElement.getAttribute(attributeName);\n    }\n    findOutlet(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        if (selector)\n            return this.findElement(selector, outletName);\n    }\n    findAllOutlets(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        return selector ? this.findAllElements(selector, outletName) : [];\n    }\n    findElement(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName))[0];\n    }\n    findAllElements(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName));\n    }\n    matchesElement(element, selector, outletName) {\n        const controllerAttribute = element.getAttribute(this.scope.schema.controllerAttribute) || \"\";\n        return element.matches(selector) && controllerAttribute.split(\" \").includes(outletName);\n    }\n}\n\nclass Scope {\n    constructor(schema, element, identifier, logger) {\n        this.targets = new TargetSet(this);\n        this.classes = new ClassMap(this);\n        this.data = new DataMap(this);\n        this.containsElement = (element) => {\n            return element.closest(this.controllerSelector) === this.element;\n        };\n        this.schema = schema;\n        this.element = element;\n        this.identifier = identifier;\n        this.guide = new Guide(logger);\n        this.outlets = new OutletSet(this.documentScope, element);\n    }\n    findElement(selector) {\n        return this.element.matches(selector) ? this.element : this.queryElements(selector).find(this.containsElement);\n    }\n    findAllElements(selector) {\n        return [\n            ...(this.element.matches(selector) ? [this.element] : []),\n            ...this.queryElements(selector).filter(this.containsElement),\n        ];\n    }\n    queryElements(selector) {\n        return Array.from(this.element.querySelectorAll(selector));\n    }\n    get controllerSelector() {\n        return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier);\n    }\n    get isDocumentScope() {\n        return this.element === document.documentElement;\n    }\n    get documentScope() {\n        return this.isDocumentScope\n            ? this\n            : new Scope(this.schema, document.documentElement, this.identifier, this.guide.logger);\n    }\n}\n\nclass ScopeObserver {\n    constructor(element, schema, delegate) {\n        this.element = element;\n        this.schema = schema;\n        this.delegate = delegate;\n        this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this);\n        this.scopesByIdentifierByElement = new WeakMap();\n        this.scopeReferenceCounts = new WeakMap();\n    }\n    start() {\n        this.valueListObserver.start();\n    }\n    stop() {\n        this.valueListObserver.stop();\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    parseValueForToken(token) {\n        const { element, content: identifier } = token;\n        return this.parseValueForElementAndIdentifier(element, identifier);\n    }\n    parseValueForElementAndIdentifier(element, identifier) {\n        const scopesByIdentifier = this.fetchScopesByIdentifierForElement(element);\n        let scope = scopesByIdentifier.get(identifier);\n        if (!scope) {\n            scope = this.delegate.createScopeForElementAndIdentifier(element, identifier);\n            scopesByIdentifier.set(identifier, scope);\n        }\n        return scope;\n    }\n    elementMatchedValue(element, value) {\n        const referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1;\n        this.scopeReferenceCounts.set(value, referenceCount);\n        if (referenceCount == 1) {\n            this.delegate.scopeConnected(value);\n        }\n    }\n    elementUnmatchedValue(element, value) {\n        const referenceCount = this.scopeReferenceCounts.get(value);\n        if (referenceCount) {\n            this.scopeReferenceCounts.set(value, referenceCount - 1);\n            if (referenceCount == 1) {\n                this.delegate.scopeDisconnected(value);\n            }\n        }\n    }\n    fetchScopesByIdentifierForElement(element) {\n        let scopesByIdentifier = this.scopesByIdentifierByElement.get(element);\n        if (!scopesByIdentifier) {\n            scopesByIdentifier = new Map();\n            this.scopesByIdentifierByElement.set(element, scopesByIdentifier);\n        }\n        return scopesByIdentifier;\n    }\n}\n\nclass Router {\n    constructor(application) {\n        this.application = application;\n        this.scopeObserver = new ScopeObserver(this.element, this.schema, this);\n        this.scopesByIdentifier = new Multimap();\n        this.modulesByIdentifier = new Map();\n    }\n    get element() {\n        return this.application.element;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get logger() {\n        return this.application.logger;\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    get modules() {\n        return Array.from(this.modulesByIdentifier.values());\n    }\n    get contexts() {\n        return this.modules.reduce((contexts, module) => contexts.concat(module.contexts), []);\n    }\n    start() {\n        this.scopeObserver.start();\n    }\n    stop() {\n        this.scopeObserver.stop();\n    }\n    loadDefinition(definition) {\n        this.unloadIdentifier(definition.identifier);\n        const module = new Module(this.application, definition);\n        this.connectModule(module);\n        const afterLoad = definition.controllerConstructor.afterLoad;\n        if (afterLoad) {\n            afterLoad.call(definition.controllerConstructor, definition.identifier, this.application);\n        }\n    }\n    unloadIdentifier(identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            this.disconnectModule(module);\n        }\n    }\n    getContextForElementAndIdentifier(element, identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            return module.contexts.find((context) => context.element == element);\n        }\n    }\n    proposeToConnectScopeForElementAndIdentifier(element, identifier) {\n        const scope = this.scopeObserver.parseValueForElementAndIdentifier(element, identifier);\n        if (scope) {\n            this.scopeObserver.elementMatchedValue(scope.element, scope);\n        }\n        else {\n            console.error(`Couldn't find or create scope for identifier: \"${identifier}\" and element:`, element);\n        }\n    }\n    handleError(error, message, detail) {\n        this.application.handleError(error, message, detail);\n    }\n    createScopeForElementAndIdentifier(element, identifier) {\n        return new Scope(this.schema, element, identifier, this.logger);\n    }\n    scopeConnected(scope) {\n        this.scopesByIdentifier.add(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.connectContextForScope(scope);\n        }\n    }\n    scopeDisconnected(scope) {\n        this.scopesByIdentifier.delete(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.disconnectContextForScope(scope);\n        }\n    }\n    connectModule(module) {\n        this.modulesByIdentifier.set(module.identifier, module);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.connectContextForScope(scope));\n    }\n    disconnectModule(module) {\n        this.modulesByIdentifier.delete(module.identifier);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.disconnectContextForScope(scope));\n    }\n}\n\nconst defaultSchema = {\n    controllerAttribute: \"data-controller\",\n    actionAttribute: \"data-action\",\n    targetAttribute: \"data-target\",\n    targetAttributeForScope: (identifier) => `data-${identifier}-target`,\n    outletAttributeForScope: (identifier, outlet) => `data-${identifier}-${outlet}-outlet`,\n    keyMappings: Object.assign(Object.assign({ enter: \"Enter\", tab: \"Tab\", esc: \"Escape\", space: \" \", up: \"ArrowUp\", down: \"ArrowDown\", left: \"ArrowLeft\", right: \"ArrowRight\", home: \"Home\", end: \"End\", page_up: \"PageUp\", page_down: \"PageDown\" }, objectFromEntries(\"abcdefghijklmnopqrstuvwxyz\".split(\"\").map((c) => [c, c]))), objectFromEntries(\"0123456789\".split(\"\").map((n) => [n, n]))),\n};\nfunction objectFromEntries(array) {\n    return array.reduce((memo, [k, v]) => (Object.assign(Object.assign({}, memo), { [k]: v })), {});\n}\n\nclass Application {\n    constructor(element = document.documentElement, schema = defaultSchema) {\n        this.logger = console;\n        this.debug = false;\n        this.logDebugActivity = (identifier, functionName, detail = {}) => {\n            if (this.debug) {\n                this.logFormattedMessage(identifier, functionName, detail);\n            }\n        };\n        this.element = element;\n        this.schema = schema;\n        this.dispatcher = new Dispatcher(this);\n        this.router = new Router(this);\n        this.actionDescriptorFilters = Object.assign({}, defaultActionDescriptorFilters);\n    }\n    static start(element, schema) {\n        const application = new this(element, schema);\n        application.start();\n        return application;\n    }\n    async start() {\n        await domReady();\n        this.logDebugActivity(\"application\", \"starting\");\n        this.dispatcher.start();\n        this.router.start();\n        this.logDebugActivity(\"application\", \"start\");\n    }\n    stop() {\n        this.logDebugActivity(\"application\", \"stopping\");\n        this.dispatcher.stop();\n        this.router.stop();\n        this.logDebugActivity(\"application\", \"stop\");\n    }\n    register(identifier, controllerConstructor) {\n        this.load({ identifier, controllerConstructor });\n    }\n    registerActionOption(name, filter) {\n        this.actionDescriptorFilters[name] = filter;\n    }\n    load(head, ...rest) {\n        const definitions = Array.isArray(head) ? head : [head, ...rest];\n        definitions.forEach((definition) => {\n            if (definition.controllerConstructor.shouldLoad) {\n                this.router.loadDefinition(definition);\n            }\n        });\n    }\n    unload(head, ...rest) {\n        const identifiers = Array.isArray(head) ? head : [head, ...rest];\n        identifiers.forEach((identifier) => this.router.unloadIdentifier(identifier));\n    }\n    get controllers() {\n        return this.router.contexts.map((context) => context.controller);\n    }\n    getControllerForElementAndIdentifier(element, identifier) {\n        const context = this.router.getContextForElementAndIdentifier(element, identifier);\n        return context ? context.controller : null;\n    }\n    handleError(error, message, detail) {\n        var _a;\n        this.logger.error(`%s\\n\\n%o\\n\\n%o`, message, error, detail);\n        (_a = window.onerror) === null || _a === void 0 ? void 0 : _a.call(window, message, \"\", 0, 0, error);\n    }\n    logFormattedMessage(identifier, functionName, detail = {}) {\n        detail = Object.assign({ application: this }, detail);\n        this.logger.groupCollapsed(`${identifier} #${functionName}`);\n        this.logger.log(\"details:\", Object.assign({}, detail));\n        this.logger.groupEnd();\n    }\n}\nfunction domReady() {\n    return new Promise((resolve) => {\n        if (document.readyState == \"loading\") {\n            document.addEventListener(\"DOMContentLoaded\", () => resolve());\n        }\n        else {\n            resolve();\n        }\n    });\n}\n\nfunction ClassPropertiesBlessing(constructor) {\n    const classes = readInheritableStaticArrayValues(constructor, \"classes\");\n    return classes.reduce((properties, classDefinition) => {\n        return Object.assign(properties, propertiesForClassDefinition(classDefinition));\n    }, {});\n}\nfunction propertiesForClassDefinition(key) {\n    return {\n        [`${key}Class`]: {\n            get() {\n                const { classes } = this;\n                if (classes.has(key)) {\n                    return classes.get(key);\n                }\n                else {\n                    const attribute = classes.getAttributeName(key);\n                    throw new Error(`Missing attribute \"${attribute}\"`);\n                }\n            },\n        },\n        [`${key}Classes`]: {\n            get() {\n                return this.classes.getAll(key);\n            },\n        },\n        [`has${capitalize(key)}Class`]: {\n            get() {\n                return this.classes.has(key);\n            },\n        },\n    };\n}\n\nfunction OutletPropertiesBlessing(constructor) {\n    const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n    return outlets.reduce((properties, outletDefinition) => {\n        return Object.assign(properties, propertiesForOutletDefinition(outletDefinition));\n    }, {});\n}\nfunction getOutletController(controller, element, identifier) {\n    return controller.application.getControllerForElementAndIdentifier(element, identifier);\n}\nfunction getControllerAndEnsureConnectedScope(controller, element, outletName) {\n    let outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n    controller.application.router.proposeToConnectScopeForElementAndIdentifier(element, outletName);\n    outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n}\nfunction propertiesForOutletDefinition(name) {\n    const camelizedName = namespaceCamelize(name);\n    return {\n        [`${camelizedName}Outlet`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                    if (outletController)\n                        return outletController;\n                    throw new Error(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`);\n                }\n                throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n            },\n        },\n        [`${camelizedName}Outlets`]: {\n            get() {\n                const outlets = this.outlets.findAll(name);\n                if (outlets.length > 0) {\n                    return outlets\n                        .map((outletElement) => {\n                        const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                        if (outletController)\n                            return outletController;\n                        console.warn(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`, outletElement);\n                    })\n                        .filter((controller) => controller);\n                }\n                return [];\n            },\n        },\n        [`${camelizedName}OutletElement`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    return outletElement;\n                }\n                else {\n                    throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n                }\n            },\n        },\n        [`${camelizedName}OutletElements`]: {\n            get() {\n                return this.outlets.findAll(name);\n            },\n        },\n        [`has${capitalize(camelizedName)}Outlet`]: {\n            get() {\n                return this.outlets.has(name);\n            },\n        },\n    };\n}\n\nfunction TargetPropertiesBlessing(constructor) {\n    const targets = readInheritableStaticArrayValues(constructor, \"targets\");\n    return targets.reduce((properties, targetDefinition) => {\n        return Object.assign(properties, propertiesForTargetDefinition(targetDefinition));\n    }, {});\n}\nfunction propertiesForTargetDefinition(name) {\n    return {\n        [`${name}Target`]: {\n            get() {\n                const target = this.targets.find(name);\n                if (target) {\n                    return target;\n                }\n                else {\n                    throw new Error(`Missing target element \"${name}\" for \"${this.identifier}\" controller`);\n                }\n            },\n        },\n        [`${name}Targets`]: {\n            get() {\n                return this.targets.findAll(name);\n            },\n        },\n        [`has${capitalize(name)}Target`]: {\n            get() {\n                return this.targets.has(name);\n            },\n        },\n    };\n}\n\nfunction ValuePropertiesBlessing(constructor) {\n    const valueDefinitionPairs = readInheritableStaticObjectPairs(constructor, \"values\");\n    const propertyDescriptorMap = {\n        valueDescriptorMap: {\n            get() {\n                return valueDefinitionPairs.reduce((result, valueDefinitionPair) => {\n                    const valueDescriptor = parseValueDefinitionPair(valueDefinitionPair, this.identifier);\n                    const attributeName = this.data.getAttributeNameForKey(valueDescriptor.key);\n                    return Object.assign(result, { [attributeName]: valueDescriptor });\n                }, {});\n            },\n        },\n    };\n    return valueDefinitionPairs.reduce((properties, valueDefinitionPair) => {\n        return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair));\n    }, propertyDescriptorMap);\n}\nfunction propertiesForValueDefinitionPair(valueDefinitionPair, controller) {\n    const definition = parseValueDefinitionPair(valueDefinitionPair, controller);\n    const { key, name, reader: read, writer: write } = definition;\n    return {\n        [name]: {\n            get() {\n                const value = this.data.get(key);\n                if (value !== null) {\n                    return read(value);\n                }\n                else {\n                    return definition.defaultValue;\n                }\n            },\n            set(value) {\n                if (value === undefined) {\n                    this.data.delete(key);\n                }\n                else {\n                    this.data.set(key, write(value));\n                }\n            },\n        },\n        [`has${capitalize(name)}`]: {\n            get() {\n                return this.data.has(key) || definition.hasCustomDefaultValue;\n            },\n        },\n    };\n}\nfunction parseValueDefinitionPair([token, typeDefinition], controller) {\n    return valueDescriptorForTokenAndTypeDefinition({\n        controller,\n        token,\n        typeDefinition,\n    });\n}\nfunction parseValueTypeConstant(constant) {\n    switch (constant) {\n        case Array:\n            return \"array\";\n        case Boolean:\n            return \"boolean\";\n        case Number:\n            return \"number\";\n        case Object:\n            return \"object\";\n        case String:\n            return \"string\";\n    }\n}\nfunction parseValueTypeDefault(defaultValue) {\n    switch (typeof defaultValue) {\n        case \"boolean\":\n            return \"boolean\";\n        case \"number\":\n            return \"number\";\n        case \"string\":\n            return \"string\";\n    }\n    if (Array.isArray(defaultValue))\n        return \"array\";\n    if (Object.prototype.toString.call(defaultValue) === \"[object Object]\")\n        return \"object\";\n}\nfunction parseValueTypeObject(payload) {\n    const { controller, token, typeObject } = payload;\n    const hasType = isSomething(typeObject.type);\n    const hasDefault = isSomething(typeObject.default);\n    const fullObject = hasType && hasDefault;\n    const onlyType = hasType && !hasDefault;\n    const onlyDefault = !hasType && hasDefault;\n    const typeFromObject = parseValueTypeConstant(typeObject.type);\n    const typeFromDefaultValue = parseValueTypeDefault(payload.typeObject.default);\n    if (onlyType)\n        return typeFromObject;\n    if (onlyDefault)\n        return typeFromDefaultValue;\n    if (typeFromObject !== typeFromDefaultValue) {\n        const propertyPath = controller ? `${controller}.${token}` : token;\n        throw new Error(`The specified default value for the Stimulus Value \"${propertyPath}\" must match the defined type \"${typeFromObject}\". The provided default value of \"${typeObject.default}\" is of type \"${typeFromDefaultValue}\".`);\n    }\n    if (fullObject)\n        return typeFromObject;\n}\nfunction parseValueTypeDefinition(payload) {\n    const { controller, token, typeDefinition } = payload;\n    const typeObject = { controller, token, typeObject: typeDefinition };\n    const typeFromObject = parseValueTypeObject(typeObject);\n    const typeFromDefaultValue = parseValueTypeDefault(typeDefinition);\n    const typeFromConstant = parseValueTypeConstant(typeDefinition);\n    const type = typeFromObject || typeFromDefaultValue || typeFromConstant;\n    if (type)\n        return type;\n    const propertyPath = controller ? `${controller}.${typeDefinition}` : token;\n    throw new Error(`Unknown value type \"${propertyPath}\" for \"${token}\" value`);\n}\nfunction defaultValueForDefinition(typeDefinition) {\n    const constant = parseValueTypeConstant(typeDefinition);\n    if (constant)\n        return defaultValuesByType[constant];\n    const hasDefault = hasProperty(typeDefinition, \"default\");\n    const hasType = hasProperty(typeDefinition, \"type\");\n    const typeObject = typeDefinition;\n    if (hasDefault)\n        return typeObject.default;\n    if (hasType) {\n        const { type } = typeObject;\n        const constantFromType = parseValueTypeConstant(type);\n        if (constantFromType)\n            return defaultValuesByType[constantFromType];\n    }\n    return typeDefinition;\n}\nfunction valueDescriptorForTokenAndTypeDefinition(payload) {\n    const { token, typeDefinition } = payload;\n    const key = `${dasherize(token)}-value`;\n    const type = parseValueTypeDefinition(payload);\n    return {\n        type,\n        key,\n        name: camelize(key),\n        get defaultValue() {\n            return defaultValueForDefinition(typeDefinition);\n        },\n        get hasCustomDefaultValue() {\n            return parseValueTypeDefault(typeDefinition) !== undefined;\n        },\n        reader: readers[type],\n        writer: writers[type] || writers.default,\n    };\n}\nconst defaultValuesByType = {\n    get array() {\n        return [];\n    },\n    boolean: false,\n    number: 0,\n    get object() {\n        return {};\n    },\n    string: \"\",\n};\nconst readers = {\n    array(value) {\n        const array = JSON.parse(value);\n        if (!Array.isArray(array)) {\n            throw new TypeError(`expected value of type \"array\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(array)}\"`);\n        }\n        return array;\n    },\n    boolean(value) {\n        return !(value == \"0\" || String(value).toLowerCase() == \"false\");\n    },\n    number(value) {\n        return Number(value.replace(/_/g, \"\"));\n    },\n    object(value) {\n        const object = JSON.parse(value);\n        if (object === null || typeof object != \"object\" || Array.isArray(object)) {\n            throw new TypeError(`expected value of type \"object\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(object)}\"`);\n        }\n        return object;\n    },\n    string(value) {\n        return value;\n    },\n};\nconst writers = {\n    default: writeString,\n    array: writeJSON,\n    object: writeJSON,\n};\nfunction writeJSON(value) {\n    return JSON.stringify(value);\n}\nfunction writeString(value) {\n    return `${value}`;\n}\n\nclass Controller {\n    constructor(context) {\n        this.context = context;\n    }\n    static get shouldLoad() {\n        return true;\n    }\n    static afterLoad(_identifier, _application) {\n        return;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get targets() {\n        return this.scope.targets;\n    }\n    get outlets() {\n        return this.scope.outlets;\n    }\n    get classes() {\n        return this.scope.classes;\n    }\n    get data() {\n        return this.scope.data;\n    }\n    initialize() {\n    }\n    connect() {\n    }\n    disconnect() {\n    }\n    dispatch(eventName, { target = this.element, detail = {}, prefix = this.identifier, bubbles = true, cancelable = true, } = {}) {\n        const type = prefix ? `${prefix}:${eventName}` : eventName;\n        const event = new CustomEvent(type, { detail, bubbles, cancelable });\n        target.dispatchEvent(event);\n        return event;\n    }\n}\nController.blessings = [\n    ClassPropertiesBlessing,\n    TargetPropertiesBlessing,\n    ValuePropertiesBlessing,\n    OutletPropertiesBlessing,\n];\nController.targets = [];\nController.outlets = [];\nController.values = {};\n\nexport { Application, AttributeObserver, Context, Controller, ElementObserver, IndexedMultimap, Multimap, SelectorObserver, StringMapObserver, TokenListObserver, ValueListObserver, add, defaultSchema, del, fetch, prune };\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol'),\n    getRawTag = require('./_getRawTag'),\n    objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n  return string\n    ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n    : string;\n}\n\nmodule.exports = baseTrim;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\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 nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\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 nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var freeGlobal = require('./_freeGlobal');\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\nmodule.exports = root;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n  var index = string.length;\n\n  while (index-- && reWhitespace.test(string.charAt(index))) {}\n  return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var isObject = require('./isObject'),\n    now = require('./now'),\n    toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\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 * 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        timeWaiting = wait - timeSinceLastCall;\n\n    return maxing\n      ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n      : timeWaiting;\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        clearTimeout(timerId);\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\nmodule.exports = debounce;\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 != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\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 != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\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) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var root = require('./_root');\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\nmodule.exports = now;\n","var debounce = require('./debounce'),\n    isObject = require('./isObject');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\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\nmodule.exports = throttle;\n","var baseTrim = require('./_baseTrim'),\n    isObject = require('./isObject'),\n    isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\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/**\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 = baseTrim(value);\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 = toNumber;\n","/*\nStimulus 3.2.1\nCopyright © 2023 Basecamp, LLC\n */\nclass EventListener {\n    constructor(eventTarget, eventName, eventOptions) {\n        this.eventTarget = eventTarget;\n        this.eventName = eventName;\n        this.eventOptions = eventOptions;\n        this.unorderedBindings = new Set();\n    }\n    connect() {\n        this.eventTarget.addEventListener(this.eventName, this, this.eventOptions);\n    }\n    disconnect() {\n        this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions);\n    }\n    bindingConnected(binding) {\n        this.unorderedBindings.add(binding);\n    }\n    bindingDisconnected(binding) {\n        this.unorderedBindings.delete(binding);\n    }\n    handleEvent(event) {\n        const extendedEvent = extendEvent(event);\n        for (const binding of this.bindings) {\n            if (extendedEvent.immediatePropagationStopped) {\n                break;\n            }\n            else {\n                binding.handleEvent(extendedEvent);\n            }\n        }\n    }\n    hasBindings() {\n        return this.unorderedBindings.size > 0;\n    }\n    get bindings() {\n        return Array.from(this.unorderedBindings).sort((left, right) => {\n            const leftIndex = left.index, rightIndex = right.index;\n            return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0;\n        });\n    }\n}\nfunction extendEvent(event) {\n    if (\"immediatePropagationStopped\" in event) {\n        return event;\n    }\n    else {\n        const { stopImmediatePropagation } = event;\n        return Object.assign(event, {\n            immediatePropagationStopped: false,\n            stopImmediatePropagation() {\n                this.immediatePropagationStopped = true;\n                stopImmediatePropagation.call(this);\n            },\n        });\n    }\n}\n\nclass Dispatcher {\n    constructor(application) {\n        this.application = application;\n        this.eventListenerMaps = new Map();\n        this.started = false;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.eventListeners.forEach((eventListener) => eventListener.connect());\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.eventListeners.forEach((eventListener) => eventListener.disconnect());\n        }\n    }\n    get eventListeners() {\n        return Array.from(this.eventListenerMaps.values()).reduce((listeners, map) => listeners.concat(Array.from(map.values())), []);\n    }\n    bindingConnected(binding) {\n        this.fetchEventListenerForBinding(binding).bindingConnected(binding);\n    }\n    bindingDisconnected(binding, clearEventListeners = false) {\n        this.fetchEventListenerForBinding(binding).bindingDisconnected(binding);\n        if (clearEventListeners)\n            this.clearEventListenersForBinding(binding);\n    }\n    handleError(error, message, detail = {}) {\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    clearEventListenersForBinding(binding) {\n        const eventListener = this.fetchEventListenerForBinding(binding);\n        if (!eventListener.hasBindings()) {\n            eventListener.disconnect();\n            this.removeMappedEventListenerFor(binding);\n        }\n    }\n    removeMappedEventListenerFor(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        eventListenerMap.delete(cacheKey);\n        if (eventListenerMap.size == 0)\n            this.eventListenerMaps.delete(eventTarget);\n    }\n    fetchEventListenerForBinding(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        return this.fetchEventListener(eventTarget, eventName, eventOptions);\n    }\n    fetchEventListener(eventTarget, eventName, eventOptions) {\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        let eventListener = eventListenerMap.get(cacheKey);\n        if (!eventListener) {\n            eventListener = this.createEventListener(eventTarget, eventName, eventOptions);\n            eventListenerMap.set(cacheKey, eventListener);\n        }\n        return eventListener;\n    }\n    createEventListener(eventTarget, eventName, eventOptions) {\n        const eventListener = new EventListener(eventTarget, eventName, eventOptions);\n        if (this.started) {\n            eventListener.connect();\n        }\n        return eventListener;\n    }\n    fetchEventListenerMapForEventTarget(eventTarget) {\n        let eventListenerMap = this.eventListenerMaps.get(eventTarget);\n        if (!eventListenerMap) {\n            eventListenerMap = new Map();\n            this.eventListenerMaps.set(eventTarget, eventListenerMap);\n        }\n        return eventListenerMap;\n    }\n    cacheKey(eventName, eventOptions) {\n        const parts = [eventName];\n        Object.keys(eventOptions)\n            .sort()\n            .forEach((key) => {\n            parts.push(`${eventOptions[key] ? \"\" : \"!\"}${key}`);\n        });\n        return parts.join(\":\");\n    }\n}\n\nconst defaultActionDescriptorFilters = {\n    stop({ event, value }) {\n        if (value)\n            event.stopPropagation();\n        return true;\n    },\n    prevent({ event, value }) {\n        if (value)\n            event.preventDefault();\n        return true;\n    },\n    self({ event, value, element }) {\n        if (value) {\n            return element === event.target;\n        }\n        else {\n            return true;\n        }\n    },\n};\nconst descriptorPattern = /^(?:(?:([^.]+?)\\+)?(.+?)(?:\\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/;\nfunction parseActionDescriptorString(descriptorString) {\n    const source = descriptorString.trim();\n    const matches = source.match(descriptorPattern) || [];\n    let eventName = matches[2];\n    let keyFilter = matches[3];\n    if (keyFilter && ![\"keydown\", \"keyup\", \"keypress\"].includes(eventName)) {\n        eventName += `.${keyFilter}`;\n        keyFilter = \"\";\n    }\n    return {\n        eventTarget: parseEventTarget(matches[4]),\n        eventName,\n        eventOptions: matches[7] ? parseEventOptions(matches[7]) : {},\n        identifier: matches[5],\n        methodName: matches[6],\n        keyFilter: matches[1] || keyFilter,\n    };\n}\nfunction parseEventTarget(eventTargetName) {\n    if (eventTargetName == \"window\") {\n        return window;\n    }\n    else if (eventTargetName == \"document\") {\n        return document;\n    }\n}\nfunction parseEventOptions(eventOptions) {\n    return eventOptions\n        .split(\":\")\n        .reduce((options, token) => Object.assign(options, { [token.replace(/^!/, \"\")]: !/^!/.test(token) }), {});\n}\nfunction stringifyEventTarget(eventTarget) {\n    if (eventTarget == window) {\n        return \"window\";\n    }\n    else if (eventTarget == document) {\n        return \"document\";\n    }\n}\n\nfunction camelize(value) {\n    return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase());\n}\nfunction namespaceCamelize(value) {\n    return camelize(value.replace(/--/g, \"-\").replace(/__/g, \"_\"));\n}\nfunction capitalize(value) {\n    return value.charAt(0).toUpperCase() + value.slice(1);\n}\nfunction dasherize(value) {\n    return value.replace(/([A-Z])/g, (_, char) => `-${char.toLowerCase()}`);\n}\nfunction tokenize(value) {\n    return value.match(/[^\\s]+/g) || [];\n}\n\nfunction isSomething(object) {\n    return object !== null && object !== undefined;\n}\nfunction hasProperty(object, property) {\n    return Object.prototype.hasOwnProperty.call(object, property);\n}\n\nconst allModifiers = [\"meta\", \"ctrl\", \"alt\", \"shift\"];\nclass Action {\n    constructor(element, index, descriptor, schema) {\n        this.element = element;\n        this.index = index;\n        this.eventTarget = descriptor.eventTarget || element;\n        this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error(\"missing event name\");\n        this.eventOptions = descriptor.eventOptions || {};\n        this.identifier = descriptor.identifier || error(\"missing identifier\");\n        this.methodName = descriptor.methodName || error(\"missing method name\");\n        this.keyFilter = descriptor.keyFilter || \"\";\n        this.schema = schema;\n    }\n    static forToken(token, schema) {\n        return new this(token.element, token.index, parseActionDescriptorString(token.content), schema);\n    }\n    toString() {\n        const eventFilter = this.keyFilter ? `.${this.keyFilter}` : \"\";\n        const eventTarget = this.eventTargetName ? `@${this.eventTargetName}` : \"\";\n        return `${this.eventName}${eventFilter}${eventTarget}->${this.identifier}#${this.methodName}`;\n    }\n    shouldIgnoreKeyboardEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = this.keyFilter.split(\"+\");\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        const standardFilter = filters.filter((key) => !allModifiers.includes(key))[0];\n        if (!standardFilter) {\n            return false;\n        }\n        if (!hasProperty(this.keyMappings, standardFilter)) {\n            error(`contains unknown key filter: ${this.keyFilter}`);\n        }\n        return this.keyMappings[standardFilter].toLowerCase() !== event.key.toLowerCase();\n    }\n    shouldIgnoreMouseEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = [this.keyFilter];\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        return false;\n    }\n    get params() {\n        const params = {};\n        const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`, \"i\");\n        for (const { name, value } of Array.from(this.element.attributes)) {\n            const match = name.match(pattern);\n            const key = match && match[1];\n            if (key) {\n                params[camelize(key)] = typecast(value);\n            }\n        }\n        return params;\n    }\n    get eventTargetName() {\n        return stringifyEventTarget(this.eventTarget);\n    }\n    get keyMappings() {\n        return this.schema.keyMappings;\n    }\n    keyFilterDissatisfied(event, filters) {\n        const [meta, ctrl, alt, shift] = allModifiers.map((modifier) => filters.includes(modifier));\n        return event.metaKey !== meta || event.ctrlKey !== ctrl || event.altKey !== alt || event.shiftKey !== shift;\n    }\n}\nconst defaultEventNames = {\n    a: () => \"click\",\n    button: () => \"click\",\n    form: () => \"submit\",\n    details: () => \"toggle\",\n    input: (e) => (e.getAttribute(\"type\") == \"submit\" ? \"click\" : \"input\"),\n    select: () => \"change\",\n    textarea: () => \"input\",\n};\nfunction getDefaultEventNameForElement(element) {\n    const tagName = element.tagName.toLowerCase();\n    if (tagName in defaultEventNames) {\n        return defaultEventNames[tagName](element);\n    }\n}\nfunction error(message) {\n    throw new Error(message);\n}\nfunction typecast(value) {\n    try {\n        return JSON.parse(value);\n    }\n    catch (o_O) {\n        return value;\n    }\n}\n\nclass Binding {\n    constructor(context, action) {\n        this.context = context;\n        this.action = action;\n    }\n    get index() {\n        return this.action.index;\n    }\n    get eventTarget() {\n        return this.action.eventTarget;\n    }\n    get eventOptions() {\n        return this.action.eventOptions;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    handleEvent(event) {\n        const actionEvent = this.prepareActionEvent(event);\n        if (this.willBeInvokedByEvent(event) && this.applyEventModifiers(actionEvent)) {\n            this.invokeWithEvent(actionEvent);\n        }\n    }\n    get eventName() {\n        return this.action.eventName;\n    }\n    get method() {\n        const method = this.controller[this.methodName];\n        if (typeof method == \"function\") {\n            return method;\n        }\n        throw new Error(`Action \"${this.action}\" references undefined method \"${this.methodName}\"`);\n    }\n    applyEventModifiers(event) {\n        const { element } = this.action;\n        const { actionDescriptorFilters } = this.context.application;\n        const { controller } = this.context;\n        let passes = true;\n        for (const [name, value] of Object.entries(this.eventOptions)) {\n            if (name in actionDescriptorFilters) {\n                const filter = actionDescriptorFilters[name];\n                passes = passes && filter({ name, value, event, element, controller });\n            }\n            else {\n                continue;\n            }\n        }\n        return passes;\n    }\n    prepareActionEvent(event) {\n        return Object.assign(event, { params: this.action.params });\n    }\n    invokeWithEvent(event) {\n        const { target, currentTarget } = event;\n        try {\n            this.method.call(this.controller, event);\n            this.context.logDebugActivity(this.methodName, { event, target, currentTarget, action: this.methodName });\n        }\n        catch (error) {\n            const { identifier, controller, element, index } = this;\n            const detail = { identifier, controller, element, index, event };\n            this.context.handleError(error, `invoking action \"${this.action}\"`, detail);\n        }\n    }\n    willBeInvokedByEvent(event) {\n        const eventTarget = event.target;\n        if (event instanceof KeyboardEvent && this.action.shouldIgnoreKeyboardEvent(event)) {\n            return false;\n        }\n        if (event instanceof MouseEvent && this.action.shouldIgnoreMouseEvent(event)) {\n            return false;\n        }\n        if (this.element === eventTarget) {\n            return true;\n        }\n        else if (eventTarget instanceof Element && this.element.contains(eventTarget)) {\n            return this.scope.containsElement(eventTarget);\n        }\n        else {\n            return this.scope.containsElement(this.action.element);\n        }\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    get methodName() {\n        return this.action.methodName;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nclass ElementObserver {\n    constructor(element, delegate) {\n        this.mutationObserverInit = { attributes: true, childList: true, subtree: true };\n        this.element = element;\n        this.started = false;\n        this.delegate = delegate;\n        this.elements = new Set();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.refresh();\n        }\n    }\n    pause(callback) {\n        if (this.started) {\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n        callback();\n        if (!this.started) {\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            const matches = new Set(this.matchElementsInTree());\n            for (const element of Array.from(this.elements)) {\n                if (!matches.has(element)) {\n                    this.removeElement(element);\n                }\n            }\n            for (const element of Array.from(matches)) {\n                this.addElement(element);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        if (mutation.type == \"attributes\") {\n            this.processAttributeChange(mutation.target, mutation.attributeName);\n        }\n        else if (mutation.type == \"childList\") {\n            this.processRemovedNodes(mutation.removedNodes);\n            this.processAddedNodes(mutation.addedNodes);\n        }\n    }\n    processAttributeChange(element, attributeName) {\n        if (this.elements.has(element)) {\n            if (this.delegate.elementAttributeChanged && this.matchElement(element)) {\n                this.delegate.elementAttributeChanged(element, attributeName);\n            }\n            else {\n                this.removeElement(element);\n            }\n        }\n        else if (this.matchElement(element)) {\n            this.addElement(element);\n        }\n    }\n    processRemovedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element) {\n                this.processTree(element, this.removeElement);\n            }\n        }\n    }\n    processAddedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element && this.elementIsActive(element)) {\n                this.processTree(element, this.addElement);\n            }\n        }\n    }\n    matchElement(element) {\n        return this.delegate.matchElement(element);\n    }\n    matchElementsInTree(tree = this.element) {\n        return this.delegate.matchElementsInTree(tree);\n    }\n    processTree(tree, processor) {\n        for (const element of this.matchElementsInTree(tree)) {\n            processor.call(this, element);\n        }\n    }\n    elementFromNode(node) {\n        if (node.nodeType == Node.ELEMENT_NODE) {\n            return node;\n        }\n    }\n    elementIsActive(element) {\n        if (element.isConnected != this.element.isConnected) {\n            return false;\n        }\n        else {\n            return this.element.contains(element);\n        }\n    }\n    addElement(element) {\n        if (!this.elements.has(element)) {\n            if (this.elementIsActive(element)) {\n                this.elements.add(element);\n                if (this.delegate.elementMatched) {\n                    this.delegate.elementMatched(element);\n                }\n            }\n        }\n    }\n    removeElement(element) {\n        if (this.elements.has(element)) {\n            this.elements.delete(element);\n            if (this.delegate.elementUnmatched) {\n                this.delegate.elementUnmatched(element);\n            }\n        }\n    }\n}\n\nclass AttributeObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeName = attributeName;\n        this.delegate = delegate;\n        this.elementObserver = new ElementObserver(element, this);\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    get selector() {\n        return `[${this.attributeName}]`;\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    matchElement(element) {\n        return element.hasAttribute(this.attributeName);\n    }\n    matchElementsInTree(tree) {\n        const match = this.matchElement(tree) ? [tree] : [];\n        const matches = Array.from(tree.querySelectorAll(this.selector));\n        return match.concat(matches);\n    }\n    elementMatched(element) {\n        if (this.delegate.elementMatchedAttribute) {\n            this.delegate.elementMatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementUnmatched(element) {\n        if (this.delegate.elementUnmatchedAttribute) {\n            this.delegate.elementUnmatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementAttributeChanged(element, attributeName) {\n        if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) {\n            this.delegate.elementAttributeValueChanged(element, attributeName);\n        }\n    }\n}\n\nfunction add(map, key, value) {\n    fetch(map, key).add(value);\n}\nfunction del(map, key, value) {\n    fetch(map, key).delete(value);\n    prune(map, key);\n}\nfunction fetch(map, key) {\n    let values = map.get(key);\n    if (!values) {\n        values = new Set();\n        map.set(key, values);\n    }\n    return values;\n}\nfunction prune(map, key) {\n    const values = map.get(key);\n    if (values != null && values.size == 0) {\n        map.delete(key);\n    }\n}\n\nclass Multimap {\n    constructor() {\n        this.valuesByKey = new Map();\n    }\n    get keys() {\n        return Array.from(this.valuesByKey.keys());\n    }\n    get values() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((values, set) => values.concat(Array.from(set)), []);\n    }\n    get size() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((size, set) => size + set.size, 0);\n    }\n    add(key, value) {\n        add(this.valuesByKey, key, value);\n    }\n    delete(key, value) {\n        del(this.valuesByKey, key, value);\n    }\n    has(key, value) {\n        const values = this.valuesByKey.get(key);\n        return values != null && values.has(value);\n    }\n    hasKey(key) {\n        return this.valuesByKey.has(key);\n    }\n    hasValue(value) {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.some((set) => set.has(value));\n    }\n    getValuesForKey(key) {\n        const values = this.valuesByKey.get(key);\n        return values ? Array.from(values) : [];\n    }\n    getKeysForValue(value) {\n        return Array.from(this.valuesByKey)\n            .filter(([_key, values]) => values.has(value))\n            .map(([key, _values]) => key);\n    }\n}\n\nclass IndexedMultimap extends Multimap {\n    constructor() {\n        super();\n        this.keysByValue = new Map();\n    }\n    get values() {\n        return Array.from(this.keysByValue.keys());\n    }\n    add(key, value) {\n        super.add(key, value);\n        add(this.keysByValue, value, key);\n    }\n    delete(key, value) {\n        super.delete(key, value);\n        del(this.keysByValue, value, key);\n    }\n    hasValue(value) {\n        return this.keysByValue.has(value);\n    }\n    getKeysForValue(value) {\n        const set = this.keysByValue.get(value);\n        return set ? Array.from(set) : [];\n    }\n}\n\nclass SelectorObserver {\n    constructor(element, selector, delegate, details) {\n        this._selector = selector;\n        this.details = details;\n        this.elementObserver = new ElementObserver(element, this);\n        this.delegate = delegate;\n        this.matchesByElement = new Multimap();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    get selector() {\n        return this._selector;\n    }\n    set selector(selector) {\n        this._selector = selector;\n        this.refresh();\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    matchElement(element) {\n        const { selector } = this;\n        if (selector) {\n            const matches = element.matches(selector);\n            if (this.delegate.selectorMatchElement) {\n                return matches && this.delegate.selectorMatchElement(element, this.details);\n            }\n            return matches;\n        }\n        else {\n            return false;\n        }\n    }\n    matchElementsInTree(tree) {\n        const { selector } = this;\n        if (selector) {\n            const match = this.matchElement(tree) ? [tree] : [];\n            const matches = Array.from(tree.querySelectorAll(selector)).filter((match) => this.matchElement(match));\n            return match.concat(matches);\n        }\n        else {\n            return [];\n        }\n    }\n    elementMatched(element) {\n        const { selector } = this;\n        if (selector) {\n            this.selectorMatched(element, selector);\n        }\n    }\n    elementUnmatched(element) {\n        const selectors = this.matchesByElement.getKeysForValue(element);\n        for (const selector of selectors) {\n            this.selectorUnmatched(element, selector);\n        }\n    }\n    elementAttributeChanged(element, _attributeName) {\n        const { selector } = this;\n        if (selector) {\n            const matches = this.matchElement(element);\n            const matchedBefore = this.matchesByElement.has(selector, element);\n            if (matches && !matchedBefore) {\n                this.selectorMatched(element, selector);\n            }\n            else if (!matches && matchedBefore) {\n                this.selectorUnmatched(element, selector);\n            }\n        }\n    }\n    selectorMatched(element, selector) {\n        this.delegate.selectorMatched(element, selector, this.details);\n        this.matchesByElement.add(selector, element);\n    }\n    selectorUnmatched(element, selector) {\n        this.delegate.selectorUnmatched(element, selector, this.details);\n        this.matchesByElement.delete(selector, element);\n    }\n}\n\nclass StringMapObserver {\n    constructor(element, delegate) {\n        this.element = element;\n        this.delegate = delegate;\n        this.started = false;\n        this.stringMap = new Map();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, { attributes: true, attributeOldValue: true });\n            this.refresh();\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            for (const attributeName of this.knownAttributeNames) {\n                this.refreshAttribute(attributeName, null);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        const attributeName = mutation.attributeName;\n        if (attributeName) {\n            this.refreshAttribute(attributeName, mutation.oldValue);\n        }\n    }\n    refreshAttribute(attributeName, oldValue) {\n        const key = this.delegate.getStringMapKeyForAttribute(attributeName);\n        if (key != null) {\n            if (!this.stringMap.has(attributeName)) {\n                this.stringMapKeyAdded(key, attributeName);\n            }\n            const value = this.element.getAttribute(attributeName);\n            if (this.stringMap.get(attributeName) != value) {\n                this.stringMapValueChanged(value, key, oldValue);\n            }\n            if (value == null) {\n                const oldValue = this.stringMap.get(attributeName);\n                this.stringMap.delete(attributeName);\n                if (oldValue)\n                    this.stringMapKeyRemoved(key, attributeName, oldValue);\n            }\n            else {\n                this.stringMap.set(attributeName, value);\n            }\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        if (this.delegate.stringMapKeyAdded) {\n            this.delegate.stringMapKeyAdded(key, attributeName);\n        }\n    }\n    stringMapValueChanged(value, key, oldValue) {\n        if (this.delegate.stringMapValueChanged) {\n            this.delegate.stringMapValueChanged(value, key, oldValue);\n        }\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        if (this.delegate.stringMapKeyRemoved) {\n            this.delegate.stringMapKeyRemoved(key, attributeName, oldValue);\n        }\n    }\n    get knownAttributeNames() {\n        return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)));\n    }\n    get currentAttributeNames() {\n        return Array.from(this.element.attributes).map((attribute) => attribute.name);\n    }\n    get recordedAttributeNames() {\n        return Array.from(this.stringMap.keys());\n    }\n}\n\nclass TokenListObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeObserver = new AttributeObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.tokensByElement = new Multimap();\n    }\n    get started() {\n        return this.attributeObserver.started;\n    }\n    start() {\n        this.attributeObserver.start();\n    }\n    pause(callback) {\n        this.attributeObserver.pause(callback);\n    }\n    stop() {\n        this.attributeObserver.stop();\n    }\n    refresh() {\n        this.attributeObserver.refresh();\n    }\n    get element() {\n        return this.attributeObserver.element;\n    }\n    get attributeName() {\n        return this.attributeObserver.attributeName;\n    }\n    elementMatchedAttribute(element) {\n        this.tokensMatched(this.readTokensForElement(element));\n    }\n    elementAttributeValueChanged(element) {\n        const [unmatchedTokens, matchedTokens] = this.refreshTokensForElement(element);\n        this.tokensUnmatched(unmatchedTokens);\n        this.tokensMatched(matchedTokens);\n    }\n    elementUnmatchedAttribute(element) {\n        this.tokensUnmatched(this.tokensByElement.getValuesForKey(element));\n    }\n    tokensMatched(tokens) {\n        tokens.forEach((token) => this.tokenMatched(token));\n    }\n    tokensUnmatched(tokens) {\n        tokens.forEach((token) => this.tokenUnmatched(token));\n    }\n    tokenMatched(token) {\n        this.delegate.tokenMatched(token);\n        this.tokensByElement.add(token.element, token);\n    }\n    tokenUnmatched(token) {\n        this.delegate.tokenUnmatched(token);\n        this.tokensByElement.delete(token.element, token);\n    }\n    refreshTokensForElement(element) {\n        const previousTokens = this.tokensByElement.getValuesForKey(element);\n        const currentTokens = this.readTokensForElement(element);\n        const firstDifferingIndex = zip(previousTokens, currentTokens).findIndex(([previousToken, currentToken]) => !tokensAreEqual(previousToken, currentToken));\n        if (firstDifferingIndex == -1) {\n            return [[], []];\n        }\n        else {\n            return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)];\n        }\n    }\n    readTokensForElement(element) {\n        const attributeName = this.attributeName;\n        const tokenString = element.getAttribute(attributeName) || \"\";\n        return parseTokenString(tokenString, element, attributeName);\n    }\n}\nfunction parseTokenString(tokenString, element, attributeName) {\n    return tokenString\n        .trim()\n        .split(/\\s+/)\n        .filter((content) => content.length)\n        .map((content, index) => ({ element, attributeName, content, index }));\n}\nfunction zip(left, right) {\n    const length = Math.max(left.length, right.length);\n    return Array.from({ length }, (_, index) => [left[index], right[index]]);\n}\nfunction tokensAreEqual(left, right) {\n    return left && right && left.index == right.index && left.content == right.content;\n}\n\nclass ValueListObserver {\n    constructor(element, attributeName, delegate) {\n        this.tokenListObserver = new TokenListObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.parseResultsByToken = new WeakMap();\n        this.valuesByTokenByElement = new WeakMap();\n    }\n    get started() {\n        return this.tokenListObserver.started;\n    }\n    start() {\n        this.tokenListObserver.start();\n    }\n    stop() {\n        this.tokenListObserver.stop();\n    }\n    refresh() {\n        this.tokenListObserver.refresh();\n    }\n    get element() {\n        return this.tokenListObserver.element;\n    }\n    get attributeName() {\n        return this.tokenListObserver.attributeName;\n    }\n    tokenMatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).set(token, value);\n            this.delegate.elementMatchedValue(element, value);\n        }\n    }\n    tokenUnmatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).delete(token);\n            this.delegate.elementUnmatchedValue(element, value);\n        }\n    }\n    fetchParseResultForToken(token) {\n        let parseResult = this.parseResultsByToken.get(token);\n        if (!parseResult) {\n            parseResult = this.parseToken(token);\n            this.parseResultsByToken.set(token, parseResult);\n        }\n        return parseResult;\n    }\n    fetchValuesByTokenForElement(element) {\n        let valuesByToken = this.valuesByTokenByElement.get(element);\n        if (!valuesByToken) {\n            valuesByToken = new Map();\n            this.valuesByTokenByElement.set(element, valuesByToken);\n        }\n        return valuesByToken;\n    }\n    parseToken(token) {\n        try {\n            const value = this.delegate.parseValueForToken(token);\n            return { value };\n        }\n        catch (error) {\n            return { error };\n        }\n    }\n}\n\nclass BindingObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.bindingsByAction = new Map();\n    }\n    start() {\n        if (!this.valueListObserver) {\n            this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this);\n            this.valueListObserver.start();\n        }\n    }\n    stop() {\n        if (this.valueListObserver) {\n            this.valueListObserver.stop();\n            delete this.valueListObserver;\n            this.disconnectAllActions();\n        }\n    }\n    get element() {\n        return this.context.element;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get actionAttribute() {\n        return this.schema.actionAttribute;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get bindings() {\n        return Array.from(this.bindingsByAction.values());\n    }\n    connectAction(action) {\n        const binding = new Binding(this.context, action);\n        this.bindingsByAction.set(action, binding);\n        this.delegate.bindingConnected(binding);\n    }\n    disconnectAction(action) {\n        const binding = this.bindingsByAction.get(action);\n        if (binding) {\n            this.bindingsByAction.delete(action);\n            this.delegate.bindingDisconnected(binding);\n        }\n    }\n    disconnectAllActions() {\n        this.bindings.forEach((binding) => this.delegate.bindingDisconnected(binding, true));\n        this.bindingsByAction.clear();\n    }\n    parseValueForToken(token) {\n        const action = Action.forToken(token, this.schema);\n        if (action.identifier == this.identifier) {\n            return action;\n        }\n    }\n    elementMatchedValue(element, action) {\n        this.connectAction(action);\n    }\n    elementUnmatchedValue(element, action) {\n        this.disconnectAction(action);\n    }\n}\n\nclass ValueObserver {\n    constructor(context, receiver) {\n        this.context = context;\n        this.receiver = receiver;\n        this.stringMapObserver = new StringMapObserver(this.element, this);\n        this.valueDescriptorMap = this.controller.valueDescriptorMap;\n    }\n    start() {\n        this.stringMapObserver.start();\n        this.invokeChangedCallbacksForDefaultValues();\n    }\n    stop() {\n        this.stringMapObserver.stop();\n    }\n    get element() {\n        return this.context.element;\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    getStringMapKeyForAttribute(attributeName) {\n        if (attributeName in this.valueDescriptorMap) {\n            return this.valueDescriptorMap[attributeName].name;\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        const descriptor = this.valueDescriptorMap[attributeName];\n        if (!this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), descriptor.writer(descriptor.defaultValue));\n        }\n    }\n    stringMapValueChanged(value, name, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[name];\n        if (value === null)\n            return;\n        if (oldValue === null) {\n            oldValue = descriptor.writer(descriptor.defaultValue);\n        }\n        this.invokeChangedCallback(name, value, oldValue);\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[key];\n        if (this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), oldValue);\n        }\n        else {\n            this.invokeChangedCallback(key, descriptor.writer(descriptor.defaultValue), oldValue);\n        }\n    }\n    invokeChangedCallbacksForDefaultValues() {\n        for (const { key, name, defaultValue, writer } of this.valueDescriptors) {\n            if (defaultValue != undefined && !this.controller.data.has(key)) {\n                this.invokeChangedCallback(name, writer(defaultValue), undefined);\n            }\n        }\n    }\n    invokeChangedCallback(name, rawValue, rawOldValue) {\n        const changedMethodName = `${name}Changed`;\n        const changedMethod = this.receiver[changedMethodName];\n        if (typeof changedMethod == \"function\") {\n            const descriptor = this.valueDescriptorNameMap[name];\n            try {\n                const value = descriptor.reader(rawValue);\n                let oldValue = rawOldValue;\n                if (rawOldValue) {\n                    oldValue = descriptor.reader(rawOldValue);\n                }\n                changedMethod.call(this.receiver, value, oldValue);\n            }\n            catch (error) {\n                if (error instanceof TypeError) {\n                    error.message = `Stimulus Value \"${this.context.identifier}.${descriptor.name}\" - ${error.message}`;\n                }\n                throw error;\n            }\n        }\n    }\n    get valueDescriptors() {\n        const { valueDescriptorMap } = this;\n        return Object.keys(valueDescriptorMap).map((key) => valueDescriptorMap[key]);\n    }\n    get valueDescriptorNameMap() {\n        const descriptors = {};\n        Object.keys(this.valueDescriptorMap).forEach((key) => {\n            const descriptor = this.valueDescriptorMap[key];\n            descriptors[descriptor.name] = descriptor;\n        });\n        return descriptors;\n    }\n    hasValue(attributeName) {\n        const descriptor = this.valueDescriptorNameMap[attributeName];\n        const hasMethodName = `has${capitalize(descriptor.name)}`;\n        return this.receiver[hasMethodName];\n    }\n}\n\nclass TargetObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.targetsByName = new Multimap();\n    }\n    start() {\n        if (!this.tokenListObserver) {\n            this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this);\n            this.tokenListObserver.start();\n        }\n    }\n    stop() {\n        if (this.tokenListObserver) {\n            this.disconnectAllTargets();\n            this.tokenListObserver.stop();\n            delete this.tokenListObserver;\n        }\n    }\n    tokenMatched({ element, content: name }) {\n        if (this.scope.containsElement(element)) {\n            this.connectTarget(element, name);\n        }\n    }\n    tokenUnmatched({ element, content: name }) {\n        this.disconnectTarget(element, name);\n    }\n    connectTarget(element, name) {\n        var _a;\n        if (!this.targetsByName.has(name, element)) {\n            this.targetsByName.add(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetConnected(element, name));\n        }\n    }\n    disconnectTarget(element, name) {\n        var _a;\n        if (this.targetsByName.has(name, element)) {\n            this.targetsByName.delete(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetDisconnected(element, name));\n        }\n    }\n    disconnectAllTargets() {\n        for (const name of this.targetsByName.keys) {\n            for (const element of this.targetsByName.getValuesForKey(name)) {\n                this.disconnectTarget(element, name);\n            }\n        }\n    }\n    get attributeName() {\n        return `data-${this.context.identifier}-target`;\n    }\n    get element() {\n        return this.context.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nfunction readInheritableStaticArrayValues(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return Array.from(ancestors.reduce((values, constructor) => {\n        getOwnStaticArrayValues(constructor, propertyName).forEach((name) => values.add(name));\n        return values;\n    }, new Set()));\n}\nfunction readInheritableStaticObjectPairs(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return ancestors.reduce((pairs, constructor) => {\n        pairs.push(...getOwnStaticObjectPairs(constructor, propertyName));\n        return pairs;\n    }, []);\n}\nfunction getAncestorsForConstructor(constructor) {\n    const ancestors = [];\n    while (constructor) {\n        ancestors.push(constructor);\n        constructor = Object.getPrototypeOf(constructor);\n    }\n    return ancestors.reverse();\n}\nfunction getOwnStaticArrayValues(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return Array.isArray(definition) ? definition : [];\n}\nfunction getOwnStaticObjectPairs(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return definition ? Object.keys(definition).map((key) => [key, definition[key]]) : [];\n}\n\nclass OutletObserver {\n    constructor(context, delegate) {\n        this.started = false;\n        this.context = context;\n        this.delegate = delegate;\n        this.outletsByName = new Multimap();\n        this.outletElementsByName = new Multimap();\n        this.selectorObserverMap = new Map();\n        this.attributeObserverMap = new Map();\n    }\n    start() {\n        if (!this.started) {\n            this.outletDefinitions.forEach((outletName) => {\n                this.setupSelectorObserverForOutlet(outletName);\n                this.setupAttributeObserverForOutlet(outletName);\n            });\n            this.started = true;\n            this.dependentContexts.forEach((context) => context.refresh());\n        }\n    }\n    refresh() {\n        this.selectorObserverMap.forEach((observer) => observer.refresh());\n        this.attributeObserverMap.forEach((observer) => observer.refresh());\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.disconnectAllOutlets();\n            this.stopSelectorObservers();\n            this.stopAttributeObservers();\n        }\n    }\n    stopSelectorObservers() {\n        if (this.selectorObserverMap.size > 0) {\n            this.selectorObserverMap.forEach((observer) => observer.stop());\n            this.selectorObserverMap.clear();\n        }\n    }\n    stopAttributeObservers() {\n        if (this.attributeObserverMap.size > 0) {\n            this.attributeObserverMap.forEach((observer) => observer.stop());\n            this.attributeObserverMap.clear();\n        }\n    }\n    selectorMatched(element, _selector, { outletName }) {\n        const outlet = this.getOutlet(element, outletName);\n        if (outlet) {\n            this.connectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorUnmatched(element, _selector, { outletName }) {\n        const outlet = this.getOutletFromMap(element, outletName);\n        if (outlet) {\n            this.disconnectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorMatchElement(element, { outletName }) {\n        const selector = this.selector(outletName);\n        const hasOutlet = this.hasOutlet(element, outletName);\n        const hasOutletController = element.matches(`[${this.schema.controllerAttribute}~=${outletName}]`);\n        if (selector) {\n            return hasOutlet && hasOutletController && element.matches(selector);\n        }\n        else {\n            return false;\n        }\n    }\n    elementMatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementAttributeValueChanged(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementUnmatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    connectOutlet(outlet, element, outletName) {\n        var _a;\n        if (!this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.add(outletName, outlet);\n            this.outletElementsByName.add(outletName, element);\n            (_a = this.selectorObserverMap.get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletConnected(outlet, element, outletName));\n        }\n    }\n    disconnectOutlet(outlet, element, outletName) {\n        var _a;\n        if (this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.delete(outletName, outlet);\n            this.outletElementsByName.delete(outletName, element);\n            (_a = this.selectorObserverMap\n                .get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletDisconnected(outlet, element, outletName));\n        }\n    }\n    disconnectAllOutlets() {\n        for (const outletName of this.outletElementsByName.keys) {\n            for (const element of this.outletElementsByName.getValuesForKey(outletName)) {\n                for (const outlet of this.outletsByName.getValuesForKey(outletName)) {\n                    this.disconnectOutlet(outlet, element, outletName);\n                }\n            }\n        }\n    }\n    updateSelectorObserverForOutlet(outletName) {\n        const observer = this.selectorObserverMap.get(outletName);\n        if (observer) {\n            observer.selector = this.selector(outletName);\n        }\n    }\n    setupSelectorObserverForOutlet(outletName) {\n        const selector = this.selector(outletName);\n        const selectorObserver = new SelectorObserver(document.body, selector, this, { outletName });\n        this.selectorObserverMap.set(outletName, selectorObserver);\n        selectorObserver.start();\n    }\n    setupAttributeObserverForOutlet(outletName) {\n        const attributeName = this.attributeNameForOutletName(outletName);\n        const attributeObserver = new AttributeObserver(this.scope.element, attributeName, this);\n        this.attributeObserverMap.set(outletName, attributeObserver);\n        attributeObserver.start();\n    }\n    selector(outletName) {\n        return this.scope.outlets.getSelectorForOutletName(outletName);\n    }\n    attributeNameForOutletName(outletName) {\n        return this.scope.schema.outletAttributeForScope(this.identifier, outletName);\n    }\n    getOutletNameFromOutletAttributeName(attributeName) {\n        return this.outletDefinitions.find((outletName) => this.attributeNameForOutletName(outletName) === attributeName);\n    }\n    get outletDependencies() {\n        const dependencies = new Multimap();\n        this.router.modules.forEach((module) => {\n            const constructor = module.definition.controllerConstructor;\n            const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n            outlets.forEach((outlet) => dependencies.add(outlet, module.identifier));\n        });\n        return dependencies;\n    }\n    get outletDefinitions() {\n        return this.outletDependencies.getKeysForValue(this.identifier);\n    }\n    get dependentControllerIdentifiers() {\n        return this.outletDependencies.getValuesForKey(this.identifier);\n    }\n    get dependentContexts() {\n        const identifiers = this.dependentControllerIdentifiers;\n        return this.router.contexts.filter((context) => identifiers.includes(context.identifier));\n    }\n    hasOutlet(element, outletName) {\n        return !!this.getOutlet(element, outletName) || !!this.getOutletFromMap(element, outletName);\n    }\n    getOutlet(element, outletName) {\n        return this.application.getControllerForElementAndIdentifier(element, outletName);\n    }\n    getOutletFromMap(element, outletName) {\n        return this.outletsByName.getValuesForKey(outletName).find((outlet) => outlet.element === element);\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get router() {\n        return this.application.router;\n    }\n}\n\nclass Context {\n    constructor(module, scope) {\n        this.logDebugActivity = (functionName, detail = {}) => {\n            const { identifier, controller, element } = this;\n            detail = Object.assign({ identifier, controller, element }, detail);\n            this.application.logDebugActivity(this.identifier, functionName, detail);\n        };\n        this.module = module;\n        this.scope = scope;\n        this.controller = new module.controllerConstructor(this);\n        this.bindingObserver = new BindingObserver(this, this.dispatcher);\n        this.valueObserver = new ValueObserver(this, this.controller);\n        this.targetObserver = new TargetObserver(this, this);\n        this.outletObserver = new OutletObserver(this, this);\n        try {\n            this.controller.initialize();\n            this.logDebugActivity(\"initialize\");\n        }\n        catch (error) {\n            this.handleError(error, \"initializing controller\");\n        }\n    }\n    connect() {\n        this.bindingObserver.start();\n        this.valueObserver.start();\n        this.targetObserver.start();\n        this.outletObserver.start();\n        try {\n            this.controller.connect();\n            this.logDebugActivity(\"connect\");\n        }\n        catch (error) {\n            this.handleError(error, \"connecting controller\");\n        }\n    }\n    refresh() {\n        this.outletObserver.refresh();\n    }\n    disconnect() {\n        try {\n            this.controller.disconnect();\n            this.logDebugActivity(\"disconnect\");\n        }\n        catch (error) {\n            this.handleError(error, \"disconnecting controller\");\n        }\n        this.outletObserver.stop();\n        this.targetObserver.stop();\n        this.valueObserver.stop();\n        this.bindingObserver.stop();\n    }\n    get application() {\n        return this.module.application;\n    }\n    get identifier() {\n        return this.module.identifier;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get dispatcher() {\n        return this.application.dispatcher;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get parentElement() {\n        return this.element.parentElement;\n    }\n    handleError(error, message, detail = {}) {\n        const { identifier, controller, element } = this;\n        detail = Object.assign({ identifier, controller, element }, detail);\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    targetConnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetConnected`, element);\n    }\n    targetDisconnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetDisconnected`, element);\n    }\n    outletConnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletConnected`, outlet, element);\n    }\n    outletDisconnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletDisconnected`, outlet, element);\n    }\n    invokeControllerMethod(methodName, ...args) {\n        const controller = this.controller;\n        if (typeof controller[methodName] == \"function\") {\n            controller[methodName](...args);\n        }\n    }\n}\n\nfunction bless(constructor) {\n    return shadow(constructor, getBlessedProperties(constructor));\n}\nfunction shadow(constructor, properties) {\n    const shadowConstructor = extend(constructor);\n    const shadowProperties = getShadowProperties(constructor.prototype, properties);\n    Object.defineProperties(shadowConstructor.prototype, shadowProperties);\n    return shadowConstructor;\n}\nfunction getBlessedProperties(constructor) {\n    const blessings = readInheritableStaticArrayValues(constructor, \"blessings\");\n    return blessings.reduce((blessedProperties, blessing) => {\n        const properties = blessing(constructor);\n        for (const key in properties) {\n            const descriptor = blessedProperties[key] || {};\n            blessedProperties[key] = Object.assign(descriptor, properties[key]);\n        }\n        return blessedProperties;\n    }, {});\n}\nfunction getShadowProperties(prototype, properties) {\n    return getOwnKeys(properties).reduce((shadowProperties, key) => {\n        const descriptor = getShadowedDescriptor(prototype, properties, key);\n        if (descriptor) {\n            Object.assign(shadowProperties, { [key]: descriptor });\n        }\n        return shadowProperties;\n    }, {});\n}\nfunction getShadowedDescriptor(prototype, properties, key) {\n    const shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key);\n    const shadowedByValue = shadowingDescriptor && \"value\" in shadowingDescriptor;\n    if (!shadowedByValue) {\n        const descriptor = Object.getOwnPropertyDescriptor(properties, key).value;\n        if (shadowingDescriptor) {\n            descriptor.get = shadowingDescriptor.get || descriptor.get;\n            descriptor.set = shadowingDescriptor.set || descriptor.set;\n        }\n        return descriptor;\n    }\n}\nconst getOwnKeys = (() => {\n    if (typeof Object.getOwnPropertySymbols == \"function\") {\n        return (object) => [...Object.getOwnPropertyNames(object), ...Object.getOwnPropertySymbols(object)];\n    }\n    else {\n        return Object.getOwnPropertyNames;\n    }\n})();\nconst extend = (() => {\n    function extendWithReflect(constructor) {\n        function extended() {\n            return Reflect.construct(constructor, arguments, new.target);\n        }\n        extended.prototype = Object.create(constructor.prototype, {\n            constructor: { value: extended },\n        });\n        Reflect.setPrototypeOf(extended, constructor);\n        return extended;\n    }\n    function testReflectExtension() {\n        const a = function () {\n            this.a.call(this);\n        };\n        const b = extendWithReflect(a);\n        b.prototype.a = function () { };\n        return new b();\n    }\n    try {\n        testReflectExtension();\n        return extendWithReflect;\n    }\n    catch (error) {\n        return (constructor) => class extended extends constructor {\n        };\n    }\n})();\n\nfunction blessDefinition(definition) {\n    return {\n        identifier: definition.identifier,\n        controllerConstructor: bless(definition.controllerConstructor),\n    };\n}\n\nclass Module {\n    constructor(application, definition) {\n        this.application = application;\n        this.definition = blessDefinition(definition);\n        this.contextsByScope = new WeakMap();\n        this.connectedContexts = new Set();\n    }\n    get identifier() {\n        return this.definition.identifier;\n    }\n    get controllerConstructor() {\n        return this.definition.controllerConstructor;\n    }\n    get contexts() {\n        return Array.from(this.connectedContexts);\n    }\n    connectContextForScope(scope) {\n        const context = this.fetchContextForScope(scope);\n        this.connectedContexts.add(context);\n        context.connect();\n    }\n    disconnectContextForScope(scope) {\n        const context = this.contextsByScope.get(scope);\n        if (context) {\n            this.connectedContexts.delete(context);\n            context.disconnect();\n        }\n    }\n    fetchContextForScope(scope) {\n        let context = this.contextsByScope.get(scope);\n        if (!context) {\n            context = new Context(this, scope);\n            this.contextsByScope.set(scope, context);\n        }\n        return context;\n    }\n}\n\nclass ClassMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    has(name) {\n        return this.data.has(this.getDataKey(name));\n    }\n    get(name) {\n        return this.getAll(name)[0];\n    }\n    getAll(name) {\n        const tokenString = this.data.get(this.getDataKey(name)) || \"\";\n        return tokenize(tokenString);\n    }\n    getAttributeName(name) {\n        return this.data.getAttributeNameForKey(this.getDataKey(name));\n    }\n    getDataKey(name) {\n        return `${name}-class`;\n    }\n    get data() {\n        return this.scope.data;\n    }\n}\n\nclass DataMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.getAttribute(name);\n    }\n    set(key, value) {\n        const name = this.getAttributeNameForKey(key);\n        this.element.setAttribute(name, value);\n        return this.get(key);\n    }\n    has(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.hasAttribute(name);\n    }\n    delete(key) {\n        if (this.has(key)) {\n            const name = this.getAttributeNameForKey(key);\n            this.element.removeAttribute(name);\n            return true;\n        }\n        else {\n            return false;\n        }\n    }\n    getAttributeNameForKey(key) {\n        return `data-${this.identifier}-${dasherize(key)}`;\n    }\n}\n\nclass Guide {\n    constructor(logger) {\n        this.warnedKeysByObject = new WeakMap();\n        this.logger = logger;\n    }\n    warn(object, key, message) {\n        let warnedKeys = this.warnedKeysByObject.get(object);\n        if (!warnedKeys) {\n            warnedKeys = new Set();\n            this.warnedKeysByObject.set(object, warnedKeys);\n        }\n        if (!warnedKeys.has(key)) {\n            warnedKeys.add(key);\n            this.logger.warn(message, object);\n        }\n    }\n}\n\nfunction attributeValueContainsToken(attributeName, token) {\n    return `[${attributeName}~=\"${token}\"]`;\n}\n\nclass TargetSet {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(targetName) {\n        return this.find(targetName) != null;\n    }\n    find(...targetNames) {\n        return targetNames.reduce((target, targetName) => target || this.findTarget(targetName) || this.findLegacyTarget(targetName), undefined);\n    }\n    findAll(...targetNames) {\n        return targetNames.reduce((targets, targetName) => [\n            ...targets,\n            ...this.findAllTargets(targetName),\n            ...this.findAllLegacyTargets(targetName),\n        ], []);\n    }\n    findTarget(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findElement(selector);\n    }\n    findAllTargets(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector);\n    }\n    getSelectorForTargetName(targetName) {\n        const attributeName = this.schema.targetAttributeForScope(this.identifier);\n        return attributeValueContainsToken(attributeName, targetName);\n    }\n    findLegacyTarget(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.deprecate(this.scope.findElement(selector), targetName);\n    }\n    findAllLegacyTargets(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector).map((element) => this.deprecate(element, targetName));\n    }\n    getLegacySelectorForTargetName(targetName) {\n        const targetDescriptor = `${this.identifier}.${targetName}`;\n        return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor);\n    }\n    deprecate(element, targetName) {\n        if (element) {\n            const { identifier } = this;\n            const attributeName = this.schema.targetAttribute;\n            const revisedAttributeName = this.schema.targetAttributeForScope(identifier);\n            this.guide.warn(element, `target:${targetName}`, `Please replace ${attributeName}=\"${identifier}.${targetName}\" with ${revisedAttributeName}=\"${targetName}\". ` +\n                `The ${attributeName} attribute is deprecated and will be removed in a future version of Stimulus.`);\n        }\n        return element;\n    }\n    get guide() {\n        return this.scope.guide;\n    }\n}\n\nclass OutletSet {\n    constructor(scope, controllerElement) {\n        this.scope = scope;\n        this.controllerElement = controllerElement;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(outletName) {\n        return this.find(outletName) != null;\n    }\n    find(...outletNames) {\n        return outletNames.reduce((outlet, outletName) => outlet || this.findOutlet(outletName), undefined);\n    }\n    findAll(...outletNames) {\n        return outletNames.reduce((outlets, outletName) => [...outlets, ...this.findAllOutlets(outletName)], []);\n    }\n    getSelectorForOutletName(outletName) {\n        const attributeName = this.schema.outletAttributeForScope(this.identifier, outletName);\n        return this.controllerElement.getAttribute(attributeName);\n    }\n    findOutlet(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        if (selector)\n            return this.findElement(selector, outletName);\n    }\n    findAllOutlets(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        return selector ? this.findAllElements(selector, outletName) : [];\n    }\n    findElement(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName))[0];\n    }\n    findAllElements(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName));\n    }\n    matchesElement(element, selector, outletName) {\n        const controllerAttribute = element.getAttribute(this.scope.schema.controllerAttribute) || \"\";\n        return element.matches(selector) && controllerAttribute.split(\" \").includes(outletName);\n    }\n}\n\nclass Scope {\n    constructor(schema, element, identifier, logger) {\n        this.targets = new TargetSet(this);\n        this.classes = new ClassMap(this);\n        this.data = new DataMap(this);\n        this.containsElement = (element) => {\n            return element.closest(this.controllerSelector) === this.element;\n        };\n        this.schema = schema;\n        this.element = element;\n        this.identifier = identifier;\n        this.guide = new Guide(logger);\n        this.outlets = new OutletSet(this.documentScope, element);\n    }\n    findElement(selector) {\n        return this.element.matches(selector) ? this.element : this.queryElements(selector).find(this.containsElement);\n    }\n    findAllElements(selector) {\n        return [\n            ...(this.element.matches(selector) ? [this.element] : []),\n            ...this.queryElements(selector).filter(this.containsElement),\n        ];\n    }\n    queryElements(selector) {\n        return Array.from(this.element.querySelectorAll(selector));\n    }\n    get controllerSelector() {\n        return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier);\n    }\n    get isDocumentScope() {\n        return this.element === document.documentElement;\n    }\n    get documentScope() {\n        return this.isDocumentScope\n            ? this\n            : new Scope(this.schema, document.documentElement, this.identifier, this.guide.logger);\n    }\n}\n\nclass ScopeObserver {\n    constructor(element, schema, delegate) {\n        this.element = element;\n        this.schema = schema;\n        this.delegate = delegate;\n        this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this);\n        this.scopesByIdentifierByElement = new WeakMap();\n        this.scopeReferenceCounts = new WeakMap();\n    }\n    start() {\n        this.valueListObserver.start();\n    }\n    stop() {\n        this.valueListObserver.stop();\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    parseValueForToken(token) {\n        const { element, content: identifier } = token;\n        return this.parseValueForElementAndIdentifier(element, identifier);\n    }\n    parseValueForElementAndIdentifier(element, identifier) {\n        const scopesByIdentifier = this.fetchScopesByIdentifierForElement(element);\n        let scope = scopesByIdentifier.get(identifier);\n        if (!scope) {\n            scope = this.delegate.createScopeForElementAndIdentifier(element, identifier);\n            scopesByIdentifier.set(identifier, scope);\n        }\n        return scope;\n    }\n    elementMatchedValue(element, value) {\n        const referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1;\n        this.scopeReferenceCounts.set(value, referenceCount);\n        if (referenceCount == 1) {\n            this.delegate.scopeConnected(value);\n        }\n    }\n    elementUnmatchedValue(element, value) {\n        const referenceCount = this.scopeReferenceCounts.get(value);\n        if (referenceCount) {\n            this.scopeReferenceCounts.set(value, referenceCount - 1);\n            if (referenceCount == 1) {\n                this.delegate.scopeDisconnected(value);\n            }\n        }\n    }\n    fetchScopesByIdentifierForElement(element) {\n        let scopesByIdentifier = this.scopesByIdentifierByElement.get(element);\n        if (!scopesByIdentifier) {\n            scopesByIdentifier = new Map();\n            this.scopesByIdentifierByElement.set(element, scopesByIdentifier);\n        }\n        return scopesByIdentifier;\n    }\n}\n\nclass Router {\n    constructor(application) {\n        this.application = application;\n        this.scopeObserver = new ScopeObserver(this.element, this.schema, this);\n        this.scopesByIdentifier = new Multimap();\n        this.modulesByIdentifier = new Map();\n    }\n    get element() {\n        return this.application.element;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get logger() {\n        return this.application.logger;\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    get modules() {\n        return Array.from(this.modulesByIdentifier.values());\n    }\n    get contexts() {\n        return this.modules.reduce((contexts, module) => contexts.concat(module.contexts), []);\n    }\n    start() {\n        this.scopeObserver.start();\n    }\n    stop() {\n        this.scopeObserver.stop();\n    }\n    loadDefinition(definition) {\n        this.unloadIdentifier(definition.identifier);\n        const module = new Module(this.application, definition);\n        this.connectModule(module);\n        const afterLoad = definition.controllerConstructor.afterLoad;\n        if (afterLoad) {\n            afterLoad.call(definition.controllerConstructor, definition.identifier, this.application);\n        }\n    }\n    unloadIdentifier(identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            this.disconnectModule(module);\n        }\n    }\n    getContextForElementAndIdentifier(element, identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            return module.contexts.find((context) => context.element == element);\n        }\n    }\n    proposeToConnectScopeForElementAndIdentifier(element, identifier) {\n        const scope = this.scopeObserver.parseValueForElementAndIdentifier(element, identifier);\n        if (scope) {\n            this.scopeObserver.elementMatchedValue(scope.element, scope);\n        }\n        else {\n            console.error(`Couldn't find or create scope for identifier: \"${identifier}\" and element:`, element);\n        }\n    }\n    handleError(error, message, detail) {\n        this.application.handleError(error, message, detail);\n    }\n    createScopeForElementAndIdentifier(element, identifier) {\n        return new Scope(this.schema, element, identifier, this.logger);\n    }\n    scopeConnected(scope) {\n        this.scopesByIdentifier.add(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.connectContextForScope(scope);\n        }\n    }\n    scopeDisconnected(scope) {\n        this.scopesByIdentifier.delete(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.disconnectContextForScope(scope);\n        }\n    }\n    connectModule(module) {\n        this.modulesByIdentifier.set(module.identifier, module);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.connectContextForScope(scope));\n    }\n    disconnectModule(module) {\n        this.modulesByIdentifier.delete(module.identifier);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.disconnectContextForScope(scope));\n    }\n}\n\nconst defaultSchema = {\n    controllerAttribute: \"data-controller\",\n    actionAttribute: \"data-action\",\n    targetAttribute: \"data-target\",\n    targetAttributeForScope: (identifier) => `data-${identifier}-target`,\n    outletAttributeForScope: (identifier, outlet) => `data-${identifier}-${outlet}-outlet`,\n    keyMappings: Object.assign(Object.assign({ enter: \"Enter\", tab: \"Tab\", esc: \"Escape\", space: \" \", up: \"ArrowUp\", down: \"ArrowDown\", left: \"ArrowLeft\", right: \"ArrowRight\", home: \"Home\", end: \"End\", page_up: \"PageUp\", page_down: \"PageDown\" }, objectFromEntries(\"abcdefghijklmnopqrstuvwxyz\".split(\"\").map((c) => [c, c]))), objectFromEntries(\"0123456789\".split(\"\").map((n) => [n, n]))),\n};\nfunction objectFromEntries(array) {\n    return array.reduce((memo, [k, v]) => (Object.assign(Object.assign({}, memo), { [k]: v })), {});\n}\n\nclass Application {\n    constructor(element = document.documentElement, schema = defaultSchema) {\n        this.logger = console;\n        this.debug = false;\n        this.logDebugActivity = (identifier, functionName, detail = {}) => {\n            if (this.debug) {\n                this.logFormattedMessage(identifier, functionName, detail);\n            }\n        };\n        this.element = element;\n        this.schema = schema;\n        this.dispatcher = new Dispatcher(this);\n        this.router = new Router(this);\n        this.actionDescriptorFilters = Object.assign({}, defaultActionDescriptorFilters);\n    }\n    static start(element, schema) {\n        const application = new this(element, schema);\n        application.start();\n        return application;\n    }\n    async start() {\n        await domReady();\n        this.logDebugActivity(\"application\", \"starting\");\n        this.dispatcher.start();\n        this.router.start();\n        this.logDebugActivity(\"application\", \"start\");\n    }\n    stop() {\n        this.logDebugActivity(\"application\", \"stopping\");\n        this.dispatcher.stop();\n        this.router.stop();\n        this.logDebugActivity(\"application\", \"stop\");\n    }\n    register(identifier, controllerConstructor) {\n        this.load({ identifier, controllerConstructor });\n    }\n    registerActionOption(name, filter) {\n        this.actionDescriptorFilters[name] = filter;\n    }\n    load(head, ...rest) {\n        const definitions = Array.isArray(head) ? head : [head, ...rest];\n        definitions.forEach((definition) => {\n            if (definition.controllerConstructor.shouldLoad) {\n                this.router.loadDefinition(definition);\n            }\n        });\n    }\n    unload(head, ...rest) {\n        const identifiers = Array.isArray(head) ? head : [head, ...rest];\n        identifiers.forEach((identifier) => this.router.unloadIdentifier(identifier));\n    }\n    get controllers() {\n        return this.router.contexts.map((context) => context.controller);\n    }\n    getControllerForElementAndIdentifier(element, identifier) {\n        const context = this.router.getContextForElementAndIdentifier(element, identifier);\n        return context ? context.controller : null;\n    }\n    handleError(error, message, detail) {\n        var _a;\n        this.logger.error(`%s\\n\\n%o\\n\\n%o`, message, error, detail);\n        (_a = window.onerror) === null || _a === void 0 ? void 0 : _a.call(window, message, \"\", 0, 0, error);\n    }\n    logFormattedMessage(identifier, functionName, detail = {}) {\n        detail = Object.assign({ application: this }, detail);\n        this.logger.groupCollapsed(`${identifier} #${functionName}`);\n        this.logger.log(\"details:\", Object.assign({}, detail));\n        this.logger.groupEnd();\n    }\n}\nfunction domReady() {\n    return new Promise((resolve) => {\n        if (document.readyState == \"loading\") {\n            document.addEventListener(\"DOMContentLoaded\", () => resolve());\n        }\n        else {\n            resolve();\n        }\n    });\n}\n\nfunction ClassPropertiesBlessing(constructor) {\n    const classes = readInheritableStaticArrayValues(constructor, \"classes\");\n    return classes.reduce((properties, classDefinition) => {\n        return Object.assign(properties, propertiesForClassDefinition(classDefinition));\n    }, {});\n}\nfunction propertiesForClassDefinition(key) {\n    return {\n        [`${key}Class`]: {\n            get() {\n                const { classes } = this;\n                if (classes.has(key)) {\n                    return classes.get(key);\n                }\n                else {\n                    const attribute = classes.getAttributeName(key);\n                    throw new Error(`Missing attribute \"${attribute}\"`);\n                }\n            },\n        },\n        [`${key}Classes`]: {\n            get() {\n                return this.classes.getAll(key);\n            },\n        },\n        [`has${capitalize(key)}Class`]: {\n            get() {\n                return this.classes.has(key);\n            },\n        },\n    };\n}\n\nfunction OutletPropertiesBlessing(constructor) {\n    const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n    return outlets.reduce((properties, outletDefinition) => {\n        return Object.assign(properties, propertiesForOutletDefinition(outletDefinition));\n    }, {});\n}\nfunction getOutletController(controller, element, identifier) {\n    return controller.application.getControllerForElementAndIdentifier(element, identifier);\n}\nfunction getControllerAndEnsureConnectedScope(controller, element, outletName) {\n    let outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n    controller.application.router.proposeToConnectScopeForElementAndIdentifier(element, outletName);\n    outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n}\nfunction propertiesForOutletDefinition(name) {\n    const camelizedName = namespaceCamelize(name);\n    return {\n        [`${camelizedName}Outlet`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                    if (outletController)\n                        return outletController;\n                    throw new Error(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`);\n                }\n                throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n            },\n        },\n        [`${camelizedName}Outlets`]: {\n            get() {\n                const outlets = this.outlets.findAll(name);\n                if (outlets.length > 0) {\n                    return outlets\n                        .map((outletElement) => {\n                        const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                        if (outletController)\n                            return outletController;\n                        console.warn(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`, outletElement);\n                    })\n                        .filter((controller) => controller);\n                }\n                return [];\n            },\n        },\n        [`${camelizedName}OutletElement`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    return outletElement;\n                }\n                else {\n                    throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n                }\n            },\n        },\n        [`${camelizedName}OutletElements`]: {\n            get() {\n                return this.outlets.findAll(name);\n            },\n        },\n        [`has${capitalize(camelizedName)}Outlet`]: {\n            get() {\n                return this.outlets.has(name);\n            },\n        },\n    };\n}\n\nfunction TargetPropertiesBlessing(constructor) {\n    const targets = readInheritableStaticArrayValues(constructor, \"targets\");\n    return targets.reduce((properties, targetDefinition) => {\n        return Object.assign(properties, propertiesForTargetDefinition(targetDefinition));\n    }, {});\n}\nfunction propertiesForTargetDefinition(name) {\n    return {\n        [`${name}Target`]: {\n            get() {\n                const target = this.targets.find(name);\n                if (target) {\n                    return target;\n                }\n                else {\n                    throw new Error(`Missing target element \"${name}\" for \"${this.identifier}\" controller`);\n                }\n            },\n        },\n        [`${name}Targets`]: {\n            get() {\n                return this.targets.findAll(name);\n            },\n        },\n        [`has${capitalize(name)}Target`]: {\n            get() {\n                return this.targets.has(name);\n            },\n        },\n    };\n}\n\nfunction ValuePropertiesBlessing(constructor) {\n    const valueDefinitionPairs = readInheritableStaticObjectPairs(constructor, \"values\");\n    const propertyDescriptorMap = {\n        valueDescriptorMap: {\n            get() {\n                return valueDefinitionPairs.reduce((result, valueDefinitionPair) => {\n                    const valueDescriptor = parseValueDefinitionPair(valueDefinitionPair, this.identifier);\n                    const attributeName = this.data.getAttributeNameForKey(valueDescriptor.key);\n                    return Object.assign(result, { [attributeName]: valueDescriptor });\n                }, {});\n            },\n        },\n    };\n    return valueDefinitionPairs.reduce((properties, valueDefinitionPair) => {\n        return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair));\n    }, propertyDescriptorMap);\n}\nfunction propertiesForValueDefinitionPair(valueDefinitionPair, controller) {\n    const definition = parseValueDefinitionPair(valueDefinitionPair, controller);\n    const { key, name, reader: read, writer: write } = definition;\n    return {\n        [name]: {\n            get() {\n                const value = this.data.get(key);\n                if (value !== null) {\n                    return read(value);\n                }\n                else {\n                    return definition.defaultValue;\n                }\n            },\n            set(value) {\n                if (value === undefined) {\n                    this.data.delete(key);\n                }\n                else {\n                    this.data.set(key, write(value));\n                }\n            },\n        },\n        [`has${capitalize(name)}`]: {\n            get() {\n                return this.data.has(key) || definition.hasCustomDefaultValue;\n            },\n        },\n    };\n}\nfunction parseValueDefinitionPair([token, typeDefinition], controller) {\n    return valueDescriptorForTokenAndTypeDefinition({\n        controller,\n        token,\n        typeDefinition,\n    });\n}\nfunction parseValueTypeConstant(constant) {\n    switch (constant) {\n        case Array:\n            return \"array\";\n        case Boolean:\n            return \"boolean\";\n        case Number:\n            return \"number\";\n        case Object:\n            return \"object\";\n        case String:\n            return \"string\";\n    }\n}\nfunction parseValueTypeDefault(defaultValue) {\n    switch (typeof defaultValue) {\n        case \"boolean\":\n            return \"boolean\";\n        case \"number\":\n            return \"number\";\n        case \"string\":\n            return \"string\";\n    }\n    if (Array.isArray(defaultValue))\n        return \"array\";\n    if (Object.prototype.toString.call(defaultValue) === \"[object Object]\")\n        return \"object\";\n}\nfunction parseValueTypeObject(payload) {\n    const { controller, token, typeObject } = payload;\n    const hasType = isSomething(typeObject.type);\n    const hasDefault = isSomething(typeObject.default);\n    const fullObject = hasType && hasDefault;\n    const onlyType = hasType && !hasDefault;\n    const onlyDefault = !hasType && hasDefault;\n    const typeFromObject = parseValueTypeConstant(typeObject.type);\n    const typeFromDefaultValue = parseValueTypeDefault(payload.typeObject.default);\n    if (onlyType)\n        return typeFromObject;\n    if (onlyDefault)\n        return typeFromDefaultValue;\n    if (typeFromObject !== typeFromDefaultValue) {\n        const propertyPath = controller ? `${controller}.${token}` : token;\n        throw new Error(`The specified default value for the Stimulus Value \"${propertyPath}\" must match the defined type \"${typeFromObject}\". The provided default value of \"${typeObject.default}\" is of type \"${typeFromDefaultValue}\".`);\n    }\n    if (fullObject)\n        return typeFromObject;\n}\nfunction parseValueTypeDefinition(payload) {\n    const { controller, token, typeDefinition } = payload;\n    const typeObject = { controller, token, typeObject: typeDefinition };\n    const typeFromObject = parseValueTypeObject(typeObject);\n    const typeFromDefaultValue = parseValueTypeDefault(typeDefinition);\n    const typeFromConstant = parseValueTypeConstant(typeDefinition);\n    const type = typeFromObject || typeFromDefaultValue || typeFromConstant;\n    if (type)\n        return type;\n    const propertyPath = controller ? `${controller}.${typeDefinition}` : token;\n    throw new Error(`Unknown value type \"${propertyPath}\" for \"${token}\" value`);\n}\nfunction defaultValueForDefinition(typeDefinition) {\n    const constant = parseValueTypeConstant(typeDefinition);\n    if (constant)\n        return defaultValuesByType[constant];\n    const hasDefault = hasProperty(typeDefinition, \"default\");\n    const hasType = hasProperty(typeDefinition, \"type\");\n    const typeObject = typeDefinition;\n    if (hasDefault)\n        return typeObject.default;\n    if (hasType) {\n        const { type } = typeObject;\n        const constantFromType = parseValueTypeConstant(type);\n        if (constantFromType)\n            return defaultValuesByType[constantFromType];\n    }\n    return typeDefinition;\n}\nfunction valueDescriptorForTokenAndTypeDefinition(payload) {\n    const { token, typeDefinition } = payload;\n    const key = `${dasherize(token)}-value`;\n    const type = parseValueTypeDefinition(payload);\n    return {\n        type,\n        key,\n        name: camelize(key),\n        get defaultValue() {\n            return defaultValueForDefinition(typeDefinition);\n        },\n        get hasCustomDefaultValue() {\n            return parseValueTypeDefault(typeDefinition) !== undefined;\n        },\n        reader: readers[type],\n        writer: writers[type] || writers.default,\n    };\n}\nconst defaultValuesByType = {\n    get array() {\n        return [];\n    },\n    boolean: false,\n    number: 0,\n    get object() {\n        return {};\n    },\n    string: \"\",\n};\nconst readers = {\n    array(value) {\n        const array = JSON.parse(value);\n        if (!Array.isArray(array)) {\n            throw new TypeError(`expected value of type \"array\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(array)}\"`);\n        }\n        return array;\n    },\n    boolean(value) {\n        return !(value == \"0\" || String(value).toLowerCase() == \"false\");\n    },\n    number(value) {\n        return Number(value.replace(/_/g, \"\"));\n    },\n    object(value) {\n        const object = JSON.parse(value);\n        if (object === null || typeof object != \"object\" || Array.isArray(object)) {\n            throw new TypeError(`expected value of type \"object\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(object)}\"`);\n        }\n        return object;\n    },\n    string(value) {\n        return value;\n    },\n};\nconst writers = {\n    default: writeString,\n    array: writeJSON,\n    object: writeJSON,\n};\nfunction writeJSON(value) {\n    return JSON.stringify(value);\n}\nfunction writeString(value) {\n    return `${value}`;\n}\n\nclass Controller {\n    constructor(context) {\n        this.context = context;\n    }\n    static get shouldLoad() {\n        return true;\n    }\n    static afterLoad(_identifier, _application) {\n        return;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get targets() {\n        return this.scope.targets;\n    }\n    get outlets() {\n        return this.scope.outlets;\n    }\n    get classes() {\n        return this.scope.classes;\n    }\n    get data() {\n        return this.scope.data;\n    }\n    initialize() {\n    }\n    connect() {\n    }\n    disconnect() {\n    }\n    dispatch(eventName, { target = this.element, detail = {}, prefix = this.identifier, bubbles = true, cancelable = true, } = {}) {\n        const type = prefix ? `${prefix}:${eventName}` : eventName;\n        const event = new CustomEvent(type, { detail, bubbles, cancelable });\n        target.dispatchEvent(event);\n        return event;\n    }\n}\nController.blessings = [\n    ClassPropertiesBlessing,\n    TargetPropertiesBlessing,\n    ValuePropertiesBlessing,\n    OutletPropertiesBlessing,\n];\nController.targets = [];\nController.outlets = [];\nController.values = {};\n\nexport { Application, AttributeObserver, Context, Controller, ElementObserver, IndexedMultimap, Multimap, SelectorObserver, StringMapObserver, TokenListObserver, ValueListObserver, add, defaultSchema, del, fetch, prune };\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar win$1 = window;\nvar raf = win$1.requestAnimationFrame || win$1.webkitRequestAnimationFrame || win$1.mozRequestAnimationFrame || win$1.msRequestAnimationFrame || function (cb) {\n  return setTimeout(cb, 16);\n};\n\nvar win = window;\nvar caf = win.cancelAnimationFrame || win.mozCancelAnimationFrame || function (id) {\n  clearTimeout(id);\n};\n\nfunction extend() {\n  var obj,\n      name,\n      copy,\n      target = arguments[0] || {},\n      i = 1,\n      length = arguments.length;\n\n  for (; i < length; i++) {\n    if ((obj = arguments[i]) !== null) {\n      for (name in obj) {\n        copy = obj[name];\n\n        if (target === copy) {\n          continue;\n        } else if (copy !== undefined) {\n          target[name] = copy;\n        }\n      }\n    }\n  }\n\n  return target;\n}\n\nfunction checkStorageValue(value) {\n  return ['true', 'false'].indexOf(value) >= 0 ? JSON.parse(value) : value;\n}\n\nfunction setLocalStorage(storage, key, value, access) {\n  if (access) {\n    try {\n      storage.setItem(key, value);\n    } catch (e) {}\n  }\n\n  return value;\n}\n\nfunction getSlideId() {\n  var id = window.tnsId;\n  window.tnsId = !id ? 1 : id + 1;\n  return 'tns' + window.tnsId;\n}\n\nfunction getBody() {\n  var doc = document,\n      body = doc.body;\n\n  if (!body) {\n    body = doc.createElement('body');\n    body.fake = true;\n  }\n\n  return body;\n}\n\nvar docElement = document.documentElement;\n\nfunction setFakeBody(body) {\n  var docOverflow = '';\n\n  if (body.fake) {\n    docOverflow = docElement.style.overflow; //avoid crashing IE8, if background image is used\n\n    body.style.background = ''; //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible\n\n    body.style.overflow = docElement.style.overflow = 'hidden';\n    docElement.appendChild(body);\n  }\n\n  return docOverflow;\n}\n\nfunction resetFakeBody(body, docOverflow) {\n  if (body.fake) {\n    body.remove();\n    docElement.style.overflow = docOverflow; // Trigger layout so kinetic scrolling isn't disabled in iOS6+\n    // eslint-disable-next-line\n\n    docElement.offsetHeight;\n  }\n}\n\n// get css-calc \nfunction calc() {\n  var doc = document,\n      body = getBody(),\n      docOverflow = setFakeBody(body),\n      div = doc.createElement('div'),\n      result = false;\n  body.appendChild(div);\n\n  try {\n    var str = '(10px * 10)',\n        vals = ['calc' + str, '-moz-calc' + str, '-webkit-calc' + str],\n        val;\n\n    for (var i = 0; i < 3; i++) {\n      val = vals[i];\n      div.style.width = val;\n\n      if (div.offsetWidth === 100) {\n        result = val.replace(str, '');\n        break;\n      }\n    }\n  } catch (e) {}\n\n  body.fake ? resetFakeBody(body, docOverflow) : div.remove();\n  return result;\n}\n\n// get subpixel support value\nfunction percentageLayout() {\n  // check subpixel layout supporting\n  var doc = document,\n      body = getBody(),\n      docOverflow = setFakeBody(body),\n      wrapper = doc.createElement('div'),\n      outer = doc.createElement('div'),\n      str = '',\n      count = 70,\n      perPage = 3,\n      supported = false;\n  wrapper.className = \"tns-t-subp2\";\n  outer.className = \"tns-t-ct\";\n\n  for (var i = 0; i < count; i++) {\n    str += '<div></div>';\n  }\n\n  outer.innerHTML = str;\n  wrapper.appendChild(outer);\n  body.appendChild(wrapper);\n  supported = Math.abs(wrapper.getBoundingClientRect().left - outer.children[count - perPage].getBoundingClientRect().left) < 2;\n  body.fake ? resetFakeBody(body, docOverflow) : wrapper.remove();\n  return supported;\n}\n\nfunction mediaquerySupport() {\n  if (window.matchMedia || window.msMatchMedia) {\n    return true;\n  }\n\n  var doc = document,\n      body = getBody(),\n      docOverflow = setFakeBody(body),\n      div = doc.createElement('div'),\n      style = doc.createElement('style'),\n      rule = '@media all and (min-width:1px){.tns-mq-test{position:absolute}}',\n      position;\n  style.type = 'text/css';\n  div.className = 'tns-mq-test';\n  body.appendChild(style);\n  body.appendChild(div);\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = rule;\n  } else {\n    style.appendChild(doc.createTextNode(rule));\n  }\n\n  position = window.getComputedStyle ? window.getComputedStyle(div).position : div.currentStyle['position'];\n  body.fake ? resetFakeBody(body, docOverflow) : div.remove();\n  return position === \"absolute\";\n}\n\n// create and append style sheet\nfunction createStyleSheet(media, nonce) {\n  // Create the <style> tag\n  var style = document.createElement(\"style\"); // style.setAttribute(\"type\", \"text/css\");\n  // Add a media (and/or media query) here if you'd like!\n  // style.setAttribute(\"media\", \"screen\")\n  // style.setAttribute(\"media\", \"only screen and (max-width : 1024px)\")\n\n  if (media) {\n    style.setAttribute(\"media\", media);\n  } // Add nonce attribute for Content Security Policy\n\n\n  if (nonce) {\n    style.setAttribute(\"nonce\", nonce);\n  } // WebKit hack :(\n  // style.appendChild(document.createTextNode(\"\"));\n  // Add the <style> element to the page\n\n\n  document.querySelector('head').appendChild(style);\n  return style.sheet ? style.sheet : style.styleSheet;\n}\n\n// cross browsers addRule method\nfunction addCSSRule(sheet, selector, rules, index) {\n  // return raf(function() {\n  'insertRule' in sheet ? sheet.insertRule(selector + '{' + rules + '}', index) : sheet.addRule(selector, rules, index); // });\n}\n\n// cross browsers addRule method\nfunction removeCSSRule(sheet, index) {\n  // return raf(function() {\n  'deleteRule' in sheet ? sheet.deleteRule(index) : sheet.removeRule(index); // });\n}\n\nfunction getCssRulesLength(sheet) {\n  var rule = 'insertRule' in sheet ? sheet.cssRules : sheet.rules;\n  return rule.length;\n}\n\nfunction toDegree(y, x) {\n  return Math.atan2(y, x) * (180 / Math.PI);\n}\n\nfunction getTouchDirection(angle, range) {\n  var direction = false,\n      gap = Math.abs(90 - Math.abs(angle));\n\n  if (gap >= 90 - range) {\n    direction = 'horizontal';\n  } else if (gap <= range) {\n    direction = 'vertical';\n  }\n\n  return direction;\n}\n\n// https://toddmotto.com/ditch-the-array-foreach-call-nodelist-hack/\nfunction forEach(arr, callback, scope) {\n  for (var i = 0, l = arr.length; i < l; i++) {\n    callback.call(scope, arr[i], i);\n  }\n}\n\nvar classListSupport = ('classList' in document.createElement('_'));\n\nvar hasClass = classListSupport ? function (el, str) {\n  return el.classList.contains(str);\n} : function (el, str) {\n  return el.className.indexOf(str) >= 0;\n};\n\nvar addClass = classListSupport ? function (el, str) {\n  if (!hasClass(el, str)) {\n    el.classList.add(str);\n  }\n} : function (el, str) {\n  if (!hasClass(el, str)) {\n    el.className += ' ' + str;\n  }\n};\n\nvar removeClass = classListSupport ? function (el, str) {\n  if (hasClass(el, str)) {\n    el.classList.remove(str);\n  }\n} : function (el, str) {\n  if (hasClass(el, str)) {\n    el.className = el.className.replace(str, '');\n  }\n};\n\nfunction hasAttr(el, attr) {\n  return el.hasAttribute(attr);\n}\n\nfunction getAttr(el, attr) {\n  return el.getAttribute(attr);\n}\n\nfunction isNodeList(el) {\n  // Only NodeList has the \"item()\" function\n  return typeof el.item !== \"undefined\";\n}\n\nfunction setAttrs(els, attrs) {\n  els = isNodeList(els) || els instanceof Array ? els : [els];\n\n  if (Object.prototype.toString.call(attrs) !== '[object Object]') {\n    return;\n  }\n\n  for (var i = els.length; i--;) {\n    for (var key in attrs) {\n      els[i].setAttribute(key, attrs[key]);\n    }\n  }\n}\n\nfunction removeAttrs(els, attrs) {\n  els = isNodeList(els) || els instanceof Array ? els : [els];\n  attrs = attrs instanceof Array ? attrs : [attrs];\n  var attrLength = attrs.length;\n\n  for (var i = els.length; i--;) {\n    for (var j = attrLength; j--;) {\n      els[i].removeAttribute(attrs[j]);\n    }\n  }\n}\n\nfunction arrayFromNodeList(nl) {\n  var arr = [];\n\n  for (var i = 0, l = nl.length; i < l; i++) {\n    arr.push(nl[i]);\n  }\n\n  return arr;\n}\n\nfunction hideElement(el, forceHide) {\n  if (el.style.display !== 'none') {\n    el.style.display = 'none';\n  }\n}\n\nfunction showElement(el, forceHide) {\n  if (el.style.display === 'none') {\n    el.style.display = '';\n  }\n}\n\nfunction isVisible(el) {\n  return window.getComputedStyle(el).display !== 'none';\n}\n\nfunction whichProperty(props) {\n  if (typeof props === 'string') {\n    var arr = [props],\n        Props = props.charAt(0).toUpperCase() + props.substr(1),\n        prefixes = ['Webkit', 'Moz', 'ms', 'O'];\n    prefixes.forEach(function (prefix) {\n      if (prefix !== 'ms' || props === 'transform') {\n        arr.push(prefix + Props);\n      }\n    });\n    props = arr;\n  }\n\n  var el = document.createElement('fakeelement');\n      props.length;\n\n  for (var i = 0; i < props.length; i++) {\n    var prop = props[i];\n\n    if (el.style[prop] !== undefined) {\n      return prop;\n    }\n  }\n\n  return false; // explicit for ie9-\n}\n\nfunction has3DTransforms(tf) {\n  if (!tf) {\n    return false;\n  }\n\n  if (!window.getComputedStyle) {\n    return false;\n  }\n\n  var doc = document,\n      body = getBody(),\n      docOverflow = setFakeBody(body),\n      el = doc.createElement('p'),\n      has3d,\n      cssTF = tf.length > 9 ? '-' + tf.slice(0, -9).toLowerCase() + '-' : '';\n  cssTF += 'transform'; // Add it to the body to get the computed style\n\n  body.insertBefore(el, null);\n  el.style[tf] = 'translate3d(1px,1px,1px)';\n  has3d = window.getComputedStyle(el).getPropertyValue(cssTF);\n  body.fake ? resetFakeBody(body, docOverflow) : el.remove();\n  return has3d !== undefined && has3d.length > 0 && has3d !== \"none\";\n}\n\n// get transitionend, animationend based on transitionDuration\n// @propin: string\n// @propOut: string, first-letter uppercase\n// Usage: getEndProperty('WebkitTransitionDuration', 'Transition') => webkitTransitionEnd\nfunction getEndProperty(propIn, propOut) {\n  var endProp = false;\n\n  if (/^Webkit/.test(propIn)) {\n    endProp = 'webkit' + propOut + 'End';\n  } else if (/^O/.test(propIn)) {\n    endProp = 'o' + propOut + 'End';\n  } else if (propIn) {\n    endProp = propOut.toLowerCase() + 'end';\n  }\n\n  return endProp;\n}\n\n// Test via a getter in the options object to see if the passive property is accessed\nvar supportsPassive = false;\n\ntry {\n  var opts = Object.defineProperty({}, 'passive', {\n    get: function () {\n      supportsPassive = true;\n    }\n  });\n  window.addEventListener(\"test\", null, opts);\n} catch (e) {}\n\nvar passiveOption = supportsPassive ? {\n  passive: true\n} : false;\n\nfunction addEvents(el, obj, preventScrolling) {\n  for (var prop in obj) {\n    var option = ['touchstart', 'touchmove'].indexOf(prop) >= 0 && !preventScrolling ? passiveOption : false;\n    el.addEventListener(prop, obj[prop], option);\n  }\n}\n\nfunction removeEvents(el, obj) {\n  for (var prop in obj) {\n    var option = ['touchstart', 'touchmove'].indexOf(prop) >= 0 ? passiveOption : false;\n    el.removeEventListener(prop, obj[prop], option);\n  }\n}\n\nfunction Events() {\n  return {\n    topics: {},\n    on: function (eventName, fn) {\n      this.topics[eventName] = this.topics[eventName] || [];\n      this.topics[eventName].push(fn);\n    },\n    off: function (eventName, fn) {\n      if (this.topics[eventName]) {\n        for (var i = 0; i < this.topics[eventName].length; i++) {\n          if (this.topics[eventName][i] === fn) {\n            this.topics[eventName].splice(i, 1);\n            break;\n          }\n        }\n      }\n    },\n    emit: function (eventName, data) {\n      data.type = eventName;\n\n      if (this.topics[eventName]) {\n        this.topics[eventName].forEach(function (fn) {\n          fn(data, eventName);\n        });\n      }\n    }\n  };\n}\n\nfunction jsTransform(element, attr, prefix, postfix, to, duration, callback) {\n  var tick = Math.min(duration, 10),\n      unit = to.indexOf('%') >= 0 ? '%' : 'px',\n      to = to.replace(unit, ''),\n      from = Number(element.style[attr].replace(prefix, '').replace(postfix, '').replace(unit, '')),\n      positionTick = (to - from) / duration * tick;\n  setTimeout(moveElement, tick);\n\n  function moveElement() {\n    duration -= tick;\n    from += positionTick;\n    element.style[attr] = prefix + from + unit + postfix;\n\n    if (duration > 0) {\n      setTimeout(moveElement, tick);\n    } else {\n      callback();\n    }\n  }\n}\n\n// Object.keys\nif (!Object.keys) {\n  Object.keys = function (object) {\n    var keys = [];\n\n    for (var name in object) {\n      if (Object.prototype.hasOwnProperty.call(object, name)) {\n        keys.push(name);\n      }\n    }\n\n    return keys;\n  };\n} // ChildNode.remove\n\n\nif (!(\"remove\" in Element.prototype)) {\n  Element.prototype.remove = function () {\n    if (this.parentNode) {\n      this.parentNode.removeChild(this);\n    }\n  };\n}\nvar tns = function (options) {\n  options = extend({\n    container: '.slider',\n    mode: 'carousel',\n    axis: 'horizontal',\n    items: 1,\n    gutter: 0,\n    edgePadding: 0,\n    fixedWidth: false,\n    autoWidth: false,\n    viewportMax: false,\n    slideBy: 1,\n    center: false,\n    controls: true,\n    controlsPosition: 'top',\n    controlsText: ['prev', 'next'],\n    controlsContainer: false,\n    prevButton: false,\n    nextButton: false,\n    nav: true,\n    navPosition: 'top',\n    navContainer: false,\n    navAsThumbnails: false,\n    arrowKeys: false,\n    speed: 300,\n    autoplay: false,\n    autoplayPosition: 'top',\n    autoplayTimeout: 5000,\n    autoplayDirection: 'forward',\n    autoplayText: ['start', 'stop'],\n    autoplayHoverPause: false,\n    autoplayButton: false,\n    autoplayButtonOutput: true,\n    autoplayResetOnVisibility: true,\n    animateIn: 'tns-fadeIn',\n    animateOut: 'tns-fadeOut',\n    animateNormal: 'tns-normal',\n    animateDelay: false,\n    loop: true,\n    rewind: false,\n    autoHeight: false,\n    responsive: false,\n    lazyload: false,\n    lazyloadSelector: '.tns-lazy-img',\n    touch: true,\n    mouseDrag: false,\n    swipeAngle: 15,\n    nested: false,\n    preventActionWhenRunning: false,\n    preventScrollOnTouch: false,\n    freezable: true,\n    onInit: false,\n    useLocalStorage: true,\n    nonce: false\n  }, options || {});\n  var doc = document,\n      win = window,\n      KEYS = {\n    ENTER: 13,\n    SPACE: 32,\n    LEFT: 37,\n    RIGHT: 39\n  },\n      tnsStorage = {},\n      localStorageAccess = options.useLocalStorage;\n\n  if (localStorageAccess) {\n    // check browser version and local storage access\n    var browserInfo = navigator.userAgent;\n    var uid = new Date();\n\n    try {\n      tnsStorage = win.localStorage;\n\n      if (tnsStorage) {\n        tnsStorage.setItem(uid, uid);\n        localStorageAccess = tnsStorage.getItem(uid) == uid;\n        tnsStorage.removeItem(uid);\n      } else {\n        localStorageAccess = false;\n      }\n\n      if (!localStorageAccess) {\n        tnsStorage = {};\n      }\n    } catch (e) {\n      localStorageAccess = false;\n    }\n\n    if (localStorageAccess) {\n      // remove storage when browser version changes\n      if (tnsStorage['tnsApp'] && tnsStorage['tnsApp'] !== browserInfo) {\n        ['tC', 'tPL', 'tMQ', 'tTf', 't3D', 'tTDu', 'tTDe', 'tADu', 'tADe', 'tTE', 'tAE'].forEach(function (item) {\n          tnsStorage.removeItem(item);\n        });\n      } // update browserInfo\n\n\n      localStorage['tnsApp'] = browserInfo;\n    }\n  }\n\n  var CALC = tnsStorage['tC'] ? checkStorageValue(tnsStorage['tC']) : setLocalStorage(tnsStorage, 'tC', calc(), localStorageAccess),\n      PERCENTAGELAYOUT = tnsStorage['tPL'] ? checkStorageValue(tnsStorage['tPL']) : setLocalStorage(tnsStorage, 'tPL', percentageLayout(), localStorageAccess),\n      CSSMQ = tnsStorage['tMQ'] ? checkStorageValue(tnsStorage['tMQ']) : setLocalStorage(tnsStorage, 'tMQ', mediaquerySupport(), localStorageAccess),\n      TRANSFORM = tnsStorage['tTf'] ? checkStorageValue(tnsStorage['tTf']) : setLocalStorage(tnsStorage, 'tTf', whichProperty('transform'), localStorageAccess),\n      HAS3DTRANSFORMS = tnsStorage['t3D'] ? checkStorageValue(tnsStorage['t3D']) : setLocalStorage(tnsStorage, 't3D', has3DTransforms(TRANSFORM), localStorageAccess),\n      TRANSITIONDURATION = tnsStorage['tTDu'] ? checkStorageValue(tnsStorage['tTDu']) : setLocalStorage(tnsStorage, 'tTDu', whichProperty('transitionDuration'), localStorageAccess),\n      TRANSITIONDELAY = tnsStorage['tTDe'] ? checkStorageValue(tnsStorage['tTDe']) : setLocalStorage(tnsStorage, 'tTDe', whichProperty('transitionDelay'), localStorageAccess),\n      ANIMATIONDURATION = tnsStorage['tADu'] ? checkStorageValue(tnsStorage['tADu']) : setLocalStorage(tnsStorage, 'tADu', whichProperty('animationDuration'), localStorageAccess),\n      ANIMATIONDELAY = tnsStorage['tADe'] ? checkStorageValue(tnsStorage['tADe']) : setLocalStorage(tnsStorage, 'tADe', whichProperty('animationDelay'), localStorageAccess),\n      TRANSITIONEND = tnsStorage['tTE'] ? checkStorageValue(tnsStorage['tTE']) : setLocalStorage(tnsStorage, 'tTE', getEndProperty(TRANSITIONDURATION, 'Transition'), localStorageAccess),\n      ANIMATIONEND = tnsStorage['tAE'] ? checkStorageValue(tnsStorage['tAE']) : setLocalStorage(tnsStorage, 'tAE', getEndProperty(ANIMATIONDURATION, 'Animation'), localStorageAccess); // get element nodes from selectors\n\n  var supportConsoleWarn = win.console && typeof win.console.warn === \"function\",\n      tnsList = ['container', 'controlsContainer', 'prevButton', 'nextButton', 'navContainer', 'autoplayButton'],\n      optionsElements = {};\n  tnsList.forEach(function (item) {\n    if (typeof options[item] === 'string') {\n      var str = options[item],\n          el = doc.querySelector(str);\n      optionsElements[item] = str;\n\n      if (el && el.nodeName) {\n        options[item] = el;\n      } else {\n        if (supportConsoleWarn) {\n          console.warn('Can\\'t find', options[item]);\n        }\n\n        return;\n      }\n    }\n  }); // make sure at least 1 slide\n\n  if (options.container.children.length < 1) {\n    if (supportConsoleWarn) {\n      console.warn('No slides found in', options.container);\n    }\n\n    return;\n  } // update options\n\n\n  var responsive = options.responsive,\n      nested = options.nested,\n      carousel = options.mode === 'carousel' ? true : false;\n\n  if (responsive) {\n    // apply responsive[0] to options and remove it\n    if (0 in responsive) {\n      options = extend(options, responsive[0]);\n      delete responsive[0];\n    }\n\n    var responsiveTem = {};\n\n    for (var key in responsive) {\n      var val = responsive[key]; // update responsive\n      // from: 300: 2\n      // to:\n      //   300: {\n      //     items: 2\n      //   }\n\n      val = typeof val === 'number' ? {\n        items: val\n      } : val;\n      responsiveTem[key] = val;\n    }\n\n    responsive = responsiveTem;\n    responsiveTem = null;\n  } // update options\n\n\n  function updateOptions(obj) {\n    for (var key in obj) {\n      if (!carousel) {\n        if (key === 'slideBy') {\n          obj[key] = 'page';\n        }\n\n        if (key === 'edgePadding') {\n          obj[key] = false;\n        }\n\n        if (key === 'autoHeight') {\n          obj[key] = false;\n        }\n      } // update responsive options\n\n\n      if (key === 'responsive') {\n        updateOptions(obj[key]);\n      }\n    }\n  }\n\n  if (!carousel) {\n    updateOptions(options);\n  } // === define and set variables ===\n\n\n  if (!carousel) {\n    options.axis = 'horizontal';\n    options.slideBy = 'page';\n    options.edgePadding = false;\n    var animateIn = options.animateIn,\n        animateOut = options.animateOut,\n        animateDelay = options.animateDelay,\n        animateNormal = options.animateNormal;\n  }\n\n  var horizontal = options.axis === 'horizontal' ? true : false,\n      outerWrapper = doc.createElement('div'),\n      innerWrapper = doc.createElement('div'),\n      middleWrapper,\n      container = options.container,\n      containerParent = container.parentNode,\n      containerHTML = container.outerHTML,\n      slideItems = container.children,\n      slideCount = slideItems.length,\n      breakpointZone,\n      windowWidth = getWindowWidth(),\n      isOn = false;\n\n  if (responsive) {\n    setBreakpointZone();\n  }\n\n  if (carousel) {\n    container.className += ' tns-vpfix';\n  } // fixedWidth: viewport > rightBoundary > indexMax\n\n\n  var autoWidth = options.autoWidth,\n      fixedWidth = getOption('fixedWidth'),\n      edgePadding = getOption('edgePadding'),\n      gutter = getOption('gutter'),\n      viewport = getViewportWidth(),\n      center = getOption('center'),\n      items = !autoWidth ? Math.floor(getOption('items')) : 1,\n      slideBy = getOption('slideBy'),\n      viewportMax = options.viewportMax || options.fixedWidthViewportWidth,\n      arrowKeys = getOption('arrowKeys'),\n      speed = getOption('speed'),\n      rewind = options.rewind,\n      loop = rewind ? false : options.loop,\n      autoHeight = getOption('autoHeight'),\n      controls = getOption('controls'),\n      controlsText = getOption('controlsText'),\n      nav = getOption('nav'),\n      touch = getOption('touch'),\n      mouseDrag = getOption('mouseDrag'),\n      autoplay = getOption('autoplay'),\n      autoplayTimeout = getOption('autoplayTimeout'),\n      autoplayText = getOption('autoplayText'),\n      autoplayHoverPause = getOption('autoplayHoverPause'),\n      autoplayResetOnVisibility = getOption('autoplayResetOnVisibility'),\n      sheet = createStyleSheet(null, getOption('nonce')),\n      lazyload = options.lazyload,\n      lazyloadSelector = options.lazyloadSelector,\n      slidePositions,\n      // collection of slide positions\n  slideItemsOut = [],\n      cloneCount = loop ? getCloneCountForLoop() : 0,\n      slideCountNew = !carousel ? slideCount + cloneCount : slideCount + cloneCount * 2,\n      hasRightDeadZone = (fixedWidth || autoWidth) && !loop ? true : false,\n      rightBoundary = fixedWidth ? getRightBoundary() : null,\n      updateIndexBeforeTransform = !carousel || !loop ? true : false,\n      // transform\n  transformAttr = horizontal ? 'left' : 'top',\n      transformPrefix = '',\n      transformPostfix = '',\n      // index\n  getIndexMax = function () {\n    if (fixedWidth) {\n      return function () {\n        return center && !loop ? slideCount - 1 : Math.ceil(-rightBoundary / (fixedWidth + gutter));\n      };\n    } else if (autoWidth) {\n      return function () {\n        for (var i = 0; i < slideCountNew; i++) {\n          if (slidePositions[i] >= -rightBoundary) {\n            return i;\n          }\n        }\n      };\n    } else {\n      return function () {\n        if (center && carousel && !loop) {\n          return slideCount - 1;\n        } else {\n          return loop || carousel ? Math.max(0, slideCountNew - Math.ceil(items)) : slideCountNew - 1;\n        }\n      };\n    }\n  }(),\n      index = getStartIndex(getOption('startIndex')),\n      indexCached = index;\n      getCurrentSlide();\n      var indexMin = 0,\n      indexMax = !autoWidth ? getIndexMax() : null,\n      preventActionWhenRunning = options.preventActionWhenRunning,\n      swipeAngle = options.swipeAngle,\n      moveDirectionExpected = swipeAngle ? '?' : true,\n      running = false,\n      onInit = options.onInit,\n      events = new Events(),\n      // id, class\n  newContainerClasses = ' tns-slider tns-' + options.mode,\n      slideId = container.id || getSlideId(),\n      disable = getOption('disable'),\n      disabled = false,\n      freezable = options.freezable,\n      freeze = freezable && !autoWidth ? getFreeze() : false,\n      frozen = false,\n      controlsEvents = {\n    'click': onControlsClick,\n    'keydown': onControlsKeydown\n  },\n      navEvents = {\n    'click': onNavClick,\n    'keydown': onNavKeydown\n  },\n      hoverEvents = {\n    'mouseover': mouseoverPause,\n    'mouseout': mouseoutRestart\n  },\n      visibilityEvent = {\n    'visibilitychange': onVisibilityChange\n  },\n      docmentKeydownEvent = {\n    'keydown': onDocumentKeydown\n  },\n      touchEvents = {\n    'touchstart': onPanStart,\n    'touchmove': onPanMove,\n    'touchend': onPanEnd,\n    'touchcancel': onPanEnd\n  },\n      dragEvents = {\n    'mousedown': onPanStart,\n    'mousemove': onPanMove,\n    'mouseup': onPanEnd,\n    'mouseleave': onPanEnd\n  },\n      hasControls = hasOption('controls'),\n      hasNav = hasOption('nav'),\n      navAsThumbnails = autoWidth ? true : options.navAsThumbnails,\n      hasAutoplay = hasOption('autoplay'),\n      hasTouch = hasOption('touch'),\n      hasMouseDrag = hasOption('mouseDrag'),\n      slideActiveClass = 'tns-slide-active',\n      slideClonedClass = 'tns-slide-cloned',\n      imgCompleteClass = 'tns-complete',\n      imgEvents = {\n    'load': onImgLoaded,\n    'error': onImgFailed\n  },\n      imgsComplete,\n      liveregionCurrent,\n      preventScroll = options.preventScrollOnTouch === 'force' ? true : false; // controls\n\n\n  if (hasControls) {\n    var controlsContainer = options.controlsContainer,\n        controlsContainerHTML = options.controlsContainer ? options.controlsContainer.outerHTML : '',\n        prevButton = options.prevButton,\n        nextButton = options.nextButton,\n        prevButtonHTML = options.prevButton ? options.prevButton.outerHTML : '',\n        nextButtonHTML = options.nextButton ? options.nextButton.outerHTML : '',\n        prevIsButton,\n        nextIsButton;\n  } // nav\n\n\n  if (hasNav) {\n    var navContainer = options.navContainer,\n        navContainerHTML = options.navContainer ? options.navContainer.outerHTML : '',\n        navItems,\n        pages = autoWidth ? slideCount : getPages(),\n        pagesCached = 0,\n        navClicked = -1,\n        navCurrentIndex = getCurrentNavIndex(),\n        navCurrentIndexCached = navCurrentIndex,\n        navActiveClass = 'tns-nav-active',\n        navStr = 'Carousel Page ',\n        navStrCurrent = ' (Current Slide)';\n  } // autoplay\n\n\n  if (hasAutoplay) {\n    var autoplayDirection = options.autoplayDirection === 'forward' ? 1 : -1,\n        autoplayButton = options.autoplayButton,\n        autoplayButtonHTML = options.autoplayButton ? options.autoplayButton.outerHTML : '',\n        autoplayHtmlStrings = ['<span class=\\'tns-visually-hidden\\'>', ' animation</span>'],\n        autoplayTimer,\n        animating,\n        autoplayHoverPaused,\n        autoplayUserPaused,\n        autoplayVisibilityPaused;\n  }\n\n  if (hasTouch || hasMouseDrag) {\n    var initPosition = {},\n        lastPosition = {},\n        translateInit,\n        panStart = false,\n        rafIndex,\n        getDist = horizontal ? function (a, b) {\n      return a.x - b.x;\n    } : function (a, b) {\n      return a.y - b.y;\n    };\n  } // disable slider when slidecount <= items\n\n\n  if (!autoWidth) {\n    resetVariblesWhenDisable(disable || freeze);\n  }\n\n  if (TRANSFORM) {\n    transformAttr = TRANSFORM;\n    transformPrefix = 'translate';\n\n    if (HAS3DTRANSFORMS) {\n      transformPrefix += horizontal ? '3d(' : '3d(0px, ';\n      transformPostfix = horizontal ? ', 0px, 0px)' : ', 0px)';\n    } else {\n      transformPrefix += horizontal ? 'X(' : 'Y(';\n      transformPostfix = ')';\n    }\n  }\n\n  if (carousel) {\n    container.className = container.className.replace('tns-vpfix', '');\n  }\n\n  initStructure();\n  initSheet();\n  initSliderTransform(); // === COMMON FUNCTIONS === //\n\n  function resetVariblesWhenDisable(condition) {\n    if (condition) {\n      controls = nav = touch = mouseDrag = arrowKeys = autoplay = autoplayHoverPause = autoplayResetOnVisibility = false;\n    }\n  }\n\n  function getCurrentSlide() {\n    var tem = carousel ? index - cloneCount : index;\n\n    while (tem < 0) {\n      tem += slideCount;\n    }\n\n    return tem % slideCount + 1;\n  }\n\n  function getStartIndex(ind) {\n    ind = ind ? Math.max(0, Math.min(loop ? slideCount - 1 : slideCount - items, ind)) : 0;\n    return carousel ? ind + cloneCount : ind;\n  }\n\n  function getAbsIndex(i) {\n    if (i == null) {\n      i = index;\n    }\n\n    if (carousel) {\n      i -= cloneCount;\n    }\n\n    while (i < 0) {\n      i += slideCount;\n    }\n\n    return Math.floor(i % slideCount);\n  }\n\n  function getCurrentNavIndex() {\n    var absIndex = getAbsIndex(),\n        result;\n    result = navAsThumbnails ? absIndex : fixedWidth || autoWidth ? Math.ceil((absIndex + 1) * pages / slideCount - 1) : Math.floor(absIndex / items); // set active nav to the last one when reaches the right edge\n\n    if (!loop && carousel && index === indexMax) {\n      result = pages - 1;\n    }\n\n    return result;\n  }\n\n  function getItemsMax() {\n    // fixedWidth or autoWidth while viewportMax is not available\n    if (autoWidth || fixedWidth && !viewportMax) {\n      return slideCount - 1; // most cases\n    } else {\n      var str = fixedWidth ? 'fixedWidth' : 'items',\n          arr = [];\n\n      if (fixedWidth || options[str] < slideCount) {\n        arr.push(options[str]);\n      }\n\n      if (responsive) {\n        for (var bp in responsive) {\n          var tem = responsive[bp][str];\n\n          if (tem && (fixedWidth || tem < slideCount)) {\n            arr.push(tem);\n          }\n        }\n      }\n\n      if (!arr.length) {\n        arr.push(0);\n      }\n\n      return Math.ceil(fixedWidth ? viewportMax / Math.min.apply(null, arr) : Math.max.apply(null, arr));\n    }\n  }\n\n  function getCloneCountForLoop() {\n    var itemsMax = getItemsMax(),\n        result = carousel ? Math.ceil((itemsMax * 5 - slideCount) / 2) : itemsMax * 4 - slideCount;\n    result = Math.max(itemsMax, result);\n    return hasOption('edgePadding') ? result + 1 : result;\n  }\n\n  function getWindowWidth() {\n    return win.innerWidth || doc.documentElement.clientWidth || doc.body.clientWidth;\n  }\n\n  function getInsertPosition(pos) {\n    return pos === 'top' ? 'afterbegin' : 'beforeend';\n  }\n\n  function getClientWidth(el) {\n    if (el == null) {\n      return;\n    }\n\n    var div = doc.createElement('div'),\n        rect,\n        width;\n    el.appendChild(div);\n    rect = div.getBoundingClientRect();\n    width = rect.right - rect.left;\n    div.remove();\n    return width || getClientWidth(el.parentNode);\n  }\n\n  function getViewportWidth() {\n    var gap = edgePadding ? edgePadding * 2 - gutter : 0;\n    return getClientWidth(containerParent) - gap;\n  }\n\n  function hasOption(item) {\n    if (options[item]) {\n      return true;\n    } else {\n      if (responsive) {\n        for (var bp in responsive) {\n          if (responsive[bp][item]) {\n            return true;\n          }\n        }\n      }\n\n      return false;\n    }\n  } // get option:\n  // fixed width: viewport, fixedWidth, gutter => items\n  // others: window width => all variables\n  // all: items => slideBy\n\n\n  function getOption(item, ww) {\n    if (ww == null) {\n      ww = windowWidth;\n    }\n\n    if (item === 'items' && fixedWidth) {\n      return Math.floor((viewport + gutter) / (fixedWidth + gutter)) || 1;\n    } else {\n      var result = options[item];\n\n      if (responsive) {\n        for (var bp in responsive) {\n          // bp: convert string to number\n          if (ww >= parseInt(bp)) {\n            if (item in responsive[bp]) {\n              result = responsive[bp][item];\n            }\n          }\n        }\n      }\n\n      if (item === 'slideBy' && result === 'page') {\n        result = getOption('items');\n      }\n\n      if (!carousel && (item === 'slideBy' || item === 'items')) {\n        result = Math.floor(result);\n      }\n\n      return result;\n    }\n  }\n\n  function getSlideMarginLeft(i) {\n    return CALC ? CALC + '(' + i * 100 + '% / ' + slideCountNew + ')' : i * 100 / slideCountNew + '%';\n  }\n\n  function getInnerWrapperStyles(edgePaddingTem, gutterTem, fixedWidthTem, speedTem, autoHeightBP) {\n    var str = '';\n\n    if (edgePaddingTem !== undefined) {\n      var gap = edgePaddingTem;\n\n      if (gutterTem) {\n        gap -= gutterTem;\n      }\n\n      str = horizontal ? 'margin: 0 ' + gap + 'px 0 ' + edgePaddingTem + 'px;' : 'margin: ' + edgePaddingTem + 'px 0 ' + gap + 'px 0;';\n    } else if (gutterTem && !fixedWidthTem) {\n      var gutterTemUnit = '-' + gutterTem + 'px',\n          dir = horizontal ? gutterTemUnit + ' 0 0' : '0 ' + gutterTemUnit + ' 0';\n      str = 'margin: 0 ' + dir + ';';\n    }\n\n    if (!carousel && autoHeightBP && TRANSITIONDURATION && speedTem) {\n      str += getTransitionDurationStyle(speedTem);\n    }\n\n    return str;\n  }\n\n  function getContainerWidth(fixedWidthTem, gutterTem, itemsTem) {\n    if (fixedWidthTem) {\n      return (fixedWidthTem + gutterTem) * slideCountNew + 'px';\n    } else {\n      return CALC ? CALC + '(' + slideCountNew * 100 + '% / ' + itemsTem + ')' : slideCountNew * 100 / itemsTem + '%';\n    }\n  }\n\n  function getSlideWidthStyle(fixedWidthTem, gutterTem, itemsTem) {\n    var width;\n\n    if (fixedWidthTem) {\n      width = fixedWidthTem + gutterTem + 'px';\n    } else {\n      if (!carousel) {\n        itemsTem = Math.floor(itemsTem);\n      }\n\n      var dividend = carousel ? slideCountNew : itemsTem;\n      width = CALC ? CALC + '(100% / ' + dividend + ')' : 100 / dividend + '%';\n    }\n\n    width = 'width:' + width; // inner slider: overwrite outer slider styles\n\n    return nested !== 'inner' ? width + ';' : width + ' !important;';\n  }\n\n  function getSlideGutterStyle(gutterTem) {\n    var str = ''; // gutter maybe interger || 0\n    // so can't use 'if (gutter)'\n\n    if (gutterTem !== false) {\n      var prop = horizontal ? 'padding-' : 'margin-',\n          dir = horizontal ? 'right' : 'bottom';\n      str = prop + dir + ': ' + gutterTem + 'px;';\n    }\n\n    return str;\n  }\n\n  function getCSSPrefix(name, num) {\n    var prefix = name.substring(0, name.length - num).toLowerCase();\n\n    if (prefix) {\n      prefix = '-' + prefix + '-';\n    }\n\n    return prefix;\n  }\n\n  function getTransitionDurationStyle(speed) {\n    return getCSSPrefix(TRANSITIONDURATION, 18) + 'transition-duration:' + speed / 1000 + 's;';\n  }\n\n  function getAnimationDurationStyle(speed) {\n    return getCSSPrefix(ANIMATIONDURATION, 17) + 'animation-duration:' + speed / 1000 + 's;';\n  }\n\n  function initStructure() {\n    var classOuter = 'tns-outer',\n        classInner = 'tns-inner';\n        hasOption('gutter');\n    outerWrapper.className = classOuter;\n    innerWrapper.className = classInner;\n    outerWrapper.id = slideId + '-ow';\n    innerWrapper.id = slideId + '-iw'; // set container properties\n\n    if (container.id === '') {\n      container.id = slideId;\n    }\n\n    newContainerClasses += PERCENTAGELAYOUT || autoWidth ? ' tns-subpixel' : ' tns-no-subpixel';\n    newContainerClasses += CALC ? ' tns-calc' : ' tns-no-calc';\n\n    if (autoWidth) {\n      newContainerClasses += ' tns-autowidth';\n    }\n\n    newContainerClasses += ' tns-' + options.axis;\n    container.className += newContainerClasses; // add constrain layer for carousel\n\n    if (carousel) {\n      middleWrapper = doc.createElement('div');\n      middleWrapper.id = slideId + '-mw';\n      middleWrapper.className = 'tns-ovh';\n      outerWrapper.appendChild(middleWrapper);\n      middleWrapper.appendChild(innerWrapper);\n    } else {\n      outerWrapper.appendChild(innerWrapper);\n    }\n\n    if (autoHeight) {\n      var wp = middleWrapper ? middleWrapper : innerWrapper;\n      wp.className += ' tns-ah';\n    }\n\n    containerParent.insertBefore(outerWrapper, container);\n    innerWrapper.appendChild(container); // add id, class, aria attributes\n    // before clone slides\n\n    forEach(slideItems, function (item, i) {\n      addClass(item, 'tns-item');\n\n      if (!item.id) {\n        item.id = slideId + '-item' + i;\n      }\n\n      if (!carousel && animateNormal) {\n        addClass(item, animateNormal);\n      }\n\n      setAttrs(item, {\n        'aria-hidden': 'true',\n        'tabindex': '-1'\n      });\n    }); // ## clone slides\n    // carousel: n + slides + n\n    // gallery:      slides + n\n\n    if (cloneCount) {\n      var fragmentBefore = doc.createDocumentFragment(),\n          fragmentAfter = doc.createDocumentFragment();\n\n      for (var j = cloneCount; j--;) {\n        var num = j % slideCount,\n            cloneFirst = slideItems[num].cloneNode(true);\n        addClass(cloneFirst, slideClonedClass);\n        removeAttrs(cloneFirst, 'id');\n        fragmentAfter.insertBefore(cloneFirst, fragmentAfter.firstChild);\n\n        if (carousel) {\n          var cloneLast = slideItems[slideCount - 1 - num].cloneNode(true);\n          addClass(cloneLast, slideClonedClass);\n          removeAttrs(cloneLast, 'id');\n          fragmentBefore.appendChild(cloneLast);\n        }\n      }\n\n      container.insertBefore(fragmentBefore, container.firstChild);\n      container.appendChild(fragmentAfter);\n      slideItems = container.children;\n    }\n  }\n\n  function initSliderTransform() {\n    // ## images loaded/failed\n    if (hasOption('autoHeight') || autoWidth || !horizontal) {\n      var imgs = container.querySelectorAll('img'); // add img load event listener\n\n      forEach(imgs, function (img) {\n        var src = img.src;\n\n        if (!lazyload) {\n          // not data img\n          if (src && src.indexOf('data:image') < 0) {\n            img.src = '';\n            addEvents(img, imgEvents);\n            addClass(img, 'loading');\n            img.src = src; // data img\n          } else {\n            imgLoaded(img);\n          }\n        }\n      }); // set imgsComplete\n\n      raf(function () {\n        imgsLoadedCheck(arrayFromNodeList(imgs), function () {\n          imgsComplete = true;\n        });\n      }); // reset imgs for auto height: check visible imgs only\n\n      if (hasOption('autoHeight')) {\n        imgs = getImageArray(index, Math.min(index + items - 1, slideCountNew - 1));\n      }\n\n      lazyload ? initSliderTransformStyleCheck() : raf(function () {\n        imgsLoadedCheck(arrayFromNodeList(imgs), initSliderTransformStyleCheck);\n      });\n    } else {\n      // set container transform property\n      if (carousel) {\n        doContainerTransformSilent();\n      } // update slider tools and events\n\n\n      initTools();\n      initEvents();\n    }\n  }\n\n  function initSliderTransformStyleCheck() {\n    if (autoWidth && slideCount > 1) {\n      // check styles application\n      var num = loop ? index : slideCount - 1;\n\n      (function stylesApplicationCheck() {\n        var left = slideItems[num].getBoundingClientRect().left;\n        var right = slideItems[num - 1].getBoundingClientRect().right;\n        Math.abs(left - right) <= 1 ? initSliderTransformCore() : setTimeout(function () {\n          stylesApplicationCheck();\n        }, 16);\n      })();\n    } else {\n      initSliderTransformCore();\n    }\n  }\n\n  function initSliderTransformCore() {\n    // run Fn()s which are rely on image loading\n    if (!horizontal || autoWidth) {\n      setSlidePositions();\n\n      if (autoWidth) {\n        rightBoundary = getRightBoundary();\n\n        if (freezable) {\n          freeze = getFreeze();\n        }\n\n        indexMax = getIndexMax(); // <= slidePositions, rightBoundary <=\n\n        resetVariblesWhenDisable(disable || freeze);\n      } else {\n        updateContentWrapperHeight();\n      }\n    } // set container transform property\n\n\n    if (carousel) {\n      doContainerTransformSilent();\n    } // update slider tools and events\n\n\n    initTools();\n    initEvents();\n  }\n\n  function initSheet() {\n    // gallery:\n    // set animation classes and left value for gallery slider\n    if (!carousel) {\n      for (var i = index, l = index + Math.min(slideCount, items); i < l; i++) {\n        var item = slideItems[i];\n        item.style.left = (i - index) * 100 / items + '%';\n        addClass(item, animateIn);\n        removeClass(item, animateNormal);\n      }\n    } // #### LAYOUT\n    // ## INLINE-BLOCK VS FLOAT\n    // ## PercentageLayout:\n    // slides: inline-block\n    // remove blank space between slides by set font-size: 0\n    // ## Non PercentageLayout:\n    // slides: float\n    //         margin-right: -100%\n    //         margin-left: ~\n    // Resource: https://docs.google.com/spreadsheets/d/147up245wwTXeQYve3BRSAD4oVcvQmuGsFteJOeA5xNQ/edit?usp=sharing\n\n\n    if (horizontal) {\n      if (PERCENTAGELAYOUT || autoWidth) {\n        addCSSRule(sheet, '#' + slideId + ' > .tns-item', 'font-size:' + win.getComputedStyle(slideItems[0]).fontSize + ';', getCssRulesLength(sheet));\n        addCSSRule(sheet, '#' + slideId, 'font-size:0;', getCssRulesLength(sheet));\n      } else if (carousel) {\n        forEach(slideItems, function (slide, i) {\n          slide.style.marginLeft = getSlideMarginLeft(i);\n        });\n      }\n    } // ## BASIC STYLES\n\n\n    if (CSSMQ) {\n      // middle wrapper style\n      if (TRANSITIONDURATION) {\n        var str = middleWrapper && options.autoHeight ? getTransitionDurationStyle(options.speed) : '';\n        addCSSRule(sheet, '#' + slideId + '-mw', str, getCssRulesLength(sheet));\n      } // inner wrapper styles\n\n\n      str = getInnerWrapperStyles(options.edgePadding, options.gutter, options.fixedWidth, options.speed, options.autoHeight);\n      addCSSRule(sheet, '#' + slideId + '-iw', str, getCssRulesLength(sheet)); // container styles\n\n      if (carousel) {\n        str = horizontal && !autoWidth ? 'width:' + getContainerWidth(options.fixedWidth, options.gutter, options.items) + ';' : '';\n\n        if (TRANSITIONDURATION) {\n          str += getTransitionDurationStyle(speed);\n        }\n\n        addCSSRule(sheet, '#' + slideId, str, getCssRulesLength(sheet));\n      } // slide styles\n\n\n      str = horizontal && !autoWidth ? getSlideWidthStyle(options.fixedWidth, options.gutter, options.items) : '';\n\n      if (options.gutter) {\n        str += getSlideGutterStyle(options.gutter);\n      } // set gallery items transition-duration\n\n\n      if (!carousel) {\n        if (TRANSITIONDURATION) {\n          str += getTransitionDurationStyle(speed);\n        }\n\n        if (ANIMATIONDURATION) {\n          str += getAnimationDurationStyle(speed);\n        }\n      }\n\n      if (str) {\n        addCSSRule(sheet, '#' + slideId + ' > .tns-item', str, getCssRulesLength(sheet));\n      } // non CSS mediaqueries: IE8\n      // ## update inner wrapper, container, slides if needed\n      // set inline styles for inner wrapper & container\n      // insert stylesheet (one line) for slides only (since slides are many)\n\n    } else {\n      // middle wrapper styles\n      update_carousel_transition_duration(); // inner wrapper styles\n\n      innerWrapper.style.cssText = getInnerWrapperStyles(edgePadding, gutter, fixedWidth, autoHeight); // container styles\n\n      if (carousel && horizontal && !autoWidth) {\n        container.style.width = getContainerWidth(fixedWidth, gutter, items);\n      } // slide styles\n\n\n      var str = horizontal && !autoWidth ? getSlideWidthStyle(fixedWidth, gutter, items) : '';\n\n      if (gutter) {\n        str += getSlideGutterStyle(gutter);\n      } // append to the last line\n\n\n      if (str) {\n        addCSSRule(sheet, '#' + slideId + ' > .tns-item', str, getCssRulesLength(sheet));\n      }\n    } // ## MEDIAQUERIES\n\n\n    if (responsive && CSSMQ) {\n      for (var bp in responsive) {\n        // bp: convert string to number\n        bp = parseInt(bp);\n        var opts = responsive[bp],\n            str = '',\n            middleWrapperStr = '',\n            innerWrapperStr = '',\n            containerStr = '',\n            slideStr = '',\n            itemsBP = !autoWidth ? getOption('items', bp) : null,\n            fixedWidthBP = getOption('fixedWidth', bp),\n            speedBP = getOption('speed', bp),\n            edgePaddingBP = getOption('edgePadding', bp),\n            autoHeightBP = getOption('autoHeight', bp),\n            gutterBP = getOption('gutter', bp); // middle wrapper string\n\n        if (TRANSITIONDURATION && middleWrapper && getOption('autoHeight', bp) && 'speed' in opts) {\n          middleWrapperStr = '#' + slideId + '-mw{' + getTransitionDurationStyle(speedBP) + '}';\n        } // inner wrapper string\n\n\n        if ('edgePadding' in opts || 'gutter' in opts) {\n          innerWrapperStr = '#' + slideId + '-iw{' + getInnerWrapperStyles(edgePaddingBP, gutterBP, fixedWidthBP, speedBP, autoHeightBP) + '}';\n        } // container string\n\n\n        if (carousel && horizontal && !autoWidth && ('fixedWidth' in opts || 'items' in opts || fixedWidth && 'gutter' in opts)) {\n          containerStr = 'width:' + getContainerWidth(fixedWidthBP, gutterBP, itemsBP) + ';';\n        }\n\n        if (TRANSITIONDURATION && 'speed' in opts) {\n          containerStr += getTransitionDurationStyle(speedBP);\n        }\n\n        if (containerStr) {\n          containerStr = '#' + slideId + '{' + containerStr + '}';\n        } // slide string\n\n\n        if ('fixedWidth' in opts || fixedWidth && 'gutter' in opts || !carousel && 'items' in opts) {\n          slideStr += getSlideWidthStyle(fixedWidthBP, gutterBP, itemsBP);\n        }\n\n        if ('gutter' in opts) {\n          slideStr += getSlideGutterStyle(gutterBP);\n        } // set gallery items transition-duration\n\n\n        if (!carousel && 'speed' in opts) {\n          if (TRANSITIONDURATION) {\n            slideStr += getTransitionDurationStyle(speedBP);\n          }\n\n          if (ANIMATIONDURATION) {\n            slideStr += getAnimationDurationStyle(speedBP);\n          }\n        }\n\n        if (slideStr) {\n          slideStr = '#' + slideId + ' > .tns-item{' + slideStr + '}';\n        } // add up\n\n\n        str = middleWrapperStr + innerWrapperStr + containerStr + slideStr;\n\n        if (str) {\n          sheet.insertRule('@media (min-width: ' + bp / 16 + 'em) {' + str + '}', sheet.cssRules.length);\n        }\n      }\n    }\n  }\n\n  function initTools() {\n    // == slides ==\n    updateSlideStatus(); // == live region ==\n\n    outerWrapper.insertAdjacentHTML('afterbegin', '<div class=\"tns-liveregion tns-visually-hidden\" aria-live=\"polite\" aria-atomic=\"true\">slide <span class=\"current\">' + getLiveRegionStr() + '</span>  of ' + slideCount + '</div>');\n    liveregionCurrent = outerWrapper.querySelector('.tns-liveregion .current'); // == autoplayInit ==\n\n    if (hasAutoplay) {\n      var txt = autoplay ? 'stop' : 'start';\n\n      if (autoplayButton) {\n        setAttrs(autoplayButton, {\n          'data-action': txt\n        });\n      } else if (options.autoplayButtonOutput) {\n        outerWrapper.insertAdjacentHTML(getInsertPosition(options.autoplayPosition), '<button type=\"button\" data-action=\"' + txt + '\">' + autoplayHtmlStrings[0] + txt + autoplayHtmlStrings[1] + autoplayText[0] + '</button>');\n        autoplayButton = outerWrapper.querySelector('[data-action]');\n      } // add event\n\n\n      if (autoplayButton) {\n        addEvents(autoplayButton, {\n          'click': toggleAutoplay\n        });\n      }\n\n      if (autoplay) {\n        startAutoplay();\n\n        if (autoplayHoverPause) {\n          addEvents(container, hoverEvents);\n        }\n\n        if (autoplayResetOnVisibility) {\n          addEvents(container, visibilityEvent);\n        }\n      }\n    } // == navInit ==\n\n\n    if (hasNav) {\n      // will not hide the navs in case they're thumbnails\n\n      if (navContainer) {\n        setAttrs(navContainer, {\n          'aria-label': 'Carousel Pagination'\n        });\n        navItems = navContainer.children;\n        forEach(navItems, function (item, i) {\n          setAttrs(item, {\n            'data-nav': i,\n            'tabindex': '-1',\n            'aria-label': navStr + (i + 1),\n            'aria-controls': slideId\n          });\n        }); // generated nav\n      } else {\n        var navHtml = '',\n            hiddenStr = navAsThumbnails ? '' : 'style=\"display:none\"';\n\n        for (var i = 0; i < slideCount; i++) {\n          // hide nav items by default\n          navHtml += '<button type=\"button\" data-nav=\"' + i + '\" tabindex=\"-1\" aria-controls=\"' + slideId + '\" ' + hiddenStr + ' aria-label=\"' + navStr + (i + 1) + '\"></button>';\n        }\n\n        navHtml = '<div class=\"tns-nav\" aria-label=\"Carousel Pagination\">' + navHtml + '</div>';\n        outerWrapper.insertAdjacentHTML(getInsertPosition(options.navPosition), navHtml);\n        navContainer = outerWrapper.querySelector('.tns-nav');\n        navItems = navContainer.children;\n      }\n\n      updateNavVisibility(); // add transition\n\n      if (TRANSITIONDURATION) {\n        var prefix = TRANSITIONDURATION.substring(0, TRANSITIONDURATION.length - 18).toLowerCase(),\n            str = 'transition: all ' + speed / 1000 + 's';\n\n        if (prefix) {\n          str = '-' + prefix + '-' + str;\n        }\n\n        addCSSRule(sheet, '[aria-controls^=' + slideId + '-item]', str, getCssRulesLength(sheet));\n      }\n\n      setAttrs(navItems[navCurrentIndex], {\n        'aria-label': navStr + (navCurrentIndex + 1) + navStrCurrent\n      });\n      removeAttrs(navItems[navCurrentIndex], 'tabindex');\n      addClass(navItems[navCurrentIndex], navActiveClass); // add events\n\n      addEvents(navContainer, navEvents);\n    } // == controlsInit ==\n\n\n    if (hasControls) {\n      if (!controlsContainer && (!prevButton || !nextButton)) {\n        outerWrapper.insertAdjacentHTML(getInsertPosition(options.controlsPosition), '<div class=\"tns-controls\" aria-label=\"Carousel Navigation\" tabindex=\"0\"><button type=\"button\" data-controls=\"prev\" tabindex=\"-1\" aria-controls=\"' + slideId + '\">' + controlsText[0] + '</button><button type=\"button\" data-controls=\"next\" tabindex=\"-1\" aria-controls=\"' + slideId + '\">' + controlsText[1] + '</button></div>');\n        controlsContainer = outerWrapper.querySelector('.tns-controls');\n      }\n\n      if (!prevButton || !nextButton) {\n        prevButton = controlsContainer.children[0];\n        nextButton = controlsContainer.children[1];\n      }\n\n      if (options.controlsContainer) {\n        setAttrs(controlsContainer, {\n          'aria-label': 'Carousel Navigation',\n          'tabindex': '0'\n        });\n      }\n\n      if (options.controlsContainer || options.prevButton && options.nextButton) {\n        setAttrs([prevButton, nextButton], {\n          'aria-controls': slideId,\n          'tabindex': '-1'\n        });\n      }\n\n      if (options.controlsContainer || options.prevButton && options.nextButton) {\n        setAttrs(prevButton, {\n          'data-controls': 'prev'\n        });\n        setAttrs(nextButton, {\n          'data-controls': 'next'\n        });\n      }\n\n      prevIsButton = isButton(prevButton);\n      nextIsButton = isButton(nextButton);\n      updateControlsStatus(); // add events\n\n      if (controlsContainer) {\n        addEvents(controlsContainer, controlsEvents);\n      } else {\n        addEvents(prevButton, controlsEvents);\n        addEvents(nextButton, controlsEvents);\n      }\n    } // hide tools if needed\n\n\n    disableUI();\n  }\n\n  function initEvents() {\n    // add events\n    if (carousel && TRANSITIONEND) {\n      var eve = {};\n      eve[TRANSITIONEND] = onTransitionEnd;\n      addEvents(container, eve);\n    }\n\n    if (touch) {\n      addEvents(container, touchEvents, options.preventScrollOnTouch);\n    }\n\n    if (mouseDrag) {\n      addEvents(container, dragEvents);\n    }\n\n    if (arrowKeys) {\n      addEvents(doc, docmentKeydownEvent);\n    }\n\n    if (nested === 'inner') {\n      events.on('outerResized', function () {\n        resizeTasks();\n        events.emit('innerLoaded', info());\n      });\n    } else if (responsive || fixedWidth || autoWidth || autoHeight || !horizontal) {\n      addEvents(win, {\n        'resize': onResize\n      });\n    }\n\n    if (autoHeight) {\n      if (nested === 'outer') {\n        events.on('innerLoaded', doAutoHeight);\n      } else if (!disable) {\n        doAutoHeight();\n      }\n    }\n\n    doLazyLoad();\n\n    if (disable) {\n      disableSlider();\n    } else if (freeze) {\n      freezeSlider();\n    }\n\n    events.on('indexChanged', additionalUpdates);\n\n    if (nested === 'inner') {\n      events.emit('innerLoaded', info());\n    }\n\n    if (typeof onInit === 'function') {\n      onInit(info());\n    }\n\n    isOn = true;\n  }\n\n  function destroy() {\n    // sheet\n    sheet.disabled = true;\n\n    if (sheet.ownerNode) {\n      sheet.ownerNode.remove();\n    } // remove win event listeners\n\n\n    removeEvents(win, {\n      'resize': onResize\n    }); // arrowKeys, controls, nav\n\n    if (arrowKeys) {\n      removeEvents(doc, docmentKeydownEvent);\n    }\n\n    if (controlsContainer) {\n      removeEvents(controlsContainer, controlsEvents);\n    }\n\n    if (navContainer) {\n      removeEvents(navContainer, navEvents);\n    } // autoplay\n\n\n    removeEvents(container, hoverEvents);\n    removeEvents(container, visibilityEvent);\n\n    if (autoplayButton) {\n      removeEvents(autoplayButton, {\n        'click': toggleAutoplay\n      });\n    }\n\n    if (autoplay) {\n      clearInterval(autoplayTimer);\n    } // container\n\n\n    if (carousel && TRANSITIONEND) {\n      var eve = {};\n      eve[TRANSITIONEND] = onTransitionEnd;\n      removeEvents(container, eve);\n    }\n\n    if (touch) {\n      removeEvents(container, touchEvents);\n    }\n\n    if (mouseDrag) {\n      removeEvents(container, dragEvents);\n    } // cache Object values in options && reset HTML\n\n\n    var htmlList = [containerHTML, controlsContainerHTML, prevButtonHTML, nextButtonHTML, navContainerHTML, autoplayButtonHTML];\n    tnsList.forEach(function (item, i) {\n      var el = item === 'container' ? outerWrapper : options[item];\n\n      if (typeof el === 'object' && el) {\n        var prevEl = el.previousElementSibling ? el.previousElementSibling : false,\n            parentEl = el.parentNode;\n        el.outerHTML = htmlList[i];\n        options[item] = prevEl ? prevEl.nextElementSibling : parentEl.firstElementChild;\n      }\n    }); // reset variables\n\n    tnsList = animateIn = animateOut = animateDelay = animateNormal = horizontal = outerWrapper = innerWrapper = container = containerParent = containerHTML = slideItems = slideCount = breakpointZone = windowWidth = autoWidth = fixedWidth = edgePadding = gutter = viewport = items = slideBy = viewportMax = arrowKeys = speed = rewind = loop = autoHeight = sheet = lazyload = slidePositions = slideItemsOut = cloneCount = slideCountNew = hasRightDeadZone = rightBoundary = updateIndexBeforeTransform = transformAttr = transformPrefix = transformPostfix = getIndexMax = index = indexCached = indexMin = indexMax = swipeAngle = moveDirectionExpected = running = onInit = events = newContainerClasses = slideId = disable = disabled = freezable = freeze = frozen = controlsEvents = navEvents = hoverEvents = visibilityEvent = docmentKeydownEvent = touchEvents = dragEvents = hasControls = hasNav = navAsThumbnails = hasAutoplay = hasTouch = hasMouseDrag = slideActiveClass = imgCompleteClass = imgEvents = imgsComplete = controls = controlsText = controlsContainer = controlsContainerHTML = prevButton = nextButton = prevIsButton = nextIsButton = nav = navContainer = navContainerHTML = navItems = pages = pagesCached = navClicked = navCurrentIndex = navCurrentIndexCached = navActiveClass = navStr = navStrCurrent = autoplay = autoplayTimeout = autoplayDirection = autoplayText = autoplayHoverPause = autoplayButton = autoplayButtonHTML = autoplayResetOnVisibility = autoplayHtmlStrings = autoplayTimer = animating = autoplayHoverPaused = autoplayUserPaused = autoplayVisibilityPaused = initPosition = lastPosition = translateInit = panStart = rafIndex = getDist = touch = mouseDrag = null; // check variables\n    // [animateIn, animateOut, animateDelay, animateNormal, horizontal, outerWrapper, innerWrapper, container, containerParent, containerHTML, slideItems, slideCount, breakpointZone, windowWidth, autoWidth, fixedWidth, edgePadding, gutter, viewport, items, slideBy, viewportMax, arrowKeys, speed, rewind, loop, autoHeight, sheet, lazyload, slidePositions, slideItemsOut, cloneCount, slideCountNew, hasRightDeadZone, rightBoundary, updateIndexBeforeTransform, transformAttr, transformPrefix, transformPostfix, getIndexMax, index, indexCached, indexMin, indexMax, resizeTimer, swipeAngle, moveDirectionExpected, running, onInit, events, newContainerClasses, slideId, disable, disabled, freezable, freeze, frozen, controlsEvents, navEvents, hoverEvents, visibilityEvent, docmentKeydownEvent, touchEvents, dragEvents, hasControls, hasNav, navAsThumbnails, hasAutoplay, hasTouch, hasMouseDrag, slideActiveClass, imgCompleteClass, imgEvents, imgsComplete, controls, controlsText, controlsContainer, controlsContainerHTML, prevButton, nextButton, prevIsButton, nextIsButton, nav, navContainer, navContainerHTML, navItems, pages, pagesCached, navClicked, navCurrentIndex, navCurrentIndexCached, navActiveClass, navStr, navStrCurrent, autoplay, autoplayTimeout, autoplayDirection, autoplayText, autoplayHoverPause, autoplayButton, autoplayButtonHTML, autoplayResetOnVisibility, autoplayHtmlStrings, autoplayTimer, animating, autoplayHoverPaused, autoplayUserPaused, autoplayVisibilityPaused, initPosition, lastPosition, translateInit, disX, disY, panStart, rafIndex, getDist, touch, mouseDrag ].forEach(function(item) { if (item !== null) { console.log(item); } });\n\n    for (var a in this) {\n      if (a !== 'rebuild') {\n        this[a] = null;\n      }\n    }\n\n    isOn = false;\n  } // === ON RESIZE ===\n  // responsive || fixedWidth || autoWidth || !horizontal\n\n\n  function onResize(e) {\n    raf(function () {\n      resizeTasks(getEvent(e));\n    });\n  }\n\n  function resizeTasks(e) {\n    if (!isOn) {\n      return;\n    }\n\n    if (nested === 'outer') {\n      events.emit('outerResized', info(e));\n    }\n\n    windowWidth = getWindowWidth();\n    var bpChanged,\n        breakpointZoneTem = breakpointZone,\n        needContainerTransform = false;\n\n    if (responsive) {\n      setBreakpointZone();\n      bpChanged = breakpointZoneTem !== breakpointZone; // if (hasRightDeadZone) { needContainerTransform = true; } // *?\n\n      if (bpChanged) {\n        events.emit('newBreakpointStart', info(e));\n      }\n    }\n\n    var indChanged,\n        itemsChanged,\n        itemsTem = items,\n        disableTem = disable,\n        freezeTem = freeze,\n        arrowKeysTem = arrowKeys,\n        controlsTem = controls,\n        navTem = nav,\n        touchTem = touch,\n        mouseDragTem = mouseDrag,\n        autoplayTem = autoplay,\n        autoplayHoverPauseTem = autoplayHoverPause,\n        autoplayResetOnVisibilityTem = autoplayResetOnVisibility,\n        indexTem = index;\n\n    if (bpChanged) {\n      var fixedWidthTem = fixedWidth,\n          autoHeightTem = autoHeight,\n          controlsTextTem = controlsText,\n          centerTem = center,\n          autoplayTextTem = autoplayText;\n\n      if (!CSSMQ) {\n        var gutterTem = gutter,\n            edgePaddingTem = edgePadding;\n      }\n    } // get option:\n    // fixed width: viewport, fixedWidth, gutter => items\n    // others: window width => all variables\n    // all: items => slideBy\n\n\n    arrowKeys = getOption('arrowKeys');\n    controls = getOption('controls');\n    nav = getOption('nav');\n    touch = getOption('touch');\n    center = getOption('center');\n    mouseDrag = getOption('mouseDrag');\n    autoplay = getOption('autoplay');\n    autoplayHoverPause = getOption('autoplayHoverPause');\n    autoplayResetOnVisibility = getOption('autoplayResetOnVisibility');\n\n    if (bpChanged) {\n      disable = getOption('disable');\n      fixedWidth = getOption('fixedWidth');\n      speed = getOption('speed');\n      autoHeight = getOption('autoHeight');\n      controlsText = getOption('controlsText');\n      autoplayText = getOption('autoplayText');\n      autoplayTimeout = getOption('autoplayTimeout');\n\n      if (!CSSMQ) {\n        edgePadding = getOption('edgePadding');\n        gutter = getOption('gutter');\n      }\n    } // update options\n\n\n    resetVariblesWhenDisable(disable);\n    viewport = getViewportWidth(); // <= edgePadding, gutter\n\n    if ((!horizontal || autoWidth) && !disable) {\n      setSlidePositions();\n\n      if (!horizontal) {\n        updateContentWrapperHeight(); // <= setSlidePositions\n\n        needContainerTransform = true;\n      }\n    }\n\n    if (fixedWidth || autoWidth) {\n      rightBoundary = getRightBoundary(); // autoWidth: <= viewport, slidePositions, gutter\n      // fixedWidth: <= viewport, fixedWidth, gutter\n\n      indexMax = getIndexMax(); // autoWidth: <= rightBoundary, slidePositions\n      // fixedWidth: <= rightBoundary, fixedWidth, gutter\n    }\n\n    if (bpChanged || fixedWidth) {\n      items = getOption('items');\n      slideBy = getOption('slideBy');\n      itemsChanged = items !== itemsTem;\n\n      if (itemsChanged) {\n        if (!fixedWidth && !autoWidth) {\n          indexMax = getIndexMax();\n        } // <= items\n        // check index before transform in case\n        // slider reach the right edge then items become bigger\n\n\n        updateIndex();\n      }\n    }\n\n    if (bpChanged) {\n      if (disable !== disableTem) {\n        if (disable) {\n          disableSlider();\n        } else {\n          enableSlider(); // <= slidePositions, rightBoundary, indexMax\n        }\n      }\n    }\n\n    if (freezable && (bpChanged || fixedWidth || autoWidth)) {\n      freeze = getFreeze(); // <= autoWidth: slidePositions, gutter, viewport, rightBoundary\n      // <= fixedWidth: fixedWidth, gutter, rightBoundary\n      // <= others: items\n\n      if (freeze !== freezeTem) {\n        if (freeze) {\n          doContainerTransform(getContainerTransformValue(getStartIndex(0)));\n          freezeSlider();\n        } else {\n          unfreezeSlider();\n          needContainerTransform = true;\n        }\n      }\n    }\n\n    resetVariblesWhenDisable(disable || freeze); // controls, nav, touch, mouseDrag, arrowKeys, autoplay, autoplayHoverPause, autoplayResetOnVisibility\n\n    if (!autoplay) {\n      autoplayHoverPause = autoplayResetOnVisibility = false;\n    }\n\n    if (arrowKeys !== arrowKeysTem) {\n      arrowKeys ? addEvents(doc, docmentKeydownEvent) : removeEvents(doc, docmentKeydownEvent);\n    }\n\n    if (controls !== controlsTem) {\n      if (controls) {\n        if (controlsContainer) {\n          showElement(controlsContainer);\n        } else {\n          if (prevButton) {\n            showElement(prevButton);\n          }\n\n          if (nextButton) {\n            showElement(nextButton);\n          }\n        }\n      } else {\n        if (controlsContainer) {\n          hideElement(controlsContainer);\n        } else {\n          if (prevButton) {\n            hideElement(prevButton);\n          }\n\n          if (nextButton) {\n            hideElement(nextButton);\n          }\n        }\n      }\n    }\n\n    if (nav !== navTem) {\n      if (nav) {\n        showElement(navContainer);\n        updateNavVisibility();\n      } else {\n        hideElement(navContainer);\n      }\n    }\n\n    if (touch !== touchTem) {\n      touch ? addEvents(container, touchEvents, options.preventScrollOnTouch) : removeEvents(container, touchEvents);\n    }\n\n    if (mouseDrag !== mouseDragTem) {\n      mouseDrag ? addEvents(container, dragEvents) : removeEvents(container, dragEvents);\n    }\n\n    if (autoplay !== autoplayTem) {\n      if (autoplay) {\n        if (autoplayButton) {\n          showElement(autoplayButton);\n        }\n\n        if (!animating && !autoplayUserPaused) {\n          startAutoplay();\n        }\n      } else {\n        if (autoplayButton) {\n          hideElement(autoplayButton);\n        }\n\n        if (animating) {\n          stopAutoplay();\n        }\n      }\n    }\n\n    if (autoplayHoverPause !== autoplayHoverPauseTem) {\n      autoplayHoverPause ? addEvents(container, hoverEvents) : removeEvents(container, hoverEvents);\n    }\n\n    if (autoplayResetOnVisibility !== autoplayResetOnVisibilityTem) {\n      autoplayResetOnVisibility ? addEvents(doc, visibilityEvent) : removeEvents(doc, visibilityEvent);\n    }\n\n    if (bpChanged) {\n      if (fixedWidth !== fixedWidthTem || center !== centerTem) {\n        needContainerTransform = true;\n      }\n\n      if (autoHeight !== autoHeightTem) {\n        if (!autoHeight) {\n          innerWrapper.style.height = '';\n        }\n      }\n\n      if (controls && controlsText !== controlsTextTem) {\n        prevButton.innerHTML = controlsText[0];\n        nextButton.innerHTML = controlsText[1];\n      }\n\n      if (autoplayButton && autoplayText !== autoplayTextTem) {\n        var i = autoplay ? 1 : 0,\n            html = autoplayButton.innerHTML,\n            len = html.length - autoplayTextTem[i].length;\n\n        if (html.substring(len) === autoplayTextTem[i]) {\n          autoplayButton.innerHTML = html.substring(0, len) + autoplayText[i];\n        }\n      }\n    } else {\n      if (center && (fixedWidth || autoWidth)) {\n        needContainerTransform = true;\n      }\n    }\n\n    if (itemsChanged || fixedWidth && !autoWidth) {\n      pages = getPages();\n      updateNavVisibility();\n    }\n\n    indChanged = index !== indexTem;\n\n    if (indChanged) {\n      events.emit('indexChanged', info());\n      needContainerTransform = true;\n    } else if (itemsChanged) {\n      if (!indChanged) {\n        additionalUpdates();\n      }\n    } else if (fixedWidth || autoWidth) {\n      doLazyLoad();\n      updateSlideStatus();\n      updateLiveRegion();\n    }\n\n    if (itemsChanged && !carousel) {\n      updateGallerySlidePositions();\n    }\n\n    if (!disable && !freeze) {\n      // non-mediaqueries: IE8\n      if (bpChanged && !CSSMQ) {\n        // middle wrapper styles\n        // inner wrapper styles\n        if (edgePadding !== edgePaddingTem || gutter !== gutterTem) {\n          innerWrapper.style.cssText = getInnerWrapperStyles(edgePadding, gutter, fixedWidth, speed, autoHeight);\n        }\n\n        if (horizontal) {\n          // container styles\n          if (carousel) {\n            container.style.width = getContainerWidth(fixedWidth, gutter, items);\n          } // slide styles\n\n\n          var str = getSlideWidthStyle(fixedWidth, gutter, items) + getSlideGutterStyle(gutter); // remove the last line and\n          // add new styles\n\n          removeCSSRule(sheet, getCssRulesLength(sheet) - 1);\n          addCSSRule(sheet, '#' + slideId + ' > .tns-item', str, getCssRulesLength(sheet));\n        }\n      } // auto height\n\n\n      if (autoHeight) {\n        doAutoHeight();\n      }\n\n      if (needContainerTransform) {\n        doContainerTransformSilent();\n        indexCached = index;\n      }\n    }\n\n    if (bpChanged) {\n      events.emit('newBreakpointEnd', info(e));\n    }\n  } // === INITIALIZATION FUNCTIONS === //\n\n\n  function getFreeze() {\n    if (!fixedWidth && !autoWidth) {\n      var a = center ? items - (items - 1) / 2 : items;\n      return slideCount <= a;\n    }\n\n    var width = fixedWidth ? (fixedWidth + gutter) * slideCount : slidePositions[slideCount],\n        vp = edgePadding ? viewport + edgePadding * 2 : viewport + gutter;\n\n    if (center) {\n      vp -= fixedWidth ? (viewport - fixedWidth) / 2 : (viewport - (slidePositions[index + 1] - slidePositions[index] - gutter)) / 2;\n    }\n\n    return width <= vp;\n  }\n\n  function setBreakpointZone() {\n    breakpointZone = 0;\n\n    for (var bp in responsive) {\n      bp = parseInt(bp); // convert string to number\n\n      if (windowWidth >= bp) {\n        breakpointZone = bp;\n      }\n    }\n  } // (slideBy, indexMin, indexMax) => index\n\n\n  var updateIndex = function () {\n    return loop ? carousel ? // loop + carousel\n    function () {\n      var leftEdge = indexMin,\n          rightEdge = indexMax;\n      leftEdge += slideBy;\n      rightEdge -= slideBy; // adjust edges when has edge paddings\n      // or fixed-width slider with extra space on the right side\n\n      if (edgePadding) {\n        leftEdge += 1;\n        rightEdge -= 1;\n      } else if (fixedWidth) {\n        if ((viewport + gutter) % (fixedWidth + gutter)) {\n          rightEdge -= 1;\n        }\n      }\n\n      if (cloneCount) {\n        if (index > rightEdge) {\n          index -= slideCount;\n        } else if (index < leftEdge) {\n          index += slideCount;\n        }\n      }\n    } : // loop + gallery\n    function () {\n      if (index > indexMax) {\n        while (index >= indexMin + slideCount) {\n          index -= slideCount;\n        }\n      } else if (index < indexMin) {\n        while (index <= indexMax - slideCount) {\n          index += slideCount;\n        }\n      }\n    } : // non-loop\n    function () {\n      index = Math.max(indexMin, Math.min(indexMax, index));\n    };\n  }();\n\n  function disableUI() {\n    if (!autoplay && autoplayButton) {\n      hideElement(autoplayButton);\n    }\n\n    if (!nav && navContainer) {\n      hideElement(navContainer);\n    }\n\n    if (!controls) {\n      if (controlsContainer) {\n        hideElement(controlsContainer);\n      } else {\n        if (prevButton) {\n          hideElement(prevButton);\n        }\n\n        if (nextButton) {\n          hideElement(nextButton);\n        }\n      }\n    }\n  }\n\n  function enableUI() {\n    if (autoplay && autoplayButton) {\n      showElement(autoplayButton);\n    }\n\n    if (nav && navContainer) {\n      showElement(navContainer);\n    }\n\n    if (controls) {\n      if (controlsContainer) {\n        showElement(controlsContainer);\n      } else {\n        if (prevButton) {\n          showElement(prevButton);\n        }\n\n        if (nextButton) {\n          showElement(nextButton);\n        }\n      }\n    }\n  }\n\n  function freezeSlider() {\n    if (frozen) {\n      return;\n    } // remove edge padding from inner wrapper\n\n\n    if (edgePadding) {\n      innerWrapper.style.margin = '0px';\n    } // add class tns-transparent to cloned slides\n\n\n    if (cloneCount) {\n      var str = 'tns-transparent';\n\n      for (var i = cloneCount; i--;) {\n        if (carousel) {\n          addClass(slideItems[i], str);\n        }\n\n        addClass(slideItems[slideCountNew - i - 1], str);\n      }\n    } // update tools\n\n\n    disableUI();\n    frozen = true;\n  }\n\n  function unfreezeSlider() {\n    if (!frozen) {\n      return;\n    } // restore edge padding for inner wrapper\n    // for mordern browsers\n\n\n    if (edgePadding && CSSMQ) {\n      innerWrapper.style.margin = '';\n    } // remove class tns-transparent to cloned slides\n\n\n    if (cloneCount) {\n      var str = 'tns-transparent';\n\n      for (var i = cloneCount; i--;) {\n        if (carousel) {\n          removeClass(slideItems[i], str);\n        }\n\n        removeClass(slideItems[slideCountNew - i - 1], str);\n      }\n    } // update tools\n\n\n    enableUI();\n    frozen = false;\n  }\n\n  function disableSlider() {\n    if (disabled) {\n      return;\n    }\n\n    sheet.disabled = true;\n    container.className = container.className.replace(newContainerClasses.substring(1), '');\n    removeAttrs(container, ['style']);\n\n    if (loop) {\n      for (var j = cloneCount; j--;) {\n        if (carousel) {\n          hideElement(slideItems[j]);\n        }\n\n        hideElement(slideItems[slideCountNew - j - 1]);\n      }\n    } // vertical slider\n\n\n    if (!horizontal || !carousel) {\n      removeAttrs(innerWrapper, ['style']);\n    } // gallery\n\n\n    if (!carousel) {\n      for (var i = index, l = index + slideCount; i < l; i++) {\n        var item = slideItems[i];\n        removeAttrs(item, ['style']);\n        removeClass(item, animateIn);\n        removeClass(item, animateNormal);\n      }\n    } // update tools\n\n\n    disableUI();\n    disabled = true;\n  }\n\n  function enableSlider() {\n    if (!disabled) {\n      return;\n    }\n\n    sheet.disabled = false;\n    container.className += newContainerClasses;\n    doContainerTransformSilent();\n\n    if (loop) {\n      for (var j = cloneCount; j--;) {\n        if (carousel) {\n          showElement(slideItems[j]);\n        }\n\n        showElement(slideItems[slideCountNew - j - 1]);\n      }\n    } // gallery\n\n\n    if (!carousel) {\n      for (var i = index, l = index + slideCount; i < l; i++) {\n        var item = slideItems[i],\n            classN = i < index + items ? animateIn : animateNormal;\n        item.style.left = (i - index) * 100 / items + '%';\n        addClass(item, classN);\n      }\n    } // update tools\n\n\n    enableUI();\n    disabled = false;\n  }\n\n  function updateLiveRegion() {\n    var str = getLiveRegionStr();\n\n    if (liveregionCurrent.innerHTML !== str) {\n      liveregionCurrent.innerHTML = str;\n    }\n  }\n\n  function getLiveRegionStr() {\n    var arr = getVisibleSlideRange(),\n        start = arr[0] + 1,\n        end = arr[1] + 1;\n    return start === end ? start + '' : start + ' to ' + end;\n  }\n\n  function getVisibleSlideRange(val) {\n    if (val == null) {\n      val = getContainerTransformValue();\n    }\n\n    var start = index,\n        end,\n        rangestart,\n        rangeend; // get range start, range end for autoWidth and fixedWidth\n\n    if (center || edgePadding) {\n      if (autoWidth || fixedWidth) {\n        rangestart = -(parseFloat(val) + edgePadding);\n        rangeend = rangestart + viewport + edgePadding * 2;\n      }\n    } else {\n      if (autoWidth) {\n        rangestart = slidePositions[index];\n        rangeend = rangestart + viewport;\n      }\n    } // get start, end\n    // - check auto width\n\n\n    if (autoWidth) {\n      slidePositions.forEach(function (point, i) {\n        if (i < slideCountNew) {\n          if ((center || edgePadding) && point <= rangestart + 0.5) {\n            start = i;\n          }\n\n          if (rangeend - point >= 0.5) {\n            end = i;\n          }\n        }\n      }); // - check percentage width, fixed width\n    } else {\n      if (fixedWidth) {\n        var cell = fixedWidth + gutter;\n\n        if (center || edgePadding) {\n          start = Math.floor(rangestart / cell);\n          end = Math.ceil(rangeend / cell - 1);\n        } else {\n          end = start + Math.ceil(viewport / cell) - 1;\n        }\n      } else {\n        if (center || edgePadding) {\n          var a = items - 1;\n\n          if (center) {\n            start -= a / 2;\n            end = index + a / 2;\n          } else {\n            end = index + a;\n          }\n\n          if (edgePadding) {\n            var b = edgePadding * items / viewport;\n            start -= b;\n            end += b;\n          }\n\n          start = Math.floor(start);\n          end = Math.ceil(end);\n        } else {\n          end = start + items - 1;\n        }\n      }\n\n      start = Math.max(start, 0);\n      end = Math.min(end, slideCountNew - 1);\n    }\n\n    return [start, end];\n  }\n\n  function doLazyLoad() {\n    if (lazyload && !disable) {\n      var arg = getVisibleSlideRange();\n      arg.push(lazyloadSelector);\n      getImageArray.apply(null, arg).forEach(function (img) {\n        if (!hasClass(img, imgCompleteClass)) {\n          // stop propagation transitionend event to container\n          var eve = {};\n\n          eve[TRANSITIONEND] = function (e) {\n            e.stopPropagation();\n          };\n\n          addEvents(img, eve);\n          addEvents(img, imgEvents); // update src\n\n          img.src = getAttr(img, 'data-src'); // update srcset\n\n          var srcset = getAttr(img, 'data-srcset');\n\n          if (srcset) {\n            img.srcset = srcset;\n          }\n\n          addClass(img, 'loading');\n        }\n      });\n    }\n  }\n\n  function onImgLoaded(e) {\n    imgLoaded(getTarget(e));\n  }\n\n  function onImgFailed(e) {\n    imgFailed(getTarget(e));\n  }\n\n  function imgLoaded(img) {\n    addClass(img, 'loaded');\n    imgCompleted(img);\n  }\n\n  function imgFailed(img) {\n    addClass(img, 'failed');\n    imgCompleted(img);\n  }\n\n  function imgCompleted(img) {\n    addClass(img, imgCompleteClass);\n    removeClass(img, 'loading');\n    removeEvents(img, imgEvents);\n  }\n\n  function getImageArray(start, end, imgSelector) {\n    var imgs = [];\n\n    if (!imgSelector) {\n      imgSelector = 'img';\n    }\n\n    while (start <= end) {\n      forEach(slideItems[start].querySelectorAll(imgSelector), function (img) {\n        imgs.push(img);\n      });\n      start++;\n    }\n\n    return imgs;\n  } // check if all visible images are loaded\n  // and update container height if it's done\n\n\n  function doAutoHeight() {\n    var imgs = getImageArray.apply(null, getVisibleSlideRange());\n    raf(function () {\n      imgsLoadedCheck(imgs, updateInnerWrapperHeight);\n    });\n  }\n\n  function imgsLoadedCheck(imgs, cb) {\n    // execute callback function if all images are complete\n    if (imgsComplete) {\n      return cb();\n    } // check image classes\n\n\n    imgs.forEach(function (img, index) {\n      if (!lazyload && img.complete) {\n        imgCompleted(img);\n      } // Check image.complete\n\n\n      if (hasClass(img, imgCompleteClass)) {\n        imgs.splice(index, 1);\n      }\n    }); // execute callback function if selected images are all complete\n\n    if (!imgs.length) {\n      return cb();\n    } // otherwise execute this functiona again\n\n\n    raf(function () {\n      imgsLoadedCheck(imgs, cb);\n    });\n  }\n\n  function additionalUpdates() {\n    doLazyLoad();\n    updateSlideStatus();\n    updateLiveRegion();\n    updateControlsStatus();\n    updateNavStatus();\n  }\n\n  function update_carousel_transition_duration() {\n    if (carousel && autoHeight) {\n      middleWrapper.style[TRANSITIONDURATION] = speed / 1000 + 's';\n    }\n  }\n\n  function getMaxSlideHeight(slideStart, slideRange) {\n    var heights = [];\n\n    for (var i = slideStart, l = Math.min(slideStart + slideRange, slideCountNew); i < l; i++) {\n      heights.push(slideItems[i].offsetHeight);\n    }\n\n    return Math.max.apply(null, heights);\n  } // update inner wrapper height\n  // 1. get the max-height of the visible slides\n  // 2. set transitionDuration to speed\n  // 3. update inner wrapper height to max-height\n  // 4. set transitionDuration to 0s after transition done\n\n\n  function updateInnerWrapperHeight() {\n    var maxHeight = autoHeight ? getMaxSlideHeight(index, items) : getMaxSlideHeight(cloneCount, slideCount),\n        wp = middleWrapper ? middleWrapper : innerWrapper;\n\n    if (wp.style.height !== maxHeight) {\n      wp.style.height = maxHeight + 'px';\n    }\n  } // get the distance from the top edge of the first slide to each slide\n  // (init) => slidePositions\n\n\n  function setSlidePositions() {\n    slidePositions = [0];\n    var attr = horizontal ? 'left' : 'top',\n        attr2 = horizontal ? 'right' : 'bottom',\n        base = slideItems[0].getBoundingClientRect()[attr];\n    forEach(slideItems, function (item, i) {\n      // skip the first slide\n      if (i) {\n        slidePositions.push(item.getBoundingClientRect()[attr] - base);\n      } // add the end edge\n\n\n      if (i === slideCountNew - 1) {\n        slidePositions.push(item.getBoundingClientRect()[attr2] - base);\n      }\n    });\n  } // update slide\n\n\n  function updateSlideStatus() {\n    var range = getVisibleSlideRange(),\n        start = range[0],\n        end = range[1];\n    forEach(slideItems, function (item, i) {\n      // show slides\n      if (i >= start && i <= end) {\n        if (hasAttr(item, 'aria-hidden')) {\n          removeAttrs(item, ['aria-hidden', 'tabindex']);\n          addClass(item, slideActiveClass);\n        } // hide slides\n\n      } else {\n        if (!hasAttr(item, 'aria-hidden')) {\n          setAttrs(item, {\n            'aria-hidden': 'true',\n            'tabindex': '-1'\n          });\n          removeClass(item, slideActiveClass);\n        }\n      }\n    });\n  } // gallery: update slide position\n\n\n  function updateGallerySlidePositions() {\n    var l = index + Math.min(slideCount, items);\n\n    for (var i = slideCountNew; i--;) {\n      var item = slideItems[i];\n\n      if (i >= index && i < l) {\n        // add transitions to visible slides when adjusting their positions\n        addClass(item, 'tns-moving');\n        item.style.left = (i - index) * 100 / items + '%';\n        addClass(item, animateIn);\n        removeClass(item, animateNormal);\n      } else if (item.style.left) {\n        item.style.left = '';\n        addClass(item, animateNormal);\n        removeClass(item, animateIn);\n      } // remove outlet animation\n\n\n      removeClass(item, animateOut);\n    } // removing '.tns-moving'\n\n\n    setTimeout(function () {\n      forEach(slideItems, function (el) {\n        removeClass(el, 'tns-moving');\n      });\n    }, 300);\n  } // set tabindex on Nav\n\n\n  function updateNavStatus() {\n    // get current nav\n    if (nav) {\n      navCurrentIndex = navClicked >= 0 ? navClicked : getCurrentNavIndex();\n      navClicked = -1;\n\n      if (navCurrentIndex !== navCurrentIndexCached) {\n        var navPrev = navItems[navCurrentIndexCached],\n            navCurrent = navItems[navCurrentIndex];\n        setAttrs(navPrev, {\n          'tabindex': '-1',\n          'aria-label': navStr + (navCurrentIndexCached + 1)\n        });\n        removeClass(navPrev, navActiveClass);\n        setAttrs(navCurrent, {\n          'aria-label': navStr + (navCurrentIndex + 1) + navStrCurrent\n        });\n        removeAttrs(navCurrent, 'tabindex');\n        addClass(navCurrent, navActiveClass);\n        navCurrentIndexCached = navCurrentIndex;\n      }\n    }\n  }\n\n  function getLowerCaseNodeName(el) {\n    return el.nodeName.toLowerCase();\n  }\n\n  function isButton(el) {\n    return getLowerCaseNodeName(el) === 'button';\n  }\n\n  function isAriaDisabled(el) {\n    return el.getAttribute('aria-disabled') === 'true';\n  }\n\n  function disEnableElement(isButton, el, val) {\n    if (isButton) {\n      el.disabled = val;\n    } else {\n      el.setAttribute('aria-disabled', val.toString());\n    }\n  } // set 'disabled' to true on controls when reach the edges\n\n\n  function updateControlsStatus() {\n    if (!controls || rewind || loop) {\n      return;\n    }\n\n    var prevDisabled = prevIsButton ? prevButton.disabled : isAriaDisabled(prevButton),\n        nextDisabled = nextIsButton ? nextButton.disabled : isAriaDisabled(nextButton),\n        disablePrev = index <= indexMin ? true : false,\n        disableNext = !rewind && index >= indexMax ? true : false;\n\n    if (disablePrev && !prevDisabled) {\n      disEnableElement(prevIsButton, prevButton, true);\n    }\n\n    if (!disablePrev && prevDisabled) {\n      disEnableElement(prevIsButton, prevButton, false);\n    }\n\n    if (disableNext && !nextDisabled) {\n      disEnableElement(nextIsButton, nextButton, true);\n    }\n\n    if (!disableNext && nextDisabled) {\n      disEnableElement(nextIsButton, nextButton, false);\n    }\n  } // set duration\n\n\n  function resetDuration(el, str) {\n    if (TRANSITIONDURATION) {\n      el.style[TRANSITIONDURATION] = str;\n    }\n  }\n\n  function getSliderWidth() {\n    return fixedWidth ? (fixedWidth + gutter) * slideCountNew : slidePositions[slideCountNew];\n  }\n\n  function getCenterGap(num) {\n    if (num == null) {\n      num = index;\n    }\n\n    var gap = edgePadding ? gutter : 0;\n    return autoWidth ? (viewport - gap - (slidePositions[num + 1] - slidePositions[num] - gutter)) / 2 : fixedWidth ? (viewport - fixedWidth) / 2 : (items - 1) / 2;\n  }\n\n  function getRightBoundary() {\n    var gap = edgePadding ? gutter : 0,\n        result = viewport + gap - getSliderWidth();\n\n    if (center && !loop) {\n      result = fixedWidth ? -(fixedWidth + gutter) * (slideCountNew - 1) - getCenterGap() : getCenterGap(slideCountNew - 1) - slidePositions[slideCountNew - 1];\n    }\n\n    if (result > 0) {\n      result = 0;\n    }\n\n    return result;\n  }\n\n  function getContainerTransformValue(num) {\n    if (num == null) {\n      num = index;\n    }\n\n    var val;\n\n    if (horizontal && !autoWidth) {\n      if (fixedWidth) {\n        val = -(fixedWidth + gutter) * num;\n\n        if (center) {\n          val += getCenterGap();\n        }\n      } else {\n        var denominator = TRANSFORM ? slideCountNew : items;\n\n        if (center) {\n          num -= getCenterGap();\n        }\n\n        val = -num * 100 / denominator;\n      }\n    } else {\n      val = -slidePositions[num];\n\n      if (center && autoWidth) {\n        val += getCenterGap();\n      }\n    }\n\n    if (hasRightDeadZone) {\n      val = Math.max(val, rightBoundary);\n    }\n\n    val += horizontal && !autoWidth && !fixedWidth ? '%' : 'px';\n    return val;\n  }\n\n  function doContainerTransformSilent(val) {\n    resetDuration(container, '0s');\n    doContainerTransform(val);\n  }\n\n  function doContainerTransform(val) {\n    if (val == null) {\n      val = getContainerTransformValue();\n    }\n\n    container.style[transformAttr] = transformPrefix + val + transformPostfix;\n  }\n\n  function animateSlide(number, classOut, classIn, isOut) {\n    var l = number + items;\n\n    if (!loop) {\n      l = Math.min(l, slideCountNew);\n    }\n\n    for (var i = number; i < l; i++) {\n      var item = slideItems[i]; // set item positions\n\n      if (!isOut) {\n        item.style.left = (i - index) * 100 / items + '%';\n      }\n\n      if (animateDelay && TRANSITIONDELAY) {\n        item.style[TRANSITIONDELAY] = item.style[ANIMATIONDELAY] = animateDelay * (i - number) / 1000 + 's';\n      }\n\n      removeClass(item, classOut);\n      addClass(item, classIn);\n\n      if (isOut) {\n        slideItemsOut.push(item);\n      }\n    }\n  } // make transfer after click/drag:\n  // 1. change 'transform' property for mordern browsers\n  // 2. change 'left' property for legacy browsers\n\n\n  var transformCore = function () {\n    return carousel ? function () {\n      resetDuration(container, '');\n\n      if (TRANSITIONDURATION || !speed) {\n        // for morden browsers with non-zero duration or\n        // zero duration for all browsers\n        doContainerTransform(); // run fallback function manually\n        // when duration is 0 / container is hidden\n\n        if (!speed || !isVisible(container)) {\n          onTransitionEnd();\n        }\n      } else {\n        // for old browser with non-zero duration\n        jsTransform(container, transformAttr, transformPrefix, transformPostfix, getContainerTransformValue(), speed, onTransitionEnd);\n      }\n\n      if (!horizontal) {\n        updateContentWrapperHeight();\n      }\n    } : function () {\n      slideItemsOut = [];\n      var eve = {};\n      eve[TRANSITIONEND] = eve[ANIMATIONEND] = onTransitionEnd;\n      removeEvents(slideItems[indexCached], eve);\n      addEvents(slideItems[index], eve);\n      animateSlide(indexCached, animateIn, animateOut, true);\n      animateSlide(index, animateNormal, animateIn); // run fallback function manually\n      // when transition or animation not supported / duration is 0\n\n      if (!TRANSITIONEND || !ANIMATIONEND || !speed || !isVisible(container)) {\n        onTransitionEnd();\n      }\n    };\n  }();\n\n  function render(e, sliderMoved) {\n    if (updateIndexBeforeTransform) {\n      updateIndex();\n    } // render when slider was moved (touch or drag) even though index may not change\n\n\n    if (index !== indexCached || sliderMoved) {\n      // events\n      events.emit('indexChanged', info());\n      events.emit('transitionStart', info());\n\n      if (autoHeight) {\n        doAutoHeight();\n      } // pause autoplay when click or keydown from user\n\n\n      if (animating && e && ['click', 'keydown'].indexOf(e.type) >= 0) {\n        stopAutoplay();\n      }\n\n      running = true;\n      transformCore();\n    }\n  }\n  /*\n   * Transfer prefixed properties to the same format\n   * CSS: -Webkit-Transform => webkittransform\n   * JS: WebkitTransform => webkittransform\n   * @param {string} str - property\n   *\n   */\n\n\n  function strTrans(str) {\n    return str.toLowerCase().replace(/-/g, '');\n  } // AFTER TRANSFORM\n  // Things need to be done after a transfer:\n  // 1. check index\n  // 2. add classes to visible slide\n  // 3. disable controls buttons when reach the first/last slide in non-loop slider\n  // 4. update nav status\n  // 5. lazyload images\n  // 6. update container height\n\n\n  function onTransitionEnd(event) {\n    // check running on gallery mode\n    // make sure trantionend/animationend events run only once\n    if (carousel || running) {\n      events.emit('transitionEnd', info(event));\n\n      if (!carousel && slideItemsOut.length > 0) {\n        for (var i = 0; i < slideItemsOut.length; i++) {\n          var item = slideItemsOut[i]; // set item positions\n\n          item.style.left = '';\n\n          if (ANIMATIONDELAY && TRANSITIONDELAY) {\n            item.style[ANIMATIONDELAY] = '';\n            item.style[TRANSITIONDELAY] = '';\n          }\n\n          removeClass(item, animateOut);\n          addClass(item, animateNormal);\n        }\n      }\n      /* update slides, nav, controls after checking ...\n       * => legacy browsers who don't support 'event'\n       *    have to check event first, otherwise event.target will cause an error\n       * => or 'gallery' mode:\n       *   + event target is slide item\n       * => or 'carousel' mode:\n       *   + event target is container,\n       *   + event.property is the same with transform attribute\n       */\n\n\n      if (!event || !carousel && event.target.parentNode === container || event.target === container && strTrans(event.propertyName) === strTrans(transformAttr)) {\n        if (!updateIndexBeforeTransform) {\n          var indexTem = index;\n          updateIndex();\n\n          if (index !== indexTem) {\n            events.emit('indexChanged', info());\n            doContainerTransformSilent();\n          }\n        }\n\n        if (nested === 'inner') {\n          events.emit('innerLoaded', info());\n        }\n\n        running = false;\n        indexCached = index;\n      }\n    }\n  } // # ACTIONS\n\n\n  function goTo(targetIndex, e) {\n    if (freeze) {\n      return;\n    } // prev slideBy\n\n\n    if (targetIndex === 'prev') {\n      onControlsClick(e, -1); // next slideBy\n    } else if (targetIndex === 'next') {\n      onControlsClick(e, 1); // go to exact slide\n    } else {\n      if (running) {\n        if (preventActionWhenRunning) {\n          return;\n        } else {\n          onTransitionEnd();\n        }\n      }\n\n      var absIndex = getAbsIndex(),\n          indexGap = 0;\n\n      if (targetIndex === 'first') {\n        indexGap = -absIndex;\n      } else if (targetIndex === 'last') {\n        indexGap = carousel ? slideCount - items - absIndex : slideCount - 1 - absIndex;\n      } else {\n        if (typeof targetIndex !== 'number') {\n          targetIndex = parseInt(targetIndex);\n        }\n\n        if (!isNaN(targetIndex)) {\n          // from directly called goTo function\n          if (!e) {\n            targetIndex = Math.max(0, Math.min(slideCount - 1, targetIndex));\n          }\n\n          indexGap = targetIndex - absIndex;\n        }\n      } // gallery: make sure new page won't overlap with current page\n\n\n      if (!carousel && indexGap && Math.abs(indexGap) < items) {\n        var factor = indexGap > 0 ? 1 : -1;\n        indexGap += index + indexGap - slideCount >= indexMin ? slideCount * factor : slideCount * 2 * factor * -1;\n      }\n\n      index += indexGap; // make sure index is in range\n\n      if (carousel && loop) {\n        if (index < indexMin) {\n          index += slideCount;\n        }\n\n        if (index > indexMax) {\n          index -= slideCount;\n        }\n      } // if index is changed, start rendering\n\n\n      if (getAbsIndex(index) !== getAbsIndex(indexCached)) {\n        render(e);\n      }\n    }\n  } // on controls click\n\n\n  function onControlsClick(e, dir) {\n    if (running) {\n      if (preventActionWhenRunning) {\n        return;\n      } else {\n        onTransitionEnd();\n      }\n    }\n\n    var passEventObject;\n\n    if (!dir) {\n      e = getEvent(e);\n      var target = getTarget(e);\n\n      while (target !== controlsContainer && [prevButton, nextButton].indexOf(target) < 0) {\n        target = target.parentNode;\n      }\n\n      var targetIn = [prevButton, nextButton].indexOf(target);\n\n      if (targetIn >= 0) {\n        passEventObject = true;\n        dir = targetIn === 0 ? -1 : 1;\n      }\n    }\n\n    if (rewind) {\n      if (index === indexMin && dir === -1) {\n        goTo('last', e);\n        return;\n      } else if (index === indexMax && dir === 1) {\n        goTo('first', e);\n        return;\n      }\n    }\n\n    if (dir) {\n      index += slideBy * dir;\n\n      if (autoWidth) {\n        index = Math.floor(index);\n      } // pass e when click control buttons or keydown\n\n\n      render(passEventObject || e && e.type === 'keydown' ? e : null);\n    }\n  } // on nav click\n\n\n  function onNavClick(e) {\n    if (running) {\n      if (preventActionWhenRunning) {\n        return;\n      } else {\n        onTransitionEnd();\n      }\n    }\n\n    e = getEvent(e);\n    var target = getTarget(e),\n        navIndex; // find the clicked nav item\n\n    while (target !== navContainer && !hasAttr(target, 'data-nav')) {\n      target = target.parentNode;\n    }\n\n    if (hasAttr(target, 'data-nav')) {\n      var navIndex = navClicked = Number(getAttr(target, 'data-nav')),\n          targetIndexBase = fixedWidth || autoWidth ? navIndex * slideCount / pages : navIndex * items,\n          targetIndex = navAsThumbnails ? navIndex : Math.min(Math.ceil(targetIndexBase), slideCount - 1);\n      goTo(targetIndex, e);\n\n      if (navCurrentIndex === navIndex) {\n        if (animating) {\n          stopAutoplay();\n        }\n\n        navClicked = -1; // reset navClicked\n      }\n    }\n  } // autoplay functions\n\n\n  function setAutoplayTimer() {\n    autoplayTimer = setInterval(function () {\n      onControlsClick(null, autoplayDirection);\n    }, autoplayTimeout);\n    animating = true;\n  }\n\n  function stopAutoplayTimer() {\n    clearInterval(autoplayTimer);\n    animating = false;\n  }\n\n  function updateAutoplayButton(action, txt) {\n    setAttrs(autoplayButton, {\n      'data-action': action\n    });\n    autoplayButton.innerHTML = autoplayHtmlStrings[0] + action + autoplayHtmlStrings[1] + txt;\n  }\n\n  function startAutoplay() {\n    setAutoplayTimer();\n\n    if (autoplayButton) {\n      updateAutoplayButton('stop', autoplayText[1]);\n    }\n  }\n\n  function stopAutoplay() {\n    stopAutoplayTimer();\n\n    if (autoplayButton) {\n      updateAutoplayButton('start', autoplayText[0]);\n    }\n  } // programaitcally play/pause the slider\n\n\n  function play() {\n    if (autoplay && !animating) {\n      startAutoplay();\n      autoplayUserPaused = false;\n    }\n  }\n\n  function pause() {\n    if (animating) {\n      stopAutoplay();\n      autoplayUserPaused = true;\n    }\n  }\n\n  function toggleAutoplay() {\n    if (animating) {\n      stopAutoplay();\n      autoplayUserPaused = true;\n    } else {\n      startAutoplay();\n      autoplayUserPaused = false;\n    }\n  }\n\n  function onVisibilityChange() {\n    if (doc.hidden) {\n      if (animating) {\n        stopAutoplayTimer();\n        autoplayVisibilityPaused = true;\n      }\n    } else if (autoplayVisibilityPaused) {\n      setAutoplayTimer();\n      autoplayVisibilityPaused = false;\n    }\n  }\n\n  function mouseoverPause() {\n    if (animating) {\n      stopAutoplayTimer();\n      autoplayHoverPaused = true;\n    }\n  }\n\n  function mouseoutRestart() {\n    if (autoplayHoverPaused) {\n      setAutoplayTimer();\n      autoplayHoverPaused = false;\n    }\n  } // keydown events on document\n\n\n  function onDocumentKeydown(e) {\n    e = getEvent(e);\n    var keyIndex = [KEYS.LEFT, KEYS.RIGHT].indexOf(e.keyCode);\n\n    if (keyIndex >= 0) {\n      onControlsClick(e, keyIndex === 0 ? -1 : 1);\n    }\n  } // on key control\n\n\n  function onControlsKeydown(e) {\n    e = getEvent(e);\n    var keyIndex = [KEYS.LEFT, KEYS.RIGHT].indexOf(e.keyCode);\n\n    if (keyIndex >= 0) {\n      if (keyIndex === 0) {\n        if (!prevButton.disabled) {\n          onControlsClick(e, -1);\n        }\n      } else if (!nextButton.disabled) {\n        onControlsClick(e, 1);\n      }\n    }\n  } // set focus\n\n\n  function setFocus(el) {\n    el.focus();\n  } // on key nav\n\n\n  function onNavKeydown(e) {\n    e = getEvent(e);\n    var curElement = doc.activeElement;\n\n    if (!hasAttr(curElement, 'data-nav')) {\n      return;\n    } // var code = e.keyCode,\n\n\n    var keyIndex = [KEYS.LEFT, KEYS.RIGHT, KEYS.ENTER, KEYS.SPACE].indexOf(e.keyCode),\n        navIndex = Number(getAttr(curElement, 'data-nav'));\n\n    if (keyIndex >= 0) {\n      if (keyIndex === 0) {\n        if (navIndex > 0) {\n          setFocus(navItems[navIndex - 1]);\n        }\n      } else if (keyIndex === 1) {\n        if (navIndex < pages - 1) {\n          setFocus(navItems[navIndex + 1]);\n        }\n      } else {\n        navClicked = navIndex;\n        goTo(navIndex, e);\n      }\n    }\n  }\n\n  function getEvent(e) {\n    e = e || win.event;\n    return isTouchEvent(e) ? e.changedTouches[0] : e;\n  }\n\n  function getTarget(e) {\n    return e.target || win.event.srcElement;\n  }\n\n  function isTouchEvent(e) {\n    return e.type.indexOf('touch') >= 0;\n  }\n\n  function preventDefaultBehavior(e) {\n    e.preventDefault ? e.preventDefault() : e.returnValue = false;\n  }\n\n  function getMoveDirectionExpected() {\n    return getTouchDirection(toDegree(lastPosition.y - initPosition.y, lastPosition.x - initPosition.x), swipeAngle) === options.axis;\n  }\n\n  function onPanStart(e) {\n    if (running) {\n      if (preventActionWhenRunning) {\n        return;\n      } else {\n        onTransitionEnd();\n      }\n    }\n\n    if (autoplay && animating) {\n      stopAutoplayTimer();\n    }\n\n    panStart = true;\n\n    if (rafIndex) {\n      caf(rafIndex);\n      rafIndex = null;\n    }\n\n    var $ = getEvent(e);\n    events.emit(isTouchEvent(e) ? 'touchStart' : 'dragStart', info(e));\n\n    if (!isTouchEvent(e) && ['img', 'a'].indexOf(getLowerCaseNodeName(getTarget(e))) >= 0) {\n      preventDefaultBehavior(e);\n    }\n\n    lastPosition.x = initPosition.x = $.clientX;\n    lastPosition.y = initPosition.y = $.clientY;\n\n    if (carousel) {\n      translateInit = parseFloat(container.style[transformAttr].replace(transformPrefix, ''));\n      resetDuration(container, '0s');\n    }\n  }\n\n  function onPanMove(e) {\n    if (panStart) {\n      var $ = getEvent(e);\n      lastPosition.x = $.clientX;\n      lastPosition.y = $.clientY;\n\n      if (carousel) {\n        if (!rafIndex) {\n          rafIndex = raf(function () {\n            panUpdate(e);\n          });\n        }\n      } else {\n        if (moveDirectionExpected === '?') {\n          moveDirectionExpected = getMoveDirectionExpected();\n        }\n\n        if (moveDirectionExpected) {\n          preventScroll = true;\n        }\n      }\n\n      if ((typeof e.cancelable !== 'boolean' || e.cancelable) && preventScroll) {\n        e.preventDefault();\n      }\n    }\n  }\n\n  function panUpdate(e) {\n    if (!moveDirectionExpected) {\n      panStart = false;\n      return;\n    }\n\n    caf(rafIndex);\n\n    if (panStart) {\n      rafIndex = raf(function () {\n        panUpdate(e);\n      });\n    }\n\n    if (moveDirectionExpected === '?') {\n      moveDirectionExpected = getMoveDirectionExpected();\n    }\n\n    if (moveDirectionExpected) {\n      if (!preventScroll && isTouchEvent(e)) {\n        preventScroll = true;\n      }\n\n      try {\n        if (e.type) {\n          events.emit(isTouchEvent(e) ? 'touchMove' : 'dragMove', info(e));\n        }\n      } catch (err) {}\n\n      var x = translateInit,\n          dist = getDist(lastPosition, initPosition);\n\n      if (!horizontal || fixedWidth || autoWidth) {\n        x += dist;\n        x += 'px';\n      } else {\n        var percentageX = TRANSFORM ? dist * items * 100 / ((viewport + gutter) * slideCountNew) : dist * 100 / (viewport + gutter);\n        x += percentageX;\n        x += '%';\n      }\n\n      container.style[transformAttr] = transformPrefix + x + transformPostfix;\n    }\n  }\n\n  function onPanEnd(e) {\n    if (panStart) {\n      if (rafIndex) {\n        caf(rafIndex);\n        rafIndex = null;\n      }\n\n      if (carousel) {\n        resetDuration(container, '');\n      }\n\n      panStart = false;\n      var $ = getEvent(e);\n      lastPosition.x = $.clientX;\n      lastPosition.y = $.clientY;\n      var dist = getDist(lastPosition, initPosition);\n\n      if (Math.abs(dist)) {\n        // drag vs click\n        if (!isTouchEvent(e)) {\n          // prevent \"click\"\n          var target = getTarget(e);\n          addEvents(target, {\n            'click': function preventClick(e) {\n              preventDefaultBehavior(e);\n              removeEvents(target, {\n                'click': preventClick\n              });\n            }\n          });\n        }\n\n        if (carousel) {\n          rafIndex = raf(function () {\n            if (horizontal && !autoWidth) {\n              var indexMoved = -dist * items / (viewport + gutter);\n              indexMoved = dist > 0 ? Math.floor(indexMoved) : Math.ceil(indexMoved);\n              index += indexMoved;\n            } else {\n              var moved = -(translateInit + dist);\n\n              if (moved <= 0) {\n                index = indexMin;\n              } else if (moved >= slidePositions[slideCountNew - 1]) {\n                index = indexMax;\n              } else {\n                var i = 0;\n\n                while (i < slideCountNew && moved >= slidePositions[i]) {\n                  index = i;\n\n                  if (moved > slidePositions[i] && dist < 0) {\n                    index += 1;\n                  }\n\n                  i++;\n                }\n              }\n            }\n\n            render(e, dist);\n            events.emit(isTouchEvent(e) ? 'touchEnd' : 'dragEnd', info(e));\n          });\n        } else {\n          if (moveDirectionExpected) {\n            onControlsClick(e, dist > 0 ? -1 : 1);\n          }\n        }\n      }\n    } // reset\n\n\n    if (options.preventScrollOnTouch === 'auto') {\n      preventScroll = false;\n    }\n\n    if (swipeAngle) {\n      moveDirectionExpected = '?';\n    }\n\n    if (autoplay && !animating) {\n      setAutoplayTimer();\n    }\n  } // === RESIZE FUNCTIONS === //\n  // (slidePositions, index, items) => vertical_conentWrapper.height\n\n\n  function updateContentWrapperHeight() {\n    var wp = middleWrapper ? middleWrapper : innerWrapper;\n    wp.style.height = slidePositions[index + items] - slidePositions[index] + 'px';\n  }\n\n  function getPages() {\n    var rough = fixedWidth ? (fixedWidth + gutter) * slideCount / viewport : slideCount / items;\n    return Math.min(Math.ceil(rough), slideCount);\n  }\n  /*\n   * 1. update visible nav items list\n   * 2. add \"hidden\" attributes to previous visible nav items\n   * 3. remove \"hidden\" attrubutes to new visible nav items\n   */\n\n\n  function updateNavVisibility() {\n    if (!nav || navAsThumbnails) {\n      return;\n    }\n\n    if (pages !== pagesCached) {\n      var min = pagesCached,\n          max = pages,\n          fn = showElement;\n\n      if (pagesCached > pages) {\n        min = pages;\n        max = pagesCached;\n        fn = hideElement;\n      }\n\n      while (min < max) {\n        fn(navItems[min]);\n        min++;\n      } // cache pages\n\n\n      pagesCached = pages;\n    }\n  }\n\n  function info(e) {\n    return {\n      container: container,\n      slideItems: slideItems,\n      navContainer: navContainer,\n      navItems: navItems,\n      controlsContainer: controlsContainer,\n      hasControls: hasControls,\n      prevButton: prevButton,\n      nextButton: nextButton,\n      items: items,\n      slideBy: slideBy,\n      cloneCount: cloneCount,\n      slideCount: slideCount,\n      slideCountNew: slideCountNew,\n      index: index,\n      indexCached: indexCached,\n      displayIndex: getCurrentSlide(),\n      navCurrentIndex: navCurrentIndex,\n      navCurrentIndexCached: navCurrentIndexCached,\n      pages: pages,\n      pagesCached: pagesCached,\n      sheet: sheet,\n      isOn: isOn,\n      event: e || {}\n    };\n  }\n\n  return {\n    version: '2.9.4',\n    getInfo: info,\n    events: events,\n    goTo: goTo,\n    play: play,\n    pause: pause,\n    isOn: isOn,\n    updateSliderHeight: updateInnerWrapperHeight,\n    refresh: initSliderTransform,\n    destroy: destroy,\n    rebuild: function () {\n      return tns(extend(options, optionsElements));\n    }\n  };\n};\n\nexports.tns = tns;\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"WaveSurfer\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WaveSurfer\"] = factory();\n\telse\n\t\troot[\"WaveSurfer\"] = factory();\n})(self, () => {\nreturn ","/**\n * @since 3.0.0\n */\n\nimport style from './util/style';\nimport getId from './util/get-id';\n\n/**\n * The `CanvasEntry` class represents an element consisting of a wave `canvas`\n * and an (optional) progress wave `canvas`.\n *\n * The `MultiCanvas` renderer uses one or more `CanvasEntry` instances to\n * render a waveform, depending on the zoom level.\n */\nexport default class CanvasEntry {\n    constructor() {\n        /**\n         * The wave node\n         *\n         * @type {HTMLCanvasElement}\n         */\n        this.wave = null;\n        /**\n         * The wave canvas rendering context\n         *\n         * @type {CanvasRenderingContext2D}\n         */\n        this.waveCtx = null;\n        /**\n         * The (optional) progress wave node\n         *\n         * @type {HTMLCanvasElement}\n         */\n        this.progress = null;\n        /**\n         * The (optional) progress wave canvas rendering context\n         *\n         * @type {CanvasRenderingContext2D}\n         */\n        this.progressCtx = null;\n        /**\n         * Start of the area the canvas should render, between 0 and 1\n         *\n         * @type {number}\n         */\n        this.start = 0;\n        /**\n         * End of the area the canvas should render, between 0 and 1\n         *\n         * @type {number}\n         */\n        this.end = 1;\n        /**\n         * Unique identifier for this entry\n         *\n         * @type {string}\n         */\n        this.id = getId(\n            typeof this.constructor.name !== 'undefined'\n                ? this.constructor.name.toLowerCase() + '_'\n                : 'canvasentry_'\n        );\n        /**\n         * Canvas 2d context attributes\n         *\n         * @type {object}\n         */\n        this.canvasContextAttributes = {};\n    }\n\n    /**\n     * Store the wave canvas element and create the 2D rendering context\n     *\n     * @param {HTMLCanvasElement} element The wave `canvas` element.\n     */\n    initWave(element) {\n        this.wave = element;\n        this.waveCtx = this.wave.getContext('2d', this.canvasContextAttributes);\n    }\n\n    /**\n     * Store the progress wave canvas element and create the 2D rendering\n     * context\n     *\n     * @param {HTMLCanvasElement} element The progress wave `canvas` element.\n     */\n    initProgress(element) {\n        this.progress = element;\n        this.progressCtx = this.progress.getContext(\n            '2d',\n            this.canvasContextAttributes\n        );\n    }\n\n    /**\n     * Update the dimensions\n     *\n     * @param {number} elementWidth Width of the entry\n     * @param {number} totalWidth Total width of the multi canvas renderer\n     * @param {number} width The new width of the element\n     * @param {number} height The new height of the element\n     */\n    updateDimensions(elementWidth, totalWidth, width, height) {\n        // where the canvas starts and ends in the waveform, represented as a\n        // decimal between 0 and 1\n        this.start = this.wave.offsetLeft / totalWidth || 0;\n        this.end = this.start + elementWidth / totalWidth;\n\n        // set wave canvas dimensions\n        this.wave.width = width;\n        this.wave.height = height;\n        let elementSize = { width: elementWidth + 'px' };\n        style(this.wave, elementSize);\n\n        if (this.hasProgressCanvas) {\n            // set progress canvas dimensions\n            this.progress.width = width;\n            this.progress.height = height;\n            style(this.progress, elementSize);\n        }\n    }\n\n    /**\n     * Clear the wave and progress rendering contexts\n     */\n    clearWave() {\n        // wave\n        this.waveCtx.clearRect(\n            0,\n            0,\n            this.waveCtx.canvas.width,\n            this.waveCtx.canvas.height\n        );\n\n        // progress\n        if (this.hasProgressCanvas) {\n            this.progressCtx.clearRect(\n                0,\n                0,\n                this.progressCtx.canvas.width,\n                this.progressCtx.canvas.height\n            );\n        }\n    }\n\n    /**\n     * Set the fill styles for wave and progress\n     * @param {string|string[]} waveColor Fill color for the wave canvas,\n     * or an array of colors to apply as a gradient\n     * @param {?string|string[]} progressColor Fill color for the progress canvas,\n     * or an array of colors to apply as a gradient\n     */\n    setFillStyles(waveColor, progressColor) {\n        this.waveCtx.fillStyle = this.getFillStyle(this.waveCtx, waveColor);\n\n        if (this.hasProgressCanvas) {\n            this.progressCtx.fillStyle = this.getFillStyle(this.progressCtx, progressColor);\n        }\n    }\n\n    /**\n     * Utility function to handle wave color arguments\n     *\n     * When the color argument type is a string or CanvasGradient instance,\n     * it will be returned as is. Otherwise, it will be treated as an array,\n     * and a new CanvasGradient will be returned\n     *\n     * @since 6.0.0\n     * @param {CanvasRenderingContext2D} ctx Rendering context of target canvas\n     * @param {string|string[]|CanvasGradient} color Either a single fill color\n     *     for the wave canvas, an existing CanvasGradient instance, or an array\n     *     of colors to apply as a gradient\n     * @returns {string|CanvasGradient} Returns a string fillstyle value, or a\n     *     canvas gradient\n     */\n    getFillStyle(ctx, color) {\n        if (typeof color == 'string' || color instanceof CanvasGradient) {\n            return color;\n        }\n\n        const waveGradient = ctx.createLinearGradient(0, 0, 0, ctx.canvas.height);\n        color.forEach((value, index) => waveGradient.addColorStop((index / color.length), value));\n\n        return waveGradient;\n    }\n\n    /**\n     * Set the canvas transforms for wave and progress\n     *\n     * @param {boolean} vertical Whether to render vertically\n     */\n    applyCanvasTransforms(vertical) {\n        if (vertical) {\n            // Reflect the waveform across the line y = -x\n            this.waveCtx.setTransform(0, 1, 1, 0, 0, 0);\n\n            if (this.hasProgressCanvas) {\n                this.progressCtx.setTransform(0, 1, 1, 0, 0, 0);\n            }\n        }\n    }\n\n    /**\n     * Draw a rectangle for wave and progress\n     *\n     * @param {number} x X start position\n     * @param {number} y Y start position\n     * @param {number} width Width of the rectangle\n     * @param {number} height Height of the rectangle\n     * @param {number} radius Radius of the rectangle\n     */\n    fillRects(x, y, width, height, radius) {\n        this.fillRectToContext(this.waveCtx, x, y, width, height, radius);\n\n        if (this.hasProgressCanvas) {\n            this.fillRectToContext(\n                this.progressCtx,\n                x,\n                y,\n                width,\n                height,\n                radius\n            );\n        }\n    }\n\n    /**\n     * Draw the actual rectangle on a `canvas` element\n     *\n     * @param {CanvasRenderingContext2D} ctx Rendering context of target canvas\n     * @param {number} x X start position\n     * @param {number} y Y start position\n     * @param {number} width Width of the rectangle\n     * @param {number} height Height of the rectangle\n     * @param {number} radius Radius of the rectangle\n     */\n    fillRectToContext(ctx, x, y, width, height, radius) {\n        if (!ctx) {\n            return;\n        }\n\n        if (radius) {\n            this.drawRoundedRect(ctx, x, y, width, height, radius);\n        } else {\n            ctx.fillRect(x, y, width, height);\n        }\n    }\n\n    /**\n     * Draw a rounded rectangle on Canvas\n     *\n     * @param {CanvasRenderingContext2D} ctx Canvas context\n     * @param {number} x X-position of the rectangle\n     * @param {number} y Y-position of the rectangle\n     * @param {number} width Width of the rectangle\n     * @param {number} height Height of the rectangle\n     * @param {number} radius Radius of the rectangle\n     *\n     * @return {void}\n     * @example drawRoundedRect(ctx, 50, 50, 5, 10, 3)\n     */\n    drawRoundedRect(ctx, x, y, width, height, radius) {\n        if (height === 0) {\n            return;\n        }\n        // peaks are float values from -1 to 1. Use absolute height values in\n        // order to correctly calculate rounded rectangle coordinates\n        if (height < 0) {\n            height *= -1;\n            y -= height;\n        }\n        ctx.beginPath();\n        ctx.moveTo(x + radius, y);\n        ctx.lineTo(x + width - radius, y);\n        ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n        ctx.lineTo(x + width, y + height - radius);\n        ctx.quadraticCurveTo(\n            x + width,\n            y + height,\n            x + width - radius,\n            y + height\n        );\n        ctx.lineTo(x + radius, y + height);\n        ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n        ctx.lineTo(x, y + radius);\n        ctx.quadraticCurveTo(x, y, x + radius, y);\n        ctx.closePath();\n        ctx.fill();\n    }\n\n    /**\n     * Render the actual wave and progress lines\n     *\n     * @param {number[]} peaks Array with peaks data\n     * @param {number} absmax Maximum peak value (absolute)\n     * @param {number} halfH Half the height of the waveform\n     * @param {number} offsetY Offset to the top\n     * @param {number} start The x-offset of the beginning of the area that\n     * should be rendered\n     * @param {number} end The x-offset of the end of the area that\n     * should be rendered\n     */\n    drawLines(peaks, absmax, halfH, offsetY, start, end) {\n        this.drawLineToContext(\n            this.waveCtx,\n            peaks,\n            absmax,\n            halfH,\n            offsetY,\n            start,\n            end\n        );\n\n        if (this.hasProgressCanvas) {\n            this.drawLineToContext(\n                this.progressCtx,\n                peaks,\n                absmax,\n                halfH,\n                offsetY,\n                start,\n                end\n            );\n        }\n    }\n\n    /**\n     * Render the actual waveform line on a `canvas` element\n     *\n     * @param {CanvasRenderingContext2D} ctx Rendering context of target canvas\n     * @param {number[]} peaks Array with peaks data\n     * @param {number} absmax Maximum peak value (absolute)\n     * @param {number} halfH Half the height of the waveform\n     * @param {number} offsetY Offset to the top\n     * @param {number} start The x-offset of the beginning of the area that\n     * should be rendered\n     * @param {number} end The x-offset of the end of the area that\n     * should be rendered\n     */\n    drawLineToContext(ctx, peaks, absmax, halfH, offsetY, start, end) {\n        if (!ctx) {\n            return;\n        }\n\n        const length = peaks.length / 2;\n        const first = Math.round(length * this.start);\n\n        // use one more peak value to make sure we join peaks at ends -- unless,\n        // of course, this is the last canvas\n        const last = Math.round(length * this.end) + 1;\n\n        const canvasStart = first;\n        const canvasEnd = last;\n        const scale = this.wave.width / (canvasEnd - canvasStart - 1);\n\n        // optimization\n        const halfOffset = halfH + offsetY;\n        const absmaxHalf = absmax / halfH;\n\n        ctx.beginPath();\n        ctx.moveTo((canvasStart - first) * scale, halfOffset);\n\n        ctx.lineTo(\n            (canvasStart - first) * scale,\n            halfOffset - Math.round((peaks[2 * canvasStart] || 0) / absmaxHalf)\n        );\n\n        let i, peak, h;\n        for (i = canvasStart; i < canvasEnd; i++) {\n            peak = peaks[2 * i] || 0;\n            h = Math.round(peak / absmaxHalf);\n            ctx.lineTo((i - first) * scale + this.halfPixel, halfOffset - h);\n        }\n\n        // draw the bottom edge going backwards, to make a single\n        // closed hull to fill\n        let j = canvasEnd - 1;\n        for (j; j >= canvasStart; j--) {\n            peak = peaks[2 * j + 1] || 0;\n            h = Math.round(peak / absmaxHalf);\n            ctx.lineTo((j - first) * scale + this.halfPixel, halfOffset - h);\n        }\n\n        ctx.lineTo(\n            (canvasStart - first) * scale,\n            halfOffset -\n            Math.round((peaks[2 * canvasStart + 1] || 0) / absmaxHalf)\n        );\n\n        ctx.closePath();\n        ctx.fill();\n    }\n\n    /**\n     * Destroys this entry\n     */\n    destroy() {\n        this.waveCtx = null;\n        this.wave = null;\n\n        this.progressCtx = null;\n        this.progress = null;\n    }\n\n    /**\n     * Return image data of the wave `canvas` element\n     *\n     * When using a `type` of `'blob'`, this will return a `Promise` that\n     * resolves with a `Blob` instance.\n     *\n     * @param {string} format='image/png' An optional value of a format type.\n     * @param {number} quality=0.92 An optional value between 0 and 1.\n     * @param {string} type='dataURL' Either 'dataURL' or 'blob'.\n     * @return {string|Promise} When using the default `'dataURL'` `type` this\n     * returns a data URL. When using the `'blob'` `type` this returns a\n     * `Promise` that resolves with a `Blob` instance.\n     */\n    getImage(format, quality, type) {\n        if (type === 'blob') {\n            return new Promise(resolve => {\n                this.wave.toBlob(resolve, format, quality);\n            });\n        } else if (type === 'dataURL') {\n            return this.wave.toDataURL(format, quality);\n        }\n    }\n}\n","import * as util from './util';\n\n/**\n * Parent class for renderers\n *\n * @extends {Observer}\n */\nexport default class Drawer extends util.Observer {\n    /**\n     * @param {HTMLElement} container The container node of the wavesurfer instance\n     * @param {WavesurferParams} params The wavesurfer initialisation options\n     */\n    constructor(container, params) {\n        super();\n\n        this.container = util.withOrientation(container, params.vertical);\n        /**\n         * @type {WavesurferParams}\n         */\n        this.params = params;\n        /**\n         * The width of the renderer\n         * @type {number}\n         */\n        this.width = 0;\n        /**\n         * The height of the renderer\n         * @type {number}\n         */\n        this.height = params.height * this.params.pixelRatio;\n\n        this.lastPos = 0;\n        /**\n         * The `<wave>` element which is added to the container\n         * @type {HTMLElement}\n         */\n        this.wrapper = null;\n    }\n\n    /**\n     * Alias of `util.style`\n     *\n     * @param {HTMLElement} el The element that the styles will be applied to\n     * @param {Object} styles The map of propName: attribute, both are used as-is\n     * @return {HTMLElement} el\n     */\n    style(el, styles) {\n        return util.style(el, styles);\n    }\n\n    /**\n     * Create the wrapper `<wave>` element, style it and set up the events for\n     * interaction\n     */\n    createWrapper() {\n        this.wrapper = util.withOrientation(\n            this.container.appendChild(document.createElement('wave')),\n            this.params.vertical\n        );\n\n        this.style(this.wrapper, {\n            display: 'block',\n            position: 'relative',\n            userSelect: 'none',\n            webkitUserSelect: 'none',\n            height: this.params.height + 'px'\n        });\n\n        if (this.params.fillParent || this.params.scrollParent) {\n            this.style(this.wrapper, {\n                width: '100%',\n                cursor: this.params.hideCursor ? 'none' : 'auto',\n                overflowX: this.params.hideScrollbar ? 'hidden' : 'auto',\n                overflowY: 'hidden'\n            });\n        }\n\n        this.setupWrapperEvents();\n    }\n\n    /**\n     * Handle click event\n     *\n     * @param {Event} e Click event\n     * @param {?boolean} noPrevent Set to true to not call `e.preventDefault()`\n     * @return {number} Playback position from 0 to 1\n     */\n    handleEvent(e, noPrevent) {\n        !noPrevent && e.preventDefault();\n\n        const clientX = util.withOrientation(\n            e.targetTouches ? e.targetTouches[0] : e,\n            this.params.vertical\n        ).clientX;\n        const bbox = this.wrapper.getBoundingClientRect();\n\n        const nominalWidth = this.width;\n        const parentWidth = this.getWidth();\n        const progressPixels = this.getProgressPixels(bbox, clientX);\n\n        let progress;\n        if (!this.params.fillParent && nominalWidth < parentWidth) {\n            progress = progressPixels *\n                (this.params.pixelRatio / nominalWidth) || 0;\n        } else {\n            progress = (progressPixels + this.wrapper.scrollLeft) /\n                this.wrapper.scrollWidth || 0;\n        }\n\n        return util.clamp(progress, 0, 1);\n    }\n\n    getProgressPixels(wrapperBbox, clientX) {\n        if (this.params.rtl) {\n            return wrapperBbox.right - clientX;\n        } else {\n            return clientX - wrapperBbox.left;\n        }\n    }\n\n    setupWrapperEvents() {\n        this.wrapper.addEventListener('click', e => {\n            const orientedEvent = util.withOrientation(e, this.params.vertical);\n            const scrollbarHeight = this.wrapper.offsetHeight -\n                  this.wrapper.clientHeight;\n\n            if (scrollbarHeight !== 0) {\n                // scrollbar is visible.  Check if click was on it\n                const bbox = this.wrapper.getBoundingClientRect();\n                if (orientedEvent.clientY >= bbox.bottom - scrollbarHeight) {\n                    // ignore mousedown as it was on the scrollbar\n                    return;\n                }\n            }\n\n            if (this.params.interact) {\n                this.fireEvent('click', e, this.handleEvent(e));\n            }\n        });\n\n        this.wrapper.addEventListener('dblclick', e => {\n            if (this.params.interact) {\n                this.fireEvent('dblclick', e, this.handleEvent(e));\n            }\n        });\n\n        this.wrapper.addEventListener('scroll', e =>\n            this.fireEvent('scroll', e)\n        );\n    }\n\n    /**\n     * Draw peaks on the canvas\n     *\n     * @param {number[]|Number.<Array[]>} peaks Can also be an array of arrays\n     * for split channel rendering\n     * @param {number} length The width of the area that should be drawn\n     * @param {number} start The x-offset of the beginning of the area that\n     * should be rendered\n     * @param {number} end The x-offset of the end of the area that should be\n     * rendered\n     */\n    drawPeaks(peaks, length, start, end) {\n        if (!this.setWidth(length)) {\n            this.clearWave();\n        }\n\n        this.params.barWidth\n            ? this.drawBars(peaks, 0, start, end)\n            : this.drawWave(peaks, 0, start, end);\n    }\n\n    /**\n     * Scroll to the beginning\n     */\n    resetScroll() {\n        if (this.wrapper !== null) {\n            this.wrapper.scrollLeft = 0;\n        }\n    }\n\n    /**\n     * Recenter the view-port at a certain percent of the waveform\n     *\n     * @param {number} percent Value from 0 to 1 on the waveform\n     */\n    recenter(percent) {\n        const position = this.wrapper.scrollWidth * percent;\n        this.recenterOnPosition(position, true);\n    }\n\n    /**\n     * Recenter the view-port on a position, either scroll there immediately or\n     * in steps of 5 pixels\n     *\n     * @param {number} position X-offset in pixels\n     * @param {boolean} immediate Set to true to immediately scroll somewhere\n     */\n    recenterOnPosition(position, immediate) {\n        const scrollLeft = this.wrapper.scrollLeft;\n        const half = ~~(this.wrapper.clientWidth / 2);\n        const maxScroll = this.wrapper.scrollWidth - this.wrapper.clientWidth;\n        let target = position - half;\n        let offset = target - scrollLeft;\n\n        if (maxScroll == 0) {\n            // no need to continue if scrollbar is not there\n            return;\n        }\n\n        // if the cursor is currently visible...\n        if (!immediate && -half <= offset && offset < half) {\n            // set rate at which waveform is centered\n            let rate = this.params.autoCenterRate;\n\n            // make rate depend on width of view and length of waveform\n            rate /= half;\n            rate *= maxScroll;\n\n            offset = Math.max(-rate, Math.min(rate, offset));\n            target = scrollLeft + offset;\n        }\n\n        // limit target to valid range (0 to maxScroll)\n        target = Math.max(0, Math.min(maxScroll, target));\n        // no use attempting to scroll if we're not moving\n        if (target != scrollLeft) {\n            this.wrapper.scrollLeft = target;\n        }\n    }\n\n    /**\n     * Get the current scroll position in pixels\n     *\n     * @return {number} Horizontal scroll position in pixels\n     */\n    getScrollX() {\n        let x = 0;\n        if (this.wrapper) {\n            const pixelRatio = this.params.pixelRatio;\n            x = Math.round(this.wrapper.scrollLeft * pixelRatio);\n\n            // In cases of elastic scroll (safari with mouse wheel) you can\n            // scroll beyond the limits of the container\n            // Calculate and floor the scrollable extent to make sure an out\n            // of bounds value is not returned\n            // Ticket #1312\n            if (this.params.scrollParent) {\n                const maxScroll = ~~(\n                    this.wrapper.scrollWidth * pixelRatio -\n                    this.getWidth()\n                );\n                x = Math.min(maxScroll, Math.max(0, x));\n            }\n        }\n        return x;\n    }\n\n    /**\n     * Get the width of the container\n     *\n     * @return {number} The width of the container\n     */\n    getWidth() {\n        return Math.round(this.container.clientWidth * this.params.pixelRatio);\n    }\n\n    /**\n     * Set the width of the container\n     *\n     * @param {number} width The new width of the container\n     * @return {boolean} Whether the width of the container was updated or not\n     */\n    setWidth(width) {\n        if (this.width == width) {\n            return false;\n        }\n\n        this.width = width;\n\n        if (this.params.fillParent || this.params.scrollParent) {\n            this.style(this.wrapper, {\n                width: ''\n            });\n        } else {\n            const newWidth = ~~(this.width / this.params.pixelRatio) + 'px';\n            this.style(this.wrapper, {\n                width: newWidth\n            });\n        }\n\n        this.updateSize();\n        return true;\n    }\n\n    /**\n     * Set the height of the container\n     *\n     * @param {number} height The new height of the container.\n     * @return {boolean} Whether the height of the container was updated or not\n     */\n    setHeight(height) {\n        if (height == this.height) {\n            return false;\n        }\n        this.height = height;\n\n        this.style(this.wrapper, {\n            height: ~~(this.height / this.params.pixelRatio) + 'px'\n        });\n\n        this.updateSize();\n        return true;\n    }\n\n    /**\n     * Called by wavesurfer when progress should be rendered\n     *\n     * @param {number} progress From 0 to 1\n     */\n    progress(progress) {\n        const minPxDelta = 1 / this.params.pixelRatio;\n        const pos = Math.round(progress * this.width) * minPxDelta;\n\n        if (pos < this.lastPos || pos - this.lastPos >= minPxDelta) {\n            this.lastPos = pos;\n\n            if (this.params.scrollParent && this.params.autoCenter) {\n                const newPos = ~~(this.wrapper.scrollWidth * progress);\n                this.recenterOnPosition(\n                    newPos,\n                    this.params.autoCenterImmediately\n                );\n            }\n\n            this.updateProgress(pos);\n        }\n    }\n\n    /**\n     * This is called when wavesurfer is destroyed\n     */\n    destroy() {\n        this.unAll();\n        if (this.wrapper) {\n            if (this.wrapper.parentNode == this.container.domElement) {\n                this.container.removeChild(this.wrapper.domElement);\n            }\n            this.wrapper = null;\n        }\n    }\n\n    /* Renderer-specific methods */\n\n    /**\n     * Called after cursor related params have changed.\n     *\n     * @abstract\n     */\n    updateCursor() {}\n\n    /**\n     * Called when the size of the container changes so the renderer can adjust\n     *\n     * @abstract\n     */\n    updateSize() {}\n\n    /**\n     * Draw a waveform with bars\n     *\n     * @abstract\n     * @param {number[]|Number.<Array[]>} peaks Can also be an array of arrays for split channel\n     * rendering\n     * @param {number} channelIndex The index of the current channel. Normally\n     * should be 0\n     * @param {number} start The x-offset of the beginning of the area that\n     * should be rendered\n     * @param {number} end The x-offset of the end of the area that should be\n     * rendered\n     */\n    drawBars(peaks, channelIndex, start, end) {}\n\n    /**\n     * Draw a waveform\n     *\n     * @abstract\n     * @param {number[]|Number.<Array[]>} peaks Can also be an array of arrays for split channel\n     * rendering\n     * @param {number} channelIndex The index of the current channel. Normally\n     * should be 0\n     * @param {number} start The x-offset of the beginning of the area that\n     * should be rendered\n     * @param {number} end The x-offset of the end of the area that should be\n     * rendered\n     */\n    drawWave(peaks, channelIndex, start, end) {}\n\n    /**\n     * Clear the waveform\n     *\n     * @abstract\n     */\n    clearWave() {}\n\n    /**\n     * Render the new progress\n     *\n     * @abstract\n     * @param {number} position X-Offset of progress position in pixels\n     */\n    updateProgress(position) {}\n}\n","import Drawer from './drawer';\nimport * as util from './util';\nimport CanvasEntry from './drawer.canvasentry';\n\n/**\n * MultiCanvas renderer for wavesurfer. Is currently the default and sole\n * builtin renderer.\n *\n * A `MultiCanvas` consists of one or more `CanvasEntry` instances, depending\n * on the zoom level.\n */\nexport default class MultiCanvas extends Drawer {\n    /**\n     * @param {HTMLElement} container The container node of the wavesurfer instance\n     * @param {WavesurferParams} params The wavesurfer initialisation options\n     */\n    constructor(container, params) {\n        super(container, params);\n\n        /**\n         * @type {number}\n         */\n        this.maxCanvasWidth = params.maxCanvasWidth;\n\n        /**\n         * @type {number}\n         */\n        this.maxCanvasElementWidth = Math.round(\n            params.maxCanvasWidth / params.pixelRatio\n        );\n\n        /**\n         * Whether or not the progress wave is rendered. If the `waveColor`\n         * and `progressColor` are the same color it is not.\n         *\n         * @type {boolean}\n         */\n        this.hasProgressCanvas = params.waveColor != params.progressColor;\n\n        /**\n         * @type {number}\n         */\n        this.halfPixel = 0.5 / params.pixelRatio;\n\n        /**\n         * List of `CanvasEntry` instances.\n         *\n         * @type {Array}\n         */\n        this.canvases = [];\n\n        /**\n         * @type {HTMLElement}\n         */\n        this.progressWave = null;\n\n        /**\n         * Class used to generate entries.\n         *\n         * @type {function}\n         */\n        this.EntryClass = CanvasEntry;\n\n        /**\n         * Canvas 2d context attributes.\n         *\n         * @type {object}\n         */\n        this.canvasContextAttributes = params.drawingContextAttributes;\n\n        /**\n         * Overlap added between entries to prevent vertical white stripes\n         * between `canvas` elements.\n         *\n         * @type {number}\n         */\n        this.overlap = 2 * Math.ceil(params.pixelRatio / 2);\n\n        /**\n         * The radius of the wave bars. Makes bars rounded\n         *\n         * @type {number}\n         */\n        this.barRadius = params.barRadius || 0;\n\n        /**\n         * Whether to render the waveform vertically. Defaults to false.\n         *\n         * @type {boolean}\n         */\n        this.vertical = params.vertical;\n    }\n\n    /**\n     * Initialize the drawer\n     */\n    init() {\n        this.createWrapper();\n        this.createElements();\n    }\n\n    /**\n     * Create the canvas elements and style them\n     *\n     */\n    createElements() {\n        this.progressWave = util.withOrientation(\n            this.wrapper.appendChild(document.createElement('wave')),\n            this.params.vertical\n        );\n        this.style(this.progressWave, {\n            position: 'absolute',\n            zIndex: 3,\n            left: 0,\n            top: 0,\n            bottom: 0,\n            overflow: 'hidden',\n            width: '0',\n            display: 'none',\n            boxSizing: 'border-box',\n            borderRightStyle: 'solid',\n            pointerEvents: 'none'\n        });\n\n        this.addCanvas();\n        this.updateCursor();\n    }\n\n    /**\n     * Update cursor style\n     */\n    updateCursor() {\n        this.style(this.progressWave, {\n            borderRightWidth: this.params.cursorWidth + 'px',\n            borderRightColor: this.params.cursorColor\n        });\n    }\n\n    /**\n     * Adjust to the updated size by adding or removing canvases\n     */\n    updateSize() {\n        const totalWidth = Math.round(this.width / this.params.pixelRatio);\n        const requiredCanvases = Math.ceil(\n            totalWidth / (this.maxCanvasElementWidth + this.overlap)\n        );\n\n        // add required canvases\n        while (this.canvases.length < requiredCanvases) {\n            this.addCanvas();\n        }\n\n        // remove older existing canvases, if any\n        while (this.canvases.length > requiredCanvases) {\n            this.removeCanvas();\n        }\n\n        let canvasWidth = this.maxCanvasWidth + this.overlap;\n        const lastCanvas = this.canvases.length - 1;\n        this.canvases.forEach((entry, i) => {\n            if (i == lastCanvas) {\n                canvasWidth = this.width - this.maxCanvasWidth * lastCanvas;\n            }\n            this.updateDimensions(entry, canvasWidth, this.height);\n\n            entry.clearWave();\n        });\n    }\n\n    /**\n     * Add a canvas to the canvas list\n     *\n     */\n    addCanvas() {\n        const entry = new this.EntryClass();\n        entry.canvasContextAttributes = this.canvasContextAttributes;\n        entry.hasProgressCanvas = this.hasProgressCanvas;\n        entry.halfPixel = this.halfPixel;\n        const leftOffset = this.maxCanvasElementWidth * this.canvases.length;\n\n        // wave\n        let wave = util.withOrientation(\n            this.wrapper.appendChild(document.createElement('canvas')),\n            this.params.vertical\n        );\n        this.style(wave, {\n            position: 'absolute',\n            zIndex: 2,\n            left: leftOffset + 'px',\n            top: 0,\n            bottom: 0,\n            height: '100%',\n            pointerEvents: 'none'\n        });\n        entry.initWave(wave);\n\n        // progress\n        if (this.hasProgressCanvas) {\n            let progress = util.withOrientation(\n                this.progressWave.appendChild(document.createElement('canvas')),\n                this.params.vertical\n            );\n            this.style(progress, {\n                position: 'absolute',\n                left: leftOffset + 'px',\n                top: 0,\n                bottom: 0,\n                height: '100%'\n            });\n            entry.initProgress(progress);\n        }\n\n        this.canvases.push(entry);\n    }\n\n    /**\n     * Pop single canvas from the list\n     *\n     */\n    removeCanvas() {\n        let lastEntry = this.canvases[this.canvases.length - 1];\n\n        // wave\n        lastEntry.wave.parentElement.removeChild(lastEntry.wave.domElement);\n\n        // progress\n        if (this.hasProgressCanvas) {\n            lastEntry.progress.parentElement.removeChild(lastEntry.progress.domElement);\n        }\n\n        // cleanup\n        if (lastEntry) {\n            lastEntry.destroy();\n            lastEntry = null;\n        }\n\n        this.canvases.pop();\n    }\n\n    /**\n     * Update the dimensions of a canvas element\n     *\n     * @param {CanvasEntry} entry Target entry\n     * @param {number} width The new width of the element\n     * @param {number} height The new height of the element\n     */\n    updateDimensions(entry, width, height) {\n        const elementWidth = Math.round(width / this.params.pixelRatio);\n        const totalWidth = Math.round(this.width / this.params.pixelRatio);\n\n        // update canvas dimensions\n        entry.updateDimensions(elementWidth, totalWidth, width, height);\n\n        // style element\n        this.style(this.progressWave, { display: 'block' });\n    }\n\n    /**\n     * Clear the whole multi-canvas\n     */\n    clearWave() {\n        util.frame(() => {\n            this.canvases.forEach(entry => entry.clearWave());\n        })();\n    }\n\n    /**\n     * Draw a waveform with bars\n     *\n     * @param {number[]|Number.<Array[]>} peaks Can also be an array of arrays\n     * for split channel rendering\n     * @param {number} channelIndex The index of the current channel. Normally\n     * should be 0. Must be an integer.\n     * @param {number} start The x-offset of the beginning of the area that\n     * should be rendered\n     * @param {number} end The x-offset of the end of the area that should be\n     * rendered\n     * @returns {void}\n     */\n    drawBars(peaks, channelIndex, start, end) {\n        return this.prepareDraw(\n            peaks,\n            channelIndex,\n            start,\n            end,\n            ({ absmax, hasMinVals, height, offsetY, halfH, peaks, channelIndex: ch }) => {\n                // if drawBars was called within ws.empty we don't pass a start and\n                // don't want anything to happen\n                if (start === undefined) {\n                    return;\n                }\n                // Skip every other value if there are negatives.\n                const peakIndexScale = hasMinVals ? 2 : 1;\n                const length = peaks.length / peakIndexScale;\n                const bar = this.params.barWidth * this.params.pixelRatio;\n                const gap =\n                    this.params.barGap === null\n                        ? Math.max(this.params.pixelRatio, ~~(bar / 2))\n                        : Math.max(\n                            this.params.pixelRatio,\n                            this.params.barGap * this.params.pixelRatio\n                        );\n                const step = bar + gap;\n\n                const scale = length / this.width;\n                const first = start;\n                const last = end;\n                let peakIndex = first;\n                for (peakIndex; peakIndex < last; peakIndex += step) {\n\n                    // search for the highest peak in the range this bar falls into\n                    let peak = 0;\n                    let peakIndexRange = Math.floor(peakIndex * scale) * peakIndexScale; // start index\n                    const peakIndexEnd = Math.floor((peakIndex + step) * scale) * peakIndexScale;\n                    do { // do..while makes sure at least one peak is always evaluated\n                        const newPeak = Math.abs(peaks[peakIndexRange]); // for arrays starting with negative values\n                        if (newPeak > peak) {\n                            peak = newPeak; // higher\n                        }\n                        peakIndexRange += peakIndexScale; // skip every other value for negatives\n                    } while (peakIndexRange < peakIndexEnd);\n\n                    // calculate the height of this bar according to the highest peak found\n                    let h = Math.round((peak / absmax) * halfH);\n\n                    // raise the bar height to the specified minimum height\n                    // Math.max is used to replace any value smaller than barMinHeight (not just 0) with barMinHeight\n                    if (this.params.barMinHeight) {\n                        h = Math.max(h, this.params.barMinHeight);\n                    }\n\n                    this.fillRect(\n                        peakIndex + this.halfPixel,\n                        halfH - h + offsetY,\n                        bar + this.halfPixel,\n                        h * 2,\n                        this.barRadius,\n                        ch\n                    );\n                }\n            }\n        );\n    }\n\n    /**\n     * Draw a waveform\n     *\n     * @param {number[]|Number.<Array[]>} peaks Can also be an array of arrays\n     * for split channel rendering\n     * @param {number} channelIndex The index of the current channel. Normally\n     * should be 0\n     * @param {number?} start The x-offset of the beginning of the area that\n     * should be rendered (If this isn't set only a flat line is rendered)\n     * @param {number?} end The x-offset of the end of the area that should be\n     * rendered\n     * @returns {void}\n     */\n    drawWave(peaks, channelIndex, start, end) {\n        return this.prepareDraw(\n            peaks,\n            channelIndex,\n            start,\n            end,\n            ({ absmax, hasMinVals, height, offsetY, halfH, peaks, channelIndex }) => {\n                if (!hasMinVals) {\n                    const reflectedPeaks = [];\n                    const len = peaks.length;\n                    let i = 0;\n                    for (i; i < len; i++) {\n                        reflectedPeaks[2 * i] = peaks[i];\n                        reflectedPeaks[2 * i + 1] = -peaks[i];\n                    }\n                    peaks = reflectedPeaks;\n                }\n\n                // if drawWave was called within ws.empty we don't pass a start and\n                // end and simply want a flat line\n                if (start !== undefined) {\n                    this.drawLine(peaks, absmax, halfH, offsetY, start, end, channelIndex);\n                }\n\n                // always draw a median line\n                this.fillRect(\n                    0,\n                    halfH + offsetY - this.halfPixel,\n                    this.width,\n                    this.halfPixel,\n                    this.barRadius,\n                    channelIndex\n                );\n            }\n        );\n    }\n\n    /**\n     * Tell the canvas entries to render their portion of the waveform\n     *\n     * @param {number[]} peaks Peaks data\n     * @param {number} absmax Maximum peak value (absolute)\n     * @param {number} halfH Half the height of the waveform\n     * @param {number} offsetY Offset to the top\n     * @param {number} start The x-offset of the beginning of the area that\n     * should be rendered\n     * @param {number} end The x-offset of the end of the area that\n     * should be rendered\n     * @param {channelIndex} channelIndex The channel index of the line drawn\n     */\n    drawLine(peaks, absmax, halfH, offsetY, start, end, channelIndex) {\n        const { waveColor, progressColor } = this.params.splitChannelsOptions.channelColors[channelIndex] || {};\n        this.canvases.forEach((entry, i) => {\n            this.setFillStyles(entry, waveColor, progressColor);\n            this.applyCanvasTransforms(entry, this.params.vertical);\n            entry.drawLines(peaks, absmax, halfH, offsetY, start, end);\n        });\n    }\n\n    /**\n     * Draw a rectangle on the multi-canvas\n     *\n     * @param {number} x X-position of the rectangle\n     * @param {number} y Y-position of the rectangle\n     * @param {number} width Width of the rectangle\n     * @param {number} height Height of the rectangle\n     * @param {number} radius Radius of the rectangle\n     * @param {channelIndex} channelIndex The channel index of the bar drawn\n     */\n    fillRect(x, y, width, height, radius, channelIndex) {\n        const startCanvas = Math.floor(x / this.maxCanvasWidth);\n        const endCanvas = Math.min(\n            Math.ceil((x + width) / this.maxCanvasWidth) + 1,\n            this.canvases.length\n        );\n        let i = startCanvas;\n        for (i; i < endCanvas; i++) {\n            const entry = this.canvases[i];\n            const leftOffset = i * this.maxCanvasWidth;\n\n            const intersection = {\n                x1: Math.max(x, i * this.maxCanvasWidth),\n                y1: y,\n                x2: Math.min(\n                    x + width,\n                    i * this.maxCanvasWidth + entry.wave.width\n                ),\n                y2: y + height\n            };\n\n            if (intersection.x1 < intersection.x2) {\n                const { waveColor, progressColor } = this.params.splitChannelsOptions.channelColors[channelIndex] || {};\n                this.setFillStyles(entry, waveColor, progressColor);\n                this.applyCanvasTransforms(entry, this.params.vertical);\n\n                entry.fillRects(\n                    intersection.x1 - leftOffset,\n                    intersection.y1,\n                    intersection.x2 - intersection.x1,\n                    intersection.y2 - intersection.y1,\n                    radius\n                );\n            }\n        }\n    }\n\n    /**\n     * Returns whether to hide the channel from being drawn based on params.\n     *\n     * @param {number} channelIndex The index of the current channel.\n     * @returns {bool} True to hide the channel, false to draw.\n     */\n    hideChannel(channelIndex) {\n        return this.params.splitChannels && this.params.splitChannelsOptions.filterChannels.includes(channelIndex);\n    }\n\n    /**\n     * Performs preparation tasks and calculations which are shared by `drawBars`\n     * and `drawWave`\n     *\n     * @param {number[]|Number.<Array[]>} peaks Can also be an array of arrays for\n     * split channel rendering\n     * @param {number} channelIndex The index of the current channel. Normally\n     * should be 0\n     * @param {number?} start The x-offset of the beginning of the area that\n     * should be rendered. If this isn't set only a flat line is rendered\n     * @param {number?} end The x-offset of the end of the area that should be\n     * rendered\n     * @param {function} fn The render function to call, e.g. `drawWave`\n     * @param {number} drawIndex The index of the current channel after filtering.\n     * @param {number?} normalizedMax Maximum modulation value across channels for use with relativeNormalization. Ignored when undefined\n     * @returns {void}\n     */\n    prepareDraw(peaks, channelIndex, start, end, fn, drawIndex, normalizedMax) {\n        return util.frame(() => {\n            // Split channels and call this function with the channelIndex set\n            if (peaks[0] instanceof Array) {\n                const channels = peaks;\n\n                if (this.params.splitChannels) {\n                    const filteredChannels = channels.filter((c, i) => !this.hideChannel(i));\n                    if (!this.params.splitChannelsOptions.overlay) {\n                        this.setHeight(\n                            Math.max(filteredChannels.length, 1) *\n                                this.params.height *\n                                this.params.pixelRatio\n                        );\n                    }\n\n                    let overallAbsMax;\n                    if (this.params.splitChannelsOptions && this.params.splitChannelsOptions.relativeNormalization) {\n                        // calculate maximum peak across channels to use for normalization\n                        overallAbsMax = util.max(channels.map((channelPeaks => util.absMax(channelPeaks))));\n                    }\n\n\n                    return channels.forEach((channelPeaks, i) =>\n                        this.prepareDraw(channelPeaks, i, start, end, fn, filteredChannels.indexOf(channelPeaks), overallAbsMax)\n                    );\n                }\n                peaks = channels[0];\n            }\n\n            // Return and do not draw channel peaks if hidden.\n            if (this.hideChannel(channelIndex)) {\n                return;\n            }\n\n            // calculate maximum modulation value, either from the barHeight\n            // parameter or if normalize=true from the largest value in the peak\n            // set\n            let absmax = 1 / this.params.barHeight;\n            if (this.params.normalize) {\n                absmax = normalizedMax === undefined ? util.absMax(peaks) : normalizedMax;\n            }\n\n            // Bar wave draws the bottom only as a reflection of the top,\n            // so we don't need negative values\n            const hasMinVals = [].some.call(peaks, val => val < 0);\n            const height = this.params.height * this.params.pixelRatio;\n            const halfH = height / 2;\n\n            let offsetY = height * drawIndex || 0;\n\n            // Override offsetY if overlay is true\n            if (this.params.splitChannelsOptions && this.params.splitChannelsOptions.overlay) {\n                offsetY = 0;\n            }\n\n            return fn({\n                absmax: absmax,\n                hasMinVals: hasMinVals,\n                height: height,\n                offsetY: offsetY,\n                halfH: halfH,\n                peaks: peaks,\n                channelIndex: channelIndex\n            });\n        })();\n    }\n\n    /**\n     * Set the fill styles for a certain entry (wave and progress)\n     *\n     * @param {CanvasEntry} entry Target entry\n     * @param {string} waveColor Wave color to draw this entry\n     * @param {string} progressColor Progress color to draw this entry\n     */\n    setFillStyles(entry, waveColor = this.params.waveColor, progressColor = this.params.progressColor) {\n        entry.setFillStyles(waveColor, progressColor);\n    }\n\n    /**\n     * Set the canvas transforms for a certain entry (wave and progress)\n     *\n     * @param {CanvasEntry} entry Target entry\n     * @param {boolean} vertical Whether to render the waveform vertically\n     */\n    applyCanvasTransforms(entry, vertical = false) {\n        entry.applyCanvasTransforms(vertical);\n    }\n\n    /**\n     * Return image data of the multi-canvas\n     *\n     * When using a `type` of `'blob'`, this will return a `Promise`.\n     *\n     * @param {string} format='image/png' An optional value of a format type.\n     * @param {number} quality=0.92 An optional value between 0 and 1.\n     * @param {string} type='dataURL' Either 'dataURL' or 'blob'.\n     * @return {string|string[]|Promise} When using the default `'dataURL'`\n     * `type` this returns a single data URL or an array of data URLs,\n     * one for each canvas. When using the `'blob'` `type` this returns a\n     * `Promise` that resolves with an array of `Blob` instances, one for each\n     * canvas.\n     */\n    getImage(format, quality, type) {\n        if (type === 'blob') {\n            return Promise.all(\n                this.canvases.map(entry => {\n                    return entry.getImage(format, quality, type);\n                })\n            );\n        } else if (type === 'dataURL') {\n            let images = this.canvases.map(entry =>\n                entry.getImage(format, quality, type)\n            );\n            return images.length > 1 ? images : images[0];\n        }\n    }\n\n    /**\n     * Render the new progress\n     *\n     * @param {number} position X-offset of progress position in pixels\n     */\n    updateProgress(position) {\n        this.style(this.progressWave, { width: position + 'px' });\n    }\n}\n","import MediaElement from './mediaelement';\n\n/**\n * MediaElementWebAudio backend: load audio via an HTML5 audio tag, but playback with the WebAudio API.\n * The advantage here is that the html5 <audio> tag can perform range requests on the server and not\n * buffer the entire file in one request, and you still get the filtering and scripting functionality\n * of the webaudio API.\n * Note that in order to use range requests and prevent buffering, you must provide peak data.\n *\n * @since 3.2.0\n */\nexport default class MediaElementWebAudio extends MediaElement {\n    /**\n     * Construct the backend\n     *\n     * @param {WavesurferParams} params Wavesurfer parameters\n     */\n    constructor(params) {\n        super(params);\n        /** @private */\n        this.params = params;\n        /** @private */\n        this.sourceMediaElement = null;\n    }\n\n    /**\n     * Initialise the backend, called in `wavesurfer.createBackend()`\n     */\n    init() {\n        this.setPlaybackRate(this.params.audioRate);\n        this.createTimer();\n        this.createVolumeNode();\n        this.createScriptNode();\n        this.createAnalyserNode();\n    }\n    /**\n     * Private method called by both `load` (from url)\n     * and `loadElt` (existing media element) methods.\n     *\n     * @param {HTMLMediaElement} media HTML5 Audio or Video element\n     * @param {number[]|Number.<Array[]>} peaks Array of peak data\n     * @param {string} preload HTML 5 preload attribute value\n     * @private\n     */\n    _load(media, peaks, preload) {\n        super._load(media, peaks, preload);\n        this.createMediaElementSource(media);\n    }\n\n    /**\n     * Create MediaElementSource node\n     *\n     * @since 3.2.0\n     * @param {HTMLMediaElement} mediaElement HTML5 Audio to load\n     */\n    createMediaElementSource(mediaElement) {\n        this.sourceMediaElement = this.ac.createMediaElementSource(\n            mediaElement\n        );\n        this.sourceMediaElement.connect(this.analyser);\n    }\n\n    play(start, end) {\n        this.resumeAudioContext();\n        return super.play(start, end);\n    }\n\n    /**\n     * This is called when wavesurfer is destroyed\n     *\n     */\n    destroy() {\n        super.destroy();\n\n        this.destroyWebAudio();\n    }\n}\n","import WebAudio from './webaudio';\nimport * as util from './util';\n\n/**\n * MediaElement backend\n */\nexport default class MediaElement extends WebAudio {\n    /**\n     * Construct the backend\n     *\n     * @param {WavesurferParams} params Wavesurfer parameters\n     */\n    constructor(params) {\n        super(params);\n        /** @private */\n        this.params = params;\n\n        /**\n         * Initially a dummy media element to catch errors. Once `_load` is\n         * called, this will contain the actual `HTMLMediaElement`.\n         * @private\n         */\n        this.media = {\n            currentTime: 0,\n            duration: 0,\n            paused: true,\n            playbackRate: 1,\n            play() {},\n            pause() {},\n            volume: 0\n        };\n\n        /** @private */\n        this.mediaType = params.mediaType.toLowerCase();\n        /** @private */\n        this.elementPosition = params.elementPosition;\n        /** @private */\n        this.peaks = null;\n        /** @private */\n        this.playbackRate = 1;\n        /** @private */\n        this.volume = 1;\n        /** @private */\n        this.isMuted = false;\n        /** @private */\n        this.buffer = null;\n        /** @private */\n        this.onPlayEnd = null;\n        /** @private */\n        this.mediaListeners = {};\n    }\n\n    /**\n     * Initialise the backend, called in `wavesurfer.createBackend()`\n     */\n    init() {\n        this.setPlaybackRate(this.params.audioRate);\n        this.createTimer();\n    }\n\n    /**\n     * Attach event listeners to media element.\n     */\n    _setupMediaListeners() {\n        this.mediaListeners.error = () => {\n            this.fireEvent('error', 'Error loading media element');\n        };\n        this.mediaListeners.waiting = () => {\n            this.fireEvent('waiting');\n        };\n        this.mediaListeners.canplay = () => {\n            this.fireEvent('canplay');\n        };\n        this.mediaListeners.ended = () => {\n            this.fireEvent('finish');\n        };\n        // listen to and relay play, pause and seeked events to enable\n        // playback control from the external media element\n        this.mediaListeners.play = () => {\n            this.fireEvent('play');\n        };\n        this.mediaListeners.pause = () => {\n            this.fireEvent('pause');\n        };\n        this.mediaListeners.seeked = event => {\n            this.fireEvent('seek');\n        };\n        this.mediaListeners.volumechange = event => {\n            this.isMuted = this.media.muted;\n            if (this.isMuted) {\n                this.volume = 0;\n            } else {\n                this.volume = this.media.volume;\n            }\n            this.fireEvent('volume');\n        };\n\n        // reset event listeners\n        Object.keys(this.mediaListeners).forEach(id => {\n            this.media.removeEventListener(id, this.mediaListeners[id]);\n            this.media.addEventListener(id, this.mediaListeners[id]);\n        });\n    }\n\n    /**\n     * Create a timer to provide a more precise `audioprocess` event.\n     */\n    createTimer() {\n        const onAudioProcess = () => {\n            if (this.isPaused()) {\n                return;\n            }\n            this.fireEvent('audioprocess', this.getCurrentTime());\n\n            // Call again in the next frame\n            util.frame(onAudioProcess)();\n        };\n\n        this.on('play', onAudioProcess);\n\n        // Update the progress one more time to prevent it from being stuck in\n        // case of lower framerates\n        this.on('pause', () => {\n            this.fireEvent('audioprocess', this.getCurrentTime());\n        });\n    }\n\n    /**\n     * Create media element with url as its source,\n     * and append to container element.\n     *\n     * @param {string} url Path to media file\n     * @param {HTMLElement} container HTML element\n     * @param {number[]|Number.<Array[]>} peaks Array of peak data\n     * @param {string} preload HTML 5 preload attribute value\n     * @throws Will throw an error if the `url` argument is not a valid media\n     * element.\n     */\n    load(url, container, peaks, preload) {\n        const media = document.createElement(this.mediaType);\n        media.controls = this.params.mediaControls;\n        media.autoplay = this.params.autoplay || false;\n        media.preload = preload == null ? 'auto' : preload;\n        media.src = url;\n        media.style.width = '100%';\n\n        const prevMedia = container.querySelector(this.mediaType);\n        if (prevMedia) {\n            container.removeChild(prevMedia);\n        }\n        container.appendChild(media);\n\n        this._load(media, peaks, preload);\n    }\n\n    /**\n     * Load existing media element.\n     *\n     * @param {HTMLMediaElement} elt HTML5 Audio or Video element\n     * @param {number[]|Number.<Array[]>} peaks Array of peak data\n     */\n    loadElt(elt, peaks) {\n        elt.controls = this.params.mediaControls;\n        elt.autoplay = this.params.autoplay || false;\n\n        this._load(elt, peaks, elt.preload);\n    }\n\n    /**\n     * Method called by both `load` (from url)\n     * and `loadElt` (existing media element) methods.\n     *\n     * @param {HTMLMediaElement} media HTML5 Audio or Video element\n     * @param {number[]|Number.<Array[]>} peaks Array of peak data\n     * @param {string} preload HTML 5 preload attribute value\n     * @throws Will throw an error if the `media` argument is not a valid media\n     * element.\n     * @private\n     */\n    _load(media, peaks, preload) {\n        // verify media element is valid\n        if (\n            !(media instanceof HTMLMediaElement) ||\n            typeof media.addEventListener === 'undefined'\n        ) {\n            throw new Error('media parameter is not a valid media element');\n        }\n\n        // load must be called manually on iOS, otherwise peaks won't draw\n        // until a user interaction triggers load --> 'ready' event\n        //\n        // note that we avoid calling media.load here when given peaks and preload == 'none'\n        // as this almost always triggers some browser fetch of the media.\n        if (typeof media.load == 'function' && !(peaks && preload == 'none')) {\n            // Resets the media element and restarts the media resource. Any\n            // pending events are discarded. How much media data is fetched is\n            // still affected by the preload attribute.\n            media.load();\n        }\n\n        this.media = media;\n        this._setupMediaListeners();\n        this.peaks = peaks;\n        this.onPlayEnd = null;\n        this.buffer = null;\n        this.isMuted = media.muted;\n        this.setPlaybackRate(this.playbackRate);\n        this.setVolume(this.volume);\n    }\n\n    /**\n     * Used by `wavesurfer.isPlaying()` and `wavesurfer.playPause()`\n     *\n     * @return {boolean} Media paused or not\n     */\n    isPaused() {\n        return !this.media || this.media.paused;\n    }\n\n    /**\n     * Used by `wavesurfer.getDuration()`\n     *\n     * @return {number} Duration\n     */\n    getDuration() {\n        if (this.explicitDuration) {\n            return this.explicitDuration;\n        }\n        let duration = (this.buffer || this.media).duration;\n        if (duration >= Infinity) {\n            // streaming audio\n            duration = this.media.seekable.end(0);\n        }\n        return duration;\n    }\n\n    /**\n     * Returns the current time in seconds relative to the audio-clip's\n     * duration.\n     *\n     * @return {number} Current time\n     */\n    getCurrentTime() {\n        return this.media && this.media.currentTime;\n    }\n\n    /**\n     * Get the position from 0 to 1\n     *\n     * @return {number} Current position\n     */\n    getPlayedPercents() {\n        return this.getCurrentTime() / this.getDuration() || 0;\n    }\n\n    /**\n     * Get the audio source playback rate.\n     *\n     * @return {number} Playback rate\n     */\n    getPlaybackRate() {\n        return this.playbackRate || this.media.playbackRate;\n    }\n\n    /**\n     * Set the audio source playback rate.\n     *\n     * @param {number} value Playback rate\n     */\n    setPlaybackRate(value) {\n        this.playbackRate = value || 1;\n        this.media.playbackRate = this.playbackRate;\n    }\n\n    /**\n     * Used by `wavesurfer.seekTo()`\n     *\n     * @param {number} start Position to start at in seconds\n     */\n    seekTo(start) {\n        if (start != null && !isNaN(start)) {\n            this.media.currentTime = start;\n        }\n        this.clearPlayEnd();\n    }\n\n    /**\n     * Plays the loaded audio region.\n     *\n     * @param {number} start Start offset in seconds, relative to the beginning\n     * of a clip.\n     * @param {number} end When to stop, relative to the beginning of a clip.\n     * @emits MediaElement#play\n     * @return {Promise} Result\n     */\n    play(start, end) {\n        this.seekTo(start);\n        const promise = this.media.play();\n        end && this.setPlayEnd(end);\n\n        return promise;\n    }\n\n    /**\n     * Pauses the loaded audio.\n     *\n     * @emits MediaElement#pause\n     * @return {Promise} Result\n     */\n    pause() {\n        let promise;\n\n        if (this.media) {\n            promise = this.media.pause();\n        }\n        this.clearPlayEnd();\n\n        return promise;\n    }\n\n    /**\n     * Set the play end\n     *\n     * @param {number} end Where to end\n     */\n    setPlayEnd(end) {\n        this.clearPlayEnd();\n\n        this._onPlayEnd = time => {\n            if (time >= end) {\n                this.pause();\n                this.seekTo(end);\n            }\n        };\n        this.on('audioprocess', this._onPlayEnd);\n    }\n\n    /** @private */\n    clearPlayEnd() {\n        if (this._onPlayEnd) {\n            this.un('audioprocess', this._onPlayEnd);\n            this._onPlayEnd = null;\n        }\n    }\n\n    /**\n     * Compute the max and min value of the waveform when broken into\n     * <length> subranges.\n     *\n     * @param {number} length How many subranges to break the waveform into.\n     * @param {number} first First sample in the required range.\n     * @param {number} last Last sample in the required range.\n     * @return {number[]|Number.<Array[]>} Array of 2*<length> peaks or array of\n     * arrays of peaks consisting of (max, min) values for each subrange.\n     */\n    getPeaks(length, first, last) {\n        if (this.buffer) {\n            return super.getPeaks(length, first, last);\n        }\n        return this.peaks || [];\n    }\n\n    /**\n     * Set the sink id for the media player\n     *\n     * @param {string} deviceId String value representing audio device id.\n     * @returns {Promise} A Promise that resolves to `undefined` when there\n     * are no errors.\n     */\n    setSinkId(deviceId) {\n        if (deviceId) {\n            if (!this.media.setSinkId) {\n                return Promise.reject(\n                    new Error('setSinkId is not supported in your browser')\n                );\n            }\n            return this.media.setSinkId(deviceId);\n        }\n\n        return Promise.reject(new Error('Invalid deviceId: ' + deviceId));\n    }\n\n    /**\n     * Get the current volume\n     *\n     * @return {number} value A floating point value between 0 and 1.\n     */\n    getVolume() {\n        return this.volume;\n    }\n\n    /**\n     * Set the audio volume\n     *\n     * @param {number} value A floating point value between 0 and 1.\n     */\n    setVolume(value) {\n        this.volume = value;\n        // no need to change when it's already at that volume\n        if (this.media.volume !== this.volume) {\n            this.media.volume = this.volume;\n        }\n    }\n\n    /**\n     * Enable or disable muted audio\n     *\n     * @since 4.0.0\n     * @param {boolean} muted Specify `true` to mute audio.\n     */\n    setMute(muted) {\n        // This causes a volume change to be emitted too through the\n        // volumechange event listener.\n        this.isMuted = this.media.muted = muted;\n    }\n\n    /**\n     * This is called when wavesurfer is destroyed\n     *\n     */\n    destroy() {\n        this.pause();\n        this.unAll();\n        this.destroyed = true;\n\n        // cleanup media event listeners\n        Object.keys(this.mediaListeners).forEach(id => {\n            if (this.media) {\n                this.media.removeEventListener(id, this.mediaListeners[id]);\n            }\n        });\n\n        if (\n            this.params.removeMediaElementOnDestroy &&\n            this.media &&\n            this.media.parentNode\n        ) {\n            this.media.parentNode.removeChild(this.media);\n        }\n\n        this.media = null;\n    }\n}\n","/**\n * Caches the decoded peaks data to improve rendering speed for large audio\n *\n * Is used if the option parameter `partialRender` is set to `true`\n */\nexport default class PeakCache {\n    /**\n     * Instantiate cache\n     */\n    constructor() {\n        this.clearPeakCache();\n    }\n\n    /**\n     * Empty the cache\n     */\n    clearPeakCache() {\n        /**\n         * Flat array with entries that are always in pairs to mark the\n         * beginning and end of each subrange.  This is a convenience so we can\n         * iterate over the pairs for easy set difference operations.\n         * @private\n         */\n        this.peakCacheRanges = [];\n        /**\n         * Length of the entire cachable region, used for resetting the cache\n         * when this changes (zoom events, for instance).\n         * @private\n         */\n        this.peakCacheLength = -1;\n    }\n\n    /**\n     * Add a range of peaks to the cache\n     *\n     * @param {number} length The length of the range\n     * @param {number} start The x offset of the start of the range\n     * @param {number} end The x offset of the end of the range\n     * @return {Number.<Array[]>} Array with arrays of numbers\n     */\n    addRangeToPeakCache(length, start, end) {\n        if (length != this.peakCacheLength) {\n            this.clearPeakCache();\n            this.peakCacheLength = length;\n        }\n\n        // Return ranges that weren't in the cache before the call.\n        let uncachedRanges = [];\n        let i = 0;\n        // Skip ranges before the current start.\n        while (\n            i < this.peakCacheRanges.length &&\n            this.peakCacheRanges[i] < start\n        ) {\n            i++;\n        }\n        // If |i| is even, |start| falls after an existing range.  Otherwise,\n        // |start| falls between an existing range, and the uncached region\n        // starts when we encounter the next node in |peakCacheRanges| or\n        // |end|, whichever comes first.\n        if (i % 2 == 0) {\n            uncachedRanges.push(start);\n        }\n        while (\n            i < this.peakCacheRanges.length &&\n            this.peakCacheRanges[i] <= end\n        ) {\n            uncachedRanges.push(this.peakCacheRanges[i]);\n            i++;\n        }\n        // If |i| is even, |end| is after all existing ranges.\n        if (i % 2 == 0) {\n            uncachedRanges.push(end);\n        }\n\n        // Filter out the 0-length ranges.\n        uncachedRanges = uncachedRanges.filter((item, pos, arr) => {\n            if (pos == 0) {\n                return item != arr[pos + 1];\n            } else if (pos == arr.length - 1) {\n                return item != arr[pos - 1];\n            }\n            return item != arr[pos - 1] && item != arr[pos + 1];\n        });\n\n        // Merge the two ranges together, uncachedRanges will either contain\n        // wholly new points, or duplicates of points in peakCacheRanges.  If\n        // duplicates are detected, remove both and extend the range.\n        this.peakCacheRanges = this.peakCacheRanges.concat(uncachedRanges);\n        this.peakCacheRanges = this.peakCacheRanges\n            .sort((a, b) => a - b)\n            .filter((item, pos, arr) => {\n                if (pos == 0) {\n                    return item != arr[pos + 1];\n                } else if (pos == arr.length - 1) {\n                    return item != arr[pos - 1];\n                }\n                return item != arr[pos - 1] && item != arr[pos + 1];\n            });\n\n        // Push the uncached ranges into an array of arrays for ease of\n        // iteration in the functions that call this.\n        const uncachedRangePairs = [];\n        for (i = 0; i < uncachedRanges.length; i += 2) {\n            uncachedRangePairs.push([uncachedRanges[i], uncachedRanges[i + 1]]);\n        }\n\n        return uncachedRangePairs;\n    }\n\n    /**\n     * For testing\n     *\n     * @return {Number.<Array[]>} Array with arrays of numbers\n     */\n    getCacheRanges() {\n        const peakCacheRangePairs = [];\n        let i;\n        for (i = 0; i < this.peakCacheRanges.length; i += 2) {\n            peakCacheRangePairs.push([\n                this.peakCacheRanges[i],\n                this.peakCacheRanges[i + 1]\n            ]);\n        }\n        return peakCacheRangePairs;\n    }\n}\n","import utilMax from './max';\r\nimport utilmin from './min';\r\n\r\n/**\r\n * Get the largest absolute value in an array\r\n *\r\n * @param   {Array} values Array of numbers\r\n * @returns {Number} Largest number found\r\n * @example console.log(max([-3, 2, 1]), max([-3, 2, 4])); // logs 3 4\r\n * @since 4.3.0\r\n */\r\nexport default function absMax(values) {\r\n    const max = utilMax(values);\r\n    const min = utilmin(values);\r\n    return -min > max ? -min : max;\r\n}\r\n","/**\n * Returns a number limited to the given range.\n *\n * @param {number} val The number to be limited to a range\n * @param {number} min The lower boundary of the limit range\n * @param {number} max The upper boundary of the limit range\n * @returns {number} A number in the range [min, max]\n */\nexport default function clamp(val, min, max) {\n    return Math.min(Math.max(min, val), max);\n}\n","/**\n * @since 3.0.0\n */\n\nimport Observer from './observer';\n\nclass ProgressHandler {\n    /**\n     * Instantiate ProgressHandler\n     *\n     * @param {Observer} instance The `fetchFile` observer instance.\n     * @param {Number} contentLength Content length.\n     * @param {Response} response Response object.\n     */\n    constructor(instance, contentLength, response) {\n        this.instance = instance;\n        this.instance._reader = response.body.getReader();\n\n        this.total = parseInt(contentLength, 10);\n        this.loaded = 0;\n    }\n\n    /**\n     * A method that is called once, immediately after the `ReadableStream``\n     * is constructed.\n     *\n     * @param {ReadableStreamDefaultController} controller Controller instance\n     *     used to control the stream.\n     */\n    start(controller) {\n        const read = () => {\n            // instance._reader.read() returns a promise that resolves\n            // when a value has been received\n            this.instance._reader\n                .read()\n                .then(({ done, value }) => {\n                    // result objects contain two properties:\n                    // done  - true if the stream has already given you all its data.\n                    // value - some data. Always undefined when done is true.\n                    if (done) {\n                        // ensure onProgress called when content-length=0\n                        if (this.total === 0) {\n                            this.instance.onProgress.call(this.instance, {\n                                loaded: this.loaded,\n                                total: this.total,\n                                lengthComputable: false\n                            });\n                        }\n                        // no more data needs to be consumed, close the stream\n                        controller.close();\n                        return;\n                    }\n\n                    this.loaded += value.byteLength;\n                    this.instance.onProgress.call(this.instance, {\n                        loaded: this.loaded,\n                        total: this.total,\n                        lengthComputable: !(this.total === 0)\n                    });\n                    // enqueue the next data chunk into our target stream\n                    controller.enqueue(value);\n                    read();\n                })\n                .catch(error => {\n                    controller.error(error);\n                });\n        };\n\n        read();\n    }\n}\n\n/**\n * Load a file using `fetch`.\n *\n * @param {object} options Request options to use. See example below.\n * @returns {Observer} Observer instance\n * @example\n * // default options\n * let options = {\n *     url: undefined,\n *     method: 'GET',\n *     mode: 'cors',\n *     credentials: 'same-origin',\n *     cache: 'default',\n *     responseType: 'json',\n *     requestHeaders: [],\n *     redirect: 'follow',\n *     referrer: 'client'\n * };\n *\n * // override some options\n * options.url = '../media/demo.wav';\n\n * // available types: 'arraybuffer', 'blob', 'json' or 'text'\n * options.responseType = 'arraybuffer';\n *\n * // make fetch call\n * let request = util.fetchFile(options);\n *\n * // listen for events\n * request.on('progress', e => {\n *     console.log('progress', e);\n * });\n *\n * request.on('success', data => {\n *     console.log('success!', data);\n * });\n *\n * request.on('error', e => {\n *     console.warn('fetchFile error: ', e);\n * });\n */\nexport default function fetchFile(options) {\n    if (!options) {\n        throw new Error('fetch options missing');\n    } else if (!options.url) {\n        throw new Error('fetch url missing');\n    }\n    const instance = new Observer();\n    const fetchHeaders = new Headers();\n    const fetchRequest = new Request(options.url);\n\n    // add ability to abort\n    instance.controller = new AbortController();\n\n    // check if headers have to be added\n    if (options && options.requestHeaders) {\n        // add custom request headers\n        options.requestHeaders.forEach(header => {\n            fetchHeaders.append(header.key, header.value);\n        });\n    }\n\n    // parse fetch options\n    const responseType = options.responseType || 'json';\n    const fetchOptions = {\n        method: options.method || 'GET',\n        headers: fetchHeaders,\n        mode: options.mode || 'cors',\n        credentials: options.credentials || 'same-origin',\n        cache: options.cache || 'default',\n        redirect: options.redirect || 'follow',\n        referrer: options.referrer || 'client',\n        signal: instance.controller.signal\n    };\n\n    fetch(fetchRequest, fetchOptions)\n        .then(response => {\n            // store response reference\n            instance.response = response;\n\n            let progressAvailable = true;\n            if (!response.body) {\n                // ReadableStream is not yet supported in this browser\n                // see https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream\n                progressAvailable = false;\n            }\n\n            // Server must send CORS header \"Access-Control-Expose-Headers: content-length\"\n            const contentLength = response.headers.get('content-length');\n            if (contentLength === null) {\n                // Content-Length server response header missing.\n                // Don't evaluate download progress if we can't compare against a total size\n                // see https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Access-Control-Expose-Headers\n                progressAvailable = false;\n            }\n\n            if (!progressAvailable) {\n                // not able to check download progress so skip it\n                return response;\n            }\n\n            // fire progress event when during load\n            instance.onProgress = e => {\n                instance.fireEvent('progress', e);\n            };\n\n            return new Response(\n                new ReadableStream(\n                    new ProgressHandler(instance, contentLength, response)\n                ),\n                fetchOptions\n            );\n        })\n        .then(response => {\n            let errMsg;\n            if (response.ok) {\n                switch (responseType) {\n                    case 'arraybuffer':\n                        return response.arrayBuffer();\n\n                    case 'json':\n                        return response.json();\n\n                    case 'blob':\n                        return response.blob();\n\n                    case 'text':\n                        return response.text();\n\n                    default:\n                        errMsg = 'Unknown responseType: ' + responseType;\n                        break;\n                }\n            }\n            if (!errMsg) {\n                errMsg = 'HTTP error status: ' + response.status;\n            }\n            throw new Error(errMsg);\n        })\n        .then(response => {\n            instance.fireEvent('success', response);\n        })\n        .catch(error => {\n            instance.fireEvent('error', error);\n        });\n\n    // return the fetch request\n    instance.fetchRequest = fetchRequest;\n    return instance;\n}\n","import reqAnimationFrame from './request-animation-frame';\n\n/**\n * Create a function which will be called at the next requestAnimationFrame\n * cycle\n *\n * @param {function} func The function to call\n *\n * @return {func} The function wrapped within a requestAnimationFrame\n */\nexport default function frame(func) {\n    return (...args) => reqAnimationFrame(() => func(...args));\n}\n","/**\n * Get a random prefixed ID\n *\n * @param {String} prefix Prefix to use. Default is `'wavesurfer_'`.\n * @returns {String} Random prefixed ID\n * @example\n * console.log(getId()); // logs 'wavesurfer_b5pors4ru6g'\n *\n * let prefix = 'foo-';\n * console.log(getId(prefix)); // logs 'foo-b5pors4ru6g'\n */\nexport default function getId(prefix) {\n    if (prefix === undefined) {\n        prefix = 'wavesurfer_';\n    }\n    return (\n        prefix +\n        Math.random()\n            .toString(32)\n            .substring(2)\n    );\n}\n","export { default as getId } from './get-id';\nexport { default as max } from './max';\nexport { default as min } from './min';\nexport { default as absMax } from './absMax';\nexport { default as Observer } from './observer';\nexport { default as style } from './style';\nexport { default as requestAnimationFrame } from './request-animation-frame';\nexport { default as frame } from './frame';\nexport { default as debounce } from 'debounce';\nexport { default as preventClick } from './prevent-click';\nexport { default as fetchFile } from './fetch';\nexport { default as clamp } from './clamp';\nexport { default as withOrientation } from './orientation';\nexport { default as ignoreSilenceMode } from './silence-mode';\n","/**\n * Get the largest value\n *\n * @param   {Array} values Array of numbers\n * @returns {Number} Largest number found\n * @example console.log(max([1, 2, 3])); // logs 3\n */\nexport default function max(values) {\n    let largest = -Infinity;\n    Object.keys(values).forEach(i => {\n        if (values[i] > largest) {\n            largest = values[i];\n        }\n    });\n    return largest;\n}\n","/**\n * Get the smallest value\n *\n * @param   {Array} values Array of numbers\n * @returns {Number} Smallest number found\n * @example console.log(min([1, 2, 3])); // logs 1\n */\nexport default function min(values) {\n    let smallest = Number(Infinity);\n    Object.keys(values).forEach(i => {\n        if (values[i] < smallest) {\n            smallest = values[i];\n        }\n    });\n    return smallest;\n}\n","/**\n * @typedef {Object} ListenerDescriptor\n * @property {string} name The name of the event\n * @property {function} callback The callback\n * @property {function} un The function to call to remove the listener\n */\n\n/**\n * Observer class\n */\nexport default class Observer {\n    /**\n     * Instantiate Observer\n     */\n    constructor() {\n        /**\n         * @private\n         * @todo Initialise the handlers here already and remove the conditional\n         * assignment in `on()`\n         */\n        this._disabledEventEmissions = [];\n        this.handlers = null;\n    }\n    /**\n     * Attach a handler function for an event.\n     *\n     * @param {string} event Name of the event to listen to\n     * @param {function} fn The callback to trigger when the event is fired\n     * @return {ListenerDescriptor} The event descriptor\n     */\n    on(event, fn) {\n        if (!this.handlers) {\n            this.handlers = {};\n        }\n\n        let handlers = this.handlers[event];\n        if (!handlers) {\n            handlers = this.handlers[event] = [];\n        }\n        handlers.push(fn);\n\n        // Return an event descriptor\n        return {\n            name: event,\n            callback: fn,\n            un: (e, fn) => this.un(e, fn)\n        };\n    }\n\n    /**\n     * Remove an event handler.\n     *\n     * @param {string} event Name of the event the listener that should be\n     * removed listens to\n     * @param {function} fn The callback that should be removed\n     */\n    un(event, fn) {\n        if (!this.handlers) {\n            return;\n        }\n\n        const handlers = this.handlers[event];\n        let i;\n        if (handlers) {\n            if (fn) {\n                for (i = handlers.length - 1; i >= 0; i--) {\n                    if (handlers[i] == fn) {\n                        handlers.splice(i, 1);\n                    }\n                }\n            } else {\n                handlers.length = 0;\n            }\n        }\n    }\n\n    /**\n     * Remove all event handlers.\n     */\n    unAll() {\n        this.handlers = null;\n    }\n\n    /**\n     * Attach a handler to an event. The handler is executed at most once per\n     * event type.\n     *\n     * @param {string} event The event to listen to\n     * @param {function} handler The callback that is only to be called once\n     * @return {ListenerDescriptor} The event descriptor\n     */\n    once(event, handler) {\n        const fn = (...args) => {\n            /*  eslint-disable no-invalid-this */\n            handler.apply(this, args);\n            /*  eslint-enable no-invalid-this */\n            setTimeout(() => {\n                this.un(event, fn);\n            }, 0);\n        };\n        return this.on(event, fn);\n    }\n\n    /**\n     * Disable firing a list of events by name. When specified, event handlers for any event type\n     * passed in here will not be called.\n     *\n     * @since 4.0.0\n     * @param {string[]} eventNames an array of event names to disable emissions for\n     * @example\n     * // disable seek and interaction events\n     * wavesurfer.setDisabledEventEmissions(['seek', 'interaction']);\n     */\n    setDisabledEventEmissions(eventNames) {\n        this._disabledEventEmissions = eventNames;\n    }\n\n    /**\n     * plugins borrow part of this class without calling the constructor,\n     * so we have to be careful about _disabledEventEmissions\n     */\n\n    _isDisabledEventEmission(event) {\n        return this._disabledEventEmissions && this._disabledEventEmissions.includes(event);\n    }\n\n    /**\n     * Manually fire an event\n     *\n     * @param {string} event The event to fire manually\n     * @param {...any} args The arguments with which to call the listeners\n     */\n    fireEvent(event, ...args) {\n        if (!this.handlers || this._isDisabledEventEmission(event)) {\n            return;\n        }\n\n        const handlers = this.handlers[event];\n        handlers &&\n            handlers.forEach(fn => {\n                fn(...args);\n            });\n    }\n}\n","const verticalPropMap = {\n    width: 'height',\n    height: 'width',\n\n    overflowX: 'overflowY',\n    overflowY: 'overflowX',\n\n    clientWidth: 'clientHeight',\n    clientHeight: 'clientWidth',\n\n    clientX: 'clientY',\n    clientY: 'clientX',\n\n    scrollWidth: 'scrollHeight',\n    scrollLeft: 'scrollTop',\n\n    offsetLeft: 'offsetTop',\n    offsetTop: 'offsetLeft',\n    offsetHeight: 'offsetWidth',\n    offsetWidth: 'offsetHeight',\n\n    left: 'top',\n    right: 'bottom',\n    top: 'left',\n    bottom: 'right',\n\n    borderRightStyle: 'borderBottomStyle',\n    borderRightWidth: 'borderBottomWidth',\n    borderRightColor: 'borderBottomColor'\n};\n\n/**\n * Convert a horizontally-oriented property name to a vertical one.\n *\n * @param {string} prop A property name\n * @param {bool} vertical Whether the element is oriented vertically\n * @returns {string} prop, converted appropriately\n */\nfunction mapProp(prop, vertical) {\n    if (Object.prototype.hasOwnProperty.call(verticalPropMap, prop)) {\n        return vertical ? verticalPropMap[prop] : prop;\n    } else {\n        return prop;\n    }\n}\n\nconst isProxy = Symbol(\"isProxy\");\n\n/**\n * Returns an appropriately oriented object based on vertical.\n * If vertical is true, attribute getting and setting will be mapped through\n * verticalPropMap, so that e.g. getting the object's .width will give its\n * .height instead.\n * Certain methods of an oriented object will return oriented objects as well.\n * Oriented objects can't be added to the DOM directly since they are Proxy objects\n * and thus fail typechecks. Use domElement to get the actual element for this.\n *\n * @param {object} target The object to be wrapped and oriented\n * @param {bool} vertical Whether the element is oriented vertically\n * @returns {Proxy} An oriented object with attr translation via verticalAttrMap\n * @since 5.0.0\n */\nexport default function withOrientation(target, vertical) {\n    if (target[isProxy]) {\n        return target;\n    } else {\n        return new Proxy(\n            target, {\n                get: function(obj, prop, receiver) {\n                    if (prop === isProxy) {\n                        return true;\n                    } else if (prop === 'domElement') {\n                        return obj;\n                    } else if (prop === 'style') {\n                        return withOrientation(obj.style, vertical);\n                    } else if (prop === 'canvas') {\n                        return withOrientation(obj.canvas, vertical);\n                    } else if (prop === 'getBoundingClientRect') {\n                        return function(...args) {\n                            return withOrientation(obj.getBoundingClientRect(...args), vertical);\n                        };\n                    } else if (prop === 'getContext') {\n                        return function(...args) {\n                            return withOrientation(obj.getContext(...args), vertical);\n                        };\n                    } else {\n                        let value = obj[mapProp(prop, vertical)];\n                        return typeof value == 'function' ? value.bind(obj) : value;\n                    }\n                },\n                set: function(obj, prop, value) {\n                    obj[mapProp(prop, vertical)] = value;\n                    return true;\n                }\n            }\n        );\n    }\n}\n","/**\n * Stops propagation of click event and removes event listener\n *\n * @private\n * @param {object} event The click event\n */\nfunction preventClickHandler(event) {\n    event.stopPropagation();\n    document.body.removeEventListener('click', preventClickHandler, true);\n}\n\n/**\n * Starts listening for click event and prevent propagation\n *\n * @param {object} values Values\n */\nexport default function preventClick(values) {\n    document.body.addEventListener('click', preventClickHandler, true);\n}\n","/* eslint-disable valid-jsdoc */\n/**\n * Returns the `requestAnimationFrame` function for the browser, or a shim with\n * `setTimeout` if the function is not found\n *\n * @return {function} Available `requestAnimationFrame` function for the browser\n */\nexport default (\n    window.requestAnimationFrame ||\n    window.webkitRequestAnimationFrame ||\n    window.mozRequestAnimationFrame ||\n    window.oRequestAnimationFrame ||\n    window.msRequestAnimationFrame ||\n    ((callback, element) => setTimeout(callback, 1000 / 60))\n).bind(window);\n","/**\n * Ignores device silence mode when using the `WebAudio` backend.\n *\n * Many mobile devices contain a hardware button to mute the ringtone for incoming\n * calls and messages. Unfortunately, on some platforms like iOS, this also mutes\n * wavesurfer's audio when using the `WebAudio` backend. This function creates a\n * temporary `<audio>` element that makes sure the WebAudio backend keeps playing\n * when muting the device ringer.\n *\n * @since 5.2.0\n */\nexport default function ignoreSilenceMode() {\n    // Set webaudio context with 1 second silent audio 44100 bit rate buffer to allow playing audio even if silent switch is on the device\n    const silentAC = new AudioContext();\n    const silentBS = silentAC.createBufferSource();\n    silentBS.buffer = silentAC.createBuffer(1, 1, 44100);\n    silentBS.connect(silentAC.destination);\n    silentBS.start();\n\n    // Set the src to a short bit of url encoded as a silent mp3\n    // NOTE The silence MP3 must be high quality, when web audio sounds are played\n    // in parallel the web audio sound is mixed to match the bitrate of the html sound\n    // 0.01 seconds of silence VBR220-260 Joint Stereo 859B\n    const audioData = \"data:audio/mpeg;base64,//uQxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAACcQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA//////////////////////////////////////////////////////////////////8AAABhTEFNRTMuMTAwA8MAAAAAAAAAABQgJAUHQQAB9AAAAnGMHkkIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//sQxAADgnABGiAAQBCqgCRMAAgEAH///////////////7+n/9FTuQsQH//////2NG0jWUGlio5gLQTOtIoeR2WX////X4s9Atb/JRVCbBUpeRUq//////////////////9RUi0f2jn/+xDECgPCjAEQAABN4AAANIAAAAQVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==\";\n\n    // disable iOS Airplay (setting the attribute in js doesn't work)\n    let tmp = document.createElement(\"div\");\n    tmp.innerHTML = '<audio x-webkit-airplay=\"deny\"></audio>';\n\n    let audioSilentMode = tmp.children.item(0);\n    audioSilentMode.src = audioData;\n    audioSilentMode.preload = \"auto\";\n    audioSilentMode.type = \"audio/mpeg\";\n    audioSilentMode.disableRemotePlayback = true;\n\n    // play\n    audioSilentMode.play();\n\n    // cleanup\n    audioSilentMode.remove();\n    tmp.remove();\n}\n","/**\n * Apply a map of styles to an element\n *\n * @param {HTMLElement} el The element that the styles will be applied to\n * @param {Object} styles The map of propName: attribute, both are used as-is\n *\n * @return {HTMLElement} el\n */\nexport default function style(el, styles) {\n    Object.keys(styles).forEach(prop => {\n        if (el.style[prop] !== styles[prop]) {\n            el.style[prop] = styles[prop];\n        }\n    });\n    return el;\n}\n","import * as util from './util';\nimport MultiCanvas from './drawer.multicanvas';\nimport WebAudio from './webaudio';\nimport MediaElement from './mediaelement';\nimport PeakCache from './peakcache';\nimport MediaElementWebAudio from './mediaelement-webaudio';\n\n/*\n * This work is licensed under a BSD-3-Clause License.\n */\n\n/** @external {HTMLElement} https://developer.mozilla.org/en/docs/Web/API/HTMLElement */\n/** @external {OfflineAudioContext} https://developer.mozilla.org/en-US/docs/Web/API/OfflineAudioContext */\n/** @external {File} https://developer.mozilla.org/en-US/docs/Web/API/File */\n/** @external {Blob} https://developer.mozilla.org/en-US/docs/Web/API/Blob */\n/** @external {CanvasRenderingContext2D} https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D */\n/** @external {MediaStreamConstraints} https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints */\n/** @external {AudioNode} https://developer.mozilla.org/de/docs/Web/API/AudioNode */\n\n/**\n * @typedef {Object} WavesurferParams\n * @property {AudioContext} audioContext=null Use your own previously\n * initialized AudioContext or leave blank.\n * @property {number} audioRate=1 Speed at which to play audio. Lower number is\n * slower.\n * @property {ScriptProcessorNode} audioScriptProcessor=null Use your own previously\n * initialized ScriptProcessorNode or leave blank.\n * @property {boolean} autoCenter=true If a scrollbar is present, center the\n * waveform on current progress\n * @property {number} autoCenterRate=5 If autoCenter is active, rate at which the\n * waveform is centered\n * @property {boolean} autoCenterImmediately=false If autoCenter is active, immediately\n * center waveform on current progress\n * @property {string} backend='WebAudio' `'WebAudio'|'MediaElement'|'MediaElementWebAudio'` In most cases\n * you don't have to set this manually. MediaElement is a fallback for unsupported browsers.\n * MediaElementWebAudio allows to use WebAudio API also with big audio files, loading audio like with\n * MediaElement backend (HTML5 audio tag). You have to use the same methods of MediaElement backend for loading and\n * playback, giving also peaks, so the audio data are not decoded. In this way you can use WebAudio features, like filters,\n * also with audio with big duration. For example:\n * ` wavesurfer.load(url | HTMLMediaElement, peaks, preload, duration);\n *   wavesurfer.play();\n *   wavesurfer.setFilter(customFilter);\n * `\n * @property {string} backgroundColor=null Change background color of the\n * waveform container.\n * @property {number} barHeight=1 The height of the wave bars.\n * @property {number} barRadius=0 The radius of the wave bars. Makes bars rounded\n * @property {number} barGap=null The optional spacing between bars of the wave,\n * if not provided will be calculated in legacy format.\n * @property {number} barWidth=null Draw the waveform using bars.\n * @property {number} barMinHeight=null If specified, draw at least a bar of this height,\n * eliminating waveform gaps\n * @property {boolean} closeAudioContext=false Close and nullify all audio\n * contexts when the destroy method is called.\n * @property {!string|HTMLElement} container CSS selector or HTML element where\n * the waveform should be drawn. This is the only required parameter.\n * @property {string} cursorColor='#333' The fill color of the cursor indicating\n * the playhead position.\n * @property {number} cursorWidth=1 Measured in pixels.\n * @property {object} drawingContextAttributes={desynchronized: false} Drawing context\n * attributes.\n * @property {number} duration=null Optional audio length so pre-rendered peaks\n * can be display immediately for example.\n * @property {boolean} fillParent=true Whether to fill the entire container or\n * draw only according to `minPxPerSec`.\n * @property {boolean} forceDecode=false Force decoding of audio using web audio\n * when zooming to get a more detailed waveform.\n * @property {number} height=128 The height of the waveform. Measured in\n * pixels.\n * @property {boolean} hideScrollbar=false Whether to hide the horizontal\n * scrollbar when one would normally be shown.\n * @property {boolean} hideCursor=false Whether to hide the mouse cursor\n * when one would normally be shown by default.\n * @property {boolean} ignoreSilenceMode=false If true, ignores device silence mode\n * when using the `WebAudio` backend.\n * @property {boolean} interact=true Whether the mouse interaction will be\n * enabled at initialization. You can switch this parameter at any time later\n * on.\n * @property {boolean} loopSelection=true (Use with regions plugin) Enable\n * looping of selected regions\n * @property {number} maxCanvasWidth=4000 Maximum width of a single canvas in\n * pixels, excluding a small overlap (2 * `pixelRatio`, rounded up to the next\n * even integer). If the waveform is longer than this value, additional canvases\n * will be used to render the waveform, which is useful for very large waveforms\n * that may be too wide for browsers to draw on a single canvas.\n * @property {boolean} mediaControls=false (Use with backend `MediaElement` or `MediaElementWebAudio`)\n * this enables the native controls for the media element\n * @property {string} mediaType='audio' (Use with backend `MediaElement` or `MediaElementWebAudio`)\n * `'audio'|'video'` ('video' only for `MediaElement`)\n * @property {number} minPxPerSec=20 Minimum number of pixels per second of\n * audio.\n * @property {boolean} normalize=false If true, normalize by the maximum peak\n * instead of 1.0.\n * @property {boolean} partialRender=false Use the PeakCache to improve\n * rendering speed of large waveforms\n * @property {number} pixelRatio=window.devicePixelRatio The pixel ratio used to\n * calculate display\n * @property {PluginDefinition[]} plugins=[] An array of plugin definitions to\n * register during instantiation, they will be directly initialised unless they\n * are added with the `deferInit` property set to true.\n * @property {string} progressColor='#555' The fill color of the part of the\n * waveform behind the cursor. When `progressColor` and `waveColor` are the same\n * the progress wave is not rendered at all.\n * @property {boolean} removeMediaElementOnDestroy=true Set to false to keep the\n * media element in the DOM when the player is destroyed. This is useful when\n * reusing an existing media element via the `loadMediaElement` method.\n * @property {Object} renderer=MultiCanvas Can be used to inject a custom\n * renderer.\n * @property {boolean|number} responsive=false If set to `true` resize the\n * waveform, when the window is resized. This is debounced with a `100ms`\n * timeout by default. If this parameter is a number it represents that timeout.\n * @property {boolean} rtl=false If set to `true`, renders waveform from\n * right-to-left.\n * @property {boolean} scrollParent=false Whether to scroll the container with a\n * lengthy waveform. Otherwise the waveform is shrunk to the container width\n * (see fillParent).\n * @property {number} skipLength=2 Number of seconds to skip with the\n * skipForward() and skipBackward() methods.\n * @property {boolean} splitChannels=false Render with separate waveforms for\n * the channels of the audio\n * @property {SplitChannelOptions} splitChannelsOptions={} Options for splitChannel rendering\n * @property {boolean} vertical=false Render the waveform vertically instead of horizontally.\n * @property {string} waveColor='#999' The fill color of the waveform after the\n * cursor.\n * @property {object} xhr={} XHR options. For example:\n * `let xhr = {\n *     cache: 'default',\n *     mode: 'cors',\n *     method: 'GET',\n *     credentials: 'same-origin',\n *     redirect: 'follow',\n *     referrer: 'client',\n *     requestHeaders: [\n *         {\n *             key: 'Authorization',\n *             value: 'my-token'\n *         }\n *     ]\n * };`\n */\n\n/**\n * @typedef {Object} PluginDefinition\n * @desc The Object used to describe a plugin\n * @example wavesurfer.addPlugin(pluginDefinition);\n * @property {string} name The name of the plugin, the plugin instance will be\n * added as a property to the wavesurfer instance under this name\n * @property {?Object} staticProps The properties that should be added to the\n * wavesurfer instance as static properties\n * @property {?boolean} deferInit Don't initialise plugin\n * automatically\n * @property {Object} params={} The plugin parameters, they are the first parameter\n * passed to the plugin class constructor function\n * @property {PluginClass} instance The plugin instance factory, is called with\n * the dependency specified in extends. Returns the plugin class.\n */\n\n/**\n * @typedef {Object} SplitChannelOptions\n * @desc parameters applied when splitChannels option is true\n * @property {boolean} overlay=false determines whether channels are rendered on top of each other or on separate tracks\n * @property {object} channelColors={} object describing color for each channel. Example:\n * {\n *     0: {\n *         progressColor: 'green',\n *         waveColor: 'pink'\n *     },\n *     1: {\n *         progressColor: 'orange',\n *         waveColor: 'purple'\n *     }\n * }\n * @property {number[]} filterChannels=[] indexes of channels to be hidden from rendering\n * @property {boolean} relativeNormalization=false determines whether\n * normalization is done per channel or maintains proportionality between\n * channels. Only applied when normalize and splitChannels are both true.\n * @property {boolean} splitDragSelection=false determines if drag selection in regions\n * plugin works separately on each channel or only one selection for all channels\n * @since 4.3.0\n */\n\n/**\n * @interface PluginClass\n *\n * @desc This is the interface which is implemented by all plugin classes. Note\n * that this only turns into an observer after being passed through\n * `wavesurfer.addPlugin`.\n *\n * @extends {Observer}\n */\nclass PluginClass {\n    /**\n     * Plugin definition factory\n     *\n     * This function must be used to create a plugin definition which can be\n     * used by wavesurfer to correctly instantiate the plugin.\n     *\n     * It returns a `PluginDefinition` object representing the plugin.\n     *\n     * @param {Object} params={} The plugin params (specific to the plugin)\n     */\n    create(params) {}\n    /**\n     * Construct the plugin\n     *\n     * @param {Object} params={} The plugin params (specific to the plugin)\n     * @param {Object} ws The wavesurfer instance\n     */\n    constructor(params, ws) {}\n    /**\n     * Initialise the plugin\n     *\n     * Start doing something. This is called by\n     * `wavesurfer.initPlugin(pluginName)`\n     */\n    init() {}\n    /**\n     * Destroy the plugin instance\n     *\n     * Stop doing something. This is called by\n     * `wavesurfer.destroyPlugin(pluginName)`\n     */\n    destroy() {}\n}\n\n/**\n * WaveSurfer core library class\n *\n * @extends {Observer}\n * @example\n * const params = {\n *   container: '#waveform',\n *   waveColor: 'violet',\n *   progressColor: 'purple'\n * };\n *\n * // initialise like this\n * const wavesurfer = WaveSurfer.create(params);\n *\n * // or like this ...\n * const wavesurfer = new WaveSurfer(params);\n * wavesurfer.init();\n *\n * // load audio file\n * wavesurfer.load('example/media/demo.wav');\n */\nexport default class WaveSurfer extends util.Observer {\n    /** @private */\n    defaultParams = {\n        audioContext: null,\n        audioScriptProcessor: null,\n        audioRate: 1,\n        autoCenter: true,\n        autoCenterRate: 5,\n        autoCenterImmediately: false,\n        backend: 'WebAudio',\n        backgroundColor: null,\n        barHeight: 1,\n        barRadius: 0,\n        barGap: null,\n        barMinHeight: null,\n        container: null,\n        cursorColor: '#333',\n        cursorWidth: 1,\n        dragSelection: true,\n        drawingContextAttributes: {\n            // Boolean that hints the user agent to reduce the latency\n            // by desynchronizing the canvas paint cycle from the event\n            // loop\n            desynchronized: false\n        },\n        duration: null,\n        fillParent: true,\n        forceDecode: false,\n        height: 128,\n        hideScrollbar: false,\n        hideCursor: false,\n        ignoreSilenceMode: false,\n        interact: true,\n        loopSelection: true,\n        maxCanvasWidth: 4000,\n        mediaContainer: null,\n        mediaControls: false,\n        mediaType: 'audio',\n        minPxPerSec: 20,\n        normalize: false,\n        partialRender: false,\n        pixelRatio:\n            window.devicePixelRatio || screen.deviceXDPI / screen.logicalXDPI,\n        plugins: [],\n        progressColor: '#555',\n        removeMediaElementOnDestroy: true,\n        renderer: MultiCanvas,\n        responsive: false,\n        rtl: false,\n        scrollParent: false,\n        skipLength: 2,\n        splitChannels: false,\n        splitChannelsOptions: {\n            overlay: false,\n            channelColors: {},\n            filterChannels: [],\n            relativeNormalization: false,\n            splitDragSelection: false\n        },\n        vertical: false,\n        waveColor: '#999',\n        xhr: {}\n    };\n\n    /** @private */\n    backends = {\n        MediaElement,\n        WebAudio,\n        MediaElementWebAudio\n    };\n\n    /**\n     * Instantiate this class, call its `init` function and returns it\n     *\n     * @param {WavesurferParams} params The wavesurfer parameters\n     * @return {Object} WaveSurfer instance\n     * @example const wavesurfer = WaveSurfer.create(params);\n     */\n    static create(params) {\n        const wavesurfer = new WaveSurfer(params);\n        return wavesurfer.init();\n    }\n\n    /**\n     * The library version number is available as a static property of the\n     * WaveSurfer class\n     *\n     * @type {String}\n     * @example\n     * console.log('Using wavesurfer.js ' + WaveSurfer.VERSION);\n     */\n    static VERSION = __VERSION__;\n\n    /**\n     * Functions in the `util` property are available as a prototype property to\n     * all instances\n     *\n     * @type {Object}\n     * @example\n     * const wavesurfer = WaveSurfer.create(params);\n     * wavesurfer.util.style(myElement, { background: 'blue' });\n     */\n    util = util;\n\n    /**\n     * Functions in the `util` property are available as a static property of the\n     * WaveSurfer class\n     *\n     * @type {Object}\n     * @example\n     * WaveSurfer.util.style(myElement, { background: 'blue' });\n     */\n    static util = util;\n\n    /**\n     * Initialise wavesurfer instance\n     *\n     * @param {WavesurferParams} params Instantiation options for wavesurfer\n     * @example\n     * const wavesurfer = new WaveSurfer(params);\n     * @returns {this} Wavesurfer instance\n     */\n    constructor(params) {\n        super();\n        /**\n         * Extract relevant parameters (or defaults)\n         * @private\n         */\n        this.params = Object.assign({}, this.defaultParams, params);\n        this.params.splitChannelsOptions = Object.assign(\n            {},\n            this.defaultParams.splitChannelsOptions,\n            params.splitChannelsOptions\n        );\n        /** @private */\n        this.container =\n            'string' == typeof params.container\n                ? document.querySelector(this.params.container)\n                : this.params.container;\n\n        if (!this.container) {\n            throw new Error('Container element not found');\n        }\n\n        if (this.params.mediaContainer == null) {\n            /** @private */\n            this.mediaContainer = this.container;\n        } else if (typeof this.params.mediaContainer == 'string') {\n            /** @private */\n            this.mediaContainer = document.querySelector(\n                this.params.mediaContainer\n            );\n        } else {\n            /** @private */\n            this.mediaContainer = this.params.mediaContainer;\n        }\n\n        if (!this.mediaContainer) {\n            throw new Error('Media Container element not found');\n        }\n\n        if (this.params.maxCanvasWidth <= 1) {\n            throw new Error('maxCanvasWidth must be greater than 1');\n        } else if (this.params.maxCanvasWidth % 2 == 1) {\n            throw new Error('maxCanvasWidth must be an even number');\n        }\n\n        if (this.params.rtl === true) {\n            if (this.params.vertical === true) {\n                util.style(this.container, { transform: 'rotateX(180deg)' });\n            } else {\n                util.style(this.container, { transform: 'rotateY(180deg)' });\n            }\n        }\n\n        if (this.params.backgroundColor) {\n            this.setBackgroundColor(this.params.backgroundColor);\n        }\n\n        /**\n         * @private Used to save the current volume when muting so we can\n         * restore once unmuted\n         * @type {number}\n         */\n        this.savedVolume = 0;\n\n        /**\n         * @private The current muted state\n         * @type {boolean}\n         */\n        this.isMuted = false;\n\n        /**\n         * @private Will hold a list of event descriptors that need to be\n         * canceled on subsequent loads of audio\n         * @type {Object[]}\n         */\n        this.tmpEvents = [];\n\n        /**\n         * @private Holds any running audio downloads\n         * @type {Observer}\n         */\n        this.currentRequest = null;\n        /** @private */\n        this.arraybuffer = null;\n        /** @private */\n        this.drawer = null;\n        /** @private */\n        this.backend = null;\n        /** @private */\n        this.peakCache = null;\n\n        // cache constructor objects\n        if (typeof this.params.renderer !== 'function') {\n            throw new Error('Renderer parameter is invalid');\n        }\n        /**\n         * @private The uninitialised Drawer class\n         */\n        this.Drawer = this.params.renderer;\n        /**\n         * @private The uninitialised Backend class\n         */\n        // Back compat\n        if (this.params.backend == 'AudioElement') {\n            this.params.backend = 'MediaElement';\n        }\n\n        if (\n            (this.params.backend == 'WebAudio' ||\n                this.params.backend === 'MediaElementWebAudio') &&\n            !WebAudio.prototype.supportsWebAudio.call(null)\n        ) {\n            this.params.backend = 'MediaElement';\n        }\n        this.Backend = this.backends[this.params.backend];\n\n        /**\n         * @private map of plugin names that are currently initialised\n         */\n        this.initialisedPluginList = {};\n        /** @private */\n        this.isDestroyed = false;\n\n        /**\n         * Get the current ready status.\n         *\n         * @example const isReady = wavesurfer.isReady;\n         * @return {boolean}\n         */\n        this.isReady = false;\n\n        // responsive debounced event listener. If this.params.responsive is not\n        // set, this is never called. Use 100ms or this.params.responsive as\n        // timeout for the debounce function.\n        let prevWidth = 0;\n        this._onResize = util.debounce(\n            () => {\n                if (\n                    this.drawer.wrapper &&\n                    prevWidth != this.drawer.wrapper.clientWidth &&\n                    !this.params.scrollParent\n                ) {\n                    prevWidth = this.drawer.wrapper.clientWidth;\n                    if (prevWidth) {\n                        // redraw only if waveform container is rendered and has a width\n                        this.drawer.fireEvent('redraw');\n                    }\n                }\n            },\n            typeof this.params.responsive === 'number'\n                ? this.params.responsive\n                : 100\n        );\n\n        return this;\n    }\n\n    /**\n     * Initialise the wave\n     *\n     * @example\n     * var wavesurfer = new WaveSurfer(params);\n     * wavesurfer.init();\n     * @return {this} The wavesurfer instance\n     */\n    init() {\n        this.registerPlugins(this.params.plugins);\n        this.createDrawer();\n        this.createBackend();\n        this.createPeakCache();\n        return this;\n    }\n\n    /**\n     * Add and initialise array of plugins (if `plugin.deferInit` is falsey),\n     * this function is called in the init function of wavesurfer\n     *\n     * @param {PluginDefinition[]} plugins An array of plugin definitions\n     * @emits {WaveSurfer#plugins-registered} Called with the array of plugin definitions\n     * @return {this} The wavesurfer instance\n     */\n    registerPlugins(plugins) {\n        // first instantiate all the plugins\n        plugins.forEach(plugin => this.addPlugin(plugin));\n\n        // now run the init functions\n        plugins.forEach(plugin => {\n            // call init function of the plugin if deferInit is falsey\n            // in that case you would manually use initPlugins()\n            if (!plugin.deferInit) {\n                this.initPlugin(plugin.name);\n            }\n        });\n        this.fireEvent('plugins-registered', plugins);\n        return this;\n    }\n\n    /**\n     * Get a map of plugin names that are currently initialised\n     *\n     * @example wavesurfer.getPlugins();\n     * @return {Object} Object with plugin names\n     */\n    getActivePlugins() {\n        return this.initialisedPluginList;\n    }\n\n    /**\n     * Add a plugin object to wavesurfer\n     *\n     * @param {PluginDefinition} plugin A plugin definition\n     * @emits {WaveSurfer#plugin-added} Called with the name of the plugin that was added\n     * @example wavesurfer.addPlugin(WaveSurfer.minimap());\n     * @return {this} The wavesurfer instance\n     */\n    addPlugin(plugin) {\n        if (!plugin.name) {\n            throw new Error('Plugin does not have a name!');\n        }\n        if (!plugin.instance) {\n            throw new Error(\n                `Plugin ${plugin.name} does not have an instance property!`\n            );\n        }\n\n        // staticProps properties are applied to wavesurfer instance\n        if (plugin.staticProps) {\n            Object.keys(plugin.staticProps).forEach(pluginStaticProp => {\n                /**\n                 * Properties defined in a plugin definition's `staticProps` property are added as\n                 * staticProps properties of the WaveSurfer instance\n                 */\n                this[pluginStaticProp] = plugin.staticProps[pluginStaticProp];\n            });\n        }\n\n        const Instance = plugin.instance;\n\n        // turn the plugin instance into an observer\n        const observerPrototypeKeys = Object.getOwnPropertyNames(\n            util.Observer.prototype\n        );\n        observerPrototypeKeys.forEach(key => {\n            Instance.prototype[key] = util.Observer.prototype[key];\n        });\n\n        /**\n         * Instantiated plugin classes are added as a property of the wavesurfer\n         * instance\n         * @type {Object}\n         */\n        this[plugin.name] = new Instance(plugin.params || {}, this);\n        this.fireEvent('plugin-added', plugin.name);\n        return this;\n    }\n\n    /**\n     * Initialise a plugin\n     *\n     * @param {string} name A plugin name\n     * @emits WaveSurfer#plugin-initialised\n     * @example wavesurfer.initPlugin('minimap');\n     * @return {this} The wavesurfer instance\n     */\n    initPlugin(name) {\n        if (!this[name]) {\n            throw new Error(`Plugin ${name} has not been added yet!`);\n        }\n        if (this.initialisedPluginList[name]) {\n            // destroy any already initialised plugins\n            this.destroyPlugin(name);\n        }\n        this[name].init();\n        this.initialisedPluginList[name] = true;\n        this.fireEvent('plugin-initialised', name);\n        return this;\n    }\n\n    /**\n     * Destroy a plugin\n     *\n     * @param {string} name A plugin name\n     * @emits WaveSurfer#plugin-destroyed\n     * @example wavesurfer.destroyPlugin('minimap');\n     * @returns {this} The wavesurfer instance\n     */\n    destroyPlugin(name) {\n        if (!this[name]) {\n            throw new Error(\n                `Plugin ${name} has not been added yet and cannot be destroyed!`\n            );\n        }\n        if (!this.initialisedPluginList[name]) {\n            throw new Error(\n                `Plugin ${name} is not active and cannot be destroyed!`\n            );\n        }\n        if (typeof this[name].destroy !== 'function') {\n            throw new Error(`Plugin ${name} does not have a destroy function!`);\n        }\n\n        this[name].destroy();\n        delete this.initialisedPluginList[name];\n        this.fireEvent('plugin-destroyed', name);\n        return this;\n    }\n\n    /**\n     * Destroy all initialised plugins. Convenience function to use when\n     * wavesurfer is removed\n     *\n     * @private\n     */\n    destroyAllPlugins() {\n        Object.keys(this.initialisedPluginList).forEach(name =>\n            this.destroyPlugin(name)\n        );\n    }\n\n    /**\n     * Create the drawer and draw the waveform\n     *\n     * @private\n     * @emits WaveSurfer#drawer-created\n     */\n    createDrawer() {\n        this.drawer = new this.Drawer(this.container, this.params);\n        this.drawer.init();\n        this.fireEvent('drawer-created', this.drawer);\n\n        if (this.params.responsive !== false) {\n            window.addEventListener('resize', this._onResize, true);\n            window.addEventListener('orientationchange', this._onResize, true);\n        }\n\n        this.drawer.on('redraw', () => {\n            this.drawBuffer();\n            this.drawer.progress(this.backend.getPlayedPercents());\n        });\n\n        // Click-to-seek\n        this.drawer.on('click', (e, progress) => {\n            setTimeout(() => this.seekTo(progress), 0);\n        });\n\n        // Relay the scroll event from the drawer\n        this.drawer.on('scroll', e => {\n            if (this.params.partialRender) {\n                this.drawBuffer();\n            }\n            this.fireEvent('scroll', e);\n        });\n\n        // Relay the dblclick event from the drawer\n        this.drawer.on('dblclick', (e, progress) => {\n            this.fireEvent('dblclick', e, progress);\n        });\n\n    }\n\n    /**\n     * Create the backend\n     *\n     * @private\n     * @emits WaveSurfer#backend-created\n     */\n    createBackend() {\n        if (this.backend) {\n            this.backend.destroy();\n        }\n\n        this.backend = new this.Backend(this.params);\n        this.backend.init();\n        this.fireEvent('backend-created', this.backend);\n\n        this.backend.on('finish', () => {\n            this.drawer.progress(this.backend.getPlayedPercents());\n            this.fireEvent('finish');\n        });\n        this.backend.on('play', () => this.fireEvent('play'));\n        this.backend.on('pause', () => this.fireEvent('pause'));\n\n        this.backend.on('audioprocess', time => {\n            this.drawer.progress(this.backend.getPlayedPercents());\n            this.fireEvent('audioprocess', time);\n        });\n\n        // only needed for MediaElement and MediaElementWebAudio backend\n        if (\n            this.params.backend === 'MediaElement' ||\n            this.params.backend === 'MediaElementWebAudio'\n        ) {\n            this.backend.on('seek', () => {\n                this.drawer.progress(this.backend.getPlayedPercents());\n            });\n\n            this.backend.on('volume', () => {\n                let newVolume = this.getVolume();\n                this.fireEvent('volume', newVolume);\n\n                if (this.backend.isMuted !== this.isMuted) {\n                    this.isMuted = this.backend.isMuted;\n                    this.fireEvent('mute', this.isMuted);\n                }\n            });\n        }\n    }\n\n    /**\n     * Create the peak cache\n     *\n     * @private\n     */\n    createPeakCache() {\n        if (this.params.partialRender) {\n            this.peakCache = new PeakCache();\n        }\n    }\n\n    /**\n     * Get the duration of the audio clip\n     *\n     * @example const duration = wavesurfer.getDuration();\n     * @return {number} Duration in seconds\n     */\n    getDuration() {\n        return this.backend.getDuration();\n    }\n\n    /**\n     * Get the current playback position\n     *\n     * @example const currentTime = wavesurfer.getCurrentTime();\n     * @return {number} Playback position in seconds\n     */\n    getCurrentTime() {\n        return this.backend.getCurrentTime();\n    }\n\n    /**\n     * Set the current play time in seconds.\n     *\n     * @param {number} seconds A positive number in seconds. E.g. 10 means 10\n     * seconds, 60 means 1 minute\n     */\n    setCurrentTime(seconds) {\n        if (seconds >= this.getDuration()) {\n            this.seekTo(1);\n        } else {\n            this.seekTo(seconds / this.getDuration());\n        }\n    }\n\n    /**\n     * Starts playback from the current position. Optional start and end\n     * measured in seconds can be used to set the range of audio to play.\n     *\n     * @param {?number} start Position to start at\n     * @param {?number} end Position to end at\n     * @emits WaveSurfer#interaction\n     * @return {Promise} Result of the backend play method\n     * @example\n     * // play from second 1 to 5\n     * wavesurfer.play(1, 5);\n     */\n    play(start, end) {\n        if (this.params.ignoreSilenceMode) {\n            // ignores device hardware silence mode\n            util.ignoreSilenceMode();\n        }\n\n        this.fireEvent('interaction', () => this.play(start, end));\n        return this.backend.play(start, end);\n    }\n\n    /**\n     * Set a point in seconds for playback to stop at.\n     *\n     * @param {number} position Position (in seconds) to stop at\n     * @version 3.3.0\n     */\n    setPlayEnd(position) {\n        this.backend.setPlayEnd(position);\n    }\n\n    /**\n     * Stops and pauses playback\n     *\n     * @example wavesurfer.pause();\n     * @return {Promise} Result of the backend pause method\n     */\n    pause() {\n        if (!this.backend.isPaused()) {\n            return this.backend.pause();\n        }\n    }\n\n    /**\n     * Toggle playback\n     *\n     * @example wavesurfer.playPause();\n     * @return {Promise} Result of the backend play or pause method\n     */\n    playPause() {\n        return this.backend.isPaused() ? this.play() : this.pause();\n    }\n\n    /**\n     * Get the current playback state\n     *\n     * @example const isPlaying = wavesurfer.isPlaying();\n     * @return {boolean} False if paused, true if playing\n     */\n    isPlaying() {\n        return !this.backend.isPaused();\n    }\n\n    /**\n     * Skip backward\n     *\n     * @param {?number} seconds Amount to skip back, if not specified `skipLength`\n     * is used\n     * @example wavesurfer.skipBackward();\n     */\n    skipBackward(seconds) {\n        this.skip(-seconds || -this.params.skipLength);\n    }\n\n    /**\n     * Skip forward\n     *\n     * @param {?number} seconds Amount to skip back, if not specified `skipLength`\n     * is used\n     * @example wavesurfer.skipForward();\n     */\n    skipForward(seconds) {\n        this.skip(seconds || this.params.skipLength);\n    }\n\n    /**\n     * Skip a number of seconds from the current position (use a negative value\n     * to go backwards).\n     *\n     * @param {number} offset Amount to skip back or forwards\n     * @example\n     * // go back 2 seconds\n     * wavesurfer.skip(-2);\n     */\n    skip(offset) {\n        const duration = this.getDuration() || 1;\n        let position = this.getCurrentTime() || 0;\n        position = Math.max(0, Math.min(duration, position + (offset || 0)));\n        this.seekAndCenter(position / duration);\n    }\n\n    /**\n     * Seeks to a position and centers the view\n     *\n     * @param {number} progress Between 0 (=beginning) and 1 (=end)\n     * @example\n     * // seek and go to the middle of the audio\n     * wavesurfer.seekTo(0.5);\n     */\n    seekAndCenter(progress) {\n        this.seekTo(progress);\n        this.drawer.recenter(progress);\n    }\n\n    /**\n     * Seeks to a position\n     *\n     * @param {number} progress Between 0 (=beginning) and 1 (=end)\n     * @emits WaveSurfer#interaction\n     * @emits WaveSurfer#seek\n     * @example\n     * // seek to the middle of the audio\n     * wavesurfer.seekTo(0.5);\n     */\n    seekTo(progress) {\n        // return an error if progress is not a number between 0 and 1\n        if (\n            typeof progress !== 'number' ||\n            !isFinite(progress) ||\n            progress < 0 ||\n            progress > 1\n        ) {\n            throw new Error(\n                'Error calling wavesurfer.seekTo, parameter must be a number between 0 and 1!'\n            );\n        }\n        this.fireEvent('interaction', () => this.seekTo(progress));\n\n        const isWebAudioBackend = this.params.backend === 'WebAudio';\n        const paused = this.backend.isPaused();\n\n        if (isWebAudioBackend && !paused) {\n            this.backend.pause();\n        }\n\n        // avoid small scrolls while paused seeking\n        const oldScrollParent = this.params.scrollParent;\n        this.params.scrollParent = false;\n        this.backend.seekTo(progress * this.getDuration());\n        this.drawer.progress(progress);\n\n        if (isWebAudioBackend && !paused) {\n            this.backend.play();\n        }\n\n        this.params.scrollParent = oldScrollParent;\n        this.fireEvent('seek', progress);\n    }\n\n    /**\n     * Stops and goes to the beginning.\n     *\n     * @example wavesurfer.stop();\n     */\n    stop() {\n        this.pause();\n        this.seekTo(0);\n        this.drawer.progress(0);\n    }\n\n    /**\n     * Sets the ID of the audio device to use for output and returns a Promise.\n     *\n     * @param {string} deviceId String value representing underlying output\n     * device\n     * @returns {Promise} `Promise` that resolves to `undefined` when there are\n     * no errors detected.\n     */\n    setSinkId(deviceId) {\n        return this.backend.setSinkId(deviceId);\n    }\n\n    /**\n     * Set the playback volume.\n     *\n     * @param {number} newVolume A value between 0 and 1, 0 being no\n     * volume and 1 being full volume.\n     * @emits WaveSurfer#volume\n     */\n    setVolume(newVolume) {\n        if (this.isMuted === true) {\n            this.savedVolume = newVolume;\n            return;\n        }\n        this.backend.setVolume(newVolume);\n        this.fireEvent('volume', newVolume);\n    }\n\n    /**\n     * Get the playback volume.\n     *\n     * @return {number} A value between 0 and 1, 0 being no\n     * volume and 1 being full volume.\n     */\n    getVolume() {\n        return this.backend.getVolume();\n    }\n\n    /**\n     * Set the playback rate.\n     *\n     * @param {number} rate A positive number. E.g. 0.5 means half the normal\n     * speed, 2 means double speed and so on.\n     * @example wavesurfer.setPlaybackRate(2);\n     */\n    setPlaybackRate(rate) {\n        this.backend.setPlaybackRate(rate);\n    }\n\n    /**\n     * Get the playback rate.\n     *\n     * @return {number} The current playback rate.\n     */\n    getPlaybackRate() {\n        return this.backend.getPlaybackRate();\n    }\n\n    /**\n     * Toggle the volume on and off. If not currently muted it will save the\n     * current volume value and turn the volume off. If currently muted then it\n     * will restore the volume to the saved value, and then rest the saved\n     * value.\n     *\n     * @example wavesurfer.toggleMute();\n     */\n    toggleMute() {\n        this.setMute(!this.isMuted);\n    }\n\n    /**\n     * Enable or disable muted audio\n     *\n     * @param {boolean} mute Specify `true` to mute audio.\n     * @emits WaveSurfer#volume\n     * @emits WaveSurfer#mute\n     * @example\n     * // unmute\n     * wavesurfer.setMute(false);\n     * console.log(wavesurfer.getMute()) // logs false\n     */\n    setMute(mute) {\n        // ignore all muting requests if the audio is already in that state\n        if (mute === this.isMuted) {\n            this.fireEvent('mute', this.isMuted);\n            return;\n        }\n\n        if (this.backend.setMute) {\n            // Backends such as the MediaElement backend have their own handling\n            // of mute, let them handle it.\n            this.backend.setMute(mute);\n            this.isMuted = mute;\n        } else {\n            if (mute) {\n                // If currently not muted then save current volume,\n                // turn off the volume and update the mute properties\n                this.savedVolume = this.backend.getVolume();\n                this.backend.setVolume(0);\n                this.isMuted = true;\n                this.fireEvent('volume', 0);\n            } else {\n                // If currently muted then restore to the saved volume\n                // and update the mute properties\n                this.backend.setVolume(this.savedVolume);\n                this.isMuted = false;\n                this.fireEvent('volume', this.savedVolume);\n            }\n        }\n        this.fireEvent('mute', this.isMuted);\n    }\n\n    /**\n     * Get the current mute status.\n     *\n     * @example const isMuted = wavesurfer.getMute();\n     * @return {boolean} Current mute status\n     */\n    getMute() {\n        return this.isMuted;\n    }\n\n    /**\n     * Get the list of current set filters as an array.\n     *\n     * Filters must be set with setFilters method first\n     *\n     * @return {array} List of enabled filters\n     */\n    getFilters() {\n        return this.backend.filters || [];\n    }\n\n    /**\n     * Toggles `scrollParent` and redraws\n     *\n     * @example wavesurfer.toggleScroll();\n     */\n    toggleScroll() {\n        this.params.scrollParent = !this.params.scrollParent;\n        this.drawBuffer();\n    }\n\n    /**\n     * Toggle mouse interaction\n     *\n     * @example wavesurfer.toggleInteraction();\n     */\n    toggleInteraction() {\n        this.params.interact = !this.params.interact;\n    }\n\n    /**\n     * Get the fill color of the waveform after the cursor.\n     *\n     * @param {?number} channelIdx Optional index of the channel to get its wave color if splitChannels is true\n     * @return {string|object} A CSS color string, or an array of CSS color strings.\n     */\n    getWaveColor(channelIdx = null) {\n        if (this.params.splitChannelsOptions.channelColors[channelIdx]) {\n            return this.params.splitChannelsOptions.channelColors[channelIdx].waveColor;\n        }\n        return this.params.waveColor;\n    }\n\n    /**\n     * Set the fill color of the waveform after the cursor.\n     *\n     * @param {string|object} color A CSS color string, or an array of CSS color strings.\n     * @param {?number} channelIdx Optional index of the channel to set its wave color if splitChannels is true\n     * @example wavesurfer.setWaveColor('#ddd');\n     */\n    setWaveColor(color, channelIdx = null) {\n        if (this.params.splitChannelsOptions.channelColors[channelIdx]) {\n            this.params.splitChannelsOptions.channelColors[channelIdx].waveColor = color;\n        } else {\n            this.params.waveColor = color;\n        }\n        this.drawBuffer();\n    }\n\n    /**\n     * Get the fill color of the waveform behind the cursor.\n     *\n     * @param {?number} channelIdx Optional index of the channel to get its progress color if splitChannels is true\n     * @return {string|object} A CSS color string, or an array of CSS color strings.\n     */\n    getProgressColor(channelIdx = null) {\n        if (this.params.splitChannelsOptions.channelColors[channelIdx]) {\n            return this.params.splitChannelsOptions.channelColors[channelIdx].progressColor;\n        }\n        return this.params.progressColor;\n    }\n\n    /**\n     * Set the fill color of the waveform behind the cursor.\n     *\n     * @param {string|object} color A CSS color string, or an array of CSS color strings.\n     * @param {?number} channelIdx Optional index of the channel to set its progress color if splitChannels is true\n     * @example wavesurfer.setProgressColor('#400');\n     */\n    setProgressColor(color, channelIdx) {\n        if (this.params.splitChannelsOptions.channelColors[channelIdx]) {\n            this.params.splitChannelsOptions.channelColors[channelIdx].progressColor = color;\n        } else {\n            this.params.progressColor = color;\n        }\n        this.drawBuffer();\n    }\n\n    /**\n     * Get the background color of the waveform container.\n     *\n     * @return {string} A CSS color string.\n     */\n    getBackgroundColor() {\n        return this.params.backgroundColor;\n    }\n\n    /**\n     * Set the background color of the waveform container.\n     *\n     * @param {string} color A CSS color string.\n     * @example wavesurfer.setBackgroundColor('#FF00FF');\n     */\n    setBackgroundColor(color) {\n        this.params.backgroundColor = color;\n        util.style(this.container, { background: this.params.backgroundColor });\n    }\n\n    /**\n     * Get the fill color of the cursor indicating the playhead\n     * position.\n     *\n     * @return {string} A CSS color string.\n     */\n    getCursorColor() {\n        return this.params.cursorColor;\n    }\n\n    /**\n     * Set the fill color of the cursor indicating the playhead\n     * position.\n     *\n     * @param {string} color A CSS color string.\n     * @example wavesurfer.setCursorColor('#222');\n     */\n    setCursorColor(color) {\n        this.params.cursorColor = color;\n        this.drawer.updateCursor();\n    }\n\n    /**\n     * Get the height of the waveform.\n     *\n     * @return {number} Height measured in pixels.\n     */\n    getHeight() {\n        return this.params.height;\n    }\n\n    /**\n     * Set the height of the waveform.\n     *\n     * @param {number} height Height measured in pixels.\n     * @example wavesurfer.setHeight(200);\n     */\n    setHeight(height) {\n        this.params.height = height;\n        this.drawer.setHeight(height * this.params.pixelRatio);\n        this.drawBuffer();\n    }\n\n    /**\n     * Hide channels from being drawn on the waveform if splitting channels.\n     *\n     * For example, if we want to draw only the peaks for the right stereo channel:\n     *\n     * const wavesurfer = new WaveSurfer.create({...splitChannels: true});\n     * wavesurfer.load('stereo_audio.mp3');\n     *\n     * wavesurfer.setFilteredChannel([0]); <-- hide left channel peaks.\n     *\n     * @param {array} channelIndices Channels to be filtered out from drawing.\n     * @version 4.0.0\n     */\n    setFilteredChannels(channelIndices) {\n        this.params.splitChannelsOptions.filterChannels = channelIndices;\n        this.drawBuffer();\n    }\n\n    /**\n     * Get the correct peaks for current wave view-port and render wave\n     *\n     * @private\n     * @emits WaveSurfer#redraw\n     */\n    drawBuffer() {\n        const nominalWidth = Math.round(\n            this.getDuration() *\n                this.params.minPxPerSec *\n                this.params.pixelRatio\n        );\n        const parentWidth = this.drawer.getWidth();\n        let width = nominalWidth;\n        // always start at 0 after zooming for scrolling : issue redraw left part\n        let start = 0;\n        let end = Math.max(start + parentWidth, width);\n        // Fill container\n        if (\n            this.params.fillParent &&\n            (!this.params.scrollParent || nominalWidth < parentWidth)\n        ) {\n            width = parentWidth;\n            start = 0;\n            end = width;\n        }\n\n        let peaks;\n        if (this.params.partialRender) {\n            const newRanges = this.peakCache.addRangeToPeakCache(\n                width,\n                start,\n                end\n            );\n            let i;\n            for (i = 0; i < newRanges.length; i++) {\n                peaks = this.backend.getPeaks(\n                    width,\n                    newRanges[i][0],\n                    newRanges[i][1]\n                );\n                this.drawer.drawPeaks(\n                    peaks,\n                    width,\n                    newRanges[i][0],\n                    newRanges[i][1]\n                );\n            }\n        } else {\n            peaks = this.backend.getPeaks(width, start, end);\n            this.drawer.drawPeaks(peaks, width, start, end);\n        }\n        this.fireEvent('redraw', peaks, width);\n    }\n\n    /**\n     * Horizontally zooms the waveform in and out. It also changes the parameter\n     * `minPxPerSec` and enables the `scrollParent` option. Calling the function\n     * with a falsey parameter will reset the zoom state.\n     *\n     * @param {?number} pxPerSec Number of horizontal pixels per second of\n     * audio, if none is set the waveform returns to unzoomed state\n     * @emits WaveSurfer#zoom\n     * @example wavesurfer.zoom(20);\n     */\n    zoom(pxPerSec) {\n        if (!pxPerSec) {\n            this.params.minPxPerSec = this.defaultParams.minPxPerSec;\n            this.params.scrollParent = false;\n        } else {\n            this.params.minPxPerSec = pxPerSec;\n            this.params.scrollParent = true;\n        }\n\n        this.drawBuffer();\n        this.drawer.progress(this.backend.getPlayedPercents());\n\n        this.drawer.recenter(this.getCurrentTime() / this.getDuration());\n        this.fireEvent('zoom', pxPerSec);\n    }\n\n    /**\n     * Decode buffer and load\n     *\n     * @private\n     * @param {ArrayBuffer} arraybuffer Buffer to process\n     */\n    loadArrayBuffer(arraybuffer) {\n        this.decodeArrayBuffer(arraybuffer, data => {\n            if (!this.isDestroyed) {\n                this.loadDecodedBuffer(data);\n            }\n        });\n    }\n\n    /**\n     * Directly load an externally decoded AudioBuffer\n     *\n     * @private\n     * @param {AudioBuffer} buffer Buffer to process\n     * @emits WaveSurfer#ready\n     */\n    loadDecodedBuffer(buffer) {\n        this.backend.load(buffer);\n        this.drawBuffer();\n        this.isReady = true;\n        this.fireEvent('ready');\n    }\n\n    /**\n     * Loads audio data from a Blob or File object\n     *\n     * @param {Blob|File} blob Audio data\n     * @example\n     */\n    loadBlob(blob) {\n        // Create file reader\n        const reader = new FileReader();\n        reader.addEventListener('progress', e => this.onProgress(e));\n        reader.addEventListener('load', e =>\n            this.loadArrayBuffer(e.target.result)\n        );\n        reader.addEventListener('error', () =>\n            this.fireEvent('error', 'Error reading file')\n        );\n        reader.readAsArrayBuffer(blob);\n        this.empty();\n    }\n\n    /**\n     * Loads audio and re-renders the waveform.\n     *\n     * @param {string|HTMLMediaElement} url The url of the audio file or the\n     * audio element with the audio\n     * @param {number[]|Number.<Array[]>} peaks Wavesurfer does not have to decode\n     * the audio to render the waveform if this is specified\n     * @param {?string} preload (Use with backend `MediaElement` and `MediaElementWebAudio`)\n     * `'none'|'metadata'|'auto'` Preload attribute for the media element\n     * @param {?number} duration The duration of the audio. This is used to\n     * render the peaks data in the correct size for the audio duration (as\n     * befits the current `minPxPerSec` and zoom value) without having to decode\n     * the audio.\n     * @returns {void}\n     * @throws Will throw an error if the `url` argument is empty.\n     * @example\n     * // uses fetch or media element to load file (depending on backend)\n     * wavesurfer.load('http://example.com/demo.wav');\n     *\n     * // setting preload attribute with media element backend and supplying\n     * // peaks\n     * wavesurfer.load(\n     *   'http://example.com/demo.wav',\n     *   [0.0218, 0.0183, 0.0165, 0.0198, 0.2137, 0.2888],\n     *   true\n     * );\n     */\n    load(url, peaks, preload, duration) {\n        if (!url) {\n            throw new Error('url parameter cannot be empty');\n        }\n        this.empty();\n        if (preload) {\n            // check whether the preload attribute will be usable and if not log\n            // a warning listing the reasons why not and nullify the variable\n            const preloadIgnoreReasons = {\n                \"Preload is not 'auto', 'none' or 'metadata'\":\n                    ['auto', 'metadata', 'none'].indexOf(preload) === -1,\n                'Peaks are not provided': !peaks,\n                \"Backend is not of type 'MediaElement' or 'MediaElementWebAudio'\":\n                    ['MediaElement', 'MediaElementWebAudio'].indexOf(\n                        this.params.backend\n                    ) === -1,\n                'Url is not of type string': typeof url !== 'string'\n            };\n            const activeReasons = Object.keys(preloadIgnoreReasons).filter(\n                reason => preloadIgnoreReasons[reason]\n            );\n            if (activeReasons.length) {\n                // eslint-disable-next-line no-console\n                console.warn(\n                    'Preload parameter of wavesurfer.load will be ignored because:\\n\\t- ' +\n                        activeReasons.join('\\n\\t- ')\n                );\n                // stop invalid values from being used\n                preload = null;\n            }\n        }\n\n        // loadBuffer(url, peaks, duration) requires that url is a string\n        // but users can pass in a HTMLMediaElement to WaveSurfer\n        if (this.params.backend === 'WebAudio' && url instanceof HTMLMediaElement) {\n            url = url.src;\n        }\n\n        switch (this.params.backend) {\n            case 'WebAudio':\n                return this.loadBuffer(url, peaks, duration);\n            case 'MediaElement':\n            case 'MediaElementWebAudio':\n                return this.loadMediaElement(url, peaks, preload, duration);\n        }\n    }\n\n    /**\n     * Loads audio using Web Audio buffer backend.\n     *\n     * @private\n     * @emits WaveSurfer#waveform-ready\n     * @param {string} url URL of audio file\n     * @param {number[]|Number.<Array[]>} peaks Peaks data\n     * @param {?number} duration Optional duration of audio file\n     * @returns {void}\n     */\n    loadBuffer(url, peaks, duration) {\n        const load = action => {\n            if (action) {\n                this.tmpEvents.push(this.once('ready', action));\n            }\n            return this.getArrayBuffer(url, data => this.loadArrayBuffer(data));\n        };\n\n        if (peaks) {\n            this.backend.setPeaks(peaks, duration);\n            this.drawBuffer();\n            this.fireEvent('waveform-ready');\n            this.tmpEvents.push(this.once('interaction', load));\n        } else {\n            return load();\n        }\n    }\n\n    /**\n     * Either create a media element, or load an existing media element.\n     *\n     * @private\n     * @emits WaveSurfer#waveform-ready\n     * @param {string|HTMLMediaElement} urlOrElt Either a path to a media file, or an\n     * existing HTML5 Audio/Video Element\n     * @param {number[]|Number.<Array[]>} peaks Array of peaks. Required to bypass web audio\n     * dependency\n     * @param {?boolean} preload Set to true if the preload attribute of the\n     * audio element should be enabled\n     * @param {?number} duration Optional duration of audio file\n     */\n    loadMediaElement(urlOrElt, peaks, preload, duration) {\n        let url = urlOrElt;\n\n        if (typeof urlOrElt === 'string') {\n            this.backend.load(url, this.mediaContainer, peaks, preload);\n        } else {\n            const elt = urlOrElt;\n            this.backend.loadElt(elt, peaks);\n\n            // If peaks are not provided,\n            // url = element.src so we can get peaks with web audio\n            url = elt.src;\n        }\n\n        this.tmpEvents.push(\n            this.backend.once('canplay', () => {\n                // ignore when backend was already destroyed\n                if (!this.backend.destroyed) {\n                    this.drawBuffer();\n                    this.isReady = true;\n                    this.fireEvent('ready');\n                }\n            }),\n            this.backend.once('error', err => this.fireEvent('error', err))\n        );\n\n        // If peaks are provided, render them and fire the `waveform-ready` event.\n        if (peaks) {\n            this.backend.setPeaks(peaks, duration);\n            this.drawBuffer();\n            this.fireEvent('waveform-ready');\n        }\n\n        // If no pre-decoded peaks are provided, or are provided with\n        // forceDecode flag, attempt to download the audio file and decode it\n        // with Web Audio.\n        if (\n            (!peaks || this.params.forceDecode) &&\n            this.backend.supportsWebAudio()\n        ) {\n            this.getArrayBuffer(url, arraybuffer => {\n                this.decodeArrayBuffer(arraybuffer, buffer => {\n                    this.backend.buffer = buffer;\n                    this.backend.setPeaks(null);\n                    this.drawBuffer();\n                    this.fireEvent('waveform-ready');\n                });\n            });\n        }\n    }\n\n    /**\n     * Decode an array buffer and pass data to a callback\n     *\n     * @private\n     * @param {Object} arraybuffer The array buffer to decode\n     * @param {function} callback The function to call on complete\n     */\n    decodeArrayBuffer(arraybuffer, callback) {\n        if (!this.isDestroyed) {\n            this.arraybuffer = arraybuffer;\n            this.backend.decodeArrayBuffer(\n                arraybuffer,\n                data => {\n                    // Only use the decoded data if we haven't been destroyed or\n                    // another decode started in the meantime\n                    if (!this.isDestroyed && this.arraybuffer == arraybuffer) {\n                        callback(data);\n                        this.arraybuffer = null;\n                    }\n                },\n                () => this.fireEvent('error', 'Error decoding audiobuffer')\n            );\n        }\n    }\n\n    /**\n     * Load an array buffer using fetch and pass the result to a callback\n     *\n     * @param {string} url The URL of the file object\n     * @param {function} callback The function to call on complete\n     * @returns {util.fetchFile} fetch call\n     * @private\n     */\n    getArrayBuffer(url, callback) {\n        let options = Object.assign(\n            {\n                url: url,\n                responseType: 'arraybuffer'\n            },\n            this.params.xhr\n        );\n        const request = util.fetchFile(options);\n\n        this.currentRequest = request;\n\n        this.tmpEvents.push(\n            request.on('progress', e => {\n                this.onProgress(e);\n            }),\n            request.on('success', data => {\n                callback(data);\n                this.currentRequest = null;\n            }),\n            request.on('error', e => {\n                this.fireEvent('error', e);\n                this.currentRequest = null;\n            })\n        );\n\n        return request;\n    }\n\n    /**\n     * Called while the audio file is loading\n     *\n     * @private\n     * @param {Event} e Progress event\n     * @emits WaveSurfer#loading\n     */\n    onProgress(e) {\n        let percentComplete;\n        if (e.lengthComputable) {\n            percentComplete = e.loaded / e.total;\n        } else {\n            // Approximate progress with an asymptotic\n            // function, and assume downloads in the 1-3 MB range.\n            percentComplete = e.loaded / (e.loaded + 1000000);\n        }\n        this.fireEvent('loading', Math.round(percentComplete * 100), e.target);\n    }\n\n    /**\n     * Exports PCM data into a JSON array and optionally opens in a new window\n     * as valid JSON Blob instance.\n     *\n     * @param {number} length=1024 The scale in which to export the peaks\n     * @param {number} accuracy=10000\n     * @param {?boolean} noWindow Set to true to disable opening a new\n     * window with the JSON\n     * @param {number} start Start index\n     * @param {number} end End index\n     * @return {Promise} Promise that resolves with array of peaks\n     */\n    exportPCM(length, accuracy, noWindow, start, end) {\n        length = length || 1024;\n        start = start || 0;\n        accuracy = accuracy || 10000;\n        noWindow = noWindow || false;\n        const peaks = this.backend.getPeaks(length, start, end);\n        const arr = [].map.call(\n            peaks,\n            val => Math.round(val * accuracy) / accuracy\n        );\n\n        return new Promise((resolve, reject) => {\n            if (!noWindow){\n                const blobJSON = new Blob(\n                    [JSON.stringify(arr)],\n                    {type: 'application/json;charset=utf-8'}\n                );\n                const objURL = URL.createObjectURL(blobJSON);\n                window.open(objURL);\n                URL.revokeObjectURL(objURL);\n            }\n            resolve(arr);\n        });\n    }\n\n    /**\n     * Save waveform image as data URI.\n     *\n     * The default format is `image/png`. Other supported types are\n     * `image/jpeg` and `image/webp`.\n     *\n     * @param {string} format='image/png' A string indicating the image format.\n     * The default format type is `image/png`.\n     * @param {number} quality=1 A number between 0 and 1 indicating the image\n     * quality to use for image formats that use lossy compression such as\n     * `image/jpeg` and `image/webp`.\n     * @param {string} type Image data type to return. Either `dataURL` (default)\n     * or `blob`.\n     * @return {string|string[]|Promise} When using `dataURL` type this returns\n     * a single data URL or an array of data URLs, one for each canvas. When using\n     * `blob` type this returns a `Promise` resolving with an array of `Blob`\n     * instances, one for each canvas.\n     */\n    exportImage(format, quality, type) {\n        if (!format) {\n            format = 'image/png';\n        }\n        if (!quality) {\n            quality = 1;\n        }\n        if (!type) {\n            type = 'dataURL';\n        }\n\n        return this.drawer.getImage(format, quality, type);\n    }\n\n    /**\n     * Cancel any fetch request currently in progress\n     */\n    cancelAjax() {\n        if (this.currentRequest && this.currentRequest.controller) {\n            // If the current request has a ProgressHandler, then its ReadableStream might need to be cancelled too\n            // See: Wavesurfer issue #2042\n            // See Firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1583815\n            if (this.currentRequest._reader) {\n                // Ignoring exceptions thrown by call to cancel()\n                this.currentRequest._reader.cancel().catch(err => {});\n            }\n\n            this.currentRequest.controller.abort();\n            this.currentRequest = null;\n        }\n    }\n\n    /**\n     * @private\n     */\n    clearTmpEvents() {\n        this.tmpEvents.forEach(e => e.un());\n    }\n\n    /**\n     * Display empty waveform.\n     */\n    empty() {\n        if (!this.backend.isPaused()) {\n            this.stop();\n            this.backend.disconnectSource();\n        }\n        this.isReady = false;\n        this.cancelAjax();\n        this.clearTmpEvents();\n\n        // empty drawer\n        this.drawer.progress(0);\n        this.drawer.setWidth(0);\n        this.drawer.drawPeaks({ length: this.drawer.getWidth() }, 0);\n    }\n\n    /**\n     * Remove events, elements and disconnect WebAudio nodes.\n     *\n     * @emits WaveSurfer#destroy\n     */\n    destroy() {\n        this.destroyAllPlugins();\n        this.fireEvent('destroy');\n        this.cancelAjax();\n        this.clearTmpEvents();\n        this.unAll();\n        if (this.params.responsive !== false) {\n            window.removeEventListener('resize', this._onResize, true);\n            window.removeEventListener(\n                'orientationchange',\n                this._onResize,\n                true\n            );\n        }\n        if (this.backend) {\n            this.backend.destroy();\n            // clears memory usage\n            this.backend = null;\n        }\n        if (this.drawer) {\n            this.drawer.destroy();\n        }\n        this.isDestroyed = true;\n        this.isReady = false;\n        this.arraybuffer = null;\n    }\n}\n","import * as util from './util';\n\n// using constants to prevent someone writing the string wrong\nconst PLAYING = 'playing';\nconst PAUSED = 'paused';\nconst FINISHED = 'finished';\n\n/**\n * WebAudio backend\n *\n * @extends {util.Observer}\n */\nexport default class WebAudio extends util.Observer {\n    /** audioContext: allows to process audio with WebAudio API */\n    audioContext = null;\n    /** @private */\n    stateBehaviors = {\n        [PLAYING]: {\n            init() {\n                this.addOnAudioProcess();\n            },\n            getPlayedPercents() {\n                const duration = this.getDuration();\n                return this.getCurrentTime() / duration || 0;\n            },\n            getCurrentTime() {\n                return this.startPosition + this.getPlayedTime();\n            }\n        },\n        [PAUSED]: {\n            init() {\n            },\n            getPlayedPercents() {\n                const duration = this.getDuration();\n                return this.getCurrentTime() / duration || 0;\n            },\n            getCurrentTime() {\n                return this.startPosition;\n            }\n        },\n        [FINISHED]: {\n            init() {\n                this.fireEvent('finish');\n            },\n            getPlayedPercents() {\n                return 1;\n            },\n            getCurrentTime() {\n                return this.getDuration();\n            }\n        }\n    };\n\n    /**\n     * Does the browser support this backend\n     *\n     * @return {boolean} Whether or not this browser supports this backend\n     */\n    supportsWebAudio() {\n        return !!(window.AudioContext || window.webkitAudioContext);\n    }\n\n    /**\n     * Get the audio context used by this backend or create one\n     *\n     * @return {AudioContext} Existing audio context, or creates a new one\n     */\n    getAudioContext() {\n        if (!window.WaveSurferAudioContext) {\n            window.WaveSurferAudioContext = new (window.AudioContext ||\n                window.webkitAudioContext)();\n        }\n        return window.WaveSurferAudioContext;\n    }\n\n    /**\n     * Get the offline audio context used by this backend or create one\n     *\n     * @param {number} sampleRate The sample rate to use\n     * @return {OfflineAudioContext} Existing offline audio context, or creates\n     * a new one\n     */\n    getOfflineAudioContext(sampleRate) {\n        if (!window.WaveSurferOfflineAudioContext) {\n            window.WaveSurferOfflineAudioContext = new (window.OfflineAudioContext ||\n                window.webkitOfflineAudioContext)(1, 2, sampleRate);\n        }\n        return window.WaveSurferOfflineAudioContext;\n    }\n\n    /**\n     * Construct the backend\n     *\n     * @param {WavesurferParams} params Wavesurfer parameters\n     */\n    constructor(params) {\n        super();\n        /** @private */\n        this.params = params;\n        /** ac: Audio Context instance */\n        this.ac =\n            params.audioContext ||\n            (this.supportsWebAudio() ? this.getAudioContext() : {});\n        /**@private */\n        this.lastPlay = this.ac.currentTime;\n        /** @private */\n        this.startPosition = 0;\n        /** @private */\n        this.scheduledPause = null;\n        /** @private */\n        this.states = {\n            [PLAYING]: Object.create(this.stateBehaviors[PLAYING]),\n            [PAUSED]: Object.create(this.stateBehaviors[PAUSED]),\n            [FINISHED]: Object.create(this.stateBehaviors[FINISHED])\n        };\n        /** @private */\n        this.buffer = null;\n        /** @private */\n        this.filters = [];\n        /** gainNode: allows to control audio volume */\n        this.gainNode = null;\n        /** @private */\n        this.mergedPeaks = null;\n        /** @private */\n        this.offlineAc = null;\n        /** @private */\n        this.peaks = null;\n        /** @private */\n        this.playbackRate = 1;\n        /** analyser: provides audio analysis information */\n        this.analyser = null;\n        /** scriptNode: allows processing audio */\n        this.scriptNode = null;\n        /** @private */\n        this.source = null;\n        /** @private */\n        this.splitPeaks = [];\n        /** @private */\n        this.state = null;\n        /** @private */\n        this.explicitDuration = params.duration;\n        /** @private */\n        this.sinkStreamDestination = null;\n        /** @private */\n        this.sinkAudioElement = null;\n        /**\n         * Boolean indicating if the backend was destroyed.\n         */\n        this.destroyed = false;\n    }\n\n    /**\n     * Initialise the backend, called in `wavesurfer.createBackend()`\n     */\n    init() {\n        this.createVolumeNode();\n        this.createScriptNode();\n        this.createAnalyserNode();\n\n        this.setState(PAUSED);\n        this.setPlaybackRate(this.params.audioRate);\n        this.setLength(0);\n    }\n\n    /** @private */\n    disconnectFilters() {\n        if (this.filters) {\n            this.filters.forEach(filter => {\n                filter && filter.disconnect();\n            });\n            this.filters = null;\n            // Reconnect direct path\n            this.analyser.connect(this.gainNode);\n        }\n    }\n\n    /**\n     * @private\n     *\n     * @param {string} state The new state\n     */\n    setState(state) {\n        if (this.state !== this.states[state]) {\n            this.state = this.states[state];\n            this.state.init.call(this);\n        }\n    }\n\n    /**\n     * Unpacked `setFilters()`\n     *\n     * @param {...AudioNode} filters One or more filters to set\n     */\n    setFilter(...filters) {\n        this.setFilters(filters);\n    }\n\n    /**\n     * Insert custom Web Audio nodes into the graph\n     *\n     * @param {AudioNode[]} filters Packed filters array\n     * @example\n     * const lowpass = wavesurfer.backend.ac.createBiquadFilter();\n     * wavesurfer.backend.setFilter(lowpass);\n     */\n    setFilters(filters) {\n        // Remove existing filters\n        this.disconnectFilters();\n\n        // Insert filters if filter array not empty\n        if (filters && filters.length) {\n            this.filters = filters;\n\n            // Disconnect direct path before inserting filters\n            this.analyser.disconnect();\n\n            // Connect each filter in turn\n            filters\n                .reduce((prev, curr) => {\n                    prev.connect(curr);\n                    return curr;\n                }, this.analyser)\n                .connect(this.gainNode);\n        }\n    }\n    /** Create ScriptProcessorNode to process audio */\n    createScriptNode() {\n        if (this.params.audioScriptProcessor) {\n            this.scriptNode = this.params.audioScriptProcessor;\n            this.scriptNode.connect(this.ac.destination);\n        }\n    }\n\n    /** @private */\n    addOnAudioProcess() {\n        const loop = () => {\n            const time = this.getCurrentTime();\n\n            if (time >= this.getDuration() && this.state !== this.states[FINISHED]) {\n                this.setState(FINISHED);\n                this.fireEvent('pause');\n            } else if (time >= this.scheduledPause && this.state !== this.states[PAUSED]) {\n                this.pause();\n            } else if (this.state === this.states[PLAYING]) {\n                this.fireEvent('audioprocess', time);\n                util.frame(loop)();\n            }\n        };\n\n        loop();\n    }\n\n    /** Create analyser node to perform audio analysis */\n    createAnalyserNode() {\n        this.analyser = this.ac.createAnalyser();\n        this.analyser.connect(this.gainNode);\n    }\n\n    /**\n     * Create the gain node needed to control the playback volume.\n     *\n     */\n    createVolumeNode() {\n        // Create gain node using the AudioContext\n        if (this.ac.createGain) {\n            this.gainNode = this.ac.createGain();\n        } else {\n            this.gainNode = this.ac.createGainNode();\n        }\n        // Add the gain node to the graph\n        this.gainNode.connect(this.ac.destination);\n    }\n\n    /**\n     * Set the sink id for the media player\n     *\n     * @param {string} deviceId String value representing audio device id.\n     * @returns {Promise} A Promise that resolves to `undefined` when there\n     * are no errors.\n     */\n    setSinkId(deviceId) {\n        if (deviceId) {\n            /**\n             * The webaudio API doesn't currently support setting the device\n             * output. Here we create an HTMLAudioElement, connect the\n             * webaudio stream to that element and setSinkId there.\n             */\n            if (!this.sinkAudioElement) {\n                this.sinkAudioElement = new window.Audio();\n                // autoplay is necessary since we're not invoking .play()\n                this.sinkAudioElement.autoplay = true;\n            }\n            if (!this.sinkAudioElement.setSinkId) {\n                return Promise.reject(\n                    new Error('setSinkId is not supported in your browser')\n                );\n            }\n            if (!this.sinkStreamDestination) {\n                this.sinkStreamDestination = this.ac.createMediaStreamDestination();\n            }\n            this.gainNode.disconnect();\n            this.gainNode.connect(this.sinkStreamDestination);\n            this.sinkAudioElement.srcObject = this.sinkStreamDestination.stream;\n\n            return this.sinkAudioElement.setSinkId(deviceId);\n        } else {\n            return Promise.reject(new Error('Invalid deviceId: ' + deviceId));\n        }\n    }\n\n    /**\n     * Set the audio volume\n     *\n     * @param {number} value A floating point value between 0 and 1.\n     */\n    setVolume(value) {\n        this.gainNode.gain.setValueAtTime(value, this.ac.currentTime);\n    }\n\n    /**\n     * Get the current volume\n     *\n     * @return {number} value A floating point value between 0 and 1.\n     */\n    getVolume() {\n        return this.gainNode.gain.value;\n    }\n\n    /**\n     * Decode an array buffer and pass data to a callback\n     *\n     * @private\n     * @param {ArrayBuffer} arraybuffer The array buffer to decode\n     * @param {function} callback The function to call on complete.\n     * @param {function} errback The function to call on error.\n     */\n    decodeArrayBuffer(arraybuffer, callback, errback) {\n        if (!this.offlineAc) {\n            this.offlineAc = this.getOfflineAudioContext(\n                this.ac && this.ac.sampleRate ? this.ac.sampleRate : 44100\n            );\n        }\n        if ('webkitAudioContext' in window) {\n            // Safari: no support for Promise-based decodeAudioData enabled\n            // Enable it in Safari using the Experimental Features > Modern WebAudio API option\n            this.offlineAc.decodeAudioData(\n                arraybuffer,\n                data => callback(data),\n                errback\n            );\n        } else {\n            this.offlineAc.decodeAudioData(arraybuffer).then(\n                (data) => callback(data)\n            ).catch(\n                (err) => errback(err)\n            );\n        }\n    }\n\n    /**\n     * Set pre-decoded peaks\n     *\n     * @param {number[]|Number.<Array[]>} peaks Peaks data\n     * @param {?number} duration Explicit duration\n     */\n    setPeaks(peaks, duration) {\n        if (duration != null) {\n            this.explicitDuration = duration;\n        }\n        this.peaks = peaks;\n    }\n\n    /**\n     * Set the rendered length (different from the length of the audio)\n     *\n     * @param {number} length The rendered length\n     */\n    setLength(length) {\n        // No resize, we can preserve the cached peaks.\n        if (this.mergedPeaks && length == 2 * this.mergedPeaks.length - 1 + 2) {\n            return;\n        }\n\n        this.splitPeaks = [];\n        this.mergedPeaks = [];\n        // Set the last element of the sparse array so the peak arrays are\n        // appropriately sized for other calculations.\n        const channels = this.buffer ? this.buffer.numberOfChannels : 1;\n        let c;\n        for (c = 0; c < channels; c++) {\n            this.splitPeaks[c] = [];\n            this.splitPeaks[c][2 * (length - 1)] = 0;\n            this.splitPeaks[c][2 * (length - 1) + 1] = 0;\n        }\n        this.mergedPeaks[2 * (length - 1)] = 0;\n        this.mergedPeaks[2 * (length - 1) + 1] = 0;\n    }\n\n    /**\n     * Compute the max and min value of the waveform when broken into <length> subranges.\n     *\n     * @param {number} length How many subranges to break the waveform into.\n     * @param {number} first First sample in the required range.\n     * @param {number} last Last sample in the required range.\n     * @return {number[]|Number.<Array[]>} Array of 2*<length> peaks or array of arrays of\n     * peaks consisting of (max, min) values for each subrange.\n     */\n    getPeaks(length, first, last) {\n        if (this.peaks) {\n            return this.peaks;\n        }\n        if (!this.buffer) {\n            return [];\n        }\n\n        first = first || 0;\n        last = last || length - 1;\n\n        this.setLength(length);\n\n        if (!this.buffer) {\n            return this.params.splitChannels\n                ? this.splitPeaks\n                : this.mergedPeaks;\n        }\n\n        /**\n         * The following snippet fixes a buffering data issue on the Safari\n         * browser which returned undefined It creates the missing buffer based\n         * on 1 channel, 4096 samples and the sampleRate from the current\n         * webaudio context 4096 samples seemed to be the best fit for rendering\n         * will review this code once a stable version of Safari TP is out\n         */\n        if (!this.buffer.length) {\n            const newBuffer = this.createBuffer(1, 4096, this.sampleRate);\n            this.buffer = newBuffer.buffer;\n        }\n\n        const sampleSize = this.buffer.length / length;\n        const sampleStep = ~~(sampleSize / 10) || 1;\n        const channels = this.buffer.numberOfChannels;\n        let c;\n\n        for (c = 0; c < channels; c++) {\n            const peaks = this.splitPeaks[c];\n            const chan = this.buffer.getChannelData(c);\n            let i;\n\n            for (i = first; i <= last; i++) {\n                const start = ~~(i * sampleSize);\n                const end = ~~(start + sampleSize);\n                /**\n                 * Initialize the max and min to the first sample of this\n                 * subrange, so that even if the samples are entirely\n                 * on one side of zero, we still return the true max and\n                 * min values in the subrange.\n                 */\n                let min = chan[start];\n                let max = min;\n                let j;\n\n                for (j = start; j < end; j += sampleStep) {\n                    const value = chan[j];\n\n                    if (value > max) {\n                        max = value;\n                    }\n\n                    if (value < min) {\n                        min = value;\n                    }\n                }\n\n                peaks[2 * i] = max;\n                peaks[2 * i + 1] = min;\n\n                if (c == 0 || max > this.mergedPeaks[2 * i]) {\n                    this.mergedPeaks[2 * i] = max;\n                }\n\n                if (c == 0 || min < this.mergedPeaks[2 * i + 1]) {\n                    this.mergedPeaks[2 * i + 1] = min;\n                }\n            }\n        }\n\n        return this.params.splitChannels ? this.splitPeaks : this.mergedPeaks;\n    }\n\n    /**\n     * Get the position from 0 to 1\n     *\n     * @return {number} Position\n     */\n    getPlayedPercents() {\n        return this.state.getPlayedPercents.call(this);\n    }\n\n    /** @private */\n    disconnectSource() {\n        if (this.source) {\n            this.source.disconnect();\n        }\n    }\n    /**\n     * Destroy all references with WebAudio, disconnecting audio nodes and closing Audio Context\n     */\n    destroyWebAudio() {\n        this.disconnectFilters();\n        this.disconnectSource();\n        this.gainNode.disconnect();\n        this.scriptNode && this.scriptNode.disconnect();\n        this.analyser.disconnect();\n\n        // close the audioContext if closeAudioContext option is set to true\n        if (this.params.closeAudioContext) {\n            // check if browser supports AudioContext.close()\n            if (\n                typeof this.ac.close === 'function' &&\n                this.ac.state != 'closed'\n            ) {\n                this.ac.close();\n            }\n            // clear the reference to the audiocontext\n            this.ac = null;\n            // clear the actual audiocontext, either passed as param or the\n            // global singleton\n            if (!this.params.audioContext) {\n                window.WaveSurferAudioContext = null;\n            } else {\n                this.params.audioContext = null;\n            }\n            // clear the offlineAudioContext\n            window.WaveSurferOfflineAudioContext = null;\n        }\n\n        // disconnect resources used by setSinkId\n        if (this.sinkStreamDestination) {\n            this.sinkAudioElement.pause();\n            this.sinkAudioElement.srcObject = null;\n            this.sinkStreamDestination.disconnect();\n            this.sinkStreamDestination = null;\n        }\n    }\n    /**\n     * This is called when wavesurfer is destroyed\n     */\n    destroy() {\n        if (!this.isPaused()) {\n            this.pause();\n        }\n        this.unAll();\n        this.buffer = null;\n        this.destroyed = true;\n\n        this.destroyWebAudio();\n    }\n\n    /**\n     * Loaded a decoded audio buffer\n     *\n     * @param {Object} buffer Decoded audio buffer to load\n     */\n    load(buffer) {\n        this.startPosition = 0;\n        this.lastPlay = this.ac.currentTime;\n        this.buffer = buffer;\n        this.createSource();\n    }\n\n    /** @private */\n    createSource() {\n        this.disconnectSource();\n        this.source = this.ac.createBufferSource();\n\n        // adjust for old browsers\n        this.source.start = this.source.start || this.source.noteGrainOn;\n        this.source.stop = this.source.stop || this.source.noteOff;\n\n        this.setPlaybackRate(this.playbackRate);\n        this.source.buffer = this.buffer;\n        this.source.connect(this.analyser);\n    }\n\n    /**\n     * @private\n     *\n     * some browsers require an explicit call to #resume before they will play back audio\n     */\n    resumeAudioContext() {\n        if (this.ac.state == 'suspended') {\n            this.ac.resume && this.ac.resume();\n        }\n    }\n\n    /**\n     * Used by `wavesurfer.isPlaying()` and `wavesurfer.playPause()`\n     *\n     * @return {boolean} Whether or not this backend is currently paused\n     */\n    isPaused() {\n        return this.state !== this.states[PLAYING];\n    }\n\n    /**\n     * Used by `wavesurfer.getDuration()`\n     *\n     * @return {number} Duration of loaded buffer\n     */\n    getDuration() {\n        if (this.explicitDuration) {\n            return this.explicitDuration;\n        }\n        if (!this.buffer) {\n            return 0;\n        }\n        return this.buffer.duration;\n    }\n\n    /**\n     * Used by `wavesurfer.seekTo()`\n     *\n     * @param {number} start Position to start at in seconds\n     * @param {number} end Position to end at in seconds\n     * @return {{start: number, end: number}} Object containing start and end\n     * positions\n     */\n    seekTo(start, end) {\n        if (!this.buffer) {\n            return;\n        }\n\n        this.scheduledPause = null;\n\n        if (start == null) {\n            start = this.getCurrentTime();\n            if (start >= this.getDuration()) {\n                start = 0;\n            }\n        }\n        if (end == null) {\n            end = this.getDuration();\n        }\n\n        this.startPosition = start;\n        this.lastPlay = this.ac.currentTime;\n\n        if (this.state === this.states[FINISHED]) {\n            this.setState(PAUSED);\n        }\n\n        return {\n            start: start,\n            end: end\n        };\n    }\n\n    /**\n     * Get the playback position in seconds\n     *\n     * @return {number} The playback position in seconds\n     */\n    getPlayedTime() {\n        return (this.ac.currentTime - this.lastPlay) * this.playbackRate;\n    }\n\n    /**\n     * Plays the loaded audio region.\n     *\n     * @param {number} start Start offset in seconds, relative to the beginning\n     * of a clip.\n     * @param {number} end When to stop relative to the beginning of a clip.\n     */\n    play(start, end) {\n        if (!this.buffer) {\n            return;\n        }\n\n        // need to re-create source on each playback\n        this.createSource();\n\n        const adjustedTime = this.seekTo(start, end);\n\n        start = adjustedTime.start;\n        end = adjustedTime.end;\n\n        this.scheduledPause = end;\n\n        this.source.start(0, start);\n\n        this.resumeAudioContext();\n\n        this.setState(PLAYING);\n\n        this.fireEvent('play');\n    }\n\n    /**\n     * Pauses the loaded audio.\n     */\n    pause() {\n        this.scheduledPause = null;\n\n        this.startPosition += this.getPlayedTime();\n        try {\n            this.source && this.source.stop(0);\n        } catch (err) {\n            // Calling stop can throw the following 2 errors:\n            // - RangeError (The value specified for when is negative.)\n            // - InvalidStateNode (The node has not been started by calling start().)\n            // We can safely ignore both errors, because:\n            // - The range is surely correct\n            // - The node might not have been started yet, in which case we just want to carry on without causing any trouble.\n        }\n\n        this.setState(PAUSED);\n\n        this.fireEvent('pause');\n    }\n\n    /**\n     * Returns the current time in seconds relative to the audio-clip's\n     * duration.\n     *\n     * @return {number} The current time in seconds\n     */\n    getCurrentTime() {\n        return this.state.getCurrentTime.call(this);\n    }\n\n    /**\n     * Returns the current playback rate. (0=no playback, 1=normal playback)\n     *\n     * @return {number} The current playback rate\n     */\n    getPlaybackRate() {\n        return this.playbackRate;\n    }\n\n    /**\n     * Set the audio source playback rate.\n     *\n     * @param {number} value The playback rate to use\n     */\n    setPlaybackRate(value) {\n        this.playbackRate = value || 1;\n        this.source && this.source.playbackRate.setValueAtTime(\n            this.playbackRate,\n            this.ac.currentTime\n        );\n    }\n\n    /**\n     * Set a point in seconds for playback to stop at.\n     *\n     * @param {number} end Position to end at\n     * @version 3.3.0\n     */\n    setPlayEnd(end) {\n        this.scheduledPause = end;\n    }\n}\n","/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing. The function also has a property 'clear' \n * that is a function which will clear the timer to prevent previously scheduled executions. \n *\n * @source underscore.js\n * @see http://unscriptable.com/2009/03/20/debouncing-javascript-methods/\n * @param {Function} function to wrap\n * @param {Number} timeout in ms (`100`)\n * @param {Boolean} whether to execute at the beginning (`false`)\n * @api public\n */\nfunction debounce(func, wait, immediate){\n  var timeout, args, context, timestamp, result;\n  if (null == wait) wait = 100;\n\n  function later() {\n    var last = Date.now() - timestamp;\n\n    if (last < wait && last >= 0) {\n      timeout = setTimeout(later, wait - last);\n    } else {\n      timeout = null;\n      if (!immediate) {\n        result = func.apply(context, args);\n        context = args = null;\n      }\n    }\n  };\n\n  var debounced = function(){\n    context = this;\n    args = arguments;\n    timestamp = Date.now();\n    var callNow = immediate && !timeout;\n    if (!timeout) timeout = setTimeout(later, wait);\n    if (callNow) {\n      result = func.apply(context, args);\n      context = args = null;\n    }\n\n    return result;\n  };\n\n  debounced.clear = function() {\n    if (timeout) {\n      clearTimeout(timeout);\n      timeout = null;\n    }\n  };\n  \n  debounced.flush = function() {\n    if (timeout) {\n      result = func.apply(context, args);\n      context = args = null;\n      \n      clearTimeout(timeout);\n      timeout = null;\n    }\n  };\n\n  return debounced;\n};\n\n// Adds compatibility for ES modules\ndebounce.debounce = debounce;\n\nmodule.exports = debounce;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/wavesurfer.js\");\n","/*! js-cookie v3.0.5 | MIT */\n/* eslint-disable no-var */\nfunction assign (target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i];\n    for (var key in source) {\n      target[key] = source[key];\n    }\n  }\n  return target\n}\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\nvar defaultConverter = {\n  read: function (value) {\n    if (value[0] === '\"') {\n      value = value.slice(1, -1);\n    }\n    return value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent)\n  },\n  write: function (value) {\n    return encodeURIComponent(value).replace(\n      /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,\n      decodeURIComponent\n    )\n  }\n};\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\n\nfunction init (converter, defaultAttributes) {\n  function set (name, value, attributes) {\n    if (typeof document === 'undefined') {\n      return\n    }\n\n    attributes = assign({}, defaultAttributes, attributes);\n\n    if (typeof attributes.expires === 'number') {\n      attributes.expires = new Date(Date.now() + attributes.expires * 864e5);\n    }\n    if (attributes.expires) {\n      attributes.expires = attributes.expires.toUTCString();\n    }\n\n    name = encodeURIComponent(name)\n      .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)\n      .replace(/[()]/g, escape);\n\n    var stringifiedAttributes = '';\n    for (var attributeName in attributes) {\n      if (!attributes[attributeName]) {\n        continue\n      }\n\n      stringifiedAttributes += '; ' + attributeName;\n\n      if (attributes[attributeName] === true) {\n        continue\n      }\n\n      // Considers RFC 6265 section 5.2:\n      // ...\n      // 3.  If the remaining unparsed-attributes contains a %x3B (\";\")\n      //     character:\n      // Consume the characters of the unparsed-attributes up to,\n      // not including, the first %x3B (\";\") character.\n      // ...\n      stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n    }\n\n    return (document.cookie =\n      name + '=' + converter.write(value, name) + stringifiedAttributes)\n  }\n\n  function get (name) {\n    if (typeof document === 'undefined' || (arguments.length && !name)) {\n      return\n    }\n\n    // To prevent the for loop in the first place assign an empty array\n    // in case there are no cookies at all.\n    var cookies = document.cookie ? document.cookie.split('; ') : [];\n    var jar = {};\n    for (var i = 0; i < cookies.length; i++) {\n      var parts = cookies[i].split('=');\n      var value = parts.slice(1).join('=');\n\n      try {\n        var found = decodeURIComponent(parts[0]);\n        jar[found] = converter.read(value, found);\n\n        if (name === found) {\n          break\n        }\n      } catch (e) {}\n    }\n\n    return name ? jar[name] : jar\n  }\n\n  return Object.create(\n    {\n      set,\n      get,\n      remove: function (name, attributes) {\n        set(\n          name,\n          '',\n          assign({}, attributes, {\n            expires: -1\n          })\n        );\n      },\n      withAttributes: function (attributes) {\n        return init(this.converter, assign({}, this.attributes, attributes))\n      },\n      withConverter: function (converter) {\n        return init(assign({}, this.converter, converter), this.attributes)\n      }\n    },\n    {\n      attributes: { value: Object.freeze(defaultAttributes) },\n      converter: { value: Object.freeze(converter) }\n    }\n  )\n}\n\nvar api = init(defaultConverter, { path: '/' });\n/* eslint-enable no-var */\n\nexport { api as default };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/*\nStimulus Webpack Helpers 1.0.0\nCopyright © 2021 Basecamp, LLC\n */\nfunction definitionsFromContext(context) {\n    return context.keys()\n        .map((key) => definitionForModuleWithContextAndKey(context, key))\n        .filter((value) => value);\n}\nfunction definitionForModuleWithContextAndKey(context, key) {\n    const identifier = identifierForContextKey(key);\n    if (identifier) {\n        return definitionForModuleAndIdentifier(context(key), identifier);\n    }\n}\nfunction definitionForModuleAndIdentifier(module, identifier) {\n    const controllerConstructor = module.default;\n    if (typeof controllerConstructor == \"function\") {\n        return { identifier, controllerConstructor };\n    }\n}\nfunction identifierForContextKey(key) {\n    const logicalName = (key.match(/^(?:\\.\\/)?(.+)(?:[_-]controller\\..+?)$/) || [])[1];\n    if (logicalName) {\n        return logicalName.replace(/_/g, \"-\").replace(/\\//g, \"--\");\n    }\n}\n\nexport { definitionForModuleAndIdentifier, definitionForModuleWithContextAndKey, definitionsFromContext, identifierForContextKey };\n","// Load all the controllers within this directory and all subdirectories.\n// Controller files must be named *_controller.js.\n\nimport { Application } from 'stimulus'\nimport { definitionsFromContext } from 'stimulus/webpack-helpers'\n\nconst application = Application.start()\nconst context = require.context('/', true, /_controller\\.js$/)\nconst contextComponents = require.context('../../components/components', true, /_controller.js$/)\napplication.load(\n  definitionsFromContext(context).concat(\n    definitionsFromContext(contextComponents)\n  )\n)\n"],"names":["map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports","version","extractAdditionalParams","reduce","t","n","events","additionalParams","concat","LocalStorage","get","this","store","getItem","JSON","parse","set","setItem","stringify","console","error","remove","removeItem","globalThis","localStorage","ensureLocalStorage","STORE","LIMIT","FREE","getCache","setCache","length","entries","sort","slice","assign","purgeOldest","limited","makeKey","storeQueryForObject","i","Date","now","isUndefined","isFunction","DEFAULT_ALGOLIA_AGENTS","addAlgoliaAgent","_ua","indexOf","push","getVersion","__rest","r","prototype","hasOwnProperty","call","getOwnPropertySymbols","propertyIsEnumerable","makeSendEvents","_userHasOptedOut","Promise","_apiKey","_appId","headers","_userToken","_anonymousUserToken","setAnonymousUserToken","inferQueryID","queryID","eventType","isValidEventForQueryIdLookup","objectIDs","objectData","getQueryForObject","index","objectIDsWithInferredQueryID","addQueryId","filters","userToken","authenticatedUserToken","_authenticatedUserToken","encodeURIComponent","s","a","c","u","join","sendRequest","_endpointOrigin","then","isPromise","filter","eventSubtype","forEach","removeQueryForObjects","purgePurchased","createUUID","replace","Math","random","toString","COOKIE_KEY","MONTH","setUserToken","Boolean","navigator","cookieEnabled","supportsCookies","document","cookie","split","charAt","substring","getCookie","setTime","getTime","toUTCString","setCookie","_cookieDuration","_onUserTokenChangeCallback","getUserToken","onUserTokenChange","immediate","setAuthenticatedUserToken","_onAuthenticatedUserTokenChangeCallback","getAuthenticatedUserToken","onAuthenticatedUserTokenChange","addEventType","addEventTypeAndSubtype","clickedObjectIDsAfterSearch","arguments","sendEvents","clickedObjectIDs","clickedFilters","convertedObjectIDsAfterSearch","addedToCartObjectIDsAfterSearch","purchasedObjectIDsAfterSearch","convertedObjectIDs","addedToCartObjectIDs","purchasedObjectIDs","convertedFilters","SUPPORTED_REGIONS","init","region","cookieDuration","isNumber","isFinite","floor","partial","setOptions","userHasOptedOut","_region","_host","host","anonymousUserToken","_useCookie","useCookie","viewedObjectIDs","viewedFilters","AlgoliaAnalytics","requestFn","bind","requestWithXMLHttpRequest","XMLHttpRequest","addEventListener","readyState","status","open","setRequestHeader","send","requestWithSendBeacon","sendBeacon","requestWithNativeFetch","fetch","method","body","catch","apply","warn","window","AlgoliaAnalyticsObject","createInsightsClient","supportsSendBeacon","supportsXMLHttpRequest","supportsNativeFetch","getRequesterForBrowser","ALGOLIA_CLICKS_LOCAL_STORAGE_KEY","_default","_Controller","_classCallCheck","_callSuper","_inherits","key","value","handleCookiebotAcceptDeclineEventAlgoliaAnalytics","cookieNameValue","consented","Consent","statistics","initializeAlgoliaSearchAnalytics","removeEventListener","userTokenValue","existingCookieValue","getUserTokenCookie","Cookies","secure","expires","algoliaAnalyticsInitialized","setUserTokenCookie","algoliaSearchInsights","appId","appIdValue","apiKey","apiKeyValue","event","target","closest","item","findItemByObjectId","dataset","algoliaAnalyticsObjectId","eventName","indexNameValue","queryIdValue","object_id","positions","position","localStorageSetWrapperWithExpiry","localStorageKeyForItem","queryId","objectId","itemsValue","find","allLocalStorageRaw","localStorageGet","allLocalStorageData","values","timestampForThirtyMinutesAgo","existingKey","createdAt","_objectSpread","localStorageSet","item_type","item_id","element","algoliaAnalyticsItemType","algoliaAnalyticsItemId","algoliaAnalyticsClickData","localStorageGetWrapper","localStorageKeyForElement","removeUserTokenCookie","Controller","cookieName","String","indexName","items","Array","documentElement","hasAttribute","viewItem","sendAnalyticsEvent","ecommerce","_this","handleCleanupOnAnotherPlay","wavesurfer","WaveSurfer","container","waveTarget","barWidth","barHeight","barMinHeight","barGap","fillParent","hideScrollbar","interact","pixelRatio","scrollParent","backend","normalize","waveColor","waveColorValue","progressColor","loaderColor","cursorColor","backgroundColor","responsive","autoCenter","height","waveformUrlValue","apiResult","json","jsonResult","load","previewUrlValue","data","on","params","trackLength","getDuration","playingValue","readDataFromDbValue","incrementItemPreviewCount","seekPercentage","setProgressBar","handleTogglePlay","time","parseInt","errorMessage","destroy","currentWaveSurferCleanup","progressTarget","style","left","_this2","pause","playPromise","play","undefined","_","loadedValue","logAudioPreviewEvent","name","googleAnalytics3Event","eventAction","eventCategory","itemTypeForGa3EventsValue","eventLabel","itemIdForGa3EventsValue","audio_item_id","audio_item_type","targets","waveformUrl","previewUrl","playing","itemIdForGa3Events","itemTypeForGa3Events","loaded","readDataFromDb","Cookiebot","renew","location","reload","application","controllers","controller","context","identifier","preventDefault","modalController","getGlobalModalController","showModal","modalUrlValue","response","ok","text","msg","html","setContentHtml","handleError","hideModal","modalUrl","runDownloadProcess","ga3EventActionValue","ga3EventCategoryValue","itemIdValue","itemId","itemResolution","itemResolutionValue","downloadContextValue","elementsItemId","elementsItemIdValue","customConfig","skipNormalizationForAttributes","callback","downloadTheFile","setTimeout","href","urlValue","ga3EventAction","ga3EventCategory","url","downloadContext","updateButtonLabelWithSelectedType","downloadOptionTargets","downloadOption","checked","selectedTypeLabelTarget","innerHTML","getSelectedDownloadOption","label","_ref","originalSource","detail","anchor","URLSearchParams","search","campaignValue","uriValue","campaign","uri","ELEMENTS_TOAST_BANNER_DISMISSAL_KEY","markElementsToastBannerDismissed","deferRun","_checkLocalStorageAndDisplayBanner","marketing","visibleValue","timestampWhenBannerDismissed","isBannerNeverBeenDismissed","isNaN","timestampForThirtyDaysAgo","shouldDisplayElementsToastBanner","_displayBanner","visible","playVideo","pauseVideo","hasVideoTarget","videoPromise","videoTarget","logVideoPreviewEvent","nonInteraction","itemType","facetSelector","getElementById","content","children","cloneNode","setContentNode","close","logFilterApplyButtonPress","buildFilterUri","baseUriValue","applicableValue","_step","facetUriParams","_iterator","_createForOfIteratorHelper","facetsValue","done","_step2","facet","facetUrlSlug","multi_select","_iterator2","options","possibleFacetValue","facetInDom","slug","isFacetTicked","isFacetTheDefaultOption","err","f","param","applicable","baseUri","facets","filtersApplied","actionValue","categoryValue","labelValue","eventValue","valueValue","nonInteractionValue","action","category","_len","args","_key","handleWindowResize","innerWidth","menuOpenValue","once","scrollY","classList","add","searchClass","menuOpen","classes","throttle","require","layout","moreLinksTarget","showMoreValue","metaWrapperWidth","metaWrapperTarget","offsetWidth","navChildren","linkTargets","visibleElementsWidth","linksToShowInMore","child","removeAttribute","bounding","getBoundingClientRect","width","setAttribute","appendChild","showMore","ORIGINAL_UTM_SOURCE_KEY","storeOriginalSource","sessionStorage","updateOriginalSourceTracking","utmSource","URL","searchParams","referrer","removeOriginalSource","retrieveOriginalSource","dispatchEvent","CustomEvent","trackOriginalSource","stopTrackingOriginalSource","dispatchUpdateOriginalSourceEvent","initializeSlider","slider","tns","trackTarget","loop","touch","mouseDrag","controls","center","nav","slideBy","mobileColumnCountValue","initializedClass","goTo","mobileColumnCount","type","Number","default","getColumnCount","itemCount","modalWrapper","templateTarget","parentNode","querySelectorAll","childToClone","match","modalCloseButton","getElementsByClassName","closeModal","containerWidth","navTarget","moreTarget","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","webkitEnterFullScreen","itemTypeValue","allLicenseTypes","licenseType","currentTarget","license","displayLicenseModal","includes","shouldWeUpdateModalUrlAnchor","hash","substr","anchorValue","history","pushState","turbolinks","title","pathname","_regeneratorRuntime","defineProperty","Symbol","iterator","asyncIterator","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","arg","h","l","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","g","defineIteratorMethods","_invoke","AsyncIterator","invoke","__await","callInvokeWithMethodAndArg","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","displayName","isGeneratorFunction","constructor","mark","setPrototypeOf","__proto__","awrap","async","reverse","pop","prev","stop","rval","handle","complete","finish","delegateYield","asyncGeneratorStep","_asyncToGenerator","_next","_throw","_defineProperties","_toPropertyKey","toPrimitive","_toPrimitive","_getPrototypeOf","ReferenceError","_assertThisInitialized","_possibleConstructorReturn","_isNativeReflectConstruct","Reflect","construct","valueOf","_setPrototypeOf","cachedAutocompleteData","setHeaderLabel","setPopularSearchTerms","hasHeaderLabelTarget","searchItemType","currentElement","headerOptionsTarget","querySelector","newElementToHighlight","headerLabelTarget","innerText","popularSearchTermsForItemTypeTargets","isArray","popularSearchTermForItemType","hiddenPopularSearchTermsClass","hasItemTypeSelectorTarget","itemTypeSelectorTarget","expandedItemTypeSelectorClass","stopImmediatePropagation","newItemType","getAttribute","inputTarget","focus","collapseItemTypeSelector","searchTerm","searchType","getElementAnalyticsContext","itemCategory","getGa4ItemCategory","_element$closest","analyticsContext","startsWith","_search","_callee","searchMatches","searchUrlSlug","destinationUrl","_context","isAutoCompleteItemType","findAutoCompleteMatches","autocompleteIndexValue","redirectToAutoCompleteResult","userTextInputToUrlSlug","getItemSearchPath","searchTermUrlSlug","logGaSearchEvent","_x","showClearButtonValue","autocompleteValue","_handleAutocomplete","_callee2","keyCode","_context2","keyIdentifier","autocompleteResultsTarget","hasAutocompleteResultsValue","result","existingAutocompleteResultButton","autocompleteResultButton","autocompleteButtonTarget","resultIndexStart","resultIndexEnd","_x2","_getAutocompleteData","_callee3","_context3","_x3","_findAutoCompleteMatches","_callee4","dataSource","searchQueryBits","_context4","getAutocompleteData","acc","weFoundAPartialMatch","searchQueryBit","resultIndex","toLowerCase","b","autocomplete","autocompleteIndex","hasAutocompleteResults","showClearButton","isPausedValue","videoDurationSeconds","ceil","duration","minutes","seconds","durationTimeTarget","textContent","padStart","percent","currentTime","progressBarTarget","flexBasis","progressTimeTarget","scrubTime","offsetX","isMousedownValue","scrub","isPaused","isMousedown","analyticsEnabledValue","loadGTMScript","src","scriptTag","firstScriptTag","analyticsIdValue","createElement","getElementsByTagName","insertBefore","cookiebotEnabledValue","handleCookiebotAcceptDeclineEvent","userHasOptedOutOfCookiesForCategory","getCookieDomains","cookieDomain","path","domain","cookiebotEnabled","analyticsId","analyticsEnabled","ga3TrackingEnabledValue","logGa3PageView","analyticsProcessed","allowedQueryParams","ga3QueryParamsValue","browserSearchParams","searchParamsToLog","_ref2","_slicedToArray","searchParam","searchParamValue","append","searchStringToLog","pagePath","googleAnalytics3","standardisedClickTracking","googleAnalytics3StandardisedClickTracking","ga3TrackingEnabled","ga3QueryParams","microsoftClarityEnabledValue","allowClarityCookies","clarity","handleCookiebotAcceptDeclineEventClarity","microsoftClarityEnabled","openedValue","emptyModalContents","showLoadingSpinner","hideLoadingSpinner","Event","loadingValue","contentTarget","node","opened","loading","wrapper","ResizeObserver","observer","entry","scrollHeight","contentRect","truncatedClass","observe","expandedClass","disconnectResizeObserver","disconnect","checkConsentTypePresent","consentType","packageConsent","packageConsented","job","packageDeferRun","packageUserOptedOut","_window$Rollbar","Rollbar","cookieDomains","hostname","_window","gtag3","_ref$eventValue","_ref$nonInteraction","_ref$callback","eventCallbackFallback","pageType","analyticsPageType","analyticsItemType","event_category","event_label","non_interaction","event_callback","containerId","clearTimeout","page_type","_target$nodeName","submitEventFunction","elementId","analyticsElementId","elementLabel","analyticsElementLabel","section","sectionId","analyticsSectionId","sectionLabel","analyticsSectionLabel","tagName","nodeName","googleAnalytics3StandardEvent","elementPosition","textInput","searchSlug","searchUrl","getItemTypePath","analyticsParams","defaultValue","__importStar","queue","execute","cookiebotJob","shift","consent","hasResponse","CookieString","parsedCookieConsent","CookieConsent","checkCookieConsent","factory","extend","attributes","decode","decodeURIComponent","converter","api","defaults","test","write","escape","stringifiedAttributes","attributeName","jar","cookies","parts","read","getJSON","withConverter","elementsDomain","marketDomains","tutsplusDomain","_require","deepNormalizeAttributes","normalizeAttributeKey","normalizeAttributeValue","defaultConfig","isObject","theObject","_ref$stringifyArrays","stringifyArrays","_ref$customConfig","config","normalizedObject","_ref3","normalizedKey","normalizedValue","trim","isNonEmptyObject","pushToDataLayer","eventData","dataLayer","buildCallback","originalCallback","_ref$eventType","_ref$ecommerce","_ref$userAttributes","userAttributes","eventAttributes","_objectWithoutProperties","_excluded","event_name","event_attributes","event_type","custom_timestamp","eventCallback","preEventPayload","user_attributes","re","extractClickLabel","_element$textContent","_element$attributes$t","_element$attributes$a","_element$attributes$a2","analyticsClickLabel","alt","isMarketHost","domains","some","endsWith","extractEventName","targetUrl","currentUrl","isElementTrackable","_element$attributes$h","elementHref","isBlockedHref","hrefBlockList","checkFunction","_element$closest2","linkAttributes","protocol","linkUrl","queryParams","origin","linkDomain","linkQuery","linkAnchor","extractLinkAttributes","contextDetail","analyticsContextDetail","clickLabel","clickType","possiblyObject","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","_defineProperty","_arrayLikeToArray","from","_createClass","camelize","char","toUpperCase","capitalize","isSomething","object","hasProperty","property","readInheritableStaticArrayValues","propertyName","ancestors","getAncestorsForConstructor","definition","getOwnStaticArrayValues","Set","readInheritableStaticObjectPairs","pairs","getOwnStaticObjectPairs","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","objectFromEntries","array","memo","_ref19","_ref20","k","getOutletController","getControllerForElementAndIdentifier","getControllerAndEnsureConnectedScope","outletName","outletController","router","proposeToConnectScopeForElementAndIdentifier","parseValueDefinitionPair","_ref25","payload","typeDefinition","_ref26","token","typeFromObject","typeObject","hasType","hasDefault","fullObject","onlyType","onlyDefault","parseValueTypeConstant","typeFromDefaultValue","parseValueTypeDefault","propertyPath","parseValueTypeObject","typeFromConstant","parseValueTypeDefinition","constant","defaultValuesByType","constantFromType","defaultValueForDefinition","hasCustomDefaultValue","reader","readers","writer","writers","getOwnPropertyNames","extendWithReflect","extended","_constructor","enter","tab","esc","space","up","down","right","home","end","page_up","page_down","boolean","number","string","writeJSON","scope","outlets","_ref27","_ref27$target","_ref27$detail","_ref27$prefix","prefix","_ref27$bubbles","bubbles","_ref27$cancelable","cancelable","_identifier","_application","blessings","properties","classDefinition","has","attribute","getAttributeName","getAll","targetDefinition","findAll","valueDefinitionPairs","propertyDescriptorMap","valueDescriptorMap","_this28","valueDefinitionPair","valueDescriptor","getAttributeNameForKey","propertiesForValueDefinitionPair","outletDefinition","camelizedName","outletElement","selector","getSelectorForOutletName","_this27","getRawTag","objectToString","symToStringTag","trimmedEndIndex","reTrimStart","freeGlobal","global","objectProto","nativeObjectToString","isOwn","tag","unmasked","freeSelf","self","root","Function","reWhitespace","toNumber","nativeMax","max","nativeMin","min","func","wait","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","thisArg","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","cancel","flush","baseGetTag","isObjectLike","debounce","baseTrim","isSymbol","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","other","isBinary","_toConsumableArray","_n","F","EventListener","eventTarget","eventOptions","unorderedBindings","binding","extendedEvent","immediatePropagationStopped","extendEvent","bindings","handleEvent","size","leftIndex","rightIndex","Dispatcher","eventListenerMaps","Map","started","eventListeners","eventListener","connect","listeners","fetchEventListenerForBinding","bindingConnected","clearEventListeners","bindingDisconnected","clearEventListenersForBinding","message","hasBindings","removeMappedEventListenerFor","eventListenerMap","fetchEventListenerMapForEventTarget","cacheKey","fetchEventListener","createEventListener","defaultActionDescriptorFilters","stopPropagation","prevent","descriptorPattern","namespaceCamelize","dasherize","allModifiers","Action","descriptor","schema","defaultEventNames","getDefaultEventNameForElement","methodName","keyFilter","eventFilter","eventTargetName","keyFilterDissatisfied","standardFilter","keyMappings","pattern","RegExp","_i","_Array$from","_ref4","typecast","_allModifiers$map2","modifier","meta","ctrl","metaKey","ctrlKey","altKey","shiftKey","matches","button","form","details","input","select","textarea","o_O","Binding","actionEvent","prepareActionEvent","willBeInvokedByEvent","applyEventModifiers","invokeWithEvent","actionDescriptorFilters","passes","_i2","_Object$entries","_ref6","logDebugActivity","KeyboardEvent","shouldIgnoreKeyboardEvent","MouseEvent","shouldIgnoreMouseEvent","Element","contains","containsElement","ElementObserver","mutationObserverInit","childList","subtree","elements","mutationObserver","MutationObserver","mutations","processMutations","refresh","takeRecords","matchElementsInTree","_i3","_Array$from2","removeElement","_i4","_Array$from3","addElement","mutation","processMutation","processAttributeChange","processRemovedNodes","removedNodes","processAddedNodes","addedNodes","elementAttributeChanged","matchElement","nodes","_i5","_Array$from4","elementFromNode","processTree","_i6","_Array$from5","elementIsActive","tree","processor","_step3","_iterator3","nodeType","Node","ELEMENT_NODE","isConnected","elementMatched","elementUnmatched","AttributeObserver","elementObserver","start","elementMatchedAttribute","elementUnmatchedAttribute","elementAttributeValueChanged","Multimap","valuesByKey","prune","del","_ref7","_ref8","_ref9","_ref10","SelectorObserver","_selector","matchesByElement","selectorMatchElement","_this3","selectorMatched","_step4","_iterator4","getKeysForValue","selectorUnmatched","_attributeName","matchedBefore","StringMapObserver","_this4","stringMap","attributeOldValue","_step5","_iterator5","knownAttributeNames","refreshAttribute","_step6","_iterator6","oldValue","getStringMapKeyForAttribute","stringMapKeyAdded","stringMapValueChanged","stringMapKeyRemoved","currentAttributeNames","recordedAttributeNames","TokenListObserver","attributeObserver","tokensByElement","tokensMatched","readTokensForElement","_this$refreshTokensFo2","refreshTokensForElement","unmatchedTokens","matchedTokens","tokensUnmatched","getValuesForKey","tokens","_this5","tokenMatched","_this6","tokenUnmatched","previousTokens","currentTokens","firstDifferingIndex","findIndex","_ref11","_ref12","tokensAreEqual","tokenString","parseTokenString","ValueListObserver","tokenListObserver","parseResultsByToken","WeakMap","valuesByTokenByElement","fetchParseResultForToken","fetchValuesByTokenForElement","elementMatchedValue","elementUnmatchedValue","parseResult","parseToken","valuesByToken","parseValueForToken","BindingObserver","bindingsByAction","valueListObserver","actionAttribute","disconnectAllActions","_this7","clear","forToken","connectAction","disconnectAction","ValueObserver","receiver","stringMapObserver","invokeChangedCallbacksForDefaultValues","hasValue","invokeChangedCallback","valueDescriptorNameMap","_step7","_iterator7","valueDescriptors","_ref13","rawValue","rawOldValue","changedMethodName","changedMethod","_this8","descriptors","hasMethodName","TargetObserver","targetsByName","disconnectAllTargets","_ref14","connectTarget","_ref15","disconnectTarget","_a","_this9","targetConnected","_this10","targetDisconnected","_step8","_iterator8","_step9","_iterator9","OutletObserver","outletsByName","outletElementsByName","selectorObserverMap","attributeObserverMap","_this11","outletDefinitions","setupSelectorObserverForOutlet","setupAttributeObserverForOutlet","dependentContexts","disconnectAllOutlets","stopSelectorObservers","stopAttributeObservers","_ref16","outlet","getOutlet","connectOutlet","_ref17","getOutletFromMap","disconnectOutlet","_ref18","hasOutlet","hasOutletController","controllerAttribute","_element","getOutletNameFromOutletAttributeName","updateSelectorObserverForOutlet","_this12","outletConnected","_this13","outletDisconnected","_step10","_iterator10","_step11","_iterator11","_step12","_iterator12","selectorObserver","attributeNameForOutletName","outletAttributeForScope","_this14","dependencies","modules","controllerConstructor","outletDependencies","identifiers","dependentControllerIdentifiers","contexts","_this15","functionName","bindingObserver","dispatcher","valueObserver","targetObserver","outletObserver","initialize","parentElement","invokeControllerMethod","_key2","getOwnKeys","Module","shadowConstructor","shadowProperties","shadowingDescriptor","getOwnPropertyDescriptor","getShadowedDescriptor","getShadowProperties","defineProperties","shadow","blessedProperties","blessing","getBlessedProperties","blessDefinition","contextsByScope","connectedContexts","fetchContextForScope","ClassMap","getDataKey","DataMap","Guide","logger","warnedKeysByObject","warnedKeys","attributeValueContainsToken","TargetSet","targetName","_this16","_len2","targetNames","_key3","findTarget","findLegacyTarget","_this17","_len3","_key4","findAllTargets","findAllLegacyTargets","getSelectorForTargetName","findElement","findAllElements","targetAttributeForScope","getLegacySelectorForTargetName","deprecate","_this18","targetDescriptor","targetAttribute","revisedAttributeName","guide","OutletSet","controllerElement","_this19","_len4","outletNames","_key5","findOutlet","_this20","_len5","_key6","findAllOutlets","_this21","queryElements","matchesElement","_this22","Scope","_this23","controllerSelector","documentScope","isDocumentScope","ScopeObserver","scopesByIdentifierByElement","scopeReferenceCounts","parseValueForElementAndIdentifier","scopesByIdentifier","fetchScopesByIdentifierForElement","createScopeForElementAndIdentifier","referenceCount","scopeConnected","scopeDisconnected","Router","scopeObserver","modulesByIdentifier","unloadIdentifier","connectModule","afterLoad","disconnectModule","connectContextForScope","disconnectContextForScope","defaultSchema","Application","_this24","debug","logFormattedMessage","_start","head","_this25","_len6","rest","_key7","shouldLoad","loadDefinition","_this26","_len7","_key8","getContextForElementAndIdentifier","onerror","groupCollapsed","log","groupEnd","win$1","raf","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","msRequestAnimationFrame","cb","win","caf","cancelAnimationFrame","mozCancelAnimationFrame","obj","copy","checkStorageValue","setLocalStorage","storage","access","getBody","doc","fake","docElement","setFakeBody","docOverflow","overflow","background","resetFakeBody","offsetHeight","addCSSRule","sheet","rules","insertRule","addRule","getCssRulesLength","cssRules","arr","classListSupport","hasClass","el","str","className","addClass","removeClass","hasAttr","attr","getAttr","isNodeList","setAttrs","els","attrs","removeAttrs","attrLength","j","arrayFromNodeList","nl","hideElement","forceHide","display","showElement","isVisible","getComputedStyle","whichProperty","props","Props","prop","getEndProperty","propIn","propOut","endProp","supportsPassive","opts","passiveOption","passive","addEvents","preventScrolling","option","removeEvents","Events","topics","fn","off","splice","emit","removeChild","mode","axis","gutter","edgePadding","fixedWidth","autoWidth","viewportMax","controlsPosition","controlsText","controlsContainer","prevButton","nextButton","navPosition","navContainer","navAsThumbnails","arrowKeys","speed","autoplay","autoplayPosition","autoplayTimeout","autoplayDirection","autoplayText","autoplayHoverPause","autoplayButton","autoplayButtonOutput","autoplayResetOnVisibility","animateIn","animateOut","animateNormal","animateDelay","rewind","autoHeight","lazyload","lazyloadSelector","swipeAngle","nested","preventActionWhenRunning","preventScrollOnTouch","freezable","onInit","useLocalStorage","nonce","KEYS","ENTER","SPACE","LEFT","RIGHT","tnsStorage","localStorageAccess","browserInfo","userAgent","uid","CALC","div","val","vals","calc","PERCENTAGELAYOUT","supported","outer","abs","count","percentageLayout","CSSMQ","matchMedia","msMatchMedia","rule","styleSheet","cssText","createTextNode","currentStyle","mediaquerySupport","TRANSFORM","HAS3DTRANSFORMS","tf","has3d","cssTF","getPropertyValue","has3DTransforms","TRANSITIONDURATION","TRANSITIONDELAY","ANIMATIONDURATION","ANIMATIONDELAY","TRANSITIONEND","ANIMATIONEND","supportConsoleWarn","tnsList","optionsElements","carousel","responsiveTem","updateOptions","middleWrapper","breakpointZone","horizontal","outerWrapper","innerWrapper","containerParent","containerHTML","outerHTML","slideItems","slideCount","windowWidth","getWindowWidth","isOn","setBreakpointZone","slidePositions","itemsMax","getOption","viewport","getViewportWidth","fixedWidthViewportWidth","slideItemsOut","cloneCount","bp","tem","getItemsMax","hasOption","slideCountNew","hasRightDeadZone","rightBoundary","getRightBoundary","updateIndexBeforeTransform","transformAttr","transformPrefix","transformPostfix","getIndexMax","getStartIndex","indexCached","getCurrentSlide","imgsComplete","liveregionCurrent","indexMin","indexMax","moveDirectionExpected","running","newContainerClasses","slideId","tnsId","disable","disabled","freeze","getFreeze","frozen","controlsEvents","onControlsClick","getEvent","keyIndex","navEvents","onTransitionEnd","getTarget","navIndex","navClicked","targetIndexBase","pages","navCurrentIndex","animating","stopAutoplay","curElement","activeElement","setFocus","navItems","hoverEvents","stopAutoplayTimer","autoplayHoverPaused","setAutoplayTimer","visibilityEvent","hidden","autoplayVisibilityPaused","docmentKeydownEvent","touchEvents","onPanStart","onPanMove","onPanEnd","dragEvents","hasControls","hasNav","hasAutoplay","hasTouch","hasMouseDrag","slideActiveClass","slideClonedClass","imgCompleteClass","imgEvents","imgLoaded","img","imgCompleted","preventScroll","prevIsButton","nextIsButton","controlsContainerHTML","prevButtonHTML","nextButtonHTML","navContainerHTML","getPages","pagesCached","getCurrentNavIndex","navCurrentIndexCached","navActiveClass","navStr","navStrCurrent","autoplayTimer","autoplayUserPaused","autoplayButtonHTML","autoplayHtmlStrings","translateInit","rafIndex","initPosition","lastPosition","panStart","getDist","x","resetVariblesWhenDisable","fragmentBefore","createDocumentFragment","fragmentAfter","num","cloneFirst","firstChild","cloneLast","initStructure","fontSize","slide","marginLeft","getSlideMarginLeft","getTransitionDurationStyle","getInnerWrapperStyles","getContainerWidth","getSlideWidthStyle","getSlideGutterStyle","getAnimationDurationStyle","middleWrapperStr","innerWrapperStr","containerStr","slideStr","itemsBP","fixedWidthBP","speedBP","edgePaddingBP","autoHeightBP","gutterBP","initSheet","initSliderTransform","updateIndex","leftEdge","rightEdge","transformCore","postfix","to","tick","unit","positionTick","resetDuration","doContainerTransform","getContainerTransformValue","moveElement","updateContentWrapperHeight","eve","animateSlide","getInfo","info","startAutoplay","updateSliderHeight","updateInnerWrapperHeight","ownerNode","onResize","toggleAutoplay","clearInterval","htmlList","prevEl","previousElementSibling","parentEl","nextElementSibling","firstElementChild","rebuild","condition","ind","getAbsIndex","absIndex","clientWidth","getInsertPosition","pos","getClientWidth","rect","gap","ww","edgePaddingTem","gutterTem","fixedWidthTem","speedTem","gutterTemUnit","itemsTem","dividend","getCSSPrefix","imgs","imgsLoadedCheck","getImageArray","initSliderTransformStyleCheck","doContainerTransformSilent","initTools","initEvents","stylesApplicationCheck","initSliderTransformCore","setSlidePositions","updateSlideStatus","insertAdjacentHTML","getLiveRegionStr","txt","navHtml","hiddenStr","updateNavVisibility","isButton","updateControlsStatus","disableUI","resizeTasks","doAutoHeight","doLazyLoad","disableSlider","freezeSlider","additionalUpdates","bpChanged","breakpointZoneTem","needContainerTransform","indChanged","itemsChanged","disableTem","freezeTem","arrowKeysTem","controlsTem","navTem","touchTem","mouseDragTem","autoplayTem","autoplayHoverPauseTem","autoplayResetOnVisibilityTem","indexTem","autoHeightTem","controlsTextTem","centerTem","autoplayTextTem","classN","enableUI","enableSlider","margin","unfreezeSlider","len","updateLiveRegion","updateGallerySlidePositions","deleteRule","removeRule","removeCSSRule","vp","getVisibleSlideRange","rangestart","rangeend","parseFloat","point","cell","srcset","imgSelector","navPrev","navCurrent","updateNavStatus","getMaxSlideHeight","slideStart","slideRange","heights","maxHeight","wp","attr2","base","range","getLowerCaseNodeName","isAriaDisabled","disEnableElement","prevDisabled","nextDisabled","disablePrev","disableNext","getCenterGap","denominator","classOut","classIn","isOut","render","sliderMoved","strTrans","targetIndex","indexGap","factor","dir","passEventObject","targetIn","setInterval","updateAutoplayButton","isTouchEvent","changedTouches","srcElement","preventDefaultBehavior","returnValue","getMoveDirectionExpected","angle","atan2","PI","direction","$","clientX","clientY","panUpdate","dist","preventClick","indexMoved","moved","rough","displayIndex","_style","_interopRequireDefault","_getId","__esModule","_typeof","prim","res","hint","CanvasEntry","instance","Constructor","wave","waveCtx","progress","progressCtx","canvasContextAttributes","protoProps","getContext","elementWidth","totalWidth","offsetLeft","elementSize","hasProgressCanvas","clearRect","canvas","fillStyle","getFillStyle","ctx","color","CanvasGradient","waveGradient","createLinearGradient","addColorStop","vertical","setTransform","radius","fillRectToContext","drawRoundedRect","fillRect","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","fill","peaks","absmax","halfH","offsetY","drawLineToContext","peak","first","round","canvasStart","canvasEnd","scale","halfOffset","absmaxHalf","halfPixel","format","quality","toBlob","toDataURL","util","nodeInterop","cache","_getRequireWildcardCache","newObj","hasPropertyDescriptor","desc","_interopRequireWildcard","cacheBabelInterop","cacheNodeInterop","Drawer","_util$Observer","subClass","superClass","Derived","hasNativeReflectConstruct","_super","sham","Proxy","Super","NewTarget","withOrientation","lastPos","styles","userSelect","webkitUserSelect","cursor","hideCursor","overflowX","overflowY","setupWrapperEvents","noPrevent","targetTouches","bbox","nominalWidth","parentWidth","getWidth","progressPixels","getProgressPixels","scrollLeft","scrollWidth","clamp","wrapperBbox","rtl","orientedEvent","scrollbarHeight","clientHeight","bottom","fireEvent","setWidth","clearWave","drawBars","drawWave","recenterOnPosition","half","maxScroll","offset","rate","autoCenterRate","newWidth","updateSize","_progress","minPxDelta","newPos","autoCenterImmediately","updateProgress","unAll","domElement","channelIndex","Observer","_drawer","_drawer2","MultiCanvas","_Drawer","maxCanvasWidth","maxCanvasElementWidth","canvases","progressWave","EntryClass","drawingContextAttributes","overlap","barRadius","createWrapper","createElements","zIndex","top","boxSizing","borderRightStyle","pointerEvents","addCanvas","updateCursor","borderRightWidth","cursorWidth","borderRightColor","requiredCanvases","removeCanvas","canvasWidth","lastCanvas","updateDimensions","leftOffset","initWave","initProgress","lastEntry","frame","prepareDraw","hasMinVals","ch","peakIndexScale","bar","step","last","peakIndex","peakIndexRange","peakIndexEnd","newPeak","reflectedPeaks","drawLine","splitChannelsOptions","channelColors","setFillStyles","applyCanvasTransforms","drawLines","startCanvas","endCanvas","intersection","x1","y1","x2","y2","fillRects","splitChannels","filterChannels","drawIndex","normalizedMax","channels","overallAbsMax","filteredChannels","hideChannel","overlay","setHeight","relativeNormalization","channelPeaks","absMax","all","getImage","images","_get","_superPropBase","MediaElementWebAudio","_MediaElement","sourceMediaElement","setPlaybackRate","audioRate","createTimer","createVolumeNode","createScriptNode","createAnalyserNode","media","preload","createMediaElementSource","mediaElement","ac","analyser","resumeAudioContext","destroyWebAudio","_webaudio","MediaElement","_WebAudio","paused","playbackRate","volume","mediaType","isMuted","buffer","onPlayEnd","mediaListeners","waiting","canplay","ended","seeked","volumechange","muted","onAudioProcess","getCurrentTime","mediaControls","prevMedia","_load","elt","HTMLMediaElement","_setupMediaListeners","setVolume","explicitDuration","Infinity","seekable","clearPlayEnd","seekTo","promise","setPlayEnd","_onPlayEnd","un","deviceId","setSinkId","reject","destroyed","removeMediaElementOnDestroy","PeakCache","clearPeakCache","peakCacheRanges","peakCacheLength","uncachedRanges","uncachedRangePairs","peakCacheRangePairs","_max","_min","_observer","fetchHeaders","Headers","fetchRequest","Request","AbortController","requestHeaders","header","responseType","fetchOptions","credentials","redirect","signal","progressAvailable","contentLength","onProgress","Response","ReadableStream","ProgressHandler","errMsg","arrayBuffer","blob","_reader","getReader","total","lengthComputable","byteLength","enqueue","_requestAnimationFrame","_absMax","_frame","_debounce","_preventClick","_fetch","_clamp","_orientation","_silenceMode","largest","smallest","_disabledEventEmissions","handlers","handler","eventNames","_isDisabledEventEmission","isProxy","mapProp","verticalPropMap","offsetTop","preventClickHandler","oRequestAnimationFrame","silentAC","AudioContext","silentBS","createBufferSource","createBuffer","destination","tmp","audioSilentMode","disableRemotePlayback","_mediaelement","_peakcache","_mediaelementWebaudio","staticProps","audioContext","audioScriptProcessor","dragSelection","desynchronized","forceDecode","ignoreSilenceMode","loopSelection","mediaContainer","minPxPerSec","partialRender","devicePixelRatio","screen","deviceXDPI","logicalXDPI","plugins","renderer","skipLength","splitDragSelection","xhr","WebAudio","defaultParams","transform","setBackgroundColor","savedVolume","tmpEvents","currentRequest","arraybuffer","drawer","peakCache","supportsWebAudio","Backend","backends","initialisedPluginList","isDestroyed","isReady","prevWidth","_onResize","registerPlugins","createDrawer","createBackend","createPeakCache","plugin","addPlugin","deferInit","initPlugin","pluginStaticProp","Instance","destroyPlugin","drawBuffer","getPlayedPercents","newVolume","getVolume","skip","seekAndCenter","recenter","isWebAudioBackend","oldScrollParent","getPlaybackRate","setMute","mute","channelIdx","channelIndices","newRanges","addRangeToPeakCache","getPeaks","drawPeaks","pxPerSec","decodeArrayBuffer","loadDecodedBuffer","FileReader","loadArrayBuffer","readAsArrayBuffer","empty","preloadIgnoreReasons","activeReasons","reason","loadBuffer","loadMediaElement","getArrayBuffer","setPeaks","urlOrElt","loadElt","request","fetchFile","percentComplete","accuracy","noWindow","blobJSON","Blob","objURL","createObjectURL","revokeObjectURL","abort","disconnectSource","cancelAjax","clearTmpEvents","destroyAllPlugins","PLAYING","PAUSED","FINISHED","_defineProperty2","_this$states","addOnAudioProcess","startPosition","getPlayedTime","getAudioContext","lastPlay","scheduledPause","states","stateBehaviors","gainNode","mergedPeaks","offlineAc","scriptNode","source","splitPeaks","state","sinkStreamDestination","sinkAudioElement","webkitAudioContext","WaveSurferAudioContext","sampleRate","WaveSurferOfflineAudioContext","OfflineAudioContext","webkitOfflineAudioContext","setState","setLength","setFilters","disconnectFilters","curr","createAnalyser","createGain","createGainNode","Audio","createMediaStreamDestination","srcObject","stream","gain","setValueAtTime","errback","getOfflineAudioContext","decodeAudioData","numberOfChannels","newBuffer","sampleSize","sampleStep","chan","getChannelData","closeAudioContext","createSource","noteGrainOn","noteOff","resume","adjustedTime","timeout","timestamp","later","callNow","__webpack_module_cache__","__webpack_exports__","moduleId","cachedModule","__webpack_modules__","defaultAttributes","found","withAttributes","getter","definitionsFromContext","logicalName","identifierForContextKey","definitionForModuleAndIdentifier","definitionForModuleWithContextAndKey","contextComponents"],"sourceRoot":""}