{"version":3,"file":"player.next.min.js","mappings":"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EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,EAAG,GAChE,IAAK,GAAI,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAChE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC/D,GAAI,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,IAAK,GAAI,GAAI,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACjE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAC/D,IAAK,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACjE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAChE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAC9D,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACjE,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAChE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EA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","sources":["webpack:///./player/plugins/anti-adblock/icons/speaker.svg","webpack:///./player/plugins/anti-adblock/homad/lib.js","webpack:///./icons/captions.svg","webpack:///./icons/replay.svg","webpack:///./player/plugins/anti-adblock/icons/link.svg","webpack:///./icons/pause.svg","webpack:///./utils/script-loader.js","webpack:///./icons/audio.svg","webpack:///./icons/audio/pause.svg","webpack:///./icons/settings.svg","webpack:///./icons/buffering.svg","webpack:///./player/plugins/recommended/recommended.html","webpack:///./player/plugins/countdown.html","webpack:///./icons/play.svg","webpack:///./player/playback/config/status-codes.js","webpack:///./player/config/translations.ts","webpack:///./player/config.ts","webpack:///./player/config/production.js","webpack:///./player/config/jw-keys.js","webpack:///./icons/audio/playback-rate.svg","webpack:///./icons/audio-half.svg","webpack:///./player/plugins/anti-adblock/icons/fullscreen.svg","webpack:///./icons/share.svg","webpack:///./icons/audio/rewind-10.svg","webpack:///./utils/server-time.js","webpack:///./icons/error.svg","webpack:///./player/plugins/recommended/next-asset.html","webpack:///./icons/fullscreen-off.svg","webpack:///./icons/close.svg","webpack:///./icons/audio/audio-half.svg","webpack:///./player/plugins/anti-adblock/icons/play.svg","webpack:///./icons/audio/audio-on.svg","webpack:///./player/plugins/anti-adblock/icons/speaker-muted.svg","webpack:///./player/plugins/recommended/grid.html","webpack:///./icons/fullscreen-on.svg","webpack:///./icons/audio/audio-off.svg","webpack:///./player/plugins/anti-adblock/icons/pause.svg","webpack:///./icons/audio/play.svg","webpack:///./utils/underscore.js","webpack:///./utils/backbone.events.js","webpack:///./utils/device.js","webpack:///./utils/merge.js","webpack:///./utils/utils.js","webpack:///./utils/logger.js","webpack:///./utils/warn-once.ts","webpack:///./player/model/locale.js","webpack:///./player/services/api.ts","webpack:///./player/services/api/asset/mock.js","webpack:///./player/services/api/asset.ts","webpack:///./utils/model.js","webpack:///./utils/clone-deep.ts","webpack:///./player/model/category.js","webpack:///./player/model/asset.js","webpack:///./utils/image.js","webpack:///./utils/string.js","webpack:///./player/model/domain.js","webpack:///./player/model/token.js","webpack:///./player/model/stream.js","webpack:///./player/playback/ads/relevant-yield.js","webpack:///./player/playback/ads/appnexus-tag-builder.js","webpack:///./player/playback/ads/appnexus-jw-config.js","webpack:///./player/playback/ads/appnexus.js","webpack:///./player/playback/config/sharing.js","webpack:///./player/playback/config/chromecast.js","webpack:///./player/plugins/anti-adblock/dom.js","webpack:///./player/playback/skin/jw-controls.js","webpack:///./player/playback/skin/tts-skin.js","webpack:///./player/playback/skin/audioSkinResolver.js","webpack:///./player/playback/youbora.js","webpack:///./player/playback/config.js","webpack:///./player/playback/config/playlist.js","webpack:///./player/playback/config/captions.js","webpack:///./player/playback/config/playback.js","webpack:///./player/playback/config/jw-youbora.js","webpack:///./utils/prebid.js","webpack:///./player/playback/config/keys.js","webpack:///./player/services/api/related.ts","webpack:///./player/model/next-asset.ts","webpack:///./player/model/recommended.js","webpack:///./player/model/recommended/list.ts","webpack:///./player/plugins/pulse-stats/tracker.js","webpack:///./utils/video-preview.js","webpack:///./player/events/error.js","webpack:///./player/playback/ads/appnexus-ast.js","webpack:///./utils/eventable.js","webpack:///./player/plugins/model.js","webpack:///./player/plugins/pause.js","webpack:///./player/plugins/age-limit.js","webpack:///./player/plugins/sponsor-label.js","webpack:///./player/plugins/podcast-experiment.js","webpack:///./player/plugins/countdown.js","webpack:///./player/plugins/recommended.js","webpack:///./player/plugins/pulse-stats/ad-events.js","webpack:///./player/plugins/pulse-stats/session.js","webpack:///./player/plugins/pulse-stats/playback-events.js","webpack:///./player/plugins/pulse-stats/helpers.js","webpack:///./player/plugins/pulse-stats/ui-events.js","webpack:///./player/model/category-tree.js","webpack:///./player/plugins/pulse-stats.js","webpack:///./player/plugins/podcast-native-link.js","webpack:///./player/plugins/anti-adblock/homad/eventbus.js","webpack:///./player/plugins/anti-adblock/homad/config.js","webpack:///./player/plugins/anti-adblock/homad/proxy.js","webpack:///./player/plugins/anti-adblock/homad.js","webpack:///./player/plugins/anti-adblock/homad/global.js","webpack:///./player/plugins/anti-adblock/homad/utils.js","webpack:///./player/plugins/anti-adblock/index.js","webpack:///./player/plugins/anti-adblock/tracking.js","webpack:///./player/events/playlist.js","webpack:///./player/events/complete.js","webpack:///./player/events/helpers.js","webpack:///./player/events/asset.js","webpack:///./utils/style-loader.js","webpack:///./player/playback/config/autoplay.js","webpack:///./player/playback/skin/icons-loader.js","webpack:///./player/playback/skin/settings-menu.js","webpack:///./player/playback/skin/sharing-box.js","webpack:///./player/playback/skin/container-class.js","webpack:///./player/playback/skin/levels-icon.js","webpack:///./player/playback/skin/nextUp.js","webpack:///./player/playback/skin.js","webpack:///./player/playback/skin/floating-skin.js","webpack:///./player/playback/skin/config-button.js","webpack:///./utils/clipboard.js","webpack:///./player/playback/provider.js","webpack:///./player/playback/ads/prevent-seeking.js","webpack:///./player/plugins.js","webpack:///./utils/mixin.js","webpack:///./player/events/config.js","webpack:///./player/player.js","webpack:///./index.js","webpack:///./icons/audio/replay.svg","webpack:///./icons/info.svg","webpack:///./icons/audio/forward-30.svg","webpack:///./icons/chevron-right.svg","webpack:///./player/plugins/pause.html","webpack:///./icons/audio-muted.svg","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///./svp-player.js"],"sourcesContent":["module.exports = \"<svg viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path fill-rule=\\\"evenodd\\\" clip-rule=\\\"evenodd\\\" d=\\\"M14.445 6.668a1 1 0 0 1 1.387.277C16.919 8.576 17.5 10.265 17.5 12c0 1.734-.58 3.424-1.668 5.055a1 1 0 1 1-1.664-1.11C15.08 14.576 15.5 13.265 15.5 12c0-1.266-.42-2.576-1.332-3.945a1 1 0 0 1 .277-1.387ZM19.476 4.648a1 1 0 0 1 1.376.328C22.265 7.272 23 9.618 23 12c0 2.382-.735 4.728-2.148 7.024a1 1 0 0 1-1.704-1.048C20.402 15.939 21 13.952 21 12c0-1.951-.598-3.939-1.852-5.976a1 1 0 0 1 .328-1.376ZM10.481 4.624A1 1 0 0 1 11 5.5v13a1 1 0 0 1-1.625.781l-4.726-3.78H1a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1h3.209l5.254-3.345a1 1 0 0 1 1.018-.032ZM9 7.322 5.037 9.844A1 1 0 0 1 4.5 10H2v3.5h3a1 1 0 0 1 .625.22L9 16.42V7.321Z\\\" fill=\\\"currentColor\\\"></path></svg>\"","/* jshint ignore:start */\n/* eslint-disable */\n\nvar isLoaded = false;\nvar exportz = {};\n\nexport default function (conf) {\n    if (!isLoaded) {\n        isLoaded = true;\n\n        (function(k) {\n            k = k || {}; (function(l) {\n                function b() { this.u = 'setup'; }l.g = b; b.prototype = {\n                    c: function(a) { a = a && typeof a === 'number' && a > 0 ? Math.round(a) : 10; for (var g = '', e = 0; e < a; e++)g += String.fromCharCode((Math.random() < 0.5 ? 65 : 97) + Math.floor(26 * Math.random())); return g; },\n                    A: function(a) {\n                        function g(d) {\n                            var a = '';\n                            var c;\n                            var g;\n                            for (c = 7; c >= 0; c--)g = d >>> 4 * c & 15, a += g.toString(16);return a;\n                        }function e(d, a) { return d << a | d >>> 32 - a; }\n                        var c;\n                        var h;\n                        var b = Array(80);\n                        var l = 1732584193;\n                        var q = 4023233417;\n                        var p = 2562383102;\n                        var k = 271733878;\n                        var t = 3285377520;\n                        var f;\n                        var m;\n                        var n;\n                        var r;\n                        var d;\n                        a = a && typeof a === 'string'\n                                ? a : '';f = a.length;var u = [];for (c = 0; c < f - 3; c += 4)h = a.charCodeAt(c) << 24 | a.charCodeAt(c + 1) << 16 | a.charCodeAt(c + 2) << 8 | a.charCodeAt(c + 3), u.push(h);switch (f % 4) { case 0: c = 2147483648; break; case 1: c = a.charCodeAt(f - 1) << 24 | 8388608; break; case 2: c = a.charCodeAt(f - 2) << 24 | a.charCodeAt(f - 1) << 16 | 32768; break; case 3: c = a.charCodeAt(f - 3) << 24 | a.charCodeAt(f - 2) << 16 | a.charCodeAt(f - 1) << 8 | 128; }for (u.push(c); u.length % 16 != 14;)u.push(0);u.push(f >>> 29);u.push(f << 3 & 4294967295);for (a = 0; a < u.length; a += 16) {\n                                for (c = 0; c < 16; c++)b[c] = u[a + c]; for (c = 16; c <= 79; c++)b[c] = e(b[c - 3] ^ b[c - 8] ^ b[c - 14] ^ b[c - 16], 1); h = l; f = q; m = p; n = k; r = t; for (c = 0; c <= 19; c++)d = e(h, 5) + (f & m | ~f & n) + r + b[c] + 1518500249 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; for (c = 20; c <= 39; c++)d = e(h, 5) + (f ^ m ^ n) + r + b[c] + 1859775393 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; for (c = 40; c <= 59; c++)d = e(h, 5) + (f & m | f & n | m & n) + r + b[c] + 2400959708 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; for (c = 60; c <= 79; c++)d = e(h, 5) + (f ^ m ^ n) + r + b[c] + 3395469782 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; l = l + h & 4294967295; q = q + f & 4294967295; p = p + m & 4294967295; k = k + n\n                    & 4294967295; t = t + r & 4294967295;\n                            }return (g(l) + g(q) + g(p) + g(k) + g(t)).toLowerCase();\n                    },\n                    j: function(a) {\n                        for (var g = '', e, c, b, l, k, q, p = 0; p < a.length;) {\n                            e = a.charCodeAt(p++), c = a.charCodeAt(p++), b = a.charCodeAt(p++), l = e >> 2, e = (e & 3) << 4 | c >> 4, k = (c & 15) << 2 | b >> 6, q = b & 63, isNaN(c) ? k = q = 64 : isNaN(b) && (q = 64), g = g + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(l) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(e) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(k)\n                + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(q);\n                        } return g;\n                    },\n                    fireEvent: function(a, g, b) {\n                        var c = this.u;\n                        var h = document.createEvent('CustomEvent');\n                        b.state = c;h.initCustomEvent(g, !1, !1, b);a.dispatchEvent(h);\n                    },\n                    l: function(a, g, b) { g || (g = 'hdEvent'); b || (b = window); this.fireEvent(b, g, a); },\n                    track: function(a, b, e) {\n                        if (e) {\n                            if (!homad || !homad.M)window.setTimeout(function() { this.track(a, b, e); }.bind(this), 500); else if (homad.isEnabled) {\n                                var c = `${homad.T()}?homad_track_key=${encodeURIComponent(a)}&homad_track_value=${\n                                    encodeURIComponent(b)}`; homad.o(c, !0); c = homad.o(c, !0); c.data.homad_url_prefix_alias = ''; c.data.homad_track_key = encodeURIComponent(a); c.data.homad_track_value = encodeURIComponent(b); homad.P(c, function() {});\n                            }\n                        }\n                    }\n                };\n            }(k)); var v = k.g || v; new v(); var w = new v(); (function(l) {\n                function b(a) { this.data = a || {}; }l.f = b; b.S = function(a, b) {\n            var e = {};\n            var c;\n            for (c in b)e[c] = b[c];for (c in a)e[c] = a[c];return e;\n        }; b.w = { code: '1000', type: 'penalty', message: '' }; b.V = { code: '1001', type: 'mediaerror', message: '' }; b.C = { code: '1002', type: 'vpaid', message: '' };\n                b.O = { code: '1003', type: 'emptyVast', message: '' }; b.F = { code: '1004', type: 'malformattedXML' }; b.J = { code: '1005', type: 'adStart' }; b.G = { code: '1006', type: 'adFirstQuartile' }; b.I = { code: '1007', type: 'adMidPoint' }; b.K = { code: '1008', type: 'adThirdQuartile' }; b.i = { code: '1009', type: 'adComplete' }; b.H = { code: '1010', type: 'adImpressionsCalled' }; b.B = { code: '1011', type: 'vastLoadingFailed' }; b.U = { code: '1012', type: 'noCreative' }; b.R = { code: '1013', type: 'emptyVastFromHomadServerEvent', message: '' }; b.D = {\n                    code: '1014',\n                    type: 'wrapperLimitReached',\n                    message: ''\n                }; b.L = { code: '1015', type: 'clickthrough', message: '' }; b.N = { code: '1016', type: 'continueContent', message: '' }; b.X = { code: '1017', type: 'variableDeletedEvent', message: '' }; b.W = { code: '1018', type: 'noVariableSettingEvent', message: '' }; b.prototype = {};\n            }(k)); var z = k.f || z; (function(l) {\n                function b() {}l.h = b; b.prototype = {\n                    s: function(a) {\n                        var b = 0;\n                        var e;\n                        var c;\n                        var h;\n                        if (a.length == 0) return b;e = 0;for (h = a.length; e < h; e++)c = a.charCodeAt(e), b = (b << 5) - b + c, b |= 0;return Math.abs(b);\n                    },\n                    m: function() {\n                        return Math.round(Date.now() / 1E3 / 3600 / 24) + navigator.appCodeName\n                + navigator.appName + navigator.appVersion + navigator.userAgent + navigator.platform + (navigator.language || navigator.i || 'x');\n                    },\n                    a: function(a) { a = parseInt(a); if (a >= 65 && a <= 90 || a >= 97 && a <= 122) return String.fromCharCode(a); if (a <= 0) return ''; if (a < 65) return this.a(a + 65); if (a > 90) return this.a(Math.round(a / 2)); },\n                    reverse: function(a) { for (var b = '', e = a.length - 1, b = ''; e >= 0; b += a[e--]);return b; },\n                    b: function() {\n                        for (var a = this.s(`${this.m()}`), a = (`${a}${this.reverse(`${a}`)}`).match(/.{1,2}/g), b = '', e = 0; e < a.length; e++)b += this.a(a[e]); b.length == 0\n            && (b = 'zork'); return b;\n                    },\n                    v: function() { return `${this.b()}2`; }\n                };\n            }(k)); var y = k.h || y; (function() {\n            function l() {\n                if (p)conf.startPlayer && eval(conf.startPlayer), document.fp_error = !0, document.hd_ready = !0; else {\n                    var d = document.createElement('script');d.type = 'text/javascript';d.src = `https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=${w.c(10)}`;d.onerror = e;document.head.firstChild ? document.head.insertBefore(d, document.head.firstChild) : document.head.appendChild(d);\n                    var d = new y();\n                    var a = document.createEvent('CustomEvent');\n                    conf.version = '20170704_0930_802';a.initCustomEvent(d.b(), !1, !1, conf);window.setInterval(function() { window.dispatchEvent(a); }, 500);b();\n                }\n            }function b() { var d = new y(); r = window.setTimeout(function() { a(); }, 15E3); window.addEventListener(d.v(), function() { window.clearTimeout(r); }); }function a() {\n                        for (var d = document.getElementsByTagName('video'), a = 0; a < d.length; a++) { try { d[a] && d[a].pause && typeof d[a].pause === 'function' && d[a].pause(); } catch (b) {}d[a].parentNode.removeChild(d[a]); }d = document.getElementsByTagName('object'); for (a = 0; a < d.length; a++)d[a].parentNode.removeChild(d[a]);\n                        d = document.getElementsByClassName('video-wrapper'); for (a = 0; a < d.length; a++)d[a] && d[a].parentNode && d[a].parentNode.removeChild(d[a]); d = document.getElementsByClassName('videoplayer'); for (a = 0; a < d.length; a++)d[a] && d[a].parentNode && d[a].parentNode.removeChild(d[a]); if (window.self != window.top) for (d = window.document; d.hasChildNodes();)d.removeChild(d.lastChild);\n                    }function g() {\n                        if (t) {\n                            var d = `fail-init-100.gif${v()}`; k(t, function() {}, function() {}, {\n                                homad_url_prefix_alias: f,\n                                homad_url_suffix_base64: w.j(d),\n                                homad_url_suffix: d,\n                                homad_hash_guessed: 'true'\n                            });\n                        }w.l(z.w); x && typeof x === 'function' ? x() : (a(), window.setInterval(a, 500), window.setTimeout(a, 1500));\n                    }function e() { var a = document.createElement('script'); a.type = 'text/javascript'; a.src = `https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/hd-main.js?cache=${w.c(10)}`; a.onerror = g; document.head.firstChild ? document.head.insertBefore(a, document.head.firstChild) : document.head.appendChild(a); }function c(a) { p || (p = !q(a.enabled)); l(); }function h(a) {\n                        a && a.server && a.server[0]\n                && (t = (`${a.server[1]}`).replace('[hash]', w.A(`${(new Date()).getTime()}`)), f = 'homadvastimpressions'); p ? l() : (p = !q(a.enabled)) ? l() : k(a.config, c, l);\n                    }function k(a, b, c, e) {\n                        var f = new XMLHttpRequest(); f.onreadystatechange = function() { if (b && f.readyState == 4 && f.status == 200) { var a = {}; try { a = JSON.parse(f.responseText); } catch (d) { a.enabled = 'false'; }b(a); }c && f.readyState == 4 && f.status != 200 && c(f); }; try {\n                            if (e) {\n                                f.open('POST', a, !0); a = e; e = ''; for (var g in a)e += `&${g}=${encodeURIComponent(a[g])}`; e = e.substr(1); f.setRequestHeader('Content-type',\n                                    'application/x-www-form-urlencoded'); f.send(e);\n                            } else f.open('GET', a, !0), f.send();\n                        } catch (h) { c && c(f); }\n                    }function v() { var a = '?c=unknown'; window && window.location && window.location.hostname && (a = `?c=${window.location.hostname}`); return a; }function q(a) { return a == 'True' || a == 'true' || a == 1 || a == '1' || a == 1; }\n            var p = !1;\n            var x = conf.onFailure;\n            var t = '';\n            var f = '';\n            var m = !1;\n            var n = 0;\n            var r = !1;\n            k(conf.globalConfig, function(a) { p ? l() : p = !q(a.enabled); });typeof conf.clientConfig === 'string' ? k(conf.clientConfig, h, function() {\n                        window.setTimeout(function() {\n                            k(conf.clientConfig,\n                                h, function() { window.setTimeout(g, 1500); });\n                        }, 500);\n                    }) : m = window.setInterval(function() { var a = ''; try { a = conf.clientConfig(), n++, a ? (h(a), window.clearInterval(m)) : n >= 50 && (window.clearInterval(m), g()); } catch (b) {} }, 100);\n        }());\n        }).call(exportz, exportz);\n    }\n}\n","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM4 12h4v2H4v-2zm10 6H4v-2h10v2zm6 0h-4v-2h4v2zm0-4H10v-2h10v2z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"#fff\\\" d=\\\"M12 3a9 9 0 11-6.076 15.64 1 1 0 011.35-1.476A7 7 0 105.29 10h2.587c.275 0 .359.175.187.39l-3.375 4.22c-.172.214-.453.214-.625 0L.689 10.39C.517 10.175.602 10 .877 10h2.346C4.133 5.992 7.717 3 12 3z\\\"></path></svg>\"","module.exports = \"<svg viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M14 2a1 1 0 0 0 1 1h3.586l-9.293 9.293a1 1 0 1 0 1.414 1.414L20 4.414V8a1 1 0 1 0 2 0V2a1 1 0 0 0-1-1h-6a1 1 0 0 0-1 1Z\\\" fill=\\\"currentColor\\\"></path><path d=\\\"M4.293 6.293A1 1 0 0 1 5 6h6a1 1 0 1 0 0-2H5a3 3 0 0 0-3 3v11a3 3 0 0 0 3 3h11a3 3 0 0 0 3-3v-6a1 1 0 1 0-2 0v6a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V7a1 1 0 0 1 .293-.707Z\\\" fill=\\\"currentColor\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill-rule=\\\"evenodd\\\" d=\\\"M18.583 3c.23 0 .417.168.417.375v17.25c0 .207-.187.375-.417.375h-4.166c-.23 0-.417-.168-.417-.375V3.375c0-.207.187-.375.417-.375h4.166zm-9 0c.23 0 .417.168.417.375v17.25c0 .207-.187.375-.417.375H5.417c-.23 0-.417-.168-.417-.375V3.375C5 3.168 5.187 3 5.417 3h4.166z\\\"></path></svg>\"","/* eslint-disable no-multi-assign */\n\n/**\n * @param {string} path\n * @param {(value: *) => void} onSuccess\n * @param {(reason?: *) => void} onError\n */\nfunction loadScript(path, onSuccess, onError) {\n    var script = document.createElement('script'),\n        done = false;\n\n    const callback = onSuccess || function () {};\n\n    script.type = 'text/javascript';\n    script.src = path;\n    script.async = true;\n    script.onreadystatechange = script.onload = function () {\n        if (\n            !done &&\n            (!this.readyState ||\n                this.readyState === 'loaded' ||\n                this.readyState === 'complete')\n        ) {\n            done = true;\n            callback();\n\n            // Handle memory leak in IE\n            script.onload = script.onreadystatechange = null;\n        }\n    };\n\n    script.onerror = onError;\n\n    document.body.appendChild(script);\n}\n\n/**\n * @param {string} path\n */\nexport const scriptLoader = (path) =>\n    new Promise((resolve, reject) => {\n        loadScript(path, resolve, reject);\n    });\n","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill-rule=\\\"evenodd\\\" d=\\\"M7.28 8l5.887-5.256a.5.5 0 0 1 .833.373v17.766a.5.5 0 0 1-.833.373L7.28 16H2V8h5.28zm10.927 8.207a1 1 0 0 1-1.414-1.414c1.61-1.61 1.61-4.076 0-5.686a1 1 0 1 1 1.414-1.414c2.39 2.39 2.39 6.124 0 8.514zm2.9 2.9a1 1 0 0 1-1.414-1.414c3.11-3.11 3.11-8.176 0-11.286a1 1 0 1 1 1.414-1.414c3.89 3.89 3.89 10.224 0 14.114z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\"><path fill=\\\"#fff\\\" d=\\\"M10.5 4a.5.5 0 01.5.5v15a.5.5 0 01-.5.5h-4a.5.5 0 01-.5-.5v-15a.5.5 0 01.5-.5h4zm7 0a.5.5 0 01.5.5v15a.5.5 0 01-.5.5h-4a.5.5 0 01-.5-.5v-15a.5.5 0 01.5-.5h4z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M3 17v2h6v-2H3zM3 5v2h10V5H3zm10 16v-2h8v-2h-8v-2h-2v6h2zM7 9v2H3v2h4v2h2V9H7zm14 4v-2H11v2h10zm-6-4h2V7h4V5h-4V3h-2v6z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 240 240\\\" focusable=\\\"false\\\"><path d=\\\"M120,186.667a66.667,66.667,0,0,1,0-133.333V40a80,80,0,1,0,80,80H186.667A66.846,66.846,0,0,1,120,186.667Z\\\"></path></svg>\"","module.exports = \"<div class=\\\"svp-player-recommended-box\\\"> <!--  is-visible --> <!-- is-next-visible, is-grid-visible-->\\n    <div class=\\\"svp-player-recommended\\\">\\n        <div class=\\\"svp-player-recommended-grid\\\"></div>\\n        <div class=\\\"svp-player-recommended-next\\\"></div>\\n    </div>\\n</div>\\n\"","module.exports = \"<div class=\\\"svp-player-countdown-wrapper\\\">\\n    <div class=\\\"svp-player-countdown\\\">\\n        <div class=\\\"svp-countdown-header\\\">\\n            <span class=\\\"svp-live-icon\\\"><span class=\\\"svp-icon-main-live-big\\\"></span></span>\\n            <span class=\\\"svp-live-label\\\"></span>\\n        </div>\\n        <div class=\\\"svp-countdown-timer\\\">\\n            <span class=\\\"svp-countdown-live-timer\\\"></span>\\n        </div>\\n    </div>\\n</div>\\n\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill-rule=\\\"evenodd\\\" d=\\\"M7 3.48v17.04a.5.5 0 0 0 .807.395l10.972-8.52a.5.5 0 0 0 0-.79L7.807 3.085A.5.5 0 0 0 7 3.48z\\\"></path></svg>\"","export const ACTIVE = 12000;\nexport const ACTIVE_PREVIEW = 12001;\n\nexport const NOT_ACTIVE = 14001;\nexport const NOT_ACTIVE_GEOBLOCKED = 14002;\nexport const NOT_ACTIVE_TOKEN = 14005;\nexport const NOT_FOUND = 14003;\nexport const NOT_ACTIVE_PAST = 14004;\n\nexport const GENERAL_ERROR = 15000;\nexport const NETWORK_ERROR = 15101;\nexport const TOKEN_FETCH_ERROR = 15102;\n\nconst statusMessages = {\n    [ACTIVE]: 'Stream active',\n    [ACTIVE_PREVIEW]: 'Preview mode',\n    [NOT_ACTIVE]: 'Stream is not active',\n    [NOT_ACTIVE_GEOBLOCKED]:\n        'Stream failed to play due to geoblock restrictions',\n    [NOT_ACTIVE_TOKEN]: 'Stream failed to play due to unauthorized access',\n    [NOT_FOUND]: 'Stream not found',\n    [NOT_ACTIVE_PAST]: 'Stream has been unpublished',\n    [GENERAL_ERROR]: 'General error',\n    [NETWORK_ERROR]: 'Network error',\n    [TOKEN_FETCH_ERROR]: 'Token fetch error',\n};\n\n/**\n * Get localized messages\n *\n * @param {number} errorCode\n */\nexport default (errorCode) =>\n    statusMessages[errorCode] || statusMessages[GENERAL_ERROR];\n","import codeToString, * as STATUS_CODES from '../playback/config/status-codes';\n\nconst translations = {\n    en: {\n        id: 'en',\n        // Countdown plugin\n        'Video will start at': 'Video will start at',\n        'Video will start in': 'Video will start in',\n\n        'ageLimit-0': 'A',\n\n        // SponsorOverlay plugin\n        'Ad from': 'Ad from',\n\n        // months  is special case for translating month to human readable form\n        months: [\n            'Jan',\n            'Feb',\n            'Mar',\n            'Apr',\n            'May',\n            'Jun',\n            'Jul',\n            'Aug',\n            'Sep',\n            'Oct',\n            'Nov',\n            'Dec',\n        ],\n        // general troubles, we don't know exactly what had happen\n        [codeToString(STATUS_CODES.GENERAL_ERROR)]:\n            'Sorry. An error occured. Try again later.',\n        // stream is available only in certain areas/countries\n        [codeToString(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED)]:\n            'The video failed to play due to geoblock restrictions.',\n        // stream is available only in certain areas/countries\n        [codeToString(STATUS_CODES.NOT_ACTIVE_TOKEN)]:\n            'This video can not be played because it is protected. Try again later.',\n        // stream is 404 (wrong/deleted from akamai)\n        [codeToString(STATUS_CODES.NOT_FOUND)]:\n            'Sorry. This video is unavailable.',\n        // asset is not active\n        [codeToString(STATUS_CODES.NOT_ACTIVE)]:\n            'Sorry. This video is not active.',\n        // asset's flight times are in the past\n        [codeToString(STATUS_CODES.NOT_ACTIVE_PAST)]:\n            'Sorry. This video is unavailable.',\n        // network error while playing live stream\n        [codeToString(STATUS_CODES.NETWORK_ERROR)]:\n            'Network issues. Please check your internet connection',\n        // token can not be retrieved\n        [codeToString(STATUS_CODES.TOKEN_FETCH_ERROR)]:\n            'Sorry. An error occured. Try again later.',\n\n        // sharing box heading\n        Sharing: 'Share this video',\n        'Live button': 'Live',\n\n        // error message\n        'Error code': 'Error code',\n\n        // closed captions\n        en_GB: 'English',\n        es_ES: 'Español',\n        nb_NO: 'Bokmål',\n        sv_SE: 'Swedish',\n\n        'Audio video switch': 'Audio video switch',\n        'Playing audio only': 'Playing audio only',\n\n        ads: {\n            // jw ad messages\n            admessage: 'The ad will end in xx seconds',\n            cuetext: 'Advertisement',\n            skipmessage: 'Skip ad in xx',\n            skiptext: 'Skip',\n            podmessage: 'Ad __AD_POD_CURRENT__ of __AD_POD_LENGTH__',\n            loadingAd: 'Loading ad',\n        },\n\n        player: {\n            listen: 'Listen',\n            playback: 'Start playback',\n            loginToListen: 'Sign in to listen',\n            subscribeToListen: 'Subscribe to listen',\n            seconds: 'sec',\n            minutes: 'min',\n            hours: 'h',\n            playbackSpeed: 'Toggle Audio playback speed. Current speed is',\n        },\n        tts: {\n            play: 'Listen to the story',\n            replay: 'Listen again',\n            minute: 'minute',\n            minutes: 'minutes',\n            second: 'second',\n            seconds: 'seconds',\n        },\n    },\n    no: {\n        id: 'no',\n        // Countdown plugin\n        'Video will start at': 'Videoen starter',\n        'Video will start in': 'Videoen starter om',\n\n        'ageLimit-0': 'A',\n\n        // SponsorOverlay plugin\n        'Ad from': 'Annonse fra',\n\n        // months  is special case for translating month to human readable form\n        months: [\n            'Jan',\n            'Feb',\n            'Mar',\n            'Apr',\n            'Mai',\n            'Jun',\n            'Jul',\n            'Aug',\n            'Sep',\n            'Okt',\n            'Nov',\n            'Des',\n        ],\n        // general troubles, we don't know exactly what had happen\n        [codeToString(STATUS_CODES.GENERAL_ERROR)]:\n            'Beklager, en feil oppstod. Prøv å spill av videoen senere',\n        // stream is available only in certain areas/countries\n        [codeToString(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED)]:\n            'Denne videoen er kun tilgjengelig i Norge',\n        // token for stream is incorrect\n        [codeToString(STATUS_CODES.NOT_ACTIVE_TOKEN)]:\n            'Denne videoen kan dessverre ikke spilles av da den er beskyttet. Prøv igjen senere.',\n        // stream is 404 (wrong/deleted from akamai)\n        [codeToString(STATUS_CODES.NOT_FOUND)]:\n            'Beklager, videoen er ikke tilgjengelig',\n        // asset is not active\n        [codeToString(STATUS_CODES.NOT_ACTIVE)]:\n            'Beklager, videoen er ikke tilgjengelig',\n        // asset's flight times are in the past\n        [codeToString(STATUS_CODES.NOT_ACTIVE_PAST)]:\n            'Beklager, vi har ikke rettigheter til å vise videoen lenger',\n        // network error while playing live stream\n        [codeToString(STATUS_CODES.NETWORK_ERROR)]:\n            'Kunne ikke spille av video, venligst sjekk internettforbindelsen din',\n        // token can not be retrieved\n        [codeToString(STATUS_CODES.TOKEN_FETCH_ERROR)]:\n            'Beklager, en feil oppstod. Prøv å spill av videoen senere',\n\n        // jw player error messages\n        'This video cannot be played because of a technical error.':\n            'Kunne ikke spille av video på grunn av en teknisk feil',\n        'Sorry, the video player failed to load.':\n            'Kunne ikke spille av video, venligst sjekk<br /> internettforbindelsen din',\n        'This video file cannot be played.': 'Kunne ikke spille av video',\n        'The live stream is either down or has ended.':\n            'Livesendingen er nede eller er avsluttet',\n        'There was a problem providing access to protected content.':\n            'Kunne ikke spille av video, venligst sjekk<br /> internettforbindelsen din',\n        'This video cannot be played because of a problem with your internet connection.':\n            'Kunne ikke spille av video, venligst sjekk<br /> internettforbindelsen din',\n\n        // sharing box heading\n        Sharing: 'Del denne videoen',\n        'Live button': 'Direkte',\n\n        // error message\n        'Error code': 'Feilkode',\n\n        // closed captions\n        en_GB: 'English',\n        es_ES: 'Español',\n        nb_NO: 'Bokmål',\n        sv_SE: 'Svensk',\n\n        ads: {\n            admessage: 'Annonsen slutter om xx',\n            cuetext: 'Annonse',\n            skipmessage: 'Hopp over om xx',\n            skiptext: 'Hopp over',\n            podmessage: 'Annonse  __AD_POD_CURRENT__ av __AD_POD_LENGTH__',\n            loadingAd: 'Laster annonse',\n        },\n        player: {\n            player: 'Videospiller',\n            play: 'Spill',\n            playback: 'Start avspilling',\n            pause: 'Pause',\n            volume: 'Volum',\n            prev: 'Forrige',\n            next: 'Neste',\n            cast: 'Chromecast',\n            airplay: 'AirPlay',\n            fullscreen: 'Fullskjerm',\n            playlist: 'Spilleliste',\n            hd: 'Kvalitet',\n            cc: 'Undertekster',\n            audioTracks: 'Lydspor',\n            playbackRates: 'Avspillingshastighet',\n            replay: 'Spill igjen',\n            buffer: 'Laster inn',\n            more: 'Mer',\n            liveBroadcast: 'Live',\n            loadingAd: 'Laster annonse',\n            rewind: 'Spol tilbake 10 sekunder',\n            nextUp: \"Neste' video\",\n            nextUpClose: 'Lukk neste',\n            related: 'Relaterte videoer',\n            close: 'Lukk',\n            settings: ' Innstillinger',\n            unmute: 'Slå på lyd',\n            copied: 'Kopiert',\n            forward: 'Spol fram 30 sekunder',\n            loginToListen: 'Logg inn for å lytte',\n            subscribeToListen: 'Abonner for å lytte',\n            listen: 'Lytt',\n            seconds: 'sek',\n            minutes: 'min',\n            hours: 't',\n            playbackSpeed: 'Endre avspillingshastighet. Nåværende hastighet er',\n        },\n        tts: {\n            play: 'Lytt til saken',\n            replay: 'Lytt igjen',\n            minute: 'minutt',\n            minutes: 'minutter',\n            second: 'sekund',\n            seconds: 'sekunder',\n        },\n    },\n\n    se: {\n        id: 'se',\n        // Countdown plugin\n        'Video will start at': 'Videon är tillgänglig',\n        'Video will start in': 'Videon är tillgänglig om',\n\n        'ageLimit-0': 'A',\n\n        // SponsorOverlay plugin\n        'Ad from': 'Annons från',\n\n        // months  is special case for translating month to human readable form\n        months: [\n            'Jan',\n            'Feb',\n            'Mar',\n            'Apr',\n            'Maj',\n            'Jun',\n            'Jul',\n            'Aug',\n            'Sep',\n            'Okt',\n            'Nov',\n            'Dec',\n        ],\n        // general troubles, we don't know exactly what had happen\n        [codeToString(STATUS_CODES.GENERAL_ERROR)]:\n            'Något gick fel. Försök igen senare.',\n        // stream is available only in certain areas/countries\n        [codeToString(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED)]:\n            'Vi har tyvärr endast rättigheter att spela detta innehåll i Sverige',\n        // token for stream is incorrect\n        [codeToString(STATUS_CODES.NOT_ACTIVE_TOKEN)]:\n            'Denna video kan inte spelas upp eftersom den är skyddad. Försök igen senare.',\n        // stream is 404 (wrong/deleted from akamai)\n        [codeToString(STATUS_CODES.NOT_FOUND)]: 'Videon är inte tillgänglig',\n        // asset is not active\n        [codeToString(STATUS_CODES.NOT_ACTIVE)]: 'Videon är inte tillgänglig',\n        // asset's flight times are in the past\n        [codeToString(STATUS_CODES.NOT_ACTIVE_PAST)]:\n            'Videon är inte tillgänglig',\n        // network error while playing live stream\n        [codeToString(STATUS_CODES.NETWORK_ERROR)]:\n            'Något gick fel. Kolla gärna din internet koppling och försök lite senare',\n        // token can not be retrieved\n        [codeToString(STATUS_CODES.TOKEN_FETCH_ERROR)]:\n            'Token kunde inte hämtas',\n\n        // jw player error messages\n        'This video cannot be played because of a technical error.':\n            'Den här videon kan inte spelas på grund av ett tekniskt fel',\n        'Sorry, the video player failed to load.':\n            'Något gick fel. Försök igen senare',\n        'This video file cannot be played.': 'Det gick inte att spela videon',\n        'The live stream is either down or has ended.':\n            'Live överföring är antingen nere eller har slutat',\n        'There was a problem providing access to protected content.':\n            'Något gick fel. Kolla gärna din internet koppling och försök lite senare',\n        'This video cannot be played because of a problem with your internet connection.':\n            'Något gick fel. Kolla gärna din internet koppling och försök lite senare',\n\n        // sharing box heading\n        Sharing: 'Dela',\n        'Live button': 'Live',\n\n        // error message\n        'Error code': 'Felkod',\n\n        // closed captions\n        en_GB: 'English',\n        es_ES: 'Español',\n        nb_NO: 'Bokmål',\n        sv_SE: 'Sverige',\n\n        ads: {\n            admessage: 'Annons xx sekunder',\n            cuetext: 'Annons',\n            skipmessage: 'Skippa annons om xx',\n            skiptext: 'Skippa',\n            podmessage: 'Annons __AD_POD_CURRENT__ av __AD_POD_LENGTH__',\n            loadingAd: 'Laddar annons',\n        },\n        player: {\n            player: 'Videospelare',\n            play: 'Spela',\n            playback: 'Spela video',\n            pause: 'Pausa',\n            volume: 'Volym',\n            prev: 'Förra',\n            next: 'Nästa',\n            cast: 'Chromecast',\n            airplay: 'AirPlay',\n            fullscreen: 'Fullskärm',\n            playlist: 'Spellista',\n            hd: 'Kvalitet',\n            cc: 'Undertexter',\n            audioTracks: 'Ljudspår',\n            playbackRates: 'Uppspelningshastighet',\n            replay: 'Spela igen',\n            buffer: 'Laddar',\n            more: 'Mer',\n            liveBroadcast: 'Live',\n            loadingAd: 'Laddar annons',\n            rewind: 'Spola tillbaka 10 sekunder',\n            nextUp: 'Nästa',\n            nextUpClose: 'Stäng',\n            related: 'Fler videos',\n            close: 'Stäng',\n            settings: 'Inställningar',\n            unmute: 'Slå på ljud',\n            copied: 'Kopierad',\n            forward: 'Spola framåt 30 sekunder',\n            loginToListen: 'Logga in för att lyssna',\n            subscribeToListen: 'Prenumerera för att lyssna',\n            listen: 'Lyssna',\n            seconds: 'sek',\n            minutes: 'min',\n            hours: 't',\n            playbackSpeed:\n                'Växla ljuduppspelningshastighet. Aktuell hastighet är',\n        },\n        tts: {\n            play: 'Lyssna på artikeln',\n            replay: 'Lyssna igen',\n            minute: 'minut',\n            minutes: 'minuter',\n            second: 'sekund',\n            seconds: 'sekunder',\n        },\n    },\n} as const;\n\ntype LanguageKeys = keyof typeof translations;\ntype LanguageTranslations = (typeof translations)[LanguageKeys];\n\nexport function getTranslations(locale: LanguageKeys): LanguageTranslations {\n    return translations[locale];\n}\n","import { getTranslations } from './config/translations';\nimport jwKeys from './config/jw-keys';\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ndeclare const __BUILD_VERSION__: string;\n\nconst VERSION = __BUILD_VERSION__;\n\nconst config = {\n    version: VERSION,\n    player: {\n        keys: jwKeys,\n    },\n    /**\n     * SVP API configuration\n     */\n    api: {\n        url: 'https://svp.vg.no/svp/api/v1/',\n        cb: false,\n        tokenUrl: 'https://svp.vg.no/svp/token/v1/',\n        thumbnailsUrl: 'https://svp.vg.no/svp/thumbnails/v1/',\n        relatedApiUrl: 'https://related.stream.schibsted.media',\n        vmapUrl: 'https://vmap.stream.schibsted.media',\n\n        vendor: null,\n        /**\n         * API identifier\n         */\n        identifier: 'svp-player',\n\n        /**\n         * Get full endpoint url to requested resource\n         */\n        getUrl(vendor: string, endpoint: string): string {\n            const joiner = endpoint.indexOf('?') > -1 ? '&' : '?';\n            let url = `${this.url + vendor + endpoint + joiner}appName=${\n                this.identifier\n            }`;\n\n            if (this.cb === true) {\n                url += `&cb=${Math.random() * 10000}`;\n            }\n\n            return url;\n        },\n    },\n\n    ads: {\n        appnexus: {\n            vmap: 'https://ib.adnxs.com/vmap',\n            ptv: 'https://ib.adnxs.com/ptv',\n            cr: 'https://ib.adnxs.com/cr',\n            ast: 'https://acdn.adnxs.com/ast/ast.js',\n            debug: false,\n        },\n    },\n\n    cdn: {\n        svp: `https://cdn.stream.schibsted.media/player/${VERSION}`,\n        player: 'https://cdn.stream.schibsted.media/jw/jwplayer-8.34.5',\n        youbora:\n            'https://smartplugin.youbora.com/v6/js/adapters/jwplayer/6.8.1/sp.min.js',\n        poster: `https://cdn.stream.schibsted.media/player/${VERSION}/img/poster.gif`,\n        fonts: {\n            Graphik: {\n                400: `https://cdn.stream.schibsted.media/player/fonts/Graphik.woff`,\n                500: `https://cdn.stream.schibsted.media/player/fonts/Graphik-Medium.woff`,\n                600: `https://cdn.stream.schibsted.media/player/fonts/Graphik-Semibold.woff`,\n            },\n        },\n    },\n\n    time: 'https://time.akamai.com',\n\n    images: {\n        sizes: {\n            poster: {\n                autoHeight: [\n                    380, 480, 580, 680, 780, 800, 980, 1080, 1440, 2048,\n                ],\n                autoWidth: [452, 613, 740, 900, 1080, 1440],\n            },\n        },\n    },\n\n    liveVideoPreview: 'livepreview',\n    videoPreview: {\n        default: 'preview_360p',\n        vgtv: 'preview_vivi_category',\n    },\n\n    /**\n     * Default skins for providers\n     */\n    skins: {\n        default: {\n            url: `https://cdn.stream.schibsted.media/player/${VERSION}/css/player.css`,\n            name: 'svp-default jw-skin-seven',\n        },\n    },\n\n    about: {\n        vgtv: {\n            link: 'http://www.vgtv.no/',\n            text: 'VGTV',\n        },\n    },\n\n    sharing: {\n        global: {\n            sites: ['facebook', 'twitter'],\n        },\n\n        vgtv: {\n            link: 'http://www.vgtv.no/#!/MEDIAID',\n            code: '<iframe width=\"560\" height=\"315\" src=\"https://www.vgtv.no/embed/?id=MEDIAID\" frameborder=\"0\" allowfullscreen=\"true\"></iframe>',\n        },\n    },\n\n    domains: {\n        blacklist: {\n            global: [],\n            ab: ['*avpixlat.info', '*exponerat.net'],\n        },\n\n        whitelist: {\n            global: [\n                '*localhost',\n                '*schibsted.io',\n                '*schibsted.media',\n                '*schibsted.ws',\n                '*schibsted.se',\n                '*smp.no',\n                '*plan3dev.se',\n                '*plan3.se',\n                '*vg.no',\n                '*vgtv.no',\n                '*vgnett.no',\n                '*aftonbladet.se',\n                '*aftenposten.no',\n                '*ap.no',\n                '*sa.no',\n                '*aftenbladet.no',\n                '*vglive.no',\n                '*e24.no',\n\n                // brandstudio cms\n                '*vev.design',\n                // stream cluster\n                '*pubops.net',\n\n                '*adresseavisen.no',\n                '*polarismedia.no',\n                '*adressa.no',\n                '*bt.no',\n                '*fvn.no',\n\n                '*htmlinstant.com',\n                '*ht.no',\n                '*rbnett.no',\n                '*itromso.no',\n                '*folkebladet.no',\n                '*framtidinord.no',\n                '*osloby.no',\n                '*av-avis.no',\n                '*medianorge.no',\n                '*herokuapp.com',\n                '*bergenstidende.no',\n                '*bonansa.no',\n                '*sysla.no',\n                '*bygdanytt.no',\n                '*vestnytt.no',\n                '*strilen.no',\n                '*snd.no',\n                '*fedrelandsvennen.no',\n                '*lister24.no',\n                '*l-a.no',\n                '*lindesnesfyr.no',\n\n                // Polaris related newspapers\n                // addressa.no\n                '*adressa.no',\n                '*avisa-st.no',\n                '*banett.no',\n                '*fosna-folket.no',\n                '*hitra-froya.no',\n                '*innherred.no',\n                '*mb.no',\n                '*bladet.no',\n                '*opdalingen.no',\n                '*tronderbladet.no',\n                // rbnett\n                '*rbnett.no',\n                '*andalsnes-avis.no',\n                '*driva.no',\n                // smp newspaper\n                '*smp.no',\n                '*dolen.no',\n                '*fjordabladet.no',\n                '*fjt.no',\n                '*fjordingen.no',\n                '*fjuken.no',\n                '*heroynytt.no',\n                '*morenytt.no',\n                '*sunnmoringen.no',\n                '*vigga.no',\n                '*vikebladet.no',\n                // itromso.no\n                '*itromso.no',\n                '*framtidinord.no',\n                // ht.no\n                '*ht.no',\n                '*vol.no',\n                // t-a.no\n                '*t-a.no',\n                '*namdalsavisa.no',\n                // other polaris newspapers\n                '*altaposten.no',\n                '*folkebladet.no',\n                '*svd.se',\n                // marketplaces\n                '*finn.no',\n                '*familieklubben.no',\n                '*tek.no',\n\n                // testing env\n                '*mylocal.com',\n            ],\n        },\n\n        preview: {\n            global: [\n                '*vgnett.no',\n                '*svp.schibsted.io',\n                '*cms.schibsted.media',\n                '*localhost',\n                '*pubops.net',\n                '*stream.schibsted.media',\n            ],\n        },\n    },\n\n    vendors: {\n        se: ['ab', 'svd'],\n    },\n\n    translations: getTranslations,\n};\n\nexport default config;\n","import config from '../config';\n\nconfig.env = 'production';\nexport default config;\n","export default {\n    default: 'OjqkBWp9VpYP8utpWdzBZ+eZIJhcfOW5U9g4/w==',\n    //\n    '100sport': 'Uq5GO7mRz+oxp7pVh3bZEvDEBzEYRTG4h3sr1Q==',\n    ab: 'qK+optxkJTV2KblAIiLdoWze6AAGxX5Qxeb57A==',\n    adressa: 'BQs7m1EiK0wlK8xAZQgJwU1a4OskbKgoYRSEfA==',\n    adressabrandstudio: 'fuz93B3kwPfLDZv+opQh6xasO9nRkraYSbQP0A==',\n    altaposten: 'Y0grkUQ6BaCat409fP7mPqr1SbDS+LntWrQIpg==',\n    ap: 'ElscszbjUK+A0En7My3UPpJ/4MlOUOn+fiU2/w==',\n    bt: 'wgmdmAfgbneZjUBt8ZxqiKTxVCpriTwcC06hzQ==',\n    brandstudio: 'uXOJWRxZaxOSRhIisAGWsEbzn3PIhbTlCn99IQ==',\n    folkebladet: 'kGoJc75y4Uq1r2kw2n883oYzGk+SrEJ2GEDQUQ==',\n    fvn: '88vcnFV8g4crXq1P8jrGz8D7XqMwawGvwFmhJg==',\n    harstad: 'C8hK/HIbIL3k9h4dN4xY3lHAPdjLyx7B4WGM/w==',\n    itromso: 'QAPvDWM3mHi3lYOZCLqOwHZMstixgFefhc/d1Q==',\n    podcast: 'X2K7i+dwWXsIR0BKyX+3C+8s4y9VOWcYgtjeJA==',\n    rbnett: 'y7Z4M5Ah6dOyDH7/ZrCQjHZPb3E3xnctwkixbw==',\n    riks: 'a5kTQmkeGHV+P2wOaTQvAuXEdivj2lbXoAxTbw==',\n    ridenews: '6s5IkHj1LiODLxDOaYr1ze6F7F1Cun92UFuOpA==',\n    sa: 'dWpue+L8nJKbDFqh9Ps3o2mxqr92MY2G9tQohg==',\n    schibsted: 'Cn+pnRPeR7dlwUgy+QwoSwyu0NXoGUtxD/LVqA==',\n    smp: 'eZ34FUhLc6cW3MypHSgtbYwRgbDxKLV/iaABmQ==',\n    svd: 'Olwljnb5W0VdUf38yWyv3kjowR9JamQYw4RndA==',\n    tronderavisa: '7azVhGsMlCm9EuRPr4EJ8RY6cyVbmAgeS1MkKw==',\n    vgtv: 'edF0bFyKcM68omCq24JsMWw/CO/f6cAgS91oiQ==',\n    vgtvs: 'D/kRElM9UDSgZxbEqPBESxIKamNBql5PeIabpg==',\n    tvnu: 'D3dYmVFYpKAvLGpVd8pGy5WaK2ENvBtw/Ckcpg==',\n    tvh: 'ruSROpB1eB80YOC8rhSGsPtRYOuyY3dVgvuENA==',\n    steinkjer: '6R+PbNB3P4oBInKbvaTZ43gQ2ytS033VqoeXCw==',\n    avisast: 'QcZcFVTVlh+UzfQwef0geS5SG8kfbuqpSbpBeA==',\n    bladet: '1kmygQh66fY6JQRpflRV7+YGryfifrMtVFP3Yg==',\n    banett: 's4vq0YvNHbJwTC4xIWv8gKbwgBhuk8lVzyOT8w==',\n    innherred: '0yUhyfky20/BmQ0m34/m5xjUj7jZ+hbs6NGbaQ==',\n    fosnafolket: 'URfW4iMX1EXaAMNIfXQMH4vFM45poWC3w/exaA==',\n    opp: 'ZPPMwo4Hi2zY83ujh8eKtEZyLbnIDiiZ6FmM/A==',\n    tronderbladet: 'QvkL/hGUNa8LhqWMWf0BBO5KIxtrY6tM/V9YzA==',\n    stjordalsnytt: 'Vrr3fuhtCbYFD65BiG71D7LG85GJGbhJtsG0gg==',\n    mn24: '/C0MEydhFzj2pHNF2s/sCJxSqmT10BN44TwB7g==',\n    hitrafroya: 'dKm1wQ/c9wb8RUV17DcB0BcnWu6LwWOVwIwdOg==',\n    framtidinord: 'kK2ipLqdfYIbhGdvjOthFN4jGIvUi8N40xzn4Q==',\n    vaganavisa: 'EmRtKKUtomHJbI3SoSaGcUFmTH09+P1RWQJhFA==',\n    vol: '5uns40a+PtZHBW63Js08tgiKxoLP9lvKzeSQhg==',\n    nyttiuka: 'y3FqylNKM83/cm/EWqK8VMXaAlhZ8SugNLbLUA==',\n    vikebladet: 'wjNCSWk5Pa+NP3himjg5l3SP6zJiwtfcio6Q4Q==',\n    fjt: 'fwjuzLToVU9Ge7szNfMQjku/mrHv+rHKmnDWIw==',\n    vestlandsnytt: 'eeXBMlgZz3eV1P40G2n8w5xNj6I26P6uPqGXrw==',\n    fjuken: 'yJRnk09dbww1J8o1ZcttIz6JEWIbKQEVc2dBWA==',\n    vigga: 'CVPhE9cnKo/qCEYsnKY4srRPlUX5nIkpgaYmmA==',\n    dolen: '0pwgbRB6x1e0lopRdq63Z4dr9dWmCJv+y6lDjA==',\n    fjordabladet: 'GSaj2C8vTpEIBol7cv22nushv81P41JejaYAYQ==',\n    morenytt: 'y/F1oPTks00zkuYbKzS/J5nv1kj3F7bzP9mYyA==',\n    fjordingen: 'qKK3mb0M6WSP0x2m6tivcPISciI3XcrXbQ6Ahg==',\n    driva: 'UrdUWdGCy1fRuOhiW73+OquZdf4X4pEQt+wWAg==',\n    andalsnes: '1R1UB8uyMZTD2ktpNUGmWwQ1rRJqdddbTr35hA==',\n    nyss: 'KtxtrKsDnYN56mQzwJR0yQrt3v6txf5deJbU4Q==',\n    agderposten: '1ddblFxmHMTjY92s/n4MW4UOarEg8Y0YdxnTLA==',\n    lindesnes: 'BCo2euu9kUoY98D325ELxqI6xM2YkdZyg7/muQ==',\n    farsund: 'qCM539Tebp04kUVjiaLyL7pkGCCDJamyVyu/zA==',\n    varden: 'rKy6/CASIAoRtm+px2g9c78jIoqfW8zNaOlHMg==',\n    lp: 'kKDr8twymQP1JZL6JSr+1+dnov/tgzOdcrg1TA==',\n    venneslatidende: 'ssbp/U5E/VpJfjG1iKiRn4s1aEcmSJJVUvArHg==',\n    gat: 'lsDEJw9LYcQHNSW7z1ANuZlP1az9SYVeVLz9nQ==',\n    bomlonytt: 'JWrUR1BR1BDEvlk1D4zTVACUVUpSRmaHNPc3Ug==',\n    sunnhordland: 'YNBOeqC8eCInTQKL6AAj3bUxvOBovPqzUIoGcQ==',\n    klaebuposten: 'C4qzXiBP17SXr/vE8xhg24JOWtyoGDeDp5r6PQ==',\n    gauldalsposten: 'eckuy2Y+Q1Ix2uLPX/mVUMHjfZGihqYYFbr9lg==',\n    froya: '0hMWIeKp57C5kpW/SZZ1wt4UkFJHwmWYaCd25A==',\n    bnytt: 'DZ3T3Pf0i7D5z/HvohVc0O7Nd+uA/NIaNWaWFA==',\n    vnytt: 'LIf2gdiGI3pQ3xNFRA4VyY0Rw1m8Zt8INsG59w==',\n    stri: 'gsS6gkjzxZM0HbwrApKOQptgKWAhLWjQiGKBqQ==',\n    avavis: 'VKgcw+6bkoouV5F8wq3m3INf0/vnoAYm9A+iKw==',\n    bareasane: 'EWqdeFg2tvV34V0/8Y8xPYs7nSJqhBca7YE9nA==',\n    e24: 'EKxf/lgWjKyDmxngUI9GCHYadRPzPqJZ61eGsw==',\n    op: 'D+Ha6SLZGzk9rTYF73CZVauhRaxcOWQJ1DcA7A==',\n    r24: 'MCwzsnqjZ7mxAZIhFUaqLc9Jb6DJz16u19cJgw==',\n    stord: '/XmpYhCtUCXEGxdg7Sx8uDV4H9B/S7pcoHFshw==',\n    marsteinen: 'mgxyPEPhFgqBsXWID7XMFehHRtcmSV0NYBgtkQ==',\n    aptts: 'iHIdsWq1mtMGYlPjI4bdBAv/Mi67voL7GPFxzQ==',\n    vgtvexternal: '0CwPuvNeSfovbd5Z9E2BxESNFd0uCQuKGua/EQ==',\n    wellobe: 'AB982A2pFmif19jnLW8g+9HAmRXj8WB9iLPcFQ==',\n    godare: 'rW8bwL2zUArb4f17a9VzQXpPJvrKnuaB/ot6Xw==',\n    nearadio: 'I3cMBc/Zc14sn4akbaJzItzyxSp9q97kKCBQ9w==',\n    fitjarposten: 'Hqz/cmP6WSIqk5F322XILEoOh45aPi0IEyhvTw==',\n    kulingen: 'imULXGlJMRjRsjeiEqCNTL3rBxQoWgQcCCCghQ==',\n    kystogfjord: 'cI6D2aLVAUQpzIvhIXiBnMJHXlR0G2oW5pkHSw==',\n    porten: 'FxTcRhFGJv+55ria65b8nOY/RzvuqG2nMjtrAw==',\n    polaris: 'wUOdkU2sf3mAjVpDg/Dd1Ub16CPBWnW04+4Tlg==',\n    bttts: '/qd0rFS3azoUlwYI9CvPXLPnEI+WDeZ00GeS1A==',\n    vgtts: 'wT1e7ILovikqM2iJBpWxdbTZ7VUO6MXsDWpTRg==',\n    satts: 'rm26UpWyNGF+XncYpqNO3rCxsJchiJ1Iidvwkg==',\n    hallingdolen: 'mqz7EMpVXHQOCFx+UdfgShGVe38kAGUTnDZkxg==',\n    setesdolen: '1/RWv5yMVgwJyH29ACsnaCbLPyOOTh8tVvtzBQ==',\n    abtts: '9tx2EjjftuicXuUXYq/bvkDHPH7OUKIRjsmcHQ==',\n};\n","module.exports = \"<svg class=\\\"jw-svg-icon\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><text x=\\\"1\\\" y=\\\"17\\\" fill=\\\"white\\\" font-size=\\\"13px\\\" font-family=\\\"Arial, Helvetica, sans-serif\\\"></text><path d=\\\"M28.902 9.622l-.483-.478a.347.347 0 00-.484 0l-2.412 2.412-2.458-2.458a.347.347 0 00-.483 0l-.484.484a.347.347 0 000 .483l2.452 2.452-2.406 2.418a.347.347 0 000 .484l.483.483c.131.131.347.131.484 0l2.412-2.412 2.412 2.412c.13.131.347.131.484 0l.483-.483a.347.347 0 000-.484l-2.418-2.412 2.412-2.412a.349.349 0 00.006-.49z\\\" stroke=\\\"#fff\\\" stroke-width=\\\".1\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M7.28 8l5.887-5.256a.5.5 0 0 1 .833.373v17.766a.5.5 0 0 1-.833.373L7.28 16H2V8h5.28zm10.927 8.207a.999.999 0 1 1-1.414-1.414c1.609-1.609 1.609-4.076 0-5.686a.999.999 0 1 1 1.414-1.414c2.391 2.39 2.391 6.123 0 8.514z\\\"></path></svg>\"","module.exports = \"<svg viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M3 4c-.228 0-.48.01-.72.063-.25.055-.547.168-.798.42-.25.25-.364.547-.42.797C1.01 5.52 1 5.772 1 6v3.5a1 1 0 1 0 2 0V6h5a1 1 0 0 0 0-2H3ZM23 6v3.5a1 1 0 1 1-2 0V6h-5a1 1 0 1 1 0-2h5c.228 0 .48.01.72.063.25.055.547.168.798.42.25.25.364.547.42.797.052.24.062.492.062.72ZM23 14.5V18c0 .228-.01.48-.063.72-.055.25-.168.547-.42.798-.25.25-.547.364-.797.42-.24.052-.492.062-.72.062h-5a1 1 0 1 1 0-2h5v-3.5a1 1 0 1 1 2 0ZM2 13.5a1 1 0 0 1 1 1V18h5a1 1 0 1 1 0 2H3c-.228 0-.48-.01-.72-.063a1.587 1.587 0 0 1-.798-.42 1.587 1.587 0 0 1-.42-.797A3.402 3.402 0 0 1 1 18v-3.5a1 1 0 0 1 1-1Z\\\" fill=\\\"currentColor\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill-rule=\\\"evenodd\\\" d=\\\"M14.045 5.522a3 3 0 1 1 .991 1.746l-6.081 4.21a3.019 3.019 0 0 1-.02 1.148l6.073 4.13a3 3 0 1 1-.97 1.76l-6.151-4.184a3 3 0 1 1 .077-4.6l6.081-4.21z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\"><path fill=\\\"#fff\\\" d=\\\"M12.246 2.158l-.001 1.992.237.004a9.001 9.001 0 01-.265 17.996 8.986 8.986 0 01-7.006-3.348 1 1 0 011.556-1.256 6.987 6.987 0 005.45 2.604 7.001 7.001 0 007.002-7 7.001 7.001 0 00-6.973-7v2.008c0 .275-.194.387-.432.248L6.678 5.41c-.238-.14-.238-.365 0-.504l5.136-2.996c.238-.14.432-.027.432.248zm1.155 8.094c1.457 0 2.352 1.091 2.35 2.995-.004 1.917-.887 3.03-2.35 3.03-1.466-.002-2.355-1.118-2.35-3.03.003-1.907.89-2.995 2.35-2.995zm-3.801.08v5.818H8.392v-4.312h-.053c-.125.193-.542.431-1.184.431v-.977c.747 0 1.247-.605 1.26-.96h1.186H9.6zm3.8.93c-.664 0-1.093.664-1.096 1.985-.003 1.34.43 2.011 1.097 2.011.664 0 1.096-.67 1.094-2.01 0-1.322-.432-1.987-1.094-1.987H13.4z\\\"></path></svg>\"","/**\n * Server time helper required for syncing browser time with stream vendors servers (SMP Stream)\n */\nconst ServerTime = {\n    time: null,\n    responseTime: null,\n    fetched: false,\n\n    /**\n     * @param {string} url\n     * @returns {Promise<void>}\n     */\n    fetch: function (url) {\n        return new Promise((resolve) => {\n            /**\n             * @param {number} time\n             */\n            const resolveRequest = (time) => {\n                this.time = time;\n                this.responseTime = Date.now();\n                resolve();\n            };\n\n            fetch(url)\n                .then((result) => result.text())\n                .then(\n                    (text) => {\n                        const serverTime = parseInt(text, 10);\n\n                        if (Number.isNaN(Number(serverTime))) {\n                            // set current microtime if server will return value different than int\n                            resolveRequest(Date.now());\n                        } else {\n                            // adjust to miliseconds\n                            resolveRequest(serverTime * 1000);\n                            ServerTime.fetched = true;\n                        }\n                    },\n                    function () {\n                        resolveRequest(Date.now());\n                    },\n                );\n        });\n    },\n\n    /**\n     * @returns {number}\n     */\n    getTime: function () {\n        return this.time + (Date.now() - this.responseTime);\n    },\n};\n\nexport default ServerTime;\n","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 24C5.373 24 0 18.627 0 12S5.373 0 12 0s12 5.373 12 12-5.373 12-12 12zm0-19a1 1 0 0 0-1 1v9a1 1 0 0 0 2 0V6a1 1 0 0 0-1-1zm0 13a1 1 0 0 1 1 1v1a1 1 0 0 1-2 0v-1a1 1 0 0 1 1-1z\\\" fill-rule=\\\"evenodd\\\"></path></svg>\"","module.exports = \"<span class=\\\"svp-player-recommended-close\\\">\\n    <%= closeIcon %>\\n</span>\\n<span class=\\\"svp-player-recommended-play\\\">\\n    <span class=\\\"svp-player-recommended-title\\\"><%= next.getTitle() %></span>\\n    <span class=\\\"svp-player-recommended-image\\\" style=\\\"background-image: url('<%= getThumbnail(next.getThumbnail()) %>');\\\">\\n        <span class=\\\"svp-player-recommended-countdown\\\" style=\\\"transition-duration: <%= countdown %>s\\\"></span>\\n        <span class=\\\"svp-player-recommended-label\\\">Next <%= nextIcon %></span>\\n        <span class=\\\"svp-player-recommended-item-image-filter\\\" style=\\\"background-image: url(<%= getThumbnail(next.getThumbnail()) %>);\\\"></span>\\n    </span>\\n</span>\\n\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12.043 10.629l7.336-7.336 1.414 1.414L13.5 12l7.293 7.293-1.414 1.414-7.336-7.336-7.336 7.336-1.414-1.414L10.586 12 3.293 4.707l1.414-1.414 7.336 7.336z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\"><path fill=\\\"#fff\\\" d=\\\"M11 5.244v14a1 1 0 01-1.625.78l-4.725-3.78H0v-8h4.65l4.725-3.78a1 1 0 011.625.78zm-2 2.08l-3.375 2.7a1 1 0 01-.625.22H2v4h3a1 1 0 01.625.22L9 17.164v-9.84zm4.833.673a1 1 0 011.414 0 6 6 0 010 8.484 1 1 0 11-1.414-1.414 4 4 0 000-5.656 1 1 0 010-1.414z\\\"></path></svg>\"","module.exports = \"<svg viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M7 4.5a.5.5 0 0 1 .772-.42l11.58 7.5a.5.5 0 0 1 0 .84l-11.58 7.5A.5.5 0 0 1 7 19.5v-15Z\\\" fill=\\\"currentColor\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\"><path fill=\\\"#fff\\\" d=\\\"M17.363 4.467a1 1 0 011.414 0c4.294 4.295 4.294 11.259 0 15.554a1 1 0 11-1.414-1.414 9 9 0 000-12.726 1 1 0 010-1.414zM11 5.244v14a1 1 0 01-1.625.78l-4.725-3.78H0v-8h4.65l4.725-3.78a1 1 0 011.625.78zm-2 2.08l-3.375 2.7a1 1 0 01-.625.22H2v4h3a1 1 0 01.625.22L9 17.164v-9.84zm4.833.673a1 1 0 011.414 0 6 6 0 010 8.484 1 1 0 11-1.414-1.414 4 4 0 000-5.656 1 1 0 010-1.414z\\\"></path></svg>\"","module.exports = \"<svg viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path fill-rule=\\\"evenodd\\\" clip-rule=\\\"evenodd\\\" d=\\\"M10.481 4.623A1 1 0 0 1 11 5.5v13a1 1 0 0 1-1.625.78L4.65 15.5H1a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1h3.209l5.254-3.344a1 1 0 0 1 1.018-.033ZM9 7.322 5.037 9.844A1 1 0 0 1 4.5 10H2v3.5h3a1 1 0 0 1 .625.22L9 16.42V7.321ZM14.707 8.207a1 1 0 0 0 0 1.414l2.121 2.122-2.12 2.121a1 1 0 0 0 1.413 1.414l2.122-2.121 2.121 2.121a1 1 0 1 0 1.414-1.414l-2.121-2.121 2.121-2.122a1 1 0 0 0-1.414-1.414l-2.121 2.121-2.122-2.12a1 1 0 0 0-1.414 0Z\\\" fill=\\\"currentColor\\\"></path></svg>\"","module.exports = \"<ul class=\\\"svp-player-recommended-grid-items\\\">\\n    <% utils.each(recommended, function(item) { %>\\n    <li data-id=\\\"<%= item.getId() %>\\\" class=\\\"svp-player-recommended-item\\\" style=\\\"background-image: url('<%= getThumbnail(item.getThumbnail()) %>');\\\">\\n        <div class=\\\"svp-player-recommended-item-title\\\"><%= item.getTitle() %></div>\\n        <span class=\\\"svp-player-recommended-item-image-filter\\\" style=\\\"background-image: url('<%= getThumbnail(item.getThumbnail()) %>')\\\"></span>\\n    </li>\\n    <% }); %>\\n</ul>\\n\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M14 7h3v3h2V5h-5v2zm3 10h-3v2h5v-5h-2v3zM5 10h2V7h3V5H5v5zm2 7v-3H5v5h5v-2H7z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\"><path fill=\\\"#fff\\\" d=\\\"M11 5.002v14a1 1 0 01-1.625.78l-4.726-3.78H0v-8h4.65L9.374 4.22a1 1 0 011.625.78l.001.002zM8.999 7.08l-3.375 2.7a1 1 0 01-.625.22H2v4h3a1 1 0 01.625.219L9 16.921V7.083l-.001-.003zm13.293.213l1.414 1.414-3.293 3.292 3.293 3.294-1.414 1.414L19 13.416l-3.293 3.293-1.414-1.414L17.585 12l-3.292-3.292 1.414-1.414L19 10.587l3.293-3.292-.001-.002z\\\"></path></svg>\"","module.exports = \"<svg viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M6 4.5a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-4a.5.5 0 0 1-.5-.5v-15ZM13 4.5a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-4a.5.5 0 0 1-.5-.5v-15Z\\\" fill=\\\"currentColor\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\"><path fill=\\\"#fff\\\" d=\\\"M7 4.5v15a.5.5 0 00.772.42l11.58-7.5a.5.5 0 000-.84l-11.58-7.5A.5.5 0 007 4.5z\\\"></path></svg>\"","var idCounter = 0;\n\n// we do not include underscore as it is our hard dependency\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst { _ } = jwplayer;\n/**\n * @param {string|number} key\n * @return {(obj: Object|Array|null) => *}\n */\nconst property = function (key) {\n    return function (obj) {\n        return obj == null ? undefined : obj[key];\n    };\n};\nconst MAX_ARRAY_INDEX = 2 ** 53 - 1;\nconst getLength = property('length');\nconst isArrayLike = function (collection) {\n    var length = getLength(collection);\n    return (\n        typeof length === 'number' && length >= 0 && length <= MAX_ARRAY_INDEX\n    );\n};\n\nconst isArguments = (obj) => {\n    return Object.prototype.toString.call(obj) === '[object Arguments]';\n};\n\n/**\n * @param {*} obj\n * @returns {boolean}\n */\nexport function isEmpty(obj) {\n    if (obj == null) return true;\n    if (\n        isArrayLike(obj) &&\n        (Array.isArray(obj) || typeof obj === 'string' || isArguments(obj))\n    )\n        return obj.length === 0;\n    return Object.keys(obj).length === 0;\n}\n\n/**\n * @param {string} prefix\n * @returns {string}\n */\nexport function uniqueId(prefix) {\n    var id = `${++idCounter}`;\n    return prefix ? prefix + id : id;\n}\n\nexport const size = function (obj) {\n    if (obj == null) {\n        return 0;\n    }\n    return obj.length === +obj.length ? obj.length : Object.keys(obj).length;\n};\n\nexport default _;\n","/* eslint-disable no-param-reassign, no-mixed-operators, no-multi-assign */\nimport _, { uniqueId, isEmpty, size } from './underscore';\n\n// Backbone.Events\n// ---------------\n\n// A module that can be mixed in to *any object* in order to provide it with\n// a custom event channel. You may bind a callback to an event with `on` or\n// remove with `off`; `trigger`-ing an event fires all callbacks in\n// succession.\n//\n//     var object = {};\n//     Object.assign(object, Backbone.Events);\n//     object.on('expand', function(){ alert('expanded'); });\n//     object.trigger('expand');\n//\nconst Events = {};\n\n// Regular expression used to split event strings.\nconst eventSplitter = /\\s+/;\n\n// Iterates over the standard `event, callback` (as well as the fancy multiple\n// space-separated events `\"change blur\", callback` and jQuery-style event\n// maps `{event: callback}`).\nconst eventsApi = function (iteratee, events, name, callback, opts) {\n    var i = 0,\n        names;\n    if (name && typeof name === 'object') {\n        // Handle event maps.\n        if (\n            callback !== undefined &&\n            'context' in opts &&\n            opts.context === undefined\n        )\n            opts.context = callback;\n        for (names = Object.keys(name || {}); i < names.length; i++) {\n            events = eventsApi(\n                iteratee,\n                events,\n                names[i],\n                name[names[i]],\n                opts,\n            );\n        }\n    } else if (name && eventSplitter.test(name)) {\n        // Handle space separated event names by delegating them individually.\n        for (names = name.split(eventSplitter); i < names.length; i++) {\n            events = iteratee(events, names[i], callback, opts);\n        }\n    } else {\n        // Finally, standard events.\n        events = iteratee(events, name, callback, opts);\n    }\n    return events;\n};\n\n// The reducing API that adds a callback to the `events` object.\nconst onApi = function (events, name, callback, options) {\n    if (callback) {\n        const handlers = events[name] || (events[name] = []);\n        const { context, ctx, listening } = options;\n        if (listening) listening.count++;\n\n        handlers.push({\n            callback: callback,\n            context: context,\n            ctx: context || ctx,\n            listening: listening,\n        });\n    }\n    return events;\n};\n\n// Guard the `listening` argument from the public API.\nconst internalOn = function (obj, name, callback, context, listening) {\n    obj._events = eventsApi(onApi, obj._events || {}, name, callback, {\n        context: context,\n        ctx: obj,\n        listening: listening,\n    });\n\n    if (listening) {\n        const listeners = obj._listeners || (obj._listeners = {});\n        listeners[listening.id] = listening;\n    }\n\n    return obj;\n};\n\n// Bind an event to a `callback` function. Passing `\"all\"` will bind\n// the callback to all events fired.\nEvents.on = function (name, callback, context) {\n    return internalOn(this, name, callback, context);\n};\n\n// Inversion-of-control versions of `on`. Tell *this* object to listen to\n// an event in another object... keeping track of what it's listening to\n// for easier unbinding later.\nEvents.listenTo = function (obj, name, callback) {\n    if (!obj) return this;\n    const id = obj._listenId || (obj._listenId = uniqueId('l'));\n    const listeningTo = this._listeningTo || (this._listeningTo = {});\n    let listening = listeningTo[id];\n\n    // This object is not listening to any other events on `obj` yet.\n    // Setup the necessary references to track the listening callbacks.\n    if (!listening) {\n        const thisId = this._listenId || (this._listenId = uniqueId('l'));\n        listening = listeningTo[id] = {\n            obj: obj,\n            objId: id,\n            id: thisId,\n            listeningTo: listeningTo,\n            count: 0,\n        };\n    }\n\n    // Bind callbacks on obj, and keep track of them on listening.\n    internalOn(obj, name, callback, this, listening);\n    return this;\n};\n\n// The reducing API that removes a callback from the `events` object.\nconst offApi = function (events, name, callback, options) {\n    if (!events) return;\n\n    let i = 0;\n    let listening;\n    const { context, listeners } = options;\n\n    // Delete all events listeners and \"drop\" events.\n    if (!name && !callback && !context) {\n        const ids = Object.keys(listeners || {});\n        for (; i < ids.length; i++) {\n            listening = listeners[ids[i]];\n            delete listeners[listening.id];\n            delete listening.listeningTo[listening.objId];\n        }\n        return;\n    }\n    const names = name ? [name] : Object.keys(events || {});\n    for (; i < names.length; i++) {\n        name = names[i];\n        const handlers = events[name];\n\n        // Bail out if there are no events stored.\n        if (!handlers) break;\n\n        // Replace events if there are any remaining.  Otherwise, clean up.\n        const remaining = [];\n        for (let j = 0; j < handlers.length; j++) {\n            const handler = handlers[j];\n            if (\n                (callback &&\n                    callback !== handler.callback &&\n                    callback !== handler.callback._callback) ||\n                (context && context !== handler.context)\n            ) {\n                remaining.push(handler);\n            } else {\n                listening = handler.listening;\n                if (listening && --listening.count === 0) {\n                    delete listeners[listening.id];\n                    delete listening.listeningTo[listening.objId];\n                }\n            }\n        }\n\n        // Update tail event if the list has any events.  Otherwise, clean up.\n        if (remaining.length) {\n            events[name] = remaining;\n        } else {\n            delete events[name];\n        }\n    }\n    if (size(events)) {\n        // eslint-disable-next-line consistent-return\n        return events;\n    }\n};\n\n// Remove one or many callbacks. If `context` is null, removes all\n// callbacks with that function. If `callback` is null, removes all\n// callbacks for the event. If `name` is null, removes all bound\n// callbacks for all events.\nEvents.off = function (name, callback, context) {\n    if (!this._events) return this;\n    this._events = eventsApi(offApi, this._events, name, callback, {\n        context: context,\n        listeners: this._listeners,\n    });\n    return this;\n};\n\n// Tell this object to stop listening to either specific events ... or\n// to every object it's currently listening to.\nEvents.stopListening = function (obj, name, callback) {\n    var listeningTo = this._listeningTo;\n    if (!listeningTo) return this;\n\n    const ids = obj ? [obj._listenId] : Object.keys(listeningTo || {});\n\n    for (let i = 0; i < ids.length; i++) {\n        const listening = listeningTo[ids[i]];\n\n        // If listening doesn't exist, this object is not currently\n        // listening to obj. Break out early.\n        if (!listening) break;\n\n        listening.obj.off(name, callback, this);\n    }\n    if (isEmpty(listeningTo)) this._listeningTo = undefined;\n\n    return this;\n};\n\n// Reduces the event callbacks into a map of `{event: onceWrapper}`.\n// `offer` unbinds the `onceWrapper` after it has been called.\nconst onceMap = function (map, name, callback, offer) {\n    if (callback) {\n        const once = (map[name] = _.once(function () {\n            offer(name, once);\n            callback.apply(this, arguments);\n        }));\n        once._callback = callback;\n    }\n    return map;\n};\n\n// Bind an event to only be triggered a single time. After the first time\n// the callback is invoked, its listener will be removed. If multiple events\n// are passed in using the space-separated syntax, the handler will fire\n// once for each event, not once for a combination of all events.\nEvents.once = function (name, callback, context) {\n    // Map the event into a `{event: once}` object.\n    var events = eventsApi(onceMap, {}, name, callback, _.bind(this.off, this));\n    return this.on(events, undefined, context);\n};\n\n// Inversion-of-control versions of `once`.\nEvents.listenToOnce = function (obj, name, callback) {\n    // Map the event into a `{event: once}` object.\n    var events = eventsApi(\n        onceMap,\n        {},\n        name,\n        callback,\n        _.bind(this.stopListening, this, obj),\n    );\n    return this.listenTo(obj, events);\n};\n\n// A difficult-to-believe, but optimized internal dispatch function for\n// triggering events. Tries to keep the usual cases speedy (most internal\n// Backbone events have 3 arguments).\nconst triggerEvents = function (events, args) {\n    let ev;\n    let i = -1;\n    const l = events.length;\n    const [a1, a2, a3] = args;\n    switch (args.length) {\n        case 0:\n            while (++i < l) (ev = events[i]).callback.call(ev.ctx);\n            return;\n        case 1:\n            while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1);\n            return;\n        case 2:\n            while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2);\n            return;\n        case 3:\n            while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3);\n            return;\n        default:\n            while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);\n    }\n};\n\n// Handles triggering the appropriate event callbacks.\nconst triggerApi = function (objEvents, name, cb, args) {\n    if (objEvents) {\n        const events = objEvents[name];\n        let allEvents = objEvents.all;\n        if (events && allEvents) allEvents = allEvents.slice();\n        if (events) triggerEvents(events, args);\n        if (allEvents) triggerEvents(allEvents, [name].concat(args));\n    }\n    return objEvents;\n};\n\n// Trigger one or many events, firing all bound callbacks. Callbacks are\n// passed the same arguments as `trigger` is, apart from the event name\n// (unless you're listening on `\"all\"`, which will cause your callback to\n// receive the true name of the event as the first argument).\nEvents.trigger = function (name) {\n    if (!this._events) return this;\n\n    const length = Math.max(0, arguments.length - 1);\n    const args = Array(length);\n    for (let i = 0; i < length; i++) args[i] = arguments[i + 1];\n\n    eventsApi(triggerApi, this._events, name, undefined, args);\n    return this;\n};\n\n// Aliases for backwards compatibility.\nEvents.bind = Events.on;\nEvents.unbind = Events.off;\n\nexport default Events;\n","const { userAgent } = navigator;\n\n/**\n * @param {RegExp} regex\n * @returns {boolean}\n */\nfunction userAgentMatch(regex) {\n    return userAgent.match(regex) !== null;\n}\n\n/**\n * @param {RegExp} regex\n * @returns {boolean}\n */\nfunction lazyUserAgentMatch(regex) {\n    return function () {\n        return userAgentMatch(regex);\n    };\n}\n\nconst isIETrident = lazyUserAgentMatch(/trident\\/.+rv:\\s*11/i);\nconst isIPad = () =>\n    lazyUserAgentMatch(/iPad/i)() ||\n    (userAgentMatch(/Macintosh/i, userAgent) &&\n        navigator.maxTouchPoints !== undefined &&\n        navigator.maxTouchPoints > 1);\nconst isIPhone = lazyUserAgentMatch(/iPhone/i);\n// Check for spiders/bots\n/**\n * @returns {boolean}\n */\nfunction isBot() {\n    return userAgentMatch(/bot|google|baidu|bing|msn|teoma|slurp|yandex|yeti/i);\n}\n// Check for Facebook App Version to see if it's Facebook\n\n/**\n * @returns {boolean}\n */\nfunction isEdge() {\n    return userAgentMatch(/\\sEdge\\/\\d+/i);\n}\n\n/**\n * @returns {boolean}\n */\nfunction isMSIE() {\n    return userAgentMatch(/msie/i);\n}\n\n/**\n * @returns {boolean|*}\n */\nfunction isIE() {\n    return isEdge() || isIETrident() || isMSIE();\n}\n\n/**\n * @returns {boolean}\n */\nfunction isSafari() {\n    return (\n        userAgentMatch(/safari/i) &&\n        !userAgentMatch(/(?:Chrome|CriOS|chromium|android)/i)\n    );\n}\n\n/**\n * @returns {boolean}\n */\nfunction isFirefox() {\n    return userAgentMatch(/\\sFirefox\\/\\d+/i);\n}\n\n/**\n * Matches iOS devices\n *\n * @param version\n * @returns {boolean}\n */\nfunction isIOS(version) {\n    var isAppleIOS = userAgentMatch(/iP(hone|ad|od)/i),\n        result = null;\n\n    // check if version matches\n    if (isAppleIOS && version) {\n        result = /OS ([._\\d]+)/.exec(userAgent);\n\n        // get version and parse it\n        if (result && parseInt(result[1], 10) === version) {\n            return true;\n        }\n        // didn't match version\n        return false;\n    }\n\n    return isAppleIOS;\n}\n\n/**\n * @returns {boolean}\n */\nfunction isAndroid() {\n    return userAgentMatch(/Android/i);\n}\n\n/**\n * @returns {boolean}\n */\nfunction isTablet() {\n    let result = isIPad() || false;\n\n    // android tables are when\n    if (isAndroid() && userAgent.indexOf('Mobile') === -1) {\n        result = true;\n    }\n\n    return result;\n}\n\n/**\n * @returns {boolean}\n */\nfunction isMobile() {\n    return (\n        userAgent.match(\n            // eslint-disable-next-line max-len\n            /(iPhone|iPod|Android(?=.*Mobile).*|HTC|Fennec|IEMobile|BlackBerry|SymbianOS(?=.*AppleWebKit).*|Opera Mobi|Symbian|SonyEricsson|Nokia|SAMSUNG|LG)/i,\n        ) !== null\n    );\n}\n\n/**\n * @returns {boolean}\n */\nfunction isDesktop() {\n    return !isMobile() && !isTablet();\n}\n\n/**\n * @returns {boolean}\n */\nfunction isSamsungInternet() {\n    return userAgent.indexOf('SamsungBrowser') !== -1;\n}\n\n/**\n * @returns {boolean}\n */\nfunction isHermesApp() {\n    return userAgentMatch(/hermes/i);\n}\n\n/**\n * @returns {number|boolean}\n */\nfunction getChromeVersion() {\n    var raw = userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\n\n    return raw ? parseInt(raw[2], 10) : false;\n}\n\n/**\n * @returns {number}\n */\nfunction getPixelRatio() {\n    var devicePixelRatio = window.devicePixelRatio || 1;\n\n    if (devicePixelRatio > 1) {\n        devicePixelRatio = 2;\n    }\n\n    return devicePixelRatio;\n}\n\n/**\n * Tracking is divided by device type\n *\n * @returns {'tablet'|'phone'|'desktop'}\n */\nfunction getDeviceType() {\n    if (isTablet()) {\n        return 'tablet';\n    }\n\n    if (isMobile()) {\n        return 'phone';\n    }\n\n    return 'desktop';\n}\n\n/**\n * @returns {'always'|'muted'|'never'}\n */\nfunction canAutoplay() {\n    let result = 'always';\n\n    // default is muted for never ios systems\n    if (this.isIOS()) {\n        result = 'muted';\n    }\n\n    // iOS 8 and 9 can not autoplay any kind of stream\n    // also Android Devices are lacking this\n    if (this.isIOS(9) || this.isIOS(8) || this.isAndroid()) {\n        result = 'never';\n    }\n\n    // chrome android can autoplay muted\n    if (\n        this.isAndroid() &&\n        !this.isSamsungInternet() &&\n        this.getChromeVersion() >= 53\n    ) {\n        result = 'muted';\n    }\n\n    return result;\n}\n\nexport default {\n    isIOS,\n    isIPhone,\n    isIPad,\n    isSafari,\n    isAndroid,\n    isEdge,\n    isIE,\n    isFirefox,\n    isDesktop,\n    isSamsungInternet,\n    isTablet,\n    isMobile,\n    isHermesApp,\n    isBot,\n    getChromeVersion,\n    getPixelRatio,\n    getDeviceType,\n    canAutoplay,\n};\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nfunction isMergeableObject(val) {\n    var nonNullObject = val && typeof val === 'object';\n\n    return (\n        nonNullObject &&\n        Object.prototype.toString.call(val) !== '[object RegExp]' &&\n        Object.prototype.toString.call(val) !== '[object Date]'\n    );\n}\n\nfunction emptyTarget(val) {\n    return Array.isArray(val) ? [] : {};\n}\n\nfunction cloneIfNecessary(value, optionsArgument) {\n    var clone = optionsArgument && optionsArgument.clone === true;\n    return clone && isMergeableObject(value)\n        ? deepmerge(emptyTarget(value), value, optionsArgument)\n        : value;\n}\n\nfunction defaultArrayMerge(target, source, optionsArgument) {\n    var destination = target.slice();\n    source.forEach(function (e, i) {\n        if (typeof destination[i] === 'undefined') {\n            destination[i] = cloneIfNecessary(e, optionsArgument);\n        } else if (isMergeableObject(e)) {\n            destination[i] = deepmerge(target[i], e, optionsArgument);\n        } else if (target.indexOf(e) === -1) {\n            destination.push(cloneIfNecessary(e, optionsArgument));\n        }\n    });\n    return destination;\n}\n\nfunction mergeObject(target, source, optionsArgument) {\n    var destination = {};\n    if (isMergeableObject(target)) {\n        Object.keys(target).forEach(function (key) {\n            destination[key] = cloneIfNecessary(target[key], optionsArgument);\n        });\n    }\n    Object.keys(source).forEach(function (key) {\n        if (!isMergeableObject(source[key]) || !target[key]) {\n            destination[key] = cloneIfNecessary(source[key], optionsArgument);\n        } else {\n            destination[key] = deepmerge(\n                target[key],\n                source[key],\n                optionsArgument,\n            );\n        }\n    });\n    return destination;\n}\n\nfunction deepmerge(target, source, optionsArgument) {\n    var array = Array.isArray(source);\n    var options = optionsArgument || { arrayMerge: defaultArrayMerge };\n    var arrayMerge = options.arrayMerge || defaultArrayMerge;\n\n    if (array) {\n        return Array.isArray(target)\n            ? arrayMerge(target, source, optionsArgument)\n            : cloneIfNecessary(source, optionsArgument);\n    }\n    return mergeObject(target, source, optionsArgument);\n}\n\ndeepmerge.all = function deepmergeAll(array, optionsArgument) {\n    if (!Array.isArray(array) || array.length < 2) {\n        throw new Error(\n            'first argument should be an array with at least two elements',\n        );\n    }\n\n    // we are sure there are at least 2 values, so it is safe to have no initial value\n    return array.reduce(function (prev, next) {\n        return deepmerge(prev, next, optionsArgument);\n    });\n};\n\nwindow.deepmerge = deepmerge;\n\nexport default deepmerge;\n","/* eslint-disable no-param-reassign, no-multi-assign */\n\nimport Events from './backbone.events';\nimport device from './device';\nimport merge from './merge';\n\nconst jwUtils = jwplayer.utils;\nconst jwUnderscore = jwplayer._;\n// jwplayer is hard dependecy here\nconst utils = {\n    Events: Events,\n    extend: Object.assign,\n    // merge with deep copy, similar to jQuery extend\n    merge: merge,\n    each: jwUnderscore.each,\n    isNumber: (data) => typeof data === 'number' || data instanceof Number,\n    isString: (data) => typeof data === 'string' || data instanceof String,\n    isObject: (data) => {\n        const type = typeof data;\n        return data != null && (type === 'object' || type === 'function');\n    },\n    createNode: jwUtils.createElement,\n    /**\n     *\n     * @param {HTMLElement} element\n     * @param {string | string[]} classList\n     * @returns {void}\n     */\n    addClass: (element, classList) => {\n        if (Array.isArray(classList)) {\n            element.classList.add(...classList);\n        } else {\n            element.classList.add(classList);\n        }\n    },\n    /**\n     *\n     * @param {HTMLElement} element\n     * @param {string | string[]} classList\n     * @returns {void}\n     */\n    removeClass: (element, classList) => {\n        if (Array.isArray(classList)) {\n            element.classList.remove(...classList);\n        } else {\n            element.classList.remove(classList);\n        }\n    },\n\n    /**\n     * Template system borrowed from http://ejohn.org/blog/javascript-micro-templating/\n     */\n    template: (function () {\n        var cache = {};\n\n        return function tmpl(str, data) {\n            // Figure out if we're getting a template, or if we need to\n            // load the template - and be sure to cache the result.\n            var fn = !/\\W/.test(str)\n                ? (cache[str] =\n                      cache[str] ||\n                      tmpl(document.getElementById(str).innerHTML))\n                : // Generate a reusable function that will serve as a template\n                  // generator (and which will be cached).\n                  // eslint-disable-next-line @typescript-eslint/no-implied-eval\n                  new Function(\n                      'obj',\n                      `${\n                          'var p=[],print=function(){p.push.apply(p,arguments);};' +\n                          // Introduce the data as local variables using with(){}\n                          \"with(obj){p.push('\"\n                      }${\n                          // Convert the template into pure JavaScript\n                          str\n                              .replace(/[\\r\\t\\n]/g, ' ')\n                              .split('<%')\n                              .join('\\t')\n                              .replace(/((^|%>)[^\\t]*)'/g, '$1\\r')\n                              .replace(/\\t=(.*?)%>/g, \"',$1,'\")\n                              .split('\\t')\n                              .join(\"');\")\n                              .split('%>')\n                              .join(\"p.push('\")\n                              .split('\\r')\n                              .join(\"\\\\'\")\n                      }');}return p.join('');`,\n                  );\n\n            // Provide some basic currying to the user\n            return data ? fn(data) : fn({});\n        };\n    })(),\n    /* jshint ignore:end */\n\n    device: device,\n\n    time: {\n        shareTimeToSeconds: function (time) {\n            var hours, minutes, seconds, length;\n\n            time = jwUnderscore.compact(time.split(/[msh]/));\n            length = time.length; // last is empty\n\n            seconds = parseInt(time[length - 1], 10);\n            minutes = time[length - 2];\n            hours = time[length - 3];\n\n            return (\n                seconds +\n                (minutes ? parseInt(minutes, 10) * 60 : 0) +\n                (hours ? parseInt(hours, 10) * 3600 : 0)\n            );\n        },\n    },\n\n    number: {\n        zeroPad: function (number) {\n            number = parseInt(number, 10);\n            return number < 10 ? `0${number}` : number.toString();\n        },\n    },\n\n    string: {\n        // timestamp [s]\n        getTimeFormatted: function (timestamp) {\n            var hours = Math.floor(timestamp / 3600),\n                minutes = Math.floor((timestamp % 3600) / 60),\n                seconds = timestamp % 60;\n\n            return `${\n                (hours > 0 ? `${hours}:` : '') + utils.number.zeroPad(minutes)\n            }:${utils.number.zeroPad(seconds)}`;\n        },\n    },\n\n    /**\n     * Check snap points support\n     * @returns {boolean}\n     */\n    getScrollSnapPrefix: function () {\n        var scrollSnapSupport = false;\n\n        if ('webkitScrollSnapType' in document.documentElement.style) {\n            scrollSnapSupport = '-webkit-';\n        } else if ('msScrollSnapType' in document.documentElement.style) {\n            scrollSnapSupport = '-ms-';\n        } else if ('scrollSnapType' in document.documentElement.style) {\n            scrollSnapSupport = '';\n        }\n\n        return scrollSnapSupport;\n    },\n\n    jsonToUrl: function (obj) {\n        return Object.keys(obj)\n            .map(function (key) {\n                return `${encodeURIComponent(key)}=${encodeURIComponent(\n                    obj[key],\n                )}`;\n            })\n            .join('&');\n    },\n};\n\nexport default utils;\n","const counters = {};\n\nconst log = function (...args) {\n    const counter = counters[args[0]] || 0;\n    counters[args[0]] = counter + 1;\n\n    args[0] = `${args[0]}: ${counter} %c\"${args[1]}\"`;\n    args[1] = 'color: #ca2117;';\n\n    // eslint-disable-next-line no-console\n    console.log(...args);\n};\n\n/**\n * @param {string} block\n * @returns {boolean}\n */\nconst isEnabled = function (block) {\n    const itemKey = `logSvpPlayer${block}`;\n\n    // check global first\n    if (window[itemKey] === true) {\n        return true;\n    }\n\n    // fix Safari errors when cookies are disabled\n    try {\n        if (!window.localStorage) {\n            return false;\n        }\n\n        return window.localStorage.getItem(itemKey) === 'true';\n    } catch (error) {\n        return false;\n    }\n};\n\n/**\n * @param {string} [block='SVP']\n * @return {{log: (...[*]) => void, error: ((...[*]) => void)}}\n */\nexport default function (block = 'SVP') {\n    // eslint-disable-next-line no-console\n    const error = (...args) => console.error('SVP Player:', ...args);\n\n    if (isEnabled(block)) {\n        return {\n            log(...args) {\n                if (typeof args[0] === 'function') {\n                    args[0](log.bind(this, block));\n                } else {\n                    args.unshift(block);\n                    log.apply(this, args);\n                }\n            },\n            error,\n        };\n    }\n\n    return {\n        log() {},\n        error,\n    };\n}\n","const warned: Record<string, boolean> = {};\n\nexport const warnOnce = (id: string, message: string) => {\n    if (warned[id]) {\n        return;\n    }\n    warned[id] = true;\n    // eslint-disable-next-line no-console\n    console.warn(message);\n};\n","/**\n * @type {Record<string, string>}\n */\nlet translations = {};\n\n/**\n * @param {Record<string, string>} data\n */\nconst setTranslations = (data) => {\n    translations = data;\n};\n\n/**\n * @returns {Record<string, string>}\n */\nconst getTranslations = () => translations;\n\n/**\n * @param {string} key\n * @param {string} [substitute]\n * @returns {string}\n */\n// eslint-disable-next-line arrow-body-style\nconst translate = (key, substitute) => {\n    // typeof to check keys like \"0\"\n    return (\n        translations[key] ||\n        (typeof substitute === 'undefined' ? key : substitute)\n    );\n};\n\n/**\n * @param {Date} date\n * @returns {string|undefined}\n */\nconst getMonthName = (date) => {\n    const months = translations.months || [];\n    return months[date.getMonth()] || date.getMonth();\n};\n\nexport default {\n    translate,\n    setTranslations,\n    getMonthName,\n    getTranslations,\n};\n","import config from 'player/config';\nimport type { Asset } from '@schibsted-svp/svp-api-types';\n\nasync function makeFetch<Data extends Asset | Asset[]>(\n    url: string,\n): Promise<Data> {\n    const response = await fetch(url);\n\n    if (!response.ok) {\n        return Promise.reject(response);\n    }\n\n    const data: Data = await response.json();\n    return data;\n}\n\nexport const APPNEXUS_PROVIDER_ID = 'appnexus';\n\nexport const assetAdditionalData = [\n    'settings',\n    'chapters',\n    'cuePoints',\n    'externalId',\n    'barrels',\n    'externalCategoryId',\n    'nextAsset',\n    'sourceFiles',\n    'subtitles',\n    'metadata',\n    'access',\n    'tags',\n    'stories',\n    'playlist',\n].join('|');\n\nexport const api = ({\n    vendor,\n    endpoint,\n}: {\n    vendor: string;\n    endpoint: string;\n}): Promise<Asset> => makeFetch<Asset>(config.api.getUrl(vendor, endpoint));\n\nexport const relatedApi = ({\n    path,\n    query,\n}: {\n    path: string;\n    query: string;\n}): Promise<Asset[]> => {\n    const relatedApiUrl = config.api.relatedApiUrl.replace(/\\/$/, '');\n\n    return makeFetch<Asset[]>(`${relatedApiUrl}/${path}?${query}`);\n};\n","const VIDEO = new Blob(\n    [\n        new Uint8Array([\n            0, 0, 0, 28, 102, 116, 121, 112, 105, 115, 111, 109, 0, 0, 2, 0,\n            105, 115, 111, 109, 105, 115, 111, 50, 109, 112, 52, 49, 0, 0, 0, 8,\n            102, 114, 101, 101, 0, 0, 2, 239, 109, 100, 97, 116, 33, 16, 5, 32,\n            164, 27, 255, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            55, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 112, 33, 16, 5, 32, 164, 27, 255, 192, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 55, 167, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 2, 194, 109, 111,\n            111, 118, 0, 0, 0, 108, 109, 118, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 3, 232, 0, 0, 0, 47, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 3, 0, 0, 1, 236, 116, 114, 97, 107, 0, 0, 0, 92, 116, 107, 104,\n            100, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,\n            0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36,\n            101, 100, 116, 115, 0, 0, 0, 28, 101, 108, 115, 116, 0, 0, 0, 0, 0,\n            0, 0, 1, 0, 0, 0, 47, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 100, 109,\n            100, 105, 97, 0, 0, 0, 32, 109, 100, 104, 100, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 172, 68, 0, 0, 8, 0, 85, 196, 0, 0, 0, 0, 0,\n            45, 104, 100, 108, 114, 0, 0, 0, 0, 0, 0, 0, 0, 115, 111, 117, 110,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 111, 117, 110, 100, 72, 97,\n            110, 100, 108, 101, 114, 0, 0, 0, 1, 15, 109, 105, 110, 102, 0, 0,\n            0, 16, 115, 109, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 100,\n            105, 110, 102, 0, 0, 0, 28, 100, 114, 101, 102, 0, 0, 0, 0, 0, 0, 0,\n            1, 0, 0, 0, 12, 117, 114, 108, 32, 0, 0, 0, 1, 0, 0, 0, 211, 115,\n            116, 98, 108, 0, 0, 0, 103, 115, 116, 115, 100, 0, 0, 0, 0, 0, 0, 0,\n            1, 0, 0, 0, 87, 109, 112, 52, 97, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 2, 0, 16, 0, 0, 0, 0, 172, 68, 0, 0, 0, 0, 0, 51,\n            101, 115, 100, 115, 0, 0, 0, 0, 3, 128, 128, 128, 34, 0, 2, 0, 4,\n            128, 128, 128, 20, 64, 21, 0, 0, 0, 0, 1, 244, 0, 0, 1, 243, 249, 5,\n            128, 128, 128, 2, 18, 16, 6, 128, 128, 128, 1, 2, 0, 0, 0, 24, 115,\n            116, 116, 115, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 4, 0, 0, 0,\n            0, 28, 115, 116, 115, 99, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0,\n            0, 2, 0, 0, 0, 1, 0, 0, 0, 28, 115, 116, 115, 122, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 2, 0, 0, 1, 115, 0, 0, 1, 116, 0, 0, 0, 20, 115, 116,\n            99, 111, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 44, 0, 0, 0, 98, 117, 100,\n            116, 97, 0, 0, 0, 90, 109, 101, 116, 97, 0, 0, 0, 0, 0, 0, 0, 33,\n            104, 100, 108, 114, 0, 0, 0, 0, 0, 0, 0, 0, 109, 100, 105, 114, 97,\n            112, 112, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 105, 108,\n            115, 116, 0, 0, 0, 37, 169, 116, 111, 111, 0, 0, 0, 29, 100, 97,\n            116, 97, 0, 0, 0, 1, 0, 0, 0, 0, 76, 97, 118, 102, 53, 54, 46, 52,\n            48, 46, 49, 48, 49,\n        ]),\n    ],\n    { type: 'video/mp4' },\n);\n\n/**\n * @returns {SvpAsset}\n */\nconst getMockAsset = () => ({\n    id: 1,\n    status: 'active',\n    streamType: 'mock',\n    streamUrls: {\n        hls: window.URL.createObjectURL(VIDEO),\n    },\n\n    images: {\n        main: null,\n    },\n\n    streamConfiguration: {\n        properties: [],\n    },\n    category: {},\n});\n\nexport { getMockAsset };\n","import type { Asset } from '@schibsted-svp/svp-api-types';\nimport { assetAdditionalData, api } from '../api';\n\nexport { getMockAsset } from './asset/mock';\n\nconst getAssetEndpoint = (id: number): string =>\n    `/assets/${id}?additional=${assetAdditionalData}`;\n\nexport const getById = async ({\n    vendor,\n    assetId,\n}: {\n    vendor: string;\n    assetId: number;\n}): Promise<Asset> =>\n    api({\n        vendor,\n        endpoint: getAssetEndpoint(assetId),\n    });\n","import Events from './backbone.events';\n\nconst SimpleModel = {\n    /**\n     * @param {string} attr\n     */\n    get(attr) {\n        this.attributes = this.attributes || {};\n        return this.attributes[attr];\n    },\n    /**\n     * @param {string} attr\n     * @param {*} val\n     */\n    set(attr, val) {\n        this.attributes = this.attributes || {};\n\n        if (this.attributes[attr] === val) {\n            return;\n        }\n        const oldVal = this.attributes[attr];\n        this.attributes[attr] = val;\n        this.trigger(`change:${attr}`, this, val, oldVal);\n    },\n    clone() {\n        return { ...this.attributes };\n    },\n    ...Events,\n};\n\nexport default SimpleModel;\n","export const cloneDeep = <T>(value: T): T => {\n    if ('structuredClone' in window) {\n        return structuredClone(value);\n    }\n\n    return JSON.parse(JSON.stringify(value));\n};\n","/* eslint-disable no-param-reassign */\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\n\n/**\n * @param {SvpCategory} data\n */\nconst Category = function (options) {\n    this.attributes = {\n        id: 0,\n    };\n\n    this.initialize(options);\n};\n\nCategory.prototype = {\n    /**\n     * @param {SvpCategory} data\n     */\n    initialize(data) {\n        utils.extend(this.attributes, this.parse(data));\n    },\n\n    /**\n     * @param {SvpCategory} data\n     * @returns {ParsedCategory}\n     */\n    parse(data) {\n        if (data.additional) {\n            utils.each(data.additional, (value, key) => {\n                if (typeof data[key] === 'undefined') {\n                    data[key] = value;\n                }\n            });\n\n            data.images = utils.extend({}, data.images || {}, {\n                background: data.background,\n                main: data.image,\n                logo: data.logo,\n                playerLogo: data.playerLogoImage,\n            });\n\n            delete data.additional;\n            delete data.background;\n            delete data.image;\n            delete data.logo;\n            delete data.playerLogoImage;\n        }\n\n        return data;\n    },\n\n    /**\n     * @returns {number}\n     */\n    getId() {\n        return this.get('id');\n    },\n\n    /**\n     * @returns {string}\n     */\n    getTitle() {\n        return this.get('title');\n    },\n};\n\nutils.extend(Category.prototype, Model);\n\nexport default Category;\n","/* eslint-disable no-param-reassign */\nimport { getById } from 'player/services/api/asset';\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\nimport { cloneDeep } from 'utils/clone-deep';\nimport Category from './category';\n\n/**\n * @typedef AssetChapter\n * @property {string|null} description\n * @property {boolean} featured\n * @property {number} timeline\n * @property {string} title\n */\n\nfunction unifyTimestamp(time) {\n    if (!time) {\n        return null;\n    }\n\n    if (time.toString().length === 10) {\n        return time * 1000;\n    }\n\n    return time;\n}\n\nconst Asset = function (options) {\n    this.attributes = {\n        id: 0,\n    };\n\n    this.initialize(options);\n};\n\nAsset.prototype = {\n    /**\n     * @param {SvpAsset} data\n     */\n    initialize(data) {\n        utils.extend(this.attributes, this.parse(data));\n    },\n\n    /**\n     * @returns {import('@schibsted-svp/svp-api-types').Asset|undefined}\n     */\n    getRawAsset() {\n        return this.rawAsset;\n    },\n\n    /**\n     * @param {SvpAsset} data\n     * @returns {ParsedAsset}\n     */\n    parse(data) {\n        this.rawAsset = cloneDeep(data || {});\n        const result = cloneDeep(data || {});\n\n        // rewrite additional fields\n        if (result.additional) {\n            utils.each(result.additional, (value, key) => {\n                // featured chapters are fetched on the lists\n                // merge them\n                if (key === 'featuredChapters') {\n                    key = 'chapters';\n                }\n\n                if (key === 'subtitles') {\n                    key = 'captions';\n                }\n\n                if (typeof result[key] === 'undefined') {\n                    result[key] = value;\n                }\n            });\n\n            if (result.additional.settings) {\n                if (result.additional.settings.ageLimit !== undefined) {\n                    result.ageLimit = result.additional.settings.ageLimit;\n                }\n            }\n        }\n\n        // multiply timestamps by 1000 to use ms instead of s\n        if (result.flightTimes) {\n            result.flightTimes = {\n                start: result.flightTimes.start\n                    ? unifyTimestamp(result.flightTimes.start)\n                    : null,\n                end: result.flightTimes.end\n                    ? unifyTimestamp(result.flightTimes.end)\n                    : null,\n            };\n        }\n\n        if (result.category && !(result.category instanceof Category)) {\n            result.category = new Category(result.category);\n        }\n\n        if (result.chapters) {\n            utils.each(result.chapters, (chapter, index) => {\n                chapter.time = utils.string.getTimeFormatted(chapter.timeline);\n                chapter.index = index + 1;\n            });\n        }\n\n        // next asset is optional, fill with basic object to avoid undefined errors\n        if (!result.nextAsset) {\n            result.nextAsset = {};\n        }\n\n        result.tags = result.tags || [];\n\n        if (result._embedded && result._embedded.tags) {\n            result.tags = result._embedded.tags;\n        }\n\n        result.playlist = [];\n\n        if (result._embedded && result._embedded.playlist) {\n            result.playlist = result._embedded.playlist;\n        }\n\n        return result;\n    },\n\n    /**\n     * @returns {Promise<import('@schibsted-svp/svp-api-types').Asset>}\n     */\n    async fetch() {\n        const asset = await getById({\n            vendor: this.getVendor(),\n            assetId: this.getId(),\n        });\n        Object.assign(this.attributes, this.parse(asset));\n    },\n\n    /**\n     * @returns {string}\n     */\n    getVendor() {\n        return this.get('vendor');\n    },\n\n    /**\n     * @returns {number}\n     */\n    getId() {\n        return this.get('id');\n    },\n\n    /**\n     * @returns {'live'|'wasLive'|'vod']}\n     */\n    getStreamType() {\n        return this.get('streamType');\n    },\n\n    /**\n     * @returns {number|undefined}\n     */\n    getNextAssetId() {\n        return this.get('nextAsset').id;\n    },\n\n    destroy() {\n        // in case of any cleanup\n    },\n\n    /**\n     * @returns {number}\n     */\n    getAgeLimit() {\n        return utils.isNumber(this.get('ageLimit')) ? this.get('ageLimit') : -1;\n    },\n\n    /**\n     * @returns {boolean}\n     */\n    isSponsored() {\n        const metadata = this.get('metadata');\n\n        let isSponsored = false;\n\n        /**\n         * SVP API metadata values are always strings. There can be different structures serialized to string though.\n         */\n        if (metadata && metadata.sponsored) {\n            try {\n                isSponsored =\n                    JSON.parse(metadata.sponsored.toLowerCase()) === true;\n            } catch (e) {\n                // All the cases that fail to be json decoded are treated as false\n            }\n        }\n\n        return isSponsored;\n    },\n\n    /**\n     * Get chapter by its index (numbered from 1)\n     *\n     * @param chapterIndex\n     * @returns {*} or undefined if not found\n     */\n    getChapter(chapterIndex) {\n        return this.getChapters()[chapterIndex - 1];\n    },\n\n    /**\n     * Get chapters for single stream\n     *\n     * @returns {AssetChapter[]}\n     */\n    getChapters() {\n        return this.get('chapters') || [];\n    },\n\n    /**\n     * @returns {string}\n     */\n    getThumbnail() {\n        return this.get('images').main;\n    },\n\n    /**\n     * @returns {string}\n     */\n    getTitle() {\n        return this.get('title');\n    },\n\n    /**\n     * @returns {Category}\n     */\n    getCategory() {\n        return this.get('category');\n    },\n\n    /**\n     * @returns {boolean}\n     */\n    isAudio() {\n        return this.get('assetType') === 'audio';\n    },\n};\n\nutils.extend(Asset.prototype, Model);\n\nexport default Asset;\n","/**\n * @type {number}\n */\n/**\n * @type {*}\n */\nvar config;\n\n/**\n * @param {number} pixelRatio\n * @returns {number}\n */\nfunction getImageQuality(pixelRatio) {\n    return pixelRatio >= 2 ? 50 : 80;\n}\n\n/**\n * @param {number} size\n * @param {number} pixelRatio\n * @returns [number, number]\n */\nfunction normalizeTransformSize(size, pixelRatio) {\n    // return default value\n    return [size, getImageQuality(pixelRatio)];\n}\n\n/**\n * @param {number[]} transformSizes\n * @param {number} maxDimension\n * @returns {number|undefined}\n */\nfunction getClosestSize(transformSizes, maxDimension) {\n    return transformSizes.reduce(function (prev, curr) {\n        return Math.abs(curr - maxDimension) < Math.abs(prev - maxDimension)\n            ? curr\n            : prev;\n    });\n}\n\n/**\n * @returns {number}\n */\nfunction getPixelRatio() {\n    // we do not support px lower than 1 and bigger than 2\n    return Math.max(1, Math.min(2, config.getPixelRatio()));\n}\n\n/**\n * Returns transformation for given image key and width\n * Adjusts the best\n */\nconst getImageTransform = (function () {\n    /**\n     * @type {Record<string, string>}\n     */\n    var cache = {};\n\n    /**\n     * @param {string} key\n     * @param {number} width\n     * @param {number} height\n     * @returns {string}\n     */\n    function imageTransform(key, width, height) {\n        const pixelRatio = getPixelRatio();\n        const cacheKey = key + width + height + pixelRatio;\n\n        // first check if there is cached object\n        if (cache[cacheKey]) {\n            return cache[cacheKey];\n        }\n\n        const id = key.split('.');\n        let transformSizes = config.sizes;\n\n        let i = 0;\n        while (i < id.length) {\n            transformSizes = transformSizes[id[i]];\n\n            if (!transformSizes) {\n                throw new Error(`Image transformation missing for key ${key}`);\n            }\n\n            i++;\n        }\n\n        const transformType = height > width ? 'autoWidth' : 'autoHeight';\n        transformSizes = transformSizes[transformType];\n\n        // transformation is adjusted to not 'auto' side\n        let maxDimension = transformType === 'autoHeight' ? width : height;\n        maxDimension *= pixelRatio;\n\n        const dimensions = normalizeTransformSize(\n            getClosestSize(transformSizes, maxDimension),\n            pixelRatio,\n        );\n\n        // auto width transform starts with 'x'\n        // http://svp.vg.no/svp/api/v1/docs/\n        let transform = transformType === 'autoWidth' ? 'x' : '';\n        transform = `${transform}${dimensions[0]}q${dimensions[1]}`;\n\n        cache[cacheKey] = transform;\n\n        return transform;\n    }\n\n    return imageTransform;\n})();\n\nconst image = {\n    /**\n     * @param {*} options\n     */\n    initialize: function (options) {\n        config = options;\n    },\n    /**\n     * @param {string} imageId\n     * @param {string} key\n     * @param {number} width\n     * @param {number} height\n     * @returns {string|null}\n     */\n    getImageSrc: function (imageId, key, width, height) {\n        if (imageId) {\n            const extension =\n                imageId.indexOf('.jpg') === -1 && imageId.indexOf('.png') === -1\n                    ? '.jpg'\n                    : '';\n            return `${imageId + extension}?t[]=${getImageTransform(\n                key,\n                width,\n                height,\n            )}`;\n        }\n        return null;\n    },\n};\n\nexport default image;\n","/* eslint-disable no-restricted-syntax, guard-for-in */\n\n/**\n * @param {Object} obj\n * @return {string}\n */\nconst objectToString = (obj) => {\n    // create an array that will later be joined into a string.\n    const string = [];\n\n    // is object\n    //    Both arrays and objects seem to return \"object\"\n    //    when typeof(obj) is applied to them. So instead\n    //    I am checking to see if they have the property\n    //    join, which normal objects don't have but\n    //    arrays do.\n    if (obj === undefined) {\n        return String(obj);\n    }\n    if (typeof obj === 'object' && obj !== null && obj.join === undefined) {\n        for (const prop in obj) {\n            if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n                string.push(`${prop}: ${objectToString(obj[prop])}`);\n            }\n        }\n\n        return `{${string.join(',')}}`;\n\n        // is array\n    }\n    if (typeof obj === 'object' && obj !== null && !(obj.join === undefined)) {\n        for (const prop in obj) {\n            string.push(objectToString(obj[prop]));\n        }\n        return `[${string.join(',')}]`;\n\n        // is function\n    }\n    if (typeof obj === 'function') {\n        string.push(obj.toString());\n\n        // all other values can be done with JSON.stringify\n    } else {\n        string.push(JSON.stringify(obj));\n    }\n\n    return string.join(',');\n};\n\n/**\n * @param {string} string\n * @return {string}\n */\nconst capitalizeFirstLetter = (string) => {\n    try {\n        return string.charAt(0).toUpperCase() + string.slice(1);\n    } catch (e) {\n        // return what was sent\n        return string;\n    }\n};\n\nexport { objectToString, capitalizeFirstLetter };\n","import config from 'player/config';\nimport utils from 'utils/utils';\n\n/**\n * @param {string} origin\n * @param {string[]} domains\n * @returns {boolean}\n */\nfunction isDomainInArray(origin, domains) {\n    let domain;\n    let pos;\n    let domainBeginning;\n\n    // check if domain has access for given provider\n    // otherwise deny it\n    // allow all dev builds set settings\n    if (config.version === 'dev') {\n        return true;\n    }\n\n    // list is not provided\n    if (!Array.isArray(domains)) {\n        return false;\n    }\n\n    const len = domains.length;\n\n    for (let i = 0; i < len; i += 1) {\n        domain = domains[i];\n\n        // subdomain parsing, subdomain has to end with domain\n        if (domain[0] === '*') {\n            // remove asterisk\n            domain = domain.slice(1);\n            pos = origin.indexOf(domain);\n\n            domainBeginning = origin[origin.length - domain.length - 1];\n\n            // check if origin has exactly the same ending of domain\n            if (\n                pos > -1 &&\n                origin.length - pos === domain.length &&\n                (domainBeginning === undefined || domainBeginning === '.')\n            ) {\n                return true;\n            }\n\n            // eslint-disable-next-line no-continue\n            continue;\n        }\n\n        if (domain.indexOf(origin) > -1) {\n            return true;\n        }\n    }\n\n    return false;\n}\n\n/**\n * Inherit data from parent array to child\n * Prevents undefined to persist if one of given array is empty\n *\n * @param {string[]} parent\n * @param {string[]} child\n * @returns {string[]}\n */\nfunction inherit(parent, child) {\n    return (parent || []).concat(child || []);\n}\n\nconst Domain = {\n    /**\n     * @type {string|null}\n     */\n    domain: null,\n\n    // default settings configuration\n    settings: {\n        // boolean Preview of not published videos\n        preview: false,\n        // completely turn off all ads\n        na: false,\n    },\n\n    /**\n     * @type {Record<string, Promise<*>>}\n     */\n    vendors: {},\n\n    /**\n     * @param {string} domain\n     */\n    initialize(domain) {\n        this.domain = domain;\n    },\n\n    /**\n     * Fetch permissions for extended settings\n     *\n     * @param {string} vendor\n     * @returns {Promise<*>}\n     */\n    fetch(vendor) {\n        if (!this.vendors[vendor]) {\n            this.vendors[vendor] = Promise.resolve(config.domains);\n        }\n\n        return this.vendors[vendor];\n    },\n\n    /**\n     * Check whatever custom settings may be used on current domain or not\n     *\n     * @param vendor - api key vendor\n     * @returns {Promise<Record<string, boolean>>}\n     */\n    getPermissions(vendor) {\n        return this.fetch(vendor).then((data) => {\n            const result = {};\n\n            utils.each(data, (item, key) => {\n                result[key] = isDomainInArray(\n                    this.domain,\n                    inherit(item.global, item[vendor]),\n                );\n            });\n\n            return result;\n        });\n    },\n\n    /**\n     * Check if current domain is blacklisted\n     *\n     * @param {string} vendor - api vendor key\n     * @returns {boolean}\n     */\n    isBlacklisted(vendor) {\n        const { blacklist } = config.domains;\n\n        // check if domain has access for given provider\n        // otherwise deny it\n        // allow all dev builds set settings\n        if (config.version === 'dev') {\n            return false;\n        }\n\n        return isDomainInArray(\n            this.domain,\n            inherit(blacklist.global, blacklist[vendor]),\n        );\n    },\n};\n\nexport default Domain;\n","import config from 'player/config';\n\nimport { TOKEN_FETCH_ERROR } from '../playback/config/status-codes';\n\n/**\n * @param {{expiry: number, value: string, vendor: string}} params\n * @returns {Promise<string>}\n */\nconst fetchToken = async function (params) {\n    this.isFetching = true;\n\n    const response = await fetch(this.url(params));\n\n    this.isFetching = false;\n\n    if (!response.ok) {\n        return Promise.reject(TOKEN_FETCH_ERROR);\n    }\n\n    this.value = await response.text();\n    this.expire = Date.now() + 1000;\n    return this.value;\n};\n\nclass Token {\n    /**\n     * @param {number} assetId\n     * @param {string} [assetAccess]\n     * @param {number} [maxBitrate]\n     */\n    constructor(assetId, assetAccess, maxBitrate) {\n        /**\n         * Id of SVP related asset\n         *\n         * @type {number}\n         */\n        this.assetId = assetId;\n\n        /**\n         * An access level key string\n         * See https://svp.vg.no/svp/api/v1/vgtv/assets/access-definitions?appName=docs for available levels\n         *\n         * @type {string}\n         */\n        this.assetAccess = assetAccess;\n\n        /**\n         * Akamai token value retrieved from SVP api\n         * @type {string|null}\n         */\n        this.value = null;\n        /**\n         * Expiration time, timestamp\n         * @type {number|null}\n         */\n        this.expire = null;\n\n        /**\n         * Maximum allowed bitrate for stream\n         * @type {number|null}\n         */\n        this.maxBitrate = maxBitrate || null;\n\n        /**\n         * @type {Promise<string>|null}\n         */\n        this.request = null;\n        this.isFetching = false;\n    }\n\n    /**\n     * @param {((assetId: number, assetAccess: string) => Promise<{expiry: number, value: string} | {} | null>)} [configuration]\n     * @param {boolean} hasAccess\n     * @param {string} vendor\n     * @returns {Promise<string>|null}\n     */\n    async fetch(configuration, hasAccess, vendor) {\n        if (!this.isValid()) {\n            if (this.request && this.isFetching) {\n                return this.request;\n            }\n\n            if (typeof configuration === 'function') {\n                const { value, expiry } = await configuration(\n                    this.assetId,\n                    this.assetAccess,\n                );\n                if (value && expiry) {\n                    this.request = fetchToken.call(this, {\n                        expiry,\n                        value,\n                        vendor,\n                    });\n                    return this.request;\n                }\n            }\n            if (!hasAccess) {\n                this.request = fetchToken.call(this, { vendor });\n                return this.request;\n            }\n            this.request = Promise.resolve(null);\n        }\n\n        return this.request;\n    }\n\n    /**\n     * @param {{expiry: number, value: string, vendor: string}} params\n     *\n     * @returns {string}\n     */\n    url(params) {\n        const query = [`vendor=${params.vendor}`];\n\n        if (params && params.expiry && params.value) {\n            query.push(`assetId=${this.assetId}`);\n            query.push(`expires=${params.expiry}`);\n            query.push(`hmac=${params.value}`);\n        } else {\n            query.push('acl=/*');\n        }\n\n        if (this.maxBitrate) {\n            query.push(`maxBitrate=${this.maxBitrate}`);\n        }\n\n        return `${config.api.tokenUrl}?${query.join('&')}`;\n    }\n\n    /**\n     * @returns {string|null}\n     */\n    getValue() {\n        return this.value;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    isValid() {\n        // on load expire is null therefore it will always return false\n        return Date.now() < this.expire;\n    }\n}\n\nexport default Token;\n","import utils from 'utils/utils';\nimport Model from 'utils/model';\nimport device from 'utils/device';\nimport ServerTime from 'utils/server-time';\nimport config from 'player/config';\n\n/**\n * @param {SvpAsset} options\n * @constructor\n */\nconst Stream = function (options) {\n    this.attributes = {\n        id: 0,\n    };\n\n    this.initialize(options);\n};\n\nStream.prototype = {\n    /**\n     * @param {SvpAsset} data\n     */\n    initialize(data) {\n        utils.extend(this.attributes, this.parse(data));\n    },\n\n    /**\n     * Parse data from asset\n     * Be aware, data went through Asset.parse method\n     *\n     * @param {SvpAsset} data\n     * @returns {ParsedStream}\n     */\n    parse(data) {\n        const result = {\n            id: data.id,\n            vendor: data.vendor,\n            title: data.title,\n\n            streams: {\n                hls: data.streamUrls.hls,\n                mp4: data.streamUrls.mp4 ? [data.streamUrls.mp4] : [],\n            },\n            status: data.status,\n            type: data.streamType,\n            mediaType: data.assetType,\n            streamConfiguration: data.streamConfiguration,\n\n            images: {\n                main: data.images.main,\n                snapshots: data.images.snapshots || null,\n            },\n\n            captions: data.captions || [],\n\n            flightTimes: {\n                start: null,\n                end: null,\n            },\n\n            playback: {\n                begin: null,\n                end: null,\n            },\n\n            externalId: data.externalId || null,\n            category: data.category,\n        };\n\n        if (data.duration) {\n            result.duration = data.duration / 1000;\n        }\n\n        if (data.additional && data.additional.metadata) {\n            result.disableNextVideo = data.additional.metadata.disableNextVideo;\n            result.chunkDuration = Number(\n                data.additional.metadata.chunkDuration,\n            );\n            result.isPodcast = data.additional.metadata.isPodcast === 'true';\n            result.hasSubtitlesInHls =\n                data.additional.metadata.hasSubtitlesInHls;\n            result.tts = Boolean(data.additional.metadata.tts_articleId);\n\n            result.videoPreviews = Object.entries(\n                data.additional.metadata,\n            ).reduce((videoPreviews, [metadataKey, metadataValue]) => {\n                if (!metadataKey.includes('preview')) {\n                    return videoPreviews;\n                }\n                return {\n                    ...videoPreviews,\n                    [metadataKey]: metadataValue,\n                };\n            }, {});\n        }\n\n        // override start and end if set in api\n        if (data.flightTimes) {\n            result.flightTimes = {\n                start: data.flightTimes.start ? data.flightTimes.start : null,\n                end: data.flightTimes.end ? data.flightTimes.end : null,\n            };\n        }\n\n        if (data.playback) {\n            result.playback = {\n                begin: data.playback.begin,\n                end: data.playback.end,\n            };\n        }\n\n        // additional stream settings\n        if (data.settings) {\n            result.showAds = data.settings.showAds;\n        }\n\n        // cue points, empty array if nothing set\n        result.cuePoints = data.cuePoints;\n\n        // playlist, empty array if nothing set\n        result.playlist = data.playlist || [];\n\n        // add midroll in 10s TODO remove after tests\n        // result.cuePoints = [31];\n        return result;\n    },\n\n    /**\n     * @returns {number}\n     */\n    getId() {\n        return this.get('id');\n    },\n\n    /**\n     * @returns {string}\n     */\n    getVendor() {\n        return this.get('vendor');\n    },\n\n    /**\n     * @returns {Category}\n     */\n    getCategory() {\n        return this.get('category');\n    },\n\n    /**\n     * @param {string} property\n     * @return {boolean}\n     */\n    hasProperty(property) {\n        return (\n            this.get('streamConfiguration').properties.indexOf(property) > -1\n        );\n    },\n\n    /**\n     * @returns {boolean}\n     */\n    hasSubtitlesInHls() {\n        return this.get('hasSubtitlesInHls') === 'true';\n    },\n\n    /**\n     * Get duration stored in API\n     *\n     * @returns {number}\n     */\n    getDuration() {\n        return this.get('duration');\n    },\n\n    /**\n     * @returns {number[]}\n     */\n    getCuePoints() {\n        return this.get('cuePoints');\n    },\n\n    /**\n     * Check if stream has Akamai Secure Token\n     * @returns {boolean}\n     */\n    isSecure() {\n        return this.hasProperty('tokenSecured');\n    },\n\n    /**\n     * Check if stream is behind paywall\n     * @returns {boolean}\n     */\n    hasAccess() {\n        return !!this.get('access');\n    },\n\n    /**\n     * Check wheter give stream contains mock data to allow embedding player without asset id\n     * @returns {boolean}\n     */\n    isMock() {\n        return this.get('type') === 'mock';\n    },\n\n    /**\n     * Check if stream is available only in certain areas\n     * @returns {boolean}\n     */\n    isGeoblocked() {\n        return this.hasProperty('geoblocked');\n    },\n\n    /**\n     * @returns {boolean}\n     */\n    isLive() {\n        return this.get('type') === 'live';\n    },\n\n    /**\n     * @returns {boolean}\n     */\n    wasLive() {\n        return this.get('type') === 'wasLive';\n    },\n\n    /**\n     * @returns {boolean}\n     */\n    isActive() {\n        return this.get('status') === 'active' && !this.isPast();\n    },\n\n    /**\n     * @returns {boolean}\n     */\n    isFuture() {\n        return this.get('flightTimes') && this.get('flightTimes').start\n            ? this.get('flightTimes').start > ServerTime.getTime()\n            : false;\n    },\n\n    /**\n     * @returns {boolean}\n     */\n    isPast() {\n        return this.get('flightTimes') && this.get('flightTimes').end\n            ? this.get('flightTimes').end < ServerTime.getTime()\n            : false;\n    },\n\n    /**\n     * @returns {boolean}\n     */\n    hasPlaylist() {\n        return this.get('playlist').length > 0;\n    },\n\n    /**\n     * @returns {boolean}\n     */\n    isDisabledNextVideo() {\n        return !!this.get('disableNextVideo');\n    },\n    /**\n     * Streams might not be available while asset is created\n     *\n     * @returns {boolean}\n     */\n    hasPlayableSource() {\n        if (this.getTimeToStart() > 0 || !this.isActive()) {\n            return false;\n        }\n\n        return true;\n    },\n\n    getUrl(streamType) {\n        const isOnHttp = window.location.protocol\n            .toLowerCase()\n            .startsWith('http:');\n        const type = streamType.toLowerCase();\n\n        let streamUrl = this.get('streams')[type];\n\n        if (utils.device.isIE() && isOnHttp) {\n            streamUrl = streamUrl.replace('https', 'http');\n        }\n\n        return streamUrl;\n    },\n\n    /**\n     * @returns {string}\n     */\n    getPoster() {\n        return this.get('images').main;\n    },\n\n    getAllPreviewsUrls() {\n        return this.get('videoPreviews') || {};\n    },\n\n    /**\n     * Returns preview video URL\n     * @param {string} metadataKey\n     * @returns {string|undefined}\n     */\n    getVideoPreviewUrl(metadataKey) {\n        const videoPreviews = this.get('videoPreviews');\n        return videoPreviews ? videoPreviews[metadataKey] : undefined;\n    },\n\n    /**\n     * Get chunk duration of live video\n     *\n     * @returns {number}\n     */\n    getChunkDuration() {\n        return this.get('chunkDuration');\n    },\n\n    /**\n     * Get snapshots url\n     * @returns {string|null} - url string or null if snapshots not found\n     */\n    getSnapshots() {\n        return `${\n            config.api.thumbnailsUrl + this.getVendor()\n        }/assets/${this.getId()}`;\n    },\n\n    /**\n     * Not every asset has snapshot (lives, wasLives)\n     *\n     * @returns {boolean}\n     */\n    hasSnapshots() {\n        return this.get('images').snapshots !== null;\n    },\n\n    /**\n     * Get captions associated with stream\n     *\n     * @returns {boolean}\n     */\n    getCaptions() {\n        return this.get('captions') || [];\n    },\n\n    /**\n     * Check if mp4 streams are available\n     *\n     * @returns {boolean}\n     */\n    hasMp4Streams() {\n        return this.get('streams').mp4.length > 0;\n    },\n\n    /**\n     * Check if asset is published\n     * Method relay on server time to avoid timezone differences\n     *\n     * @returns {number} seconds to live\n     */\n    getTimeToStart() {\n        return (this.get('flightTimes').start - ServerTime.getTime()) / 1000;\n    },\n\n    /**\n     * Asset can be virually sliced into small chunks\n     * These are only indicators and do not slice stream\n     *\n     * @param position\n     *\n     * @returns {number|null}\n     */\n    getPlaybackTime(position) {\n        const playback = this.get('playback');\n\n        if (position === 'begin') {\n            if (this.get('playAhead') > 0) {\n                return this.get('playAhead');\n            }\n\n            return playback.begin > 0 ? playback.begin : null;\n        }\n\n        if (position === 'end' && playback.end > 0) {\n            return playback.end;\n        }\n\n        return null;\n    },\n\n    /**\n     * External id\n     * Used for JW Player statistics\n     *\n     * @returns {string|undefined}\n     */\n    getExternalId() {\n        return this.get('externalId');\n    },\n\n    /**\n     * Check wethever stream has ads disabled\n     *\n     * @returns {boolean}\n     */\n    hasAdsDisabled() {\n        return this.get('showAds') === false;\n    },\n\n    /**\n     * @returns {boolean}\n     */\n    isAudio() {\n        return this.get('mediaType') === 'audio';\n    },\n\n    /**\n     * @returns {boolean}\n     */\n    hasTextSpeech() {\n        return this.get('tts');\n    },\n\n    /**\n     * Check if stream is podcast\n     * @returns {boolean}\n     */\n    isPodcast() {\n        return this.get('isPodcast') === true;\n    },\n\n    /**\n     * Get VMAP API URL for ads schedule\n     * @param {Record<string, string>} [params]\n     * @returns {string}\n     */\n    getVmapApiUrl(params = {}) {\n        let supplyType = 'web_desktop';\n\n        if (device.isMobile()) {\n            supplyType = 'web_phone';\n        } else if (device.isTablet()) {\n            supplyType = 'web_tablet';\n        }\n\n        const queryParams = new URLSearchParams({\n            gdpr: '__gdpr__',\n            gdpr_consent: '__gdpr_consent__',\n            ...params,\n            supplyType,\n        }).toString();\n\n        return `${\n            config.api.vmapUrl\n        }/${this.getVendor()}/${this.getId()}?${queryParams}`;\n    },\n};\n\nutils.extend(Stream.prototype, Model);\n\nexport default Stream;\n","import { scriptLoader } from 'utils/script-loader';\nimport utils from 'utils/utils';\n\nfunction getRandomId() {\n    return Math.floor(Math.random() * 100) + 1;\n}\n\nfunction getJwAdsConfig(jwAdScheduleSlots, stream, settings) {\n    const adSlots = jwAdScheduleSlots || {};\n\n    const { hasNext } = settings || {};\n    const startTime = stream.getPlaybackTime('begin') || 0;\n\n    const adsConfig = {};\n\n    if (adSlots.preroll) {\n        adsConfig[`preroll${getRandomId()}-prebid`] = {\n            offset: 'pre',\n            extra: 1,\n            tag: adSlots.preroll.tag,\n        };\n    }\n\n    utils.each(stream.getCuePoints(), function (cuePoint) {\n        if (cuePoint?.timeline > startTime) {\n            if (adSlots.midroll) {\n                adsConfig[`midroll${getRandomId()}-prebid`] = {\n                    offset: cuePoint.timeline,\n                    tag: adSlots.midroll.tag,\n                };\n            }\n        }\n    });\n\n    if (\n        hasNext === false ||\n        (hasNext !== true && stream.get('hasNext') === false)\n    ) {\n        if (adSlots.postroll) {\n            adsConfig[`postroll${getRandomId()}-prebid`] = {\n                offset: 'post',\n                tag: adSlots.postroll.tag,\n            };\n        }\n    }\n\n    return adsConfig;\n}\n\nfunction getScheduleSlots(adSlots, adtTagUrls) {\n    return Object.keys(adSlots).reduce((prev, current, index) => {\n        prev[current] = {\n            offset: current,\n            tag: adtTagUrls[index],\n        };\n        return prev;\n    }, {});\n}\n\nconst CACHE_URL = 'https://pbs.relevant-digital.com/analytics_cache/cache';\n\nasync function loadAdTagUrls(config) {\n    return new Promise((resolve, reject) => {\n        if (!window.relevantDigital)\n            reject(new Error('Cannot find relevantDigital on global object'));\n\n        window.relevantDigital.cmd.push(() => {\n            const prebidConfig = {\n                consentManagement: config.consentManagement ?? {\n                    cmpApi: 'none',\n                },\n                cache: {\n                    url: CACHE_URL,\n                },\n            };\n\n            if (config.userId) {\n                prebidConfig.ortb2 = {\n                    user: {\n                        id: config.userId,\n                    },\n                };\n            }\n\n            if (config.eids) {\n                const eids = config.eids.map(({ source, id }) => ({\n                    source,\n                    uids: [{ id, atype: 1, ext: { stype: 'ppuid' } }],\n                }));\n\n                prebidConfig.userSync = {\n                    userIds: [{ name: 'pubProvidedId', params: { eids } }],\n                };\n            }\n\n            window.relevantDigital.addPrebidConfig(prebidConfig);\n\n            const slots = window.relevantDigital\n                .defineVideoSlots(\n                    Object.values(config.adSlots).map((adSlot) => ({\n                        path: adSlot.path,\n                        custParams: {\n                            ...adSlot.params,\n                            ...config.params,\n                        },\n                    })),\n                )\n                .map((s) => s.getSlotElementId());\n\n            window.relevantDigital.loadPrebid({\n                configId: config.configId,\n                collapseEmptyDivs: true,\n                collapseBeforeAdFetch: false,\n                allowedDivIds: null, // set to an array to only load certain <div>s, example - [\"divId1\", \"divId2\"]\n                noSlotReload: true,\n                allowedPlacementType: 'instream',\n                onSlotAndUnit: function ({ slot, unit }) {\n                    const xandrKeywords = Object.fromEntries(\n                        Object.entries(slot.custParams || {})\n                            .filter(([, value]) => Boolean(value))\n                            .map(([key, value]) => [\n                                key,\n                                value.toString().split(','),\n                            ]),\n                    );\n                    const { pbAdUnit } = unit; // AdUnit in Prebid\n                    const xandrBids = pbAdUnit.bids.filter(\n                        (b) => b.bidder.indexOf('appnexus') === 0,\n                    );\n                    xandrBids.forEach(({ params }) => {\n                        params.keywords = Object.assign(\n                            params.keywords || {},\n                            xandrKeywords,\n                        );\n                    });\n                },\n            });\n\n            window.relevantDigital.loadVideoUrls(slots, (urls) => {\n                resolve(urls);\n            });\n        });\n    });\n}\n\nasync function loadRelevantScript(url) {\n    if (window.relevantDigital) return true;\n    try {\n        await scriptLoader(url);\n        return true;\n    } catch {\n        return false;\n    }\n}\n\nexport async function getRelevantYieldConfig(config, stream, settings) {\n    const result = await loadRelevantScript(config.scriptUrl);\n    if (!result) return null;\n\n    const adTagUrls = await loadAdTagUrls(config);\n    const scheduleSlots = getScheduleSlots(config.adSlots, adTagUrls);\n    return getJwAdsConfig(scheduleSlots, stream, settings);\n}\n\nexport const onAdEventImpression = (ev) => {\n    if (!window.relevantDigital) return;\n    window.relevantDigital.cmd.push(() => {\n        // Loop through all ad ids starting from the innermost ad.\n        // registerImpressionByAdId() will return true if it registered an impression\n        const adIds = [ev.getAd().getAdId(), ...ev.getAd().getWrapperAdIds()];\n        // eslint-disable-next-line no-restricted-syntax\n        for (const id of adIds) {\n            if (window.relevantDigital.Auction.registerImpressionByAdId(id)) {\n                return;\n            }\n        }\n    });\n};\n","import config from 'player/config';\nimport utils from 'utils/utils';\n\n/**\n * @param {string} url\n * @param {Object<string, string|number>} params\n * @returns {string}\n */\nfunction buildUrlString(url, params) {\n    const cb = Math.round(Math.random() * 100000000000);\n    const queryParams = utils.jsonToUrl(utils.extend({ cb }, params));\n    return `${url}?${queryParams}`;\n}\n\n/**\n * This is only for overriding/preview ads live on the page\n * @see https://github.schibsted.io/svp/web-player/issues/833\n * @param {string|number} overriddenId\n * @returns {string}\n */\nexport function getOverriddenCrTag(overriddenId) {\n    const overriddenParams = { id: overriddenId, format: 'vast' };\n    return buildUrlString(config.ads.appnexus.cr, overriddenParams);\n}\n\n/**\n * @param {Record<key, *>} params\n * @returns {string}\n */\nexport function getPtvTag(params) {\n    return buildUrlString(config.ads.appnexus.ptv, params);\n}\n\n/**\n * @param {Record<key, *>} params\n * @returns {string}\n */\nexport function getVmapTag(params) {\n    return buildUrlString(config.ads.appnexus.vmap, params);\n}\n\n/**\n * @param {Object} tagOptions\n * @param {Object} globalOptions\n * @returns {Object}\n */\nexport function getAstConfig(tagOptions, globalOptions) {\n    return utils.extend({}, utils.merge(globalOptions, tagOptions));\n}\n\n/**\n * @param {Stream & Eventable} stream\n * @returns {Object}\n */\nexport function getDefaultParams(stream) {\n    const publisherName = stream.getVendor();\n    const countryCode = config.vendors.se.includes(publisherName) ? 'se' : 'no';\n    const supplyType = `web_${utils.device.getDeviceType()}`;\n    return {\n        countryCode,\n        supplyType,\n        publisherName,\n        slotIds: { preroll: 1, midroll: 2, postroll: 3 },\n    };\n}\n","import utils from 'utils/utils';\nimport * as appnexusTag from './appnexus-tag-builder';\n\nconst OVERRIDE_SEPARATOR = ':';\nconst OVERRIDE_SLOT_PARAM = 'ast_override_slot';\nconst OVERRIDE_SLOT_TAG_ID = 'ast_override_tag_id';\n\n/**\n * @returns {Record<string, string>|undefined}\n */\nexport function getOverriddenParams() {\n    const urlParams = new URLSearchParams(window.location.search);\n\n    if (urlParams.has(OVERRIDE_SLOT_PARAM)) {\n        const [slotName, creativeId] = urlParams\n            .get(OVERRIDE_SLOT_PARAM)\n            .split(OVERRIDE_SEPARATOR);\n        return { [slotName]: creativeId };\n    }\n\n    if (urlParams.has(OVERRIDE_SLOT_TAG_ID)) {\n        const [tagId, creativeId] = urlParams\n            .get(OVERRIDE_SLOT_TAG_ID)\n            .split(OVERRIDE_SEPARATOR);\n        return { [tagId]: creativeId };\n    }\n\n    return undefined;\n}\n\nexport default class JwAdsConfig {\n    /**\n     * @param {Stream & Eventable} stream\n     */\n    constructor(stream) {\n        this.stream = stream;\n        this.config = {};\n        this.params = [];\n        this.overriddenParams = getOverriddenParams();\n    }\n\n    /**\n     * @param {Object<string, *>} params\n     */\n    setParams(params) {\n        this.params = params;\n    }\n\n    /**\n     * @param {Object} adSlotConfig\n     * @param {string} adLabel\n     * @return {string}\n     */\n    getTag(adSlotConfig, adLabel) {\n        const adConfig = utils.merge(this.params, adSlotConfig);\n        const overriddenId =\n            this.overriddenParams &&\n            (this.overriddenParams[adLabel] ||\n                (adConfig.id && this.overriddenParams[adConfig.id]));\n        if (overriddenId) {\n            return appnexusTag.getOverriddenCrTag(overriddenId);\n        }\n\n        if (this.stream.isAudio()) {\n            return appnexusTag.getPtvTag(adConfig);\n        }\n\n        return appnexusTag.getVmapTag(adConfig);\n    }\n\n    /**\n     * @param {Object} adSlotConfig\n     * @param {string} offset\n     * @param {string} adLabel\n     */\n    add(adSlotConfig, offset, adLabel) {\n        // do not add tag when id is empty\n        if (adSlotConfig) {\n            this.config[adLabel + Math.floor(Math.random() * 100) + 1] = {\n                offset: offset,\n                tag: this.getTag(adSlotConfig, adLabel),\n            };\n        }\n    }\n\n    getConfig() {\n        return this.config;\n    }\n}\n","import { isEmpty } from 'utils/underscore';\nimport utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport { getRelevantYieldConfig } from './relevant-yield';\nimport * as appnexusTagBuilder from './appnexus-tag-builder';\nimport JwAdsConfig from './appnexus-jw-config';\n\n/**\n * @param {{adSlots, params: ({member: string}|Object)}} adConfig\n * @param {Stream&Eventable} stream\n * @param {*} settings\n * @returns {*}\n */\n// move to appnexus jw\nfunction getAdsConfig(adConfig, stream, settings) {\n    const adSlots = adConfig.adSlots || {};\n    const params = adConfig.params || [];\n    const adsConfig = new JwAdsConfig(stream);\n    const { hasNext } = settings || {};\n    const startTime = stream.getPlaybackTime('begin') || 0;\n\n    adsConfig.setParams(params);\n    adsConfig.add(adSlots.preroll, 'pre', 'preroll');\n\n    utils.each(stream.getCuePoints(), function (cuePoint) {\n        if (cuePoint?.timeline > startTime) {\n            adsConfig.add(adSlots.midroll, cuePoint.timeline, 'midroll');\n        }\n    });\n\n    // postroll is disabled when playnext is available\n    if (\n        hasNext === false ||\n        (hasNext !== true && stream.get('hasNext') === false)\n    ) {\n        adsConfig.add(adSlots.postroll, 'post', 'postroll');\n    }\n\n    return adsConfig.getConfig();\n}\n\n/**\n * @param {Params} params\n * @param {string} memberId\n * @returns {Params & { member: string }}\n * @template Params\n */\nfunction getParams(params, memberId) {\n    if (memberId) {\n        return { member: memberId, ...params };\n    }\n\n    return params;\n}\n\n/**\n * @param {*} adPlacements\n * @param {*} globalParams\n */\nfunction parseAdPlacements(adPlacements, globalParams) {\n    const placements = {};\n\n    utils.each(adPlacements, function (values, placementId) {\n        placements[placementId] = appnexusTagBuilder.getAstConfig(\n            values,\n            globalParams,\n        );\n    });\n\n    return placements;\n}\n\n/**\n * @param {*} clientConfig\n * @param {Stream} stream\n * @param {*} settings\n * @returns {*}\n */\nfunction getJwAdSchedule(clientConfig, stream, settings) {\n    const { adSlots } = clientConfig;\n    if (adSlots) {\n        return getAdsConfig(\n            {\n                adSlots: adSlots.schedule,\n                params: getParams(adSlots.params, clientConfig.member),\n            },\n            stream,\n            settings,\n        );\n    }\n\n    return {};\n}\n\n/**\n * @param {*} clientConfig\n * @returns {*}\n */\nfunction getAdPlacements(clientConfig) {\n    const { adPlacements } = clientConfig;\n\n    if (clientConfig.member && adPlacements) {\n        return parseAdPlacements(\n            adPlacements.schedule,\n            getParams(adPlacements.params, clientConfig.member),\n        );\n    }\n\n    return {};\n}\n\n/**\n * @param {Stream} stream\n * @param {*} settings\n * @returns {Promise<*>}\n */\nconst getClientConfig = async (stream, settings) => {\n    // ads are disabled\n    // check stream config also\n    const { na, adn } = settings;\n\n    if (na === true || !adn || stream.hasAdsDisabled()) {\n        return null;\n    }\n\n    let svpAdConfig = {};\n\n    if (typeof adn === 'function') {\n        svpAdConfig = await adn(\n            stream,\n            appnexusTagBuilder.getDefaultParams(stream),\n            adn.svpPlayer,\n        );\n    }\n\n    logger('SVP').log('adsConfig', svpAdConfig);\n\n    return svpAdConfig;\n};\n\n/**\n * Handle midroll scheduling in player\n *\n * @param {string} tag\n * @param {number|'NOW'} startTime\n * @returns {{onEnter: (cb: () => void) => void, setTime: (time: number) => void, onReady: (cb: () => void) => void}}\n */\nfunction createMidroll({ tag, startTime }) {\n    let hasEntered = false;\n    let onEnterCallback = () => {};\n\n    /**\n     * @param {() => void} callback\n     */\n    const onEnter = (callback) => {\n        onEnterCallback = callback;\n    };\n\n    /**\n     * @param {() => void} callback\n     */\n    const onReady = (callback) => {\n        if (tag) {\n            callback();\n        }\n    };\n\n    /**\n     * @param {number} time\n     */\n    const setTime = (time) => {\n        if (\n            hasEntered === false &&\n            (time >= startTime || startTime === 'NOW')\n        ) {\n            onEnterCallback(tag);\n            hasEntered = true;\n        }\n    };\n\n    return {\n        setTime,\n        onEnter,\n        onReady,\n    };\n}\n\n/**\n * @typedef AppnexusConfig\n * @property {*} adSchedule\n * @property {*} adPlacements\n * @property {*} adOptions\n */\n\n/**\n * @param {Stream} stream\n * @param {*} settings\n * @returns {Promise<AppnexusConfig|{}>}\n */\nasync function getConfig(stream, settings) {\n    const clientConfig = await getClientConfig(stream, settings);\n\n    if (clientConfig === null) {\n        return {};\n    }\n\n    if (!isEmpty(clientConfig.relevantYield)) {\n        return {\n            adSchedule: await getRelevantYieldConfig(\n                clientConfig.relevantYield,\n                stream,\n                settings,\n            ),\n            adPlacements: getAdPlacements(clientConfig),\n            adOptions: clientConfig.options || {},\n        };\n    }\n\n    return {\n        adSchedule: getJwAdSchedule(clientConfig, stream, settings),\n        adPlacements: getAdPlacements(clientConfig),\n        adOptions: clientConfig.options || {},\n    };\n}\n\n/**\n * @param {number} maxDuration\n * @param {Stream} stream\n * @param {Object} settings\n * @returns {Promise<string|undefined>}\n */\nfunction getLiveMidrollTag(maxDuration, stream, settings) {\n    return getClientConfig(stream, settings).then(function (clientConfig) {\n        if (!clientConfig) {\n            return undefined;\n        }\n\n        const { adSlots } = clientConfig;\n        const midroll = adSlots && adSlots.schedule && adSlots.schedule.midroll;\n        if (!midroll) {\n            return undefined;\n        }\n\n        const params = getParams((adSlots || {}).params, clientConfig.member);\n        params.vmaxduration = maxDuration;\n\n        return appnexusTagBuilder.getVmapTag(utils.merge(params, midroll));\n    });\n}\n\nexport default {\n    getConfig,\n    getLiveMidrollTag,\n    createMidroll,\n};\n","import configuration from 'player/config';\nimport locale from 'player/model/locale';\n/**\n * Create sharing config based on passed options\n *\n * @param {*} options\n * @param {Stream} stream\n * @param {*} globals\n * @return {config.sharing|null}\n */\nconst getConfig = ({\n    options,\n    stream,\n    globals = {\n        sharing: configuration.sharing,\n        title: locale.translate('Sharing'),\n    },\n}) => {\n    if (options === false) {\n        return null;\n    }\n\n    const defaults = globals.sharing || {};\n    const vendor = stream.getVendor();\n\n    const sharing = { ...defaults.global };\n\n    // use provider specific sharing info\n    if (defaults[vendor]) {\n        Object.assign(sharing, defaults[vendor]);\n    }\n\n    // extend sharing options when object is provided as param for it\n    if (typeof options === 'object') {\n        Object.assign(sharing, options);\n    } else if (typeof options === 'function') {\n        Object.assign(sharing, options(stream.attributes));\n    }\n\n    // add uri encoding to prevent sharing problems\n    if (sharing.code) {\n        sharing.code = encodeURIComponent(sharing.code);\n    }\n\n    if (!sharing.heading) {\n        sharing.heading = globals.title;\n    }\n\n    return sharing;\n};\n\n/**\n * JW configuration adapter\n *\n * @param args\n * @return {function(config: Config): Config}\n * @template Config\n */\nconst addSharing = (...args) =>\n    function (config) {\n        const sharing = getConfig(...args);\n\n        if (sharing === null) {\n            delete config.sharing;\n        } else {\n            config.sharing = sharing;\n        }\n\n        return config;\n    };\n\nexport { getConfig, addSharing };\n","export const fallbackChromecastApp = 'A753C1FE';\nexport const chromecastApps = {\n    CB3CFFEE: ['ab'],\n    '96E78488': ['svd'],\n    C6559D78: ['ridenws'],\n    E43A13ED: ['brandstudio'],\n    '8AE3CE4D': ['riks'],\n    '9E7A477E': ['100sport'],\n    '35E82475': ['sa'],\n    B6C9EA8E: ['bt'],\n    E64998E3: ['ap'],\n    '615D672F': ['schibsted'],\n    A7738716: ['tvnu'],\n    A5965089: ['vgtv', 'vgtvexternal', 'vgtvs'],\n    '06A55D09': [\n        'fvn',\n        'adressa',\n        'altaposten',\n        'folkebladet',\n        'harstad',\n        'itromso',\n        'rbnett',\n        'tronderavisa',\n        'adressabrandstudio',\n        'smp',\n        'steinkjer',\n        'avisast',\n        'bladet',\n        'banett',\n        'innherred',\n        'fosnafolket',\n        'opp',\n        'tronderbladet',\n        'stjordalsnytt',\n        'mn24',\n        'hitrafroya',\n        'framtidinord',\n        'vaganavisa',\n        'vol',\n        'nyttiuka',\n        'vikebladet',\n        'fjt',\n        'vestlandsnytt',\n        'fjuken',\n        'vigga',\n        'dolen',\n        'fjordabladet',\n        'morenytt',\n        'fjordingen',\n        'driva',\n        'andalsnes',\n        'nyss',\n        'agderposten',\n        'lindesnes',\n        'farsund',\n        'varden',\n        'lp',\n        'venneslatidende',\n        'gat',\n        'bomlonytt',\n        'sunnhordland',\n    ],\n};\n","/**\n * @param {HTMLElement} parent\n * @param {string | HTMLElement | Object} child\n * @returns {HTMLElement}\n */\nexport function appendChild(parent, child) {\n    if (Array.isArray(child)) {\n        child.forEach((c) => appendChild(parent, c));\n    } else if (typeof child === 'string') {\n        parent.appendChild(document.createTextNode(child));\n    } else if (child instanceof HTMLElement) {\n        parent.appendChild(child);\n    } else {\n        throw new Error('Invalid child type');\n    }\n\n    return parent;\n}\n\n/**\n * @param {string} tagName\n * @param {Object} attributes\n * @param {string | HTMLElement | Object | (string | HTMLElement | Object)[]} children\n * @returns {HTMLElement}\n */\nexport function createElement(tagName, attributes = {}, children = []) {\n    const element = document.createElement(tagName);\n    Object.keys(attributes).forEach((attribute) => {\n        element.setAttribute(attribute, attributes[attribute]);\n    });\n    appendChild(element, children);\n\n    return element;\n}\n","/**\n * @param {HTMLElement} container\n * @return {Promise<void>}\n */\nconst waitForControls = (container) =>\n    new Promise((resolve) => {\n        const checkIfControlsLoaded = () => {\n            const hasControlsLoaded = container.querySelector('.jw-controlbar');\n\n            if (hasControlsLoaded) {\n                resolve();\n            } else {\n                window.requestAnimationFrame(checkIfControlsLoaded);\n            }\n        };\n\n        window.requestAnimationFrame(checkIfControlsLoaded);\n    });\n\n/**\n * If jwplayer chooses to use bundle without embedded controls, it can load them asynchronously later,\n * in that case, we must ensure their presence when e.g. resolving audio skin.\n *\n * @param {HTMLElement} container\n * @return {Promise<void>}\n */\nexport const ensureIfControlsLoaded = async (container) => {\n    const controlsLoaded = Boolean(container.querySelector('.jw-controlbar'));\n\n    if (controlsLoaded) {\n        return;\n    }\n\n    await waitForControls(container);\n};\n","import configuration from 'player/config';\nimport { createElement } from 'player/plugins/anti-adblock/dom';\nimport locale from 'player/model/locale';\nimport logger from 'utils/logger';\nimport { ensureIfControlsLoaded } from './jw-controls';\n\nexport const TTS_SKIN_CLASS_NAME = 'jw-skin-svp-tts';\n\nconst JW_AUDIO_MODE_MAX_HEIGHT = '44';\n\nconst DEFAULT_TTS_PLAYBACK_RATES = [0.8, 1, 1.25, 1.5, 2, 2.5, 3];\n\n/**\n * Extends JW Player config with a particular height and no controls\n * @param {Object} jwConfig\n * @param {Stream} stream\n * @param {Config} config - playback config\n */\nexport function applyTtsOption(jwConfig, stream, config) {\n    if (!config.shouldApplyTextToSpeechSkin(stream)) {\n        return jwConfig;\n    }\n\n    // extend config with no controls and height for text to speech\n    const {\n        height = JW_AUDIO_MODE_MAX_HEIGHT,\n        playbackRates = DEFAULT_TTS_PLAYBACK_RATES,\n        playbackRateControls = true,\n    } = config.getRaw();\n\n    config.set('height', height);\n\n    return {\n        ...jwConfig,\n        height,\n        playbackRates,\n        playbackRateControls,\n    };\n}\n\n/**\n * @param {...string} names - class names without text-to-speech skin prefixes\n */\nfunction classNames(...names) {\n    return names.map((name) => `svp-tts-${name}`).join(' ');\n}\n\n/**\n *\n * @param {HTMLDivElement} container\n * @param {Object} translate\n */\nfunction createControls(container, translate) {\n    const durationText = createElement('span', {\n        class: classNames('duration'),\n    });\n    const durationReplayText = createElement('span', {\n        class: classNames('duration'),\n    });\n\n    const idleText = createElement(\n        'div',\n        { class: classNames('text', 'idle-text') },\n        [createElement('strong', {}, [translate.play]), ' • ', durationText],\n    );\n\n    const replayText = createElement(\n        'div',\n        { class: classNames('text', 'replay-text') },\n        [\n            createElement('strong', {}, [translate.replay]),\n            ' • ',\n            durationReplayText,\n        ],\n    );\n\n    [idleText, replayText].forEach((el) => {\n        container.querySelector('.jw-button-container').appendChild(el);\n    });\n\n    return {\n        durationText,\n        durationReplayText,\n    };\n}\n\n/**\n *\n * @param {HTMLDivElement} container\n * @param {Object} translate\n */\nfunction createAdElements(container, translate) {\n    const altText = createElement(\n        'div',\n        { class: 'jw-text jw-reset-text svp-tts-text-alt' },\n        [translate.cuetext],\n    );\n\n    container\n        .querySelector('.jw-button-container')\n        .insertBefore(\n            altText,\n            container.querySelector('.jw-button-container .jw-text-elapsed'),\n        );\n}\n\n/**\n * @param {number} n\n * @param {string} singular\n * @param {string} plural\n */\nfunction pluralize(n, singular, plural) {\n    return n === 1 ? singular : plural;\n}\n\n/**\n * @param {number} duration\n * @param {Object} translate\n */\nfunction timeToText(duration, translate) {\n    const minutes = Math.floor(duration / 60);\n    if (minutes) {\n        return `${minutes} ${pluralize(\n            minutes,\n            translate.minute,\n            translate.minutes,\n        )}`;\n    }\n\n    const seconds = Math.floor(duration - minutes * 60);\n    return `${seconds} ${pluralize(\n        seconds,\n        translate.second,\n        translate.seconds,\n    )}`;\n}\n\nlet fontLoadingPromise;\n\nasync function loadFonts() {\n    if (fontLoadingPromise) {\n        return fontLoadingPromise;\n    }\n\n    const fonts = Object.entries(configuration.cdn.fonts.Graphik).map(\n        async ([weight, url]) => {\n            const font = new FontFace('Graphik', `url(${url})`, { weight });\n            document.fonts.add(font);\n            return font.load();\n        },\n    );\n\n    fontLoadingPromise = Promise.all(fonts);\n    return fontLoadingPromise;\n}\n\n/**\n * @param {PlayerModel} svpPlayer\n */\nfunction replacePlayerPoster(svpPlayer) {\n    const video = svpPlayer.getContainer().querySelector('video.jw-video');\n    if (!video) {\n        return;\n    }\n    video.setAttribute('poster', configuration.cdn.poster);\n}\n\n/**\n * @param {UIEvent} event\n */\nfunction closeSettingsMenu(event) {\n    if (!event.target.classList.contains('jw-settings-content-item')) {\n        return;\n    }\n\n    const controls = event.currentTarget.querySelector('.jw-controls');\n    if (!controls?.classList.contains('jw-settings-open')) {\n        return;\n    }\n\n    const settingsMenu = event.currentTarget.querySelector(\n        '.jw-icon-settings.jw-settings-submenu-button',\n    );\n    if (!settingsMenu) {\n        return;\n    }\n    event.preventDefault();\n    event.stopPropagation();\n    settingsMenu.click();\n}\n\n/**\n * Resolves whether the player needs a text-to-speech skin or not and replaces UI elements\n * @param {PlayerModel} svpPlayer\n */\nexport function ttsSkinResolver(svpPlayer) {\n    const useTextSpeechSkin = svpPlayer.config.shouldApplyTextToSpeechSkin();\n    logger('TTS').log(useTextSpeechSkin ? 'on' : 'off');\n\n    if (!useTextSpeechSkin) {\n        return;\n    }\n\n    loadFonts();\n\n    const translate = locale.translate('tts');\n    let elements;\n\n    const updateDetailTexts = (time, duration) => {\n        if (!elements.durationText.textContent.length) {\n            elements.durationText.textContent = timeToText(duration, translate);\n        }\n\n        if (!elements.durationReplayText.textContent.length) {\n            elements.durationReplayText.textContent = timeToText(\n                duration,\n                translate,\n            );\n        }\n    };\n\n    svpPlayer.on('time', (time, duration) => {\n        updateDetailTexts(time, duration);\n    });\n\n    svpPlayer.on('ready', () => {\n        svpPlayer.getContainer()?.addEventListener('click', closeSettingsMenu);\n    });\n\n    svpPlayer.on('playlistItem', async () => {\n        const container = svpPlayer.getContainer();\n\n        if (container) {\n            await ensureIfControlsLoaded(container);\n        }\n\n        const buttonContainer = container?.querySelector(\n            '.jw-button-container',\n        );\n\n        if (!container || !buttonContainer) {\n            return;\n        }\n\n        container.classList.add(TTS_SKIN_CLASS_NAME);\n\n        replacePlayerPoster(svpPlayer);\n        if (!elements) {\n            elements = createControls(container, translate);\n            createAdElements(container, locale.translate('ads'));\n        }\n\n        const time = svpPlayer.getCurrentTime();\n        const duration = svpPlayer.getStream().getDuration();\n        updateDetailTexts(time, duration);\n    });\n}\n","import logger from 'utils/logger';\nimport utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport { forward30Icon, playbackRateIcon } from 'icons/audio';\nimport { ensureIfControlsLoaded } from './jw-controls';\n\nconst DEFAULT_USE_AUDIO_SKIN = true;\n\nconst CN_FORWARD_BUTTON = 'jw-icon-forward';\nconst CN_DURATION_INFO = 'svp-duration';\nconst CN_PLAYBACK_RATE = 'svp-playback-rate';\nconst COVER = 'svp-cover';\nconst COVER_CONTAINER = 'svp-cover-container';\n\nconst PLAYBACK_RATES = [1.0, 1.2, 1.5, 1.7, 2.0];\n\n/** {string} An icon with proper class names */\nconst forwardIcon = forward30Icon.replace(\n    '<svg',\n    '<svg class=\"jw-svg-icon jw-svg-icon-forward\"',\n);\n\n/**\n * @param {number} seconds\n * @param {Object} translatePlayerConfig\n * @return {string}\n */\nfunction timeToText(seconds, translatePlayerConfig) {\n    if (seconds < 60) {\n        return `${Math.floor(seconds)} ${translatePlayerConfig.seconds}`;\n    }\n    if (seconds < 3600) {\n        return `${Math.floor(seconds / 60)} ${translatePlayerConfig.minutes}`;\n    }\n    return `${Math.floor(seconds / 3600)}${\n        translatePlayerConfig.hours\n    } ${Math.floor((seconds - Math.floor(seconds / 3600) * 3600) / 60)}${\n        translatePlayerConfig.minutes\n    }`;\n}\n\nexport function shouldUseAudioSkin(config) {\n    if (typeof config.get('audioSkin') === 'boolean') {\n        return config.get('audioSkin');\n    }\n\n    return !config.shouldApplyTextToSpeechSkin() && DEFAULT_USE_AUDIO_SKIN;\n}\n\n/**\n * Resolves whether the player needs an audio skin or not and adds necessary elements to the UI if needed\n * @param {PlayerModel} svpPlayer\n */\nexport default function audioSkinResolver(svpPlayer) {\n    const translate = locale.translate('player');\n    const { config, player: jwPlayer } = svpPlayer;\n    const useAudioSkin = shouldUseAudioSkin(config);\n\n    logger('AudioSkin').log(useAudioSkin ? 'on' : 'off');\n\n    if (!useAudioSkin) {\n        return;\n    }\n\n    const seekForward = () => {\n        const position = jwPlayer.getPosition();\n        const duration = jwPlayer.getDuration();\n        svpPlayer.seek(Math.min(duration, position + 30));\n    };\n\n    const changePlaybackRate = () => {\n        const rate = jwPlayer.getPlaybackRate();\n        const nextRateIndex = PLAYBACK_RATES.findIndex(\n            (currentRate) => currentRate === rate,\n        );\n        jwPlayer.setPlaybackRate(\n            PLAYBACK_RATES[\n                nextRateIndex >= PLAYBACK_RATES.length - 1\n                    ? 0\n                    : nextRateIndex + 1\n            ],\n        );\n    };\n\n    svpPlayer.on('playbackRateChanged', ({ playbackRate }) => {\n        if (!svpPlayer.player.getControls()) {\n            return;\n        }\n\n        const container = svpPlayer.getContainer();\n        const playbackRateButton = container.querySelector(\n            `.jw-controlbar .${CN_PLAYBACK_RATE}`,\n        );\n        const playbackRateButtonText = playbackRateButton.querySelector('text');\n\n        playbackRateButtonText.textContent = playbackRate.toFixed(1);\n        playbackRateButton.setAttribute(\n            'aria-label',\n            `${translate.playbackSpeed} ${playbackRateButtonText.textContent}`,\n        );\n    });\n\n    svpPlayer.on('playlistItem', async () => {\n        if (!svpPlayer.player.getControls()) {\n            return;\n        }\n\n        const container = svpPlayer.getContainer();\n        const stream = svpPlayer.getStream();\n        const isAudio = stream.isAudio();\n        const duration = stream.getDuration();\n        const forwardTooltip = translate.forward;\n\n        const addOrRemoveClass = isAudio ? utils.addClass : utils.removeClass;\n        addOrRemoveClass(container, 'svp-flag-media-audio');\n\n        await ensureIfControlsLoaded(container);\n\n        const displayControl = container.querySelector(\n            '.jw-display-icon-display .jw-icon-display',\n        );\n        const cover = container.querySelector(`.jw-preview .${COVER}`);\n        let forwardButton = container.querySelector(\n            `.jw-controlbar .${CN_FORWARD_BUTTON}`,\n        );\n        let durationInfo = container.querySelector(\n            `.jw-title .${CN_DURATION_INFO}`,\n        );\n        let playbackRateButton = container.querySelector(\n            `.jw-controlbar .${CN_PLAYBACK_RATE}`,\n        );\n\n        if (!cover && isAudio) {\n            container\n                .querySelector('.jw-wrapper')\n                .insertBefore(\n                    utils.createNode(\n                        `<div class=\"${COVER_CONTAINER}\"><div class=\"${COVER}\" /></div>/`,\n                    ),\n                    container.querySelector('.jw-preview'),\n                );\n\n            container.querySelector(`.${COVER_CONTAINER}`).style[\n                'background-image'\n            ] = `url(\"${config.getPoster(stream)}\")`;\n        }\n\n        if (!forwardButton) {\n            jwPlayer.addButton(\n                forwardIcon,\n                forwardTooltip,\n                seekForward,\n                'forward',\n                CN_FORWARD_BUTTON,\n            );\n            forwardButton = container.querySelector(\n                `.jw-controlbar .${CN_FORWARD_BUTTON}`,\n            );\n        }\n\n        if (!durationInfo) {\n            const title = container.querySelector('.jw-title');\n            durationInfo = utils.createNode(\n                `<div class=\"${CN_DURATION_INFO}\" />`,\n            );\n            title.appendChild(durationInfo);\n        }\n\n        if (!playbackRateButton) {\n            jwPlayer.addButton(\n                playbackRateIcon,\n                '',\n                changePlaybackRate,\n                'playback-rate',\n                CN_PLAYBACK_RATE,\n            );\n            const playbackRateButtonText = container.querySelector(\n                `.jw-controlbar .${CN_PLAYBACK_RATE} text`,\n            );\n            playbackRateButtonText.textContent = jwPlayer\n                .getPlaybackRate()\n                .toFixed(1);\n\n            playbackRateButton = container.querySelector(\n                `.jw-controlbar .${CN_PLAYBACK_RATE}`,\n            );\n            playbackRateButton.setAttribute(\n                'aria-label',\n                `${translate.playbackSpeed} ${playbackRateButtonText.textContent}`,\n            );\n        }\n\n        const displayStyle = isAudio ? null : 'none';\n        displayControl.setAttribute(\n            'aria-label',\n            isAudio ? translate.listen : translate.playback,\n        );\n        forwardButton.style.display = displayStyle;\n        durationInfo.style.display = displayStyle;\n        playbackRateButton.style.display = displayStyle;\n        durationInfo.innerText = isAudio ? timeToText(duration, translate) : '';\n    });\n}\n","import config from 'player/config';\nimport { scriptLoader } from 'utils/script-loader';\n\nlet request = null;\n\nexport const youboraSdk = {\n    state: 'UNLOADED',\n    options: {},\n    forceLoad: false,\n\n    load(options = {}, forceLoad = false) {\n        this.options = options;\n        this.forceLoad = forceLoad;\n        if (request === null) {\n            this.state = 'LOADING';\n\n            request = scriptLoader(config.cdn.youbora);\n            request.then((youbora = window.youbora) => {\n                this.state = 'READY';\n                window.youbora = youbora;\n            });\n        }\n\n        return request;\n    },\n\n    /**\n     * @param {jwplayer.JWPlayer} player\n     * @param {*} options\n     */\n    initialize(player, options = {}) {\n        // skip when library is not loaded\n        if (this.state !== 'READY' || this.state === 'LOADED') {\n            return;\n        }\n\n        const { youbora } = window;\n\n        // skip if youbora sdk does not exist\n        if (!youbora) {\n            return;\n        }\n\n        try {\n            const plugin = new youbora.Plugin({\n                ...options,\n                ...this.options,\n            });\n\n            plugin.setAdapter(new youbora.adapters.JWPlayer(player));\n\n            this.state = 'LOADED';\n        } catch (e) {\n            // eslint-disable-next-line no-console\n            console.error('Could not load youbora plugin', e);\n        }\n    },\n};\n","import utils from 'utils/utils';\nimport Model from 'utils/model';\nimport image from 'utils/image';\nimport { objectToString } from 'utils/string';\nimport ServerTime from 'utils/server-time';\n\nimport config from 'player/config';\nimport Domain from 'player/model/domain';\nimport Token from 'player/model/token';\nimport Asset from 'player/model/asset';\nimport Stream from 'player/model/stream';\n\nimport locale from 'player/model/locale';\n\nimport appnexus from './ads/appnexus';\nimport addPlaylistFactory from './config/playlist';\nimport { addSharing } from './config/sharing';\nimport setPlaybackOptions from './config/playback';\nimport addYoubora from './config/jw-youbora';\nimport setKey from './config/keys';\nimport setCaptions from './config/captions';\nimport { chromecastApps, fallbackChromecastApp } from './config/chromecast';\nimport { applyTtsOption } from './skin/tts-skin';\nimport { shouldUseAudioSkin } from './skin/audioSkinResolver';\n\nimport * as STATUS_CODES from './config/status-codes';\nimport { youboraSdk } from './youbora';\n\n/**\n * @param {string} htmlError\n * @returns {string|undefined}\n * */\nfunction getAkamaiReferenceId(htmlError) {\n    return htmlError\n        ?.split('Reference&#32;&#35;')\n        ?.at(-1)\n        ?.split('\\n')\n        ?.at(0)\n        ?.replace(/&#46;/g, '.');\n}\n/**\n * Config instance for player\n * Contains SVP Player options\n * Parses config\n *\n * @constructor\n */\nconst Config = function () {\n    this.attributes = {\n        // DOM node\n        node: null,\n        // API vendor\n        vendor: null,\n        // player environment\n        env: 'production',\n        // stream object (extracted from asset)\n        stream: null,\n        // if not provided width will be read from node element\n        width: '100%',\n        // if not provided height will be read from node element\n        height: '100%',\n        // start playing from chapter time\n        chapter: null,\n        // start stream automatically on capable devices (does not work on iPhone and iPad, Android)\n        autoplay: false,\n        // player poster (image), mixed string (http src)|true|false\n        poster: true,\n        // display title on poster or change to provided string (default false)\n        title: null,\n        // play ahead time, format XXhYYmZZs, for example: 02h09m10s\n        time: null,\n        // repeat mode\n        repeat: false,\n        // minimum dvr window\n        minDvrWindow: null,\n        // url to css file with skin\n        skin: config.skins.default,\n        // right click defualt text and link\n        about: {\n            text: 'Stream',\n            link: '',\n        },\n        /**\n         * Token function for secured streams\n         * @type {Token|null}\n         */\n        token: null,\n        // disable default countdown plugin\n        disableCountdownPlugin: false,\n    };\n\n    /**\n     * JW Player Config\n     */\n    this.jwDefaults = {\n        base: config.cdn.player,\n        key: config.player.keys.default,\n        preload: 'auto',\n        horizontalVolumeSlider: true,\n        doNotSaveCookies: true,\n    };\n\n    this.token = null;\n};\n\nConfig.prototype = {\n    /**\n     * Calculates bitrate value based on given limit\n     *\n     * maxBitrate is increased by 15% due to VBR encoding\n     * @returns {number}\n     */\n    getMaxBitrate() {\n        return this.get('maxBitrate') * 1.15;\n    },\n\n    /**\n     * @param {Stream} stream\n     */\n    setStream(stream) {\n        this.stream = stream;\n\n        this.token = new Token(\n            stream.getId(),\n            stream.get('access'),\n            this.getMaxBitrate(),\n        );\n    },\n\n    /**\n     * Get config passed to SVP Player constructor\n     * @returns {*|{}}\n     */\n    getRaw() {\n        return { ...this.rawOptions } || {};\n    },\n\n    /**\n     * @returns {boolean}\n     */\n    isPreviewMode() {\n        const settings = this.getSettings();\n        return settings.preview || false;\n    },\n\n    /**\n     * Dump Javascript config to a string\n     * @returns {string}\n     */\n    dump() {\n        return objectToString(this.getRaw());\n    },\n\n    /**\n     * TODO add tests\n     *\n     * @param {Stream} stream\n     * @param {HTMLElement} playerContainer\n     * @returns {string|null}\n     */\n    getPoster(stream, playerContainer) {\n        // disable poster in TTS mode\n        if (this.shouldApplyTextToSpeechSkin(stream)) {\n            return null;\n        }\n\n        const container =\n            playerContainer || document.getElementById(this.get('node'));\n\n        const width = this.get('width');\n        const height = this.get('height');\n\n        if (utils.isString(this.get('poster'))) {\n            return this.get('poster');\n        }\n\n        if (container && stream) {\n            return image.getImageSrc(\n                stream.getPoster(),\n                'poster',\n                // use width and height if it's set as a number\n                utils.isNumber(width) ? width : container.clientWidth,\n                utils.isNumber(height) ? height : container.clientHeight,\n            );\n        }\n\n        return null;\n    },\n\n    /**\n     * @param {Stream} [stream]\n     * @returns {boolean}\n     */\n    shouldApplyTextToSpeechSkin(stream) {\n        const ttsSkinOption = this.get('ttsSkin');\n        if (typeof ttsSkinOption === 'boolean') {\n            return ttsSkinOption;\n        }\n\n        const currentStream = stream || this.stream;\n        return Boolean(currentStream) && currentStream.hasTextSpeech();\n    },\n\n    /**\n     * @returns {string|undefined}\n     */\n    getVideoPreviewMetadataKey() {\n        const { videoPreview } = this.getRaw();\n        const isCustomMetadataKey = typeof videoPreview === 'string';\n\n        const allPreviewsKeys = Object.keys(this.stream.getAllPreviewsUrls());\n\n        if (!(videoPreview === true || isCustomMetadataKey)) {\n            return undefined;\n        }\n\n        if (isCustomMetadataKey) {\n            return videoPreview;\n        }\n\n        if (\n            this.stream.isLive() &&\n            allPreviewsKeys.includes(config.liveVideoPreview)\n        ) {\n            return config.liveVideoPreview;\n        }\n\n        return (\n            config.videoPreview[this.get('vendor')] ||\n            config.videoPreview.default\n        );\n    },\n\n    /**\n     * @param {Stream} stream\n     * @param {HTMLElement} [playerContainer]\n     * @returns {HTMLElement|undefined}\n     */\n    getVideoPreviewUrl(stream, playerContainer) {\n        const container =\n            playerContainer || document.getElementById(this.get('node'));\n        if (!container || !stream || stream.isAudio()) {\n            return undefined;\n        }\n\n        const metadataKey = this.getVideoPreviewMetadataKey(stream);\n\n        return metadataKey ? stream.getVideoPreviewUrl(metadataKey) : undefined;\n    },\n\n    /**\n     * @param {Stream} stream\n     * @returns {string}\n     */\n    getTitle(stream) {\n        const title = this.get('title');\n        const isAudioWithoutCustomTitle =\n            stream.isAudio() && !utils.isString(title);\n\n        if (title === true || isAudioWithoutCustomTitle) {\n            return stream.get('title');\n        }\n\n        return title;\n    },\n\n    /**\n     * @param {Stream} stream\n     * @returns {string|undefined}\n     */\n    getDescription(stream) {\n        if (stream.isAudio()) {\n            return stream.getCategory().getTitle();\n        }\n\n        return undefined;\n    },\n\n    /**\n     * @param {Stream} stream\n     * @returns {number|undefined}\n     */\n    getLiveSyncDuration(stream) {\n        const chunkDuration = stream.getChunkDuration();\n        if (chunkDuration) {\n            // https://github.com/video-dev/hls.js/blob/master/docs/API.md#livesyncduration\n            return chunkDuration * 2 + 1;\n        }\n        return undefined;\n    },\n\n    /**\n     * Retrieve token required for secure streams\n     * Token expiry has to match API\n     *\n     * @returns {Promise<string|null>}\n     */\n    getToken() {\n        if (this.stream.isSecure()) {\n            return this.token.fetch(\n                this.get('token'),\n                this.stream.hasAccess(),\n                this.stream.getVendor(),\n            );\n        }\n\n        return Promise.resolve(null);\n    },\n\n    /**\n     * Token is required only for secure streams so for all other types it's valid\n     *\n     * @returns {boolean}\n     */\n    hasValidToken() {\n        return !this.stream.isSecure() || this.token.isValid();\n    },\n\n    getStreamUrl(type) {\n        // stream not set yet\n        if (!this.stream) {\n            // eslint-disable-next-line no-console\n            console.error('SVP SDK: getStreamUrl() called before stream set');\n            return null;\n        }\n\n        return this.getToken().then((token) => {\n            const streamUrl = this.stream.getUrl(type);\n            const maxBitrate = this.getMaxBitrate();\n            const params = [];\n\n            if (type === 'hls' && token) {\n                params.push(`hdnea=${encodeURIComponent(token)}`);\n            }\n\n            if (maxBitrate) {\n                params.push(`b=0-${maxBitrate}`);\n            }\n\n            return (\n                streamUrl + (params.length > 0 ? `?${params.join('&')}` : '')\n            );\n        });\n    },\n\n    /**\n     * Check if user is eligible to play stream in his geolocation\n     *\n     * @returns {Promise}\n     */\n    isStreamPlayable() {\n        const { stream } = this;\n        const settings = this.getSettings();\n\n        return new Promise((resolve, reject) => {\n            if (settings.preview === true) {\n                resolve(STATUS_CODES.ACTIVE_PREVIEW);\n            } else if (!ServerTime.fetched) {\n                reject({ code: STATUS_CODES.NETWORK_ERROR });\n            } else if (stream.isActive()) {\n                if (stream.isGeoblocked() && !stream.isFuture()) {\n                    this.getStreamUrl('hls')\n                        .then(async (streamUrl) => {\n                            const response = await fetch(streamUrl);\n\n                            if (response.ok) return resolve();\n\n                            const htmlError = await response.text?.();\n                            const referenceId = getAkamaiReferenceId(htmlError);\n\n                            if (response.status === 403) {\n                                return reject({\n                                    code: STATUS_CODES.NOT_ACTIVE_GEOBLOCKED,\n                                    referenceId,\n                                });\n                            }\n                            if (response.status === 401) {\n                                return reject({\n                                    code: STATUS_CODES.NOT_ACTIVE_TOKEN,\n                                    referenceId,\n                                });\n                            }\n                            if (response.status === 404) {\n                                return reject({\n                                    code: STATUS_CODES.NOT_FOUND,\n                                    referenceId,\n                                });\n                            }\n                            return reject({\n                                code: STATUS_CODES.NETWORK_ERROR,\n                                referenceId,\n                            });\n                        })\n                        .catch(() => {\n                            reject({ code: STATUS_CODES.NETWORK_ERROR });\n                        });\n                } else {\n                    resolve(STATUS_CODES.ACTIVE);\n                }\n            } else if (stream.isPast()) {\n                reject({ code: STATUS_CODES.NOT_ACTIVE_PAST });\n            } else {\n                reject({ code: STATUS_CODES.NOT_ACTIVE });\n            }\n        });\n    },\n\n    /**\n     * @param {Stream} stream\n     * @returns {Stream[]}\n     */\n    getPlaylistItems(stream) {\n        if (!stream) {\n            return [];\n        }\n        const vendor = this.get('vendor');\n        const playlistStreams = stream\n            .get('playlist')\n            .map((data) => {\n                const asset = new Asset(data);\n                asset.set('vendor', vendor);\n                return asset;\n            })\n            .map((asset) => new Stream(asset.attributes));\n        return [stream].concat(playlistStreams);\n    },\n\n    getChromecastAppId() {\n        const vendorEntry = Object.entries(chromecastApps).find((entry) =>\n            entry[1].includes(this.stream.getVendor()),\n        );\n        return (vendorEntry && vendorEntry[0]) || fallbackChromecastApp;\n    },\n\n    getJwConfig(stream) {\n        const settings = this.getSettings();\n\n        return (\n            Promise.resolve({\n                width: this.get('width'),\n                height: this.get('height'),\n                abouttext: this.get('about').text,\n                aboutlink: this.get('about').link,\n                floating: this.get('floating'),\n                sharing: utils.extend({}, config.sharing.global),\n                localization: locale.translate('player', true),\n                plugins: {},\n                cast: {\n                    customAppId: this.getChromecastAppId(),\n                },\n                playlist: [],\n                ...(this.getLiveSyncDuration(stream)\n                    ? { liveSyncDuration: this.getLiveSyncDuration(stream) }\n                    : {}),\n            })\n                .then((jwConfig) => {\n                    const playlistItems = this.getPlaylistItems(stream);\n                    const addPlaylistItemsPromise = playlistItems.reduce(\n                        (promise, currentStream) => {\n                            const streamUrlPromise = promise.then(() => {\n                                // change to the current stream object to prepare a valid stream url\n                                this.setStream(currentStream);\n                                return this.getStreamUrl('hls');\n                            });\n\n                            return streamUrlPromise.then((streamUrl) => {\n                                const playlistSettings =\n                                    this.getPlaylistSettings();\n                                const playlistOptions = {\n                                    poster: this.getPoster(currentStream),\n                                    preview:\n                                        this.getVideoPreviewUrl(currentStream),\n                                    title: this.getTitle(currentStream),\n                                    description:\n                                        this.getDescription(currentStream),\n                                    locale: locale,\n                                    minDvrWindow: this.get('minDvrWindow'),\n                                };\n\n                                const applyPlaylistAdding = addPlaylistFactory(\n                                    streamUrl,\n                                    currentStream,\n                                    playlistOptions,\n                                    playlistSettings,\n                                    {\n                                        forceImaClientLoading: this.get(\n                                            'forceImaClientLoading',\n                                        ),\n                                        shouldUseAudioSkin:\n                                            shouldUseAudioSkin(this),\n                                    },\n                                );\n\n                                return applyPlaylistAdding(jwConfig);\n                            });\n                        },\n                        Promise.resolve(),\n                    );\n\n                    return addPlaylistItemsPromise.then(() => {\n                        // revert to the origin stream object\n                        this.setStream(stream);\n                        return jwConfig;\n                    });\n                })\n                .then(\n                    addSharing({\n                        options: this.get('sharing'),\n                        stream,\n                    }),\n                )\n                .then((jwConfig) => applyTtsOption(jwConfig, stream, this))\n                .then(setCaptions(this.get('captions')))\n                // setPlaybackOptions has to be invoked in the closure to inject the current values of mute, skin, etc.\n                // otherwise it will get values when getJwConfig was called\n                .then((jwConfig) =>\n                    setPlaybackOptions(stream, {\n                        mute: this.get('mute'),\n                        skin: this.get('skin'),\n                        autoplay: this.get('autoplay'),\n                        autopause: this.get('autopause'),\n                        repeat: this.get('repeat'),\n                    })(jwConfig),\n                )\n                .then(addYoubora(stream, youboraSdk.state === 'READY'))\n                .then(setKey(this.get('vendor')))\n                .then((jwConfig) =>\n                    utils.merge(\n                        utils.extend({}, this.jwDefaults, jwConfig),\n                        settings.jw || {},\n                    ),\n                )\n        );\n    },\n\n    /**\n     * Check if recommended is available\n     */\n    hasRecommended() {\n        // recommended truned on and repeat truned off\n        return (\n            this.get('recommended') !== false && this.get('repeat') === false\n        );\n    },\n\n    getRecommended() {\n        return this.get('recommended');\n    },\n\n    getAgeLimit() {\n        return this.get('ageLimit');\n    },\n\n    hasNext() {\n        if (!this.hasRecommended()) {\n            return false;\n        }\n\n        if (\n            this.getRecommended() &&\n            (this.getRecommended().next === false ||\n                typeof this.getRecommended().next === 'undefined')\n        ) {\n            return false;\n        }\n\n        return true;\n    },\n\n    getPlaylistSettings() {\n        return utils.extend(\n            {\n                adn: this.get('adn'),\n                hasNext: this.hasNext(),\n            },\n            this.getSettings(),\n        );\n    },\n\n    getLiveMidrollTag(time) {\n        return appnexus.getLiveMidrollTag(\n            time,\n            this.stream,\n            this.getPlaylistSettings(),\n        );\n    },\n\n    parse(options) {\n        const asset = options.asset || options.id;\n        const about = config.about[options.vendor];\n        const skin = utils.extend(\n            {},\n            config.skins[options.vendor] || config.skins.default,\n        );\n\n        // set default skin for player if nothing is provided\n        if (typeof options.skin === 'object') {\n            if (options.skin.name) {\n                skin.name += ` ${options.skin.name}`;\n            }\n\n            if (options.skin.url) {\n                skin.url = options.skin.url;\n            }\n        } else {\n            // remove if not valid\n            delete options.skin;\n        }\n\n        options.skin = skin;\n\n        // override about link/text\n        if (!options.about && about) {\n            options.about = about;\n        }\n\n        options.floating = {\n            dismissible: options.floating?.dismissible ?? true,\n            mode: options.floating?.mode ?? 'never',\n        };\n\n        // delete asset\n        if (asset) {\n            delete options.asset;\n        }\n\n        // check if user passed chapter or time\n        if (utils.isString(options.chapter) && options.chapter.match(/^\\d+$/)) {\n            options.chapter = parseInt(options.chapter, 10);\n        }\n\n        // legacy support\n        if (options.time) {\n            options.time = utils.time.shareTimeToSeconds(options.time);\n        }\n\n        if (options.settings) {\n            delete options.settings;\n        }\n\n        return options;\n    },\n};\n\nObject.defineProperty(Config.prototype, 'initialize', {\n    value(options) {\n        const { vendor } = options;\n        const rawOptions = utils.extend({}, options);\n\n        this.rawOptions = rawOptions;\n\n        Domain.getPermissions(vendor).then((permissions) => {\n            const settings = {};\n\n            if (permissions.whitelist === true && options.settings) {\n                utils.extend(settings, options.settings);\n            } else if (\n                permissions.whitelist === false &&\n                options.settings &&\n                options.settings.jw\n            ) {\n                settings.jw = {};\n                utils.extend(settings.jw, options.settings.jw);\n            }\n\n            if (permissions.preview === false) {\n                delete settings.preview;\n            }\n\n            // turn off ads for certain provider\n            if (config.ads[vendor] === false) {\n                settings.na = true;\n            }\n\n            Object.defineProperty(this, 'settings', {\n                value: Object.freeze(settings),\n                writable: false,\n            });\n\n            utils.extend(this.attributes, this.parse(options));\n            this.trigger('ready', rawOptions, settings);\n        });\n    },\n    writable: false,\n});\n\n// Immutable method for restricted settings like preview or na\nObject.defineProperty(Config.prototype, 'getSettings', {\n    value() {\n        return this.settings;\n    },\n    writable: false,\n});\n\nutils.extend(Config.prototype, Model);\n\nexport default Config;\n","import utils from 'utils/utils';\nimport appnexus from 'player/playback/ads/appnexus';\n\n/**\n * @param {string} streamUrl\n * @param {Stream} stream\n * @param {*} options\n * @param {*} settings\n * @returns {(config: Config) => Config}\n * @template Config\n */\nfunction getPlaylist(\n    streamUrl,\n    stream,\n    options,\n    settings,\n    { forceImaClientLoading, shouldUseAudioSkin } = {\n        forceImaClientLoading: false,\n        shouldUseAudioSkin: false,\n    },\n) {\n    const { locale, poster, title, description, minDvrWindow } = options;\n\n    /**\n     * @param {PlaylistItem} playlistItem\n     * @returns {PlaylistItem}\n     */\n    function addPlaylistMetadata(playlistItem) {\n        const mediaId = stream.getExternalId();\n        const startTime = stream.getPlaybackTime('begin');\n\n        // set media id only if it exists\n        if (mediaId) {\n            playlistItem.mediaid = mediaId;\n        }\n\n        // add title\n        if (title) {\n            playlistItem.title = title;\n        }\n\n        if (description) {\n            playlistItem.description = description;\n        }\n\n        // seek stream if play ahead time is set\n        if (startTime) {\n            playlistItem.starttime = startTime;\n        }\n\n        if (minDvrWindow) {\n            playlistItem.minDvrWindow = minDvrWindow;\n        }\n        return playlistItem;\n    }\n\n    /**\n     * @param {PlaylistItem} playlistItem\n     * @returns {PlaylistItem}\n     */\n    function addSnapshots(playlistItem) {\n        if (stream.hasSnapshots()) {\n            // add snapshots for each stream\n            playlistItem.tracks.push({\n                file: stream.getSnapshots(),\n                kind: 'thumbnails',\n            });\n        }\n\n        return playlistItem;\n    }\n\n    /**\n     * @param {PlaylistItem} playlistItem\n     * @returns {PlaylistItem}\n     */\n    function addCaptions(playlistItem) {\n        if (stream.getCaptions().length > 0 && !stream.hasSubtitlesInHls()) {\n            utils.each(stream.getCaptions(), function (caption) {\n                playlistItem.tracks.push({\n                    file: caption.url,\n                    label: locale.translate(caption.language),\n                    kind: 'captions',\n                    default: caption.default === true,\n                });\n            });\n        }\n\n        return playlistItem;\n    }\n\n    /**\n     * @param {*} adConfig\n     * @param {PlaylistItem} playlistItem\n     * @returns {PlaylistItem & { adPlacements?: *, adschedule?: * }}\n     */\n    function addAppnexusAds(adConfig, playlistItem) {\n        const { adSchedule, adPlacements } = adConfig || {};\n\n        // check if there are ads\n        if (adSchedule && Object.keys(adSchedule).length > 0) {\n            utils.extend(playlistItem, {\n                adschedule: adSchedule,\n            });\n        }\n\n        // check if there are ads\n        if (adPlacements) {\n            playlistItem.adPlacements = adPlacements;\n        }\n\n        return playlistItem;\n    }\n\n    return function (config) {\n        const type = stream.isAudio() && stream.hasMp4Streams() ? 'mp4' : 'hls';\n\n        return Promise.resolve({\n            id: stream.getId(),\n            image: stream.isAudio() && shouldUseAudioSkin ? undefined : poster,\n            sources: [\n                {\n                    file: type === 'mp4' ? stream.getUrl(type) : streamUrl,\n                    // force stream type for mock stream which contains mp4 blob\n                    type: stream.isMock() ? 'video/mp4' : type,\n                    default: true,\n                    preload: type === 'mp4' ? 'none' : 'auto',\n                },\n            ],\n            mediaType: stream.get('mediaType'),\n            tracks: [],\n        })\n            .then(addPlaylistMetadata)\n            .then(addCaptions)\n            .then(addSnapshots)\n            .then(async function (playlistItem) {\n                if (\n                    (stream.isAudio() || settings.vmap) &&\n                    !stream.hasAdsDisabled() &&\n                    !settings.na\n                ) {\n                    config.advertising = utils.extend(\n                        {\n                            client: 'vast',\n                        },\n                        locale.translate('ads', true),\n                    );\n\n                    const vmapParams =\n                        settings.vmap instanceof Function\n                            ? await settings.vmap()\n                            : {};\n\n                    return utils.extend(playlistItem, {\n                        adschedule: stream.getVmapApiUrl(vmapParams),\n                    });\n                }\n\n                return appnexus\n                    .getConfig(stream, settings)\n                    .then(function (adConfig) {\n                        const adOptions = adConfig.adOptions || {};\n\n                        const shouldEnableIma =\n                            adConfig.adSchedule &&\n                            Object.keys(adConfig.adSchedule || {}).some(\n                                (schedule) => schedule.endsWith('prebid'),\n                            );\n\n                        config.advertising = utils.extend(\n                            {\n                                client:\n                                    shouldEnableIma || forceImaClientLoading\n                                        ? 'googima'\n                                        : 'vast',\n                                maxRedirects: 7,\n                                locale:\n                                    locale.getTranslations().id === 'se'\n                                        ? 'sv'\n                                        : locale.getTranslations().id,\n                            },\n                            locale.translate('ads', true),\n                        );\n\n                        if (typeof adOptions.autoplayMuted !== 'undefined') {\n                            config.advertising.autoplayadsmuted =\n                                adOptions.autoplayMuted;\n                        }\n\n                        if (adOptions.vpaidcontrols === true) {\n                            config.advertising.vpaidcontrols = true;\n                        }\n\n                        if (adOptions.preloadAds === true) {\n                            config.advertising.preloadAds = true;\n                        }\n\n                        // do not add any ads to playlist when it is in preload mode\n                        if (\n                            stream.isMock() &&\n                            stream.getVendor() !== 'appnexus'\n                        ) {\n                            return playlistItem;\n                        }\n\n                        return addAppnexusAds(adConfig, playlistItem);\n                    });\n            })\n            .then(function (playlistItem) {\n                if (!config.playlist) {\n                    config.playlist = [];\n                }\n                config.playlist.push(playlistItem);\n\n                playlistItem.svp = {\n                    stream: stream,\n                    settings: settings,\n                };\n\n                return config;\n            });\n    };\n}\n\nexport default getPlaylist;\n","export default function (options = {}) {\n    // additional config options required for playback\n    return function (jwConfig) {\n        if (options.native === true) {\n            jwConfig.renderCaptionsNatively = true;\n            delete options.native;\n        }\n\n        if (Object.keys(options).length > 0) {\n            jwConfig.captions = options;\n        }\n\n        return jwConfig;\n    };\n}\n","/**\n * Check if preroll is scheduled in configuration\n *\n * @param {*} config\n * @returns {boolean}\n */\nconst hasPreroll = (config) => {\n    const playlistItem = config && config.playlist[0];\n\n    // check if preroll exists in array\n    if (playlistItem.adschedule) {\n        return Object.values(playlistItem.adschedule).some(\n            (slot) => slot.offset === 'pre',\n        );\n    }\n\n    return false;\n};\n\n/**\n * @param {Stream} stream\n * @param {*} options\n */\nexport default function (stream, options) {\n    // additional config options required for playback\n    return function (config) {\n        let canAutostart = options.autoplay;\n\n        // stream is not available yet, display countdown\n        if (!stream.hasPlayableSource()) {\n            // disable autoplay if stream is not available\n            config.preload = 'none';\n            config.autostart = false;\n        }\n\n        // force sound mute when configuration is set\n        if (options.mute === true) {\n            config.mute = true;\n        }\n\n        // load skin if available\n        if (options.skin) {\n            config.skin = options.skin;\n        }\n\n        // fix jw bug\n        // by default you can't play muted ads\n        if (\n            hasPreroll(config) &&\n            config.advertising.autoplayadsmuted !== true\n        ) {\n            try {\n                if (\n                    config.mute === true ||\n                    localStorage.getItem('jwplayer.mute') === 'true'\n                ) {\n                    // unmute player when autostart is not available\n                    config.mute = false;\n                }\n            } catch (error) {\n                // for private browsing\n            }\n        }\n\n        // disable autostart for future streams\n        if (stream.isFuture()) {\n            canAutostart = false;\n        }\n\n        if (typeof canAutostart !== 'undefined') {\n            config.autostart = canAutostart;\n        }\n\n        // set autopause to viewable\n        if (options.autopause === 'viewable') {\n            config.autoPause = {\n                viewability: true,\n                pauseAds: true,\n            };\n        }\n\n        // set repeat mode\n        if (options.repeat === true) {\n            config.repeat = options.repeat;\n        }\n\n        return config;\n    };\n}\n","import { checkIsPrebidEnabled } from 'utils/prebid';\n\n/**\n * @param {Stream} stream\n * @param {boolean} isEnabled\n * @returns {(config: Config) => Config}\n * @template Config\n */\nexport default function (stream, isEnabled) {\n    // additional config options required for playback\n    return function (config) {\n        // allow only when account config is available\n        if (isEnabled) {\n            if (config.playlist && config.playlist[0]) {\n                const streamConfiguration =\n                    stream.get('streamConfiguration') &&\n                    stream.get('streamConfiguration').properties;\n\n                const category = stream.getCategory();\n\n                const isPrebidEnabled = checkIsPrebidEnabled(config.playlist);\n\n                config.playlist[0].youbora = {\n                    'content.resource': stream.getUrl('hls'),\n                    'content.isLive': stream.isLive(),\n                    'content.title': stream.get('title'),\n                    'content.duration': stream.getDuration(),\n                    'content.cdn': 'AKAMAI',\n                    'content.metadata': {\n                        content_id: stream.getId(),\n                        owner: stream.getVendor(),\n                    },\n\n                    'extraparam.1': stream.getId(),\n                    'extraparam.2': stream.getVendor(),\n                    'extraparam.3': streamConfiguration.join(','),\n                    'extraparam.4': category && category.getId(),\n                    'extraparam.5': isPrebidEnabled,\n                };\n            }\n        }\n\n        return config;\n    };\n}\n","export const checkIsPrebidEnabled = (playlist) =>\n    playlist[0] &&\n    Object.keys(playlist[0].adschedule || {}).some((key) =>\n        key.endsWith('prebid'),\n    );\n","import config from 'player/config';\n\n/**\n * @param {string} vendor\n * @returns {(config: JWConfig) => JWConfig}\n * @template JWConfig\n */\nexport default function (vendor) {\n    // additional config options required for playback\n    return function (jwConfig) {\n        const { keys } = config.player;\n\n        jwConfig.key = keys[vendor] || keys.default;\n\n        return jwConfig;\n    };\n}\n","import type { Asset } from '@schibsted-svp/svp-api-types';\nimport { assetAdditionalData, relatedApi } from '../api';\n\nexport async function getRelatedAssets({\n    vendor,\n    assetId,\n    limit,\n}: {\n    vendor: string;\n    assetId: number;\n    limit?: number;\n}): Promise<Asset[]> {\n    const query = [\n        `additional=${assetAdditionalData}`,\n        `ignoreAspectRatio=true`,\n    ];\n    if (limit) {\n        query.push(`limit=${limit}`);\n    }\n\n    return relatedApi({ path: `${vendor}/${assetId}`, query: query.join('&') });\n}\n","import type { Asset } from '@schibsted-svp/svp-api-types';\nimport { getRelatedAssets } from 'player/services/api/related';\nimport { getById } from 'player/services/api/asset';\nimport Stream from './stream';\nimport AssetModel from './asset';\n\ntype Source = 'byId' | 'related';\n\nconst createResponse = ({\n    nextAsset,\n    source,\n}: {\n    nextAsset?: Asset;\n    source: Source;\n}): {\n    nextAsset: AssetModel | null;\n    source: Source;\n} => ({\n    nextAsset: nextAsset ? new AssetModel(nextAsset) : null,\n    source,\n});\n\nconst handlers = {\n    /**\n     * Check if given asset has next stream\n     * Used for setting/disabling postrolls\n     */\n    hasPlayNext(asset: AssetModel): boolean {\n        if (asset.getStreamType() === 'live') {\n            return false;\n        }\n\n        if (asset.getNextAssetId()) {\n            return true;\n        }\n\n        return false;\n    },\n\n    async fetchNextById({\n        vendor,\n        assetId,\n    }: {\n        vendor: string;\n        assetId: number;\n    }): Promise<{\n        nextAsset: AssetModel | null;\n        source: Source;\n    }> {\n        const nextAsset = await getById({\n            vendor,\n            assetId,\n        });\n\n        return createResponse({\n            source: 'byId',\n            nextAsset,\n        });\n    },\n\n    async fetchNextFromRelatedEngine({\n        vendor,\n        assetId,\n    }: {\n        vendor: string;\n        assetId: number;\n    }): Promise<{\n        nextAsset: AssetModel | null;\n        source: Source;\n    }> {\n        const assets = await getRelatedAssets({\n            vendor,\n            assetId,\n            limit: 1,\n        });\n\n        return createResponse({\n            nextAsset:\n                Array.isArray(assets) && assets.length > 0\n                    ? assets[0]\n                    : undefined,\n            source: 'related',\n        });\n    },\n\n    /**\n     * Fetch next for given asset\n     * Cascade  lookup from direct linkage (nextAsset.id) to retrieving from category\n     */\n    async getNext(asset: AssetModel): Promise<{\n        nextAsset: AssetModel | null;\n        source: Source;\n    }> {\n        const vendor = asset.getVendor();\n        const assetId = asset.getId();\n\n        return this.fetchNextFromRelatedEngine({\n            vendor,\n            assetId,\n        });\n    },\n\n    /**\n     * Fetch next for given asset\n     * Cascade  lookup from direct linkage (nextAsset.id) to retrieving from category\n     * Rejected when nextAsset is not found\n     */\n    async fetchNext(asset: AssetModel): Promise<{\n        nextAsset: AssetModel | null;\n        source: Source;\n    }> {\n        const { nextAsset, source } = await this.getNext(asset);\n\n        if (!nextAsset) {\n            return Promise.reject({\n                reason: 'nextAssetNotFound',\n                source,\n            });\n        }\n\n        const stream = new Stream(nextAsset.attributes);\n\n        if (!stream.isActive()) {\n            return Promise.reject({\n                reason: 'nextAssetNotActive',\n                source,\n            });\n        }\n\n        return {\n            nextAsset,\n            source,\n        };\n    },\n};\n\nexport default handlers;\n","import nextAsset from './next-asset';\nimport { fetchFromRelated } from './recommended/list';\n\nclass Recommended {\n    /**\n     * @param {Asset} asset\n     */\n    constructor({ asset }) {\n        /**\n         * @type {Asset}\n         */\n        this.asset = asset;\n    }\n\n    /**\n     * Fetch next asset\n     *\n     * @returns {Promise}\n     */\n    getNextAsset(options = {}) {\n        const { asset } = this;\n\n        // next asset can be provided in player configuration\n        if (options.asset) {\n            return nextAsset.fetchNextById({\n                // set vendor is specified or use main asset as default\n                vendor: options.asset.vendor || asset.getVendor(),\n                // asset can be object or number with asset id\n                assetId: options.asset.id || options.asset,\n            });\n        }\n\n        return nextAsset.fetchNext(asset);\n    }\n\n    /**\n     * Fetch recommended asset list\n     *\n     * @returns {*}\n     */\n    async getItems() {\n        const vendor = this.asset.getVendor();\n        const assetId = this.asset.getId();\n\n        return fetchFromRelated({\n            vendor,\n            assetId,\n        });\n    }\n}\n\nexport default Recommended;\n","import type { Asset } from '@schibsted-svp/svp-api-types';\nimport { getRelatedAssets } from 'player/services/api/related';\nimport AssetModel from '../asset';\n\nconst mapResponse = (vendor: string, assets: Asset[]): AssetModel[] =>\n    assets.map(\n        (asset) =>\n            new AssetModel({\n                vendor,\n                ...asset,\n            }),\n    );\n\nexport async function fetchFromRelated({\n    vendor,\n    assetId,\n}: {\n    vendor: string;\n    assetId: number;\n}): Promise<AssetModel[]> {\n    const assets = await getRelatedAssets({ vendor, assetId });\n    return mapResponse(vendor, assets);\n}\n","import { scriptLoader } from 'utils/script-loader';\n\nconst TRACKER_ID = 'svp-tracker';\n\nconst PulseTrackerLoader = {\n    request: null,\n\n    trackers: {},\n\n    /**\n     * Load pulse library only once per page\n     *\n     * @returns {null}\n     */\n    load() {\n        if (!this.request) {\n            if (!window.pulse) {\n                // a global pulse object has to be present to avoid autoloader errors\n                window.pulse =\n                    window.pulse ||\n                    function () {\n                        window.pulse.q = window.pulse.q || [];\n                        window.pulse.q.push(arguments);\n                    };\n\n                this.request = scriptLoader(\n                    '//sdk.pulse.schibsted.com/versioned/3.2/pulse.min.js',\n                );\n            } else {\n                // pulse is already available\n                this.request = Promise.resolve();\n            }\n        }\n\n        return this.request;\n    },\n\n    init(provider, sdkConfig) {\n        return this.load()\n            .then(() => this.getTracker(provider))\n            .then((storedTracker) => {\n                const PROVIDER_TRACKER_ID = `${TRACKER_ID}-${provider}`;\n\n                // initialize pulse only once per page per provider\n                if (!storedTracker) {\n                    // we need to name the tracker to avoid tracking conflicts when embedding the player\n                    window.pulse(\n                        'init',\n                        provider,\n                        {\n                            altEventHandler: window.pulseEventHandler,\n                            useBeaconWhenAvailable: true,\n                            ...sdkConfig,\n                        },\n                        undefined,\n                        PROVIDER_TRACKER_ID,\n                    );\n\n                    const promise = new Promise((resolve) => {\n                        window.pulse(PROVIDER_TRACKER_ID, (tracker) =>\n                            resolve(tracker),\n                        );\n                    });\n\n                    PulseTrackerLoader.trackers[provider] = promise;\n\n                    return promise;\n                }\n\n                return storedTracker;\n            });\n    },\n\n    getTracker(provider) {\n        return PulseTrackerLoader.trackers[provider] || Promise.resolve(null);\n    },\n};\n\nexport default PulseTrackerLoader;\n","const PLAYER_CONTAINER_CLASS_NAME = 'svp-flag-video-preview';\nconst PREVIEW_CONTAINER_CLASS_NAME = 'jw-preview';\nconst PREVIEW_ELEMENT_CLASS_NAME = 'svp-video-preview';\n\n/**\n * @param {HTMLElement} container\n * @return {{previewContainer: HTMLDivElement, previewElement?: HTMLVideoElement}}\n */\nfunction queryVideoPreviewElements(container) {\n    const previewContainer = container.querySelector(\n        `.${PREVIEW_CONTAINER_CLASS_NAME}`,\n    );\n    const previewElement =\n        previewContainer.querySelector(`.${PREVIEW_ELEMENT_CLASS_NAME}`) ||\n        undefined;\n    return { previewContainer, previewElement };\n}\n\n/**\n * @this Player\n */\nfunction removeVideoPreviewElement() {\n    // in case when asset is not published and player is removed\n    if (!this.model || !this.model.player) {\n        return;\n    }\n    const container = this.getContainer();\n    container.classList.remove(PLAYER_CONTAINER_CLASS_NAME);\n\n    const { previewContainer, previewElement } =\n        queryVideoPreviewElements(container);\n    if (!previewElement) {\n        return;\n    }\n\n    previewContainer.removeChild(previewElement);\n}\n\n/**\n * @param {HTMLDivElement} previewContainer\n * @return {HTMLVideoElement}\n */\nfunction createPreviewElement(previewContainer) {\n    const previewElement = document.createElement('video');\n    previewElement.loop = true;\n    previewElement.autoplay = true;\n    previewElement.muted = true;\n    previewElement.classList.add(PREVIEW_ELEMENT_CLASS_NAME);\n    ['autoplay', 'disableremoteplayback', 'muted', 'playsinline'].forEach(\n        (attr) => {\n            previewElement.setAttribute(attr, '');\n        },\n    );\n    previewContainer.appendChild(previewElement);\n    return previewElement;\n}\n\n/**\n * @this Player\n */\nasync function addVideoPreviewElement() {\n    const stream = this.model.getStream();\n    const previewUrl = this.config.getVideoPreviewUrl(stream);\n    const autoplay = this.config.get('autoplay');\n    if (!previewUrl || autoplay) {\n        return removeVideoPreviewElement.call(this);\n    }\n\n    const container = this.getContainer();\n    container.classList.add(PLAYER_CONTAINER_CLASS_NAME);\n\n    const {\n        previewContainer,\n        previewElement = createPreviewElement(previewContainer),\n    } = queryVideoPreviewElements(container);\n\n    previewElement.src = previewUrl;\n    previewElement.load();\n    return previewElement.play();\n}\n\nexport default {\n    addVideoPreviewElement,\n    removeVideoPreviewElement,\n};\n","import logger from 'utils/logger';\nimport utils from 'utils/utils';\nimport config from 'player/config';\nimport errorIcon from 'icons/error.svg';\nimport videoPreviewHelper from 'utils/video-preview';\nimport locale from '../model/locale';\nimport statusCode, {\n    NOT_FOUND,\n    GENERAL_ERROR,\n    NOT_ACTIVE,\n} from '../playback/config/status-codes';\nimport { TTS_SKIN_CLASS_NAME } from '../playback/skin/tts-skin';\n\n/**\n * Clear error message\n */\nexport function clearError(node) {\n    const previousErrorNode = node.getElementsByClassName(\n        'svp-player-error-wrapper',\n    );\n\n    // clear old node\n    if (previousErrorNode.length > 0) {\n        utils.removeClass(node, [\n            'svp-player-error',\n            'svp-player-error-hasImage',\n        ]);\n\n        if (previousErrorNode[0].parentNode) {\n            previousErrorNode[0].parentNode.removeChild(previousErrorNode[0]);\n        }\n    }\n}\n\n/**\n * Display error message in given node\n */\nfunction displayError(node, message, code = null, referenceId = null) {\n    let template = `<div class=\"svp-player-message\"><span class=\"svp-player-error-icon\">${errorIcon}</span>${message}`;\n\n    if (code) {\n        template += `<div class=\"svp-player-error-code\">${locale.translate(\n            'Error code',\n        )}: ${code}${referenceId ? `, #${referenceId}` : ''}</div>`;\n    }\n\n    template += '</div>';\n\n    const posterSrc =\n        this.model &&\n        this.model.getStream() &&\n        this.model.getPoster(this.model.getStream(), node);\n\n    clearError(node);\n    utils.addClass(node, 'svp-player-error');\n\n    // add image\n    if (posterSrc) {\n        utils.addClass(node, 'svp-player-error-hasImage');\n        template += `<div class=\"svp-player-poster\" style=\"background-image: url(${posterSrc})\"></div>`;\n    }\n\n    const errorNode = utils.createNode(\n        `<div class=\"svp-player-error-wrapper\">${template}</div>`,\n    );\n\n    node.appendChild(errorNode);\n\n    this.once(\n        'complete',\n        function () {\n            utils.removeClass(node, [\n                'svp-player-error',\n                'svp-player-error-hasImage',\n            ]);\n\n            if (errorNode.parentNode) {\n                errorNode.parentNode.removeChild(errorNode);\n            }\n        },\n        this,\n    );\n}\n\n/**\n * Display error message\n */\nexport function onError(details) {\n    logger('SVP').error(details);\n    const node = document.getElementById(this.config.get('node'));\n    const { code, message, referenceId } = details || {};\n\n    if (this.model.config.shouldApplyTextToSpeechSkin()) {\n        node.classList.add(TTS_SKIN_CLASS_NAME);\n    }\n\n    let translatedMessage = locale.translate(message);\n\n    // translation not found\n    if (translatedMessage === message) {\n        translatedMessage = locale.translate(statusCode(GENERAL_ERROR));\n    }\n\n    // details - message in english\n    // message - localized, displayed message\n    const errorDetails = {\n        code,\n        details: message,\n        message: translatedMessage,\n        referenceId,\n    };\n\n    if (details.type) {\n        errorDetails.type = details.type;\n    }\n\n    displayError.call(this, node, translatedMessage, code, referenceId);\n\n    if (this.model.player) {\n        this.model.player.stop();\n    }\n\n    this.trigger('error', errorDetails);\n}\n\n/**\n * Asset fetch failed. Usually happens when network issue occurred\n */\nexport function onAssetError(error) {\n    let code = GENERAL_ERROR;\n\n    videoPreviewHelper.removeVideoPreviewElement.call(this);\n\n    if (error) {\n        if (error.status === 404) {\n            code = NOT_FOUND;\n        } else if (error.status === 401) {\n            code = NOT_ACTIVE;\n        }\n    }\n\n    const details = {\n        message: statusCode(code),\n        code,\n    };\n\n    this.trigger('assetError', details);\n\n    // load stylesheet as player is not attached\n    onError.call(this, {\n        type: 'assetFetchError',\n        ...details,\n    });\n\n    logger('SVP').error('error', error);\n\n    // display errors in development mode\n    if (config.env === 'development') {\n        throw error;\n    }\n}\n","/* global apntag */\nimport config from 'player/config';\nimport utils from 'utils/utils';\nimport { scriptLoader } from 'utils/script-loader';\nimport logger from 'utils/logger';\n\nexport default utils.extend(\n    {\n        /**\n         * @type {boolean|null}\n         */\n        isLoaded: null,\n\n        /**\n         * @returns {Promise<void>}\n         */\n        load() {\n            if (window.apntag) {\n                this.isLoaded = true;\n                return Promise.resolve();\n            }\n            if (this.isLoaded === false) {\n                // after loading fail we do not retry\n                return Promise.reject({\n                    firstLoad: false,\n                });\n            }\n\n            // load this only once\n            return scriptLoader(config.ads.appnexus.ast)\n                .then(() => {\n                    // check if object really exist\n                    this.isLoaded = typeof window.apntag === 'object';\n                })\n                .catch((error) => {\n                    // appnexus can be blocked by adblock\n                    this.isLoaded = false;\n\n                    return Promise.reject({\n                        firstLoad: true,\n                        error,\n                    });\n                });\n        },\n\n        /**\n         * @param {string} tagId\n         * @param {*} tagOptions\n         * @returns {Promise<void>}\n         */\n        defineTag(tagId, tagOptions) {\n            return this.load()\n                .then(() => {\n                    const tagConfig = {\n                        targetId: tagId,\n                        ...tagOptions,\n                    };\n\n                    apntag.debug = config.ads.appnexus.debug;\n                    // apntag tag overriden by reference\n                    apntag.defineTag(utils.extend({}, tagConfig));\n\n                    apntag.loadTags([tagId]);\n                    apntag.onEvent(\n                        'adLoaded',\n                        tagId,\n                        this.trigger.bind(this, 'adLoaded', tagId),\n                    );\n                })\n                .catch((error) => {\n                    if (error.firstLoad) {\n                        logger('SVP').log('Could not load AST tag');\n                    }\n                });\n        },\n\n        /**\n         * @param {string} tagId\n         */\n        showTag(tagId) {\n            if (this.isLoaded) {\n                apntag.showTag(tagId);\n            }\n        },\n\n        /**\n         * @param {string} tagId\n         */\n        refreshTag(tagId) {\n            if (this.isLoaded) {\n                apntag.refresh([tagId]);\n            }\n        },\n\n        /**\n         * @param {string} tagId\n         * @param {(string|number)[]} dimmensions\n         */\n        resizeTag(tagId, dimmensions) {\n            const size = [\n                parseInt(dimmensions[0], 10),\n                parseInt(dimmensions[1], 10),\n            ];\n\n            if (this.isLoaded) {\n                apntag.resizeAd(tagId, size);\n            }\n        },\n\n        /**\n         * @param {string} targetId\n         */\n        off(targetId) {\n            if (this.isLoaded) {\n                apntag.offEvent('adLoaded', targetId);\n            }\n        },\n    },\n    utils.Events,\n);\n","import BackboneEvents from './backbone.events';\n\n/**\n * Simple syntactic sugar for easier extending objects with events\n */\nclass Eventable {}\nObject.assign(Eventable.prototype, BackboneEvents);\n\nexport default Eventable;\n","/* eslint-disable max-classes-per-file */\nimport Eventable from 'utils/eventable';\nimport { copyProperties } from 'utils/mixin';\n\nclass PluginModel extends Eventable {\n    constructor(options) {\n        super();\n\n        this.player = null;\n        this.el = null;\n\n        if (typeof this.initialize === 'function') {\n            this.initialize(options);\n        }\n    }\n\n    // eslint-disable-next-line\n    getName() {\n        throw new Error('getName() method has to be implemented');\n    }\n\n    // eslint-disable-next-line\n    initialize() {}\n    // eslint-disable-next-line\n    setup() {}\n    // eslint-disable-next-line\n    destroy() {}\n\n    /**\n     * @param {Player} player\n     */\n    setPlayer(player) {\n        this.player = player;\n        this.setup(player);\n    }\n}\n\n/**\n * @param {Object} plugin\n * @return {PluginModel}\n */\nconst createClass = (plugin) => {\n    class CustomPluginModel extends PluginModel {}\n    copyProperties(CustomPluginModel.prototype, plugin);\n    return CustomPluginModel;\n};\n\nexport { createClass };\n\nexport default PluginModel;\n","import utils from 'utils/utils';\nimport closeIcon from 'icons/close.svg';\nimport appnexus from 'player/playback/ads/appnexus-ast';\nimport pauseTemplate from './pause.html';\nimport PluginModel from './model';\n\nclass PausePlugin extends PluginModel {\n    constructor(options) {\n        super(options);\n\n        this.maxDisplays = -1;\n        this.displayCounter = 0;\n    }\n}\n/**\n * Check if ad is loaded\n *\n * @param sourceMethod\n * @returns {Function}\n */\nfunction withAdTag(sourceMethod) {\n    // eslint-disable-next-line consistent-return\n    return function () {\n        if (this.adPlacement) {\n            return sourceMethod.apply(\n                this,\n                Array.prototype.slice.call(arguments),\n            );\n        }\n    };\n}\n\nfunction withCounter(sourceMethod) {\n    // eslint-disable-next-line consistent-return\n    return function () {\n        if (this.maxDisplays === -1 || this.displayCounter < this.maxDisplays) {\n            return sourceMethod.apply(\n                this,\n                Array.prototype.slice.call(arguments),\n            );\n        }\n    };\n}\n\nutils.extend(PausePlugin.prototype, {\n    counter: 0,\n    getName() {\n        return 'PausePlugin';\n    },\n\n    resizeAd: withAdTag(function (width, height) {\n        let size = width && height ? [width, height] : null;\n\n        if (!size) {\n            size = this.player\n                .getContainer()\n                .querySelector('.jw-wrapper')\n                .getBoundingClientRect();\n            size = [size.width, size.height];\n        }\n\n        appnexus.resizeTag(this.containerId, size);\n    }),\n\n    load: withAdTag(function (appnexusAdId) {\n        this.listenTo(\n            appnexus,\n            'adLoaded',\n            function (adId, adData) {\n                // different adId\n                if (appnexusAdId !== adId) {\n                    return;\n                }\n\n                this.resizeAd();\n                utils.addClass(this.el, 'svp-pause-view--visible');\n\n                this.trigger('adVisible', {\n                    adId,\n                    creativeId: adData.creativeId,\n                });\n\n                this.isAdTagLoaded = true;\n            },\n            this,\n        );\n\n        appnexus.defineTag(appnexusAdId, this.adPlacement).then(() => {\n            appnexus.showTag(appnexusAdId);\n        });\n    }),\n\n    show: withCounter(\n        withAdTag(function (data) {\n            if (this.player.getState() === 'playing') return;\n            const { pauseReason } = data;\n\n            // undefined is returned on ie11 win7\n            // settingsInteraction is triggered on mobile phones while using quality or share button\n            if (\n                pauseReason !== undefined &&\n                pauseReason !== 'external' &&\n                pauseReason !== 'settingsInteraction' &&\n                this.player.model.player.getViewable() === 1\n            ) {\n                this.displayCounter += 1;\n\n                if (this.isAdTagLoaded === true) {\n                    appnexus.refreshTag(this.containerId);\n                } else {\n                    this.load(this.containerId);\n                }\n            }\n        }),\n    ),\n\n    hide: withAdTag(function () {\n        utils.removeClass(this.el, 'svp-pause-view--visible');\n    }),\n\n    /**\n     * Fixing pause event triggered while interacting with scrub bar\n     * @param data\n     */\n    onPause: withCounter(function (data) {\n        let timerId = null;\n\n        function onSeek() {\n            if (timerId) {\n                clearTimeout(timerId);\n                timerId = null;\n            }\n        }\n\n        timerId = setTimeout(() => {\n            // cleanup seek listener when seek wasn't performed\n            // eg regular pause button click\n            this.stopListening(this.player.model, 'seek', onSeek);\n            // display pause ad\n            this.show(data);\n        }, 50);\n\n        // prevent to display pause ad when user seeked stream\n        this.listenToOnce(this.player.model, 'seek', onSeek);\n    }),\n\n    onResumeClick() {\n        this.player.play();\n        utils.removeClass(this.el, 'svp-pause-view--visible');\n    },\n\n    setup() {\n        PausePlugin.prototype.counter += 1;\n        this.containerId = `svpPauseContainer${PausePlugin.prototype.counter}`;\n\n        this.listenTo(\n            this.player.model,\n            'playlistItem',\n            function (item) {\n                const { adPlacements } = item;\n\n                if (adPlacements && adPlacements.pause) {\n                    this.maxDisplays =\n                        typeof adPlacements.pause.maxDisplays === 'undefined'\n                            ? -1\n                            : parseInt(adPlacements.pause.maxDisplays, 10);\n\n                    this.displayCounter = 0;\n                    this.render(adPlacements.pause);\n                }\n            },\n            this,\n        );\n\n        this.listenTo(this.player.model, 'pause', this.onPause, this);\n        this.listenTo(this.player, 'play', this.hide, this);\n    },\n\n    render(adTagOptions) {\n        const appnexusAdContainerId = this.containerId;\n\n        this.adPlacement = adTagOptions;\n        this.el = utils.createNode(\n            utils.template(pauseTemplate, {\n                appnexusAdContainerId: appnexusAdContainerId,\n                closeIcon: closeIcon,\n            }),\n        );\n\n        const playButton = this.el.querySelector('.jw-icon-playback');\n        const closeButton = this.el.querySelector('.svp-pause-close');\n\n        if (playButton) {\n            playButton.addEventListener(\n                'click',\n                this.onResumeClick.bind(this),\n                true,\n            );\n        }\n\n        if (closeButton) {\n            closeButton.addEventListener(\n                'click',\n                (event) => {\n                    event.stopPropagation();\n                    this.hide();\n                },\n                true,\n            );\n        }\n        this.player\n            .getContainer()\n            .querySelector('.jw-wrapper')\n            .appendChild(this.el);\n\n        this.listenTo(\n            this.player.model.player,\n            'resize',\n            function (width, height) {\n                if (this.player.getState() === 'paused') {\n                    this.resizeAd(width, height);\n                }\n            },\n            this,\n        );\n\n        this.trigger('render');\n    },\n\n    destroy() {\n        appnexus.off(this.containerId);\n\n        this.stopListening(this.player);\n        this.stopListening(this.player.model);\n        this.stopListening(appnexus);\n\n        this.adPlacement = null;\n        this.isAdTagLoaded = false;\n\n        if (this.el) {\n            this.player\n                .getContainer()\n                .querySelector('.jw-wrapper')\n                .removeChild(this.el);\n            this.el = null;\n        }\n    },\n});\n\nexport default PausePlugin;\n","import utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport PluginModel from './model';\n\n/**\n * Displays Age Limit labels in player\n *\n * @param options\n * @constructor\n */\nclass AgeLimitPlugin extends PluginModel {\n    constructor(options) {\n        super(options);\n        this.ageLimit = options.ageLimit;\n        this.hideAfter =\n            options.settings && options.settings.hideAfter != null\n                ? options.settings.hideAfter\n                : 3000;\n    }\n\n    // eslint-disable-next-line\n    getName() {\n        return 'AgeLimitPlugin';\n    }\n\n    setup() {\n        this.listenToOnce(this.player, 'assetPlay', this.render, this);\n\n        this.once('render', this.show, this);\n    }\n\n    render() {\n        // return number when there is no translation available\n        const ageLimit = locale.translate(\n            `ageLimit-${this.ageLimit}`,\n            this.ageLimit,\n        );\n\n        this.el = utils.createNode(`\n          <div class=\"svp-age-limit-label svp-age-limit-${ageLimit}\">\n            <svg width=\"100%\" height=\"100%\" viewBox=\"0 0 1000 1000\" xmlns=\"http://www.w3.org/2000/svg\">\n                <rect\n                  fill=\"#000\" fill-opacity=\"0.03\" stroke=\"currentColor\" stroke-width=\"15\"\n                  rx=\"50\" x=\"10\" y=\"10\" width=\"980\" height=\"980\"\n                />\n                <path fill=\"#fff\" stroke=\"currentColor\" stroke-width=\"80\" d=\"M180 180 820 180 820 820 180 820 z\" />\n            </svg>\n\n            <span>${ageLimit}</span>\n          </div>\n        `);\n        this.player.getContainer().appendChild(this.el);\n\n        this.trigger('render');\n    }\n\n    destroy() {\n        this.stopListening(this.player);\n\n        if (this.el) {\n            this.player.getContainer().removeChild(this.el);\n            this.el = null;\n        }\n    }\n\n    show() {\n        if (this.ageLimit !== null) {\n            utils.addClass(this.player.getContainer(), 'svp-display-age-limit');\n\n            if (this.hideAfter) {\n                this.listenToOnce(\n                    this.player,\n                    'time',\n                    setTimeout.bind(null, this.hide.bind(this), this.hideAfter),\n                );\n            }\n        }\n    }\n\n    hide() {\n        utils.removeClass(this.player.getContainer(), 'svp-display-age-limit');\n    }\n}\n\nexport default AgeLimitPlugin;\n","import utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport PluginModel from './model';\n\n/**\n * Displays sponsor label in top left corner of player\n *\n * @param options\n * @constructor\n */\nclass SponsorLabelPlugin extends PluginModel {\n    constructor(options) {\n        super(options);\n        this.sponsor = options.sponsor;\n        this.pluginName = 'SponsorLabelPlugin';\n    }\n\n    getName() {\n        return this.pluginName;\n    }\n\n    setup() {\n        this.listenToOnce(this.player, 'viewable', this.render, this);\n    }\n\n    render() {\n        const adFrom = locale.translate('Ad from');\n\n        if (this.sponsor) {\n            this.el = utils.createNode(\n                `<div class=\"svp-sponsor-label\">${adFrom} ${this.sponsor}</div>`,\n            );\n            this.player.getContainer().appendChild(this.el);\n        }\n    }\n\n    destroy() {\n        this.stopListening(this.player);\n\n        if (this.el) {\n            this.player.getContainer().removeChild(this.el);\n            this.el = null;\n        }\n    }\n}\n\nexport default SponsorLabelPlugin;\n","import logger from 'utils/logger';\nimport locale from 'player/model/locale';\nimport PluginModel from './model';\n\nconst SVP_LOGIN_OVERLAY = 'svp-login-overlay';\n\n/**\n * @param {String} actual\n * @param {String} expected\n */\nfunction assertUppercased(actual, expected) {\n    return actual && actual.toUpperCase() === expected;\n}\n\nexport function chooseVariant({ variants = {}, rangeNumber }) {\n    const winner = Object.values(variants)\n        .reduce((prev, { id, Percentage }, index) => {\n            const percentage = Number(Percentage);\n            if (index) {\n                return prev.concat({\n                    id,\n                    min: prev[index - 1].max,\n                    max: prev[index - 1].max + percentage,\n                });\n            }\n            return [{ id, min: 0, max: percentage }];\n        }, [])\n        .find(({ min, max }) => rangeNumber > min && rangeNumber < max);\n    return winner && variants[winner.id];\n}\n\nexport function prepareVariantsForExperiment(metadata = {}) {\n    const variantIds = metadata.variants && metadata.variants.split(',');\n    const experimentMetadataKeys = Object.keys(metadata).filter((key) =>\n        key.match(/^\\d+variant/g),\n    );\n\n    return experimentMetadataKeys.reduce((prev, current) => {\n        const [, id, , key] = /^(\\d+)(variant)(\\D+)/g.exec(current);\n        if (variantIds.includes(id)) {\n            prev[id] = Object.assign(prev[id] || {}, {\n                id,\n                [key]: metadata[current],\n            });\n        }\n        return prev;\n    }, {});\n}\n\nfunction isLoginVariantType(variant = {}) {\n    return assertUppercased(variant.Type, 'LOGIN');\n}\n\nfunction isSubscriptionVariantType(variant = {}) {\n    return assertUppercased(variant.Type, 'SUBSCRIPTION');\n}\n\nconst getUiElementId = (provider, articleUrl, assetId) =>\n    `sdrn:${provider}:article:${articleUrl}:element:${assetId}`;\n\nclass PodcastExperimentPlugin extends PluginModel {\n    constructor({ id, variant }, { loginUrl, subscriptionUrl, articleUrl }) {\n        super({ id, variant });\n        this.id = id;\n        this.variant = variant;\n        this.loginUrl = loginUrl;\n        this.subscriptionUrl = subscriptionUrl;\n        this.articleUrl = articleUrl;\n        this.pluginName = 'PodcastExperimentPlugin';\n    }\n\n    getName() {\n        return this.pluginName;\n    }\n\n    setup() {\n        logger('ExperimentPlugin').log('setup', this);\n        this.listenToOnce(this.player, 'viewable', this.render, this);\n    }\n\n    /**\n     * @returns {string}\n     */\n    getButtonText() {\n        const { variant = {} } = this;\n        const translate = locale.translate('player');\n\n        if (isLoginVariantType(variant)) {\n            return translate.loginToListen;\n        }\n        if (isSubscriptionVariantType(variant)) {\n            return translate.subscribeToListen;\n        }\n        return translate.listen;\n    }\n\n    render() {\n        const { variant, loginUrl, subscriptionUrl, articleUrl, player } = this;\n        const { id, provider } = player.asset.attributes;\n        const jwPlayer = player.model.player;\n        const container = jwPlayer.getContainer();\n        const buttonText = this.getButtonText();\n        const uiElementId = getUiElementId(\n            provider,\n            encodeURIComponent(articleUrl),\n            id,\n        );\n        const pulseStatsPlugin = player.plugins.PulseStats;\n\n        function trackEngagement() {\n            if (pulseStatsPlugin) {\n                pulseStatsPlugin.track('Engagement podcast experiment', {\n                    provider: { productType: 'Web' },\n                    type: 'Engagement',\n                    object: {\n                        '@id': uiElementId,\n                        type: 'UIElement',\n                        name: buttonText,\n                    },\n                });\n            }\n        }\n\n        if (pulseStatsPlugin) {\n            pulseStatsPlugin.playbackEvents.once('Load', () => {\n                pulseStatsPlugin.track('View podcast experiment', {\n                    provider: { productType: 'Web' },\n                    type: 'View',\n                    object: {\n                        '@id': uiElementId,\n                        type: 'UIElement',\n                        name: buttonText,\n                    },\n                });\n            });\n        }\n\n        if (!variant) {\n            player.once('initialPlay', () => {\n                trackEngagement();\n            });\n            return;\n        }\n\n        const redirectUrl = isLoginVariantType(variant)\n            ? loginUrl\n            : subscriptionUrl;\n\n        const linkAnchor = document.createElement('a');\n        const linkSpan = document.createElement('span');\n        linkSpan.classList.add('svp-login-button');\n        linkSpan.appendChild(document.createTextNode(buttonText));\n        linkAnchor.appendChild(linkSpan);\n        linkAnchor.classList.add(SVP_LOGIN_OVERLAY);\n        linkAnchor.setAttribute('href', redirectUrl);\n\n        container.appendChild(linkAnchor);\n    }\n\n    destroy() {\n        this.stopListening(this.player);\n        const jwPlayer = this.player.model.player;\n        const container = jwPlayer.getContainer();\n\n        const experimentOverlay = container.querySelector(\n            `.${SVP_LOGIN_OVERLAY}`,\n        );\n        if (experimentOverlay) {\n            experimentOverlay.parentNode.removeChild(experimentOverlay);\n        }\n\n        logger('ExperimentPlugin').log('destroy', this);\n    }\n}\n\nexport default PodcastExperimentPlugin;\n","import utils from 'utils/utils';\nimport ServerTime from 'utils/server-time';\nimport config from 'player/config';\nimport locale from 'player/model/locale';\n\nimport countdownTemplate from './countdown.html';\nimport PluginModel from './model';\n\nconst PLAYLIST_REGENERATION_THRESHOLD = 5; // in seconds\n\n/**\n * Format number by adding leading zeros eg 7 -> 07\n *\n * @param numValue\n * @param numLen\n * @returns {string}\n */\nconst leadingZeros = (numValue, numLen) => {\n    const length = numLen || 2;\n    let num = String(numValue);\n\n    while (num.length < length) {\n        num = `0${num}`;\n    }\n\n    return num;\n};\n\n/**\n * Renders countdown clock for streams which are not published yet\n *\n * @param options\n * @constructor\n */\nclass CountdownPlugin extends PluginModel {\n    constructor(options) {\n        super(options);\n\n        /**\n         * Start date for stream (flightTime.start)\n         * Javascript Date object\n         */\n        this.streamStart = options.streamStart;\n\n        this.liveDOM = null;\n        this.countdownDOM = null;\n\n        this.isPlaylistRegenerated = false;\n    }\n\n    // eslint-disable-next-line\n    getName() {\n        return 'countdown';\n    }\n\n    setup() {\n        this.listenTo(this.player, 'playlistItem', this.render, this);\n    }\n\n    /**\n     * Cleanup old node\n     */\n    destroy() {\n        this.stopListening(this.player);\n\n        if (this.el) {\n            this.player.getContainer().removeChild(this.el);\n            this.el = null;\n        }\n    }\n\n    /**\n     * Render countdown\n     */\n    render() {\n        try {\n            this.player.getContainer();\n        } catch (error) {\n            return;\n        }\n\n        this.el = utils.createNode(utils.template(countdownTemplate));\n        this.player.getContainer().appendChild(this.el);\n\n        utils.addClass(this.player.getContainer(), 'svp-countdown-loaded');\n\n        // cached live label dom element\n        // eslint-disable-next-line prefer-destructuring\n        this.liveDOM = this.el.getElementsByClassName('svp-live-label')[0];\n        // eslint-disable-next-line prefer-destructuring\n        this.countdownDOM = this.el.getElementsByClassName(\n            'svp-countdown-live-timer',\n        )[0];\n\n        // countdown is ready\n        this.trigger('ready');\n        // start event runs on first change of countdown\n        this.once('change', () => this.trigger('start'));\n\n        // interval has to be initialized on\n        this.intervalId = setInterval(() => this.refresh(), 1000);\n        this.refresh();\n    }\n\n    /**\n     * Refresh state and repaint\n     */\n    async refresh() {\n        if (!this.diff) {\n            this.diff = this.getDiff();\n        }\n\n        if (this.diff <= 0) {\n            this.stop();\n        }\n\n        const string = [];\n\n        if (this.isCountdownActive()) {\n            const minutes = Math.floor(this.diff / 60) % 60;\n            const seconds = this.diff % 60;\n\n            string.push(`${leadingZeros(minutes)}:`);\n            string.push(\n                `${leadingZeros(seconds)}<span class=\"svp-timer-unit\">s</span>`,\n            );\n\n            if (this.currentState !== 'timer') {\n                this.currentState = 'timer';\n                this.liveDOM.innerHTML = locale.translate(\n                    'Video will start in',\n                );\n\n                utils.addClass(\n                    this.player.getContainer(),\n                    'svp-countdown-active',\n                );\n            }\n        } else if (this.currentState !== 'date') {\n            this.currentState = 'date';\n\n            string.push(\n                `${this.streamStart.getDate()}. ${locale\n                    .getMonthName(this.streamStart)\n                    .toLowerCase()} `,\n            );\n            string.push(`${leadingZeros(this.streamStart.getHours())}:`);\n            string.push(leadingZeros(this.streamStart.getMinutes()));\n\n            this.liveDOM.innerHTML = locale.translate('Video will start at');\n        }\n\n        if (string.length > 0) {\n            this.countdownDOM.innerHTML = string.join('');\n            this.trigger('change', this.streamStart);\n        }\n\n        // sync server time every 60s\n        if (this.diff % 60 === 0) {\n            await ServerTime.fetch(config.time);\n            const newDiff = this.getDiff();\n            if (Math.abs(newDiff - newDiff) > 1) {\n                this.diff = newDiff;\n            }\n        }\n\n        if (this.shouldRegeneratePlaylist()) {\n            setTimeout(this.regeneratePlaylist.bind(this), 0);\n        }\n\n        this.diff -= 1;\n    }\n\n    shouldRegeneratePlaylist() {\n        return (\n            this.player.model.getStream().isSecure() &&\n            this.diff <= PLAYLIST_REGENERATION_THRESHOLD &&\n            !this.isPlaylistRegenerated\n        );\n    }\n\n    /**\n     * Regenerate playlist to update tokens for secured streams\n     * @return {Promise<void>}\n     */\n    async regeneratePlaylist() {\n        this.isPlaylistRegenerated = true;\n        const { model } = this.player;\n        const { playlist } = await model.getConfig();\n        model.player.load(playlist);\n    }\n\n    /**\n     * End of countdown\n     */\n    stop() {\n        if (this.intervalId) {\n            clearInterval(this.intervalId);\n        }\n\n        this.intervalId = null;\n        this.el.parentNode.removeChild(this.el);\n        this.el = null;\n\n        utils.removeClass(this.player.getContainer(), [\n            'svp-countdown-active',\n            'svp-countdown-loaded',\n        ]);\n\n        this.trigger('end');\n    }\n\n    /**\n     * Get difference between stream start and current server time\n     * @returns {number}\n     */\n    getDiff() {\n        return Math.ceil(\n            (this.streamStart.getTime() - ServerTime.getTime()) / 1000,\n        );\n    }\n\n    /**\n     * Check whatever countdown or date should be displayed\n     * Countdown is active when less than 1 hour reminded to start\n     * @returns {boolean}\n     */\n    isCountdownActive() {\n        // less than 1 hour\n        return this.diff < 60 * 60 - 1;\n    }\n}\n\nexport default CountdownPlugin;\n","import utils from 'utils/utils';\nimport image from 'utils/image';\nimport Recommended from 'player/model/recommended';\nimport closeIcon from 'icons/close.svg';\nimport nextIcon from 'icons/chevron-right.svg';\nimport recommendedTemplate from './recommended/recommended.html';\nimport nextAssetTemplate from './recommended/next-asset.html';\nimport gridTemplate from './recommended/grid.html';\nimport PluginModel from './model';\n\n/**\n * Play next asset from the list\n *\n * @param {number} assetId - SVP Asset id\n * @param {string} source - source of playnext (auto - when autoplay next, single, grid)\n */\nfunction playNext(assetId, source) {\n    const clear = () => {\n        utils.removeClass(this.el, [\n            'is-grid-visible',\n            'is-next-visible',\n            'is-counting',\n            'is-next-closing',\n        ]);\n    };\n\n    this.stopListening(this.player, 'complete');\n\n    // autoplay of asset can be turned off from config\n    if (this.settings.autoplay !== false) {\n        this.player.playNext(assetId);\n    }\n\n    // nextAsset case, triggered by autoplay or user\n    if (source === 'single' || source === 'auto') {\n        this.trigger(\n            'nextAssetPlay',\n            this.nextAsset,\n            source === 'auto' ? 'auto' : 'click',\n            {\n                source: this.nextAssetSource,\n            },\n        );\n\n        utils.addClass(this.el, 'is-next-closing');\n        setTimeout(clear, 700);\n    } else {\n        // grid click\n        this.trigger('playRecommended', assetId);\n        clear();\n    }\n}\n\n/**\n * Turn off autoplay of recommended next asset\n */\nfunction disableNext() {\n    this.trigger('nextAssetClose', this.nextAsset);\n    this.nextAsset = null;\n    utils.removeClass(this.el, [\n        'is-next-visible',\n        'is-counting',\n        'is-next-visible',\n    ]);\n}\n\n/**\n * Retrieve full url for play next and grid assets thumbnails\n *\n * @param {string} key\n * @returns {string|null}\n */\nfunction getThumbnailUrl(key) {\n    return image.getImageSrc(key, 'poster', 200);\n}\n\n/**\n * Add snap scroll for mobile grid\n */\nfunction initSnapScroll() {\n    const scrollSnapPrefix = utils.getScrollSnapPrefix();\n    const gridItem = this.getByClass('svp-player-recommended-item')[0];\n\n    // check if snap points are supported\n    if (scrollSnapPrefix !== false) {\n        this.el.style[`${scrollSnapPrefix}scroll-snap-type`] = 'mandatory';\n        this.el.style[`${scrollSnapPrefix}scroll-snap-points-x`] =\n            `repeat(${gridItem.clientWidth}px)`;\n    }\n}\n\n/**\n * Click handler for recommended grid\n *\n * @param {HTMLElement} node\n */\nfunction onGridItemClicked(node) {\n    utils.addClass(node, 'svp-to-active');\n\n    this.listenToOnce(\n        this.player,\n        'assetPlay',\n        function () {\n            utils.removeClass(\n                this.player.getContainer(),\n                'is-recommended-grid-visible',\n            );\n        },\n        this,\n    );\n\n    setTimeout(() => {\n        playNext.call(this, parseInt(node.dataset.id, 10), 'grid');\n        utils.removeClass(this.el, 'is-grid-visible');\n    }, 500);\n}\n\n/**\n * Fetch recommended assets when player is ready\n */\nfunction onPlaybackStart() {\n    const recommended = new Recommended({\n        asset: this.player.getAsset({\n            shouldLogDeprecatedWarning: false,\n        }),\n    });\n\n    // restore default state for each new asset\n    this.gridItemsReady = false;\n\n    // turn off option for grid\n    if (this.settings.grid !== false) {\n        recommended\n            .getItems()\n            .then((items) => {\n                if (Array.isArray(items) && items.length > 0) {\n                    this.gridItemsReady = true;\n                    this.trigger('gridItemsReady', items);\n                } else {\n                    utils.removeClass(\n                        this.player.getContainer(),\n                        'is-recommended-grid-visible',\n                    );\n                }\n            })\n            .catch(() => {\n                try {\n                    utils.removeClass(\n                        this.player.getContainer(),\n                        'is-recommended-grid-visible',\n                    );\n                } catch (e) {\n                    // player container not available\n                }\n            });\n    }\n\n    // next asset is available by default but can be turned off\n    if (this.settings.next !== false) {\n        if (this.nextAsset) {\n            this.trigger('nextAssetReady', this.nextAsset, {\n                source: this.nextAssetSource,\n            });\n            return;\n        }\n\n        recommended\n            .getNextAsset(this.settings.next)\n            .then(({ nextAsset, source }) => {\n                this.nextAsset = nextAsset;\n                this.nextAssetSource = source;\n\n                this.trigger('nextAssetReady', this.nextAsset, {\n                    source,\n                });\n            })\n            .catch(() => {\n                if (this.el) {\n                    utils.removeClass(this.el, [\n                        'is-next-visible',\n                        'is-counting',\n                        'is-next-closing',\n                    ]);\n                }\n            });\n    }\n}\n\n/**\n * Initialize lazy fetching\n */\nfunction onInitialize() {\n    // fetch recommended 5s before countdown time\n    let fetchDuration = this.player.getDuration() - this.countdownTime - 5;\n\n    // for streams shorter than 15s load next in 2s\n    if (fetchDuration < 0) {\n        fetchDuration = 2;\n    }\n    const stream = this.player.model.getStream();\n    const isLive = stream.isLive();\n    const isDisabledNextVideo = stream.isDisabledNextVideo();\n    const hasPlaylist = stream.hasPlaylist();\n    const isAssetFromPlaylist = this.player.model.isAssetFromPlaylist(\n        stream.getId(),\n    );\n\n    // do not enable recommended for live streams and asset with metadata.disableNextVideo set to true\n    if (\n        !isLive &&\n        !isDisabledNextVideo &&\n        !hasPlaylist &&\n        !isAssetFromPlaylist\n    ) {\n        this.listenTo(\n            this.player,\n            'time',\n            function (time) {\n                if (fetchDuration > 0 && time > fetchDuration) {\n                    fetchDuration = -1;\n                    onPlaybackStart.call(this);\n                }\n            },\n            this,\n        );\n    }\n}\n\n/**\n * Handler for stream end (countdown end) event\n * Stream complete can't be used due to circular events triggering\n * @param {string} reason\n */\nfunction onPlaybackComplete(reason) {\n    const stream = this.player.model.getStream();\n    const isAssetFromPlaylist = this.player.model.isAssetFromPlaylist(\n        stream.getId(),\n    );\n\n    // do not take any action if complete is triggered by playNext\n    if (\n        stream.hasPlaylist() ||\n        isAssetFromPlaylist ||\n        reason === 'manualNext' ||\n        reason === 'stop'\n    ) {\n        return;\n    }\n\n    if (this.nextAsset) {\n        this.trigger('nextAssetComplete', this.nextAsset);\n        playNext.call(this, this.nextAsset.getId(), 'auto');\n    } else if (this.gridItemsReady) {\n        // display grid only when items are available\n        utils.addClass(this.el, 'is-grid-visible');\n        utils.addClass(\n            this.player.getContainer(),\n            'is-recommended-grid-visible',\n        );\n\n        initSnapScroll.call(this);\n        this.trigger('gridVisible');\n    }\n}\n\n/**\n * Handler for checking time in which playNext should be available\n * @param {number} time\n * @param {number} duration\n */\nfunction onTimeNextVisible(time, duration) {\n    if (duration - time < this.countdownTime) {\n        this.trigger('playNextVisible', Math.floor(duration - time));\n    }\n}\n\n/**\n * Display play next in given time\n *\n * @param {number} timeout - duration of countdown\n */\nfunction onPlayNextVisible(timeout) {\n    // Don't present play next for audio assets as it isn't prepared\n    const asset = this.player.getAsset({\n        shouldLogDeprecatedWarning: false,\n    });\n    if (asset.isAudio()) {\n        return;\n    }\n\n    utils.addClass(this.el, ['is-next-visible', 'is-counting']);\n\n    this.stopListening(this.player, 'time', onTimeNextVisible);\n    // update transition duration as it may be smaller than default due to seek\n    this.getByClass(\n        'svp-player-recommended-countdown',\n    )[0].style.transitionDuration = `${timeout}s`;\n}\n\n/**\n * Handler triggered when nextAsset is available for current stream\n */\nfunction onNextAssetReady() {\n    const img = new Image();\n    // prefetch image\n    img.src = getThumbnailUrl(this.nextAsset.getThumbnail());\n\n    this.listenTo(this.player, 'time', onTimeNextVisible, this);\n\n    this.getByClass('svp-player-recommended-next')[0].innerHTML =\n        utils.template(nextAssetTemplate, {\n            next: this.nextAsset,\n            countdown: this.countdownTime, // default countdown\n            getThumbnail: getThumbnailUrl,\n            closeIcon: closeIcon,\n            nextIcon: nextIcon,\n        });\n\n    this.getByClass('svp-player-recommended-image')[0].addEventListener(\n        'click',\n        playNext.bind(this, this.nextAsset.getId(), 'single'),\n    );\n\n    this.getByClass('svp-player-recommended-close')[0].addEventListener(\n        'click',\n        disableNext.bind(this),\n    );\n}\n\n/**\n * Triggered when grid items are available\n * @param {Asset[]} recommended\n */\nfunction onGridItemsReady(recommended) {\n    this.getByClass('svp-player-recommended-grid')[0].innerHTML =\n        utils.template(gridTemplate, {\n            recommended: recommended,\n            getThumbnail: getThumbnailUrl,\n            utils: utils,\n        });\n\n    utils.each(this.getByClass('svp-player-recommended-item'), (item) => {\n        item.addEventListener('click', onGridItemClicked.bind(this, item));\n    });\n}\n\n/**\n * Triggered when recommended grid is displayed\n */\nfunction onGridVisible() {\n    // replay asset triggers play\n    // clicking on grid not intersects with this\n    this.listenToOnce(\n        this.player,\n        'play',\n        this.trigger.bind(this, 'assetReplay'),\n    );\n}\n\n/**\n * Event fired when user decided to restart video\n */\nfunction onAssetReplay() {\n    // attach events to allow again display of grid\n    this.setup();\n    // cleanup state\n    utils.removeClass(\n        this.player.getContainer(),\n        'is-recommended-grid-visible',\n    );\n    utils.removeClass(this.el, [\n        'is-grid-visible',\n        'is-next-visible',\n        'is-counting',\n        'is-next-closing',\n    ]);\n}\n\n/**\n * Renders countdown clock for streams which are not published yet\n *\n * @param options\n * @constructor\n */\nclass RecommendedPlugin extends PluginModel {\n    constructor(options) {\n        super(options);\n\n        // time in seconds from end of stream\n        this.countdownTime =\n            (options.settings &&\n                options.settings.next &&\n                options.settings.next.countdown) ||\n            10;\n        this.nextAsset = null;\n        this.settings = utils.extend(\n            {\n                grid: true,\n                next: {},\n            },\n            options.settings,\n        );\n\n        // check if grid items are available\n        this.gridItemsReady = false;\n    }\n\n    // eslint-disable-next-line\n    getName() {\n        return 'RecommendedPlugin';\n    }\n\n    setup() {\n        // assetPlay\n        this.stopListening(this.player);\n        this.listenToOnce(this.player, 'assetPlay', this.render, this);\n        this.listenToOnce(this.player, 'assetPlay', onInitialize, this);\n        this.listenToOnce(this.player, 'complete', onPlaybackComplete, this);\n\n        this.once('playNextVisible', onPlayNextVisible, this);\n        this.once('nextAssetReady', onNextAssetReady, this);\n        this.once('gridItemsReady', onGridItemsReady, this);\n        this.once('gridVisible', onGridVisible, this);\n        this.once('assetReplay', onAssetReplay, this);\n    }\n\n    /**\n     * Get current element child node by class name\n     *\n     * @param className\n     * @returns {NodeList|*}\n     */\n    getByClass(className) {\n        return this.el.getElementsByClassName(className);\n    }\n\n    /**\n     * Render default view holder for play next and recommended\n     *\n     */\n    render() {\n        const container = this.player.getContainer();\n        const previousEl = container.getElementsByClassName(\n            'svp-player-recommended-box',\n        );\n\n        // clean if previously grid was displayed\n        utils.removeClass(\n            this.player.getContainer(),\n            'is-recommended-grid-visible',\n        );\n\n        // cleanup old element\n        // recommended is \"async\" so it can't be destroyed like normal plugin\n        if (previousEl.length > 0) {\n            container.removeChild(previousEl[0]);\n        }\n\n        this.el = utils.createNode(utils.template(recommendedTemplate));\n\n        container.appendChild(this.el);\n    }\n}\n\nexport default RecommendedPlugin;\n","import Eventable from 'utils/eventable';\n\n/**\n * @typedef AdEventsAdData\n * @property {string} id\n * @property {false|number[]} adSequenceDuration\n * @property {number} duration integer\n * @property {number} position integer\n * @property {number} sequence ad sequence position\n * @property {number} count\n * @property {boolean} start\n * @property {string} type\n */\n\n/**\n * Parse SVP Player events and tailor data to pulse requirements\n *\n * Available events: Play, Pause, Stop\n */\nclass AdEvents extends Eventable {\n    constructor(player) {\n        super();\n        this.player = player;\n        /**\n         * @type {AdEventsAdData}\n         */\n        this.adData = { adSequenceDuration: false };\n        this.beforeUnload = [\n            'onpagehide' in window.self ? 'pagehide' : 'beforeunload',\n            this.onAdSlotComplete.bind(this),\n            true,\n        ];\n\n        this.listenTo(this.player, 'playlistItem', this.onPlaylistItem, this);\n        this.listenTo(this.player, 'adSlotStart', this.onAdSlotStart, this);\n        this.listenTo(this.player, 'adStarted', this.onAdStarted, this);\n        this.listenTo(this.player, 'adError', this.onAdError, this);\n        this.listenTo(this.player, 'adProgress', this.onAdProgress, this);\n        this.listenTo(\n            this.player,\n            'adSlotComplete',\n            this.onAdSlotComplete,\n            this,\n        );\n        this.listenTo(this.player, 'adFinished', this.onAdFinished, this);\n\n        this.listenTo(this.player, 'adPause', this.onAdPause, this);\n        this.listenTo(this.player, 'adPlay', this.onAdPlay, this);\n\n        this.listenTo(\n            this.player,\n            'PausePlugin:adVisible',\n            this.onPauseAdVisible,\n            this,\n        );\n\n        this.listenTo(this.player, 'playlistItem', () => {\n            this.adData.adSequenceDuration = false;\n        });\n\n        window.addEventListener(...this.beforeUnload);\n    }\n\n    onPlaylistItem() {\n        this.listenToOnce(this.player, 'complete', this.onAdSlotComplete, this);\n    }\n\n    onAdSlotStart(slotData) {\n        Object.assign(this.adData, {\n            type: slotData.position,\n        });\n    }\n\n    onAdProgress(time) {\n        if (!this.adData.id) {\n            return;\n        }\n\n        const position = Math.floor(time);\n\n        Object.assign(this.adData, {\n            position,\n        });\n    }\n\n    onAdError(adErrorData) {\n        this.sendAttemptEvent(adErrorData);\n    }\n\n    onAdSlotComplete() {\n        this.sendStopEvent();\n        window.removeEventListener(...this.beforeUnload);\n    }\n\n    onAdFinished() {\n        this.sendStopEvent();\n    }\n\n    onAdStarted({ meta: adData }) {\n        Object.assign(this.adData, {\n            start: true,\n        });\n\n        // adData is missing from homad events\n        if (!adData) {\n            return;\n        }\n\n        Object.assign(this.adData, {\n            id: adData.adId,\n            sequence: adData.sequence,\n            count: adData.podcount,\n            position: 0,\n        });\n\n        if (!this.adData.adSequenceDuration) {\n            this.adData.adSequenceDuration = Array(adData.podcount);\n        }\n\n        const adType = adData?.adschedule?.offset;\n        // Preroll ads only\n        if (adType === 'pre' && adData.duration) {\n            this.adData.adSequenceDuration[adData.sequence - 1] =\n                adData.duration;\n        }\n    }\n\n    onAdPlay() {\n        this.trigger('Play', this.adData);\n        // start indicates first play of ad\n        this.adData.start = false;\n    }\n\n    onAdPause() {\n        this.trigger('Pause', this.adData);\n    }\n\n    onPauseAdVisible(data) {\n        this.trigger('View', {\n            id: data.creativeId,\n            type: 'Pausead',\n        });\n    }\n\n    sendStopEvent() {\n        if (this.adData.id) {\n            this.trigger('Stop', {\n                ...this.adData,\n                duration: this.adData.position,\n            });\n            // keep adSequenceDuration for playback tracking purposes\n            this.adData = {\n                adSequenceDuration: this.adData.adSequenceDuration,\n            };\n        }\n    }\n\n    sendAttemptEvent(adErrorData) {\n        this.trigger('Attempt', {\n            ...this.adData,\n            id: '000000',\n            position: 0,\n            type: adErrorData?.adposition\n                ? `${adErrorData.adposition}roll`\n                : undefined,\n            sequence: 1,\n            count: 0,\n            adSequenceDuration: [0],\n        });\n    }\n\n    destroy() {\n        window.removeEventListener(...this.beforeUnload);\n        this.stopListening();\n    }\n}\n\nexport default AdEvents;\n","export default {};\n","import Eventable from 'utils/eventable';\nimport utils from 'utils/utils';\nimport session from './session';\nimport { isCustomIntervalFalsy } from './helpers';\n\n/**\n * Parse SVP Player events and tailor data to pulse requirements\n *\n * Available events: Play, Pause, Stop, Watch\n */\nclass PlaybackEvents extends Eventable {\n    constructor(player, options) {\n        super();\n        this.player = player;\n        this.watchData = {\n            time: 0,\n            duration: -1,\n        };\n\n        this.previousTime = -1;\n\n        this.session = this.createSession();\n        this.beforeStreamStart = true;\n        this.beforeUnload = [\n            'onpagehide' in window.self ? 'pagehide' : 'beforeunload',\n            this.onBeforeUnload.bind(this),\n            true,\n        ];\n        this.playMethod = null;\n\n        this.vodInterval = options?.vodInterval;\n        this.liveInterval = options?.liveInterval;\n\n        this.listenTo(this.player, 'playlistItem', this.onPlaylistItem, this);\n        this.listenTo(this.player, 'assetPlay', this.onAssetPlay, this);\n        this.listenTo(this.player, 'pause', this.onPause, this);\n        this.listenTo(this.player, 'play', this.onPlay, this);\n        this.listenTo(this.player, 'playNext', this.onPlayNext, this);\n\n        if (this.stream.isLive()) {\n            this.listenTo(this.player, 'time', this.onLiveTime, this);\n        } else {\n            this.listenTo(this.player, 'time', this.onTime, this);\n        }\n\n        this.listenTo(\n            this.player,\n            'RecommendedPlugin:nextAssetPlay',\n            (asset, mode, opts) => {\n                let playbackSource =\n                    mode === 'auto' ? 'autoplayNext' : 'manualNext';\n                if (opts.source && opts.source !== 'byId') {\n                    playbackSource += `-${opts.source}`;\n                }\n                return this.onRecommendedPlay(playbackSource);\n            },\n        );\n\n        this.listenTo(this.player, 'nextAutoAdvance', () =>\n            this.onRecommendedPlay('autoplayNext-playlist'),\n        );\n\n        this.listenTo(this.player, 'nextClick', () =>\n            this.onRecommendedPlay('manualNext-playlist'),\n        );\n\n        this.listenTo(this.player, 'relatedReady', () => {\n            if (!this.jwRelatedPlugin) {\n                return;\n            }\n            this.jwRelatedPlugin.on('feedClick', () => {\n                this.beforeStreamStart = false;\n                this.onComplete();\n                this.onRecommendedPlay('manualNext-playlist');\n            });\n        });\n\n        this.listenTo(this.player, 'playlistComplete', () => {\n            this.listenToOnce(this.player, 'displayClick', () =>\n                this.onRecommendedPlay('manualNext-playlist'),\n            );\n        });\n\n        this.listenTo(this.player, 'RecommendedPlugin:playRecommended', () => {\n            this.onRecommendedPlay('manualNext-grid');\n        });\n\n        this.listenToOnce(this.player, 'play', ({ playReason }) => {\n            this.playMethod = playReason;\n        });\n\n        window.addEventListener(...this.beforeUnload);\n    }\n\n    get eventData() {\n        const data = {\n            playMethod: this.playMethod,\n        };\n        const { previousAssetId } = this.session;\n\n        if (previousAssetId) {\n            data.previousAssetId = previousAssetId;\n            data.playbackSource = this.session.playbackSource;\n        }\n\n        data.duration = this.watchData.duration;\n\n        try {\n            data.position = Math.floor(this.player.getCurrentTime());\n        } catch (e) {\n            // could not parse time\n            // do not set any value in this case\n        }\n\n        return data;\n    }\n\n    get stream() {\n        try {\n            return this.player.config.stream || {};\n        } catch (e) {\n            return {};\n        }\n    }\n\n    get jw() {\n        try {\n            return this.player.model.player || {};\n        } catch (e) {\n            return {};\n        }\n    }\n\n    get jwRelatedPlugin() {\n        try {\n            return this.jw.getPlugin('related') || null;\n        } catch (e) {\n            return null;\n        }\n    }\n\n    getPosition() {\n        try {\n            return Math.floor(this.player.getCurrentTime());\n        } catch (e) {\n            return 0;\n        }\n    }\n\n    createSession() {\n        // node is unique player identifier\n        const node = this.player.config.get('node');\n        const id = node.id || node;\n\n        /**\n         * Initialize session object to keep reference\n         */\n        if (!session[id]) {\n            session[id] = {};\n        }\n\n        return session[id];\n    }\n\n    trackTimeEvent({ time, defaultInterval = 1, customInterval }) {\n        const eventInterval = utils.isNumber(customInterval)\n            ? customInterval\n            : defaultInterval;\n\n        // track event data with one second interval\n        if (time % 1 === 0 && this.previousTime !== time) {\n            this.watchData.duration += 1;\n            this.previousTime = time;\n        }\n\n        if (time % eventInterval === 0 && this.watchData.time !== time) {\n            this.watchData.time = time;\n\n            // skip when custom interval is turned off\n            if (isCustomIntervalFalsy(customInterval)) {\n                return;\n            }\n\n            this.trigger(\n                'Watch',\n                Object.assign(this.eventData, {\n                    position: time,\n                }),\n            );\n        }\n    }\n\n    onBeforeUnload() {\n        if (this.beforeStreamStart === false) {\n            this.onComplete();\n        }\n    }\n\n    onPlaylistItem() {\n        this.listenToOnce(\n            this.player,\n            'complete nextClick',\n            this.onComplete,\n            this,\n        );\n        const track = this.trigger.bind(\n            this,\n            'Load',\n            Object.assign(this.eventData, {\n                position: this.stream.getPlaybackTime('begin') || 0,\n                duration: 0,\n            }),\n        );\n\n        /**\n         * Only first playback has to wait for viewable event\n         * Playnext/grid will work without it\n         */\n        if (this.session.wasViewed === true) {\n            track();\n        } else {\n            // wait for player to be viewable\n            this.listenTo(this.player.model.player, 'viewable', (data) => {\n                if (data.viewable) {\n                    track();\n                    this.stopListening(this.player.model.player, 'viewable');\n                    this.session.wasViewed = true;\n                }\n            });\n        }\n\n        this.previousAssetId = null;\n    }\n\n    onAssetPlay() {\n        this.beforeStreamStart = false;\n\n        return this.trigger(\n            'Play',\n            Object.assign(this.eventData, {\n                start: true,\n                duration: 0,\n            }),\n        );\n    }\n\n    onPause() {\n        this.trigger('Pause', this.eventData);\n    }\n\n    onPlay() {\n        // play can't be triggered before assetPlay\n        if (!this.beforeStreamStart) {\n            this.trigger('Play', this.eventData);\n        }\n    }\n\n    /**\n     * Intervals for VOD are defined as follow\n     *\n     * every 5s - during the first 10 seconds of content playback (no matter of where playback has started)\n     * every 10s - for the range (10-60s) of content playback, after seeking intervals should be triggered in same time\n     * every 30s - for the rest\n     * seek 42, then first trigger should be in 50\n     */\n    onTime(eventTime) {\n        const time = Math.floor(eventTime);\n        let eventInterval;\n\n        if (eventTime <= 10) {\n            eventInterval = 5;\n        } else if (eventTime <= 120) {\n            eventInterval = 10;\n        } else {\n            eventInterval = 30;\n        }\n        this.trackTimeEvent({\n            time,\n            defaultInterval: eventInterval,\n            customInterval: this.vodInterval,\n        });\n    }\n\n    /**\n     * Track live events by checking time from flight time to current date\n     * DVR seek is also included in calculations\n     */\n    onLiveTime() {\n        // after playback stars time to start will be negative\n        // add DVR shift from playback\n        const eventTime = Math.floor(\n            this.stream.getTimeToStart() * -1 + this.jw.getPosition(),\n        );\n        // constant tracking interval\n        this.trackTimeEvent({\n            time: eventTime,\n            defaultInterval: 30,\n            customInterval: this.liveInterval,\n        });\n    }\n\n    onComplete(reason) {\n        if (reason === 'manualNext') {\n            this.onRecommendedPlay('manualNext');\n        }\n\n        /**\n         * Track stop event only when playback has started\n         */\n        if (this.beforeStreamStart === false) {\n            this.trigger('Stop', this.eventData);\n            // store asset id in memory to attach it to play next video\n            this.session.previousAssetId = this.stream.getId();\n        }\n        this.beforeStreamStart = true;\n    }\n\n    /**\n     * @param {Number} id\n     * @param {Object} [options]\n     * @param {Object} [options.pulse]\n     * @param {String} [options.source] - A source that will be added as a playback source for pulse metrics\n     */\n    onPlayNext(id, options) {\n        if (options && options.pulse) {\n            Object.assign(this.session, options.pulse);\n        }\n    }\n\n    onRecommendedPlay(playbackSource) {\n        this.session.playbackSource = playbackSource;\n    }\n\n    destroy() {\n        window.removeEventListener(...this.beforeUnload);\n        this.stopListening();\n    }\n}\n\nexport default PlaybackEvents;\n","/**\n * Returns true when custom interval is set to false, null or 0\n * @param customInterval\n * @return {boolean}\n */\nexport function isCustomIntervalFalsy(customInterval) {\n    return customInterval !== undefined && !customInterval;\n}\n","import Eventable from 'utils/eventable';\n\n/**\n * Parse SVP Player events and tailor data to pulse requirements\n *\n * Available events: Play, Pause, Stop, Watch\n */\nclass UiEvents extends Eventable {\n    constructor(player) {\n        super();\n        this.player = player;\n        this.listenTo(this.player, 'ready', this.onReady, this);\n\n        this.listenTo(\n            this.player,\n            'RecommendedPlugin:playNextVisible',\n            this.onRecommendedVisible,\n            this,\n        );\n\n        this.listenTo(\n            this.player,\n            'nextShown',\n            this.onRecommendedVisible,\n            this,\n        );\n    }\n\n    onRecommendedVisible(event) {\n        if (event.ui === 'nextup') {\n            this.trigger('UiElement', {\n                id: this.player\n                    .getAsset({\n                        shouldLogDeprecatedWarning: false,\n                    })\n                    .getId(),\n                name: 'nextAssetCountdown',\n            });\n        }\n    }\n\n    destroy() {\n        this.stopListening();\n    }\n}\n\nexport default UiEvents;\n","import config from 'player/config';\n\nclass CategoryTree {\n    /**\n     * @param {string} vendor\n     */\n    constructor(vendor) {\n        this.vendor = vendor;\n    }\n\n    /**\n     * @returns {Promise<Map<number, SvpCategory>>}\n     */\n    fetch() {\n        if (!this.request) {\n            this.request = fetch(config.api.getUrl(this.vendor, '/categories'))\n                .then((response) => response.json())\n                .then((response) => {\n                    // eslint-disable-next-line\n                    if (response && response._embedded.categories) {\n                        // eslint-disable-next-line\n                        return response._embedded.categories;\n                    }\n\n                    return [];\n                })\n                .then((categories) => {\n                    this.categories = new Map(\n                        categories.map((category) => [category.id, category]),\n                    );\n                });\n        }\n        return this.request;\n    }\n\n    /**\n     * @param {number} categoryId\n     * @returns {SvpCategory[]}\n     */\n    getPath(categoryId) {\n        const path = [];\n        let category = this.categories?.get(categoryId);\n\n        if (category) {\n            path.push(category);\n\n            while (category.parentId !== 0) {\n                category = this.categories?.get(category.parentId);\n                path.unshift(category);\n            }\n        }\n\n        return path;\n    }\n}\n\n/**\n * @type {Record<string, CategoryTree>}\n */\nconst instances = {};\n\n/**\n * @param {string} vendor\n * @returns {CategoryTree}\n */\nexport default (vendor) => {\n    if (!instances[vendor]) {\n        instances[vendor] = new CategoryTree(vendor);\n    }\n\n    return instances[vendor];\n};\n","import { capitalizeFirstLetter } from 'utils/string';\nimport logger from 'utils/logger';\nimport utils from 'utils/utils';\nimport { isEmpty } from 'utils/underscore';\nimport configuration from 'player/config';\nimport PluginModel from './model';\nimport PulseTracker from './pulse-stats/tracker';\nimport AdEvents from './pulse-stats/ad-events';\nimport PlaybackEvents from './pulse-stats/playback-events';\nimport UiEvents from './pulse-stats/ui-events';\nimport CategoryTree from '../model/category-tree';\n\n/**\n * Retrieve tags from asset\n * @param asset\n */\nconst getTags = (asset) =>\n    (asset.get('tags') || [])\n        .filter((tag) => utils.isObject(tag) || !isEmpty(tag.tag))\n        .map(({ tag }) => tag);\n\nexport const getMediaAssetId = (provider, mediaId) =>\n    `sdrn:${provider}:mediaasset:${mediaId}`;\n\n/**\n * @param {string[]} accessControl\n * @param {string} provider\n * @param {{variant: {type: 'Subscription' | 'Login'}}} experiment\n * @returns {'Free' | 'Login' | 'Paid'}\n */\nexport const getAssetLevel = (accessControl, provider, experiment) => {\n    if (accessControl.length > 0) {\n        if (\n            accessControl.includes('login') ||\n            // special case for vgtv configuration - premium is login :)\n            (provider === 'vgtv' && accessControl.includes('premium'))\n        ) {\n            return 'Login';\n        }\n        return 'Paid';\n    }\n    if (experiment?.variant?.Type) {\n        if (experiment.variant.Type === 'Subscription') {\n            return 'Paid';\n        }\n        if (experiment.variant.Type === 'Login') {\n            return 'Login';\n        }\n    }\n    return 'Free';\n};\n\n/**\n * @param {string[]} accessControl\n * @param {{variant: {type: 'Subscription' | 'Login'}}} experiment\n * @returns {string}\n */\nexport const getAssetLevelName = (accessControl, experiment) => {\n    if (accessControl.length > 0) {\n        return accessControl.join(',');\n    }\n    if (experiment?.variant?.Type) {\n        return experiment.variant.Type;\n    }\n    return 'Free';\n};\n\nconst getImageUrl = (asset) => {\n    const image = asset.getThumbnail();\n\n    if (image) {\n        return `${image}?t[]=480q80`;\n    }\n\n    return undefined;\n};\n\n/**\n * Integration with Pulse Tracker\n * https://github.schibsted.io/spt-dataanalytics/pulse-autotracker\n *\n * @param options\n * @constructor\n */\nclass PulseStatsPlugin extends PluginModel {\n    constructor(options, experiment, isExperimentEnabled, isMockAsset) {\n        super(options);\n        this.provider = options.provider;\n        this.sdkConfig = options.sdkConfig;\n        this.decorator = options.decorator || ((data) => data);\n        this.intervals = {\n            ...(options?.engagementIntervals?.live && {\n                live: options.engagementIntervals.live,\n            }),\n            ...(options?.engagementIntervals?.vod && {\n                vod: options?.engagementIntervals?.vod,\n            }),\n        };\n        this.embed = options.embed === true;\n        this.previousAssetId = options.previousAssetId;\n        this.tracker = null;\n        this.experiment = experiment;\n        this.isExperimentEnabled = isExperimentEnabled;\n        this.isMockAsset = isMockAsset;\n        this.setupErrorEventEmitted = false;\n        this.tts = options.tts || { enabled: false };\n    }\n\n    // eslint-disable-next-line\n    getName() {\n        return 'PulseStats';\n    }\n\n    get jw() {\n        try {\n            return this.player.model.player || {};\n        } catch (e) {\n            return {};\n        }\n    }\n\n    get asset() {\n        const asset = this.playerAsset;\n        const additional = asset.get('additional') || {};\n        const accessControl = Object.keys(additional.access || {});\n        const tags = getTags(asset);\n\n        const data = {\n            assetType: capitalizeFirstLetter(asset.get('assetType')),\n            title: asset.get('title'),\n            // duration should be in seconds\n            duration: Math.round(asset.get('duration') / 1000),\n            imageUrl: getImageUrl(asset),\n        };\n\n        if (accessControl.length > 0) {\n            // @deprecated\n            data.accessControl = accessControl.join(',');\n        }\n\n        data.accessLevel = getAssetLevel(\n            accessControl,\n            asset.get('provider'),\n            this.experiment,\n        );\n        data.accessLevelName = getAssetLevelName(\n            accessControl,\n            this.experiment,\n        );\n\n        if (tags.length > 0) {\n            data.tags = tags;\n        }\n\n        // check if stream has category\n        if (asset.getCategory()) {\n            data.category = asset.getCategory().getId();\n        }\n\n        // delete duration from live assets\n        if (asset.getStreamType() === 'live') {\n            delete data.duration;\n        }\n\n        if (additional.originAssetId) {\n            data.originAssetId = additional.originAssetId;\n        }\n\n        if (this.tts.enabled) {\n            data.assetType = 'AudioTTS';\n        }\n\n        return data;\n    }\n\n    get apiUrl() {\n        const { url } = configuration.api;\n        const asset = this.playerAsset;\n        const protocol = !url.startsWith('http') ? 'https:' : '';\n        return `${protocol}${url}${asset.getVendor()}/assets/${asset.getId()}?appName=linkpulse`;\n    }\n\n    get isAutoplay() {\n        const autoplay = this.player.config.get('autoplay');\n        return autoplay === true || autoplay === 'viewable';\n    }\n\n    getCategoryPath(categoryId) {\n        if (typeof categoryId !== 'number') {\n            return null;\n        }\n\n        // check if id exist and create category path\n        if (!this.categoryPath) {\n            this.categoryPath = this.categoryTree\n                .getPath(categoryId)\n                .map((category) => category.title.toLowerCase())\n                .join(' > ');\n        }\n\n        return this.categoryPath;\n    }\n\n    /**\n     * Track Pulse event\n     * Defer tracking when Pulse library is not loaded yet\n     */\n    async track(eventName, eventData) {\n        const tracker = await this.getTracker();\n        const data = {};\n        Object.assign(\n            data,\n            eventData,\n            this.isExperimentEnabled && {\n                experiments: [\n                    {\n                        id: this.experiment.id,\n                        variant: this.experiment.variant\n                            ? this.experiment.variant.id\n                            : '0',\n                        platform: this.provider,\n                    },\n                ],\n            },\n        );\n        logger('Pulse').log(JSON.stringify(data, null, 4));\n        tracker.track(eventName, data);\n    }\n\n    async trackMediaEvent(data) {\n        try {\n            if (!this.isMockAsset) {\n                await this.categoryTree.fetch();\n            }\n            // category data is available on ready event\n            const categoryPath = this.getCategoryPath(data.object.category);\n\n            if (categoryPath) {\n                data.object.category = categoryPath;\n            }\n            await this.track(\n                'engagementEvent',\n                this.decorator(data, this.playerAsset),\n            );\n        } catch (e) {\n            logger('Pulse').log('Could not track event');\n        }\n    }\n\n    getTrackerOrNull() {\n        return new Promise((resolve) => {\n            const resolveTracker = () => resolve(this.tracker);\n\n            if (this.tracker !== null || this.setupErrorEventEmitted) {\n                resolveTracker();\n            } else {\n                this.once('ready', resolveTracker);\n                this.once('setupError', resolveTracker);\n            }\n        });\n    }\n\n    getTracker() {\n        return new Promise((resolve) => {\n            const resolveTracker = () => resolve(this.tracker);\n\n            if (this.tracker === null) {\n                this.once('ready', resolveTracker);\n            } else {\n                resolveTracker();\n            }\n        });\n    }\n\n    setup() {\n        // prevent asset to be changed with playnext before stream completes\n        this.playerAsset = this.player.getAsset({\n            shouldLogDeprecatedWarning: false,\n        });\n\n        this.categoryTree = CategoryTree(this.playerAsset.getVendor());\n\n        this.adEvents = new AdEvents(this.player);\n        this.playbackEvents = new PlaybackEvents(this.player, {\n            vodInterval: this.intervals.vod,\n            liveInterval: this.intervals.live,\n        });\n        this.uiEvents = new UiEvents(this.player);\n\n        // initialize only once\n        Promise.all([\n            PulseTracker.init(this.provider, this.sdkConfig),\n            this.isMockAsset ? null : this.categoryTree.fetch(),\n        ])\n            .then((data) => this.onReady(data))\n            .catch(() => {\n                this.setupErrorEventEmitted = true;\n                this.trigger('setupError');\n            });\n\n        this.listenTo(this.adEvents, 'all', this.onAdEvent, this);\n        if (!this.isMockAsset) {\n            this.listenTo(\n                this.playbackEvents,\n                'all',\n                this.onPlaybackEvent,\n                this,\n            );\n        }\n        this.listenTo(this.uiEvents, 'all', this.onUiEvent, this);\n    }\n\n    onReady(data) {\n        const [tracker] = data;\n\n        this.tracker = tracker;\n        this.trigger('ready');\n    }\n\n    attachSessionData(trackingData, data) {\n        const asset = this.playerAsset;\n        if (data.previousAssetId) {\n            trackingData.object.previousAssetId = getMediaAssetId(\n                asset.getVendor(),\n                data.previousAssetId,\n            );\n            trackingData.object.playbackSource = data.playbackSource;\n        } else if (this.previousAssetId) {\n            trackingData.object.previousAssetId = getMediaAssetId(\n                asset.getVendor(),\n                this.previousAssetId,\n            );\n            trackingData.object.playbackSource = 'config';\n        }\n    }\n\n    onPlaybackEvent(intent, data = {}) {\n        const asset = this.playerAsset;\n\n        /**\n         * Autoplay is not set for load method thus we use value set in player constructor\n         * For other events method of playback start is checked\n         * Autoplay is set to true when player actually autostarts or when its started with external call (.play())\n         */\n        const trackingData = {\n            intent,\n            '@type': 'Engagement',\n            position: data.position,\n            // duration is in ms\n            duration: data.duration * 1000,\n            object: {\n                '@id': getMediaAssetId(asset.getVendor(), asset.getId()),\n                '@type': 'MediaAsset',\n                name: asset.getTitle(),\n                muted: this.jw.getMute(),\n                fullscreen: this.jw.getFullscreen(),\n                accessControl: asset.accessControl || 'free',\n                autoplay:\n                    data.playMethod === null\n                        ? this.isAutoplay\n                        : data.playMethod === 'autostart' ||\n                          data.playMethod === 'external' ||\n                          data.playMethod === 'viewable',\n                adSequenceCount: data.count,\n                embed: this.embed,\n                streamType: asset.getStreamType(),\n                adblock: this.player.model.player.getAdBlock(),\n                apiUrl: this.apiUrl,\n                preview: Boolean(this.player.config.get('videoPreview')),\n                'spt:custom': {\n                    'spt:streamProviderId': asset.getVendor(),\n                },\n                ...this.asset,\n            },\n        };\n\n        const { adSequenceDuration } = this.adEvents.adData;\n        if (adSequenceDuration) {\n            trackingData.object.adSequenceDuration = adSequenceDuration;\n            trackingData.object.adSequenceCount = adSequenceDuration.length;\n        }\n\n        if (data.start === true) {\n            trackingData.start = true;\n        }\n\n        this.attachSessionData(trackingData, data);\n\n        this.trackMediaEvent(trackingData);\n    }\n\n    onAdEvent(intent, data) {\n        const asset = this.playerAsset;\n        const trackingData = {\n            intent,\n            '@type': 'Engagement',\n            position: data.position,\n            // position and duration are equal because ads does not allow to seek through content\n            // duration is in ms\n            duration: data.position && data.position * 1000,\n            object: {\n                '@id': `sdrn:${this.provider}:mediaad:${data.id}`,\n                '@type': 'MediaAd',\n                assetType: capitalizeFirstLetter(data.type),\n                muted: this.jw.getMute(),\n                fullscreen: this.jw.getFullscreen(),\n                autoplay: this.isAutoplay,\n                mediaAssetId: getMediaAssetId(asset.getVendor(), asset.getId()),\n                adSequenceCount: data.count,\n                adblock: this.player.model.player.getAdBlock(),\n                apiUrl: this.apiUrl,\n            },\n        };\n\n        if (data.adSequenceDuration) {\n            trackingData.object.adSequenceDuration = data.adSequenceDuration;\n            trackingData.object.adSequenceCount =\n                data.adSequenceDuration.length;\n        }\n\n        if (data.sequence) {\n            trackingData.object.adSequencePosition = data.sequence;\n            if (\n                data.adSequenceDuration &&\n                data.adSequenceDuration[data.sequence - 1]\n            ) {\n                trackingData.object.duration =\n                    data.adSequenceDuration[data.sequence - 1];\n            }\n        }\n\n        if (data.start === true) {\n            trackingData.start = true;\n        }\n\n        if (asset.getCategory()) {\n            trackingData.object.category = this.categoryTree\n                ?.getPath(asset.getCategory()?.getId())\n                .map((i) => i.title)\n                .join(' > ')\n                .toLocaleLowerCase();\n        }\n\n        this.attachSessionData(trackingData, this.playbackEvents.eventData);\n\n        return this.trackMediaEvent(trackingData);\n    }\n\n    async onUiEvent(eventName, data) {\n        const asset = this.playerAsset;\n        const trackingData = {\n            '@type': 'View',\n            object: Object.assign(data, {\n                '@id': getMediaAssetId(asset.getVendor(), data.id),\n                '@type': 'UIElement',\n                apiUrl: this.apiUrl,\n            }),\n        };\n\n        this.track('viewEvent', trackingData);\n    }\n\n    destroy() {\n        this.stopListening();\n\n        this.adEvents.destroy();\n        this.playbackEvents.destroy();\n    }\n}\n\nexport default PulseStatsPlugin;\n","import utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport PluginModel from './model';\n\nconst SVP_FLAG_NATIVE_LINK = 'svp-flag-native-link';\nconst SVP_NATIVE_LINK_OVERLAY = 'svp-native-link-overlay';\nconst SVP_NATIVE_LINK_BUTTON = 'svp-native-link-button';\nconst SVP_LOGIN_OVERLAY = 'svp-login-overlay';\n\n/**\n * Allowing using native link for playing podcasts on hermes apps\n *\n * @param options\n * @constructor\n */\nclass PodcastNativeLinkPlugin extends PluginModel {\n    constructor(options) {\n        super(options);\n        this.link = null;\n    }\n\n    // eslint-disable-next-line\n    getName() {\n        return 'PodcastNativeLinkPlugin';\n    }\n\n    setup() {\n        const asset = this.player.getAsset({\n            shouldLogDeprecatedWarning: false,\n        });\n\n        if (utils.device.isHermesApp()) {\n            this.link = `audio:${asset.getVendor()}:${asset.getId()}`;\n        }\n\n        this.listenToOnce(this.player, 'viewable', this.render, this);\n    }\n\n    render() {\n        if (!this.link) {\n            return;\n        }\n\n        const translations = locale.getTranslations();\n        const container = this.player.getContainer();\n\n        // do not show when there is login overlay\n        const loginOverlay = container.querySelector(`.${SVP_LOGIN_OVERLAY}`);\n        if (loginOverlay) {\n            return;\n        }\n\n        // Native link has unsupported format and cannot be created using JW utils.createElement\n        // @see https://github.schibsted.io/svp/web-player/issues/1003\n        const linkAnchor = document.createElement('a');\n        const linkSpan = document.createElement('span');\n        linkSpan.classList.add(SVP_NATIVE_LINK_BUTTON);\n        linkSpan.appendChild(\n            document.createTextNode(translations.player.listen),\n        );\n        linkAnchor.appendChild(linkSpan);\n        linkAnchor.classList.add(SVP_NATIVE_LINK_OVERLAY);\n        linkAnchor.setAttribute('href', this.link);\n\n        this.el = linkAnchor;\n\n        utils.addClass(container, SVP_FLAG_NATIVE_LINK);\n        container.appendChild(this.el);\n    }\n\n    destroy() {\n        if (this.el) {\n            const container = this.player.getContainer();\n\n            utils.removeClass(container, SVP_FLAG_NATIVE_LINK);\n\n            const overlay = container.querySelector(\n                `.${SVP_NATIVE_LINK_OVERLAY}`,\n            );\n            if (overlay) {\n                overlay.parentNode.removeChild(overlay);\n            }\n        }\n    }\n}\n\nexport default PodcastNativeLinkPlugin;\n","import logger from 'utils/logger';\n\n/**\n * events hashmap playerId -> eventBus\n * each player has its own events bus\n *\n * @type Record<string, Backbone.Events>\n */\nexport const events = {};\n\n/**\n * Homad AAB ads have single event bus for all players\n *\n * @param {CustomEvent} event\n */\nfunction parseHomadEvent(event) {\n    const details = event && event.detail;\n    // skip parsing when there is missing data or player is not registered\n    if (!details || !events[details.containerId]) {\n        return;\n    }\n\n    const {\n        // eslint-disable-next-line @typescript-eslint/no-unused-vars\n        name,\n        container,\n        containerId,\n        player,\n        videoTag,\n        videoTagId,\n        ...data\n    } = details;\n\n    logger('Homad').log(details.name, data);\n\n    events[details.containerId].trigger(details.name, data);\n}\n\nexport function translateHomadEvents() {\n    window.addEventListener('hdEvent', parseHomadEvent);\n}\n","/**\n * @typedef {'pre'|'mid'|'post'} PotOffset\n */\n/**\n * @typedef {Record<PotOffset, { offset: PotOffset; tag: string }>} AdSchedule\n */\n\n/**\n * @param {PotOffset} offset\n * @param {AdSchedule} adschedule\n * @returns {null|string}\n */\nfunction getAdPotTag(offset, adschedule) {\n    const keys = Object.keys(adschedule);\n    let tag;\n\n    keys.forEach(function (key) {\n        if (key.indexOf(offset) > -1) {\n            tag = adschedule[key].tag;\n        }\n    });\n\n    return tag;\n}\n\n/**\n * @param {PotOffset} potOffset\n * @returns {string|false}\n */\nfunction getTagUrl(potOffset) {\n    return function (player) {\n        const playlistItem = player.getPlaylist()[0];\n\n        let tag;\n        if (playlistItem.adschedule) {\n            tag = getAdPotTag(potOffset, playlistItem.adschedule);\n        }\n\n        /**\n         * @see https://docs.xandr.com/bundle/monetize_monetize-standard/page/topics/target-video-attributes-via-query-string-parameters.html\n         */\n        if (tag) {\n            return tag.replace('vmap', 'ssvmap');\n        }\n        return false;\n    };\n}\n\n/**\n * @typedef HomadConfig\n * @property {string} innerWarpper.style (yes, there is a typo)\n * @property {string} container.style\n * @property {string} video.style\n * @property {string} video.style.position\n * @property {*} video.attributes\n * @property {boolean} noClickThroughOnVideoTag\n * @property {*} outstream\n * @property {*} bypass\n * @property {*} tcf_config\n * @property {*} gdpr\n * @property {*} iqfix\n * @property {*} runInsideContainer\n * @property {*} use_videotag_as_container\n * @property {boolean} throwVideoTag\n * @property {*} vpaid\n * @property {*} takeover_ratio\n * @property {*} verticalizr\n * @property {*} ad_fallback\n * @property {*} ad_fallback_config\n * @property {*} skipOffset\n * @property {*} viewableImporession\n * @property {string} clickthrough_target\n * @property {*} welectPlacementTitle (yes, there is a typo)\n * @property {*} clickThroughBox\n * @property {string} globalConfig\n * @property {string} clientConfig\n * @property {boolean} skipable\n * @property {boolean} skipAdOnContextChange\n * @property {boolean} runInsideContainer\n * @property {boolean} adjustAdVolumeToContentPlayer\n * @property {boolean} postrollUseCompleteEvent\n * @property {number} zIndex\n * @property {string|((JWPlayer) => string)} prerollAdTag\n * @property {string|((JWPlayer) => string)} midrollAdTag\n * @property {string|((JWPlayer) => string)} postrollAdTag\n */\n\n/**\n * @type {HomadConfig}\n */\nexport const homadDefaultConfig = {\n    globalConfig:\n        'https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json',\n    clientConfig: '/homad-config.json',\n    skipable: true,\n    skipAdOnContextChange: true,\n    runInsideContainer: true,\n    adjustAdVolumeToContentPlayer: true,\n    postrollUseCompleteEvent: false,\n    noClientConfigCacheBuster: true,\n    // by default the ad opens in the same tab. _blank is often blocked\n    clickthrough_target: '_target',\n    zIndex: 200,\n    prerollAdTag: getTagUrl('pre'),\n    midrollAdTag: getTagUrl('mid'),\n    postrollAdTag: getTagUrl('post'),\n};\n","/**\n * @param {Homad} homad\n */\nconst createProxyMethods = (homad) => ({\n    /**\n     * @this {PlayerModel}\n     */\n    onFirstFrameLoad(onFirstFrameLoad) {\n        this.player.once(\n            'play',\n            function () {\n                this.player.once(\n                    'providerFirstFrame',\n                    function () {\n                        onFirstFrameLoad.call(this, this.playlistItemId);\n                    },\n                    this,\n                );\n            },\n            this,\n        );\n    },\n\n    /**\n     * @this {PlayerModel}\n     */\n    onTime(onTime, args) {\n        if (!this.adPlaying && !this.adPlayerLoading) {\n            onTime.apply(this, args);\n        }\n    },\n\n    /**\n     * @this {PlayerModel}\n     */\n    // eslint-disable-next-line consistent-return\n    onPlay(onPlay, args) {\n        if (!this.adPlayerLoading) {\n            onPlay.apply(this, args);\n        }\n    },\n    /**\n     * @this {PlayerModel}\n     */\n    onPause(onPause, args) {\n        if (this.adPlaying === false && !this.adPlayerLoading) {\n            onPause.apply(this, args);\n        }\n    },\n    /**\n     * @this {PlayerModel}\n     */\n    onComplete(onComplete, args) {\n        if (this.adPlaying === false && !this.adPlayerLoading) {\n            onComplete.apply(this, args);\n        } else {\n            this.listenToOnce(\n                homad,\n                'continueContent',\n                function () {\n                    onComplete.apply(this, args);\n                },\n                this,\n            );\n        }\n    },\n});\n\n/**\n * Override player methods to play well with Homad\n * @param {PlayerModel} player\n * @param {Homad} homad\n */\nexport const applyPlayerMixin = (player, homad) => {\n    const overrides = createProxyMethods(homad);\n    Object.keys(overrides).forEach((name) => {\n        const sourceMethod = player[name];\n\n        player[name] = function (...args) {\n            return overrides[name].call(player, sourceMethod, args);\n        };\n    });\n};\n","import utils from 'utils/utils';\n\nimport { events } from './homad/eventbus';\nimport { initializeHomadLib } from './homad/global';\nimport { applyPlayerMixin } from './homad/proxy';\nimport { waitForAdPlayer } from './homad/utils';\n\nclass Homad {\n    /**\n     * @param {PlayerModel} player\n     */\n    constructor(player) {\n        initializeHomadLib(player.config.get('aabConfig'));\n\n        this.player = player;\n        this.playerId = player.config.get('node');\n\n        // Proxy Homad global events related to current player instance\n        utils.extend(this, utils.Events);\n        if (!events[this.playerId]) {\n            events[this.playerId] = { ...utils.Events };\n        }\n        this.listenTo(events[this.playerId], 'all', this.trigger, this);\n\n        // Override SVP Player's methods\n        applyPlayerMixin(player, this);\n\n        this.on('contentPlayerPlay', this.onContentPlayerPlay, player);\n        this.on('adStart', this.onAdStart, player);\n        this.on('continueContent', this.onContinueContent, player);\n        this.on('adTime', this.onAdTime, player);\n        player.on('adError', this.onPlayerAdError, player);\n        player.on('adBreakStart', this.onPlayerAdBreakStart, player);\n        player.on('playlistItem', this.onPlayerPlaylistItem, player);\n        player.on('adPlay', this.onPlayerAdPlay, player);\n\n        this.on(\n            'adComplete adSkipped adPause adPlay',\n            this.forwardEventToPlayer,\n            this,\n        );\n\n        // Find Ad player's container and video elements\n        const node = player.getContainer();\n        waitForAdPlayer(node).then((dom) => {\n            this.container = dom.container;\n            this.video = dom.video;\n            this.playButton = dom.playButton;\n            this.muteButton = dom.muteButton;\n            this.trigger('initialize');\n        });\n    }\n\n    /**\n     * Remove player events from messaging bus\n     * Prevents memory leaks\n     */\n    destroy() {\n        this.off();\n        this.stopListening();\n        if (events[this.playerId]) {\n            events[this.playerId].off();\n            events[this.playerId].stopListening();\n\n            events[this.playerId] = null;\n            delete events[this.playerId];\n        }\n    }\n\n    /**\n     * @this {PlayerModel}\n     */\n    onContentPlayerPlay() {\n        this.getContainer().classList.remove('svp-homad-loading');\n    }\n\n    /**\n     * @this {PlayerModel}\n     * @param {object} data\n     * @param {\"preroll\"|\"midroll\"|\"postroll\"} data.state\n     * @param {number} data.duration\n     * @param {{ adID: string }[]} data.adIds\n     * @param {boolean} data.adPod\n     * @param {string} data.adsession_id\n     * @param {string} data.clickthrough\n     * @param {number} data.currentTime\n     * @param {string} data.homadImpressionAdId\n     */\n    onAdStart(data) {\n        this.adPosition = data.state;\n\n        if (this.adPlaying === false) {\n            this.trigger('adSlotStart', {\n                position: this.adPosition,\n            });\n\n            this.adPlaying = true;\n        }\n\n        this.trigger('adStarted', {\n            position: this.adPosition,\n            meta: {\n                duration: data.duration,\n                offset: 'pre',\n            },\n        });\n    }\n\n    /**\n     * @this {PlayerModel}\n     */\n    onContinueContent() {\n        this.getContainer().classList.remove('jw-flag-ads');\n\n        if (this.adPlaying === true) {\n            this.trigger('adSlotComplete', {\n                position: this.adPosition,\n            });\n\n            this.adPlaying = false;\n        }\n    }\n\n    /**\n     * @this {PlayerModel}\n     * @param {number} currentTime\n     * @param {number} duration\n     */\n    onAdTime({ currentTime, duration }) {\n        if (currentTime && this.adPlaying) {\n            this.trigger('adProgress', currentTime, duration);\n        }\n    }\n\n    /**\n     * Forward Homad event only if an ad is playing\n     * @param {string} eventName\n     */\n    forwardEventToPlayer(eventName) {\n        this.on(eventName, () => {\n            if (this.player.adPlaying) {\n                this.player.trigger(eventName);\n            }\n        });\n    }\n\n    /**\n     * @this {PlayerModel}\n     */\n    onPlayerAdError() {\n        const jw = this.player;\n        const container = this.getContainer();\n\n        this.hasAdBlocked = true;\n\n        // just to be sure\n        this.once(\n            'adStarted',\n            function () {\n                this.adPlayerLoading = false;\n            },\n            this,\n        );\n\n        this.once(\n            'adSlotComplete',\n            function () {\n                container.classList.remove('svp-homad-loading');\n            },\n            this,\n        );\n\n        this.listenToOnce(\n            jw,\n            'play',\n            function () {\n                this.adPlayerLoading = true;\n            },\n            this,\n        );\n\n        this.listenToOnce(\n            jw,\n            'pause',\n            function (options) {\n                // first external pause is triggered by homad\n                // this equals to ad tag loaded and parsed\n                if (options && options.pauseReason === 'external') {\n                    this.adPlayerLoading = false;\n                }\n            },\n            this,\n        );\n    }\n\n    /**\n     * @this {PlayerModel}\n     * @param {string} adposition\n     */\n    onPlayerAdBreakStart({ adposition } = {}) {\n        const duration = this.getDuration();\n        const currentTime = this.getCurrentTime();\n        const container = this.getContainer();\n\n        // homad has strange constraints for midroll\n        if (\n            adposition !== 'mid' ||\n            (currentTime > 30 && duration - currentTime > 30)\n        ) {\n            container.classList.add('svp-homad-loading');\n\n            // clean loading in case of any error\n            setTimeout(function () {\n                container.classList.remove('svp-homad-loading');\n            }, 5000);\n\n            this.listenToOnce(this.player, 'adPlay', () => {\n                container.classList.remove('svp-homad-loading');\n            });\n        }\n    }\n\n    // turn off ad player loading when there is no ads\n    /**\n     * @this {PlayerModel}\n     * @param playlistItem\n     */\n    onPlayerPlaylistItem(playlistItem) {\n        if (playlistItem.item && !playlistItem.item.adschedule) {\n            this.adPlaying = false;\n            this.adPlayerLoading = false;\n        }\n    }\n\n    /**\n     * @this {PlayerModel}\n     */\n    onPlayerAdPlay() {\n        this.adPlaying = true;\n        this.adPlayerLoading = false;\n    }\n}\n\nexport default Homad;\n","import { homadDefaultConfig } from './config';\nimport { translateHomadEvents } from './eventbus';\nimport homadLib from './lib';\n\nexport function initializeHomadLib(aabConfig) {\n    const SvpPlayer = (window.SVP && window.SVP.Player) || {};\n    if (SvpPlayer.isHomadLoaded) {\n        return;\n    }\n\n    SvpPlayer.isHomadLoaded = true;\n\n    const homadConfig = { ...homadDefaultConfig };\n\n    // override aab config url\n    if (aabConfig) {\n        homadConfig.clientConfig = aabConfig;\n    }\n\n    translateHomadEvents();\n    homadLib(homadConfig);\n}\n","/**\n * @typedef HomadDOM\n * @property {HTMLVideoElement} video\n * @property {HTMLDivElement} container\n * @property {HTMLImageElement} playButton\n * @property {HTMLImageElement} muteButton\n */\n\n/**\n * Get Ad Player from player container\n *\n * This function awaits for the HOMAD system to bootstrap in the DOM,\n * then finds the appropriate video tag and HOMAD's main container\n *\n * @param {HTMLDivElement} playerContainer\n * @return {Promise<HomadDOM>}\n */\nexport function waitForAdPlayer(playerContainer) {\n    return new Promise((resolve) => {\n        const handler = (event) => {\n            if (event.detail && event.detail.container === playerContainer) {\n                const videoElements = playerContainer.querySelectorAll('video');\n                const [video] = [...videoElements].filter((v) => !v.className);\n                if (video) {\n                    /**\n                     * [div] homad main container\n                     * └─ [div]\n                     *    ├─ [video] click event goes to the advertiser\n                     *    ├─ [div] time label\n                     *    ├─ [div] controls container\n                     *    │  ├─ [img] play button\n                     *    │  └─ [img] mute button\n                     *    └─ [div] overlay (to unpause)\n                     */\n                    const container = video.parentNode.parentNode;\n                    const controlsContainer =\n                        video.nextElementSibling.nextElementSibling;\n                    const [playButton, muteButton] =\n                        controlsContainer.childNodes;\n\n                    window.removeEventListener('hdEvent', handler);\n                    resolve({\n                        video,\n                        container,\n                        playButton,\n                        muteButton,\n                    });\n                }\n            }\n        };\n\n        window.addEventListener('hdEvent', handler);\n    });\n}\n","import utils from 'utils/utils';\nimport PluginModel from '../model';\nimport Homad from './homad';\n\nimport iconPause from './icons/pause.svg';\nimport iconPlay from './icons/play.svg';\nimport iconSpeaker from './icons/speaker.svg';\nimport iconSpeakerMuted from './icons/speaker-muted.svg';\nimport iconLink from './icons/link.svg';\nimport iconFullscreen from './icons/fullscreen.svg';\nimport { createElement } from './dom';\nimport { homadAdTracker } from './tracking';\n\n/**\n *\n * @param {number} duration duration in seconds\n */\nfunction formatTime(duration) {\n    const minutes = Math.floor(duration / 60);\n    const seconds = Math.floor(duration - minutes * 60);\n    return `${minutes.toString().padStart(2, '0')}:${seconds\n        .toString()\n        .padStart(2, '0')}`;\n}\n\nclass AABPlugin extends PluginModel {\n    // eslint-disable-next-line class-methods-use-this\n    getName() {\n        return 'AABPlugin';\n    }\n\n    initialize() {\n        this.elements = {};\n\n        this.handleAdLabelClick = this.handleAdLabelClick.bind(this);\n        this.handlePlayPauseClick = this.handlePlayPauseClick.bind(this);\n        this.handleMuteClick = this.handleMuteClick.bind(this);\n        this.handleFullscreenClick = this.handleFullscreenClick.bind(this);\n    }\n\n    setup() {\n        // anti adblock works only for desktops\n        if (utils.device.getDeviceType() !== 'desktop') {\n            return;\n        }\n\n        this.player.once('ready', () => {\n            const aab = this.player.config.get('aab');\n            if (aab === true) {\n                // force loading when mode is set to \"true\"\n                this.initializeHomad();\n            } else if (aab === 'auto') {\n                // detect if adblock exist for \"auto\" mode\n                if (this.player.model.getAdBlock()) {\n                    this.initializeHomad();\n                } else {\n                    this.player.model.player.once('adBlock', () => {\n                        this.initializeHomad();\n                    });\n                }\n            }\n        });\n    }\n\n    initializeHomad() {\n        const pulse = this.player.getPlugin('PulseStats');\n        this.homad = new Homad(this.player.model);\n        homadAdTracker(this.player.model, this.homad, pulse);\n        this.homad.once('initialize', this.onHomadReady, this);\n    }\n\n    /**\n     * Initialize ad player\n     */\n    onHomadReady() {\n        this.createControls(this.homad.container);\n\n        this.hideHomadNativeControls();\n\n        this.player.getContainer().classList.remove('jw-state-buffering');\n\n        this.attachEventListeners();\n        this.onMuteToggle({ type: this.homad.video.muted ? 'mute' : 'unmute' });\n\n        const { setAdPlaying, setAdComplete } = this.getPlaybackState();\n        this.player.model.once('adSlotStart', setAdPlaying);\n        this.player.model.once('adSlotComplete', setAdComplete);\n    }\n\n    destroy() {\n        if (this.homad) {\n            this.homad.destroy();\n        }\n        this.detachEventListeners();\n        super.destroy();\n    }\n\n    hideHomadNativeControls() {\n        const { container } = this.homad;\n        const [mainDiv] = [...container.childNodes].filter(\n            (c) => c.childNodes.length > 0,\n        );\n        [...mainDiv.childNodes].forEach((element) => {\n            if (element.tagName.toLowerCase() !== 'video') {\n                element.style.cssText =\n                    'display: none !important; z-index: unset !important';\n            }\n        });\n    }\n\n    /**\n     * @param {HTMLDivElement} container Homad main element\n     */\n    createControls(container) {\n        const muteButton = createElement('button', {});\n        const playButton = createElement('button', {});\n        const fullscreenButton = createElement('button', {});\n\n        playButton.innerHTML = iconPause;\n        fullscreenButton.innerHTML = iconFullscreen;\n\n        const labelText = createElement('strong', {}, 'ANNONSE (00:00)');\n        const iconPlaceholder = createElement('div', {});\n        iconPlaceholder.innerHTML = iconLink;\n\n        const label = createElement(\n            'a',\n            {\n                href: '#',\n                target: '_blank',\n                rel: 'noopener',\n            },\n            [\n                iconPlaceholder,\n                createElement('div', { class: 'aab-labels' }, [\n                    labelText,\n                    createElement('span', {}, 'Gå til annonsør'),\n                ]),\n            ],\n        );\n\n        // Controlbar\n        const controls = createElement(\n            'div',\n            {\n                class: 'aab-layout',\n            },\n            [\n                createElement('div', { class: 'aab-controls' }, [muteButton]),\n                createElement('div', { class: 'aab-spacer' }),\n                createElement('div', { class: 'aab-controls' }, [\n                    playButton,\n                    label,\n                    createElement('div', {\n                        class: 'aab-spacer',\n                    }),\n                    fullscreenButton,\n                ]),\n            ],\n        );\n\n        this.elements = {\n            muteButton,\n            playButton,\n            fullscreenButton,\n            labelText,\n            label,\n            controls,\n        };\n\n        // Append the whole controls' container to the DOM\n        container.appendChild(controls);\n    }\n\n    attachEventListeners() {\n        const { label, muteButton, fullscreenButton, playButton } =\n            this.elements;\n\n        label.addEventListener('click', this.handleAdLabelClick);\n        muteButton.addEventListener('click', this.handleMuteClick);\n        fullscreenButton.addEventListener('click', this.handleFullscreenClick);\n        playButton.addEventListener('click', this.handlePlayPauseClick);\n\n        this.listenTo(this.homad, 'adPlay', this.onAdPlay, this);\n        this.listenTo(this.homad, 'adPause', this.onAdPause, this);\n        this.listenTo(this.homad, 'adTime', this.onAdTime, this);\n        this.listenTo(this.homad, 'mute unmute', this.onMuteToggle, this);\n    }\n\n    detachEventListeners() {\n        try {\n            const { label, muteButton, fullscreenButton, playButton } =\n                this.elements;\n            label.removeEventListener('click', this.handleAdLabelClick);\n            muteButton.removeEventListener('click', this.handleMuteClick);\n            fullscreenButton.removeEventListener(\n                'click',\n                this.handleFullscreenClick,\n            );\n            playButton.removeEventListener('click', this.handlePlayPauseClick);\n        } catch (err) {\n            // noop\n        }\n    }\n\n    onAdPlay() {\n        this.elements.playButton.innerHTML = iconPause;\n    }\n\n    onAdPause() {\n        this.elements.playButton.innerHTML = iconPlay;\n    }\n\n    onAdTime() {\n        const { duration, currentTime } = this.homad.video;\n        const { labelText } = this.elements;\n        labelText.innerText = `ANNONSE (${formatTime(duration - currentTime)})`;\n    }\n\n    handleAdLabelClick(event) {\n        const { video } = this.homad;\n        video.click();\n        video.pause();\n        event.preventDefault();\n    }\n\n    handlePlayPauseClick() {\n        this.homad.playButton.click();\n    }\n\n    onMuteToggle({ type }) {\n        const { muteButton } = this.elements;\n        muteButton.innerHTML = type === 'mute' ? iconSpeakerMuted : iconSpeaker;\n    }\n\n    getPlaybackState() {\n        const playerClassList = this.player.getContainer().classList;\n        const adStarted = ['jw-flag-ads', 'svp-homad-playing'];\n\n        const useClasses = (add, remove) => {\n            playerClassList.add(...add);\n            playerClassList.remove(...remove);\n        };\n\n        return {\n            setAdPlaying: () => useClasses(adStarted, ['svp-homad-loading']),\n            setAdComplete: () => useClasses([], adStarted),\n        };\n    }\n\n    handleFullscreenClick() {\n        try {\n            const jwplayer = this.player.model.player;\n            jwplayer.setFullscreen();\n        } catch (e) {\n            // fullscreen did not work\n        }\n    }\n\n    handleMuteClick() {\n        this.homad.muteButton.click();\n    }\n}\n\nexport default AABPlugin;\n","/**\n * @param {PlayerModel} player\n * @param {Homad} homad\n * @param {PulseStatsPlugin} pulse\n */\nexport function homadAdTracker(player, homad, pulse) {\n    let adSequencePosition = 0;\n    let adSequenceCount = 0;\n    let adIds = [];\n\n    if (pulse) {\n        const resetSequence = () => {\n            adSequencePosition = 0;\n            adSequenceCount = 0;\n        };\n\n        /**\n         * @param {Object} data Homad event details\n         * @param {{ adID: string }[]} data.adIds\n         * @param {'preroll'|'midroll'|'postroll'} data.state\n         * @param {number} data.duration\n         * @param {number} data.currentTime\n         */\n        const onHomadAdStart = (data) => {\n            const { adEvents } = pulse;\n\n            if (!adSequencePosition) {\n                adSequenceCount = data.adIds.length;\n            }\n\n            adSequencePosition += 1;\n            adIds = [...data.adIds];\n            const { adID } = adIds[adIds.length - 1];\n\n            Object.assign(adEvents.adData, {\n                type: data.state,\n                // duration in milliseconds\n                duration: data.duration * 1000,\n                // Both Homad and JWplayer can't seem to poroperly extract adId value from VAST response\n                // This bug prevents Watch and Complete tracking events from being dispatched\n                // We're going to use homadImpressionAdId until this is fixed for Homad\n                id: adID || data.homadImpressionAdId,\n                sequence: adSequencePosition,\n                podcount: adSequenceCount,\n                position: 0,\n            });\n\n            // Simulate 'adEvents.onAdMeta' call\n            if (!adEvents.adData.adSequenceDuration) {\n                adEvents.adData.adSequenceDuration = Array(adSequenceCount);\n            }\n\n            if (data.state === 'preroll') {\n                // duration in seconds\n                adEvents.adData.adSequenceDuration[adSequencePosition - 1] =\n                    data.duration;\n            }\n\n            // Trigger Pulse MediaAd:Play event\n            adEvents.onAdPlay();\n        };\n\n        const onHomadAdPause = () => {\n            pulse.adEvents.onAdPause();\n        };\n\n        const onHomadAdTime = (data) => {\n            pulse.adEvents.onAdProgress(data.currentTime);\n        };\n\n        // MediaAd.Watch\n        homad.on('adTime', onHomadAdTime);\n\n        // MediaAd.Play\n        homad.on('adStart', onHomadAdStart);\n\n        // MediaAd.Pause\n        homad.on('adPause', onHomadAdPause);\n\n        // MediaAd.Stop\n        homad.on('adComplete', pulse.adEvents.onAdFinished, pulse.adEvents);\n\n        player.on('playlistItem', resetSequence);\n        homad.on('adRequest', resetSequence);\n    }\n}\n","import utils from 'utils/utils';\nimport videoPreviewHelper from 'utils/video-preview';\nimport locale from '../model/locale';\n\n/**\n * @param {Object} playlistItem\n * @param {number} playlistItem.id\n */\nfunction playNextFromPlaylist(playlistItem) {\n    const { asset } = this;\n    const { masterAsset } = this.model;\n\n    if (!asset || !masterAsset || asset.getId() === playlistItem.id) {\n        return;\n    }\n\n    const nextAssetData =\n        masterAsset.getId() === playlistItem.id\n            ? utils.extend({}, masterAsset.attributes)\n            : masterAsset\n                  .get('playlist')\n                  .find((assetData) => assetData.id === playlistItem.id);\n\n    if (!nextAssetData) {\n        return;\n    }\n\n    this.setAsset(nextAssetData);\n}\n\n/**\n * Player initialized and single playlistItem is laoded\n * @param {Object} playlistItem\n */\nexport function onPlaylistItem(playlistItem) {\n    const container = this.getContainer();\n    // add class for live streams\n\n    utils.removeClass(container, 'svp-player-live');\n\n    if (this.model.getStream().isLive()) {\n        utils.addClass(container, 'svp-player-live');\n\n        const icon = container.getElementsByClassName('jw-icon-display')[0];\n\n        if (icon) {\n            // add translation for live button via data-label\n            icon.setAttribute('data-label', locale.translate('Live button'));\n        }\n    }\n\n    const videoElement = container.querySelector('video.jw-video');\n\n    if (videoElement) {\n        videoElement.loop = this.config.get('repeat');\n    }\n\n    if (\n        !this.model.config.shouldApplyTextToSpeechSkin() &&\n        !this.model.stream.isAudio()\n    ) {\n        videoPreviewHelper.addVideoPreviewElement.call(this);\n    }\n\n    playNextFromPlaylist.call(this, playlistItem);\n\n    this.trigger('playlistItem');\n}\n","/**\n * Stream completed, fired for every item in playlist\n * Clear settings which are only for one stream\n * @param {string} reason\n */\nexport function onComplete(reason) {\n    if (!this.isCompleted) {\n        this.isCompleted = true;\n\n        this.config.set('time', null);\n        this.config.set('chapter', null);\n\n        this.trigger('complete', reason);\n    }\n}\n","import { onPlaylistItem } from './playlist';\nimport { onComplete } from './complete';\nimport { onError } from './error';\n\n/**\n * Remove single plugin instance\n * Clear all listeners\n * Remove from plugins hashmap\n *\n * @param {PluginModel} plugin\n */\nexport function destroyPlugin(plugin) {\n    if (plugin.off) {\n        plugin.off();\n    }\n    plugin.destroy();\n\n    this.stopListening(plugin);\n    delete this.plugins[plugin.getName()];\n}\n\n/**\n * Proxy player events\n */\nexport function onPlayerEvent(event, ...args) {\n    let callFunction;\n\n    switch (event) {\n        case 'playlistItem':\n            callFunction = onPlaylistItem.bind(this, ...args);\n            break;\n        case 'complete':\n            callFunction = onComplete.bind(this, ...args);\n            break;\n        case 'error':\n            callFunction = onError.bind(this, ...args);\n            break;\n        default:\n            callFunction = this.trigger.bind(this, event, ...args);\n    }\n\n    callFunction();\n}\n","import utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport ServerTime from 'utils/server-time';\nimport Asset from '../model/asset';\nimport NextAsset from '../model/next-asset';\nimport Stream from '../model/stream';\nimport PausePlugin from '../plugins/pause';\nimport AgeLimitPlugin from '../plugins/age-limit';\nimport SponsorLabelPlugin from '../plugins/sponsor-label';\nimport PodcastExperimentPlugin, {\n    prepareVariantsForExperiment,\n    chooseVariant,\n} from '../plugins/podcast-experiment';\nimport CountdownPlugin from '../plugins/countdown';\nimport RecommendedPlugin from '../plugins/recommended';\nimport PulseStatsPlugin from '../plugins/pulse-stats';\nimport PodcastNativeLinkPlugin from '../plugins/podcast-native-link';\nimport AABPlugin from '../plugins/anti-adblock';\nimport statusCode from '../playback/config/status-codes';\n\nimport { clearError, onError } from './error';\nimport { destroyPlugin } from './helpers';\n\n/**\n * this always points to Player object\n * @memberOf {Player}\n */\nexport async function onAssetReady() {\n    const { config: configuration } = this;\n\n    const stream = new Stream(this.asset.attributes);\n    const settings = configuration.getSettings();\n    const node = document.getElementById(configuration.get('node'));\n    const hasPlaylist = stream.hasPlaylist();\n\n    if (node) {\n        clearError(node);\n    }\n\n    // turn off recommended plugin for all tts assets\n    if (this.model.config.shouldApplyTextToSpeechSkin(stream)) {\n        this.config.set('recommended', false);\n    }\n\n    const isAssetFromPlaylist = this.model.isAssetFromPlaylist(stream.getId());\n\n    if (!isAssetFromPlaylist) {\n        const masterAsset = hasPlaylist\n            ? new Asset(utils.extend({}, this.asset.attributes))\n            : null;\n        this.model.setMasterAsset(masterAsset);\n    }\n\n    // add hasNext checking\n    stream.set(\n        'hasNext',\n        !hasPlaylist ||\n            !isAssetFromPlaylist ||\n            !stream.isDisabledNextVideo() ||\n            NextAsset.hasPlayNext(this.asset),\n    );\n\n    if (this.asset.get('access')) {\n        const access = Object.keys(this.asset.get('access'))[0] || null;\n        stream.set('access', access);\n    }\n\n    configuration.setStream(stream);\n\n    // cleanup plugins as they maybe not required for new stream\n    utils.each(this.plugins, destroyPlugin, this);\n\n    this.addPlugin(new AABPlugin());\n\n    // set start time if chapter is provided (not applicable for playlists)\n    if (!hasPlaylist && !isAssetFromPlaylist && configuration.get('chapter')) {\n        const chapter = this.asset.getChapter(configuration.get('chapter'));\n\n        if (chapter) {\n            stream.set('playAhead', chapter.timeline);\n        }\n    }\n\n    // set playahead time\n    if (!isAssetFromPlaylist && configuration.get('time')) {\n        stream.set('playAhead', configuration.get('time'));\n    }\n\n    if (configuration.hasRecommended()) {\n        this.addPlugin(\n            new RecommendedPlugin({\n                settings: configuration.getRecommended(),\n            }),\n        );\n    }\n\n    // stream is not available yet, display countdown\n    if (\n        stream.getTimeToStart() > 0 &&\n        !configuration.get('disableCountdownPlugin')\n    ) {\n        // countdown is disable in preview mode on non live streams\n        if (settings.preview !== true || stream.isLive()) {\n            this.addPlugin(\n                new CountdownPlugin({\n                    streamStart: new Date(\n                        ServerTime.getTime() + stream.getTimeToStart() * 1000,\n                    ),\n                }),\n            );\n\n            // play stream after countdown ends\n            this.on('countdown:end', this.play, this);\n        }\n    }\n\n    if (this.asset.getAgeLimit() > -1) {\n        this.addPlugin(\n            new AgeLimitPlugin({\n                ageLimit: this.asset.getAgeLimit(),\n                settings: configuration.getAgeLimit(),\n            }),\n        );\n    }\n\n    if (configuration.get('showSponsorLabel') && this.asset.isSponsored()) {\n        this.addPlugin(\n            new SponsorLabelPlugin({\n                sponsor: this.asset.getCategory().getTitle(),\n            }),\n        );\n    }\n\n    const metadata = this.asset.get('metadata') || {};\n\n    let experiment;\n    let isExperimentEnabled;\n    // do not load an experiment feature when the player is in preview mode\n    const isPodcastWithExperiment =\n        settings.preview !== true &&\n        metadata.experimentId &&\n        metadata.isPodcast === 'true';\n\n    if (isPodcastWithExperiment) {\n        try {\n            let experimentRange = JSON.parse(\n                sessionStorage.getItem('svpExperimentRange'),\n            );\n            if (!experimentRange) {\n                experimentRange = Math.random() * 100;\n                sessionStorage.setItem(\n                    'svpExperimentRange',\n                    JSON.stringify(experimentRange),\n                );\n            }\n            experiment = {\n                id: metadata.experimentId,\n                variant: chooseVariant({\n                    variants: prepareVariantsForExperiment(metadata),\n                    rangeNumber: experimentRange,\n                }),\n            };\n\n            const userStatusCfg = configuration.get('userStatus');\n            let userStatus = {};\n            if (typeof userStatusCfg === 'function') {\n                userStatus = await userStatusCfg(this.asset);\n            } else {\n                userStatus = await (userStatusCfg || {});\n            }\n            if (\n                userStatus.loggedIn &&\n                !userStatus.hasProduct &&\n                experiment.variant.Type === 'Subscription'\n            ) {\n                isExperimentEnabled = true;\n            } else if (userStatus.loggedIn) {\n                isExperimentEnabled = false;\n            } else {\n                isExperimentEnabled = true;\n            }\n\n            if (isExperimentEnabled) {\n                this.addPlugin(\n                    new PodcastExperimentPlugin(experiment, {\n                        loginUrl: await configuration.get('loginUrl'),\n                        subscriptionUrl:\n                            await configuration.get('subscriptionUrl'),\n                        articleUrl: await configuration.get('articleUrl'),\n                    }),\n                );\n            }\n        } catch (error) {\n            logger('ExperimentPlugin').error(\n                'An error occur while initializing experiment',\n                error,\n            );\n        }\n    }\n\n    /**\n     * Disable Pulse tracking for mock/ads only playback\n     */\n\n    const pulseConfig = configuration.get('pulse');\n    if (pulseConfig?.provider) {\n        this.addPlugin(\n            new PulseStatsPlugin(\n                {\n                    ...pulseConfig,\n                    tts: {\n                        enabled: stream.hasTextSpeech(),\n                    },\n                },\n                experiment,\n                isExperimentEnabled,\n                stream.isMock(),\n            ),\n        );\n    }\n\n    this.addPlugin(new PausePlugin());\n\n    if (\n        (stream.isAudio() || configuration.shouldApplyTextToSpeechSkin()) &&\n        configuration.get('nativeLink') !== false\n    ) {\n        this.addPlugin(new PodcastNativeLinkPlugin());\n    }\n\n    // set stream to display error\n    this.model.setStream(stream);\n\n    configuration\n        .isStreamPlayable()\n        .then(() => {\n            // restart asset state\n            // this.isCompleted = false;\n            this.trigger('assetReady');\n        })\n        .catch(({ code, referenceId }) => {\n            this.trigger('assetError', {\n                message: statusCode(code),\n                code,\n                referenceId,\n            });\n\n            onError.call(this, {\n                type: 'assetError',\n                // message is translated in next functions\n                message: statusCode(code),\n                code,\n                referenceId,\n            });\n        });\n}\n","/* eslint-disable no-multi-assign */\n\nconst loadedStylesheets = [];\n\n/**\n * @param {string} href\n * @param {() => void} onSuccess\n * @param {() => void} onError\n */\n// eslint-disable-next-line consistent-return\nfunction loadStylesheet(href, onSuccess, onError) {\n    if (loadedStylesheets.indexOf(href) > -1) {\n        return onSuccess();\n    }\n\n    const callback = onSuccess || function () {};\n    const head = document.getElementsByTagName('head')[0];\n    const link = document.createElement('link');\n\n    link.rel = 'stylesheet';\n    link.type = 'text/css';\n    link.href = href;\n\n    let done = false;\n\n    link.onreadystatechange = link.onload = function () {\n        if (\n            !done &&\n            (!this.readyState ||\n                this.readyState === 'loaded' ||\n                this.readyState === 'complete')\n        ) {\n            done = true;\n            callback();\n\n            // Handle memory leak in IE\n            link.onload = link.onreadystatechange = null;\n        }\n    };\n\n    link.onerror = function () {\n        loadedStylesheets.splice(loadedStylesheets.indexOf(href), 1);\n        onError();\n    };\n\n    loadedStylesheets.push(href);\n    head.appendChild(link);\n}\n\n/**\n * @param {string} path\n */\nexport const styleLoader = (path) =>\n    new Promise((resolve, reject) => {\n        loadStylesheet(path, resolve, reject);\n    });\n","import utils from 'utils/utils';\n/**\n * Check if preroll is scheduled in configuration\n *\n * @param {*} config\n * @returns {boolean}\n */\nfunction hasPreroll(config) {\n    const playlistItem = config && config.playlist[0];\n    let result = false;\n\n    if (playlistItem.adschedule) {\n        utils.each(playlistItem.adschedule, function (slot) {\n            if (slot && slot.offset === 'pre') {\n                result = true;\n            }\n        });\n    }\n\n    return result;\n}\n\n/**\n * Check if given stream can be autoplayed\n * Rules for autoplay depends on device but also on flags given to playback\n *\n * @deprecated new autoplay policies require starting of video to detect if autoplay will work\n * @param {*} config - JW Configuration\n * @returns {boolean}\n */\nfunction canAutoplay(config) {\n    var canDeviceAutoplay = utils.device.canAutoplay();\n\n    // enable autoplay for devices with disabled ads and at least muted autoplay ability ios10\n    var result = canDeviceAutoplay === 'always';\n\n    if (canDeviceAutoplay === 'muted' && !hasPreroll(config)) {\n        result = true;\n    }\n\n    return result;\n}\n\nexport default {\n    canAutoplay: canAutoplay,\n};\n","import utils from 'utils/utils';\nimport * as icons from 'icons';\nimport * as audioIcons from 'icons/audio';\n\n/** @type {object<string, SVGElement>} */\nconst iconsMap = {\n    '.jw-svg-icon-play': icons.play,\n    '.jw-svg-icon-pause': icons.pause,\n    '.jw-skip-icon .jw-svg-icon-next': icons.chevronRight,\n    '.jw-svg-icon-settings': icons.settings,\n    '.jw-svg-icon-sharing': icons.share,\n\n    '.jw-svg-icon-cc-on': icons.captions,\n    '.jw-svg-icon-cc-off': icons.captions,\n\n    '.jw-svg-icon-volume-0': icons.audioMuted,\n    '.jw-svg-icon-volume-50': icons.audioHalf,\n    '.jw-svg-icon-volume-100': icons.audio,\n\n    '.jw-svg-icon-fullscreen-on': icons.fullscreenOn,\n    '.jw-svg-icon-fullscreen-off': icons.fullscreenOff,\n\n    info: icons.info,\n};\n\n/** @type {object<string, SVGElement>} */\nconst audioIconsMap = Object.freeze({\n    '.jw-svg-icon-play': audioIcons.playIcon,\n    '.jw-svg-icon-pause': audioIcons.pauseIcon,\n    '.jw-svg-icon-replay': audioIcons.replayIcon,\n    '.jw-svg-icon-rewind': audioIcons.rewind10Icon,\n\n    '.jw-svg-icon-volume-0': audioIcons.audioOffIcon,\n    '.jw-svg-icon-volume-50': audioIcons.audioHalfIcon,\n    '.jw-svg-icon-volume-100': audioIcons.audioOnIcon,\n});\n\n/**\n * @param {string} name\n */\nexport function getIcon(name) {\n    return iconsMap[name];\n}\n\n/**\n * @param withAudioIcons\n * @return {object<string, SVGElement>}\n */\nfunction getReplaceableIconsMap(withAudioIcons) {\n    if (!withAudioIcons) {\n        return iconsMap;\n    }\n\n    return utils.merge(iconsMap, audioIconsMap);\n}\n\n/**\n * @param {PlayerModel} svpPlayer\n */\nexport default function loadIcons(svpPlayer) {\n    const jwPlayer = svpPlayer.player;\n    const stream = svpPlayer.getStream();\n    const isAudioStream = stream ? stream.isAudio() : false;\n    const replaceableIconsMap = getReplaceableIconsMap(isAudioStream);\n\n    jwPlayer.once('playlist', () => {\n        const container = svpPlayer.getContainer();\n\n        utils.each(replaceableIconsMap, (customIcon, selector) => {\n            const replaceableIcons = Array.prototype.slice.call(\n                container.querySelectorAll(selector),\n            );\n\n            if (!replaceableIcons.length) {\n                return;\n            }\n\n            utils.each(replaceableIcons, (replaceableIcon) => {\n                if (!replaceableIcon) {\n                    return;\n                }\n\n                const svpIcon = utils.createNode(customIcon);\n                svpIcon.setAttribute(\n                    'class',\n                    replaceableIcon.getAttribute('class'),\n                );\n                replaceableIcon.parentNode.replaceChild(\n                    svpIcon,\n                    replaceableIcon,\n                );\n            });\n        });\n    });\n}\n","import { ensureIfControlsLoaded } from './jw-controls';\n\nconst submenuHandler = async (container) => {\n    await ensureIfControlsLoaded(container);\n\n    container\n        .querySelector('.jw-controlbar .jw-button-container')\n        .addEventListener('click', (event) => {\n            const { target } = event;\n\n            // eslint-disable-next-line no-console\n            if (\n                target.classList.contains('jw-settings-submenu-button') ||\n                target.classList.contains('jw-settings-sharing')\n            ) {\n                const submenu = container.querySelector('.jw-settings-menu');\n\n                const right = Math.round(\n                    container.offsetWidth -\n                        (target.offsetLeft + target.offsetWidth / 2) -\n                        submenu.offsetWidth / 2,\n                );\n\n                submenu.style.right = `${right}px`;\n            }\n        });\n};\n\nexport default (svpPlayer) => {\n    if (!svpPlayer.player.getControls()) {\n        return;\n    }\n\n    svpPlayer.on('ready', () => submenuHandler(svpPlayer.getContainer()));\n};\n","import { getConfig } from '../config/sharing';\n\nconst FACEBOOK_SHARE_URL = 'http://www.facebook.com/sharer/sharer.php?u=';\nconst TWITTER_SHARE_URL = 'https://twitter.com/intent/tweet?url=';\n\n/**\n * Check if link uses JW MEDIAID replacement\n * @param link\n * @return {*|boolean}\n */\nconst hasMediaId = (link) => link && link.indexOf('MEDIAID') > -1;\n\n/**\n * Create sharing url to services like twitter or facebook\n *\n * @param root\n * @param link\n * @return {string}\n */\nconst getSharingLink = (root, link = window.location.href) =>\n    `${root}${encodeURIComponent(link)}`;\n\n/**\n * Update node element only if exists and value is correctly set\n * @param el\n * @param value\n */\nconst updateElement = (el, value) => {\n    if (el && value) {\n        el.value = value;\n    }\n};\n\n/**\n * Replace JW Sharing button event listener\n *\n * @param sourceEl\n * @param link\n */\nconst replaceElement = (sourceEl, link) => {\n    if (sourceEl) {\n        const newEl = sourceEl.cloneNode(true);\n        sourceEl.parentNode.replaceChild(newEl, sourceEl);\n\n        newEl.addEventListener(\n            'click',\n            () => {\n                window.open(link, '_blank');\n            },\n            true,\n        );\n    }\n};\n\n/**\n * Update JW sharing box to work with our playnext\n *\n * @param container\n * @param stream\n * @param options\n */\nconst updateSharingBox = (container, stream, options) => {\n    const { link, code } =\n        getConfig({\n            stream,\n            options,\n        }) || {};\n\n    // mediaid is supported natively so we do not touch anything when it's passed\n    if (code && hasMediaId(code) === false) {\n        updateElement(\n            container.querySelector(\n                '.jw-sharing-copy[aria-label=embed] .jw-sharing-textarea',\n            ),\n            code,\n        );\n    }\n\n    // link can be undefined\n    if (link && hasMediaId(link) === false) {\n        updateElement(\n            container.querySelector(\n                '.jw-sharing-copy[aria-label=link] .jw-sharing-textarea',\n            ),\n            link,\n        );\n\n        // this is tricky way to replace JW sharing buttons\n        // facebook and twitter are replaced with custom sharing elements\n        // this allows dynamic configuration via function\n        replaceElement(\n            container.querySelector('.jw-sharing-link[aria-label=facebook]'),\n            getSharingLink(FACEBOOK_SHARE_URL, link),\n        );\n        replaceElement(\n            container.querySelector('.jw-sharing-link[aria-label=twitter]'),\n            getSharingLink(TWITTER_SHARE_URL, link),\n        );\n    }\n};\n\nexport default (svpPlayer) => {\n    svpPlayer.on('initialPlay', () =>\n        updateSharingBox(\n            svpPlayer.getContainer(),\n            svpPlayer.getStream(),\n            svpPlayer.config.get('sharing'),\n        ),\n    );\n};\n","import utils from 'utils/utils';\nimport { APPNEXUS_PROVIDER_ID } from 'player/services/api';\n\nconst APPNEXUS_CLASS_NAME = 'svp-appnxs';\nconst SVP_FLAG_STOPPED = 'svp-flag-stopped';\n\nconst handleAppnexusClass = (container, vendor) => {\n    // handle ads only playback\n    // class name is scrambled to avoid adblockers\n    if (vendor === APPNEXUS_PROVIDER_ID) {\n        utils.addClass(container, APPNEXUS_CLASS_NAME);\n    } else {\n        utils.removeClass(container, APPNEXUS_CLASS_NAME);\n    }\n};\n\nexport { APPNEXUS_CLASS_NAME, SVP_FLAG_STOPPED, handleAppnexusClass };\n\nexport default function (svpPlayerModel) {\n    svpPlayerModel.on('playlistItem', () => {\n        const container = svpPlayerModel.getContainer();\n\n        handleAppnexusClass(container, svpPlayerModel.getStream().getVendor());\n\n        container.classList.remove(SVP_FLAG_STOPPED);\n    });\n\n    svpPlayerModel.on('complete', (reason) => {\n        const container = svpPlayerModel.getContainer();\n\n        if (reason === 'stop') {\n            container.classList.add(SVP_FLAG_STOPPED);\n        }\n    });\n}\n","const getLevelSettingsIcon = (container) =>\n    container.querySelector('.jw-icon-settings');\n\nconst handleLevelSettingsIcon = (data, icon) => {\n    if (icon) {\n        icon.style.display = '';\n\n        // hide settings icon when there is only one level available\n        // usually this is a case for iOS or when hls has limited bitrate\n        if (data && data.levels && data.levels.length === 1) {\n            icon.style.display = 'none';\n        }\n    }\n};\n\nexport default (svpPlayer) => {\n    svpPlayer.on(\n        'playlistItem',\n        function () {\n            this.listenToOnce(svpPlayer.player, 'levels', (levels) =>\n                handleLevelSettingsIcon(\n                    levels,\n                    getLevelSettingsIcon(svpPlayer.getContainer()),\n                ),\n            );\n        },\n        this,\n    );\n};\n","/**\n * @param {PlayerModel & Eventable} svpPlayerModel\n * @returns {HTMLDivElement}\n */\nfunction getTitleNode(svpPlayerModel) {\n    const container = svpPlayerModel.getContainer();\n    return container.getElementsByClassName('jw-nextup-title')[0];\n}\n\n/**\n * @param {PlayerModel & Eventable} svpPlayerModel\n */\nexport default function (svpPlayerModel) {\n    const { player: jwPlayer } = svpPlayerModel;\n\n    jwPlayer.on('nextShown', (playlistItem) => {\n        const nextUpTitle = getTitleNode(svpPlayerModel);\n        nextUpTitle.innerHTML =\n            playlistItem.itemsShown[0].svp.stream.get('title');\n    });\n\n    jwPlayer.on('nextAutoAdvance', () => {\n        const nextUpTitle = getTitleNode(svpPlayerModel);\n        nextUpTitle.innerHTML = '';\n    });\n\n    jwPlayer.on('nextClick', () => {\n        const nextUpTitle = getTitleNode(svpPlayerModel);\n        nextUpTitle.innerHTML = '';\n    });\n}\n","import { styleLoader } from 'utils/style-loader';\n\nimport audioSkinResolver from './skin/audioSkinResolver';\nimport loadIcons, { getIcon } from './skin/icons-loader';\nimport settingsMenu from './skin/settings-menu';\nimport configButton from './skin/config-button';\nimport sharingBox from './skin/sharing-box';\nimport { ttsSkinResolver } from './skin/tts-skin';\nimport { floatingSkinResolver } from './skin/floating-skin';\nimport containerClass from './skin/container-class';\nimport levelsIcon from './skin/levels-icon';\nimport nextUp from './skin/nextUp';\n\n/**\n * @param {object} jwConfig\n * @param {function} loader\n * @return {object}\n */\nexport function skinLoader(jwConfig, loader = styleLoader) {\n    // disable multiple loading of JW skin\n    if (jwConfig.skin && jwConfig.skin.url) {\n        loader(jwConfig.skin.url);\n\n        if (jwConfig.skin.name) {\n            jwConfig.skin = {\n                name: jwConfig.skin.name,\n            };\n        } else {\n            delete jwConfig.skin;\n        }\n    }\n\n    return jwConfig;\n}\n\n/**\n * Load SVP Skin\n *\n * @param {PlayerModel} svpPlayerModel\n */\nexport default function svpSkin(svpPlayerModel) {\n    ttsSkinResolver(svpPlayerModel);\n    audioSkinResolver(svpPlayerModel);\n    settingsMenu(svpPlayerModel);\n    configButton(svpPlayerModel, {\n        icon: getIcon('info'),\n    });\n    loadIcons(svpPlayerModel);\n    sharingBox(svpPlayerModel);\n    containerClass(svpPlayerModel);\n    levelsIcon(svpPlayerModel);\n    nextUp(svpPlayerModel);\n    floatingSkinResolver(svpPlayerModel);\n}\n","import locale from 'player/model/locale';\n\nexport function floatingSkinResolver(svpPlayer) {\n    svpPlayer.on('adSlotStart', () => {\n        const container = svpPlayer.getContainer();\n        const floatBarTitle = container.querySelector('.jw-float-bar-title');\n        if (floatBarTitle) {\n            container.querySelector('.jw-float-bar-title').innerHTML =\n                locale.getTranslations().player?.close;\n        }\n    });\n}\n","import { copyToClipboard } from 'utils/clipboard';\n\nexport default (svpPlayer, { icon }) => {\n    if (!svpPlayer.player.getControls()) {\n        return;\n    }\n\n    let isLoaded = false;\n\n    svpPlayer.once('ready', () => {\n        const container = svpPlayer.getContainer();\n\n        container.addEventListener(\n            'contextmenu',\n            () => {\n                if (isLoaded === false) {\n                    const item = container.querySelectorAll(\n                        '.jw-rightclick-list .jw-rightclick-item',\n                    )[0];\n                    if (!item) {\n                        return;\n                    }\n\n                    item.classList.add('svp-config-link');\n\n                    const infoNode = document.createElement('span');\n                    infoNode.innerHTML = icon;\n                    infoNode.classList.add('jw-icon', 'svp-config-info');\n                    infoNode.dataset.tip = 'Click to copy';\n\n                    item.appendChild(infoNode);\n\n                    infoNode.addEventListener(\n                        'click',\n                        async () => {\n                            const config = svpPlayer.config.dump();\n\n                            infoNode.classList.add('svp-link-tip');\n                            infoNode.dataset.tip = 'Copied';\n\n                            copyToClipboard(config);\n\n                            setTimeout(() => {\n                                infoNode.classList.remove('svp-link-tip');\n                            }, 300);\n                        },\n                        false,\n                    );\n\n                    isLoaded = true;\n                }\n            },\n            false,\n        );\n    });\n};\n","const copyToClipboard = (data) => {\n    const el = document.createElement('textarea');\n    el.value = data;\n    el.setAttribute('readonly', '');\n    el.style.position = 'absolute';\n    el.style.left = '-9999px';\n    document.body.appendChild(el);\n    el.focus();\n    el.select();\n\n    try {\n        document.execCommand('copy');\n    } catch (err) {\n        // eslint-disable-next-line no-console\n        console.log('Unable to copy');\n    }\n\n    document.body.removeChild(el);\n};\n\nexport { copyToClipboard };\n","import utils from 'utils/utils';\nimport device from 'utils/device';\nimport logger from 'utils/logger';\nimport autoplay from './config/autoplay';\nimport appnexus from './ads/appnexus';\nimport preventAdSeeking from './ads/prevent-seeking';\nimport { onAdEventImpression } from './ads/relevant-yield';\n\nimport { youboraSdk } from './youbora';\nimport svpSkin, { skinLoader } from './skin';\n\n/**\n * Indicates if adblock has been detected\n * @type {boolean}\n * */\nlet adBlockDetected = false;\n\nfetch('https://ib.adnxs.com/', { method: 'HEAD', mode: 'no-cors' }).catch(\n    () => {\n        adBlockDetected = true;\n    },\n);\n\n/**\n * TODO: Incomplete type?\n * @typedef AdBreak\n * @prtoperty {string} type\n * @property {number} offset\n * @property {Object} vmap\n */\n\n/**\n * @param {Config} config\n */\nconst PlayerModel = function (config) {\n    /**\n     * JW Player instance\n     * @type {jwplayer.JWPlayer}\n     */\n    this.player = null;\n    /**\n     * @type {Stream}\n     */\n    this.stream = null;\n    /**\n     * @type {Config}\n     */\n    this.config = config;\n\n    this.isInitalized = false;\n\n    /**\n     * Indicates whenever stream was was stopped\n     * @type {boolean}\n     */\n    this.isStopped = false;\n\n    /**\n     * Current playlist item\n     *\n     * @type {PlaylistItem|null}\n     */\n    this.playlistItem = null;\n\n    /**\n     * Current time holder for seek and seeked events\n     * Fix for JW getPosition bug\n     * @type {number|null}\n     */\n    this.currentTime = null;\n\n    /**\n     * Store an asset with playlist to allow load pulse data properly on replay whole playlist\n     * @type {Asset|null}\n     */\n    this.masterAsset = null;\n\n    /**\n     * Indicates if ads are currently playing\n     * @type {boolean}\n     */\n    this.adPlaying = false;\n\n    /**\n     * Adposition\n     *\n     * @type {null} preroll|midroll|postroll\n     */\n    this.adPosition = null;\n\n    /**\n     * Ad Breaks - stores the list of all ad breaks\n     *\n     * @type {AdBreak[]}\n     */\n    this.adBreaks = [];\n};\n\n/**\n * Forward JW Events without any change of them as they fits our needs\n *\n * List of proxied events\n * 'play', 'pause'\n *\n * @param {string} event\n */\nfunction forwardEvent(event) {\n    this.listenTo(this.player, event, this.trigger.bind(this, event));\n}\n\n/**\n * Simple proxy for JW Methods\n *\n * @param {string} method\n * @returns {Function}\n */\nfunction bindJwMethod(method) {\n    return function () {\n        const args = Array.prototype.slice.call(arguments);\n\n        if (!this.player) {\n            // eslint-disable-next-line no-console\n            console.warn(\n                `Method ${method} called before player has been initialised`,\n            );\n            return null;\n        }\n\n        return this.player[method].apply(this, args);\n    };\n}\n\n/**\n * Proxy methods from JW\n * @param {string[]} methods\n * @returns {Record<string, Function>}\n */\nfunction forwardMethods(methods) {\n    const forwardedMethods = {};\n\n    utils.each(\n        methods,\n        function (method) {\n            forwardedMethods[method] = bindJwMethod.call(this, method);\n        },\n        this,\n    );\n\n    return forwardedMethods;\n}\n\n/**\n * @param {'pre'|'mid'|'post'} slotId\n * @returns {'preroll'|'midroll'|'postroll'}\n */\nfunction getAdPosition(slotId) {\n    const slotKeys = { pre: 'preroll', mid: 'midroll', post: 'postroll' };\n\n    return slotKeys[slotId];\n}\n\nfunction normalizeAspectRatio(aspectRatio = 16 / 9) {\n    return parseFloat(aspectRatio.toFixed(2));\n}\n\n/**\n * @param {object} meta\n */\nexport function deriveAspectRatioFromAd(meta) {\n    let width = 16;\n    let height = 9;\n\n    try {\n        switch (meta.client) {\n            case 'googima': {\n                const adData = meta.ima.ad.data;\n                width = adData.vastMediaWidth || width;\n                height = adData.vastMediaHeight || height;\n                break;\n            }\n            case 'vast': {\n                const node = meta.response.querySelector(\n                    `Ad:nth-child(${\n                        meta.sequence || 1\n                    }) MediaFile:last-of-type`,\n                );\n                width = parseInt(node.getAttribute('width'), 10) || width;\n                height = parseInt(node.getAttribute('height'), 10) || height;\n\n                break;\n            }\n            default:\n                break;\n        }\n\n        return normalizeAspectRatio(width / height);\n    } catch (err) {\n        // noop\n    }\n\n    return undefined;\n}\n\n/**\n * @typedef AdData\n * @property {number} sequence\n * @property {number} count\n * @property {Object} meta\n */\n\n/**\n * Parse adresponse for each adslot\n *\n * @param {{response?: XMLDocument}} data\n * @returns {AdData & { source: string; raw?: Element }}\n */\nfunction parseAdData(data) {\n    const { sequence } = data;\n    const xml = data && data.response;\n\n    let source = 'WRAPPER';\n    let adSelector = 'Ad';\n    let adData = null;\n\n    if (xml) {\n        // only when additional data is given we set source to appnexus\n        if (xml.URL === data.tag) {\n            source = 'INLINE';\n            adSelector = `Ad[sequence=\"${sequence}\"]`;\n        }\n\n        adData = Array.prototype.slice.call(xml.querySelectorAll(adSelector));\n        // get first element if available\n        adData = adData && adData[0] ? adData[0] : null;\n    }\n\n    return {\n        sequence: sequence,\n        count: data.podcount,\n        raw: adData,\n        source: source,\n        meta: data,\n    };\n}\n\n/**\n * Initialize playback end method\n * Clear after each completion of stream or playbackEnd reached\n *\n * @param {number} playbackEnd\n */\nfunction onPlaybackEndAvailable(playbackEnd) {\n    const onTime = (position) => {\n        if (position > playbackEnd) {\n            //\n            this.trigger('playbackEnd', Math.round(position));\n        }\n    };\n\n    this.on('time', onTime);\n\n    this.once('playbackEnd complete', function () {\n        this.off('time', onTime);\n    });\n}\n\n/**\n * Adjusts player volume to 100% for audio assets under mobile devices or text to speech assets\n * @this {PlayerModel}\n */\nfunction adjustAudioVolumeOnMobile() {\n    const isMobileAudio = device.isMobile() && this.stream.isAudio();\n    if (isMobileAudio && !this.player.getMute()) {\n        this.player.setVolume(100);\n    }\n}\n\n/**\n * Extended ready event with info about device autoplay ability\n * @param {*} options\n * @param {*} eventData\n */\nfunction onReady(options, eventData) {\n    this.trigger('ready', utils.extend(options, eventData));\n\n    adjustAudioVolumeOnMobile.call(this);\n}\n\nPlayerModel.prototype = {\n    initialize() {\n        this.player = jwplayer(this.config.get('node'));\n        this.trigger('initialize');\n    },\n\n    setup() {\n        this.initialize();\n\n        // player could not be setup\n        if (!this.player.setup) {\n            // eslint-disable-next-line no-console\n            console.error(\n                `SVP Player initialization error. DOM ${this.config.get(\n                    'node',\n                )} not found`,\n            );\n            return;\n        }\n\n        this.getConfig().then((config) => {\n            // speedup lookup\n            const { player } = this;\n\n            // load youbora only for non-mock streams and 1% traffic\n            let youboraRatio = Math.random() < 0.01;\n            player.setup(config);\n\n            svpSkin(this);\n            preventAdSeeking(this);\n\n            // set 1% of views for muted autoplayed videos\n            if (\n                player.getMute() === true &&\n                (config.autostart === true || config.autostart === 'viewable')\n            ) {\n                youboraRatio = Math.random() < 0.005;\n            }\n\n            if (\n                this.stream &&\n                !this.stream.isMock() &&\n                !this.config.isPreviewMode() &&\n                (youboraRatio ||\n                    this.stream.hasAccess() ||\n                    youboraSdk.forceLoad)\n            ) {\n                youboraSdk.initialize(this.player, {\n                    accountCode: 'schibsted',\n                    enableAnalytics: true,\n                });\n            }\n            logger('JW').log('config', config);\n\n            // forward native JW events without changing their behaviour\n            utils.each(\n                [\n                    'seek',\n                    'displayClick',\n                    'captionsChanged',\n                    'adPause',\n                    'adPlay',\n                    'autostartNotAllowed',\n                    'adClick',\n                    'fullscreen',\n                    'volume',\n                    'mute',\n                    'nextShown',\n                    'nextAutoAdvance',\n                    'nextClick',\n                    'relatedReady',\n                    'playlistComplete',\n                    'playbackRateChanged',\n                    'cast',\n                    'float',\n                ],\n                forwardEvent,\n                this,\n            );\n\n            this.listenTo(player, 'error setupError', this.onError, this);\n            this.listenTo(\n                player,\n                'playlistItem',\n                this.onPlaylistItemLoad,\n                this,\n            );\n\n            this.listenTo(player, 'play', this.onPlay, this);\n            this.listenTo(player, 'pause', this.onPause, this);\n            this.listenTo(player, 'complete', this.onComplete, this);\n            this.listenTo(\n                player,\n                'ready',\n                onReady.bind(this, {\n                    canAutoplay: autoplay.canAutoplay(config),\n                }),\n            );\n\n            this.listenTo(player, 'mute', () => {\n                adjustAudioVolumeOnMobile.call(this);\n            });\n\n            this.listenTo(player, 'time', this.onTime, this);\n            this.listenTo(player, 'viewable', this.onViewable, this);\n            this.listenTo(\n                player,\n                'autostartNotAllowed',\n                this.onAutostartNotAllowed,\n                this,\n            );\n\n            this.listenTo(player, 'meta', this.onMeta, this);\n\n            this.listenTo(\n                player,\n                'adsManager',\n                ({ adsManager }) => {\n                    adsManager.addEventListener(\n                        window.google.ima.AdEvent.Type.IMPRESSION,\n                        onAdEventImpression,\n                    );\n                },\n                this,\n            );\n            this.listenTo(\n                player,\n                'metadataCueParsed',\n                this.onMetadataCueParsed,\n                this,\n            );\n\n            this.listenTo(\n                player,\n                'seek',\n                function (data) {\n                    this.currentTime = data.offset;\n                },\n                this,\n            );\n            this.listenTo(\n                player,\n                'seeked',\n                function () {\n                    this.trigger('seeked', this.currentTime);\n                    // clearing has to occur after seekend event as getCurrentTime needs it\n                    this.currentTime = null;\n                },\n                this,\n            );\n\n            this.once(\n                'initialPlay',\n                function () {\n                    this.listenToOnce(\n                        player,\n                        'captionsList',\n                        function () {\n                            this.trigger(\n                                'captionsList',\n                                this.getCaptionsList(),\n                            );\n                        },\n                        this,\n                    );\n                },\n                this,\n            );\n\n            this.on('initialPlay', () => {\n                this.isStopped = false;\n            });\n\n            this.listenTo(\n                player,\n                'adImpression',\n                function (data) {\n                    if (data && data.adposition) {\n                        this.adPosition = getAdPosition(data.adposition);\n                    }\n\n                    if (this.adPlaying === false) {\n                        this.trigger('adSlotStart', {\n                            position: this.adPosition,\n                            response: data && data.response,\n                            meta: data,\n                        });\n\n                        this.adPlaying = true;\n                    }\n\n                    this.trigger('adStarted', {\n                        position: this.adPosition,\n                        response: data && data.response,\n                        meta: data,\n                        aspectRatio: deriveAspectRatioFromAd(data),\n                    });\n\n                    if (data && data.response) {\n                        this.trigger('adData', parseAdData(data));\n                    }\n                },\n                this,\n            );\n\n            this.listenTo(\n                player,\n                'adError',\n                function (data) {\n                    if (data) {\n                        if (data.adposition) {\n                            this.adPosition = getAdPosition(data.adposition);\n                        }\n                        this.trigger('adError', data);\n                    }\n                },\n                this,\n            );\n\n            this.listenTo(\n                player,\n                'adTime',\n                function (data) {\n                    if (data.position && data.duration) {\n                        this.trigger(\n                            'adProgress',\n                            data.position,\n                            data.duration,\n                        );\n                    }\n                },\n                this,\n            );\n\n            this.on(\n                'adSlotStart',\n                function () {\n                    this.listenToOnce(\n                        player,\n                        'adBreakEnd',\n                        function () {\n                            if (this.adPlaying === true) {\n                                this.trigger('adSlotComplete', {\n                                    position: this.adPosition,\n                                });\n\n                                this.adPlaying = false;\n                            }\n                        },\n                        this,\n                    );\n                },\n                this,\n            );\n\n            this.listenTo(\n                player,\n                'adSkipped',\n                function () {\n                    this.trigger('adSkipped');\n                },\n                this,\n            );\n\n            this.listenTo(\n                player,\n                'adComplete',\n                function () {\n                    this.trigger('adFinished');\n                },\n                this,\n            );\n\n            this.listenTo(\n                player,\n                'adSchedule',\n                function (data) {\n                    this.adBreaks = data.adbreaks || [];\n                },\n                this,\n            );\n\n            this.listenTo(\n                player,\n                'adBreakEnd',\n                function ({ offset }) {\n                    // find the next ad with the distance less or equal 1s to the current one\n                    const nextAd = this.adBreaks.find(\n                        (ad) => ad.offset > offset && ad.offset - offset <= 1,\n                    );\n                    if (nextAd) {\n                        // workaround: using setTimeout to make seek work\n                        setTimeout(() => this.player.seek(nextAd.offset));\n                    }\n                },\n                this,\n            );\n\n            this.listenTo(\n                player,\n                'adLoadedXML',\n                function (data) {\n                    if (data && data.xml) {\n                        this.trigger('adLoadedXML', data.xml);\n                    }\n                },\n                this,\n            );\n\n            this.isInitalized = true;\n\n            logger('JW').log((log) => {\n                this.listenTo(player, 'all', function (event) {\n                    if (['bufferChange'].indexOf(event) < 0) {\n                        log(event, Array.prototype.slice.call(arguments, 1));\n                    }\n                });\n            });\n\n            this.trigger('setup');\n\n            if (adBlockDetected) {\n                this.player.trigger('adBlock');\n            }\n        });\n    },\n\n    /**\n     * @param {Stream} stream\n     * @param {boolean} [disableAutoplay]\n     */\n    playNext(stream, { disableAutoplay }) {\n        // clear time\n        this.stream = stream;\n\n        this.complete('playNext');\n\n        if (!this.isInitalized) {\n            this.setup();\n        } else {\n            this.getConfig(stream).then((config) => {\n                this.player.load(config.playlist);\n\n                if (disableAutoplay) {\n                    return;\n                }\n\n                // stream is not available yet, display countdown\n                if (stream.getTimeToStart() < 0) {\n                    // enable autoplay if stream is not available\n                    this.player.play(true);\n                } else {\n                    this.player.stop();\n                }\n            });\n        }\n    },\n\n    /**\n     * @param {Asset|null} [asset=null]\n     */\n    setMasterAsset(asset = null) {\n        this.masterAsset = asset;\n    },\n\n    /**\n     * Checks if the current playlist contains a given asset\n     * @param {number} assetId\n     * @returns {boolean}\n     */\n    isAssetFromPlaylist(assetId) {\n        return (\n            this.masterAsset != null &&\n            (this.masterAsset.getId() === assetId ||\n                this.masterAsset\n                    .get('playlist')\n                    .some((assetData) => assetData.id === assetId))\n        );\n    },\n\n    /**\n     * Immediately completes currently playing stream\n     */\n    complete() {\n        this.adPlaying = false;\n\n        // trigger complete event only when stream is not finished to prevent double 'complete' event triggering\n        if (\n            this.getCurrentTime() > 0 &&\n            this.getCurrentTime() !== this.getDuration()\n        ) {\n            this.trigger('complete');\n        }\n    },\n\n    /**\n     * Get DOM Node where player is inserted\n     * @returns {HTMLElement}\n     */\n    getContainer() {\n        return this.player.getContainer();\n    },\n\n    /**\n     * @returns {jwplayer.JWPlayer}\n     */\n    getPlayer() {\n        return this.player;\n    },\n\n    /**\n     * Get playback volume\n     * @returns {number}\n     */\n    getVolume() {\n        return this.player.getVolume();\n    },\n\n    /**\n     * Set playback volume\n     * @param {number} volume\n     */\n    setVolume(volume) {\n        this.player.setVolume(volume);\n    },\n\n    /**\n     * Get playback rate\n     * @returns {number}\n     */\n    getPlaybackRate() {\n        return this.player.getPlaybackRate();\n    },\n\n    /**\n     * Set playback rate\n     * @param {number} rate\n     */\n    setPlaybackRate(rate) {\n        this.player.setPlaybackRate(rate);\n    },\n\n    /**\n     * Get mute flag\n     * @returns {boolean}\n     */\n    getMute() {\n        return this.player.getMute();\n    },\n\n    /**\n     * Set mute param in player\n     * @param {boolean} [value]\n     */\n    setMute(value) {\n        this.player.setMute(value);\n    },\n\n    /**\n     * Seek\n     * @param {number} time\n     */\n    seek(time) {\n        this.player.seek(time);\n    },\n\n    /**\n     * Get player config. Method is asynchronous due to loading info from api\n     *\n     * @param {Stream} stream\n     */\n    getConfig(stream) {\n        const nextStream = stream || this.getStream();\n\n        return this.config\n            .getJwConfig(nextStream)\n            .then(skinLoader)\n            .catch((reason) => {\n                this.trigger('error', reason);\n            });\n    },\n\n    /**\n     * Set stream data\n     *\n     * @param {Stream} stream\n     */\n    setStream(stream) {\n        this.stream = stream;\n    },\n\n    /**\n     * Get current stream loaded with player\n     *\n     * @returns {Stream|null}\n     */\n    getStream() {\n        return this.stream;\n    },\n\n    /**\n     * Check is ad is playing or not\n     * @returns {boolean}\n     */\n    isAdPlaying() {\n        return this.adPlaying;\n    },\n\n    /**\n     * Load given stream\n     * Perform all required checks before stream playback\n     *\n     * @returns {Promise<void>}\n     */\n    loadStream() {\n        return new Promise((resolve) => {\n            // for lazy loaded player\n            if (!this.isInitalized) {\n                this.setup();\n                this.player.on('ready', resolve);\n            } else {\n                resolve();\n            }\n        });\n    },\n\n    /**\n     * Play stream\n     */\n    play() {\n        // ensure stream is loaded properly\n        this.loadStream().then(this.player.play.bind(this.player));\n    },\n\n    /**\n     * Pause stream\n     * @param force state\n     */\n    pause(force) {\n        this.player.pause(force);\n    },\n\n    /**\n     * Stop playback\n     * @returns {Promise<void>}\n     */\n    async stop() {\n        // playlistitemId is set when first frame is shown\n        // stop shouldn't change stream when it was not played\n        if (this.isStopped === false) {\n            this.trigger('complete', 'stop');\n\n            const { playlist } = await this.getConfig();\n\n            this.player.load(playlist);\n            this.player.stop();\n\n            // reset playlist item to allow replaying this stream\n            this.playlistItem = null;\n\n            this.isStopped = true;\n        }\n    },\n\n    /**\n     * Destroy the player instance, reset DOM, clean up listeners\n     */\n    remove() {\n        this.trigger('remove');\n        this.off();\n\n        if (this.player) {\n            this.pause(true);\n\n            this.player.remove();\n            this.player.off();\n        }\n    },\n\n    /**\n     * Get stream duration\n     *\n     * @returns {number}\n     */\n    getDuration() {\n        const duration = this.player.getDuration();\n\n        if (duration < 0) {\n            return -duration;\n        }\n\n        return duration;\n    },\n\n    /**\n     * Get current playback time\n     *\n     * @returns {number}\n     */\n    getCurrentTime() {\n        let { currentTime } = this;\n\n        if (currentTime) {\n            return currentTime;\n        }\n\n        // player not initialized (error/geoblock)\n        // return 0\n        if (!this.player) {\n            return 0;\n        }\n\n        currentTime = this.player.getPosition();\n\n        if (currentTime < 0) {\n            return this.getDuration() + currentTime;\n        }\n\n        return this.player.getPosition();\n    },\n\n    /**\n     * @returns {string}\n     */\n    getState() {\n        if (this.isAdPlaying()) {\n            return 'adPlaying';\n        }\n\n        return this.player.getState();\n    },\n\n    /**\n     * @returns {boolean}\n     */\n    getFloating() {\n        return this.player.getFloating();\n    },\n\n    /**\n     * @param {boolean} shouldFloat\n     */\n    setFloating(shouldFloat) {\n        return this.player.setFloating(shouldFloat);\n    },\n\n    /**\n     * @returns {boolean|undefined}\n     */\n    // eslint-disable-next-line consistent-return\n    getAdBlock() {\n        return adBlockDetected;\n    },\n\n    /**\n     * Get poster for current stream\n     * Poster may be changed in config\n     *\n     * @param {Stream} stream\n     * @param {HTMLElement} container\n     * @returns {string|null}\n     */\n    getPoster(stream, container) {\n        return this.config.getPoster(stream, container);\n    },\n\n    /**\n     * Get list of captions extended by data from api\n     *\n     * @returns {{ id: string; label: string; language?: string; default?: boolean }[]}\n     */\n    getCaptionsList() {\n        const playerCaptions = this.player.getCaptionsList();\n        const captions = this.getStream().getCaptions();\n\n        // merge player captions data with result from api\n        utils.each(playerCaptions, (caption) => {\n            utils.each(captions, (item) => {\n                if (caption.id === item.url) {\n                    caption.language = item.language;\n                    caption.default = item.default;\n                }\n            });\n        });\n\n        return playerCaptions;\n    },\n\n    /**\n     * Set current captions\n     * @param {number|string} index string is language key, number is index in array\n     */\n    setCurrentCaptions(index) {\n        let newIndex = index || 0;\n\n        if (!utils.isNumber(index)) {\n            utils.each(this.getCaptionsList(), (caption, captionsIndex) => {\n                if (caption && caption.language === index) {\n                    newIndex = captionsIndex;\n                }\n            });\n\n            // fallback to off in case index is not found in captions array\n            if (!utils.isNumber(newIndex)) {\n                newIndex = 0;\n            }\n        }\n\n        // set captions in player\n        this.player.setCurrentCaptions(newIndex);\n    },\n\n    /**\n     * Handle all errors from player\n     */\n    onError(data) {\n        logger('SVP').error(data);\n        const { code } = data;\n        const message = data.message ? data.message.toString() : '';\n\n        /**\n         * Some errors do not prevent playback to play\n         * thus they should be omitted\n         */\n        const skipErrors = [\n            'Captions failed to load', // could not load\n            'Casting failed to load', // chrome disabled\n        ];\n\n        // skip errors\n        if (skipErrors.indexOf(message) > -1) {\n            return;\n        }\n\n        this.trigger('error', {\n            message,\n            code,\n        });\n    },\n\n    /**\n     * Event triggered before first stream play\n     * Useful for statistics\n     * @param {PlaylistItem} playlistItem\n     */\n    onPlaylistItemLoad(playlistItem) {\n        // cleanup any previous beforePlay event (playnext after countdown or error)\n        this.stopListening(this.player, 'beforePlay');\n\n        // trigger this event every time new playlist item is loaded\n        this.listenToOnce(\n            this.player,\n            'beforePlay',\n            function () {\n                if (this.stream.getTimeToStart() < 0) {\n                    this.trigger('initialPlay');\n                }\n            },\n            this,\n        );\n\n        // ads should not if stream has future start time\n        // attach event only for secure streams\n        if (this.stream.isSecure()) {\n            // reload playlist only if token expired\n            // play method do this out of the box\n            this.listenToOnce(\n                this.player,\n                'displayClick',\n                function () {\n                    if (\n                        !this.config.hasValidToken() &&\n                        this.player.getState() !== 'playing'\n                    ) {\n                        this.play();\n                    }\n                },\n                this,\n            );\n        }\n\n        this.trigger('playlistItem', playlistItem.item);\n\n        // clear ad playing flag for current content\n        // important when changing stream while adslot is playing\n        this.adPlaying = false;\n\n        this.listenToOnce(this.player, 'firstFrame', () => {\n            this.playlistItemId = playlistItem.item.id;\n            this.onFirstFrameLoad(this.playlistItemId);\n        });\n\n        this.playlistItem = playlistItem.item;\n\n        // for streams which end time is not equal to video length\n        const playbackEndTime = this.stream.getPlaybackTime('end');\n\n        // attach playback listener\n        if (playbackEndTime > 0) {\n            onPlaybackEndAvailable.call(this, playbackEndTime);\n        }\n    },\n\n    /**\n     * Time\n     *\n     * @param {number} position - current playback time\n     * @param {number} duration - current stream duration\n     */\n    onTime({ position, duration }) {\n        if (position < 0) {\n            this.trigger('time', -(duration - position), -duration);\n        } else {\n            this.trigger('time', position, duration);\n        }\n    },\n\n    /**\n     * Triggered on first frame of content playback - after ads\n     * @param {number} playlistItemId\n     */\n    onFirstFrameLoad(playlistItemId) {\n        // first play of stream\n        const mediaType = this.stream.get('mediaType');\n        const startTime = this.stream.getPlaybackTime('begin') || 0;\n\n        /**\n         * Remove \"jw-flag-media-audio\" class when media type is video\n         * but was not recognized properly to fix poster image issues\n         */\n        if (mediaType === 'video') {\n            utils.removeClass(this.getContainer(), 'jw-flag-media-audio');\n        }\n\n        this.once('time', () => {\n            // check if currently set video id is the same as played one\n            // it can happen when playnext is called before assetPlay\n            if (playlistItemId === this.stream.getId()) {\n                this.trigger('assetPlay', startTime);\n            }\n        });\n    },\n\n    onViewable(eventData) {\n        const { viewable } = eventData;\n\n        this.trigger('viewable', {\n            viewable,\n        });\n    },\n\n    /**\n     * @param {string} data.reason\n     */\n    onAutostartNotAllowed(data) {\n        const { reason } = data;\n\n        if (reason === 'autoplayDisabled') {\n            this.player.setMute(false);\n        }\n    },\n\n    /**\n     * Schedule midroll to\n     * @param {number} slotDuration\n     * @param {number|'NOW'} startTime\n     * @returns {Promise<void>}\n     */\n    async createMidroll(slotDuration, startTime) {\n        const midroll = appnexus.createMidroll({\n            tag: await this.config.getLiveMidrollTag(slotDuration),\n            startTime,\n        });\n\n        const onTimeChange = () =>\n            midroll.setTime(this.player.getCurrentTime());\n\n        midroll.onReady(() => {\n            this.on('time', onTimeChange);\n            // cleanup when stream has changed or finished\n            this.on('complete', () => this.off('time', onTimeChange));\n        });\n\n        midroll.onEnter(\n            function (adTag) {\n                const position = -Math.abs(this.player.getPosition());\n                this.off('time', onTimeChange);\n\n                this.once('adSlotComplete', () => {\n                    this.listenToOnce(this.player, 'providerFirstFrame', () => {\n                        this.player.seek(position);\n                    });\n                });\n\n                this.player.loadAdTag(adTag);\n            }.bind(this),\n        );\n    },\n\n    /**\n     * Handling midrolls with scte35 tags in HLS live\n     * @param data\n     */\n    onMetadataCueParsed(data) {\n        if (!this.stream.isLive()) {\n            return;\n        }\n\n        const { tag, content, start } = data.metadata || {};\n\n        if (tag === 'EXT-X-CUE-OUT') {\n            this.createMidroll(parseInt(content, 10), start);\n        } else if (tag === 'EXT-X-CUE-IN') {\n            this.player.skipAd();\n        }\n    },\n\n    /**\n     * Handling midrolls in RTMP live streams\n     * @param data\n     */\n    onMeta(data) {\n        if (!this.stream.isLive()) {\n            return;\n        }\n\n        const params = data.metadata && data.metadata.TXXX;\n\n        if (params) {\n            // Workaround for live midrolls SCTE-35 tags in Safari\n            // @see https://github.schibsted.io/svp/platform/issues/328\n            if (params.insertAd && device.isSafari()) {\n                const duration = parseInt(params.insertAd, 10);\n                this.createMidroll(duration, 'NOW');\n            }\n\n            // Workaround for live midrolls SCTE-35 tags in Safari\n            // @see https://github.schibsted.io/svp/platform/issues/328\n            if (params.cancelAd === 'now' && device.isSafari()) {\n                this.player.skipAd();\n            }\n        }\n    },\n\n    onPlay(data) {\n        this.trigger('play', {\n            playReason: data.playReason,\n        });\n    },\n    onPause(data) {\n        utils.removeClass(this.getContainer(), 'jw-state-buffering');\n\n        this.trigger('pause', data);\n    },\n\n    /**\n     * Correct event flow for end of streaming\n     */\n    onComplete() {\n        // wait until postroll will finish\n        this.trigger('complete');\n    },\n};\n\n/**\n * Extend player with events\n * Add methods from JW which are used without any rewriting\n */\nutils.extend(\n    PlayerModel.prototype,\n    utils.Events,\n    forwardMethods.call(PlayerModel.prototype, ['getCurrentCaptions']),\n);\n\n/* jshint newcap: false */\nexport default PlayerModel;\n","/**\n * @returns {{init: (el: HTMLVideoElement|null) => void, remove: () => void}}\n */\nconst handle = () => {\n    let supposedCurrentTime = 0;\n    let video = null;\n\n    const onSeeking = () => {\n        // guard against infinite recursion:\n        // user seeks, seeking is fired, currentTime is modified, seeking is fired, current time is modified, ....\n        if (Math.abs(video.currentTime - supposedCurrentTime) > 0.01) {\n            video.currentTime = supposedCurrentTime;\n        }\n    };\n\n    const onTimeUpdate = () => {\n        if (!video.seeking) {\n            supposedCurrentTime = video.currentTime;\n        }\n    };\n\n    /**\n     * @param {HTMLVideoElement|null} videoElement\n     */\n    const init = (videoElement) => {\n        video = videoElement;\n\n        if (video) {\n            // prevent user from seeking\n            video.addEventListener('seeking', onSeeking);\n            video.addEventListener('timeupdate', onTimeUpdate);\n        }\n    };\n\n    const remove = () => {\n        if (video) {\n            video.removeEventListener('seeking', onSeeking);\n            video.removeEventListener('timeupdate', onTimeUpdate);\n        }\n    };\n\n    return {\n        init,\n        remove,\n    };\n};\n\n/**\n * @param {SvpPlayer} svpPlayer\n */\nconst load = (svpPlayer) => {\n    const handler = handle();\n\n    /**\n     * Get video tag from SVP Player\n     * Use class selector to avoid grabbing preview or homad video elements\n     *\n     * @param {Player} player\n     * @returns {Element|null}\n     */\n    const getVideo = (player) =>\n        player.getContainer().querySelector('video.jw-video');\n\n    /**\n     * Add prevent seeking handler for every adslot\n     */\n    const onAdSlotStart = () => {\n        handler.init(getVideo(svpPlayer));\n    };\n\n    /**\n     * Remove it when ad completes\n     */\n    const onAdSlotComplete = () => {\n        handler.remove();\n    };\n\n    svpPlayer.on('adSlotStart', onAdSlotStart);\n    svpPlayer.on('adError adSlotComplete', onAdSlotComplete);\n};\n\nexport { handle };\nexport default load;\n","import { scriptLoader } from 'utils/script-loader';\nimport logger from 'utils/logger';\nimport { createClass as createPluginClass } from 'player/plugins/model';\n\n/**\n * @type {Record<string, PluginModel>}\n */\nconst plugins = {};\n\nconst Plugins = {\n    /**\n     * @param {PluginModel} plugin\n     */\n    register(plugin) {\n        const name = plugin.getName();\n\n        // register the same plugin only once\n        if (!plugins[name]) {\n            plugins[name] = createPluginClass(plugin);\n        }\n    },\n\n    load(options) {\n        // no plugins provided, complete immediately\n        if (!options) {\n            // timeout for proper event listener fire\n            return Promise.resolve();\n        }\n\n        const scripts = Object.keys(options);\n\n        // do not change this to an arrow function - it breaks iOS playback\n        async function loadPlugin(pluginSrc) {\n            try {\n                await scriptLoader(pluginSrc);\n            } catch (error) {\n                logger().error(`An error occur while loading ${pluginSrc}`);\n            }\n\n            return pluginSrc;\n        }\n\n        return Promise.all(scripts.map(loadPlugin));\n    },\n\n    /**\n     * @param {string} name\n     * @returns {PluginModel|undefined}\n     */\n    get(name) {\n        return plugins[name];\n    },\n};\n\nexport default Plugins;\n","/* eslint-disable no-restricted-syntax */\nexport function copyProperties(target, source) {\n    for (const key of Reflect.ownKeys(source)) {\n        if (key !== 'constructor' && key !== 'prototype' && key !== 'name') {\n            const desc = Object.getOwnPropertyDescriptor(source, key);\n            Object.defineProperty(target, key, desc);\n        }\n    }\n}\n","import utils from 'utils/utils';\nimport config from 'player/config';\nimport { styleLoader } from 'utils/style-loader';\nimport Provider from '../playback/provider';\nimport SvpPlugins from '../plugins';\nimport { onPlayerEvent } from './helpers';\n\n/**\n * @param {Object} options - Caution, param is bound in constructor\n * @param {Object} settings\n */\nexport function onceConfigReady(options, settings) {\n    this.model = new Provider(this.config);\n\n    // important listeners has to be attached before setup\n    this.listenTo(this.model, 'all', onPlayerEvent, this);\n\n    this.listenTo(\n        this.model,\n        'play',\n        function () {\n            this.isCompleted = false;\n        },\n        this,\n    );\n\n    // turn on cachebreaker for preview mode\n    if (settings && settings.preview === true) {\n        config.api.cb = true;\n    }\n\n    // once per player instance error append stylesheet\n    this.once(\n        'error',\n        function () {\n            styleLoader(this.config.get('skin').url);\n        },\n        this,\n    );\n\n    Promise.all([\n        new Promise((resolve) => {\n            const handleReady = () => {\n                resolve();\n                // eslint-disable-next-line @typescript-eslint/no-use-before-define\n                this.off('assetError', handleError);\n            };\n\n            const handleError = (error) => {\n                resolve(error);\n                this.off('assetError', handleReady);\n            };\n\n            this.once('assetReady', handleReady);\n            this.once('assetError', handleError);\n        }),\n        SvpPlugins.load(options.plugins),\n    ]).then(([error]) => {\n        utils.each(options.plugins, (pluginConfig, plugin) => {\n            const Plugin = SvpPlugins.get(pluginConfig.name || plugin);\n\n            if (Plugin) {\n                // support for new loading method\n                this.addPlugin(new Plugin(pluginConfig.config || pluginConfig));\n            }\n        });\n\n        if (!error) {\n            this.model.setup();\n        }\n    });\n\n    // asset can be passed as id or an object\n    this.setAsset(options.asset || options.id);\n}\n","import utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport ServerTime from 'utils/server-time';\nimport { warnOnce } from 'utils/warn-once';\nimport config from 'player/config';\nimport locale from './model/locale';\nimport Asset from './model/asset';\nimport Config from './playback/config';\nimport Domain from './model/domain';\nimport Recommended from './model/recommended';\nimport { APPNEXUS_PROVIDER_ID } from './services/api';\nimport { getMockAsset } from './services/api/asset';\nimport PulseTracker from './plugins/pulse-stats/tracker';\n\nimport { onAssetError } from './events/error';\nimport { onAssetReady } from './events/asset';\nimport { onComplete } from './events/complete';\nimport { onceConfigReady } from './events/config';\nimport { destroyPlugin } from './events/helpers';\n\n/**\n * @constructor\n * @param {Config} configuration\n */\nconst Player = function (configuration) {\n    const options = { ...configuration };\n\n    // sync browser time with server\n    if (!options.serverTime) {\n        ServerTime.fetch(config.time);\n    }\n\n    // Little bit of monkey patching\n    config.api.vendor = options.vendor || 'vgtv';\n    config.env =\n        config.env === 'production'\n            ? 'production'\n            : options.env || config.env || 'production';\n\n    // Restrict player on blacklisted domains\n    if (Domain.isBlacklisted(options.vendor)) {\n        return;\n    }\n\n    logger('SVP').log('config', utils.extend({}, options));\n\n    /**\n     * Allow to embed player without asset\n     * This can be useful for preloading player\n     * Appnexus vendor is for displaying ads only playback\n     */\n    if (\n        options.vendor === APPNEXUS_PROVIDER_ID ||\n        options.id === -1 ||\n        (!options.id && !options.asset)\n    ) {\n        options.asset = getMockAsset();\n        delete options.id;\n    }\n\n    // load locales for player\n    // norwegian by default\n    if (typeof options.locale === 'string') {\n        locale.setTranslations(config.translations(options.locale));\n    }\n\n    // bind player api to pass it as last argument in adn function\n    if (options.adn) {\n        options.adn.svpPlayer = this;\n    }\n\n    // create configuration for SVP player\n    this.config = new Config();\n    this.listenToOnce(this.config, 'ready', onceConfigReady, this);\n\n    this.config.initialize(options);\n\n    // set dynamic api url\n    if (options.api) {\n        config.api.url = options.api;\n    }\n\n    // set dynamic related api url\n    if (options.relatedUrl) {\n        config.api.relatedApiUrl = options.relatedUrl;\n    }\n\n    // allow to override token api url\n    if (options.tokenUrl) {\n        config.api.tokenUrl = options.tokenUrl;\n    } else if (options.api) {\n        config.api.tokenUrl = options.api.replace('api/v1/', 'token/v1/');\n    }\n\n    // allow to override thumbnails api url\n    if (options.thumbnailsUrl) {\n        config.api.thumbnailsUrl = options.thumbnailsUrl;\n    } else if (options.api) {\n        config.api.thumbnailsUrl = options.api.replace(\n            'api/v1',\n            'thumbnails/v1',\n        );\n    }\n\n    if (options.vmapUrl) {\n        config.api.vmapUrl = options.vmapUrl;\n    }\n\n    /**\n     * Available plugins\n     * PausePlugin, EndposterPlugin, ChaptersPlugin, ContinuePlayingPlugin\n     *\n     * Plugins registered by default (can not be removed)\n     * CountdownPlugin, AgeLimitPlugin\n     * @type {Object}\n     */\n    this.plugins = {};\n\n    /**\n     * Check if stream has completed playback\n     * @type {boolean}\n     */\n    this.isCompleted = false;\n\n    this.isPlayNextAvailable = true;\n\n    // fetch config for privileged settings to speedup setup\n    if (options.settings) {\n        Domain.fetch(options.vendor);\n    }\n\n    /**\n     * Prefetch Pulse tracking library\n     */\n    if (options.pulse?.provider) {\n        PulseTracker.load();\n    }\n\n    logger('SVP').log(\n        function (message) {\n            this.on('all', function (event) {\n                message(event, Array.prototype.slice.call(arguments, 1));\n            });\n        }.bind(this),\n    );\n};\n\n/**\n * Player public API\n */\nPlayer.prototype = {\n    /**\n     * Play\n     * @param {number} position - seconds\n     */\n    play(position) {\n        // stream will play only if publication date is valid\n        const stream = this.model.getStream();\n        if (stream.getTimeToStart() < 0 && !stream.isPast()) {\n            if (position) {\n                this.once('play', this.seek.bind(this, position));\n            }\n\n            this.model.play();\n        }\n    },\n\n    /**\n     * Pause playback\n     * @param {boolean} [force] - toggle playback when param is omitted\n     */\n    pause(force) {\n        // pause with force can start stream which is wrong\n        if (this.model.getStream().getTimeToStart() < 0) {\n            this.model.pause(!force);\n        }\n    },\n\n    /**\n     * Seek in seconds\n     * @param {number} time\n     */\n    seek(time) {\n        this.model.seek(time);\n    },\n\n    /**\n     * Destroy the player instance, reset DOM, clean up listeners\n     */\n    remove() {\n        utils.each(this.plugins, destroyPlugin, this);\n        this.stopListening();\n\n        if (this.model) {\n            this.model.remove();\n        }\n    },\n\n    /**\n     * Play next asset by given id\n     *\n     * @param {number} id\n     * @param {Object} [options]\n     * @param {Object} [options.pulse]\n     * @param {number} [options.time]\n     * @param {boolean} [options.disableAutoplay]\n     */\n    playNext(id, options = {}) {\n        const onNextAssetReady = function () {\n            const stream = this.model.getStream();\n            const { disableAutoplay, time } = options;\n\n            if (time) {\n                stream.set('playAhead', time);\n            }\n\n            // trick to avoid create of new stream as it's set in assetReady\n            this.model.playNext(stream, { disableAutoplay });\n            this.isPlayNextAvailable = true;\n        }.bind(this);\n\n        if (this.isPlayNextAvailable) {\n            const reason = options.pulse?.playbackSource || 'manualNext';\n            // complete current stream\n            onComplete.call(this, reason);\n\n            // block multiple occurences\n            this.isPlayNextAvailable = false;\n\n            this.once('assetReady', onNextAssetReady, this);\n\n            this.once(\n                'assetError',\n                function () {\n                    if (this.model?.player) {\n                        this.pause();\n                    }\n\n                    this.isPlayNextAvailable = true;\n                    this.off('assetReady', onNextAssetReady);\n                },\n                this,\n            );\n\n            // trigger play next always after complete to keep event order the same\n            // for videos which completed or has been interrupted with play next\n            this.trigger('playNext', id, options);\n            this.setAsset(id);\n        }\n    },\n\n    /**\n     * Set playback rate\n     *\n     * @param {number} rate - Accepts any numeric value between 0.25 and 4. The playback rate is clamped if rate is out of range.\n     */\n    setPlaybackRate(rate) {\n        this.model.setPlaybackRate(rate);\n    },\n\n    /**\n     * Get playback rate\n     * @returns {number}\n     */\n    getPlaybackRate() {\n        return this.model.getPlaybackRate();\n    },\n\n    /**\n     * Set playback volume\n     *\n     * @param {number} volume - number between 0 and 100\n     */\n    setVolume(volume) {\n        this.model.setVolume(volume);\n    },\n\n    /**\n     * Get playback volume\n     * @returns {number}\n     */\n    getVolume() {\n        return this.model.getVolume();\n    },\n\n    /**\n     * Set mute value for playback\n     * Toggling this param will preserve volume value\n     *\n     * @param {boolean} [value=true]\n     */\n    setMute(value = true) {\n        this.model.setMute(value);\n    },\n\n    /**\n     * Get playback muted state\n     * @returns {boolean}\n     */\n    getMute() {\n        return this.model.getMute();\n    },\n\n    /**\n     * Get player state\n     * @returns {string}\n     */\n    getState() {\n        return this.model.getState();\n    },\n\n    /**\n     * @returns {boolean}\n     */\n    getFloating() {\n        return this.model.getFloating();\n    },\n\n    /**\n     * @param {boolean} shouldFloat\n     */\n    setFloating(shouldFloat) {\n        return this.model.setFloating(shouldFloat);\n    },\n\n    /**\n     * Get stream duration\n     *\n     * @returns {number}\n     */\n    getDuration() {\n        return this.model.getDuration();\n    },\n\n    /**\n     * Get current playback time\n     * @returns {number}\n     */\n    getCurrentTime() {\n        return this.model.getCurrentTime();\n    },\n\n    /**\n     * Get current captions list\n     * @returns {{ id: string; label: string; language?: string; default?: boolean }[]}\n     */\n    getCaptionsList() {\n        return this.model.getCaptionsList();\n    },\n\n    /**\n     * Get currently playing captions\n     * @returns {number}\n     */\n    getCurrentCaptions() {\n        return this.model.getCurrentCaptions();\n    },\n\n    /**\n     * Set current captions by passing its index\n     * Setting 0 will hide all captions\n     * @param {number} index\n     */\n    setCurrentCaptions(index) {\n        return this.model.setCurrentCaptions(index);\n    },\n\n    /**\n     * Get Player DOM Node\n     *\n     * @returns {HTMLElement|null}\n     */\n    getContainer() {\n        return this.model.getContainer();\n    },\n\n    /**\n     * @returns {jwplayer.JWPlayer}\n     */\n    getJWPlayer() {\n        return this.model.getPlayer();\n    },\n\n    getRawConfig() {\n        return this.config.getRaw();\n    },\n\n    /**\n     * Get current server time\n     *\n     * @return {number}\n     */\n    getServerTime() {\n        return ServerTime.getTime();\n    },\n\n    /**\n     * @returns {Promise<void>}\n     */\n    stop() {\n        return this.model.stop();\n    },\n\n    /**\n     * Set asset resource\n     * @param {Asset|number} asset - Asset model or stream id\n     */\n    async setAsset(asset) {\n        // cleanup old asset\n        if (this.asset) {\n            this.stopListening(this.asset);\n            this.asset.destroy();\n            this.asset = null;\n        }\n\n        // change asset to object if it is a number\n        if (utils.isNumber(asset)) {\n            // eslint-disable-next-line no-param-reassign\n            asset = {\n                id: asset,\n            };\n        }\n\n        this.asset = asset instanceof Asset ? asset : new Asset(asset);\n\n        // set vendor for player's default if nothing has been passed\n        if (!this.asset.getVendor()) {\n            this.asset.set('vendor', this.config.get('vendor'));\n        }\n\n        // asset is ready if status field is in response\n        if (this.asset.get('status')) {\n            onAssetReady.call(this);\n        } else {\n            try {\n                await this.asset.fetch();\n                onAssetReady.call(this);\n            } catch (error) {\n                onAssetError.call(this, error);\n            }\n        }\n    },\n\n    /**\n     * @returns {Asset|null}\n     */\n    getAsset({ shouldLogDeprecatedWarning = true } = {}) {\n        if (shouldLogDeprecatedWarning) {\n            warnOnce(\n                'get-asset',\n                'SVP Player SKD deprecation warning\\ngetAsset will be removed in version @schibsted-svp/web-player@4.0.0\\nPlease use getRawAsset instead',\n            );\n        }\n        return this.asset;\n    },\n\n    /**\n     * @returns {import('@schibsted-svp/svp-api-types').Asset|undefined}\n     */\n    getRawAsset() {\n        return this.asset.getRawAsset();\n    },\n\n    /**\n     * Get next asset\n     * @return {Promise<Asset|null>}\n     */\n    async getNextAsset() {\n        const { next } = this.config.getRecommended() || {};\n        if (next === false) {\n            return null;\n        }\n\n        const recommendedPlugin = this.getPlugin('RecommendedPlugin');\n        if (!recommendedPlugin) {\n            return null;\n        }\n        if (recommendedPlugin.nextAsset) {\n            return recommendedPlugin.nextAsset;\n        }\n\n        const recommended = new Recommended({\n            asset: this.getAsset({ shouldLogDeprecatedWarning: false }),\n        });\n        const { nextAsset, source } = await recommended.getNextAsset(next);\n        recommendedPlugin.nextAsset = nextAsset;\n        recommendedPlugin.nextAssetSource = source;\n\n        return recommendedPlugin.nextAsset;\n    },\n\n    /**\n     * Add plugin to the player\n     *\n     * @param {PluginModel} plugin\n     */\n    addPlugin(plugin) {\n        const proxyPluginEvent = function (event, ...args) {\n            this.trigger(`${plugin.getName()}:${event}`, ...args);\n        };\n\n        plugin.setPlayer(this);\n        this.listenTo(plugin, 'all', proxyPluginEvent, this);\n\n        this.plugins[plugin.getName()] = plugin;\n    },\n\n    /**\n     * Get plugin by name\n     *\n     * @param {string} plugin - name of the plugin\n     * @returns {PluginModel|undefined}\n     */\n    getPlugin(plugin) {\n        return this.plugins[plugin];\n    },\n};\n\n/**\n * Checks if device can autoplay stream\n * @deprecated new autoplay policies require starting of video to detect if autoplay will work\n * @returns {boolean}\n */\nPlayer.canDeviceAutoplay = function () {\n    // eslint-disable-next-line no-console\n    if (console?.warn) {\n        // eslint-disable-next-line no-console\n        console.warn(\n            'SVP Player SKD deprecation warning. ' +\n                'Due to changes in browser policies, player will detect itself if it can autoplay.',\n        );\n    }\n\n    return utils.device.canAutoplay();\n};\n\nutils.extend(Player.prototype, utils.Events);\n\nexport default Player;\n","import config from 'player/config';\nimport Player from 'player/player';\nimport image from 'utils/image';\nimport utils from 'utils/utils';\n\nimport locale from 'player/model/locale';\nimport Domain from 'player/model/domain';\n\nimport { youboraSdk } from 'player/playback/youbora';\nimport SvpPlugins from './player/plugins';\n\nconst SVP = {};\nSVP.Player = Player;\nSVP.Player.Plugins = SvpPlugins;\nSVP.Player.version = config.version;\n\n// by default antiadblock is turned off\nObject.defineProperty(SVP.Player, 'defaults', {\n    get() {\n        return this.__defaults || {};\n    },\n    set(value) {\n        // if params are not object then\n        // override and force to object\n        if (value !== Object(value)) {\n            // eslint-disable-next-line no-param-reassign\n            value = {};\n        }\n\n        Object.defineProperty(SVP.Player, '__defaults', {\n            value: value,\n            enumerable: false,\n            configurable: false,\n            writable: false,\n        });\n    },\n});\n\n/**\n * Load youbora plugin unless it is turn off in SVP.default\n * @type {boolean}\n */\nconst loadYoubora = (options) => {\n    // youbora plugin can be disabled completely\n    try {\n        const forceLoad = localStorage.svpYoubora === 'true';\n        if (!utils.device.isBot() && (forceLoad || options === true)) {\n            youboraSdk.load(options, forceLoad);\n        }\n    } catch (e) {\n        // could not load youbora plugin\n    }\n};\n\nconst setLocale = (language = 'no') => {\n    locale.setTranslations(config.translations(language));\n};\n\nconst preInitialize = () => {\n    image.initialize(\n        utils.extend(config.images, {\n            getPixelRatio: utils.device.getPixelRatio,\n        }),\n    );\n\n    Domain.initialize(window.location.hostname);\n};\n\nconst postInitialize = () => {\n    // do not override locale set from config\n    const wasLocaleSet = Object.keys(locale.getTranslations()).length !== 0;\n    if (!wasLocaleSet) {\n        // set locale for all players\n        setLocale(SVP.Player.defaults.locale);\n    }\n\n    loadYoubora(SVP.Player.defaults.youbora);\n};\n\nexport default SVP;\nexport { preInitialize, postInitialize };\n","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\"><path fill=\\\"#fff\\\" d=\\\"M12 3a9 9 0 11-6.076 15.64 1 1 0 011.35-1.476A7 7 0 105.29 10h2.587c.275 0 .359.175.187.39l-3.375 4.22c-.172.214-.453.214-.625 0L.689 10.39C.517 10.175.602 10 .877 10h2.346C4.133 5.992 7.717 3 12 3z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M16 19.708l-.293 1.209c-.993.394-4.434 2.048-6.419.288-.591-.523-.887-1.188-.887-1.994 0-1.51.494-2.827 1.38-5.988.156-.597.347-1.373.347-1.988 0-1.06-.399-1.342-1.483-1.342-.53 0-1.115.19-1.645.39l.294-1.21C8.476 8.59 9.96 8 11.232 8c1.907 0 3.309.958 3.309 2.78 0 .525-.09 1.444-.28 2.08l-1.096 3.908c-.226.79-.638 2.53-.002 3.047.626.51 2.107.24 2.837-.107zM14 6a2 2 0 1 1 0-4 2 2 0 0 1 0 4z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\"><path fill=\\\"#fff\\\" d=\\\"M12.362 1.025l.07.035 5.136 2.996c.21.123.235.315.07.454l-.07.05-5.136 2.996c-.214.125-.393.046-.426-.17L12 7.307 11.999 5.3l-.24.004a7 7 0 105.69 11.392 1 1 0 011.555 1.256A9 9 0 1111.999 3.3V1.308c0-.248.158-.363.363-.283zm3.303 8.377c1.457 0 2.352 1.091 2.349 2.995-.003 1.917-.886 3.03-2.35 3.03-1.465-.002-2.355-1.118-2.35-3.03.004-1.907.89-2.995 2.35-2.995zm-5.526 0c1.205 0 2.009.722 2.006 1.64.003.653-.446 1.113-1.097 1.23v.045c.855.108 1.316.625 1.313 1.35.003.994-.932 1.713-2.24 1.713-1.277 0-2.186-.708-2.206-1.725h1.238c.023.426.43.71.972.71.562 0 .96-.318.957-.78.003-.47-.41-.8-1.068-.8h-.542v-.903h.542c.56 0 .95-.31.946-.767.003-.437-.33-.738-.826-.738-.503 0-.91.287-.924.73H8.03c.018-1.006.916-1.705 2.109-1.705zm5.526 1.01c-.665 0-1.094.664-1.097 1.985-.003 1.34.429 2.011 1.097 2.011.664 0 1.096-.67 1.093-2.01 0-1.322-.432-1.987-1.093-1.987z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M7.293 19.293l1.414 1.414 7.647-7.646a1.5 1.5 0 0 0 0-2.122L8.707 3.293 7.293 4.707 14.586 12l-7.293 7.293z\\\"></path></svg>\"","module.exports = \"<div class=\\\"svp-pause-view\\\">\\n    <div id=\\\"<%= appnexusAdContainerId %>\\\"></div>\\n\\n    <div class=\\\"jw-icon jw-icon-inline jw-button-color jw-reset jw-icon-playback\\\" role=\\\"button\\\" tabindex=\\\"0\\\">\\n        <svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\"\\n             class=\\\"jw-svg-icon jw-svg-icon-play\\\">\\n            <path fill-rule=\\\"evenodd\\\"\\n                  d=\\\"M7 3.48v17.04a.5.5 0 0 0 .807.395l10.972-8.52a.5.5 0 0 0 0-.79L7.807 3.085A.5.5 0 0 0 7 3.48z\\\"></path>\\n        </svg>\\n    </div>\\n\\n    <button class=\\\"svp-pause-close\\\">\\n        <%= closeIcon %>\\n    </button>\\n</div>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill-rule=\\\"evenodd\\\" d=\\\"M7.28 8l5.887-5.256a.5.5 0 0 1 .833.373v17.766a.5.5 0 0 1-.833.373L7.28 16H2V8h5.28zM20 13.414l-2.293 2.293-1.414-1.414L18.586 12l-2.293-2.293 1.414-1.414L20 10.586l2.293-2.293 1.414 1.414L21.414 12l2.293 2.293-1.414 1.414L20 13.414z\\\"></path></svg>\"","// 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","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import config from 'player/config';\nimport { scriptLoader } from 'utils/script-loader';\nimport ServerTime from 'utils/server-time';\n\n// eslint-disable-next-line\nconst loadSvpLibrary = () => {\n    return import(/* webpackMode: \"eager\" */ './index').then((SVP) => [\n        SVP.default,\n        SVP.preInitialize,\n        SVP.postInitialize,\n    ]);\n};\n\n/**\n * @param {Window} root\n */\nconst loadJwPlayer = async (root) => {\n    const PLAYER_LIB = `${config.cdn.player}/jwplayer.js`;\n\n    return scriptLoader(PLAYER_LIB).then((jwplayer = root.jwplayer) => {\n        root.jwplayer = jwplayer;\n    });\n};\n\n(async function (root) {\n    // onSvpPlayerReady is required callback to handle due to SDK async loading\n    const onReady = root.onSvpPlayerReady;\n\n    await Promise.all([ServerTime.fetch(config.time), loadJwPlayer(root)]);\n\n    const library = await loadSvpLibrary();\n    const [SVP, preInitialize, postInitialize] = library || [];\n\n    if (!root?.SVP || root.SVP?.isLoaded !== true) {\n        root.SVP = SVP;\n        root.SVP.isLoaded = true;\n\n        preInitialize();\n\n        if (window.dispatchEvent) {\n            const event = document.createEvent('Event');\n            event.initEvent('onSvpPlayerReady', false, true);\n            window.dispatchEvent(event);\n        }\n\n        if (onReady) {\n            onReady();\n        }\n\n        postInitialize();\n    }\n})(window);\n"],"names":["module","exports","isLoaded","exportz","conf","k","l","b","this","u","g","prototype","c","a","Math","round","e","String","fromCharCode","random","floor","A","d","toString","h","f","m","n","r","Array","q","p","t","length","charCodeAt","push","toLowerCase","j","isNaN","charAt","fireEvent","document","createEvent","state","initCustomEvent","dispatchEvent","window","track","homad","M","isEnabled","T","encodeURIComponent","o","data","homad_url_prefix_alias","homad_track_key","homad_track_value","P","setTimeout","bind","v","w","S","code","type","message","V","C","O","F","J","G","I","K","i","H","B","U","R","D","L","N","X","W","z","s","abs","Date","now","navigator","appCodeName","appName","appVersion","userAgent","platform","language","parseInt","reverse","match","y","startPlayer","eval","fp_error","hd_ready","createElement","src","onerror","head","firstChild","insertBefore","appendChild","version","setInterval","addEventListener","clearTimeout","getElementsByTagName","pause","parentNode","removeChild","getElementsByClassName","self","top","hasChildNodes","lastChild","homad_url_suffix_base64","homad_url_suffix","homad_hash_guessed","x","enabled","server","replace","getTime","config","XMLHttpRequest","onreadystatechange","readyState","status","JSON","parse","responseText","open","substr","setRequestHeader","send","location","hostname","onFailure","globalConfig","clientConfig","clearInterval","call","scriptLoader","path","Promise","resolve","reject","onSuccess","onError","script","done","callback","async","onload","body","loadScript","ACTIVE","ACTIVE_PREVIEW","NOT_ACTIVE","NOT_ACTIVE_GEOBLOCKED","NOT_ACTIVE_TOKEN","NOT_FOUND","NOT_ACTIVE_PAST","GENERAL_ERROR","NETWORK_ERROR","TOKEN_FETCH_ERROR","statusMessages","errorCode","translations","en","id","months","codeToString","STATUS_CODES","Sharing","en_GB","es_ES","nb_NO","sv_SE","ads","admessage","cuetext","skipmessage","skiptext","podmessage","loadingAd","player","listen","playback","loginToListen","subscribeToListen","seconds","minutes","hours","playbackSpeed","tts","play","replay","minute","second","no","volume","prev","next","cast","airplay","fullscreen","playlist","hd","cc","audioTracks","playbackRates","buffer","more","liveBroadcast","rewind","nextUp","nextUpClose","related","close","settings","unmute","copied","forward","se","VERSION","__BUILD_VERSION__","keys","default","ab","adressa","adressabrandstudio","altaposten","ap","bt","brandstudio","folkebladet","fvn","harstad","itromso","podcast","rbnett","riks","ridenews","sa","schibsted","smp","svd","tronderavisa","vgtv","vgtvs","tvnu","tvh","steinkjer","avisast","bladet","banett","innherred","fosnafolket","opp","tronderbladet","stjordalsnytt","mn24","hitrafroya","framtidinord","vaganavisa","vol","nyttiuka","vikebladet","fjt","vestlandsnytt","fjuken","vigga","dolen","fjordabladet","morenytt","fjordingen","driva","andalsnes","nyss","agderposten","lindesnes","farsund","varden","lp","venneslatidende","gat","bomlonytt","sunnhordland","klaebuposten","gauldalsposten","froya","bnytt","vnytt","stri","avavis","bareasane","e24","op","r24","stord","marsteinen","aptts","vgtvexternal","wellobe","godare","nearadio","fitjarposten","kulingen","kystogfjord","porten","polaris","bttts","vgtts","satts","hallingdolen","setesdolen","abtts","api","url","cb","tokenUrl","thumbnailsUrl","relatedApiUrl","vmapUrl","vendor","identifier","getUrl","endpoint","joiner","indexOf","appnexus","vmap","ptv","cr","ast","debug","cdn","svp","youbora","poster","fonts","Graphik","time","images","sizes","autoHeight","autoWidth","liveVideoPreview","videoPreview","skins","name","about","link","text","sharing","global","sites","domains","blacklist","whitelist","preview","vendors","locale","ServerTime","responseTime","fetched","fetch","resolveRequest","then","result","serverTime","Number","idCounter","_","jwplayer","MAX_ARRAY_INDEX","getLength","obj","undefined","isEmpty","isArray","Object","isArguments","uniqueId","prefix","Events","eventSplitter","eventsApi","iteratee","events","opts","names","context","test","split","onApi","options","handlers","ctx","listening","count","internalOn","_events","_listeners","on","listenTo","_listenId","listeningTo","_listeningTo","thisId","objId","offApi","listeners","ids","remaining","handler","_callback","off","stopListening","onceMap","map","offer","once","apply","arguments","listenToOnce","triggerEvents","args","ev","a1","a2","a3","triggerApi","objEvents","allEvents","all","slice","concat","trigger","max","unbind","userAgentMatch","regex","lazyUserAgentMatch","isIETrident","isIPad","maxTouchPoints","isEdge","isAndroid","isTablet","isMobile","isIOS","isAppleIOS","exec","isIPhone","isSafari","isIE","isFirefox","isDesktop","isSamsungInternet","isHermesApp","isBot","getChromeVersion","raw","getPixelRatio","devicePixelRatio","getDeviceType","canAutoplay","isMergeableObject","val","cloneIfNecessary","value","optionsArgument","clone","deepmerge","defaultArrayMerge","target","source","destination","forEach","array","arrayMerge","key","mergeObject","Error","reduce","jwUtils","utils","jwUnderscore","extend","assign","merge","each","isNumber","isString","isObject","createNode","addClass","element","classList","add","removeClass","remove","template","cache","tmpl","str","Function","join","getElementById","innerHTML","device","shareTimeToSeconds","compact","number","zeroPad","string","getTimeFormatted","timestamp","getScrollSnapPrefix","scrollSnapSupport","documentElement","style","jsonToUrl","counters","log","counter","console","block","error","itemKey","localStorage","getItem","unshift","warned","translate","substitute","setTranslations","getMonthName","date","getMonth","getTranslations","makeFetch","response","ok","json","APPNEXUS_PROVIDER_ID","assetAdditionalData","VIDEO","Blob","Uint8Array","getById","assetId","get","attr","attributes","set","oldVal","cloneDeep","structuredClone","stringify","Category","initialize","additional","background","main","image","logo","playerLogo","playerLogoImage","getId","getTitle","Model","unifyTimestamp","Asset","getRawAsset","rawAsset","ageLimit","flightTimes","start","end","category","chapters","chapter","index","timeline","nextAsset","tags","_embedded","asset","getVendor","getStreamType","getNextAssetId","destroy","getAgeLimit","isSponsored","metadata","sponsored","getChapter","chapterIndex","getChapters","getThumbnail","getCategory","isAudio","getImageQuality","pixelRatio","getImageTransform","width","height","min","cacheKey","transformSizes","transformType","maxDimension","dimensions","size","normalizeTransformSize","curr","getClosestSize","transform","getImageSrc","imageId","extension","objectToString","prop","hasOwnProperty","capitalizeFirstLetter","toUpperCase","isDomainInArray","origin","domain","pos","domainBeginning","len","inherit","parent","child","Domain","na","getPermissions","item","isBlacklisted","fetchToken","params","isFetching","expire","constructor","assetAccess","maxBitrate","request","configuration","hasAccess","isValid","expiry","query","getValue","Stream","title","streams","hls","streamUrls","mp4","streamType","mediaType","assetType","streamConfiguration","snapshots","captions","begin","externalId","duration","disableNextVideo","chunkDuration","isPodcast","hasSubtitlesInHls","Boolean","tts_articleId","videoPreviews","entries","metadataKey","metadataValue","includes","showAds","cuePoints","hasProperty","property","properties","getDuration","getCuePoints","isSecure","isMock","isGeoblocked","isLive","wasLive","isActive","isPast","isFuture","hasPlaylist","isDisabledNextVideo","hasPlayableSource","getTimeToStart","isOnHttp","protocol","startsWith","streamUrl","getPoster","getAllPreviewsUrls","getVideoPreviewUrl","getChunkDuration","getSnapshots","hasSnapshots","getCaptions","hasMp4Streams","getPlaybackTime","position","getExternalId","hasAdsDisabled","hasTextSpeech","getVmapApiUrl","supplyType","queryParams","URLSearchParams","gdpr","gdpr_consent","getRandomId","getRelevantYieldConfig","stream","relevantDigital","loadRelevantScript","scriptUrl","adTagUrls","cmd","_config$consentManage","prebidConfig","consentManagement","cmpApi","userId","ortb2","user","eids","uids","atype","ext","stype","userSync","userIds","addPrebidConfig","slots","defineVideoSlots","values","adSlots","adSlot","custParams","getSlotElementId","loadPrebid","configId","collapseEmptyDivs","collapseBeforeAdFetch","allowedDivIds","noSlotReload","allowedPlacementType","onSlotAndUnit","slot","unit","xandrKeywords","fromEntries","filter","pbAdUnit","bids","bidder","keywords","loadVideoUrls","urls","loadAdTagUrls","scheduleSlots","adtTagUrls","current","offset","tag","jwAdScheduleSlots","hasNext","startTime","adsConfig","preroll","extra","cuePoint","midroll","postroll","getJwAdsConfig","onAdEventImpression","adIds","getAd","getAdId","getWrapperAdIds","Auction","registerImpressionByAdId","buildUrlString","getVmapTag","OVERRIDE_SLOT_PARAM","OVERRIDE_SLOT_TAG_ID","JwAdsConfig","overriddenParams","urlParams","search","has","slotName","creativeId","tagId","getOverriddenParams","setParams","getTag","adSlotConfig","adLabel","adConfig","overriddenId","format","appnexusTag","getConfig","getParams","memberId","member","getJwAdSchedule","getAdsConfig","schedule","getAdPlacements","adPlacements","globalParams","placements","placementId","tagOptions","globalOptions","parseAdPlacements","getClientConfig","adn","svpAdConfig","publisherName","countryCode","slotIds","appnexusTagBuilder","svpPlayer","logger","relevantYield","adSchedule","adOptions","maxDuration","vmaxduration","hasEntered","onEnterCallback","setTime","onEnter","onReady","globals","defaults","heading","chromecastApps","CB3CFFEE","C6559D78","E43A13ED","B6C9EA8E","E64998E3","A7738716","A5965089","createTextNode","HTMLElement","tagName","children","attribute","setAttribute","ensureIfControlsLoaded","container","querySelector","checkIfControlsLoaded","requestAnimationFrame","waitForControls","TTS_SKIN_CLASS_NAME","JW_AUDIO_MODE_MAX_HEIGHT","DEFAULT_TTS_PLAYBACK_RATES","classNames","pluralize","singular","plural","timeToText","fontLoadingPromise","closeSettingsMenu","event","contains","controls","currentTarget","settingsMenu","preventDefault","stopPropagation","click","CN_FORWARD_BUTTON","CN_DURATION_INFO","CN_PLAYBACK_RATE","COVER","COVER_CONTAINER","PLAYBACK_RATES","forwardIcon","forward30Icon","shouldUseAudioSkin","shouldApplyTextToSpeechSkin","youboraSdk","forceLoad","load","Plugin","setAdapter","adapters","JWPlayer","Config","node","env","autoplay","repeat","minDvrWindow","skin","token","disableCountdownPlugin","jwDefaults","base","preload","horizontalVolumeSlider","doNotSaveCookies","getMaxBitrate","setStream","Token","getRaw","rawOptions","isPreviewMode","getSettings","dump","playerContainer","clientWidth","clientHeight","ttsSkinOption","currentStream","getVideoPreviewMetadataKey","isCustomMetadataKey","allPreviewsKeys","isAudioWithoutCustomTitle","getDescription","getLiveSyncDuration","getToken","hasValidToken","getStreamUrl","isStreamPlayable","_response$text","referenceId","htmlError","_htmlError$split","at","catch","getPlaylistItems","playlistStreams","getChromecastAppId","vendorEntry","find","entry","getJwConfig","abouttext","aboutlink","floating","localization","plugins","customAppId","liveSyncDuration","jwConfig","promise","playlistSettings","getPlaylistSettings","playlistOptions","description","forceImaClientLoading","addPlaylistMetadata","playlistItem","mediaId","mediaid","starttime","addSnapshots","tracks","file","kind","addCaptions","caption","label","sources","advertising","client","vmapParams","adschedule","shouldEnableIma","some","endsWith","maxRedirects","autoplayMuted","autoplayadsmuted","vpaidcontrols","preloadAds","addAppnexusAds","addPlaylistFactory","applyPlaylistAdding","addSharing","playbackRateControls","applyTtsOption","native","renderCaptionsNatively","setCaptions","canAutostart","autostart","mute","hasPreroll","autopause","autoPause","viewability","pauseAds","setPlaybackOptions","isPrebidEnabled","checkIsPrebidEnabled","content_id","owner","addYoubora","jw","hasRecommended","getRecommended","getLiveMidrollTag","_options$floating$dis","_options$floating","_options$floating$mod","_options$floating2","dismissible","mode","defineProperty","permissions","freeze","writable","getRelatedAssets","limit","relatedApi","createResponse","AssetModel","hasPlayNext","fetchNextById","fetchNextFromRelatedEngine","assets","getNext","fetchNext","reason","getNextAsset","getItems","mapResponse","fetchFromRelated","PulseTrackerLoader","trackers","pulse","init","provider","sdkConfig","getTracker","storedTracker","PROVIDER_TRACKER_ID","altEventHandler","pulseEventHandler","useBeaconWhenAvailable","tracker","PLAYER_CONTAINER_CLASS_NAME","PREVIEW_ELEMENT_CLASS_NAME","queryVideoPreviewElements","previewContainer","previewElement","removeVideoPreviewElement","model","getContainer","createPreviewElement","loop","muted","addVideoPreviewElement","getStream","previewUrl","clearError","previousErrorNode","displayError","errorIcon","posterSrc","errorNode","details","translatedMessage","statusCode","errorDetails","stop","onAssetError","videoPreviewHelper","apntag","firstLoad","defineTag","tagConfig","targetId","loadTags","onEvent","showTag","refreshTag","refresh","resizeTag","dimmensions","resizeAd","offEvent","Eventable","BackboneEvents","PluginModel","super","el","getName","setup","setPlayer","PausePlugin","maxDisplays","displayCounter","withAdTag","sourceMethod","adPlacement","withCounter","getBoundingClientRect","containerId","appnexusAdId","adId","adData","isAdTagLoaded","show","getState","pauseReason","getViewable","hide","onPause","timerId","onSeek","onResumeClick","render","adTagOptions","appnexusAdContainerId","pauseTemplate","closeIcon","playButton","closeButton","hideAfter","sponsor","pluginName","adFrom","SVP_LOGIN_OVERLAY","assertUppercased","actual","expected","chooseVariant","variants","rangeNumber","winner","Percentage","percentage","prepareVariantsForExperiment","variantIds","experimentMetadataKeys","isLoginVariantType","variant","Type","loginUrl","subscriptionUrl","articleUrl","getButtonText","isSubscriptionVariantType","buttonText","uiElementId","getUiElementId","pulseStatsPlugin","PulseStats","playbackEvents","productType","object","redirectUrl","linkAnchor","linkSpan","experimentOverlay","leadingZeros","numValue","numLen","num","streamStart","liveDOM","countdownDOM","isPlaylistRegenerated","countdownTemplate","intervalId","diff","getDiff","isCountdownActive","currentState","getDate","getHours","getMinutes","newDiff","shouldRegeneratePlaylist","regeneratePlaylist","ceil","playNext","clear","nextAssetSource","disableNext","getThumbnailUrl","initSnapScroll","scrollSnapPrefix","gridItem","getByClass","onGridItemClicked","dataset","onPlaybackStart","recommended","Recommended","getAsset","shouldLogDeprecatedWarning","gridItemsReady","grid","items","onInitialize","fetchDuration","countdownTime","isAssetFromPlaylist","onPlaybackComplete","onTimeNextVisible","onPlayNextVisible","timeout","transitionDuration","onNextAssetReady","Image","nextAssetTemplate","countdown","nextIcon","onGridItemsReady","gridTemplate","onGridVisible","onAssetReplay","className","previousEl","recommendedTemplate","adSequenceDuration","beforeUnload","onAdSlotComplete","onPlaylistItem","onAdSlotStart","onAdStarted","onAdError","onAdProgress","onAdFinished","onAdPause","onAdPlay","onPauseAdVisible","slotData","adErrorData","sendAttemptEvent","sendStopEvent","removeEventListener","meta","_adData$adschedule","sequence","podcount","adposition","watchData","previousTime","session","createSession","beforeStreamStart","onBeforeUnload","playMethod","vodInterval","liveInterval","onAssetPlay","onPlay","onPlayNext","onLiveTime","onTime","playbackSource","onRecommendedPlay","jwRelatedPlugin","onComplete","playReason","eventData","previousAssetId","getCurrentTime","getPlugin","getPosition","trackTimeEvent","defaultInterval","customInterval","eventInterval","isCustomIntervalFalsy","wasViewed","viewable","eventTime","onRecommendedVisible","ui","CategoryTree","categories","Map","getPath","categoryId","_this$categories","parentId","_this$categories2","instances","getMediaAssetId","getImageUrl","experiment","isExperimentEnabled","isMockAsset","_options$engagementIn","_options$engagementIn2","_options$engagementIn3","decorator","intervals","engagementIntervals","live","vod","embed","setupErrorEventEmitted","playerAsset","accessControl","access","getTags","imageUrl","accessLevel","getAssetLevel","_experiment$variant","accessLevelName","getAssetLevelName","_experiment$variant2","originAssetId","apiUrl","isAutoplay","getCategoryPath","categoryPath","categoryTree","eventName","experiments","trackMediaEvent","getTrackerOrNull","resolveTracker","adEvents","AdEvents","PlaybackEvents","uiEvents","UiEvents","PulseTracker","onAdEvent","onPlaybackEvent","onUiEvent","attachSessionData","trackingData","intent","getMute","getFullscreen","adSequenceCount","adblock","getAdBlock","mediaAssetId","_this$categoryTree","_asset$getCategory","adSequencePosition","toLocaleLowerCase","SVP_FLAG_NATIVE_LINK","SVP_NATIVE_LINK_OVERLAY","overlay","parseHomadEvent","detail","videoTag","videoTagId","getTagUrl","potOffset","getPlaylist","getAdPotTag","homadDefaultConfig","skipable","skipAdOnContextChange","runInsideContainer","adjustAdVolumeToContentPlayer","postrollUseCompleteEvent","noClientConfigCacheBuster","clickthrough_target","zIndex","prerollAdTag","midrollAdTag","postrollAdTag","createProxyMethods","onFirstFrameLoad","playlistItemId","adPlaying","adPlayerLoading","aabConfig","SvpPlayer","SVP","Player","isHomadLoaded","homadConfig","homadLib","initializeHomadLib","playerId","applyPlayerMixin","overrides","onContentPlayerPlay","onAdStart","onContinueContent","onAdTime","onPlayerAdError","onPlayerAdBreakStart","onPlayerPlaylistItem","onPlayerAdPlay","forwardEventToPlayer","videoElements","querySelectorAll","video","controlsContainer","nextElementSibling","muteButton","childNodes","dom","adPosition","currentTime","hasAdBlocked","elements","handleAdLabelClick","handlePlayPauseClick","handleMuteClick","handleFullscreenClick","aab","initializeHomad","Homad","resetSequence","onHomadAdStart","adID","homadImpressionAdId","onHomadAdPause","onHomadAdTime","homadAdTracker","onHomadReady","createControls","hideHomadNativeControls","attachEventListeners","onMuteToggle","setAdPlaying","setAdComplete","getPlaybackState","detachEventListeners","mainDiv","cssText","fullscreenButton","iconPause","iconFullscreen","labelText","iconPlaceholder","iconLink","href","rel","class","err","iconPlay","innerText","padStart","formatTime","iconSpeakerMuted","iconSpeaker","playerClassList","adStarted","useClasses","setFullscreen","playNextFromPlaylist","masterAsset","nextAssetData","assetData","setAsset","icon","videoElement","isCompleted","destroyPlugin","plugin","onPlayerEvent","callFunction","onAssetReady","setMasterAsset","NextAsset","addPlugin","AABPlugin","RecommendedPlugin","CountdownPlugin","AgeLimitPlugin","SponsorLabelPlugin","experimentId","experimentRange","sessionStorage","setItem","userStatusCfg","userStatus","loggedIn","hasProduct","PodcastExperimentPlugin","pulseConfig","PulseStatsPlugin","PodcastNativeLinkPlugin","loadedStylesheets","styleLoader","splice","loadStylesheet","canDeviceAutoplay","iconsMap","icons","info","audioIconsMap","audioIcons","hasMediaId","getSharingLink","root","updateElement","replaceElement","sourceEl","newEl","cloneNode","replaceChild","APPNEXUS_CLASS_NAME","SVP_FLAG_STOPPED","levels","handleLevelSettingsIcon","display","getTitleNode","svpPlayerModel","skinLoader","loader","svpSkin","useTextSpeechSkin","weight","font","FontFace","loadFonts","updateDetailTexts","durationText","textContent","durationReplayText","_svpPlayer$getContain","buttonContainer","replacePlayerPoster","altText","createAdElements","ttsSkinResolver","jwPlayer","useAudioSkin","seekForward","seek","changePlaybackRate","rate","getPlaybackRate","nextRateIndex","findIndex","currentRate","setPlaybackRate","playbackRate","getControls","playbackRateButton","playbackRateButtonText","toFixed","forwardTooltip","displayControl","cover","forwardButton","durationInfo","addButton","playbackRateIcon","displayStyle","translatePlayerConfig","audioSkinResolver","submenu","right","offsetWidth","offsetLeft","submenuHandler","infoNode","tip","left","focus","select","execCommand","copyToClipboard","configButton","replaceableIconsMap","customIcon","selector","replaceableIcons","replaceableIcon","svpIcon","getAttribute","loadIcons","updateSharingBox","sharingBox","handleAppnexusClass","containerClass","levelsIcon","itemsShown","_locale$getTranslatio","adBlockDetected","method","PlayerModel","isInitalized","isStopped","adBreaks","forwardEvent","bindJwMethod","warn","getAdPosition","slotId","pre","mid","post","deriveAspectRatioFromAd","ima","ad","vastMediaWidth","vastMediaHeight","aspectRatio","parseFloat","normalizeAspectRatio","onPlaybackEndAvailable","playbackEnd","adjustAudioVolumeOnMobile","setVolume","youboraRatio","handle","supposedCurrentTime","onSeeking","onTimeUpdate","seeking","getVideo","preventAdSeeking","accountCode","enableAnalytics","onPlaylistItemLoad","onViewable","onAutostartNotAllowed","onMeta","adsManager","google","AdEvent","IMPRESSION","onMetadataCueParsed","getCaptionsList","xml","adSelector","URL","parseAdData","adbreaks","nextAd","disableAutoplay","complete","getPlayer","getVolume","setMute","nextStream","isAdPlaying","loadStream","force","getFloating","setFloating","shouldFloat","playerCaptions","setCurrentCaptions","newIndex","captionsIndex","playbackEndTime","createMidroll","slotDuration","onTimeChange","adTag","loadAdTag","content","skipAd","TXXX","insertAd","cancelAd","methods","forwardedMethods","register","CustomPluginModel","Reflect","ownKeys","desc","getOwnPropertyDescriptor","copyProperties","createPluginClass","scripts","pluginSrc","onceConfigReady","Provider","handleReady","handleError","SvpPlugins","pluginConfig","_options$pulse","createObjectURL","relatedUrl","isPlayNextAvailable","_options$pulse2","_this$model","getCurrentCaptions","getJWPlayer","getRawConfig","getServerTime","recommendedPlugin","_console","Plugins","__defaults","enumerable","configurable","preInitialize","postInitialize","setLocale","svpYoubora","loadYoubora","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","Symbol","toStringTag","loadJwPlayer","PLAYER_LIB","_root$SVP","onSvpPlayerReady","library","initEvent"],"sourceRoot":""}