{"version":3,"file":"main-9d8d8a7ceeee4032c81e.esm.js","mappings":"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","sources":["webpack://dh-lydlogg/./node_modules/cuid/index.js","webpack://dh-lydlogg/./node_modules/cuid/lib/fingerprint.browser.js","webpack://dh-lydlogg/./node_modules/cuid/lib/getRandomValue.browser.js","webpack://dh-lydlogg/./node_modules/cuid/lib/pad.js","webpack://dh-lydlogg/./node_modules/howler/dist/howler.js","webpack://dh-lydlogg/./node_modules/@nrk/dh-server-libs/get-element-tag.js","webpack://dh-lydlogg/./node_modules/@nrk/dh-server-libs/html.js","webpack://dh-lydlogg/./node_modules/@nrk/dh-server-libs/src/get-element-tag.js","webpack://dh-lydlogg/./node_modules/@nrk/dh-server-libs/src/html-tagged-template-literal.js","webpack://dh-lydlogg/webpack/bootstrap","webpack://dh-lydlogg/webpack/runtime/global","webpack://dh-lydlogg/./node_modules/@nrk/nrkno-snowplow/node_modules/@nrk/snowplow-web/index.js","webpack://dh-lydlogg/./node_modules/@nrk/nrkno-snowplow/build-npm/nrkno-snowplow.package.mjs","webpack://dh-lydlogg/./node_modules/@nrk/snowplow-web/index.js","webpack://dh-lydlogg/./node_modules/@nrk/dh-snowplow/dist/index.mjs","webpack://dh-lydlogg/./node_modules/@nrk/dh-snowplow/dist/shared/dh-snowplow.1ee613bf.mjs","webpack://dh-lydlogg/./node_modules/@nrk/dh-basis-common/dist/index.esm.js","webpack://dh-lydlogg/./src/components/lydlogg.module.css?c36c","webpack://dh-lydlogg/./node_modules/@nrk/core-icons/core-icons.mjs","webpack://dh-lydlogg/./src/components/play-button.html.js","webpack://dh-lydlogg/./src/components/lydlogg.js","webpack://dh-lydlogg/./src/client.js"],"sourcesContent":["/**\n * cuid.js\n * Collision-resistant UID generator for browsers and node.\n * Sequential for fast db lookups and recency sorting.\n * Safe for element IDs and server-side lookups.\n *\n * Extracted from CLCTR\n *\n * Copyright (c) Eric Elliott 2012\n * MIT License\n */\n\nvar fingerprint = require('./lib/fingerprint.js');\nvar pad = require('./lib/pad.js');\nvar getRandomValue = require('./lib/getRandomValue.js');\n\nvar c = 0,\n blockSize = 4,\n base = 36,\n discreteValues = Math.pow(base, blockSize);\n\nfunction randomBlock () {\n return pad((getRandomValue() *\n discreteValues << 0)\n .toString(base), blockSize);\n}\n\nfunction safeCounter () {\n c = c < discreteValues ? c : 0;\n c++; // this is not subliminal\n return c - 1;\n}\n\nfunction cuid () {\n // Starting with a lowercase letter makes\n // it HTML element ID friendly.\n var letter = 'c', // hard-coded allows for sequential access\n\n // timestamp\n // warning: this exposes the exact date and time\n // that the uid was created.\n timestamp = (new Date().getTime()).toString(base),\n\n // Prevent same-machine collisions.\n counter = pad(safeCounter().toString(base), blockSize),\n\n // A few chars to generate distinct ids for different\n // clients (so different computers are far less\n // likely to generate the same id)\n print = fingerprint(),\n\n // Grab some more chars from Math.random()\n random = randomBlock() + randomBlock();\n\n return letter + timestamp + counter + print + random;\n}\n\ncuid.slug = function slug () {\n var date = new Date().getTime().toString(36),\n counter = safeCounter().toString(36).slice(-4),\n print = fingerprint().slice(0, 1) +\n fingerprint().slice(-1),\n random = randomBlock().slice(-2);\n\n return date.slice(-2) +\n counter + print + random;\n};\n\ncuid.isCuid = function isCuid (stringToCheck) {\n if (typeof stringToCheck !== 'string') return false;\n if (stringToCheck.startsWith('c')) return true;\n return false;\n};\n\ncuid.isSlug = function isSlug (stringToCheck) {\n if (typeof stringToCheck !== 'string') return false;\n var stringLength = stringToCheck.length;\n if (stringLength >= 7 && stringLength <= 10) return true;\n return false;\n};\n\ncuid.fingerprint = fingerprint;\n\nmodule.exports = cuid;\n","var pad = require('./pad.js');\n\nvar env = typeof window === 'object' ? window : self;\nvar globalCount = Object.keys(env).length;\nvar mimeTypesLength = navigator.mimeTypes ? navigator.mimeTypes.length : 0;\nvar clientId = pad((mimeTypesLength +\n navigator.userAgent.length).toString(36) +\n globalCount.toString(36), 4);\n\nmodule.exports = function fingerprint () {\n return clientId;\n};\n","\nvar getRandomValue;\n\nvar crypto = typeof window !== 'undefined' &&\n (window.crypto || window.msCrypto) ||\n typeof self !== 'undefined' &&\n self.crypto;\n\nif (crypto) {\n var lim = Math.pow(2, 32) - 1;\n getRandomValue = function () {\n return Math.abs(crypto.getRandomValues(new Uint32Array(1))[0] / lim);\n };\n} else {\n getRandomValue = Math.random;\n}\n\nmodule.exports = getRandomValue;\n","module.exports = function pad (num, size) {\n var s = '000000000' + num;\n return s.substr(s.length - size);\n};\n","/*!\n * howler.js v2.2.4\n * howlerjs.com\n *\n * (c) 2013-2020, James Simpson of GoldFire Studios\n * goldfirestudios.com\n *\n * MIT License\n */\n\n(function() {\n\n 'use strict';\n\n /** Global Methods **/\n /***************************************************************************/\n\n /**\n * Create the global controller. All contained methods and properties apply\n * to all sounds that are currently playing or will be in the future.\n */\n var HowlerGlobal = function() {\n this.init();\n };\n HowlerGlobal.prototype = {\n /**\n * Initialize the global Howler object.\n * @return {Howler}\n */\n init: function() {\n var self = this || Howler;\n\n // Create a global ID counter.\n self._counter = 1000;\n\n // Pool of unlocked HTML5 Audio objects.\n self._html5AudioPool = [];\n self.html5PoolSize = 10;\n\n // Internal properties.\n self._codecs = {};\n self._howls = [];\n self._muted = false;\n self._volume = 1;\n self._canPlayEvent = 'canplaythrough';\n self._navigator = (typeof window !== 'undefined' && window.navigator) ? window.navigator : null;\n\n // Public properties.\n self.masterGain = null;\n self.noAudio = false;\n self.usingWebAudio = true;\n self.autoSuspend = true;\n self.ctx = null;\n\n // Set to false to disable the auto audio unlocker.\n self.autoUnlock = true;\n\n // Setup the various state values for global tracking.\n self._setup();\n\n return self;\n },\n\n /**\n * Get/set the global volume for all sounds.\n * @param {Float} vol Volume from 0.0 to 1.0.\n * @return {Howler/Float} Returns self or current volume.\n */\n volume: function(vol) {\n var self = this || Howler;\n vol = parseFloat(vol);\n\n // If we don't have an AudioContext created yet, run the setup.\n if (!self.ctx) {\n setupAudioContext();\n }\n\n if (typeof vol !== 'undefined' && vol >= 0 && vol <= 1) {\n self._volume = vol;\n\n // Don't update any of the nodes if we are muted.\n if (self._muted) {\n return self;\n }\n\n // When using Web Audio, we just need to adjust the master gain.\n if (self.usingWebAudio) {\n self.masterGain.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n }\n\n // Loop through and change volume for all HTML5 audio nodes.\n for (var i=0; i=0; i--) {\n self._howls[i].unload();\n }\n\n // Create a new AudioContext to make sure it is fully reset.\n if (self.usingWebAudio && self.ctx && typeof self.ctx.close !== 'undefined') {\n self.ctx.close();\n self.ctx = null;\n setupAudioContext();\n }\n\n return self;\n },\n\n /**\n * Check for codec support of specific extension.\n * @param {String} ext Audio file extention.\n * @return {Boolean}\n */\n codecs: function(ext) {\n return (this || Howler)._codecs[ext.replace(/^x-/, '')];\n },\n\n /**\n * Setup various state values for global tracking.\n * @return {Howler}\n */\n _setup: function() {\n var self = this || Howler;\n\n // Keeps track of the suspend/resume state of the AudioContext.\n self.state = self.ctx ? self.ctx.state || 'suspended' : 'suspended';\n\n // Automatically begin the 30-second suspend process\n self._autoSuspend();\n\n // Check if audio is available.\n if (!self.usingWebAudio) {\n // No audio is available on this system if noAudio is set to true.\n if (typeof Audio !== 'undefined') {\n try {\n var test = new Audio();\n\n // Check if the canplaythrough event is available.\n if (typeof test.oncanplaythrough === 'undefined') {\n self._canPlayEvent = 'canplay';\n }\n } catch(e) {\n self.noAudio = true;\n }\n } else {\n self.noAudio = true;\n }\n }\n\n // Test to make sure audio isn't disabled in Internet Explorer.\n try {\n var test = new Audio();\n if (test.muted) {\n self.noAudio = true;\n }\n } catch (e) {}\n\n // Check for supported codecs.\n if (!self.noAudio) {\n self._setupCodecs();\n }\n\n return self;\n },\n\n /**\n * Check for browser support for various codecs and cache the results.\n * @return {Howler}\n */\n _setupCodecs: function() {\n var self = this || Howler;\n var audioTest = null;\n\n // Must wrap in a try/catch because IE11 in server mode throws an error.\n try {\n audioTest = (typeof Audio !== 'undefined') ? new Audio() : null;\n } catch (err) {\n return self;\n }\n\n if (!audioTest || typeof audioTest.canPlayType !== 'function') {\n return self;\n }\n\n var mpegTest = audioTest.canPlayType('audio/mpeg;').replace(/^no$/, '');\n\n // Opera version <33 has mixed MP3 support, so we need to check for and block it.\n var ua = self._navigator ? self._navigator.userAgent : '';\n var checkOpera = ua.match(/OPR\\/(\\d+)/g);\n var isOldOpera = (checkOpera && parseInt(checkOpera[0].split('/')[1], 10) < 33);\n var checkSafari = ua.indexOf('Safari') !== -1 && ua.indexOf('Chrome') === -1;\n var safariVersion = ua.match(/Version\\/(.*?) /);\n var isOldSafari = (checkSafari && safariVersion && parseInt(safariVersion[1], 10) < 15);\n\n self._codecs = {\n mp3: !!(!isOldOpera && (mpegTest || audioTest.canPlayType('audio/mp3;').replace(/^no$/, ''))),\n mpeg: !!mpegTest,\n opus: !!audioTest.canPlayType('audio/ogg; codecs=\"opus\"').replace(/^no$/, ''),\n ogg: !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, ''),\n oga: !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, ''),\n wav: !!(audioTest.canPlayType('audio/wav; codecs=\"1\"') || audioTest.canPlayType('audio/wav')).replace(/^no$/, ''),\n aac: !!audioTest.canPlayType('audio/aac;').replace(/^no$/, ''),\n caf: !!audioTest.canPlayType('audio/x-caf;').replace(/^no$/, ''),\n m4a: !!(audioTest.canPlayType('audio/x-m4a;') || audioTest.canPlayType('audio/m4a;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n m4b: !!(audioTest.canPlayType('audio/x-m4b;') || audioTest.canPlayType('audio/m4b;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n mp4: !!(audioTest.canPlayType('audio/x-mp4;') || audioTest.canPlayType('audio/mp4;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n weba: !!(!isOldSafari && audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, '')),\n webm: !!(!isOldSafari && audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, '')),\n dolby: !!audioTest.canPlayType('audio/mp4; codecs=\"ec-3\"').replace(/^no$/, ''),\n flac: !!(audioTest.canPlayType('audio/x-flac;') || audioTest.canPlayType('audio/flac;')).replace(/^no$/, '')\n };\n\n return self;\n },\n\n /**\n * Some browsers/devices will only allow audio to be played after a user interaction.\n * Attempt to automatically unlock audio on the first user interaction.\n * Concept from: http://paulbakaus.com/tutorials/html5/web-audio-on-ios/\n * @return {Howler}\n */\n _unlockAudio: function() {\n var self = this || Howler;\n\n // Only run this if Web Audio is supported and it hasn't already been unlocked.\n if (self._audioUnlocked || !self.ctx) {\n return;\n }\n\n self._audioUnlocked = false;\n self.autoUnlock = false;\n\n // Some mobile devices/platforms have distortion issues when opening/closing tabs and/or web views.\n // Bugs in the browser (especially Mobile Safari) can cause the sampleRate to change from 44100 to 48000.\n // By calling Howler.unload(), we create a new AudioContext with the correct sampleRate.\n if (!self._mobileUnloaded && self.ctx.sampleRate !== 44100) {\n self._mobileUnloaded = true;\n self.unload();\n }\n\n // Scratch buffer for enabling iOS to dispose of web audio buffers correctly, as per:\n // http://stackoverflow.com/questions/24119684\n self._scratchBuffer = self.ctx.createBuffer(1, 1, 22050);\n\n // Call this method on touch start to create and play a buffer,\n // then check if the audio actually played to determine if\n // audio has now been unlocked on iOS, Android, etc.\n var unlock = function(e) {\n // Create a pool of unlocked HTML5 Audio objects that can\n // be used for playing sounds without user interaction. HTML5\n // Audio objects must be individually unlocked, as opposed\n // to the WebAudio API which only needs a single activation.\n // This must occur before WebAudio setup or the source.onended\n // event will not fire.\n while (self._html5AudioPool.length < self.html5PoolSize) {\n try {\n var audioNode = new Audio();\n\n // Mark this Audio object as unlocked to ensure it can get returned\n // to the unlocked pool when released.\n audioNode._unlocked = true;\n\n // Add the audio node to the pool.\n self._releaseHtml5Audio(audioNode);\n } catch (e) {\n self.noAudio = true;\n break;\n }\n }\n\n // Loop through any assigned audio nodes and unlock them.\n for (var i=0; i= 55.\n if (typeof self.ctx.resume === 'function') {\n self.ctx.resume();\n }\n\n // Setup a timeout to check that we are unlocked on the next event loop.\n source.onended = function() {\n source.disconnect(0);\n\n // Update the unlocked state and prevent this check from happening again.\n self._audioUnlocked = true;\n\n // Remove the touch start listener.\n document.removeEventListener('touchstart', unlock, true);\n document.removeEventListener('touchend', unlock, true);\n document.removeEventListener('click', unlock, true);\n document.removeEventListener('keydown', unlock, true);\n\n // Let all sounds know that audio has been unlocked.\n for (var i=0; i 0 ? sound._seek : self._sprite[sprite][0] / 1000);\n var duration = Math.max(0, ((self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000) - seek);\n var timeout = (duration * 1000) / Math.abs(sound._rate);\n var start = self._sprite[sprite][0] / 1000;\n var stop = (self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000;\n sound._sprite = sprite;\n\n // Mark the sound as ended instantly so that this async playback\n // doesn't get grabbed by another call to play while this one waits to start.\n sound._ended = false;\n\n // Update the parameters of the sound.\n var setParams = function() {\n sound._paused = false;\n sound._seek = seek;\n sound._start = start;\n sound._stop = stop;\n sound._loop = !!(sound._loop || self._sprite[sprite][2]);\n };\n\n // End the sound instantly if seek is at the end.\n if (seek >= stop) {\n self._ended(sound);\n return;\n }\n\n // Begin the actual playback.\n var node = sound._node;\n if (self._webAudio) {\n // Fire this when the sound is ready to play to begin Web Audio playback.\n var playWebAudio = function() {\n self._playLock = false;\n setParams();\n self._refreshBuffer(sound);\n\n // Setup the playback params.\n var vol = (sound._muted || self._muted) ? 0 : sound._volume;\n node.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n sound._playStart = Howler.ctx.currentTime;\n\n // Play the sound using the supported method.\n if (typeof node.bufferSource.start === 'undefined') {\n sound._loop ? node.bufferSource.noteGrainOn(0, seek, 86400) : node.bufferSource.noteGrainOn(0, seek, duration);\n } else {\n sound._loop ? node.bufferSource.start(0, seek, 86400) : node.bufferSource.start(0, seek, duration);\n }\n\n // Start a new timer if none is present.\n if (timeout !== Infinity) {\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n }\n\n if (!internal) {\n setTimeout(function() {\n self._emit('play', sound._id);\n self._loadQueue();\n }, 0);\n }\n };\n\n if (Howler.state === 'running' && Howler.ctx.state !== 'interrupted') {\n playWebAudio();\n } else {\n self._playLock = true;\n\n // Wait for the audio context to resume before playing.\n self.once('resume', playWebAudio);\n\n // Cancel the end timer.\n self._clearTimer(sound._id);\n }\n } else {\n // Fire this when the sound is ready to play to begin HTML5 Audio playback.\n var playHtml5 = function() {\n node.currentTime = seek;\n node.muted = sound._muted || self._muted || Howler._muted || node.muted;\n node.volume = sound._volume * Howler.volume();\n node.playbackRate = sound._rate;\n\n // Some browsers will throw an error if this is called without user interaction.\n try {\n var play = node.play();\n\n // Support older browsers that don't support promises, and thus don't have this issue.\n if (play && typeof Promise !== 'undefined' && (play instanceof Promise || typeof play.then === 'function')) {\n // Implements a lock to prevent DOMException: The play() request was interrupted by a call to pause().\n self._playLock = true;\n\n // Set param values immediately.\n setParams();\n\n // Releases the lock and executes queued actions.\n play\n .then(function() {\n self._playLock = false;\n node._unlocked = true;\n if (!internal) {\n self._emit('play', sound._id);\n } else {\n self._loadQueue();\n }\n })\n .catch(function() {\n self._playLock = false;\n self._emit('playerror', sound._id, 'Playback was unable to start. This is most commonly an issue ' +\n 'on mobile devices and Chrome where playback was not within a user interaction.');\n\n // Reset the ended and paused values.\n sound._ended = true;\n sound._paused = true;\n });\n } else if (!internal) {\n self._playLock = false;\n setParams();\n self._emit('play', sound._id);\n }\n\n // Setting rate before playing won't work in IE, so we set it again here.\n node.playbackRate = sound._rate;\n\n // If the node is still paused, then we can assume there was a playback issue.\n if (node.paused) {\n self._emit('playerror', sound._id, 'Playback was unable to start. This is most commonly an issue ' +\n 'on mobile devices and Chrome where playback was not within a user interaction.');\n return;\n }\n\n // Setup the end timer on sprites or listen for the ended event.\n if (sprite !== '__default' || sound._loop) {\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n } else {\n self._endTimers[sound._id] = function() {\n // Fire ended on this audio node.\n self._ended(sound);\n\n // Clear this listener.\n node.removeEventListener('ended', self._endTimers[sound._id], false);\n };\n node.addEventListener('ended', self._endTimers[sound._id], false);\n }\n } catch (err) {\n self._emit('playerror', sound._id, err);\n }\n };\n\n // If this is streaming audio, make sure the src is set and load again.\n if (node.src === 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA') {\n node.src = self._src;\n node.load();\n }\n\n // Play immediately if ready, or wait for the 'canplaythrough'e vent.\n var loadedNoReadyState = (window && window.ejecta) || (!node.readyState && Howler._navigator.isCocoonJS);\n if (node.readyState >= 3 || loadedNoReadyState) {\n playHtml5();\n } else {\n self._playLock = true;\n self._state = 'loading';\n\n var listener = function() {\n self._state = 'loaded';\n \n // Begin playback.\n playHtml5();\n\n // Clear this listener.\n node.removeEventListener(Howler._canPlayEvent, listener, false);\n };\n node.addEventListener(Howler._canPlayEvent, listener, false);\n\n // Cancel the end timer.\n self._clearTimer(sound._id);\n }\n }\n\n return sound._id;\n },\n\n /**\n * Pause playback and save current position.\n * @param {Number} id The sound ID (empty to pause all in group).\n * @return {Howl}\n */\n pause: function(id) {\n var self = this;\n\n // If the sound hasn't loaded or a play() promise is pending, add it to the load queue to pause when capable.\n if (self._state !== 'loaded' || self._playLock) {\n self._queue.push({\n event: 'pause',\n action: function() {\n self.pause(id);\n }\n });\n\n return self;\n }\n\n // If no id is passed, get all ID's to be paused.\n var ids = self._getSoundIds(id);\n\n for (var i=0; i Returns the group's volume value.\n * volume(id) -> Returns the sound id's current volume.\n * volume(vol) -> Sets the volume of all sounds in this Howl group.\n * volume(vol, id) -> Sets the volume of passed sound id.\n * @return {Howl/Number} Returns self or current volume.\n */\n volume: function() {\n var self = this;\n var args = arguments;\n var vol, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // Return the value of the groups' volume.\n return self._volume;\n } else if (args.length === 1 || args.length === 2 && typeof args[1] === 'undefined') {\n // First check if this is an ID, and if not, assume it is a new volume.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else {\n vol = parseFloat(args[0]);\n }\n } else if (args.length >= 2) {\n vol = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // Update the volume or return the current volume.\n var sound;\n if (typeof vol !== 'undefined' && vol >= 0 && vol <= 1) {\n // If the sound hasn't loaded, add it to the load queue to change volume when capable.\n if (self._state !== 'loaded'|| self._playLock) {\n self._queue.push({\n event: 'volume',\n action: function() {\n self.volume.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Set the group volume.\n if (typeof id === 'undefined') {\n self._volume = vol;\n }\n\n // Update one or all volumes.\n id = self._getSoundIds(id);\n for (var i=0; i 0) ? len / steps : len);\n var lastTick = Date.now();\n\n // Store the value being faded to.\n sound._fadeTo = to;\n\n // Update the volume value on each interval tick.\n sound._interval = setInterval(function() {\n // Update the volume based on the time since the last tick.\n var tick = (Date.now() - lastTick) / len;\n lastTick = Date.now();\n vol += diff * tick;\n\n // Round to within 2 decimal points.\n vol = Math.round(vol * 100) / 100;\n\n // Make sure the volume is in the right bounds.\n if (diff < 0) {\n vol = Math.max(to, vol);\n } else {\n vol = Math.min(to, vol);\n }\n\n // Change the volume.\n if (self._webAudio) {\n sound._volume = vol;\n } else {\n self.volume(vol, sound._id, true);\n }\n\n // Set the group's volume.\n if (isGroup) {\n self._volume = vol;\n }\n\n // When the fade is complete, stop it and fire event.\n if ((to < from && vol <= to) || (to > from && vol >= to)) {\n clearInterval(sound._interval);\n sound._interval = null;\n sound._fadeTo = null;\n self.volume(to, sound._id);\n self._emit('fade', sound._id);\n }\n }, stepLen);\n },\n\n /**\n * Internal method that stops the currently playing fade when\n * a new fade starts, volume is changed or the sound is stopped.\n * @param {Number} id The sound id.\n * @return {Howl}\n */\n _stopFade: function(id) {\n var self = this;\n var sound = self._soundById(id);\n\n if (sound && sound._interval) {\n if (self._webAudio) {\n sound._node.gain.cancelScheduledValues(Howler.ctx.currentTime);\n }\n\n clearInterval(sound._interval);\n sound._interval = null;\n self.volume(sound._fadeTo, id);\n sound._fadeTo = null;\n self._emit('fade', id);\n }\n\n return self;\n },\n\n /**\n * Get/set the loop parameter on a sound. This method can optionally take 0, 1 or 2 arguments.\n * loop() -> Returns the group's loop value.\n * loop(id) -> Returns the sound id's loop value.\n * loop(loop) -> Sets the loop value for all sounds in this Howl group.\n * loop(loop, id) -> Sets the loop value of passed sound id.\n * @return {Howl/Boolean} Returns self or current loop value.\n */\n loop: function() {\n var self = this;\n var args = arguments;\n var loop, id, sound;\n\n // Determine the values for loop and id.\n if (args.length === 0) {\n // Return the grou's loop value.\n return self._loop;\n } else if (args.length === 1) {\n if (typeof args[0] === 'boolean') {\n loop = args[0];\n self._loop = loop;\n } else {\n // Return this sound's loop value.\n sound = self._soundById(parseInt(args[0], 10));\n return sound ? sound._loop : false;\n }\n } else if (args.length === 2) {\n loop = args[0];\n id = parseInt(args[1], 10);\n }\n\n // If no id is passed, get all ID's to be looped.\n var ids = self._getSoundIds(id);\n for (var i=0; i Returns the first sound node's current playback rate.\n * rate(id) -> Returns the sound id's current playback rate.\n * rate(rate) -> Sets the playback rate of all sounds in this Howl group.\n * rate(rate, id) -> Sets the playback rate of passed sound id.\n * @return {Howl/Number} Returns self or the current playback rate.\n */\n rate: function() {\n var self = this;\n var args = arguments;\n var rate, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // We will simply return the current rate of the first node.\n id = self._sounds[0]._id;\n } else if (args.length === 1) {\n // First check if this is an ID, and if not, assume it is a new rate value.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else {\n rate = parseFloat(args[0]);\n }\n } else if (args.length === 2) {\n rate = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // Update the playback rate or return the current value.\n var sound;\n if (typeof rate === 'number') {\n // If the sound hasn't loaded, add it to the load queue to change playback rate when capable.\n if (self._state !== 'loaded' || self._playLock) {\n self._queue.push({\n event: 'rate',\n action: function() {\n self.rate.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Set the group rate.\n if (typeof id === 'undefined') {\n self._rate = rate;\n }\n\n // Update one or all volumes.\n id = self._getSoundIds(id);\n for (var i=0; i Returns the first sound node's current seek position.\n * seek(id) -> Returns the sound id's current seek position.\n * seek(seek) -> Sets the seek position of the first sound node.\n * seek(seek, id) -> Sets the seek position of passed sound id.\n * @return {Howl/Number} Returns self or the current seek position.\n */\n seek: function() {\n var self = this;\n var args = arguments;\n var seek, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // We will simply return the current position of the first node.\n if (self._sounds.length) {\n id = self._sounds[0]._id;\n }\n } else if (args.length === 1) {\n // First check if this is an ID, and if not, assume it is a new seek position.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else if (self._sounds.length) {\n id = self._sounds[0]._id;\n seek = parseFloat(args[0]);\n }\n } else if (args.length === 2) {\n seek = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // If there is no ID, bail out.\n if (typeof id === 'undefined') {\n return 0;\n }\n\n // If the sound hasn't loaded, add it to the load queue to seek when capable.\n if (typeof seek === 'number' && (self._state !== 'loaded' || self._playLock)) {\n self._queue.push({\n event: 'seek',\n action: function() {\n self.seek.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Get the sound.\n var sound = self._soundById(id);\n\n if (sound) {\n if (typeof seek === 'number' && seek >= 0) {\n // Pause the sound and update position for restarting playback.\n var playing = self.playing(id);\n if (playing) {\n self.pause(id, true);\n }\n\n // Move the position of the track and cancel timer.\n sound._seek = seek;\n sound._ended = false;\n self._clearTimer(id);\n\n // Update the seek position for HTML5 Audio.\n if (!self._webAudio && sound._node && !isNaN(sound._node.duration)) {\n sound._node.currentTime = seek;\n }\n\n // Seek and emit when ready.\n var seekAndEmit = function() {\n // Restart the playback if the sound was playing.\n if (playing) {\n self.play(id, true);\n }\n\n self._emit('seek', id);\n };\n\n // Wait for the play lock to be unset before emitting (HTML5 Audio).\n if (playing && !self._webAudio) {\n var emitSeek = function() {\n if (!self._playLock) {\n seekAndEmit();\n } else {\n setTimeout(emitSeek, 0);\n }\n };\n setTimeout(emitSeek, 0);\n } else {\n seekAndEmit();\n }\n } else {\n if (self._webAudio) {\n var realTime = self.playing(id) ? Howler.ctx.currentTime - sound._playStart : 0;\n var rateSeek = sound._rateSeek ? sound._rateSeek - sound._seek : 0;\n return sound._seek + (rateSeek + realTime * Math.abs(sound._rate));\n } else {\n return sound._node.currentTime;\n }\n }\n }\n\n return self;\n },\n\n /**\n * Check if a specific sound is currently playing or not (if id is provided), or check if at least one of the sounds in the group is playing or not.\n * @param {Number} id The sound id to check. If none is passed, the whole sound group is checked.\n * @return {Boolean} True if playing and false if not.\n */\n playing: function(id) {\n var self = this;\n\n // Check the passed sound ID (if any).\n if (typeof id === 'number') {\n var sound = self._soundById(id);\n return sound ? !sound._paused : false;\n }\n\n // Otherwise, loop through all sounds and check if any are playing.\n for (var i=0; i= 0) {\n Howler._howls.splice(index, 1);\n }\n\n // Delete this sound from the cache (if no other Howl is using it).\n var remCache = true;\n for (i=0; i= 0) {\n remCache = false;\n break;\n }\n }\n\n if (cache && remCache) {\n delete cache[self._src];\n }\n\n // Clear global errors.\n Howler.noAudio = false;\n\n // Clear out `self`.\n self._state = 'unloaded';\n self._sounds = [];\n self = null;\n\n return null;\n },\n\n /**\n * Listen to a custom event.\n * @param {String} event Event name.\n * @param {Function} fn Listener to call.\n * @param {Number} id (optional) Only listen to events for this sound.\n * @param {Number} once (INTERNAL) Marks event to fire only once.\n * @return {Howl}\n */\n on: function(event, fn, id, once) {\n var self = this;\n var events = self['_on' + event];\n\n if (typeof fn === 'function') {\n events.push(once ? {id: id, fn: fn, once: once} : {id: id, fn: fn});\n }\n\n return self;\n },\n\n /**\n * Remove a custom event. Call without parameters to remove all events.\n * @param {String} event Event name.\n * @param {Function} fn Listener to remove. Leave empty to remove all.\n * @param {Number} id (optional) Only remove events for this sound.\n * @return {Howl}\n */\n off: function(event, fn, id) {\n var self = this;\n var events = self['_on' + event];\n var i = 0;\n\n // Allow passing just an event and ID.\n if (typeof fn === 'number') {\n id = fn;\n fn = null;\n }\n\n if (fn || id) {\n // Loop through event store and remove the passed function.\n for (i=0; i=0; i--) {\n // Only fire the listener if the correct ID is used.\n if (!events[i].id || events[i].id === id || event === 'load') {\n setTimeout(function(fn) {\n fn.call(this, id, msg);\n }.bind(self, events[i].fn), 0);\n\n // If this event was setup with `once`, remove it.\n if (events[i].once) {\n self.off(event, events[i].fn, events[i].id);\n }\n }\n }\n\n // Pass the event type into load queue so that it can continue stepping.\n self._loadQueue(event);\n\n return self;\n },\n\n /**\n * Queue of actions initiated before the sound has loaded.\n * These will be called in sequence, with the next only firing\n * after the previous has finished executing (even if async like play).\n * @return {Howl}\n */\n _loadQueue: function(event) {\n var self = this;\n\n if (self._queue.length > 0) {\n var task = self._queue[0];\n\n // Remove this task if a matching event was passed.\n if (task.event === event) {\n self._queue.shift();\n self._loadQueue();\n }\n\n // Run the task if no event type is passed.\n if (!event) {\n task.action();\n }\n }\n\n return self;\n },\n\n /**\n * Fired when playback ends at the end of the duration.\n * @param {Sound} sound The sound object to work with.\n * @return {Howl}\n */\n _ended: function(sound) {\n var self = this;\n var sprite = sound._sprite;\n\n // If we are using IE and there was network latency we may be clipping\n // audio before it completes playing. Lets check the node to make sure it\n // believes it has completed, before ending the playback.\n if (!self._webAudio && sound._node && !sound._node.paused && !sound._node.ended && sound._node.currentTime < sound._stop) {\n setTimeout(self._ended.bind(self, sound), 100);\n return self;\n }\n\n // Should this sound loop?\n var loop = !!(sound._loop || self._sprite[sprite][2]);\n\n // Fire the ended event.\n self._emit('end', sound._id);\n\n // Restart the playback for HTML5 Audio loop.\n if (!self._webAudio && loop) {\n self.stop(sound._id, true).play(sound._id);\n }\n\n // Restart this timer if on a Web Audio loop.\n if (self._webAudio && loop) {\n self._emit('play', sound._id);\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n sound._playStart = Howler.ctx.currentTime;\n\n var timeout = ((sound._stop - sound._start) * 1000) / Math.abs(sound._rate);\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n }\n\n // Mark the node as paused.\n if (self._webAudio && !loop) {\n sound._paused = true;\n sound._ended = true;\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n self._clearTimer(sound._id);\n\n // Clean up the buffer source.\n self._cleanBuffer(sound._node);\n\n // Attempt to auto-suspend AudioContext if no sounds are still playing.\n Howler._autoSuspend();\n }\n\n // When using a sprite, end the track.\n if (!self._webAudio && !loop) {\n self.stop(sound._id, true);\n }\n\n return self;\n },\n\n /**\n * Clear the end timer for a sound playback.\n * @param {Number} id The sound ID.\n * @return {Howl}\n */\n _clearTimer: function(id) {\n var self = this;\n\n if (self._endTimers[id]) {\n // Clear the timeout or remove the ended listener.\n if (typeof self._endTimers[id] !== 'function') {\n clearTimeout(self._endTimers[id]);\n } else {\n var sound = self._soundById(id);\n if (sound && sound._node) {\n sound._node.removeEventListener('ended', self._endTimers[id], false);\n }\n }\n\n delete self._endTimers[id];\n }\n\n return self;\n },\n\n /**\n * Return the sound identified by this ID, or return null.\n * @param {Number} id Sound ID\n * @return {Object} Sound object or null.\n */\n _soundById: function(id) {\n var self = this;\n\n // Loop through all sounds and find the one with this ID.\n for (var i=0; i=0; i--) {\n if (cnt <= limit) {\n return;\n }\n\n if (self._sounds[i]._ended) {\n // Disconnect the audio source when using Web Audio.\n if (self._webAudio && self._sounds[i]._node) {\n self._sounds[i]._node.disconnect(0);\n }\n\n // Remove sounds until we have the pool size.\n self._sounds.splice(i, 1);\n cnt--;\n }\n }\n },\n\n /**\n * Get all ID's from the sounds pool.\n * @param {Number} id Only return one ID if one is passed.\n * @return {Array} Array of IDs.\n */\n _getSoundIds: function(id) {\n var self = this;\n\n if (typeof id === 'undefined') {\n var ids = [];\n for (var i=0; i= 0;\n\n if (!node.bufferSource) {\n return self;\n }\n\n if (Howler._scratchBuffer && node.bufferSource) {\n node.bufferSource.onended = null;\n node.bufferSource.disconnect(0);\n if (isIOS) {\n try { node.bufferSource.buffer = Howler._scratchBuffer; } catch(e) {}\n }\n }\n node.bufferSource = null;\n\n return self;\n },\n\n /**\n * Set the source to a 0-second silence to stop any downloading (except in IE).\n * @param {Object} node Audio node to clear.\n */\n _clearSound: function(node) {\n var checkIE = /MSIE |Trident\\//.test(Howler._navigator && Howler._navigator.userAgent);\n if (!checkIE) {\n node.src = 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA';\n }\n }\n };\n\n /** Single Sound Methods **/\n /***************************************************************************/\n\n /**\n * Setup the sound object, which each node attached to a Howl group is contained in.\n * @param {Object} howl The Howl parent group.\n */\n var Sound = function(howl) {\n this._parent = howl;\n this.init();\n };\n Sound.prototype = {\n /**\n * Initialize a new Sound object.\n * @return {Sound}\n */\n init: function() {\n var self = this;\n var parent = self._parent;\n\n // Setup the default parameters.\n self._muted = parent._muted;\n self._loop = parent._loop;\n self._volume = parent._volume;\n self._rate = parent._rate;\n self._seek = 0;\n self._paused = true;\n self._ended = true;\n self._sprite = '__default';\n\n // Generate a unique ID for this sound.\n self._id = ++Howler._counter;\n\n // Add itself to the parent's pool.\n parent._sounds.push(self);\n\n // Create the new node.\n self.create();\n\n return self;\n },\n\n /**\n * Create and setup a new sound object, whether HTML5 Audio or Web Audio.\n * @return {Sound}\n */\n create: function() {\n var self = this;\n var parent = self._parent;\n var volume = (Howler._muted || self._muted || self._parent._muted) ? 0 : self._volume;\n\n if (parent._webAudio) {\n // Create the gain node for controlling volume (the source will connect to this).\n self._node = (typeof Howler.ctx.createGain === 'undefined') ? Howler.ctx.createGainNode() : Howler.ctx.createGain();\n self._node.gain.setValueAtTime(volume, Howler.ctx.currentTime);\n self._node.paused = true;\n self._node.connect(Howler.masterGain);\n } else if (!Howler.noAudio) {\n // Get an unlocked Audio object from the pool.\n self._node = Howler._obtainHtml5Audio();\n\n // Listen for errors (http://dev.w3.org/html5/spec-author-view/spec.html#mediaerror).\n self._errorFn = self._errorListener.bind(self);\n self._node.addEventListener('error', self._errorFn, false);\n\n // Listen for 'canplaythrough' event to let us know the sound is ready.\n self._loadFn = self._loadListener.bind(self);\n self._node.addEventListener(Howler._canPlayEvent, self._loadFn, false);\n\n // Listen for the 'ended' event on the sound to account for edge-case where\n // a finite sound has a duration of Infinity.\n self._endFn = self._endListener.bind(self);\n self._node.addEventListener('ended', self._endFn, false);\n\n // Setup the new audio node.\n self._node.src = parent._src;\n self._node.preload = parent._preload === true ? 'auto' : parent._preload;\n self._node.volume = volume * Howler.volume();\n\n // Begin loading the source.\n self._node.load();\n }\n\n return self;\n },\n\n /**\n * Reset the parameters of this sound to the original state (for recycle).\n * @return {Sound}\n */\n reset: function() {\n var self = this;\n var parent = self._parent;\n\n // Reset all of the parameters of this sound.\n self._muted = parent._muted;\n self._loop = parent._loop;\n self._volume = parent._volume;\n self._rate = parent._rate;\n self._seek = 0;\n self._rateSeek = 0;\n self._paused = true;\n self._ended = true;\n self._sprite = '__default';\n\n // Generate a new ID so that it isn't confused with the previous sound.\n self._id = ++Howler._counter;\n\n return self;\n },\n\n /**\n * HTML5 Audio error listener callback.\n */\n _errorListener: function() {\n var self = this;\n\n // Fire an error event and pass back the code.\n self._parent._emit('loaderror', self._id, self._node.error ? self._node.error.code : 0);\n\n // Clear the event listener.\n self._node.removeEventListener('error', self._errorFn, false);\n },\n\n /**\n * HTML5 Audio canplaythrough listener callback.\n */\n _loadListener: function() {\n var self = this;\n var parent = self._parent;\n\n // Round up the duration to account for the lower precision in HTML5 Audio.\n parent._duration = Math.ceil(self._node.duration * 10) / 10;\n\n // Setup a sprite if none is defined.\n if (Object.keys(parent._sprite).length === 0) {\n parent._sprite = {__default: [0, parent._duration * 1000]};\n }\n\n if (parent._state !== 'loaded') {\n parent._state = 'loaded';\n parent._emit('load');\n parent._loadQueue();\n }\n\n // Clear the event listener.\n self._node.removeEventListener(Howler._canPlayEvent, self._loadFn, false);\n },\n\n /**\n * HTML5 Audio ended listener callback.\n */\n _endListener: function() {\n var self = this;\n var parent = self._parent;\n\n // Only handle the `ended`` event if the duration is Infinity.\n if (parent._duration === Infinity) {\n // Update the parent duration to match the real audio duration.\n // Round up the duration to account for the lower precision in HTML5 Audio.\n parent._duration = Math.ceil(self._node.duration * 10) / 10;\n\n // Update the sprite that corresponds to the real duration.\n if (parent._sprite.__default[1] === Infinity) {\n parent._sprite.__default[1] = parent._duration * 1000;\n }\n\n // Run the regular ended method.\n parent._ended(self);\n }\n\n // Clear the event listener since the duration is now correct.\n self._node.removeEventListener('ended', self._endFn, false);\n }\n };\n\n /** Helper Methods **/\n /***************************************************************************/\n\n var cache = {};\n\n /**\n * Buffer a sound from URL, Data URI or cache and decode to audio source (Web Audio API).\n * @param {Howl} self\n */\n var loadBuffer = function(self) {\n var url = self._src;\n\n // Check if the buffer has already been cached and use it instead.\n if (cache[url]) {\n // Set the duration from the cache.\n self._duration = cache[url].duration;\n\n // Load the sound into this Howl.\n loadSound(self);\n\n return;\n }\n\n if (/^data:[^;]+;base64,/.test(url)) {\n // Decode the base64 data URI without XHR, since some browsers don't support it.\n var data = atob(url.split(',')[1]);\n var dataView = new Uint8Array(data.length);\n for (var i=0; i 0) {\n cache[self._src] = buffer;\n loadSound(self, buffer);\n } else {\n error();\n }\n };\n\n // Decode the buffer into an audio source.\n if (typeof Promise !== 'undefined' && Howler.ctx.decodeAudioData.length === 1) {\n Howler.ctx.decodeAudioData(arraybuffer).then(success).catch(error);\n } else {\n Howler.ctx.decodeAudioData(arraybuffer, success, error);\n }\n }\n\n /**\n * Sound is now loaded, so finish setting everything up and fire the loaded event.\n * @param {Howl} self\n * @param {Object} buffer The decoded buffer sound source.\n */\n var loadSound = function(self, buffer) {\n // Set the duration.\n if (buffer && !self._duration) {\n self._duration = buffer.duration;\n }\n\n // Setup a sprite if none is defined.\n if (Object.keys(self._sprite).length === 0) {\n self._sprite = {__default: [0, self._duration * 1000]};\n }\n\n // Fire the loaded event.\n if (self._state !== 'loaded') {\n self._state = 'loaded';\n self._emit('load');\n self._loadQueue();\n }\n };\n\n /**\n * Setup the audio context when available, or switch to HTML5 Audio mode.\n */\n var setupAudioContext = function() {\n // If we have already detected that Web Audio isn't supported, don't run this step again.\n if (!Howler.usingWebAudio) {\n return;\n }\n\n // Check if we are using Web Audio and setup the AudioContext if we are.\n try {\n if (typeof AudioContext !== 'undefined') {\n Howler.ctx = new AudioContext();\n } else if (typeof webkitAudioContext !== 'undefined') {\n Howler.ctx = new webkitAudioContext();\n } else {\n Howler.usingWebAudio = false;\n }\n } catch(e) {\n Howler.usingWebAudio = false;\n }\n\n // If the audio context creation still failed, set using web audio to false.\n if (!Howler.ctx) {\n Howler.usingWebAudio = false;\n }\n\n // Check if a webview is being used on iOS8 or earlier (rather than the browser).\n // If it is, disable Web Audio as it causes crashing.\n var iOS = (/iP(hone|od|ad)/.test(Howler._navigator && Howler._navigator.platform));\n var appVersion = Howler._navigator && Howler._navigator.appVersion.match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n var version = appVersion ? parseInt(appVersion[1], 10) : null;\n if (iOS && version && version < 9) {\n var safari = /safari/.test(Howler._navigator && Howler._navigator.userAgent.toLowerCase());\n if (Howler._navigator && !safari) {\n Howler.usingWebAudio = false;\n }\n }\n\n // Create and expose the master GainNode when using Web Audio (useful for plugins or advanced usage).\n if (Howler.usingWebAudio) {\n Howler.masterGain = (typeof Howler.ctx.createGain === 'undefined') ? Howler.ctx.createGainNode() : Howler.ctx.createGain();\n Howler.masterGain.gain.setValueAtTime(Howler._muted ? 0 : Howler._volume, Howler.ctx.currentTime);\n Howler.masterGain.connect(Howler.ctx.destination);\n }\n\n // Re-run the setup on Howler.\n Howler._setup();\n };\n\n // Add support for AMD (Asynchronous Module Definition) libraries such as require.js.\n if (typeof define === 'function' && define.amd) {\n define([], function() {\n return {\n Howler: Howler,\n Howl: Howl\n };\n });\n }\n\n // Add support for CommonJS libraries such as browserify.\n if (typeof exports !== 'undefined') {\n exports.Howler = Howler;\n exports.Howl = Howl;\n }\n\n // Add to global in Node.js (for testing, etc).\n if (typeof global !== 'undefined') {\n global.HowlerGlobal = HowlerGlobal;\n global.Howler = Howler;\n global.Howl = Howl;\n global.Sound = Sound;\n } else if (typeof window !== 'undefined') { // Define globally in case AMD is not available or unused.\n window.HowlerGlobal = HowlerGlobal;\n window.Howler = Howler;\n window.Howl = Howl;\n window.Sound = Sound;\n }\n})();\n\n\n/*!\n * Spatial Plugin - Adds support for stereo and 3D audio where Web Audio is supported.\n * \n * howler.js v2.2.4\n * howlerjs.com\n *\n * (c) 2013-2020, James Simpson of GoldFire Studios\n * goldfirestudios.com\n *\n * MIT License\n */\n\n(function() {\n\n 'use strict';\n\n // Setup default properties.\n HowlerGlobal.prototype._pos = [0, 0, 0];\n HowlerGlobal.prototype._orientation = [0, 0, -1, 0, 1, 0];\n\n /** Global Methods **/\n /***************************************************************************/\n\n /**\n * Helper method to update the stereo panning position of all current Howls.\n * Future Howls will not use this value unless explicitly set.\n * @param {Number} pan A value of -1.0 is all the way left and 1.0 is all the way right.\n * @return {Howler/Number} Self or current stereo panning value.\n */\n HowlerGlobal.prototype.stereo = function(pan) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Loop through all Howls and update their stereo panning.\n for (var i=self._howls.length-1; i>=0; i--) {\n self._howls[i].stereo(pan);\n }\n\n return self;\n };\n\n /**\n * Get/set the position of the listener in 3D cartesian space. Sounds using\n * 3D position will be relative to the listener's position.\n * @param {Number} x The x-position of the listener.\n * @param {Number} y The y-position of the listener.\n * @param {Number} z The z-position of the listener.\n * @return {Howler/Array} Self or current listener position.\n */\n HowlerGlobal.prototype.pos = function(x, y, z) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Set the defaults for optional 'y' & 'z'.\n y = (typeof y !== 'number') ? self._pos[1] : y;\n z = (typeof z !== 'number') ? self._pos[2] : z;\n\n if (typeof x === 'number') {\n self._pos = [x, y, z];\n\n if (typeof self.ctx.listener.positionX !== 'undefined') {\n self.ctx.listener.positionX.setTargetAtTime(self._pos[0], Howler.ctx.currentTime, 0.1);\n self.ctx.listener.positionY.setTargetAtTime(self._pos[1], Howler.ctx.currentTime, 0.1);\n self.ctx.listener.positionZ.setTargetAtTime(self._pos[2], Howler.ctx.currentTime, 0.1);\n } else {\n self.ctx.listener.setPosition(self._pos[0], self._pos[1], self._pos[2]);\n }\n } else {\n return self._pos;\n }\n\n return self;\n };\n\n /**\n * Get/set the direction the listener is pointing in the 3D cartesian space.\n * A front and up vector must be provided. The front is the direction the\n * face of the listener is pointing, and up is the direction the top of the\n * listener is pointing. Thus, these values are expected to be at right angles\n * from each other.\n * @param {Number} x The x-orientation of the listener.\n * @param {Number} y The y-orientation of the listener.\n * @param {Number} z The z-orientation of the listener.\n * @param {Number} xUp The x-orientation of the top of the listener.\n * @param {Number} yUp The y-orientation of the top of the listener.\n * @param {Number} zUp The z-orientation of the top of the listener.\n * @return {Howler/Array} Returns self or the current orientation vectors.\n */\n HowlerGlobal.prototype.orientation = function(x, y, z, xUp, yUp, zUp) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Set the defaults for optional 'y' & 'z'.\n var or = self._orientation;\n y = (typeof y !== 'number') ? or[1] : y;\n z = (typeof z !== 'number') ? or[2] : z;\n xUp = (typeof xUp !== 'number') ? or[3] : xUp;\n yUp = (typeof yUp !== 'number') ? or[4] : yUp;\n zUp = (typeof zUp !== 'number') ? or[5] : zUp;\n\n if (typeof x === 'number') {\n self._orientation = [x, y, z, xUp, yUp, zUp];\n\n if (typeof self.ctx.listener.forwardX !== 'undefined') {\n self.ctx.listener.forwardX.setTargetAtTime(x, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.forwardY.setTargetAtTime(y, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.forwardZ.setTargetAtTime(z, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upX.setTargetAtTime(xUp, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upY.setTargetAtTime(yUp, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upZ.setTargetAtTime(zUp, Howler.ctx.currentTime, 0.1);\n } else {\n self.ctx.listener.setOrientation(x, y, z, xUp, yUp, zUp);\n }\n } else {\n return or;\n }\n\n return self;\n };\n\n /** Group Methods **/\n /***************************************************************************/\n\n /**\n * Add new properties to the core init.\n * @param {Function} _super Core init method.\n * @return {Howl}\n */\n Howl.prototype.init = (function(_super) {\n return function(o) {\n var self = this;\n\n // Setup user-defined default properties.\n self._orientation = o.orientation || [1, 0, 0];\n self._stereo = o.stereo || null;\n self._pos = o.pos || null;\n self._pannerAttr = {\n coneInnerAngle: typeof o.coneInnerAngle !== 'undefined' ? o.coneInnerAngle : 360,\n coneOuterAngle: typeof o.coneOuterAngle !== 'undefined' ? o.coneOuterAngle : 360,\n coneOuterGain: typeof o.coneOuterGain !== 'undefined' ? o.coneOuterGain : 0,\n distanceModel: typeof o.distanceModel !== 'undefined' ? o.distanceModel : 'inverse',\n maxDistance: typeof o.maxDistance !== 'undefined' ? o.maxDistance : 10000,\n panningModel: typeof o.panningModel !== 'undefined' ? o.panningModel : 'HRTF',\n refDistance: typeof o.refDistance !== 'undefined' ? o.refDistance : 1,\n rolloffFactor: typeof o.rolloffFactor !== 'undefined' ? o.rolloffFactor : 1\n };\n\n // Setup event listeners.\n self._onstereo = o.onstereo ? [{fn: o.onstereo}] : [];\n self._onpos = o.onpos ? [{fn: o.onpos}] : [];\n self._onorientation = o.onorientation ? [{fn: o.onorientation}] : [];\n\n // Complete initilization with howler.js core's init function.\n return _super.call(this, o);\n };\n })(Howl.prototype.init);\n\n /**\n * Get/set the stereo panning of the audio source for this sound or all in the group.\n * @param {Number} pan A value of -1.0 is all the way left and 1.0 is all the way right.\n * @param {Number} id (optional) The sound ID. If none is passed, all in group will be updated.\n * @return {Howl/Number} Returns self or the current stereo panning value.\n */\n Howl.prototype.stereo = function(pan, id) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self._webAudio) {\n return self;\n }\n\n // If the sound hasn't loaded, add it to the load queue to change stereo pan when capable.\n if (self._state !== 'loaded') {\n self._queue.push({\n event: 'stereo',\n action: function() {\n self.stereo(pan, id);\n }\n });\n\n return self;\n }\n\n // Check for PannerStereoNode support and fallback to PannerNode if it doesn't exist.\n var pannerType = (typeof Howler.ctx.createStereoPanner === 'undefined') ? 'spatial' : 'stereo';\n\n // Setup the group's stereo panning if no ID is passed.\n if (typeof id === 'undefined') {\n // Return the group's stereo panning if no parameters are passed.\n if (typeof pan === 'number') {\n self._stereo = pan;\n self._pos = [pan, 0, 0];\n } else {\n return self._stereo;\n }\n }\n\n // Change the streo panning of one or all sounds in group.\n var ids = self._getSoundIds(id);\n for (var i=0; i Returns the group's values.\n * pannerAttr(id) -> Returns the sound id's values.\n * pannerAttr(o) -> Set's the values of all sounds in this Howl group.\n * pannerAttr(o, id) -> Set's the values of passed sound id.\n *\n * Attributes:\n * coneInnerAngle - (360 by default) A parameter for directional audio sources, this is an angle, in degrees,\n * inside of which there will be no volume reduction.\n * coneOuterAngle - (360 by default) A parameter for directional audio sources, this is an angle, in degrees,\n * outside of which the volume will be reduced to a constant value of `coneOuterGain`.\n * coneOuterGain - (0 by default) A parameter for directional audio sources, this is the gain outside of the\n * `coneOuterAngle`. It is a linear value in the range `[0, 1]`.\n * distanceModel - ('inverse' by default) Determines algorithm used to reduce volume as audio moves away from\n * listener. Can be `linear`, `inverse` or `exponential.\n * maxDistance - (10000 by default) The maximum distance between source and listener, after which the volume\n * will not be reduced any further.\n * refDistance - (1 by default) A reference distance for reducing volume as source moves further from the listener.\n * This is simply a variable of the distance model and has a different effect depending on which model\n * is used and the scale of your coordinates. Generally, volume will be equal to 1 at this distance.\n * rolloffFactor - (1 by default) How quickly the volume reduces as source moves from listener. This is simply a\n * variable of the distance model and can be in the range of `[0, 1]` with `linear` and `[0, ∞]`\n * with `inverse` and `exponential`.\n * panningModel - ('HRTF' by default) Determines which spatialization algorithm is used to position audio.\n * Can be `HRTF` or `equalpower`.\n *\n * @return {Howl/Object} Returns self or current panner attributes.\n */\n Howl.prototype.pannerAttr = function() {\n var self = this;\n var args = arguments;\n var o, id, sound;\n\n // Stop right here if not using Web Audio.\n if (!self._webAudio) {\n return self;\n }\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // Return the group's panner attribute values.\n return self._pannerAttr;\n } else if (args.length === 1) {\n if (typeof args[0] === 'object') {\n o = args[0];\n\n // Set the grou's panner attribute values.\n if (typeof id === 'undefined') {\n if (!o.pannerAttr) {\n o.pannerAttr = {\n coneInnerAngle: o.coneInnerAngle,\n coneOuterAngle: o.coneOuterAngle,\n coneOuterGain: o.coneOuterGain,\n distanceModel: o.distanceModel,\n maxDistance: o.maxDistance,\n refDistance: o.refDistance,\n rolloffFactor: o.rolloffFactor,\n panningModel: o.panningModel\n };\n }\n\n self._pannerAttr = {\n coneInnerAngle: typeof o.pannerAttr.coneInnerAngle !== 'undefined' ? o.pannerAttr.coneInnerAngle : self._coneInnerAngle,\n coneOuterAngle: typeof o.pannerAttr.coneOuterAngle !== 'undefined' ? o.pannerAttr.coneOuterAngle : self._coneOuterAngle,\n coneOuterGain: typeof o.pannerAttr.coneOuterGain !== 'undefined' ? o.pannerAttr.coneOuterGain : self._coneOuterGain,\n distanceModel: typeof o.pannerAttr.distanceModel !== 'undefined' ? o.pannerAttr.distanceModel : self._distanceModel,\n maxDistance: typeof o.pannerAttr.maxDistance !== 'undefined' ? o.pannerAttr.maxDistance : self._maxDistance,\n refDistance: typeof o.pannerAttr.refDistance !== 'undefined' ? o.pannerAttr.refDistance : self._refDistance,\n rolloffFactor: typeof o.pannerAttr.rolloffFactor !== 'undefined' ? o.pannerAttr.rolloffFactor : self._rolloffFactor,\n panningModel: typeof o.pannerAttr.panningModel !== 'undefined' ? o.pannerAttr.panningModel : self._panningModel\n };\n }\n } else {\n // Return this sound's panner attribute values.\n sound = self._soundById(parseInt(args[0], 10));\n return sound ? sound._pannerAttr : self._pannerAttr;\n }\n } else if (args.length === 2) {\n o = args[0];\n id = parseInt(args[1], 10);\n }\n\n // Update the values of the specified sounds.\n var ids = self._getSoundIds(id);\n for (var i=0; i\\s+<')\n}\n\nmodule.exports.html = html\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","__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})();","var __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\n\n// src/nrk-types.ts\nvar ClickEventKind = /* @__PURE__ */ ((ClickEventKind2) => {\n ClickEventKind2[\"Content\"] = \"content\";\n ClickEventKind2[\"Other\"] = \"other\";\n return ClickEventKind2;\n})(ClickEventKind || {});\nvar ImpressionEventKind = /* @__PURE__ */ ((ImpressionEventKind2) => {\n ImpressionEventKind2[\"Impression\"] = \"impression\";\n return ImpressionEventKind2;\n})(ImpressionEventKind || {});\nvar PlaybackEventKind = /* @__PURE__ */ ((PlaybackEventKind2) => {\n PlaybackEventKind2[\"Complete\"] = \"complete\";\n PlaybackEventKind2[\"Exit\"] = \"exit\";\n PlaybackEventKind2[\"Progress\"] = \"progress\";\n PlaybackEventKind2[\"Start\"] = \"start\";\n return PlaybackEventKind2;\n})(PlaybackEventKind || {});\nvar SearchSource = /* @__PURE__ */ ((SearchSource2) => {\n SearchSource2[\"PopularSearch\"] = \"popular-search\";\n SearchSource2[\"PreviousResult\"] = \"previous-result\";\n SearchSource2[\"Search\"] = \"search\";\n return SearchSource2;\n})(SearchSource || {});\nvar ViewportEventKind = /* @__PURE__ */ ((ViewportEventKind2) => {\n ViewportEventKind2[\"Entry\"] = \"entry\";\n ViewportEventKind2[\"Exit\"] = \"exit\";\n return ViewportEventKind2;\n})(ViewportEventKind || {});\nvar EventSchema = /* @__PURE__ */ ((EventSchema3) => {\n EventSchema3[\"BackstageEvent\"] = \"iglu:no.nrk.innlogging/backstage-event/jsonschema/1-0-0\";\n EventSchema3[\"ClickEvent\"] = \"iglu:no.nrk/click-event/jsonschema/1-0-0\";\n EventSchema3[\"FrontstageServerEvent\"] = \"iglu:no.nrk.innlogging/frontstage-server-event/jsonschema/1-0-0\";\n EventSchema3[\"ImpressionEvent\"] = \"iglu:no.nrk/impression-event/jsonschema/1-0-0\";\n EventSchema3[\"LoginRegisterFlowEvent\"] = \"iglu:no.nrk.innlogging/login-register-flow-event/jsonschema/1-0-0\";\n EventSchema3[\"PlaybackEvent\"] = \"iglu:no.nrk/playback-event/jsonschema/1-0-0\";\n EventSchema3[\"ProfilePageEvent\"] = \"iglu:no.nrk.innlogging/profile-page-event/jsonschema/1-0-0\";\n EventSchema3[\"RadioEvent\"] = \"iglu:no.nrk.radio/radio-event/jsonschema/1-0-0\";\n EventSchema3[\"SearchEvent\"] = \"iglu:no.nrk/search-event/jsonschema/1-0-0\";\n EventSchema3[\"StepEvent\"] = \"iglu:no.nrk.dh/step-event/jsonschema/1-0-0\";\n EventSchema3[\"TimeSpentEvent\"] = \"iglu:no.nrk/time-spent-event/jsonschema/1-0-0\";\n EventSchema3[\"ViewportEvent\"] = \"iglu:no.nrk.dh/viewport-event/jsonschema/1-0-0\";\n return EventSchema3;\n})(EventSchema || {});\nvar EntitySchema = /* @__PURE__ */ ((EntitySchema2) => {\n EntitySchema2[\"ClientID\"] = \"iglu:no.nrk.innlogging/client-id/jsonschema/1-0-0\";\n EntitySchema2[\"Content\"] = \"iglu:no.nrk/content/jsonschema/1-0-1\";\n EntitySchema2[\"Experiment\"] = \"iglu:no.nrk/experiment/jsonschema/1-0-0\";\n EntitySchema2[\"Link\"] = \"iglu:no.nrk/link/jsonschema/2-0-0\";\n EntitySchema2[\"NrkSession\"] = \"iglu:no.nrk/nrk-session/jsonschema/1-0-0\";\n EntitySchema2[\"NrkUser\"] = \"iglu:no.nrk/nrk-user/jsonschema/1-0-0\";\n EntitySchema2[\"Plug\"] = \"iglu:no.nrk/plug/jsonschema/3-0-0\";\n EntitySchema2[\"PreviousWebPage\"] = \"iglu:no.nrk/previous-web-page/jsonschema/1-0-0\";\n EntitySchema2[\"RegistrationContext\"] = \"iglu:no.nrk.innlogging/registration-context/jsonschema/1-0-0\";\n EntitySchema2[\"SearchResult\"] = \"iglu:no.nrk/search-result/jsonschema/1-0-1\";\n EntitySchema2[\"Service\"] = \"iglu:no.nrk/service/jsonschema/2-0-0\";\n EntitySchema2[\"Application\"] = \"iglu:com.snowplowanalytics.mobile/application/jsonschema/1-0-0\";\n return EntitySchema2;\n})(EntitySchema || {});\n\n// src/nrk-base-tracker.ts\nimport cuid from \"cuid\";\nvar NrkBaseTracker = class {\n constructor(snowplow, config) {\n this.sharedEntities = {};\n var _a, _b, _c;\n this.snowplow = snowplow;\n this.trackerId = (_a = config.trackerId) != null ? _a : cuid.slug();\n this.setSharedEntity(\"iglu:no.nrk/service/jsonschema/2-0-0\" /* Service */, { id: config.serviceId, environment: (_b = config.environment) != null ? _b : null });\n if (config.appVersion && config.appBuild) {\n this.setSharedEntity(\"iglu:com.snowplowanalytics.mobile/application/jsonschema/1-0-0\" /* Application */, { build: config.appBuild, version: config.appVersion });\n }\n snowplow.newTracker(this.trackerId, config.collectorUrl, {\n postPath: \"/nrk/wd6\",\n appId: config.appId,\n plugins: config.plugins,\n platform: (_c = config.platform) != null ? _c : \"web\",\n contexts: {\n webPage: config.disableWebContext !== true\n },\n stateStorageStrategy: config.disableLocalStorage ? \"cookie\" : void 0\n });\n }\n /**\n * Track page view.\n */\n trackPageView(contentEntity) {\n if (contentEntity) {\n this.snowplow.trackPageView(\n {\n context: entitiesToContexts(__spreadProps(__spreadValues({}, this.sharedEntities), {\n [\"iglu:no.nrk/content/jsonschema/1-0-1\" /* Content */]: contentEntity\n }))\n },\n [this.trackerId]\n );\n } else {\n this.snowplow.trackPageView({ context: entitiesToContexts(this.sharedEntities) }, [this.trackerId]);\n }\n }\n /**\n * Generic track event for custom schemas, typed up to only support NRK\n * events and entities. All shared entities are included, and can be\n * overridden by specified entities.\n */\n trackSchemaEvent(schema, data, entities) {\n const context = entitiesToContexts(__spreadValues(__spreadValues({}, this.sharedEntities), entities));\n this.snowplow.trackSelfDescribingEvent(\n {\n event: { schema, data: __spreadValues({}, data) },\n context\n },\n [this.trackerId]\n );\n }\n /**\n * Send a standard structured event.\n */\n trackEvent(data, entities) {\n const context = entitiesToContexts(__spreadValues(__spreadValues({}, this.sharedEntities), entities));\n this.snowplow.trackStructEvent(__spreadProps(__spreadValues({}, data), { context }), [this.trackerId]);\n }\n /**\n * Set the logged in user.\n */\n setUser(userId) {\n this.snowplow.setUserId(userId, [this.trackerId]);\n this.setSharedEntity(\"iglu:no.nrk/nrk-user/jsonschema/1-0-0\" /* NrkUser */, { id: userId });\n }\n /**\n * Clear the user when logged out.\n */\n clearUser() {\n this.snowplow.setUserId(null, [this.trackerId]);\n this.removeSharedEntity(\"iglu:no.nrk/nrk-user/jsonschema/1-0-0\" /* NrkUser */);\n }\n /**\n * Add a plugin to the tracker.\n */\n addPlugin(configuration) {\n this.snowplow.addPlugin(configuration, [this.trackerId]);\n }\n /**\n * Set data for a shared entity for all events of this tracker.\n *\n * The `snowplow.addGlobalContexts()` method could potentially be used, but\n * `removeGlobalContexts()` requires the data as argument as well (awkward),\n * and there's no `getGlobalContexts()` to help with that.\n */\n setSharedEntity(schema, data) {\n this.sharedEntities[schema] = data;\n }\n /**\n * Returns any shared entities for an entity schema.\n */\n getSharedEntity(schema) {\n return this.sharedEntities[schema];\n }\n /**\n * Remove all shared entities for an entity schema.\n */\n removeSharedEntity(schema) {\n if (schema in this.sharedEntities) {\n delete this.sharedEntities[schema];\n }\n }\n};\nfunction entitiesToContexts(entities) {\n const contexts = [];\n Object.entries(entities).forEach(([schema, data]) => {\n const dataList = Array.isArray(data) ? data : [data];\n for (const entityData of dataList) {\n contexts.push({ schema, data: __spreadValues({}, entityData) });\n }\n });\n return contexts;\n}\n\n// src/nrk-player-tracker.ts\nvar NrkPlayerTracker = class extends NrkBaseTracker {\n /**\n * Tell the tracker what the current media is.\n */\n setMedia(mediaId, details) {\n const content = { id: mediaId };\n if (details == null ? void 0 : details.source) {\n content.source = details == null ? void 0 : details.source;\n }\n if (details == null ? void 0 : details.kind) {\n content.kind = details == null ? void 0 : details.kind;\n }\n this.setSharedEntity(\"iglu:no.nrk/content/jsonschema/1-0-1\" /* Content */, content);\n if (details == null ? void 0 : details.channelId) {\n this.channelId = details.channelId;\n }\n if (details && \"autoplay\" in details && details.autoplay !== void 0) {\n this.autoplay = details.autoplay;\n }\n }\n /**\n * Set autoplay for the current media.\n */\n setMediaAutoplay(autoplay) {\n this.autoplay = autoplay;\n }\n /**\n * Tell the tracker that media is unknown (like for gaps in the EPG).\n */\n setUnknownMedia(channelId) {\n this.setSharedEntity(\"iglu:no.nrk/content/jsonschema/1-0-1\" /* Content */, { id: \"unknown\", kind: \"unknown\" });\n this.channelId = channelId;\n }\n /**\n * Send a playback event of kind 'start'.\n *\n * Should be called when time starts running:\n * - After changing media.\n * - After user pauses playback.\n * - At replay.\n */\n sendStartEvent(startTime, live) {\n if (this.getSharedEntity(\"iglu:no.nrk/content/jsonschema/1-0-1\" /* Content */) === void 0) {\n throw new Error(\"Must use setMedia() first!\");\n }\n const start = Math.max(0, Math.floor(startTime));\n this.trackSchemaEvent(\"iglu:no.nrk/playback-event/jsonschema/1-0-0\" /* PlaybackEvent */, {\n kind: \"start\" /* Start */,\n startTime: start,\n endTime: start,\n autoplay: this.autoplay,\n live,\n channelId: this.channelId\n });\n }\n /**\n * Send a playback event of kind 'progress'.\n *\n * Should be called when time stops for any reason other than complete or\n * exit.\n */\n sendProgressEvent(startTime, endTime, live) {\n this.sendPlaybackEvent(\"progress\" /* Progress */, startTime, endTime, live);\n }\n /**\n * Send a playback event of kind 'complete'.\n *\n * Should be called when:\n * - Playback reaches the end (100%) of the media (for ODM it stops, for\n * channels it continues to play the next program in the EPG).\n * - When a skip-to-next media function is invoked when binging.\n */\n sendCompleteEvent(startTime, endTime, live) {\n this.sendPlaybackEvent(\"complete\" /* Complete */, startTime, endTime != null ? endTime : startTime, live);\n }\n /**\n * Send a playback event of kind 'exit'.\n *\n * Should be called when leaving the media before a 'complete'-event is sent,\n * including when seeking away from a program in the EPG to another.\n */\n sendExitEvent(startTime, endTime, live) {\n this.sendPlaybackEvent(\"exit\" /* Exit */, startTime, endTime != null ? endTime : startTime, live);\n }\n sendPlaybackEvent(kind, startTime, endTime, live) {\n const start = Math.max(0, Math.floor(startTime));\n const end = Math.max(0, Math.floor(endTime));\n if (start === end && kind === \"progress\" /* Progress */) {\n return;\n }\n if (start > end) {\n throw new Error(`Start time can't be after end time (${start} vs ${end}). Event was ${kind}`);\n }\n this.trackSchemaEvent(\"iglu:no.nrk/playback-event/jsonschema/1-0-0\" /* PlaybackEvent */, {\n kind,\n startTime: start,\n endTime: end,\n live,\n channelId: this.channelId\n });\n }\n};\n\n// src/service-id.ts\nvar ServiceID = /* @__PURE__ */ ((ServiceID2) => {\n ServiceID2[\"Embed\"] = \"embed\";\n ServiceID2[\"Nrkbeta\"] = \"nrkbeta\";\n ServiceID2[\"Nrkinnlogging\"] = \"nrkinnlogging\";\n ServiceID2[\"Nrkno\"] = \"nrkno\";\n ServiceID2[\"Nrkp3\"] = \"nrkp3\";\n ServiceID2[\"Nrkradio\"] = \"nrkradio\";\n ServiceID2[\"Nrksuper\"] = \"nrksuper\";\n ServiceID2[\"Nrktv\"] = \"nrktv\";\n ServiceID2[\"Yr\"] = \"yr\";\n return ServiceID2;\n})(ServiceID || {});\n\n// src/snowplow-global.ts\nvar SnowplowGlobal = class {\n constructor() {\n this.snowplow = window.snowplow;\n if (this.snowplow === void 0) {\n throw new Error(\"There is no global Snowplow function.\");\n }\n }\n /**\n * Check if the global API is available (provided by the \"Snowplow tag\"). No\n * distinction is made between sp.js and sp.lite.js.\n */\n static isAvailable() {\n return window.snowplow !== void 0;\n }\n /**\n * Modify newTracker() to support adding plugins via the tracker\n * configuration. See \"Creating your own plugins\" in the JavaScript tracker\n * Snowplow docs.\n *\n * Note: The tracker configuration hasn't been thoroughly checked for\n * inconsistencies between the global API and @snowplow/browser-tracker.\n * There might be issues.\n */\n newTracker(trackerId, collectorUrl, configuration) {\n this.snowplow(\"newTracker\", trackerId, collectorUrl, configuration);\n if ((configuration == null ? void 0 : configuration.plugins) !== void 0) {\n configuration.plugins.forEach((plugin) => {\n this.addPlugin({ plugin }, [trackerId]);\n });\n }\n }\n setUserId(...args) {\n this.proxy(\"setUserId\", args, 2);\n }\n trackPageView(...args) {\n this.proxy(\"trackPageView\", args, 2);\n }\n trackSelfDescribingEvent(...args) {\n this.proxy(\"trackSelfDescribingEvent\", args, 2);\n }\n trackStructEvent(...args) {\n this.proxy(\"trackStructEvent\", args, 2);\n }\n preservePageViewId(...args) {\n this.proxy(\"preservePageViewId\", args, 1);\n }\n addPlugin(config, trackers) {\n const args = [{ Plugin: () => config.plugin }, \"Plugin\", trackers];\n this.proxy(\"addPlugin\", args, args.length);\n }\n /**\n * Make a call to the global Snowplow API, with the specified method and\n * arguments. It only supports methods which have a `trackers` argument as\n * the last (optional) argument.\n *\n * The `trackers` argument of the Snowplow methods is optional and not always\n * in the same position. The `maxArgs` argument specifies the maximum number\n * of arguments the method supports and so in which position the `trackers`\n * argument is, when present. This is necessary in order to transform the use\n * of `trackers` between the Snowplow API and the global API. So if\n * `Args['length']` is `1 | 2`, then `maxArgs` should be 2.\n */\n proxy(method, args, maxArgs) {\n const trackerIds = args.length === maxArgs ? args.pop() : void 0;\n if (trackerIds && trackerIds.length > 0) {\n trackerIds.forEach((trackerId) => {\n this.snowplow(`${method}:${trackerId}`, ...args);\n });\n } else {\n this.snowplow(method, ...args);\n }\n }\n};\nexport {\n ClickEventKind,\n EntitySchema,\n EventSchema,\n ImpressionEventKind,\n NrkBaseTracker,\n NrkPlayerTracker,\n PlaybackEventKind,\n SearchSource,\n ServiceID,\n SnowplowGlobal,\n ViewportEventKind,\n entitiesToContexts\n};\n","import { EntitySchema, EventSchema } from '@nrk/snowplow-web';\n\n/**\n * Root path to snowplow bundle on static.nrk.no.\n */\nvar staticSnowplowRoot = \"https://static.nrk.no/nrkno-snowplow\";\n/**\n * The current major version\n */\nvar staticSnowplowMajorVersion = \"1\";\n\n//@ts-expect-error post-fix version to allow multiple versions to co-exists at the same time\nvar globalKey = \"nrknoOnTrackerReady-\" + staticSnowplowMajorVersion;\n\n/**\n * Modified version of @nrk/snowplow-web. Does not allow array or undefined\n */\n\n/**\n * Typecheck and generate `{schema, data}`\n */\nfunction getTyped(schema, data) {\n return {\n schema,\n data\n };\n}\n\n/**\n * No-op type check\n */\nfunction isTypedContext(_schema, _data) {}\n/**\n * No-op type check\n */\nfunction isTypedEvent(_schema, _data) {}\n/**\n * No-op type check\n */\nfunction isTyped(_schema, _data) {}\n\n/**\n * No-op type check\n */\nfunction isTypedArray(_schema, _data) {}\n\n/**\n * Typechecks a context and return the Snowplow type\n */\nfunction asSnowplowContext(data) {\n return data;\n}\nfunction asSnowplowEntity(data) {\n return data;\n}\n\nvar typeUtil = /*#__PURE__*/Object.freeze({\n __proto__: null,\n EntitySchema: EntitySchema,\n EventSchema: EventSchema,\n asSnowplowContext: asSnowplowContext,\n asSnowplowEntity: asSnowplowEntity,\n getTyped: getTyped,\n isTyped: isTyped,\n isTypedArray: isTypedArray,\n isTypedContext: isTypedContext,\n isTypedEvent: isTypedEvent\n});\n\n/// \n/**\n * Takes a callback that will be called with the bundled JS when ready.\n *\n * This function will load the major version (defined above in JS file) from `static.nrk.no`\n * @note the callback will never be called if a network error occurs.\n */\nfunction getBundle(callback) {\n // Add callback queue placeholder if needed\n if (globalThis[globalKey] === undefined) {\n //@ts-expect-error `q` is next line\n globalThis[globalKey] = function (cb) {\n globalThis[globalKey].q.push(cb);\n };\n globalThis[globalKey].q = [];\n }\n {\n // load script if needed\n loadOnce(staticSnowplowRoot + \"/major/\" + staticSnowplowMajorVersion + \"/nrkno-snowplow-entry.js\");\n }\n\n // add callback\n globalThis[globalKey](callback);\n}\n/**\n * loadOnce loads the given script IFF it is not already present in the DOM.\n * @param {string} src URL for script\n * @returns {undefined}\n */\nfunction loadOnce(src) {\n var hasScript = document.querySelector(\"script[src=\\\"\" + src + \"\\\"]\");\n if (hasScript) {\n return;\n }\n var script = document.createElement('script');\n script.async = true;\n script.src = src;\n document.head.appendChild(script);\n}\n\nexport { typeUtil as TypeUtils, getBundle };\n","var __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\n\n// src/nrk-types.ts\nvar ClickEventKind = /* @__PURE__ */ ((ClickEventKind2) => {\n ClickEventKind2[\"Content\"] = \"content\";\n ClickEventKind2[\"Other\"] = \"other\";\n return ClickEventKind2;\n})(ClickEventKind || {});\nvar ImpressionEventKind = /* @__PURE__ */ ((ImpressionEventKind2) => {\n ImpressionEventKind2[\"Impression\"] = \"impression\";\n return ImpressionEventKind2;\n})(ImpressionEventKind || {});\nvar PlaybackEventKind = /* @__PURE__ */ ((PlaybackEventKind2) => {\n PlaybackEventKind2[\"Complete\"] = \"complete\";\n PlaybackEventKind2[\"Exit\"] = \"exit\";\n PlaybackEventKind2[\"Progress\"] = \"progress\";\n PlaybackEventKind2[\"Start\"] = \"start\";\n return PlaybackEventKind2;\n})(PlaybackEventKind || {});\nvar SearchSource = /* @__PURE__ */ ((SearchSource2) => {\n SearchSource2[\"PopularSearch\"] = \"popular-search\";\n SearchSource2[\"PreviousResult\"] = \"previous-result\";\n SearchSource2[\"Search\"] = \"search\";\n return SearchSource2;\n})(SearchSource || {});\nvar ViewportEventKind = /* @__PURE__ */ ((ViewportEventKind2) => {\n ViewportEventKind2[\"Entry\"] = \"entry\";\n ViewportEventKind2[\"Exit\"] = \"exit\";\n return ViewportEventKind2;\n})(ViewportEventKind || {});\nvar EventSchema = /* @__PURE__ */ ((EventSchema3) => {\n EventSchema3[\"BackstageEvent\"] = \"iglu:no.nrk.innlogging/backstage-event/jsonschema/1-0-0\";\n EventSchema3[\"ClickEvent\"] = \"iglu:no.nrk/click-event/jsonschema/1-0-0\";\n EventSchema3[\"FrontstageServerEvent\"] = \"iglu:no.nrk.innlogging/frontstage-server-event/jsonschema/1-0-0\";\n EventSchema3[\"ImpressionEvent\"] = \"iglu:no.nrk/impression-event/jsonschema/1-0-0\";\n EventSchema3[\"LoginRegisterFlowEvent\"] = \"iglu:no.nrk.innlogging/login-register-flow-event/jsonschema/1-0-0\";\n EventSchema3[\"PlaybackEvent\"] = \"iglu:no.nrk/playback-event/jsonschema/1-0-0\";\n EventSchema3[\"ProfilePageEvent\"] = \"iglu:no.nrk.innlogging/profile-page-event/jsonschema/1-0-0\";\n EventSchema3[\"RadioEvent\"] = \"iglu:no.nrk.radio/radio-event/jsonschema/1-0-0\";\n EventSchema3[\"SearchEvent\"] = \"iglu:no.nrk/search-event/jsonschema/1-0-0\";\n EventSchema3[\"StepEvent\"] = \"iglu:no.nrk.dh/step-event/jsonschema/1-0-0\";\n EventSchema3[\"TimeSpentEvent\"] = \"iglu:no.nrk/time-spent-event/jsonschema/1-0-0\";\n EventSchema3[\"ViewportEvent\"] = \"iglu:no.nrk.dh/viewport-event/jsonschema/1-0-0\";\n return EventSchema3;\n})(EventSchema || {});\nvar EntitySchema = /* @__PURE__ */ ((EntitySchema2) => {\n EntitySchema2[\"ClientID\"] = \"iglu:no.nrk.innlogging/client-id/jsonschema/1-0-0\";\n EntitySchema2[\"Content\"] = \"iglu:no.nrk/content/jsonschema/1-0-1\";\n EntitySchema2[\"Experiment\"] = \"iglu:no.nrk/experiment/jsonschema/1-0-0\";\n EntitySchema2[\"Link\"] = \"iglu:no.nrk/link/jsonschema/2-0-0\";\n EntitySchema2[\"NrkSession\"] = \"iglu:no.nrk/nrk-session/jsonschema/1-0-0\";\n EntitySchema2[\"NrkUser\"] = \"iglu:no.nrk/nrk-user/jsonschema/1-0-0\";\n EntitySchema2[\"Plug\"] = \"iglu:no.nrk/plug/jsonschema/3-0-0\";\n EntitySchema2[\"PreviousWebPage\"] = \"iglu:no.nrk/previous-web-page/jsonschema/1-0-0\";\n EntitySchema2[\"RegistrationContext\"] = \"iglu:no.nrk.innlogging/registration-context/jsonschema/1-0-0\";\n EntitySchema2[\"SearchResult\"] = \"iglu:no.nrk/search-result/jsonschema/1-0-1\";\n EntitySchema2[\"Service\"] = \"iglu:no.nrk/service/jsonschema/2-0-0\";\n EntitySchema2[\"Application\"] = \"iglu:com.snowplowanalytics.mobile/application/jsonschema/1-0-0\";\n return EntitySchema2;\n})(EntitySchema || {});\n\n// src/nrk-base-tracker.ts\nimport cuid from \"cuid\";\nvar NrkBaseTracker = class {\n constructor(snowplow, config) {\n this.sharedEntities = {};\n var _a, _b, _c;\n this.snowplow = snowplow;\n this.trackerId = (_a = config.trackerId) != null ? _a : cuid.slug();\n this.setSharedEntity(\"iglu:no.nrk/service/jsonschema/2-0-0\" /* Service */, { id: config.serviceId, environment: (_b = config.environment) != null ? _b : null });\n if (config.appVersion && config.appBuild) {\n this.setSharedEntity(\"iglu:com.snowplowanalytics.mobile/application/jsonschema/1-0-0\" /* Application */, { build: config.appBuild, version: config.appVersion });\n }\n snowplow.newTracker(this.trackerId, config.collectorUrl, {\n postPath: \"/nrk/wd6\",\n appId: config.appId,\n plugins: config.plugins,\n platform: (_c = config.platform) != null ? _c : \"web\",\n contexts: {\n webPage: config.disableWebContext !== true\n },\n stateStorageStrategy: config.disableLocalStorage ? \"cookie\" : void 0\n });\n }\n /**\n * Track page view.\n */\n trackPageView(contentEntity) {\n if (contentEntity) {\n this.snowplow.trackPageView(\n {\n context: entitiesToContexts(__spreadProps(__spreadValues({}, this.sharedEntities), {\n [\"iglu:no.nrk/content/jsonschema/1-0-1\" /* Content */]: contentEntity\n }))\n },\n [this.trackerId]\n );\n } else {\n this.snowplow.trackPageView({ context: entitiesToContexts(this.sharedEntities) }, [this.trackerId]);\n }\n }\n /**\n * Generic track event for custom schemas, typed up to only support NRK\n * events and entities. All shared entities are included, and can be\n * overridden by specified entities.\n */\n trackSchemaEvent(schema, data, entities) {\n const context = entitiesToContexts(__spreadValues(__spreadValues({}, this.sharedEntities), entities));\n this.snowplow.trackSelfDescribingEvent(\n {\n event: { schema, data: __spreadValues({}, data) },\n context\n },\n [this.trackerId]\n );\n }\n /**\n * Send a standard structured event.\n */\n trackEvent(data, entities) {\n const context = entitiesToContexts(__spreadValues(__spreadValues({}, this.sharedEntities), entities));\n this.snowplow.trackStructEvent(__spreadProps(__spreadValues({}, data), { context }), [this.trackerId]);\n }\n /**\n * Set the logged in user.\n */\n setUser(userId) {\n this.snowplow.setUserId(userId, [this.trackerId]);\n this.setSharedEntity(\"iglu:no.nrk/nrk-user/jsonschema/1-0-0\" /* NrkUser */, { id: userId });\n }\n /**\n * Clear the user when logged out.\n */\n clearUser() {\n this.snowplow.setUserId(null, [this.trackerId]);\n this.removeSharedEntity(\"iglu:no.nrk/nrk-user/jsonschema/1-0-0\" /* NrkUser */);\n }\n /**\n * Add a plugin to the tracker.\n */\n addPlugin(configuration) {\n this.snowplow.addPlugin(configuration, [this.trackerId]);\n }\n /**\n * Set data for a shared entity for all events of this tracker.\n *\n * The `snowplow.addGlobalContexts()` method could potentially be used, but\n * `removeGlobalContexts()` requires the data as argument as well (awkward),\n * and there's no `getGlobalContexts()` to help with that.\n */\n setSharedEntity(schema, data) {\n this.sharedEntities[schema] = data;\n }\n /**\n * Returns any shared entities for an entity schema.\n */\n getSharedEntity(schema) {\n return this.sharedEntities[schema];\n }\n /**\n * Remove all shared entities for an entity schema.\n */\n removeSharedEntity(schema) {\n if (schema in this.sharedEntities) {\n delete this.sharedEntities[schema];\n }\n }\n};\nfunction entitiesToContexts(entities) {\n const contexts = [];\n Object.entries(entities).forEach(([schema, data]) => {\n const dataList = Array.isArray(data) ? data : [data];\n for (const entityData of dataList) {\n contexts.push({ schema, data: __spreadValues({}, entityData) });\n }\n });\n return contexts;\n}\n\n// src/nrk-player-tracker.ts\nvar NrkPlayerTracker = class extends NrkBaseTracker {\n /**\n * Tell the tracker what the current media is.\n */\n setMedia(mediaId, details) {\n const content = { id: mediaId };\n if (details == null ? void 0 : details.source) {\n content.source = details == null ? void 0 : details.source;\n }\n if (details == null ? void 0 : details.kind) {\n content.kind = details == null ? void 0 : details.kind;\n }\n this.setSharedEntity(\"iglu:no.nrk/content/jsonschema/1-0-1\" /* Content */, content);\n if (details == null ? void 0 : details.channelId) {\n this.channelId = details.channelId;\n }\n if (details && \"autoplay\" in details && details.autoplay !== void 0) {\n this.autoplay = details.autoplay;\n }\n }\n /**\n * Set autoplay for the current media.\n */\n setMediaAutoplay(autoplay) {\n this.autoplay = autoplay;\n }\n /**\n * Tell the tracker that media is unknown (like for gaps in the EPG).\n */\n setUnknownMedia(channelId) {\n this.setSharedEntity(\"iglu:no.nrk/content/jsonschema/1-0-1\" /* Content */, { id: \"unknown\", kind: \"unknown\" });\n this.channelId = channelId;\n }\n /**\n * Send a playback event of kind 'start'.\n *\n * Should be called when time starts running:\n * - After changing media.\n * - After user pauses playback.\n * - At replay.\n */\n sendStartEvent(startTime, live) {\n if (this.getSharedEntity(\"iglu:no.nrk/content/jsonschema/1-0-1\" /* Content */) === void 0) {\n throw new Error(\"Must use setMedia() first!\");\n }\n const start = Math.max(0, Math.floor(startTime));\n this.trackSchemaEvent(\"iglu:no.nrk/playback-event/jsonschema/1-0-0\" /* PlaybackEvent */, {\n kind: \"start\" /* Start */,\n startTime: start,\n endTime: start,\n autoplay: this.autoplay,\n live,\n channelId: this.channelId\n });\n }\n /**\n * Send a playback event of kind 'progress'.\n *\n * Should be called when time stops for any reason other than complete or\n * exit.\n */\n sendProgressEvent(startTime, endTime, live) {\n this.sendPlaybackEvent(\"progress\" /* Progress */, startTime, endTime, live);\n }\n /**\n * Send a playback event of kind 'complete'.\n *\n * Should be called when:\n * - Playback reaches the end (100%) of the media (for ODM it stops, for\n * channels it continues to play the next program in the EPG).\n * - When a skip-to-next media function is invoked when binging.\n */\n sendCompleteEvent(startTime, endTime, live) {\n this.sendPlaybackEvent(\"complete\" /* Complete */, startTime, endTime != null ? endTime : startTime, live);\n }\n /**\n * Send a playback event of kind 'exit'.\n *\n * Should be called when leaving the media before a 'complete'-event is sent,\n * including when seeking away from a program in the EPG to another.\n */\n sendExitEvent(startTime, endTime, live) {\n this.sendPlaybackEvent(\"exit\" /* Exit */, startTime, endTime != null ? endTime : startTime, live);\n }\n sendPlaybackEvent(kind, startTime, endTime, live) {\n const start = Math.max(0, Math.floor(startTime));\n const end = Math.max(0, Math.floor(endTime));\n if (start === end && kind === \"progress\" /* Progress */) {\n return;\n }\n if (start > end) {\n throw new Error(`Start time can't be after end time (${start} vs ${end}). Event was ${kind}`);\n }\n this.trackSchemaEvent(\"iglu:no.nrk/playback-event/jsonschema/1-0-0\" /* PlaybackEvent */, {\n kind,\n startTime: start,\n endTime: end,\n live,\n channelId: this.channelId\n });\n }\n};\n\n// src/service-id.ts\nvar ServiceID = /* @__PURE__ */ ((ServiceID2) => {\n ServiceID2[\"Embed\"] = \"embed\";\n ServiceID2[\"Nrkbeta\"] = \"nrkbeta\";\n ServiceID2[\"Nrkinnlogging\"] = \"nrkinnlogging\";\n ServiceID2[\"Nrkno\"] = \"nrkno\";\n ServiceID2[\"Nrkp3\"] = \"nrkp3\";\n ServiceID2[\"Nrkradio\"] = \"nrkradio\";\n ServiceID2[\"Nrksuper\"] = \"nrksuper\";\n ServiceID2[\"Nrktv\"] = \"nrktv\";\n ServiceID2[\"Yr\"] = \"yr\";\n return ServiceID2;\n})(ServiceID || {});\n\n// src/snowplow-global.ts\nvar SnowplowGlobal = class {\n constructor() {\n this.snowplow = window.snowplow;\n if (this.snowplow === void 0) {\n throw new Error(\"There is no global Snowplow function.\");\n }\n }\n /**\n * Check if the global API is available (provided by the \"Snowplow tag\"). No\n * distinction is made between sp.js and sp.lite.js.\n */\n static isAvailable() {\n return window.snowplow !== void 0;\n }\n /**\n * Modify newTracker() to support adding plugins via the tracker\n * configuration. See \"Creating your own plugins\" in the JavaScript tracker\n * Snowplow docs.\n *\n * Note: The tracker configuration hasn't been thoroughly checked for\n * inconsistencies between the global API and @snowplow/browser-tracker.\n * There might be issues.\n */\n newTracker(trackerId, collectorUrl, configuration) {\n this.snowplow(\"newTracker\", trackerId, collectorUrl, configuration);\n if ((configuration == null ? void 0 : configuration.plugins) !== void 0) {\n configuration.plugins.forEach((plugin) => {\n this.addPlugin({ plugin }, [trackerId]);\n });\n }\n }\n setUserId(...args) {\n this.proxy(\"setUserId\", args, 2);\n }\n trackPageView(...args) {\n this.proxy(\"trackPageView\", args, 2);\n }\n trackSelfDescribingEvent(...args) {\n this.proxy(\"trackSelfDescribingEvent\", args, 2);\n }\n trackStructEvent(...args) {\n this.proxy(\"trackStructEvent\", args, 2);\n }\n preservePageViewId(...args) {\n this.proxy(\"preservePageViewId\", args, 1);\n }\n addPlugin(config, trackers) {\n const args = [{ Plugin: () => config.plugin }, \"Plugin\", trackers];\n this.proxy(\"addPlugin\", args, args.length);\n }\n /**\n * Make a call to the global Snowplow API, with the specified method and\n * arguments. It only supports methods which have a `trackers` argument as\n * the last (optional) argument.\n *\n * The `trackers` argument of the Snowplow methods is optional and not always\n * in the same position. The `maxArgs` argument specifies the maximum number\n * of arguments the method supports and so in which position the `trackers`\n * argument is, when present. This is necessary in order to transform the use\n * of `trackers` between the Snowplow API and the global API. So if\n * `Args['length']` is `1 | 2`, then `maxArgs` should be 2.\n */\n proxy(method, args, maxArgs) {\n const trackerIds = args.length === maxArgs ? args.pop() : void 0;\n if (trackerIds && trackerIds.length > 0) {\n trackerIds.forEach((trackerId) => {\n this.snowplow(`${method}:${trackerId}`, ...args);\n });\n } else {\n this.snowplow(method, ...args);\n }\n }\n};\nexport {\n ClickEventKind,\n EntitySchema,\n EventSchema,\n ImpressionEventKind,\n NrkBaseTracker,\n NrkPlayerTracker,\n PlaybackEventKind,\n SearchSource,\n ServiceID,\n SnowplowGlobal,\n ViewportEventKind,\n entitiesToContexts\n};\n","import { getBundle } from '@nrk/nrkno-snowplow';\nimport { EntitySchema } from '@nrk/snowplow-web';\nimport { g as getHost } from './shared/dh-snowplow.1ee613bf.mjs';\n\nconst APP_ID = \"no.nrk.dh\";\nfunction resolveOrTimeout(promise, wait) {\n return Promise.race([\n promise.then(() => true),\n new Promise((resolve) => {\n setTimeout(() => {\n resolve(false);\n }, wait);\n })\n ]);\n}\nfunction createTracker(trackerId, { environment, contentContext }) {\n let trackerReady = false;\n let bundle;\n const host = getHost(environment);\n const eventQueue = [];\n const contexts = [\"service\", \"user\"];\n const trackOrQueue = (callback) => {\n if (trackerReady) {\n callback(bundle);\n } else {\n eventQueue.push(callback);\n }\n };\n const trackStructuredEvent = (event) => trackOrQueue(({ NrknoUtils, Snowplow }) => {\n Snowplow.trackStructEvent(\n {\n ...event,\n context: NrknoUtils.context.collect(contexts)\n },\n [trackerId]\n );\n });\n const trackSelfDescribingEvent = (event) => trackOrQueue(\n ({ NrknoUtils, Snowplow }) => Snowplow.trackSelfDescribingEvent(\n {\n event,\n context: NrknoUtils.context.collect(contexts)\n },\n [trackerId]\n )\n );\n getBundle((nrknoBundle) => {\n bundle = nrknoBundle;\n const { NrknoUtils } = nrknoBundle;\n NrknoUtils.newTracker(trackerId, APP_ID, host);\n if (contentContext) {\n const contentContextId = `${trackerId}-${contentContext.id}`;\n contexts.push(contentContextId);\n NrknoUtils.context.set(contentContextId, EntitySchema.Content, {\n source: contentContext.source,\n id: contentContext.id\n });\n }\n resolveOrTimeout(NrknoUtils.trackers.whenReady(\"main-tracker\"), 1e3).then((isResolved) => {\n trackerReady = true;\n if (isResolved === false) {\n console.warn(\"nrkno tracker not available\");\n }\n while (eventQueue.length) {\n const fn = eventQueue.pop();\n fn(bundle);\n }\n return;\n }).catch(console.error);\n });\n return {\n trackSelfDescribingEvent,\n trackStructuredEvent\n };\n}\n\nexport { createTracker, getHost };\n","function getHost(environment = \"development\") {\n if (environment === \"production\") {\n return \"https://data.nrk.no\";\n }\n return \"https://no-nrk-prod1.mini.snplow.net\";\n}\n\nexport { getHost as g };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\n\n/* eslint-disable compat/compat */\nfunction getDefaultRoot() {\n /*\n Use document if supported\n IntersectionObserver will otherwise default to top level document,\n and IntersectionObserver will not work as expected in an iframe.\n https://github.com/w3c/IntersectionObserver/issues/372\n */\n\n /*\n Safari does not throw error on root: document, but does not trigger events as expected\n returning null for now until better feature detection is possible\n */\n return null;\n\n /*\n try {\n // eslint-disable-next-line no-new\n new IntersectionObserver(() => {}, { root: document })\n return document\n } catch (e) {\n return null\n }\n */\n}\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nvar defaultConfig = {\n rootMargin: '0px 0px 0px 0px',\n threshold: [0, 0.5, 1],\n root: getDefaultRoot()\n};\nclass ElementIntersectionObserver {\n constructor(elements, onChange, config) {\n _defineProperty(this, \"intersections\", void 0);\n _defineProperty(this, \"elements\", void 0);\n this.elements = elements.slice(0);\n this.intersections = elements.map(target => ({\n target,\n isIntersecting: false,\n ratio: null\n }));\n this.intersectionObserver = new IntersectionObserver(entries => {\n var intersections = this.intersections.slice(0);\n entries.forEach(entry => {\n var idx = elements.indexOf(entry.target);\n intersections.splice(idx, 1, {\n target: entry.target,\n isIntersecting: entry.isIntersecting,\n ratio: entry.intersectionRatio\n });\n });\n this.intersections = intersections;\n onChange(this.intersections);\n }, _objectSpread(_objectSpread({}, defaultConfig), config));\n elements.forEach(elm => this.intersectionObserver.observe(elm));\n }\n disconnect() {\n // Unregister trigger elements\n this.elements.forEach(elm => this.intersectionObserver.unobserve(elm));\n\n // Disconnect intersection observer\n this.intersectionObserver.disconnect();\n }\n}\n\nfunction toggleAttribute(el, name, boolValue) {\n if (!el) {\n return;\n }\n var nextValue;\n if (typeof boolValue !== 'undefined') {\n nextValue = !!boolValue;\n } else {\n nextValue = el.hasAttribute(name);\n }\n if (nextValue) {\n el.setAttribute(name, '');\n } else {\n el.removeAttribute(name);\n }\n}\nfunction setAttribute(el, name, nextValue) {\n if (!el) {\n return;\n }\n if (nextValue) {\n el.setAttribute(name, nextValue);\n } else {\n el.removeAttribute(name);\n }\n}\nvar closest = (() => {\n var proto = typeof window === 'undefined' ? {} : window.Element.prototype;\n var match = proto.matches || proto.msMatchesSelector || proto.webkitMatchesSelector;\n if (proto.closest) {\n return (el, css) => el.closest(css);\n } else {\n return (el, css) => {\n for (; el; el = el.parentElement) if (match.call(el, css)) return el;\n return null;\n };\n }\n})();\nfunction addStyle(nodeName, css) {\n var key = \"style-\".concat(nodeName.toLowerCase());\n var min = css.replace(/\\/\\*[^!][^*]*\\*\\//g, '').replace(/\\s*(^|[:;,{}]|$)\\s*/g, '$1');\n document.getElementById(key) || document.head.insertAdjacentHTML('afterbegin', \"\"));\n}\nfunction toArray(nodeList) {\n return [].slice.call(nodeList);\n}\nfunction dispatchEvent(element, name) {\n var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var ignore = \"prevent_recursive_dispatch_maximum_callstack\".concat(name);\n var event;\n if (element[ignore]) return true;\n // We are already processing this event, so skip sending a new one\n else element[ignore] = true; // Add name to dispatching ignore\n\n if (typeof window.CustomEvent === 'function') {\n event = new window.CustomEvent(name, {\n bubbles: true,\n cancelable: true,\n detail\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(name, true, true, detail);\n }\n // IE reports incorrect event.defaultPrevented\n // but correct return value on element.dispatchEvent\n var result = element.dispatchEvent(event);\n element[ignore] = null; // Remove name from dispatching ignore\n\n return result; // Follow W3C standard for return value\n}\n\nfunction easeOutQuint(t) {\n return 1 + --t * t * t * t * t;\n}\nclass VerticalScroll {\n constructor(container) {\n _defineProperty(this, \"container\", void 0);\n this.container = container;\n }\n cancel() {\n this._cancelled = true;\n }\n to(top) {\n var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var from = this.container.scrollTop;\n var distance = top - from;\n var startTime = null;\n var loop = currentTime => {\n if (this._cancelled) {\n return;\n }\n if (!startTime) {\n startTime = currentTime - 1;\n }\n var timeElapsed = currentTime - startTime;\n if (timeElapsed < duration) {\n this.container.scrollTop = from + distance * easeOutQuint(timeElapsed / duration);\n window.requestAnimationFrame(loop);\n } else {\n this.container.scrollTop = top;\n callback && callback();\n }\n };\n\n // eslint-disable-next-line compat/compat\n window.requestAnimationFrame(loop);\n }\n}\nclass HorizontalScroll {\n constructor(container) {\n _defineProperty(this, \"container\", void 0);\n this.container = container;\n }\n cancel() {\n this._cancelled = true;\n }\n to(left) {\n var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var from = this.container.scrollLeft;\n var distance = left - from;\n var startTime = null;\n var loop = currentTime => {\n if (this._cancelled) {\n return;\n }\n if (!startTime) {\n startTime = currentTime - 1;\n }\n var timeElapsed = currentTime - startTime;\n if (timeElapsed < duration) {\n this.container.scrollLeft = from + distance * easeOutQuint(timeElapsed / duration);\n window.requestAnimationFrame(loop);\n } else {\n this.container.scrollLeft = left;\n callback && callback();\n }\n };\n\n // eslint-disable-next-line compat/compat\n window.requestAnimationFrame(loop);\n }\n}\n\nfunction testReducedMotion() {\n if (typeof window !== 'undefined') {\n return !!window.matchMedia && window.matchMedia('(prefers-reduced-motion)').matches;\n }\n return false;\n}\n\nvar MAX_SAFE_INTEGER = 9007199254740991;\nfunction withinRange(current) {\n var start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var stop = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : MAX_SAFE_INTEGER;\n return current >= start && current <= stop;\n}\nfunction withinStops(currentTime, stops, targetStop) {\n var nrOfStops = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;\n var uniqueStops = stops.filter(unique);\n var targetTime = stops[targetStop];\n var prevTime = uniqueStops[uniqueStops.indexOf(targetTime) - nrOfStops];\n var nextTime = uniqueStops[uniqueStops.indexOf(targetTime) + nrOfStops];\n return withinRange(currentTime, prevTime, nextTime);\n}\nfunction unique(value, index, self) {\n return self.indexOf(value) === index;\n}\n\n/*\n * 'loading=\"lazy\"' is defined in terms of IntersectionObserver and the initial root.\n * As a result images with 'loading=\"lazy\"' inside a scroll container will not load\n * until they at least have one pixel visible in the viewport.\n *\n * This will hopefully fixed in a future version of the spec:\n * https://github.com/w3c/IntersectionObserver/issues/431\n *\n * scroll-container-lazy-load observes images and a scroll container.\n * Once images are close to intersecting it will change 'loading=\"lazy\"' to 'loading=\"eager\"'.\n * */\nfunction loadImage(image) {\n if (image.loading === 'lazy') {\n image.loading = 'eager';\n }\n}\nfunction connectScrollContainerLazyLoad(container, images) {\n var containerIntersecting = false;\n var deferredImages = [];\n\n // eslint-disable-next-line compat/compat\n var containerObserver = new IntersectionObserver(entries => {\n containerIntersecting = entries === null || entries === void 0 ? void 0 : entries[0].isIntersecting;\n if (containerIntersecting) {\n deferredImages.forEach(image => loadImage(image));\n deferredImages = [];\n }\n }, {\n root: getDefaultRoot(),\n threshold: [0.0]\n });\n containerObserver.observe(container);\n\n // eslint-disable-next-line compat/compat\n var imageObserver = new IntersectionObserver(entries => {\n for (var entry of entries) {\n if (entry.isIntersecting) {\n var image = entry.target;\n imageObserver.unobserve(image);\n if (containerIntersecting) {\n loadImage(image);\n } else {\n /* Defer loading of if the container is not intersecting the viewport */\n deferredImages.push(image);\n }\n }\n }\n }, {\n root: container,\n rootMargin: '300px',\n threshold: 0.0\n });\n for (var image of images) {\n imageObserver.observe(image);\n }\n return () => {\n containerObserver.disconnect();\n imageObserver.disconnect();\n };\n}\n\nfunction debounce(fn, delay) {\n var timeout;\n return function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n clearTimeout(timeout);\n timeout = setTimeout(() => fn(...args), delay);\n };\n}\n\nexport { ElementIntersectionObserver, HorizontalScroll, VerticalScroll, addStyle, closest, connectScrollContainerLazyLoad, debounce, dispatchEvent, setAttribute, testReducedMotion, toArray, toggleAttribute, withinRange, withinStops };\n//# sourceMappingURL=index.esm.js.map\n","// extracted by mini-css-extract-plugin\nexport default {\"lydlogg\":\"dhll__lydlogg--SXJF8\",\"toggle-play-button\":\"dhll__toggle-play-button--alnMT\",\"togglePlayButton\":\"dhll__toggle-play-button--alnMT\",\"item\":\"dhll__item--o1xNe\",\"active\":\"dhll__active--dN6uH\"};","export const nrk360 = ''\nexport const nrk404 = ''\nexport const nrkAlarmClock = ''\nexport const nrkArrangeList = ''\nexport const nrkArrowDown = ''\nexport const nrkArrowDropdown = ''\nexport const nrkArrowLeftLong = ''\nexport const nrkArrowLeft = ''\nexport const nrkArrowNested = ''\nexport const nrkArrowRightLong = ''\nexport const nrkArrowRight = ''\nexport const nrkArrowUp = ''\nexport const nrkArticle = ''\nexport const nrkBack = ''\nexport const nrkBellActive = ''\nexport const nrkBell = ''\nexport const nrkBookmarkActive = ''\nexport const nrkBookmark = ''\nexport const nrkBroadcast = ''\nexport const nrkBulletSquare = ''\nexport const nrkBulletedList = ''\nexport const nrkCalendar = ''\nexport const nrkCategoryActive = ''\nexport const nrkCategory = ''\nexport const nrkCheckActive = ''\nexport const nrkCheckRadioUnchecked = ''\nexport const nrkCheck = ''\nexport const nrkCheckboxActive = ''\nexport const nrkCheckbox = ''\nexport const nrkChevronDown = ''\nexport const nrkChevronLeft = ''\nexport const nrkChevronRight = ''\nexport const nrkChevronUp = ''\nexport const nrkClock = ''\nexport const nrkCloseActive = ''\nexport const nrkClose = ''\nexport const nrkComment = ''\nexport const nrkDialogue = ''\nexport const nrkDice1Active = ''\nexport const nrkDice1 = ''\nexport const nrkDice2Active = ''\nexport const nrkDice2 = ''\nexport const nrkDice3Active = ''\nexport const nrkDice3 = ''\nexport const nrkDice4Active = ''\nexport const nrkDice4 = ''\nexport const nrkDice5Active = ''\nexport const nrkDice5 = ''\nexport const nrkDice6Active = ''\nexport const nrkDice6 = ''\nexport const nrkDownload = ''\nexport const nrkDownloaded = ''\nexport const nrkDuration = ''\nexport const nrkEdit = ''\nexport const nrkEllipsisActive = ''\nexport const nrkEllipsis = ''\nexport const nrkFullscreenActive = ''\nexport const nrkFullscreen = ''\nexport const nrkGallery = ''\nexport const nrkGeoActive = ''\nexport const nrkGeo = ''\nexport const nrkGeopointActive = ''\nexport const nrkGeopoint = ''\nexport const nrkGlobe = ''\nexport const nrkHardwareCamera = ''\nexport const nrkHardwareComputer = ''\nexport const nrkHardwareGame = ''\nexport const nrkHardwareHeadphones = ''\nexport const nrkHardwareLaptop = ''\nexport const nrkHardwareMicrophone = ''\nexport const nrkHardwareMobile = ''\nexport const nrkHardwarePrinter = ''\nexport const nrkHardwareRadio = ''\nexport const nrkHardwareSmartSpeaker = ''\nexport const nrkHardwareSmartWatch = ''\nexport const nrkHardwareSpeaker = ''\nexport const nrkHardwareTablet = ''\nexport const nrkHardwareTv = ''\nexport const nrkHardwareWatch = ''\nexport const nrkHeartActive = ''\nexport const nrkHeart = ''\nexport const nrkHelp = ''\nexport const nrkHomeActive = ''\nexport const nrkHome = ''\nexport const nrkInfo = ''\nexport const nrkLatestNewsActive = ''\nexport const nrkLatestNews = ''\nexport const nrkLink = ''\nexport const nrkListActive = ''\nexport const nrkList = ''\nexport const nrkLockActive = ''\nexport const nrkLock = ''\nexport const nrkLogout = ''\nexport const nrkLongreadActive = ''\nexport const nrkLongread = ''\nexport const nrkLyn = ''\nexport const nrkMat = ''\nexport const nrkMedia404Notfound = ''\nexport const nrkMediaAgelimit12 = ''\nexport const nrkMediaAgelimit15 = ''\nexport const nrkMediaAgelimit18 = ''\nexport const nrkMediaAgelimit6 = ''\nexport const nrkMediaAgelimit9 = ''\nexport const nrkMediaAgelimitA = ''\nexport const nrkMediaAirplayActive = ''\nexport const nrkMediaAirplay = ''\nexport const nrkMediaBeamNote = ''\nexport const nrkMediaChromecast1 = ''\nexport const nrkMediaChromecast2 = ''\nexport const nrkMediaChromecast3 = ''\nexport const nrkMediaChromecastActive = ''\nexport const nrkMediaChromecast = ''\nexport const nrkMediaCompleted = ''\nexport const nrkMediaDirekteActive = ''\nexport const nrkMediaDirekteAnimatedActive = ''\nexport const nrkMediaDirekteGolive = ''\nexport const nrkMediaDirekteNotlive = ''\nexport const nrkMediaDirekte = ''\nexport const nrkMediaDirektetvActive = ''\nexport const nrkMediaDirektetv = ''\nexport const nrkMediaFfw15sec = ''\nexport const nrkMediaFfw30sec = ''\nexport const nrkMediaFfw5sec = ''\nexport const nrkMediaFfw = ''\nexport const nrkMediaIndexQuaverTiny = ''\nexport const nrkMediaJumpto = ''\nexport const nrkMediaMediaComplete = ''\nexport const nrkMediaMediaIncomplete = ''\nexport const nrkMediaNext = ''\nexport const nrkMediaNy = ''\nexport const nrkMediaPause = ''\nexport const nrkMediaPictureInPictureActive = ''\nexport const nrkMediaPictureInPicture = ''\nexport const nrkMediaPlayFail = ''\nexport const nrkMediaPlay = ''\nexport const nrkMediaPlaylistAddLater = ''\nexport const nrkMediaPlaylistAddNext = ''\nexport const nrkMediaPlaylistAdd = ''\nexport const nrkMediaPlaylistAdded = ''\nexport const nrkMediaPlaylistRemove = ''\nexport const nrkMediaPlaylist = ''\nexport const nrkMediaPrevious = ''\nexport const nrkMediaProgramguideActive = ''\nexport const nrkMediaProgramguide = ''\nexport const nrkMediaQuaverActive = ''\nexport const nrkMediaQuaverOff = ''\nexport const nrkMediaQuaver = ''\nexport const nrkMediaRwd15sec = ''\nexport const nrkMediaRwd30sec = ''\nexport const nrkMediaRwd5sec = ''\nexport const nrkMediaRwd = ''\nexport const nrkMediaSoundwave = ''\nexport const nrkMediaSpeed0_8x = ''\nexport const nrkMediaSpeed1_25x = ''\nexport const nrkMediaSpeed1_5x = ''\nexport const nrkMediaSpeed1x = ''\nexport const nrkMediaSpeed2x = ''\nexport const nrkMediaStop = ''\nexport const nrkMediaSubtitlesActive = ''\nexport const nrkMediaSubtitlesUnavailable = ''\nexport const nrkMediaSubtitles = ''\nexport const nrkMediaTheaterActive = ''\nexport const nrkMediaTheater = ''\nexport const nrkMediaTilgjengelighetGeoblocked = ''\nexport const nrkMediaTilgjengelighetIkkelengertilgjengelig = ''\nexport const nrkMediaTilgjengelighetKommer = ''\nexport const nrkMediaTilgjengelighetSnartutilgjengelig = ''\nexport const nrkMediaVolume1 = ''\nexport const nrkMediaVolume2 = ''\nexport const nrkMediaVolume3 = ''\nexport const nrkMediaVolumeMuted = ''\nexport const nrkMening = ''\nexport const nrkMinus = ''\nexport const nrkMoreActive = ''\nexport const nrkMore = ''\nexport const nrkNewChat = ''\nexport const nrkNote1Off = ''\nexport const nrkNote1 = ''\nexport const nrkNote2 = ''\nexport const nrkOffline = ''\nexport const nrkOpenInNew = ''\nexport const nrkPerson = ''\nexport const nrkPlus = ''\nexport const nrkPoll = ''\nexport const nrkProgress = ''\nexport const nrkQuiz = ''\nexport const nrkRefresh = ''\nexport const nrkReload = ''\nexport const nrkReorder = ''\nexport const nrkRotate = ''\nexport const nrkSearchActive = ''\nexport const nrkSearch = ''\nexport const nrkSettingsActive = ''\nexport const nrkSettings = ''\nexport const nrkSleep = ''\nexport const nrkSomeEmail = ''\nexport const nrkSomeEmbed = ''\nexport const nrkSomeFacebook = ''\nexport const nrkSomeGoogle = ''\nexport const nrkSomeInstagram = ''\nexport const nrkSomePinterest = ''\nexport const nrkSomeShareIos = ''\nexport const nrkSomeShare = ''\nexport const nrkSomeSnapchat = ''\nexport const nrkSomeTommelnedActive = ''\nexport const nrkSomeTommelned = ''\nexport const nrkSomeTommeloppActive = ''\nexport const nrkSomeTommelopp = ''\nexport const nrkSomeTwitter = ''\nexport const nrkSomeYoutube = ''\nexport const nrkSpinner = ''\nexport const nrkStarActive = ''\nexport const nrkStar = ''\nexport const nrkSuperEmojiPoopAngry = ''\nexport const nrkTilgjengelighetHorbarhet = ''\nexport const nrkTilgjengelighetLydtekst = ''\nexport const nrkTilgjengelighetSynstolking = ''\nexport const nrkTilgjengelighetTegnspraak = ''\nexport const nrkTilgjengelighet = ''\nexport const nrkTrashActive = ''\nexport const nrkTrash = ''\nexport const nrkUnlockActive = ''\nexport const nrkUnlock = ''\nexport const nrkUpload = ''\nexport const nrkUserLoggedinActive = ''\nexport const nrkUserLoggedin = ''\nexport const nrkUserNotloggedinActive = ''\nexport const nrkUserNotloggedin = ''\nexport const nrkWarning = ''","import { html } from '@nrk/dh-server-libs/html'\nimport styles from './lydlogg.module.css'\nimport { nrkMediaPause, nrkMediaPlay } from '@nrk/core-icons'\n\nexport function renderPlayButton(playing) {\n return html` `\n}\n\nexport function renderPlayButtonText(playing) {\n return html`${playing ? 'Sett lyden på pause' : 'Spill av lyd'}\n ${playing ? nrkMediaPause : nrkMediaPlay}`\n}\n","import { Howl } from 'howler'\nimport { dispatchEvent } from '@nrk/dh-basis-common'\nimport { renderPlayButtonText } from './play-button.html.js'\nimport styles from './lydlogg.module.css'\n\nfunction huffman(count, repeatStr) {\n var e = repeatStr\n for (let i = count; i > 1; i--) e += repeatStr\n return e\n}\n\nconst silence = `data:audio/mpeg;base64,//uQx${huffman(23, 'A')}WGluZwAAAA8AAAACAAACcQCA${huffman(\n 16,\n 'gICA',\n)}${huffman(66, '/')}8AAABhTEFNRTMuMTAwA8MAAAAAAAAAABQgJAUHQQAB9AAAAnGMHkkI${huffman(\n 320,\n 'A',\n)}//sQxAADgnABGiAAQBCqgCRMAAgEAH${huffman(\n 15,\n '/',\n)}7+n/9FTuQsQH//////2NG0jWUGlio5gLQTOtIoeR2WX////X4s9Atb/JRVCbBUpeRUq${huffman(\n 18,\n '/',\n)}9RUi0f2jn/+xDECgPCjAEQAABN4AAANIAAAAQVTEFNRTMuMTAw${huffman(97, 'V')}Q==`\n\nexport class Lydlogg extends HTMLElement {\n #unlocked = false\n static get observedAttributes() {\n return ['playing', 'progress']\n }\n\n connectedCallback() {\n this.sound = new Howl({\n src: [this.mp3],\n onplay: this._handlePlay,\n onpause: this._handleStop,\n onstop: this._handleStop,\n onend: this._handleStop,\n })\n this.addEventListener('click', this._handleTogglePlay)\n }\n\n attributeChangedCallback(name, prevValue, newValue) {\n if (newValue === prevValue) {\n return\n }\n if (name === 'playing') {\n this.playButton.innerHTML = renderPlayButtonText(this.playing)\n this._updateActiveText()\n } else if (name === 'progress') {\n this._updateActiveText()\n }\n }\n\n #unlock() {\n const audio = new Audio(silence)\n audio.play()\n this.#unlocked = true\n }\n\n _updateActiveText = () => {\n const progress = this.progress\n for (const caption of this.captions) {\n try {\n const timeIn = parseFloat(caption.getAttribute('data-in') ?? '-1')\n caption.classList.toggle(styles.active, progress >= timeIn)\n } catch (e) {\n //\n }\n }\n }\n\n _handlePlay = () => {\n dispatchEvent(this, 'dh-lydlogg-play', { mp3: this.mp3, progress: this.progress })\n if (!this.#unlocked) {\n this.#unlock()\n }\n this.playing = true\n this.startProgress()\n }\n\n _handleStop = () => {\n dispatchEvent(this, 'dh-lydlogg-stop', { mp3: this.mp3, progress: this.progress })\n this.playing = false\n this.stopProgress()\n }\n\n _handleTogglePlay = (e) => {\n e.stopPropagation()\n if (this.playing) {\n this.sound.pause()\n } else {\n this.sound.play()\n }\n }\n\n startProgress = () => {\n if (!this.interval) {\n this.interval = setInterval(() => {\n this.progress = this.sound.seek()\n }, 300)\n }\n }\n\n stopProgress = () => {\n if (this.interval) {\n clearInterval(this.interval)\n this.interval = null\n }\n }\n\n get playButton() {\n return this.querySelector('button')\n }\n\n get captions() {\n return this.querySelectorAll(`.${styles.item}`)\n }\n\n get mp3() {\n return this.getAttribute('mp3')\n }\n\n get playing() {\n return this.hasAttribute('playing')\n }\n\n set playing(value) {\n if (value) {\n this.setAttribute('playing', '')\n } else {\n this.removeAttribute('playing')\n }\n }\n\n get progress() {\n return parseFloat(this.getAttribute('progress') ?? '0')\n }\n\n set progress(value) {\n this.setAttribute('progress', value.toFixed(2))\n }\n}\n","import { getElementTag } from '@nrk/dh-server-libs/get-element-tag'\nimport { createTracker } from '@nrk/dh-snowplow'\nimport { EventSchema, ViewportEventKind } from '@nrk/snowplow-web'\nimport { Lydlogg } from './components/lydlogg'\n\nimport './client.css'\nimport './components/app.module.css'\nimport './components/lydlogg.module.css'\n\nconst tag = getElementTag(__APP_NAME__, __APP_VERSION__)\n\nfunction safeDefine(elementName, constructor) {\n if (typeof customElements.get(elementName) === 'undefined') {\n customElements.define(elementName, constructor)\n }\n}\n\nexport class AppElement extends HTMLElement {\n name = tag\n #tracker\n #entryObserver\n #exitObserver\n\n connectedCallback() {\n this.#defineCustomElements()\n\n this.#createTracker()\n this.#startViewportLogger()\n\n this.addEventListener('dh-lydlogg-play', (e) => {\n e.preventDefault()\n // this.sendGaEvent({\n // eventAction: 'play',\n // eventLabel: e.detail.mp3,\n // eventValue: Math.round(e.detail.progress * 1000),\n // })\n })\n\n this.addEventListener('dh-lydlogg-stop', (e) => {\n e.preventDefault()\n // this.sendGaEvent({\n // eventAction: 'stop',\n // eventLabel: e.detail.mp3,\n // eventValue: Math.round(e.detail.progress * 1000),\n // })\n })\n }\n\n disconnectedCallback() {\n this.#stopViewportLogger()\n }\n\n #createTracker() {\n if (process.env.DEV) {\n // @ts-ignore\n import('@nrk/dh-snowplow/mock')\n .then(({ mock }) => mock())\n .catch(console.error)\n }\n\n this.#tracker = createTracker('dh-lydlogg', {\n environment: process.env.ENVIRONMENT,\n contentContext: {\n source: 'pp',\n id: this.dataset.selfId,\n },\n })\n }\n\n #startViewportLogger() {\n this.#entryObserver = new IntersectionObserver((entries) => {\n if (!entries[0]?.isIntersecting) {\n return\n }\n this.#entryObserver.disconnect()\n this.#exitObserver.observe(this)\n this.#tracker.trackSelfDescribingEvent({\n schema: EventSchema.ViewportEvent,\n data: {\n kind: ViewportEventKind.Entry,\n },\n })\n }, {})\n\n this.#exitObserver = new IntersectionObserver(\n (entries) => {\n if (!entries[0]?.isIntersecting) {\n return\n }\n this.#exitObserver.disconnect()\n this.#tracker.trackSelfDescribingEvent({\n schema: EventSchema.ViewportEvent,\n data: {\n kind: ViewportEventKind.Exit,\n },\n })\n },\n { threshold: [1], rootMargin: '3000px 0px -100% 0px' },\n )\n\n this.#entryObserver.observe(this)\n }\n\n #stopViewportLogger() {\n this.#entryObserver?.disconnect()\n this.#exitObserver?.disconnect()\n }\n\n async #defineCustomElements() {\n safeDefine('dh-lydlogg', Lydlogg)\n }\n}\n\nsafeDefine(tag, AppElement)\n"],"names":["fingerprint","pad","getRandomValue","c","blockSize","base","discreteValues","Math","pow","randomBlock","toString","safeCounter","cuid","Date","getTime","slug","date","counter","slice","print","random","isCuid","stringToCheck","startsWith","isSlug","stringLength","length","module","exports","env","window","self","globalCount","Object","keys","clientId","navigator","mimeTypes","userAgent","crypto","msCrypto","lim","abs","getRandomValues","Uint32Array","num","size","s","substr","HowlerGlobal","this","init","prototype","Howler","_counter","_html5AudioPool","html5PoolSize","_codecs","_howls","_muted","_volume","_canPlayEvent","_navigator","masterGain","noAudio","usingWebAudio","autoSuspend","ctx","autoUnlock","_setup","volume","vol","parseFloat","setupAudioContext","gain","setValueAtTime","currentTime","i","_webAudio","ids","_getSoundIds","j","sound","_soundById","_node","mute","muted","stop","unload","close","codecs","ext","replace","state","_autoSuspend","Audio","oncanplaythrough","e","_setupCodecs","audioTest","err","canPlayType","mpegTest","ua","checkOpera","match","isOldOpera","parseInt","split","checkSafari","indexOf","safariVersion","isOldSafari","mp3","mpeg","opus","ogg","oga","wav","aac","caf","m4a","m4b","mp4","weba","webm","dolby","flac","_unlockAudio","_audioUnlocked","_mobileUnloaded","sampleRate","_scratchBuffer","createBuffer","unlock","audioNode","_unlocked","_releaseHtml5Audio","load","_autoResume","source","createBufferSource","buffer","connect","destination","start","noteOn","resume","onended","disconnect","document","removeEventListener","_emit","addEventListener","_obtainHtml5Audio","pop","testPlay","play","Promise","then","catch","console","warn","audio","push","suspend","_sounds","_paused","_suspendTimer","clearTimeout","setTimeout","handleSuspension","_resumeAfterSuspend","Howl","o","src","error","_autoplay","autoplay","_format","format","_html5","html5","_loop","loop","_pool","pool","_preload","preload","_rate","rate","_sprite","sprite","_src","undefined","_xhr","method","xhr","headers","withCredentials","_duration","_state","_endTimers","_queue","_playLock","_onend","onend","fn","_onfade","onfade","_onload","onload","_onloaderror","onloaderror","_onplayerror","onplayerror","_onpause","onpause","_onplay","onplay","_onstop","onstop","_onmute","onmute","_onvolume","onvolume","_onrate","onrate","_onseek","onseek","_onunlock","onunlock","_onresume","event","action","url","str","exec","toLowerCase","location","protocol","Sound","loadBuffer","internal","id","_ended","_id","_inactiveSound","soundId","_loadQueue","seek","max","_seek","duration","timeout","setParams","_start","_stop","node","playWebAudio","_refreshBuffer","_playStart","bufferSource","noteGrainOn","Infinity","bind","once","_clearTimer","playHtml5","playbackRate","paused","loadedNoReadyState","ejecta","readyState","isCocoonJS","listener","pause","_rateSeek","_stopFade","noteOff","_cleanBuffer","isNaN","arguments","_clearSound","_interval","args","apply","fade","from","to","len","min","end","linearRampToValueAtTime","_startFadeInterval","isGroup","diff","steps","stepLen","lastTick","now","_fadeTo","setInterval","tick","round","clearInterval","cancelScheduledValues","loopStart","loopEnd","playing","realTime","rateSeek","seekAndEmit","emitSeek","sounds","_errorFn","_loadFn","_endFn","index","splice","remCache","cache","on","events","off","isId","Array","isArray","msg","call","task","shift","ended","_drain","reset","limit","cnt","_panner","isIOS","vendor","test","howl","_parent","parent","create","createGain","createGainNode","_errorListener","_loadListener","_endListener","code","ceil","__default","loadSound","data","atob","dataView","Uint8Array","charCodeAt","decodeAudioData","XMLHttpRequest","open","responseType","forEach","key","setRequestHeader","status","response","onerror","safeXhrSend","send","arraybuffer","success","AudioContext","webkitAudioContext","iOS","platform","appVersion","version","safari","g","_super","_pos","_orientation","stereo","pan","pos","x","y","z","positionX","setTargetAtTime","positionY","positionZ","setPosition","orientation","xUp","yUp","zUp","or","forwardX","forwardY","forwardZ","upX","upY","upZ","setOrientation","_stereo","_pannerAttr","coneInnerAngle","coneOuterAngle","coneOuterGain","distanceModel","maxDistance","panningModel","refDistance","rolloffFactor","_onstereo","onstereo","_onpos","onpos","_onorientation","onorientation","pannerType","createStereoPanner","setupPanner","orientationX","orientationY","orientationZ","pannerAttr","_coneInnerAngle","_coneOuterAngle","_coneOuterGain","_distanceModel","_maxDistance","_refDistance","_rolloffFactor","_panningModel","pa","panner","type","createPanner","getElementTag","name","html","strings","interpolations","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","globalThis","Function","defineProperty","defineProperties","getOwnPropertyDescriptors","getOwnPropertySymbols","hasOwnProperty","propertyIsEnumerable","staticSnowplowRoot","staticSnowplowMajorVersion","globalKey","getBundle","callback","cb","q","querySelector","script","createElement","async","head","appendChild","loadOnce","ViewportEventKind2","EventSchema3","EntitySchema2","APP_ID","createTracker","trackerId","environment","contentContext","bundle","trackerReady","host","getHost","eventQueue","contexts","trackOrQueue","nrknoBundle","NrknoUtils","newTracker","contentContextId","context","set","Content","promise","wait","trackers","whenReady","race","resolve","isResolved","trackSelfDescribingEvent","Snowplow","collect","trackStructuredEvent","trackStructEvent","proto","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","dispatchEvent","element","detail","ignore","concat","CustomEvent","bubbles","cancelable","createEvent","initCustomEvent","result","nrkMediaPause","nrkMediaPlay","renderPlayButtonText","_t2","_","huffman","count","repeatStr","silence","_classPrivateFieldLooseKey","_unlock","Lydlogg","HTMLElement","constructor","value","_unlock2","writable","_updateActiveText","progress","caption","captions","_caption$getAttribute","timeIn","getAttribute","classList","toggle","styles","_handlePlay","_classPrivateFieldLooseBase","startProgress","_handleStop","stopProgress","_handleTogglePlay","stopPropagation","interval","observedAttributes","connectedCallback","attributeChangedCallback","prevValue","newValue","playButton","innerHTML","querySelectorAll","hasAttribute","setAttribute","removeAttribute","_this$getAttribute","toFixed","tag","__APP_NAME__","__APP_VERSION__","safeDefine","elementName","customElements","get","define","_tracker","_entryObserver","_exitObserver","_createTracker","_startViewportLogger","_stopViewportLogger","_defineCustomElements","AppElement","_defineCustomElements2","_stopViewportLogger2","_startViewportLogger2","_createTracker2","preventDefault","disconnectedCallback","process","dataset","selfId","IntersectionObserver","entries","_entries$","isIntersecting","observe","schema","EventSchema","ViewportEvent","kind","ViewportEventKind","Entry","_entries$2","Exit","threshold","rootMargin","_classPrivateFieldLoo","_classPrivateFieldLoo2"],"sourceRoot":""}