{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./player/playback/config/status-codes.js","webpack:///./player/config/translations.js","webpack:///./player/config.js","webpack:///./player/config/jw-keys.js","webpack:///./player/config/production.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/get.js","webpack:///./icons/close.svg","webpack:///./utils/module-loader.js","webpack:///./utils/script-loader.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_nativeCreate.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_assocIndexOf.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_getMapData.js","webpack:///./icons/error.svg","webpack:///./icons/play.svg","webpack:///./icons/pause.svg","webpack:///./icons/audio.svg","webpack:///./icons/audio-muted.svg","webpack:///./icons/chevron-right.svg","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/isArray.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/isSymbol.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_Symbol.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_root.js","webpack:///./icons/audio/audio-half.svg","webpack:///./icons/audio/audio-off.svg","webpack:///./icons/audio/audio-on.svg","webpack:///./icons/audio/forward-30.svg","webpack:///./icons/audio/headphones.svg","webpack:///./icons/audio/pause.svg","webpack:///./icons/audio/play.svg","webpack:///./icons/audio/replay.svg","webpack:///./icons/audio/rewind-10.svg","webpack:///./icons/audio-half.svg","webpack:///./icons/av-button.svg","webpack:///./icons/backward-sec.svg","webpack:///./icons/captions.svg","webpack:///./icons/defs.svg","webpack:///./icons/embed.svg","webpack:///./icons/forward-sec.svg","webpack:///./icons/fullscreen-off.svg","webpack:///./icons/fullscreen-on.svg","webpack:///./icons/gallery.svg","webpack:///./icons/info.svg","webpack:///./icons/link.svg","webpack:///./icons/play-backward.svg","webpack:///./icons/play-forward.svg","webpack:///./icons/play-next.svg","webpack:///./icons/playlist.svg","webpack:///./icons/quality.svg","webpack:///./icons/replay.svg","webpack:///./icons/settings.svg","webpack:///./icons/share.svg","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_baseGetTag.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_getNative.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/isObject.js","webpack:///./player/playback/ads/homad-lib.js","webpack:///./player/plugins/pause.html","webpack:///./player/plugins/countdown.html","webpack:///./player/plugins/recommended/recommended.html","webpack:///./player/plugins/recommended/next-asset.html","webpack:///./player/plugins/recommended/grid.html","webpack:///./svp-player.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_baseGet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_castPath.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_isKey.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_freeGlobal.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_getRawTag.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_objectToString.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/isObjectLike.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_stringToPath.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_memoizeCapped.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/memoize.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_MapCache.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_mapCacheClear.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_Hash.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_hashClear.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_baseIsNative.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/isFunction.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_isMasked.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_coreJsData.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_toSource.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_getValue.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_hashDelete.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_hashGet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_hashHas.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_hashSet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_ListCache.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_listCacheClear.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_listCacheDelete.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/eq.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_listCacheGet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_listCacheHas.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_listCacheSet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_Map.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_mapCacheDelete.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_isKeyable.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_mapCacheGet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_mapCacheHas.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_mapCacheSet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/toString.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_baseToString.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_arrayMap.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.25.1/node_modules/lodash/_toKey.js","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/server-time.js","webpack:///./utils/model.js","webpack:///./player/model/category.js","webpack:///./player/model/asset.js","webpack:///./player/services/api.js","webpack:///./player/services/api/series.js","webpack:///./player/services/api/related.js","webpack:///./player/services/api/asset/mock.js","webpack:///./player/services/api/asset.js","webpack:///./utils/image.js","webpack:///./player/model/stream.js","webpack:///./player/model/excluded-assets.js","webpack:///./player/model/recommended/related.js","webpack:///./player/model/next-asset.js","webpack:///./player/model/locale.js","webpack:///./utils/string.js","webpack:///./player/model/domain.js","webpack:///./player/model/token.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/playlist.js","webpack:///./player/playback/config/sharing.js","webpack:///./player/playback/config/playback.js","webpack:///./player/playback/youbora.js","webpack:///./player/playback/config.js","webpack:///./player/playback/config/captions.js","webpack:///./player/playback/config/jw-youbora.js","webpack:///./player/playback/config/keys.js","webpack:///./player/playback/viewport.js","webpack:///./player/playback/ads/homad.js","webpack:///./player/playback/ads/homad-jw.js","webpack:///./player/playback/ads/homad-skin.js","webpack:///./player/playback/config/autoplay.js","webpack:///./player/playback/ads/prevent-seeking.js","webpack:///./utils/style-loader.js","webpack:///./player/playback/skin/audioSkinResolver.js","webpack:///./player/playback/skin/icons-loader.js","webpack:///./player/playback/skin/settings-menu.js","webpack:///./player/playback/skin/config-button.js","webpack:///./utils/clipboard.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.js","webpack:///./player/playback/skin/fullscreen-button.js","webpack:///./player/playback/provider.js","webpack:///./utils/eventable.js","webpack:///./utils/mixin.js","webpack:///./player/plugins/model.js","webpack:///./player/plugins.js","webpack:///./player/playback/ads/appnexus-ast.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/model/recommended/list.js","webpack:///./player/model/recommended.js","webpack:///./player/plugins/recommended.js","webpack:///./player/plugins/svp-stats/tracker.js","webpack:///./player/plugins/svp-stats.js","webpack:///./player/plugins/pulse-stats/tracker.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/ui-events.js","webpack:///./player/model/category-tree.js","webpack:///./player/plugins/pulse-stats.js","webpack:///./player/player.js","webpack:///./utils/adblock-detect.js","webpack:///./index.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","ACTIVE","ACTIVE_PREVIEW","NOT_ACTIVE","NOT_ACTIVE_GEOBLOCKED","NOT_FOUND","NOT_ACTIVE_PAST","GENERAL_ERROR","NETWORK_ERROR","TOKEN_FETCH_ERROR","statusMessages","translations","en","months","Sharing","en_GB","es_ES","nb_NO","sv_SE","ads","admessage","cuetext","skipmessage","skiptext","podmessage","adblock","player","listen","playback","loginToListen","subscribeToListen","no","play","pause","volume","prev","next","cast","airplay","fullscreen","playlist","hd","cc","audioTracks","playbackRates","replay","buffer","more","liveBroadcast","loadingAd","rewind","nextUp","nextUpClose","related","close","settings","unmute","copied","forward","se","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","api","url","tokenUrl","thumbnailsUrl","vendor","identifier","endpoint","joiner","indexOf","this","cb","Math","random","homad","global","client","appnexus","vmap","ptv","ast","debug","cdn","svp","pollyfils","youbora","time","images","servers","sizes","poster","autoHeight","autoWidth","skins","about","link","text","sharing","sites","code","domains","blacklist","whitelist","preview","locale","baseGet","path","defaultValue","result","undefined","moduleSrc","root","window","define","amd","Promise","resolve","require","reject","onSuccess","onError","script","document","createElement","done","callback","type","src","async","onreadystatechange","onload","readyState","onerror","body","appendChild","loadScript","nativeCreate","getNative","eq","array","length","isKeyable","map","data","__data__","isArray","Array","baseGetTag","isObjectLike","freeGlobal","freeSelf","self","Function","getRawTag","objectToString","symToStringTag","baseIsNative","getValue","isLoaded","exportz","k","b","u","g","a","round","e","String","fromCharCode","floor","A","toString","h","f","q","charCodeAt","push","toLowerCase","j","isNaN","charAt","fireEvent","createEvent","state","initCustomEvent","dispatchEvent","track","M","isEnabled","T","encodeURIComponent","homad_url_prefix_alias","homad_track_key","homad_track_value","P","setTimeout","v","w","S","message","V","C","O","F","J","G","I","K","H","B","U","R","D","L","N","X","W","z","abs","Date","now","navigator","appCodeName","appName","appVersion","userAgent","platform","language","parseInt","reverse","match","y","conf","startPlayer","eval","fp_error","hd_ready","head","firstChild","insertBefore","setInterval","addEventListener","clearTimeout","getElementsByTagName","parentNode","removeChild","getElementsByClassName","top","hasChildNodes","lastChild","homad_url_suffix_base64","homad_url_suffix","homad_hash_guessed","x","enabled","server","replace","getTime","config","XMLHttpRequest","status","JSON","parse","responseText","open","substr","setRequestHeader","send","location","hostname","onFailure","globalConfig","clientConfig","clearInterval","loadSvpLibrary","then","SVP","preInitialize","postInitialize","onReady","onSvpPlayerReady","PLAYER_LIB","jwplayer","loadJwPlayer","library","event","initEvent","castPath","toKey","index","isKey","stringToPath","isSymbol","reIsDeepProp","reIsPlainProp","test","objectProto","nativeObjectToString","isOwn","tag","unmasked","memoizeCapped","rePropName","reEscapeChar","string","number","quote","subString","memoize","func","cache","size","clear","MapCache","resolver","TypeError","memoized","args","arguments","apply","has","set","Cache","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","entries","entry","Hash","ListCache","Map","hashClear","hashDelete","hashGet","hashHas","hashSet","isFunction","isMasked","isObject","toSource","reIsHostCtor","funcProto","funcToString","reIsNative","RegExp","uid","coreJsData","maskSrcKey","exec","IE_PROTO","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","assocIndexOf","splice","pop","other","getMapData","baseToString","arrayMap","symbolProto","symbolToString","iteratee","idCounter","_","MAX_ARRAY_INDEX","pow","getLength","obj","isEmpty","isString","isArguments","uniqueId","prefix","id","Events","eventSplitter","eventsApi","events","opts","names","context","split","on","internalOn","listening","_events","onApi","ctx","_listeners","listenTo","_listenId","listeningTo","_listeningTo","thisId","objId","count","options","handlers","off","offApi","listeners","stopListening","ids","remaining","handler","_callback","once","onceMap","listenToOnce","offer","trigger","max","triggerApi","objEvents","allEvents","all","slice","triggerEvents","concat","ev","a1","a2","a3","unbind","userAgentMatch","regex","lazyUserAgentMatch","isFF","isIETrident","isIPad","isEdge","isAndroid","isIOS","isAppleIOS","isIPhone","isSafari","isAndroidNative","isChrome","isFirefox","isIE","isDesktop","isMobile","isTablet","isSamsungInternet","isWindowsPhone","getChromeVersion","raw","getPixelRatio","devicePixelRatio","getFlashVersion","flash","plugins","description","parseFloat","ActiveXObject","GetVariable","getDeviceType","canAutoplay","isMergeableObject","val","cloneIfNecessary","optionsArgument","clone","deepmerge","defaultArrayMerge","target","source","destination","forEach","arrayMerge","mergeObject","Error","reduce","jwUtils","utils","jwUnderscore","extend","merge","ajax","each","isUndefined","isNumber","omit","createNode","addStyleSheet","addClass","removeClass","throttle","template","tmpl","str","fn","join","getElementById","innerHTML","device","durationToSeconds","hours","minutes","seconds","shareTimeToSeconds","compact","hasFlash","zeroPad","escape","escapeMap","getTimeFormatted","timestamp","inherit","model","protoProps","staticProps","parent","child","Surrogate","constructor","__super__","getScrollSnapPrefix","scrollSnapSupport","documentElement","style","jsonToUrl","startsWith","searchString","position","counters","log","counter","console","error","block","itemKey","localStorage","getItem","unshift","_time","_responseTime","fetch","resolveRequest","attr","attributes","oldVal","Category","initialize","additional","background","main","image","logo","playerLogo","playerLogoImage","relatedExperiments","start","experiment","traffic","end","item","parseRelatedExperiments","metadata","handleErrors","response","ok","Asset","getUrl","getVendor","unifyTimestamp","startIndexPoint","ageLimit","sourceFiles","series","season","seasonNumber","episode","episodeNumber","flightTimes","created","published","updated","category","chapters","chapter","timeline","nextAsset","tags","_embedded","json","assign","isSponsored","sponsored","title","chapterIndex","getChapters","assetId","categoryId","getEndpoint","assets","findIndex","getNextFromEpisodeList","limit","engine","VIDEO","Blob","Uint8Array","getListEndpoint","params","filters","queryParams","requestNumber","currentServerId","getServer","getImageTransform","serversAmount","order","publishedDate","streamType","streamUrls","hls","URL","createObjectURL","streamConfiguration","properties","getImageQuality","pixelRatio","imageId","width","height","min","cacheKey","transform","maxDimension","idLen","transformType","transformSizes","dimensions","normalizeTransformSize","curr","getClosestSize","getImageSrc","extension","Stream","streams","hds","mp4","mediaType","assetType","snapshots","captions","begin","externalId","duration","is360","pseudostreaming","audioStream","audio","disableNextVideo","chunkDuration","Number","showAds","cuePoints","hasProperty","isPast","getTimeToStart","isActive","isOnHttp","protocol","streamUrl","containerWidth","getPoster","getId","hasMp4Streams","stream","streamData","bitrate","getKey","getAll","getStorage","setItem","stringify","excludedAssets","add","useMlEngine","experimentsList","seed","experimentVariant","experimentName","randomIndex","element","find","getExperimentName","createResponse","asset","includeCategory","hasNextInCategory","getCategory","isSeries","nextAssetId","getNextAssetId","fetchNextParams","fetchNextFromSeries","experiments","getRelatedExperiments","fetchNextById","fetchNextFromRelatedEngine","getNext","reason","translate","substitute","setTranslations","getMonthName","date","getMonth","prop","capitalizeFirstLetter","toUpperCase","isDomainInArray","origin","domain","pos","domainBeginning","len","na","vendors","fetchToken","isFetching","expire","assetAccess","maxBitrate","request","configuration","isValid","query","expiry","getCountryCode","buildQueryParamsString","queryObject","getAstConfig","tagOptions","globalOptions","countryCode","supplyType","publisherName","slotIds","preroll","midroll","postroll","JwAdsConfig","adSlotConfig","adConfig","isAudio","getPtvTag","getVmapTag","offset","adLabel","getTag","getParams","memberId","member","getJwAdSchedule","adSlots","adsConfig","hasNext","setParams","getCuePoints","cuePoint","getConfig","getAdsConfig","schedule","getAdPlacements","adPlacements","globalParams","placements","values","placementId","parseAdPlacements","getClientConfig","adn","hasAdsDisabled","svpAdConfig","getDefaultParams","svpPlayer","logger","adSchedule","adOptions","getLiveMidrollTag","maxDuration","vmaxduration","createMidroll","startTime","hasEntered","onEnterCallback","setTime","onEnter","minDvrWindow","addPlaylistMetadata","playlistItem","mediaId","getExternalId","getPlaybackTime","mediaid","starttime","addProgressiveMediaSources","getMp4Streams","mp4Stream","sources","label","file","addSnapshots","hasSnapshots","tracks","getSnapshots","kind","addCaptions","getCaptions","caption","add3dSupport","getDisplayType","stereomode","isMock","preload","advertising","autoplayMuted","autoplayadsmuted","vpaidcontrols","preloadAds","adschedule","addAppnexusAds","globals","defaults","heading","canAutostart","autoplay","isSecure","withCredentials","hasPlayableSource","autostart","mute","skin","some","slot","hasPreroll","isFuture","autopause","autoPause","viewability","repeat","Plugin","setAdapter","adapters","JWPlayer","Config","node","env","token","jwDefaults","primary","hlshtml","base","flashplayer","wmode","getMaxBitrate","rawOptions","js_beautify","getRaw","playerContainer","container","clientWidth","clientHeight","isAudioWithoutCustomTitle","getChunkDuration","getToken","isLive","getSettings","isGeoblocked","getStreamUrl","catch","abouttext","aboutlink","localization","liveSyncDuration","getLiveSyncDuration","jwConfig","getTitle","getDescription","getPlaylistSettings","addSharing","native","renderCaptionsNatively","getDuration","content_id","owner","jw","hasRecommended","getRecommended","getPermissions","permissions","freeze","writable","Viewport","current","labels","newIndex","arr","compare","comp","binarySearch","newBreakpoint","getViewportByIndex","currentBreakpoint","getTagUrl","potOffset","getPlaylist","getAdPotTag","parseHomadEvent","details","detail","containerId","SvpPlayer","Player","isHomadLoaded","homadConfig","skipable","skipAdOnContextChange","runInsideContainer","adjustAdVolumeToContentPlayer","postrollUseCompleteEvent","muteButton","unmuteButton","playButton","pauseButton","skipableButton","adMessages","skipButton","prerollAdTag","midrollAdTag","postrollAdTag","aabConfig","playerId","onAdError","getContainer","hasAdBlocked","adPlayerLoading","classList","remove","pauseReason","onAdBreakStart","currentTime","getCurrentTime","adposition","forwardEvent","eventName","adPlaying","getEvents","adPosition","adId","impression","impressionURL","removeEvents","adPlayer","adPlayerContainer","appendControl","controlsContainer","querySelector","domNode","getControlsContainer","fullScreenButton","fullscreenButton","cloneNode","onClick","handleClick","createFullscreenButton","jwPlayer","setFullscreen","toggleFullscreen","seekBar","progressLoader","setProgress","reset","createProgressBar","setAdPlaying","setAdComplete","playerClassList","adStarted","useClasses","getPlaybackState","volumeBtn","float","adjustVolumePosition","createHomadSkin","MutationObserver","mutations","mutation","nodes","addedNodes","video","observe","childList","characterData","canDeviceAutoplay","supposedCurrentTime","onSeeking","onTimeUpdate","seeking","init","videoElement","removeEventListener","handle","loadedStylesheets","href","rel","loadStylesheet","forwardIcon","audioSkinResolver","useAudioSkin","Boolean","seekForward","getPosition","seek","getControls","getStream","forwardTooltip","displayControl","cover","forwardButton","forwardControl","durationInfo","addButton","controls","displayStyle","setAttribute","display","innerText","iconsMap","info","avButton","audioIconsMap","defsLoaded","loadIcons","isAudioStream","replaceableIconsMap","customIcon","selector","replaceableIcons","querySelectorAll","replaceableIcon","svpIcon","getAttribute","replaceChild","contains","submenu","right","offsetWidth","offsetLeft","icon","infoNode","dataset","tip","isPrettierLoaded","dump","el","left","focus","select","execCommand","err","copyToClipboard","hasMediaId","getSharingLink","updateElement","previousSibling","replaceElement","sourceEl","newEl","updateSharingBox","svpPlayerModel","handleAppnexusClass","levels","handleLevelSettingsIcon","skinLoader","loader","svpSkin","PlayerModel","isInitalized","isStopped","viewport","onViewportChange","bindJwMethod","method","warn","getAdPosition","slotId","pre","mid","post","onPlaybackEndAvailable","playbackEnd","onTime","eventData","setup","accountCode","enableAnalytics","onPlaylistItemLoad","onPlay","onPause","onComplete","onPlayerResize","onViewable","onAutostartNotAllowed","onMeta","onMetadataCueParsed","getCaptionsList","meta","sequence","xml","adSelector","adData","podcount","parseAdData","complete","load","stop","streamPoster","playbackType","getVolume","setVolume","getMute","setMute","getState","nextStream","getJwConfig","loadStream","force","isAdPlaying","getAdBlock","provider","getProvider","playerCaptions","captionsIndex","setCurrentCaptions","hasValidToken","playlistItemId","onFirstFrameLoad","playbackEndTime","update","viewable","currentViewport","previousViewport","slotDuration","onTimeChange","adTag","playAd","content","skipAd","TXXX","insertAd","cancelAd","playReason","methods","forwardedMethods","proxyMethod","sourceMethod","Eventable","copyProperties","Reflect","ownKeys","desc","getOwnPropertyDescriptor","super","plugin","getName","CustomPluginModel","scripts","pluginSrc","apntag","firstLoad","tagId","tagConfig","targetId","defineTag","loadTags","onEvent","showTag","refresh","dimmensions","resizeAd","offEvent","maxDisplays","displayCounter","withAdTag","adPlacement","withCounter","getBoundingClientRect","resizeTag","appnexusAdId","creativeId","isAdTagLoaded","show","getViewable","refreshTag","hide","timerId","onSeek","render","adTagOptions","appnexusAdContainerId","closeIcon","closeButton","onResumeClick","stopPropagation","sponsor","pluginName","adFrom","assertUppercased","actual","expected","chooseVariant","variants","rangeNumber","winner","Percentage","percentage","prepareVariantsForExperiment","variantIds","filter","includes","isLoginVariantType","variant","Type","loginUrl","subscriptionUrl","articleUrl","OfferButton","isSubscriptionVariantType","useExtendedVariant","getHeight","buttonText","getButtonText","uiElementId","getUiElementId","pulseStatsPlugin","PulseStats","trackEngagement","productType","playbackEvents","Offer","OfferHeader","OfferPreamble","redirectUrl","preventDefault","experimentInfo","experimentOverlay","leadingZeros","numValue","numLen","num","liveDOM","countdownDOM","intervalId","getDateData","repaint","liveDate","isCountdownActive","sec","currentState","getDate","getHours","getMinutes","endDate","diff","dateData","years","days","mapResponse","getEngine","ml","fetchNext","items","playNext","nextAssetSource","disableNext","getThumbnailUrl","initSnapScroll","scrollSnapPrefix","gridItem","getByClass","onGridItemClicked","onPlaybackStart","recommended","getAsset","gridItemsReady","grid","getItems","getNextAsset","onInitialize","fetchDuration","isDisabledNextVideo","onPlaybackComplete","onTimeNextVisible","countdownTime","onPlayNextVisible","timeout","transitionDuration","onNextAssetReady","Image","getThumbnail","countdown","nextIcon","onGridItemsReady","onGridVisible","onAssetReplay","className","previousEl","sendRequest","queryString","apiUrl","getApiUrl","hypen","trackingInterval","getTrackingInterval","initialStartTime","trackMediaEvent","playerTime","trackStreamEvent","adSlot","PulseTrackerLoader","trackers","pulse","getTracker","storedTracker","PROVIDER_TRACKER_ID","promise","tracker","adSequencePosition","adSequenceCount","beforeUnload","onAdSlotComplete","onPlaylistItem","onAdSlotStart","onAdStarted","onAdProgress","onAdFinished","onAdPause","onAdPlay","onPauseAdVisible","onHomadEvent","adIds","adID","abbAdPlayed","onHdEvent","slotData","previousPosition","sendStopEvent","watchData","previousTime","session","createSession","beforeStreamStart","onBeforeUnload","playMethod","onAssetPlay","onPlayNext","onLiveTime","onRecommendedPlay","previousAssetId","playbackSource","eventInterval","wasViewed","eventTime","trackTimeEvent","onRecommendedVisible","categories","parentId","instances","getMediaAssetId","decorator","embed","adSequenceDuration","playerAsset","accessControl","access","getTags","stories","getStories","originAssetId","categoryPath","categoryTree","getPath","getCategoryPath","resolveTracker","adEvents","uiEvents","onAdEvent","onPlaybackEvent","onUiEvent","onAdMeta","onHomadAdMeta","textContent","intent","trackingData","muted","fullScreen","getFullscreen","adBlock","mediaAssetId","toLocaleLowerCase","destroy","destroyPlugin","clearError","previousErrorNode","displayError","posterSrc","errorNode","translatedMessage","errorDetails","isCompleted","onPlayerEvent","callFunction","onceConfigReady","handleReady","handleError","pluginConfig","addPlugin","setAsset","onAssetReady","hasPlayNext","setStream","getChapter","getAgeLimit","getCategoryTitle","isExperiment","loggedIn","experimentId","isPodcast","experimentRange","sessionStorage","pulseConfig","isStreamPlayable","onAssetError","isBlacklisted","isPlayNextAvailable","serverTime","ceil","getCurrentCaptions","styles","setCaptionsStyles","setPlayer","detected","bait","offsetParent","offsetHeight","offsetTop","getComputedStyle","baitTemp","getPropertyValue","Plugins","__defaults","configurable","aab","setLocale","svpYoubora","loadYoubora"],"mappings":"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AAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,GAAI,GAAI,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,EAAG,GAAI,GAAI,EAAG,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,GAAI,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,I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","file":"player.next.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 57);\n","export const ACTIVE = 12000;\nexport const ACTIVE_PREVIEW = 12001;\n\nexport const NOT_ACTIVE = 14001;\nexport const NOT_ACTIVE_GEOBLOCKED = 14002;\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]: 'Stream failed to play due to geoblock restrictions',\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 */\nexport default (errorCode) => statusMessages[errorCode] || statusMessages[GENERAL_ERROR];\n","/* eslint-disable max-len */\nimport codeToString, * as STATUS_CODES from '../playback/config/status-codes';\n\n// translation configuration for different locales\nconst translations = {\n 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', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n ],\n // general troubles, we don't know exactly what had happen\n [codeToString(STATUS_CODES.GENERAL_ERROR)]: 'Sorry. An error occured. Try again later.',\n // stream is available only in certain areas/countries\n [codeToString(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED)]: 'The video failed to play due to geoblock restrictions.',\n // stream is 404 (wrong/deleted from akamai)\n [codeToString(STATUS_CODES.NOT_FOUND)]: 'Sorry. This video is unavailable.',\n // asset is not active\n [codeToString(STATUS_CODES.NOT_ACTIVE)]: 'Sorry. This video is not active.',\n // asset's flight times are in the past\n [codeToString(STATUS_CODES.NOT_ACTIVE_PAST)]: 'Sorry. This video is unavailable.',\n // network error while playing live stream\n [codeToString(STATUS_CODES.NETWORK_ERROR)]: 'Network issues. Please check your internet connection',\n // token can not be retrieved\n [codeToString(STATUS_CODES.TOKEN_FETCH_ERROR)]: '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 },\n\n adblock: {\n admessage: 'The ad will end in [time]s'\n },\n player: {\n listen: 'Listen',\n playback: 'Start playback',\n loginToListen: 'Sign in to listen',\n subscribeToListen: 'Subscribe to listen'\n }\n },\n 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', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'\n ],\n // general troubles, we don't know exactly what had happen\n [codeToString(STATUS_CODES.GENERAL_ERROR)]: '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)]: 'Denne videoen er kun tilgjengelig i Norge',\n // stream is 404 (wrong/deleted from akamai)\n [codeToString(STATUS_CODES.NOT_FOUND)]: 'Beklager, videoen er ikke tilgjengelig',\n // asset is not active\n [codeToString(STATUS_CODES.NOT_ACTIVE)]: 'Beklager, videoen er ikke tilgjengelig',\n // asset's flight times are in the past\n [codeToString(STATUS_CODES.NOT_ACTIVE_PAST)]: 'Beklager, vi har ikke rettigheter til å vise videoen lenger',\n // network error while playing live stream\n [codeToString(STATUS_CODES.NETWORK_ERROR)]: 'Kunne ikke spille av video, venligst sjekk internettforbindelsen din',\n // token can not be retrieved\n [codeToString(STATUS_CODES.TOKEN_FETCH_ERROR)]: '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.': 'Kunne ikke spille av video på grunn av en teknisk feil',\n 'Sorry, the video player failed to load.': 'Kunne ikke spille av video, venligst sjekk
internettforbindelsen din',\n 'This video file cannot be played.': 'Kunne ikke spille av video',\n 'The live stream is either down or has ended.': 'Livesendingen er nede eller er avsluttet',\n 'There was a problem providing access to protected content.': 'Kunne ikke spille av video, venligst sjekk
internettforbindelsen din',\n 'This video cannot be played because of a problem with your internet connection.': 'Kunne ikke spille av video, venligst sjekk
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 // av button\n 'Audio video switch': 'Kun lyd',\n 'Playing audio only': 'Spiller kun lyd',\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 },\n\n adblock: {\n admessage: 'Annonsen slutter om [time]'\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 }\n },\n\n 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', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'\n ],\n // general troubles, we don't know exactly what had happen\n [codeToString(STATUS_CODES.GENERAL_ERROR)]: '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)]: 'Vi har tyvärr endast rättigheter att spela detta innehåll i Sverige',\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)]: 'Videon är inte tillgänglig',\n // network error while playing live stream\n [codeToString(STATUS_CODES.NETWORK_ERROR)]: '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)]: 'Token kunde inte hämtas',\n\n // jw player error messages\n 'This video cannot be played because of a technical error.': 'Den här videon kan inte spelas på grund av ett tekniskt fel',\n 'Sorry, the video player failed to load.': '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.': 'Live överföring är antingen nere eller har slutat',\n 'There was a problem providing access to protected content.': '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å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 // av button\n 'Audio video switch': 'Endas ljud',\n 'Playing audio only': 'Spelar bara ljud',\n\n ads: {\n admessage: 'Annonsen tar slut om 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 },\n\n adblock: {\n admessage: 'Annonsen tar slut om [time] sekunder'\n },\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 }\n }\n};\n\n/**\n * Get single locale translations hash map\n */\nexport default function (locale) {\n return translations[locale];\n}\n","/* global __BUILD_VERSION__ */\nimport translations from './config/translations';\nimport jwKeys from './config/jw-keys';\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: '//svp.vg.no/svp/api/v1/',\n tokenUrl: '//svp.vg.no/svp/token/v1/',\n thumbnailsUrl: '//svp.vg.no/svp/thumbnails/v1/',\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 * @param vendor\n * @param endpoint\n * @returns {string}\n */\n getUrl(vendor, endpoint) {\n const joiner = (endpoint.indexOf('?') > -1) ? '&' : '?';\n let url = `${this.url + vendor + endpoint + joiner}appName=${this.identifier}`;\n\n // enable cachebreaking in preview mode\n if (this.cb === true) {\n url += `&cb=${Math.random() * 10000}`;\n }\n\n return url;\n }\n },\n\n ads: {\n homad: {\n global: 'https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json',\n client: '/homad-config.json'\n },\n\n appnexus: {\n vmap: 'https://ib.adnxs.com/vmap',\n ptv: 'https://ib.adnxs.com/ptv',\n ast: 'https://acdn.adnxs.com/ast/ast.js',\n debug: false\n }\n },\n\n cdn: {\n svp: `//cdn.stream.schibsted.media/player/${VERSION}`,\n player: '//cdn.stream.schibsted.media/jw/jwplayer-8.15.0',\n pollyfils: '//svp.vgc.no/pollyfils/es6-promise.min.js',\n youbora: 'https://smartplugin.youbora.com/v6/js/adapters/jwplayer/6.5.0/sp.min.js'\n },\n\n time: '//svp.vg.no/svp/api/v1/time',\n\n /**\n * Imbo images server\n */\n images: {\n servers: ['imbo', 'imbo01', 'imbo02', 'imbo03'],\n\n sizes: {\n poster: {\n autoHeight: [\n 380, 480, 580, 680, 780, 800, 980, 1080, 1440, 2048\n ],\n autoWidth: [\n 452, 613, 740, 900, 1080, 1440\n ]\n }\n\n }\n },\n\n /**\n * Default skins for providers\n */\n skins: {\n default: {\n url: `//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 // eslint-disable-next-line max-len\n code: ''\n }\n },\n\n domains: {\n blacklist: {\n global: [],\n ab: ['*avpixlat.info', '*exponerat.net']\n },\n\n whitelist: {\n global: [\n '*localhost', '*schibsted.io', '*schibsted.media', '*schibsted.ws', '*schibsted.se', '*smp.no',\n '*plan3dev.se', '*plan3.se',\n '*vg.no', '*vgtv.no', '*vgnett.no',\n '*aftonbladet.se',\n '*aftenposten.no', '*ap.no',\n '*sa.no', '*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', '*fedrelandsvennen.no', '*lister24.no', '*l-a.no', '*lindesnesfyr.no',\n\n // Polaris related newspapers\n // addressa.no\n '*adressa.no', '*avisa-st.no', '*banett.no', '*fosna-folket.no', '*hitra-froya.no', '*innherred.no',\n '*mb.no', '*bladet.no', '*opdalingen.no', '*tronderbladet.no',\n // rbnett\n '*rbnett.no', '*andalsnes-avis.no', '*driva.no',\n // smp newspaper\n '*smp.no', '*dolen.no', '*fjordabladet.no', '*fjt.no', '*fjordingen.no', '*fjuken.no', '*heroynytt.no',\n '*morenytt.no', '*sunnmoringen.no', '*vigga.no', '*vikebladet.no',\n // itromso.no\n '*itromso.no', '*framtidinord.no',\n // ht.no\n '*ht.no', '*vol.no',\n // t-a.no\n '*t-a.no', '*namdalsavisa.no',\n // other polaris newspapers\n '*altaposten.no', '*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 translations: translations\n};\n\nexport default config;\n","\nexport 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};\n","import config from '../config';\n\nconfig.env = 'production';\nexport default config;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","module.exports = \"\"","import scriptLoader from './script-loader';\n\nconst loadModule = (moduleSrc) => {\n const root = window;\n\n if (root.define && root.define.amd) {\n return new Promise((resolve) => {\n root.require([moduleSrc], resolve);\n });\n }\n\n return scriptLoader(moduleSrc);\n};\n\nexport default loadModule;\n","function 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 ( !done && (!this.readyState ||\n this.readyState === \"loaded\" || this.readyState === \"complete\") ) {\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\nexport default (path) => {\n return new Promise((resolve, reject) => loadScript(path, resolve, reject));\n}","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","/* 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 = \"
\\n
\\\">
\\n\\n
\\n \\n \\n \\n
\\n\\n \\n
\"","module.exports = \"
\\n
\\n
\\n \\n \\n
\\n
\\n \\n
\\n
\\n
\\n\"","module.exports = \"\\n\"","module.exports = \"\\n <%= closeIcon %>\\n\\n\\n <%= next.getTitle() %>\\n ');\\\">\\n s\\\">\\n Next <%= nextIcon %>\\n );\\\">\\n \\n\\n\"","module.exports = \"\\n\"","import config from 'player/config';\nimport moduleLoader from 'utils/module-loader';\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\nconst loadJwPlayer = (root) => {\n const PLAYER_LIB = `${config.cdn.player}/jwplayer.js`;\n\n return moduleLoader(PLAYER_LIB).then((jwplayer = root.jwplayer) => {\n root.jwplayer = jwplayer;\n });\n};\n\n(async function (root) {\n const onReady = root.onSvpPlayerReady;\n\n // onSvpPlayerReady is required callback to handle due to SDK async loading\n loadJwPlayer(root)\n .then(loadSvpLibrary)\n .then((library) => {\n const [SVP, preInitialize, postInitialize] = library;\n\n if ((root && !root.SVP) || (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 });\n}(window));\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","/* jshint ignore:start */\n\n var idCounter = 0;\n\n // we do not include underscore as it is our hard dependency\n var _ = jwplayer._,\n property = function (key) {\n return function (obj) {\n return obj == null ? void 0 : obj[key];\n };\n },\n MAX_ARRAY_INDEX = Math.pow(2, 53) - 1,\n getLength = property('length'),\n isArrayLike = function (collection) {\n var length = getLength(collection);\n return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n };\n\n _.isEmpty = function (obj) {\n if (obj == null) return true;\n if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;\n return _.keys(obj).length === 0;\n };\n\n _.uniqueId = function(prefix) {\n var id = ++idCounter + '';\n return prefix ? prefix + id : id;\n };\n\n export default _;\n\n/* jshint ignore:end */\n","/* jshint ignore:start */\nimport _ 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 // _.extend(object, Backbone.Events);\n // object.on('expand', function(){ alert('expanded'); });\n // object.trigger('expand');\n //\n var Events = {};\n\n // Regular expression used to split event strings.\n var 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}`).\n var eventsApi = function(iteratee, events, name, callback, opts) {\n var i = 0, names;\n if (name && typeof name === 'object') {\n // Handle event maps.\n if (callback !== void 0 && 'context' in opts && opts.context === void 0) opts.context = callback;\n for (names = _.keys(name); i < names.length ; i++) {\n events = eventsApi(iteratee, events, names[i], name[names[i]], opts);\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 // Bind an event to a `callback` function. Passing `\"all\"` will bind\n // the callback to all events fired.\n Events.on = function(name, callback, context) {\n return internalOn(this, name, callback, context);\n };\n\n // Guard the `listening` argument from the public API.\n var 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 var listeners = obj._listeners || (obj._listeners = {});\n listeners[listening.id] = listening;\n }\n\n return obj;\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.\n Events.listenTo = function(obj, name, callback) {\n if (!obj) return this;\n var id = obj._listenId || (obj._listenId = _.uniqueId('l'));\n var listeningTo = this._listeningTo || (this._listeningTo = {});\n var 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 var thisId = this._listenId || (this._listenId = _.uniqueId('l'));\n listening = listeningTo[id] = {obj: obj, objId: id, id: thisId, listeningTo: listeningTo, count: 0};\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 adds a callback to the `events` object.\n var onApi = function(events, name, callback, options) {\n if (callback) {\n var handlers = events[name] || (events[name] = []);\n var context = options.context, ctx = options.ctx, listening = options.listening;\n if (listening) listening.count++;\n\n handlers.push({ callback: callback, context: context, ctx: context || ctx, listening: listening });\n }\n return events;\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.\n Events.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.\n Events.stopListening = function(obj, name, callback) {\n var listeningTo = this._listeningTo;\n if (!listeningTo) return this;\n\n var ids = obj ? [obj._listenId] : _.keys(listeningTo);\n\n for (var i = 0; i < ids.length; i++) {\n var 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 = void 0;\n\n return this;\n };\n\n // The reducing API that removes a callback from the `events` object.\n var offApi = function(events, name, callback, options) {\n if (!events) return;\n\n var i = 0, listening;\n var context = options.context, listeners = options.listeners;\n\n // Delete all events listeners and \"drop\" events.\n if (!name && !callback && !context) {\n var ids = _.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\n var names = name ? [name] : _.keys(events);\n for (; i < names.length; i++) {\n name = names[i];\n var 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 var remaining = [];\n for (var j = 0; j < handlers.length; j++) {\n var handler = handlers[j];\n if (\n callback && 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)) return events;\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.\n Events.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, void 0, context);\n };\n\n // Inversion-of-control versions of `once`.\n Events.listenToOnce = function(obj, name, callback) {\n // Map the event into a `{event: once}` object.\n var events = eventsApi(onceMap, {}, name, callback, _.bind(this.stopListening, this, obj));\n return this.listenTo(obj, events);\n };\n\n // Reduces the event callbacks into a map of `{event: onceWrapper}`.\n // `offer` unbinds the `onceWrapper` after it has been called.\n var onceMap = function(map, name, callback, offer) {\n if (callback) {\n var 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 // 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).\n Events.trigger = function(name) {\n if (!this._events) return this;\n\n var length = Math.max(0, arguments.length - 1);\n var args = Array(length);\n for (var i = 0; i < length; i++) args[i] = arguments[i + 1];\n\n eventsApi(triggerApi, this._events, name, void 0, args);\n return this;\n };\n\n // Handles triggering the appropriate event callbacks.\n var triggerApi = function(objEvents, name, cb, args) {\n if (objEvents) {\n var events = objEvents[name];\n var 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 // 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).\n var triggerEvents = function(events, args) {\n var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];\n switch (args.length) {\n case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;\n case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;\n case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;\n case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;\n default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); return;\n }\n };\n\n // Aliases for backwards compatibility.\n Events.bind = Events.on;\n Events.unbind = Events.off;\n\n export default Events;\n\n","\n \n var userAgent = navigator.userAgent;\n\n function userAgentMatch(regex) {\n return userAgent.match(regex) !== null;\n }\n\n function lazyUserAgentMatch(regex) {\n return function () {\n return userAgentMatch(regex);\n };\n }\n\n var isFF = lazyUserAgentMatch(/gecko\\//i);\n var isIETrident = lazyUserAgentMatch(/trident\\/.+rv:\\s*11/i);\n var isIPad = lazyUserAgentMatch(/iPad/i);\n var isIPhone = lazyUserAgentMatch(/iPhone/i);\n// Check for Facebook App Version to see if it's Facebook\n\n function isEdge() {\n return userAgentMatch(/\\sEdge\\/\\d+/i);\n }\n\n function isMSIE() {\n return userAgentMatch(/msie/i);\n }\n\n function isChrome() {\n return userAgentMatch(/\\s(?:Chrome|CriOS)\\//i) && !isEdge();\n }\n\n function isIE() {\n return isEdge() || isIETrident() || isMSIE();\n }\n\n function isSafari() {\n return userAgentMatch(/safari/i) && !userAgentMatch(/(?:Chrome|CriOS|chromium|android)/i);\n }\n\n /** Matches iOS devices **/\n function 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 } else {\n // didn't match version\n return false;\n }\n }\n\n return isAppleIOS;\n }\n\n function isAndroid() {\n return userAgentMatch(/Android/i);\n }\n\n /** Matches Android devices **/\n function isAndroidNative() {\n // Android Browser appears to include a user-agent string for Chrome/18\n if (userAgentMatch(/chrome\\/[123456789]/i) && !userAgentMatch(/chrome\\/18/i) && !isFF()) {\n return false;\n }\n return isAndroid();\n }\n\n /**\n * If the browser has flash capabilities, return the flash version\n */\n function flashVersion() {\n if (isAndroid()) {\n return 0;\n }\n\n var plugins = navigator.plugins;\n var flash;\n\n if (plugins) {\n flash = plugins['Shockwave Flash'];\n if (flash && flash.description) {\n return parseFloat(flash.description.replace(/\\D+(\\d+\\.?\\d*).*/, '$1'));\n }\n }\n\n if (typeof window.ActiveXObject !== 'undefined') {\n try {\n flash = new window.ActiveXObject('ShockwaveFlash.ShockwaveFlash');\n if (flash) {\n return parseFloat(flash.GetVariable('$version').split(' ')[1].replace(/\\s*,\\s*/, '.'));\n }\n } catch (e) {\n return 0;\n }\n\n return flash;\n }\n return 0;\n }\n\n export default {\n isIOS: isIOS,\n isIPhone: isIPhone,\n isIPad: isIPad,\n isSafari: isSafari,\n\n isAndroid: isAndroid,\n isAndroidNative: isAndroidNative,\n isChrome: isChrome,\n\n isFirefox: isFF,\n\n isEdge: isEdge,\n isIE: isIE,\n\n isDesktop: function () {\n return !this.isMobile() && !this.isTablet();\n },\n\n isSamsungInternet: function () {\n return userAgent.indexOf('SamsungBrowser') !== -1;\n },\n\n isTablet: function () {\n var isTablet = isIPad() || false;\n\n // android tables are when\n if (this.isAndroid() && (userAgent.indexOf('Mobile') === -1)) {\n isTablet = true;\n }\n\n return isTablet;\n },\n\n isMobile: function () {\n return userAgent.match(/(iPhone|iPod|Android(?=.*Mobile).*|HTC|Fennec|IEMobile|BlackBerry|SymbianOS(?=.*AppleWebKit).*|Opera Mobi|Symbian|SonyEricsson|Nokia|SAMSUNG|LG)/i) === null ? false : true;\n },\n\n isWindowsPhone: function () {\n return userAgent.match(/Windows Phone/i) !== null;\n },\n\n getChromeVersion: function () {\n var raw = userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\n\n return raw ? parseInt(raw[2], 10) : false;\n },\n\n getPixelRatio: function () {\n var devicePixelRatio = window.devicePixelRatio || 1;\n\n if (devicePixelRatio > 1) {\n devicePixelRatio = 2;\n }\n\n return devicePixelRatio;\n },\n\n getFlashVersion: flashVersion,\n\n\n /**\n * Tracking is divided by device type\n *\n * @returns {*}\n */\n getDeviceType: function () {\n if (this.isTablet()) {\n return 'tablet';\n }\n\n if (this.isMobile()) {\n return 'phone';\n }\n\n return 'desktop';\n },\n\n canAutoplay: function () {\n var canAutoplay = 'always';\n\n // default is muted for never ios systems\n if (this.isIOS()) {\n canAutoplay = '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 canAutoplay = 'never';\n }\n\n // chrome android can autoplay muted\n if (this.isAndroid() && !this.isSamsungInternet() && this.getChromeVersion() >= 53) {\n canAutoplay = 'muted';\n }\n\n return canAutoplay;\n }\n };\n\n","/* jshint ignore:start */\n\n function isMergeableObject(val) {\n var nonNullObject = val && typeof val === 'object'\n\n return nonNullObject\n && Object.prototype.toString.call(val) !== '[object RegExp]'\n && Object.prototype.toString.call(val) !== '[object Date]'\n }\n\n function emptyTarget(val) {\n return Array.isArray(val) ? [] : {}\n }\n\n function cloneIfNecessary(value, optionsArgument) {\n var clone = optionsArgument && optionsArgument.clone === true\n return (clone && isMergeableObject(value)) ? deepmerge(emptyTarget(value), value, optionsArgument) : value\n }\n\n function 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\n function 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(target[key], source[key], optionsArgument)\n }\n })\n return destination\n }\n\n function 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) ? arrayMerge(target, source, optionsArgument) : cloneIfNecessary(source, optionsArgument)\n } else {\n return mergeObject(target, source, optionsArgument)\n }\n }\n\n deepmerge.all = function deepmergeAll(array, optionsArgument) {\n if (!Array.isArray(array) || array.length < 2) {\n throw new Error('first argument should be an array with at least two elements')\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\n window.deepmerge = deepmerge;\n\n export default deepmerge;\n\n","/* global jwplayer */\nimport Events from './backbone.events';\nimport device from './device';\nimport merge from './merge';\n var jwUtils = jwplayer.utils,\n jwUnderscore = jwplayer._,\n // jwplayer is hard dependecy here\n utils = {\n Events: Events,\n\n // methods reused from jwplayer core\n extend: jwUtils.extend,\n // merge with deep copy, similar to jQuery extend\n merge: merge,\n\n ajax: jwUtils.ajax,\n\n each: jwUnderscore.each,\n isUndefined: jwUnderscore.isUndefined,\n isNumber: jwUnderscore.isNumber,\n isString: jwUnderscore.isString,\n isArray: jwUnderscore.isArray,\n omit: jwUnderscore.omit,\n memoize: jwUnderscore.memoize,\n\n createNode: jwUtils.createElement,\n addStyleSheet: jwUtils.addStyleSheet,\n addClass: jwUtils.addClass,\n removeClass: jwUtils.removeClass,\n throttle: jwUnderscore.throttle,\n\n /* jshint ignore:start */\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] = cache[str] ||\n tmpl(document.getElementById(str).innerHTML) :\n\n // Generate a reusable function that will serve as a template\n // generator (and which will be cached).\n new Function(\"obj\",\n \"var p=[],print=function(){p.push.apply(p,arguments);};\" +\n\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(\"<%\").join(\"\\t\")\n .replace(/((^|%>)[^\\t]*)'/g, \"$1\\r\")\n .replace(/\\t=(.*?)%>/g, \"',$1,'\")\n .split(\"\\t\").join(\"');\")\n .split(\"%>\").join(\"p.push('\")\n .split(\"\\r\").join(\"\\\\'\")\n + \"');}return p.join('');\");\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 durationToSeconds: function (time) {\n const [hours, minutes, seconds] = time.split(':').map((i) => parseInt(i, 10));\n return seconds + (60 * minutes) + (60 * 60 * hours);\n },\n\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 seconds + (minutes ? parseInt(minutes, 10) * 60 : 0) + (hours ? parseInt(hours, 10) * 3600 : 0);\n }\n },\n\n\n hasFlash: function () {\n return device.getFlashVersion() > 0;\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 escape: function (str) {\n var escapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n };\n\n return str.replace(/[&<>\"'`]/g, function replaceTag(tag) {\n return escapeMap[tag] || tag;\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 (hours > 0 ? hours + ':' : '') + utils.number.zeroPad(minutes) + ':' + utils.number.zeroPad(seconds);\n }\n },\n\n inherit: function (o) {\n function F() {\n } // Dummy constructor\n\n F.prototype = o;\n return new F();\n },\n\n model: {\n // Helper function to correctly set up the prototype chain, for subclasses.\n // Similar to `goog.inherits`, but uses a hash of prototype properties and\n // class properties to be extended.\n extend: function (protoProps, staticProps) {\n var parent = this;\n var child = function () {\n return parent.apply(this, arguments);\n };\n\n // Add static properties to the constructor function, if supplied.\n utils.extend(child, parent, staticProps);\n\n // Set the prototype chain to inherit from `parent`, without calling\n // `parent`'s constructor function.\n var Surrogate = function () {\n this.constructor = child;\n };\n Surrogate.prototype = parent.prototype;\n child.prototype = new Surrogate();\n\n // Add prototype properties (instance properties) to the subclass,\n // if supplied.\n if (protoProps) {\n utils.extend(child.prototype, protoProps);\n }\n\n // Set a convenience property in case the parent's prototype is needed\n // later.\n child.__super__ = parent.prototype;\n\n return child;\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 loadScript: function (path) {\n return new Promise(function (resolve, reject) {\n var script = document.createElement(\"script\"),\n done = false;\n\n script.type = \"text/javascript\";\n script.src = path;\n script.async = true;\n script.onreadystatechange = script.onload = function() {\n if ( !done && (!this.readyState ||\n this.readyState === \"loaded\" || this.readyState === \"complete\") ) {\n done = true;\n resolve();\n\n // Handle memory leak in IE\n script.onload = script.onreadystatechange = null;\n }\n };\n script.onerror = reject;\n\n document.body.appendChild(script);\n });\n },\n\n jsonToUrl: function (obj) {\n return Object.keys(obj).map(function(key) {\n return encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]);\n }).join('&');\n }\n };\n\n /**\n * Polyfill for String.startsWith\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith\n */\n (function() {\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function(searchString, position) {\n position = position || 0;\n return this.indexOf(searchString, position) === position;\n };\n }\n })();\n\n export default utils;\n\n","/* global console */\nconst 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 console.log(...args);\n};\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);\n } catch (error) {\n return false;\n }\n};\n\nexport default function(block = 'SVP') {\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","import utils from './utils';\n /**\n * Server time helper required for syncing browser time with stream vendors servers (SMP Stream)\n * @type {{_time: null, _responseTime: null, fetch: Function, getTime: Function}}\n */\n var ServerTime = {\n _time: null,\n _responseTime: null,\n\n fetch: function(url) {\n var resolveRequest = function (time) {\n this._time = time;\n this._responseTime = new Date().getTime();\n }.bind(this);\n\n // TODO server url?\n utils.ajax(url, function(result) {\n // set current microtime if server will return value different than int\n if(isNaN(parseInt(result, 10))) {\n result = (new Date().getTime());\n } else {\n // adjust to miliseconds\n result = result * 1000;\n }\n resolveRequest(result);\n }.bind(this), function() {\n resolveRequest(new Date().getTime());\n }.bind(this), true);\n },\n\n getTime: function() {\n return this._time + (new Date().getTime() - this._responseTime);\n }\n };\n\n export default ServerTime;\n\n","import _ from './underscore';\nimport Events from './backbone.events';\n\nconst SimpleModel = _.extend({\n 'get': function (attr) {\n this.attributes = this.attributes || {};\n return this.attributes[attr];\n },\n 'set': function (attr, val) {\n this.attributes = this.attributes || {};\n\n if (this.attributes[attr] === val) {\n return;\n }\n var oldVal = this.attributes[attr];\n this.attributes[attr] = val;\n this.trigger('change:' + attr, this, val, oldVal);\n },\n 'clone': function () {\n return _.clone(this.attributes);\n }\n}, Events);\n\nexport default SimpleModel;\n","/* eslint-disable no-param-reassign */\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\n\n/**\n * Parse related experiments\n * @param data\n */\nfunction parseRelatedExperiments(data) {\n let start = 0;\n\n return data.split(',').map((experiment) => {\n const [name, traffic] = experiment.split(':');\n\n if (!traffic) {\n throw new Error('could not parse related experiments');\n }\n\n const end = parseInt(traffic, 10);\n const item = { name, start, end: start + end };\n\n start += end;\n\n return item;\n });\n}\n\nconst Category = function (options) {\n this.attributes = {\n id: 0\n };\n\n this.initialize(options);\n};\n\nCategory.prototype = {\n initialize(data) {\n utils.extend(this.attributes, this.parse(data));\n },\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 data = utils.omit(data, ['additional', 'background', 'image', 'logo', 'playerLogoImage']);\n\n try {\n data.relatedExperiments = parseRelatedExperiments(data.metadata.relatedExperiments.value);\n } catch (e) {\n data.relatedExperiments = [];\n }\n }\n\n return data;\n },\n\n getRelatedExperiments() {\n return this.get('relatedExperiments') || [];\n },\n\n isSeries() {\n return this.get('isSeries') === true;\n },\n\n getLastAsset() {\n return this.get('lastAsset') || {}; // cant be object because of circular dependency\n }\n};\n\nutils.extend(Category.prototype, Model);\n\nexport default Category;\n","/* eslint-disable no-param-reassign */\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\nimport config from 'player/config';\nimport Category from './category';\n\nfunction handleErrors(response) {\n if (!response.ok) {\n return Promise.reject(response);\n }\n return response;\n}\n\nconst Asset = function (options) {\n this.attributes = {\n id: 0\n };\n\n this.initialize(options);\n};\n\nAsset.prototype = {\n initialize(data) {\n utils.extend(this.attributes, this.parse(data));\n },\n\n url() {\n const additional = [\n 'settings', 'chapters', 'cuePoints', 'externalId', 'barrels',\n 'externalCategoryId', 'nextAsset', 'sourceFiles', 'subtitles',\n 'metadata', 'access', 'tags', 'stories'\n ];\n\n return config.api.getUrl(this.getVendor(), `/assets/${this.get('id')}?additional=${additional.join('|')}`);\n },\n\n parse(data) {\n data = data || {};\n\n function 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\n // rewrite additional fields\n if (data.additional) {\n utils.each(data.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 data[key] === 'undefined') {\n data[key] = value;\n }\n });\n\n if (data.additional.settings) {\n if (data.additional.settings.startIndexPoint) {\n data.startIndexPoint = data.additional.settings.startIndexPoint;\n }\n\n if (!utils.isUndefined(data.additional.settings.ageLimit)) {\n data.ageLimit = data.additional.settings.ageLimit;\n }\n }\n\n if (data.additional.sourceFiles) {\n data.sourceFiles = data.additional.sourceFiles;\n }\n }\n\n if (data.series) {\n data.season = parseInt(data.series.seasonNumber, 10);\n data.episode = parseInt(data.series.episodeNumber, 10);\n\n data = utils.omit(data, 'series');\n }\n\n // multiply timestamps by 1000 to use ms instead of s\n if (data.flightTimes) {\n data.flightTimes = {\n start: (data.flightTimes.start ? unifyTimestamp(data.flightTimes.start) : null),\n end: (data.flightTimes.end ? unifyTimestamp(data.flightTimes.end) : null)\n };\n }\n\n data.created = (data.created ? unifyTimestamp(data.created) : null);\n data.published = (data.published ? unifyTimestamp(data.published) : null);\n data.updated = (data.updated ? unifyTimestamp(data.updated) : null);\n\n if (data.category) {\n data.category = new Category(data.category);\n }\n\n if (data.chapters) {\n utils.each(data.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 (!data.nextAsset) {\n data.nextAsset = {};\n }\n\n data.tags = data.tags || [];\n\n // eslint-disable-next-line\n if (data._embedded && data._embedded.tags) {\n // eslint-disable-next-line\n data.tags = data._embedded.tags;\n }\n\n return data;\n },\n\n fetch() {\n return fetch(this.url())\n .then(handleErrors)\n .then((response) => response.json())\n .then((json) => {\n Object.assign(this.attributes, this.parse(json));\n });\n },\n\n getVendor() {\n return this.get('vendor');\n },\n\n destroy() {\n // in case of any cleanup\n },\n\n getAgeLimit() {\n return utils.isNumber(this.get('ageLimit')) ? this.get('ageLimit') : -1;\n },\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 = 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 getCategoryTitle() {\n const category = this.get('category');\n const {\n attributes: {\n title\n } = {}\n } = category || {};\n return title;\n },\n\n getNextAssetId() {\n return (this.get('nextAsset') && this.get('nextAsset').id) || null;\n },\n\n getNextAssetSource() {\n const metadataKey = 'relatedExperiments';\n const metadata = this.get('metadata');\n\n if (metadata && metadata[metadataKey]) {\n // byId manually set\n if (metadata[metadataKey] === 'byId') {\n return 'manual';\n }\n\n return metadata[metadataKey];\n }\n\n return null;\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 {*|Array}\n */\n getChapters() {\n return this.get('chapters') || [];\n },\n\n getThumbnail() {\n return this.get('images').main;\n },\n\n getTitle() {\n return this.get('title');\n },\n\n getCategory() {\n return this.get('category');\n }\n};\n\nutils.extend(Asset.prototype, Model);\n\nexport default Asset;\n","import config from 'player/config';\n\nfunction handleErrors(response) {\n if (!response.ok) {\n return Promise.reject(response);\n }\n return response;\n}\n\nconst APPNEXUS_PROVIDER_ID = 'appnexus';\n\nconst api = (vendor, endpoint) => fetch(config.api.getUrl(vendor, endpoint))\n .then(handleErrors)\n .then((response) => response.json());\n\n\nexport {\n APPNEXUS_PROVIDER_ID\n};\n\nexport default api;\n","import api from '../api';\n\nconst getEndpoint = (categoryId, seasonNumber) => `/categories/${categoryId}/seasons/${seasonNumber}/assets`;\n\nconst getNextFromEpisodeList = (assetId, assets) => {\n if (!assets) {\n return null;\n }\n\n return assets[assets.findIndex((item) => item.id === assetId) - 1];\n};\n\nconst getNextEpisode = async ({\n vendor, assetId, categoryId, season\n}) => {\n const response = await api(\n vendor,\n getEndpoint(categoryId, season)\n );\n\n const assets = (response && response.assets);\n\n // empty assetId, get first episode from series which is last in list\n if (assetId === null) {\n return assets[assets.length - 1] || null;\n }\n\n return getNextFromEpisodeList(assetId, assets);\n};\n\n\nexport default {\n getNextEpisode\n};\n","import api from '../api';\n\nconst getEndpoint = (assetId, limit = 20, engine) => {\n if (engine.indexOf('related-exprmnts') > -1) {\n return `/assets/${engine}/${assetId}`;\n }\n return `/assets/${assetId}/${engine}?limit=${limit}`;\n};\n\n/**\n * Fetch related list from related endpoint\n *\n * @param vendor\n * @param assetId\n * @param limit\n * @param engine - curently supported engines related (tags); related-ml (machine learning related);\n * related-exprmnts build on top of ML engine with additional adjustments\n *\n * @returns {Promise<*>}\n */\nconst getList = async ({\n vendor, assetId, limit = 20, engine = 'related'\n}) => {\n const data = await api(\n vendor,\n getEndpoint(assetId, limit, engine)\n );\n\n // eslint-disable-next-line\n return data && data._embedded && data._embedded.assets;\n};\n\n\nexport default {\n getList\n};\n","// eslint-disable-next-line max-len\nconst VIDEO = new Blob([new Uint8Array([0, 0, 0, 28, 102, 116, 121, 112, 105, 115, 111, 109, 0, 0, 2, 0, 105, 115, 111, 109, 105, 115, 111, 50, 109, 112, 52, 49, 0, 0, 0, 8, 102, 114, 101, 101, 0, 0, 2, 239, 109, 100, 97, 116, 33, 16, 5, 32, 164, 27, 255, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 33, 16, 5, 32, 164, 27, 255, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 167, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 2, 194, 109, 111, 111, 118, 0, 0, 0, 108, 109, 118, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 232, 0, 0, 0, 47, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 236, 116, 114, 97, 107, 0, 0, 0, 92, 116, 107, 104, 100, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 101, 100, 116, 115, 0, 0, 0, 28, 101, 108, 115, 116, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 47, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 100, 109, 100, 105, 97, 0, 0, 0, 32, 109, 100, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 68, 0, 0, 8, 0, 85, 196, 0, 0, 0, 0, 0, 45, 104, 100, 108, 114, 0, 0, 0, 0, 0, 0, 0, 0, 115, 111, 117, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 111, 117, 110, 100, 72, 97, 110, 100, 108, 101, 114, 0, 0, 0, 1, 15, 109, 105, 110, 102, 0, 0, 0, 16, 115, 109, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 100, 105, 110, 102, 0, 0, 0, 28, 100, 114, 101, 102, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 117, 114, 108, 32, 0, 0, 0, 1, 0, 0, 0, 211, 115, 116, 98, 108, 0, 0, 0, 103, 115, 116, 115, 100, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 87, 109, 112, 52, 97, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 16, 0, 0, 0, 0, 172, 68, 0, 0, 0, 0, 0, 51, 101, 115, 100, 115, 0, 0, 0, 0, 3, 128, 128, 128, 34, 0, 2, 0, 4, 128, 128, 128, 20, 64, 21, 0, 0, 0, 0, 1, 244, 0, 0, 1, 243, 249, 5, 128, 128, 128, 2, 18, 16, 6, 128, 128, 128, 1, 2, 0, 0, 0, 24, 115, 116, 116, 115, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 4, 0, 0, 0, 0, 28, 115, 116, 115, 99, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 28, 115, 116, 115, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 115, 0, 0, 1, 116, 0, 0, 0, 20, 115, 116, 99, 111, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 44, 0, 0, 0, 98, 117, 100, 116, 97, 0, 0, 0, 90, 109, 101, 116, 97, 0, 0, 0, 0, 0, 0, 0, 33, 104, 100, 108, 114, 0, 0, 0, 0, 0, 0, 0, 0, 109, 100, 105, 114, 97, 112, 112, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 105, 108, 115, 116, 0, 0, 0, 37, 169, 116, 111, 111, 0, 0, 0, 29, 100, 97, 116, 97, 0, 0, 0, 1, 0, 0, 0, 0, 76, 97, 118, 102, 53, 54, 46, 52, 48, 46, 49, 48, 49])], { type: 'video/mp4' });\n\nconst getMockAsset = () => ({\n id: 1,\n status: 'active',\n streamType: 'mock',\n streamUrls: {\n hls: URL.createObjectURL(VIDEO)\n },\n\n images: {\n main: null\n },\n\n streamConfiguration: {\n properties: []\n },\n category: {}\n});\n\nexport {\n getMockAsset\n};\n","import api from '../api';\nimport { getMockAsset } from './asset/mock';\n\nconst getAssetEndpoint = (id) => {\n const additional = [\n 'settings', 'chapters', 'cuePoints', 'externalId', 'barrels',\n 'externalCategoryId', 'nextAsset', 'sourceFiles', 'subtitles',\n 'metadata', 'access', 'tags', 'stories'\n ];\n\n return `/assets/${id}?additional=${additional.join('|')}`;\n};\n\nconst getListEndpoint = ({ params = [], filters = [] }) => {\n const queryParams = [...params];\n\n if (filters.length > 0) {\n queryParams.push(`filters=${filters.join('|')}`);\n }\n\n return `/assets${queryParams.length > 0 ? `?${queryParams.join('&')}` : ''}`;\n};\n\nconst getById = async ({ vendor, assetId }) => api(\n vendor,\n getAssetEndpoint(assetId)\n);\n\nconst getByIds = async ({ vendor, ids }) => {\n const response = await api(\n vendor,\n getListEndpoint({\n params: [`limit=${ids.length}`],\n filters: [`assetId::${ids.join(',')}`]\n })\n );\n\n // eslint-disable-next-line\n return response._embedded && response._embedded.assets || [];\n};\n\nconst getClosestAsset = async ({\n vendor, order, categoryId, assetId, publishedDate\n}) => {\n const endpoint = getListEndpoint({\n params: [\n 'limit=1',\n 'sort=-published',\n // depending on from which \"side\" we're asking\n (order === 'next' ? `after=${publishedDate + 1}` : `before=${publishedDate - 1}`)\n ],\n\n filters: [\n `categoryId::${categoryId}`\n ]\n });\n\n const response = await api(\n vendor,\n endpoint\n );\n\n // parse response\n // eslint-disable-next-line\n if (response && response._embedded && response._embedded.assets) {\n // eslint-disable-next-line\n const [nextAsset] = response._embedded.assets;\n\n if (nextAsset && nextAsset.id !== assetId) {\n return nextAsset;\n }\n }\n\n return null;\n};\n\nexport default {\n getById,\n getByIds,\n getClosestAsset,\n getMockAsset\n};\n","\n var requestNumber, currentServerId, image, config, getServer, getImageTransform, serversAmount;\n\n getServer = (function() {\n var MAX_REQUEST_PER_SERVER = 6;\n\n return function(imageId) {\n if(!imageId) {\n return '';\n }\n\n if(requestNumber === MAX_REQUEST_PER_SERVER) {\n if(currentServerId === serversAmount) {\n currentServerId = -1;\n }\n\n requestNumber = 0;\n currentServerId++;\n }\n\n requestNumber++;\n\n return imageId.replace(\"imbo\", config.servers[currentServerId]);\n };\n }());\n\n function getImageQuality(pixelRatio) {\n return (pixelRatio >= 2) ? 50 : 80;\n }\n\n function normalizeTransformSize(size, pixelRatio) {\n // return default value\n return [\n size,\n getImageQuality(pixelRatio)\n ];\n }\n\n function getClosestSize(transformSizes, maxDimension) {\n return transformSizes.reduce(function (prev, curr) {\n return (Math.abs(curr - maxDimension) < Math.abs(prev - maxDimension) ? curr : prev);\n });\n }\n\n function 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 */\n getImageTransform = (function() {\n var cache = {};\n\n return function(key, width, height) {\n var pixelRatio = getPixelRatio(),\n 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 var id = key.split('.'),\n i = 0,\n idLen = id.length,\n transformType = (height > width) ? 'autoWidth' : 'autoHeight',\n transformSizes = config.sizes, transform, maxDimension;\n\n while(i < idLen) {\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 transformSizes = transformSizes[transformType];\n\n // transformation is adjusted to not 'auto' side\n maxDimension = (transformType === 'autoHeight') ? width : height;\n maxDimension = maxDimension * pixelRatio;\n\n var dimensions = normalizeTransformSize(getClosestSize(transformSizes, maxDimension), pixelRatio);\n\n // auto width transform starts with 'x'\n // http://svp.vg.no/svp/api/v1/docs/\n transform = (transformType === 'autoWidth') ? 'x' : '';\n transform = transform + dimensions[0] + 'q' + dimensions[1];\n\n cache[cacheKey] = transform;\n\n return transform;\n };\n }());\n\n image = {\n initialize: function(options) {\n config = options;\n serversAmount = options.servers.length - 1;\n requestNumber = 0;\n currentServerId = 0;\n },\n getImageSrc: function(imageId, key, width, height) {\n if(imageId) {\n var extension = (imageId.indexOf('.jpg') === -1 && imageId.indexOf('.png') === -1 ? '.jpg' : '');\n return getServer(imageId) + extension + '?t[]=' + getImageTransform(key, width, height);\n }\n return null;\n }\n };\n\n export default image;\n\n","import utils from 'utils/utils';\nimport image from 'utils/image';\nimport Model from 'utils/model';\nimport ServerTime from 'utils/server-time';\nimport config from 'player/config';\n\nconst Stream = function (options) {\n this.attributes = {\n id: 0\n };\n\n this.initialize(options);\n};\n\nStream.prototype = {\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 data\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 hds: data.streamUrls.hds,\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 sourceFiles: data.sourceFiles || [],\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.metadata) {\n result.is360 = data.metadata.is360 === 'true';\n }\n\n // this array contains other mp4 streams but without main mp4\n if (data.streamUrls.pseudostreaming) {\n result.streams.mp4 = result.streams.mp4.concat(data.streamUrls.pseudostreaming);\n }\n\n if (data.additional && data.additional.metadata) {\n if (data.additional.metadata.audioStream) {\n result.streams.audio = data.additional.metadata.audioStream;\n }\n result.disableNextVideo = data.additional.metadata.disableNextVideo;\n result.chunkDuration = Number(data.additional.metadata.chunkDuration);\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 // add midroll in 10s TODO remove after tests\n // result.cuePoints = [31];\n return result;\n },\n\n getId() {\n return this.get('id');\n },\n\n getVendor() {\n return this.get('vendor');\n },\n\n getCategory() {\n return this.get('category');\n },\n\n hasProperty(property) {\n return this.get('streamConfiguration').properties.indexOf(property) > -1;\n },\n\n /**\n * Get duration stored in API\n *\n * @returns {*}\n */\n getDuration() {\n return this.get('duration');\n },\n\n getCuePoints() {\n return this.get('cuePoints');\n },\n\n /**\n * Check if stream has Akamai Secure Token\n * @returns {*}\n */\n isSecure() {\n return this.hasProperty('tokenSecured');\n },\n\n /**\n * Check wheter give stream contains mock data to allow embedding player without asset id\n * @return {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 {*}\n */\n isGeoblocked() {\n return this.hasProperty('geoblocked');\n },\n\n isLive() {\n return this.get('type') === 'live';\n },\n\n wasLive() {\n return this.get('type') === 'wasLive';\n },\n\n isActive() {\n return this.get('status') === 'active' && !this.isPast();\n },\n\n isFuture() {\n return (this.get('flightTimes') && this.get('flightTimes').start\n ? this.get('flightTimes').start > new Date().getTime() : false);\n },\n\n isPast() {\n return (this.get('flightTimes') && this.get('flightTimes').end\n ? (this.get('flightTimes').end < new Date().getTime()) : false);\n },\n\n hasHds() {\n return this.getUrl('HDS').indexOf('f4m') > -1;\n },\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.toLowerCase().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 getPoster() {\n return this.get('images').main;\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 poster src adjusted to given width\n *\n * @param containerWidth\n * @returns {*}\n */\n getPosterSrc(containerWidth) {\n return image.getImageSrc(this.getPoster(), 'poster', containerWidth);\n },\n\n /**\n * Get snapshots url\n * @returns {*} - url string or null if snapshots not found\n */\n getSnapshots() {\n return `${config.api.thumbnailsUrl + this.getVendor()}/assets/${this.getId()}`;\n },\n\n /**\n * Not every asset has snapshot (lives, wasLives)\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 hasAudioOnlyStream() {\n return typeof this.get('streams').audio === 'string';\n },\n\n getMp4Streams() {\n const streams = [];\n\n // mp4 streams are not available on live and secure hd\n if (this.hasMp4Streams()) {\n utils.each(this.get('streams').mp4, (stream) => {\n const streamData = stream.split('/').pop().replace('.mp4', '').split('_');\n\n streams.push({\n source: stream,\n width: streamData[0],\n height: streamData[1],\n bitrate: streamData[2]\n });\n });\n }\n\n return streams;\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 /**\n * Asset can be virually sliced into small chunks\n * These are only indicators and do not slice stream\n *\n * @param position\n * @returns {*}\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 * Check if ads are turned on\n *\n * @returns {boolean}\n */\n hasCreatives() {\n return this.get('na') !== true;\n },\n\n /**\n * External id\n * Used for JW Player statistics\n */\n getExternalId() {\n return this.get('externalId');\n },\n\n /**\n * Stream display mode\n *\n * @returns {*}\n */\n getDisplayType() {\n if (this.is360()) {\n return '360';\n }\n\n return '2d';\n },\n\n /**\n * Check if stream is 360 video\n */\n is360() {\n return this.get('is360') === true;\n },\n\n /**\n * Check wethever stream has ads disabled\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\nutils.extend(Stream.prototype, Model);\n\nexport default Stream;\n","const EXCLUDED_ASSETS_KEY = 'svp-excludedAssets';\n\n/**\n * Each vendor has own storage for excluded keys\n *\n * @param vendor\n * @returns {string}\n */\nconst getKey = function(vendor) {\n return `${EXCLUDED_ASSETS_KEY}-${vendor}`;\n};\n\nconst ExcludedAssets = {\n add(vendor, id) {\n let assets = this.getAll(vendor);\n\n if (id) {\n if (assets.indexOf(id) === -1) {\n // put at top as the older stream will be removed first\n assets.unshift(id);\n // limit only to 10 restricted streams\n assets = assets.splice(0, 10);\n }\n\n this.getStorage().setItem(getKey(vendor), JSON.stringify(assets));\n }\n },\n\n getAll(vendor) {\n return JSON.parse(this.getStorage().getItem(getKey(vendor))) || [];\n },\n\n getStorage() {\n return window.localStorage;\n }\n};\n\nexport default ExcludedAssets;\n","import ExcludedAssets from '../excluded-assets';\n\nconst omitRecurring = (vendor, assetId, assets) => {\n const excludedAssets = ExcludedAssets.getAll(vendor);\n\n // parse response\n if (!assets) {\n return null;\n }\n\n let nextAsset = null;\n\n for (let i = 0; i < assets.length; i += 1) {\n nextAsset = assets[i] || {};\n\n if (nextAsset.id !== assetId && excludedAssets.indexOf(nextAsset.id) === -1) {\n // exclude asset from recommended list\n ExcludedAssets.add(vendor, nextAsset.id);\n return nextAsset;\n }\n }\n\n return null;\n};\n\n/**\n *\n * @param array\n * @param randomIndex\n * @returns {*}\n */\nconst getExperimentName = (array, randomIndex) => {\n const element = array.find((item) => randomIndex >= item.start && randomIndex < item.end);\n\n if (element && element.name) {\n return element.name;\n }\n\n // fallback to default state\n return null;\n};\n\nconst getSource = (useMlEngine, experimentsList, seed) => {\n const experimentVariant = Math.floor(seed * 100);\n\n if (useMlEngine === false) {\n return 'related';\n }\n\n if (experimentsList.length > 0) {\n const experimentName = getExperimentName(experimentsList, experimentVariant);\n\n if (experimentName) {\n return `related-exprmnts/${experimentName}`;\n }\n }\n\n return 'related-ml';\n};\n\n\nexport default {\n omitRecurring,\n getSource\n};\n","/* eslint-disable no-underscore-dangle */\n\nimport seriesService from 'player/services/api/series';\nimport relatedService from 'player/services/api/related';\nimport assetService from 'player/services/api/asset';\nimport Stream from './stream';\nimport Asset from './asset';\n\nimport relatedHelpers from './recommended/related';\n\nconst createResponse = ({ nextAsset, source }) => ({\n nextAsset: nextAsset ? new Asset(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 * @param asset\n * @returns {boolean}\n */\n hasPlayNext(asset, includeCategory) {\n if (asset.get('streamType') === 'live') {\n return false;\n }\n\n if (asset.get('nextAsset').id) {\n return true;\n }\n\n if (includeCategory === true) {\n return this.hasNextInCategory(asset);\n }\n\n return false;\n },\n\n /**\n * Check if given asset has next stream\n *\n * @param asset\n * @returns {boolean}\n */\n hasNextInCategory(asset) {\n const category = asset.getCategory();\n\n if (category) {\n if (category.isSeries()) {\n return true;\n }\n\n if (category.get('autoPlayNextAsset')) {\n return true;\n }\n }\n\n return false;\n },\n\n\n /**\n * Fetch next asset from asset series\n * Rejected when next asset is not found\n *\n * @param asset\n */\n async fetchNextFromSeries({\n vendor, assetId, season, categoryId\n }) {\n const nextAsset = await seriesService.getNextEpisode({\n vendor,\n assetId,\n categoryId,\n season\n });\n\n return createResponse({\n source: 'series',\n nextAsset\n });\n },\n\n /**\n * Fetch next asset from parent category\n * Rejected when next asset is not found\n *\n * @param asset object\n * @param settings\n */\n async fetchNextFromCategory ({\n vendor, published, categoryId, order\n }) {\n const nextAsset = await assetService.getClosestAsset({\n vendor,\n published,\n order,\n categoryId\n });\n\n return createResponse({\n source: `category-${order}`,\n nextAsset\n });\n },\n\n /**\n * Fetch next asset by providing it's id\n *\n * @param vendor\n * @param assetId\n * @param source\n * @returns {Promise<{nextAsset, source}>}\n */\n async fetchNextById({ vendor, assetId }) {\n const nextAsset = await assetService.getById({\n vendor,\n assetId\n });\n\n return createResponse({\n source: 'byId',\n nextAsset\n });\n },\n\n async fetchNextFromRelatedEngine({ vendor, assetId, source = 'related' }) {\n const assets = await relatedService.getList({\n engine: source,\n vendor,\n assetId\n });\n\n let nextAsset = null;\n\n if (source === 'related-exprmnts/getbyid') {\n // eslint-disable-next-line\n nextAsset = assets[0];\n } else {\n nextAsset = relatedHelpers.omitRecurring(vendor, assetId, assets);\n }\n\n return createResponse({\n nextAsset,\n source\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 * @param asset\n * @returns {Promise}\n */\n async getNext(asset, { useMlEngine }) {\n const vendor = asset.getVendor();\n const assetId = asset.get('id');\n const category = asset.getCategory();\n const nextAssetId = asset.getNextAssetId();\n\n const categoryId = category.get('id');\n const season = parseInt(asset.get('season'), 10);\n\n // fetch next from series as user expects next episode to be played\n // when there is no next episode then we just display recommended grid\n if (category.isSeries() && season > 0) {\n const fetchNextParams = {\n season,\n categoryId,\n vendor,\n assetId\n };\n\n const result = await this.fetchNextFromSeries(fetchNextParams);\n\n // fetch next episode from following season\n if (!result.nextAsset) {\n return this.fetchNextFromSeries(Object.assign(fetchNextParams, {\n season: fetchNextParams.season + 1,\n assetId: null\n }));\n }\n return result;\n }\n\n const experiments = category.getRelatedExperiments();\n\n // no experiments set\n if (experiments.length === 0 && nextAssetId) {\n return this.fetchNextById({\n assetId: nextAssetId,\n vendor\n });\n }\n\n // with fallback to category related when there is no video from ml engine\n try {\n return await this.fetchNextFromRelatedEngine({\n source: relatedHelpers.getSource(\n useMlEngine,\n experiments,\n Math.random()\n ),\n vendor,\n assetId\n });\n } catch (e) {\n return this.fetchNextFromRelatedEngine({\n source: relatedHelpers.getSource(\n useMlEngine,\n [{ name: 'related-ml', begin: 0, end: 100 }],\n 0\n ),\n vendor,\n assetId\n });\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 * @param asset\n * @param options\n * @returns {Promise}\n */\n async fetchNext(asset, options) {\n const { nextAsset, source } = await this.getNext(asset, options);\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","let translations = {};\n\nconst setTranslations = (data) => {\n translations = data;\n};\n\n// eslint-disable-next-line\nconst translate = (key, substitute) => {\n // typeof to check keys like \"0\"\n return translations[key] || (typeof substitute === 'undefined' ? key : substitute);\n};\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};\n","import moduleLoader from './module-loader';\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 } if (typeof (obj) === 'object' && obj !== null && (obj.join === undefined)) {\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) string.push(`${prop}: ${objectToString(obj[prop])}`);\n }\n\n return `{${string.join(',')}}`;\n\n // is array\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 } 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\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\nconst prettyObject = () => moduleLoader('https://cdn.stream.schibsted.media/tools/beautify.min.js')\n .then((module) => {\n if (module && typeof module.js_beautify === 'function') {\n return module.js_beautify;\n }\n return window.js_beautify;\n });\n\nexport {\n objectToString,\n prettyObject,\n capitalizeFirstLetter\n};\n","import config from 'player/config';\nimport utils from 'utils/utils';\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 (!utils.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 (pos > -1 && origin.length - pos === domain.length\n && (domainBeginning === undefined || domainBeginning === '.')) {\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 parent\n * @param child\n * @returns {Array.}\n */\nfunction inherit(parent, child) {\n return (parent || []).concat(child || []);\n}\n\nconst Domain = {\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 vendors: {},\n\n initialize(domain) {\n this.domain = domain;\n },\n\n /**\n * Fetch permissions for extended settings\n *\n * @param vendor\n * @returns {*}\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}\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 vendor - api vendor key\n * @returns {*}\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(this.domain, inherit(blacklist.global, blacklist[vendor]));\n }\n};\n\nexport default Domain;\n","import utils from 'utils/utils';\nimport config from 'player/config';\n\nimport { TOKEN_FETCH_ERROR } from '../playback/config/status-codes';\n\nconst fetchToken = function(params) {\n this.isFetching = true;\n\n return new Promise((resolve, reject) => {\n // fetch new token\n utils.ajax(this.url(params), (response) => {\n this.expire = +new Date() + 1000;\n this.value = response.responseText;\n this.isFetching = false;\n resolve(this.value);\n }, () => {\n this.isFetching = false;\n reject(TOKEN_FETCH_ERROR);\n }, true);\n });\n};\n\nclass Token {\n constructor(assetId, assetAccess, maxBitrate) {\n /**\n * Id of SVP related asset\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 this.assetAccess = assetAccess;\n\n /**\n * Akamai token value retrieved from SVP api\n * @type {null}\n */\n this.value = null;\n /**\n * Expiration time, timestamp\n * @type {null}\n */\n this.expire = null;\n\n /**\n * Maximum allowed bitrate for stream\n * @type {null}\n */\n this.maxBitrate = maxBitrate || null;\n\n this.request = null;\n this.isFetching = false;\n }\n\n fetch(configuration) {\n if (!this.isValid()) {\n if (this.request && this.isFetching) {\n return this.request;\n }\n\n if (typeof configuration === 'function') {\n this.request = configuration(this.assetId, this.assetAccess).then(fetchToken.bind(this));\n } else {\n this.request = fetchToken.call(this);\n }\n }\n\n return this.request;\n }\n\n url(params) {\n const query = [\n `vendor=${config.api.vendor}`\n ];\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 getValue() {\n return this.value;\n }\n\n isValid() {\n // on load expire is null therefore it will always return false\n return (+new Date() < this.expire);\n }\n}\n\n\nutils.extend(Token.prototype, utils.Events);\n\nexport default Token;\n","import config from 'player/config';\nimport utils from 'utils/utils';\n\nfunction getDeviceType() {\n return utils.device.getDeviceType();\n}\n\nfunction getCountryCode(vendor) {\n return (vendor === 'ab' || vendor === 'svd') ? 'se' : 'no';\n}\n\nfunction buildQueryParamsString(params) {\n const queryObject = utils.extend({\n cb: (Math.round(Math.random() * 100000000000))\n }, params);\n\n return utils.jsonToUrl(queryObject);\n}\n\nexport default {\n getPtvTag(params) {\n const queryParams = buildQueryParamsString(params);\n return `${config.ads.appnexus.ptv}?${queryParams}`;\n },\n\n getVmapTag(params) {\n const queryParams = buildQueryParamsString(params);\n return `${config.ads.appnexus.vmap}?${queryParams}`;\n },\n\n getAstConfig(tagOptions, globalOptions) {\n return utils.extend({}, utils.merge(globalOptions, tagOptions));\n },\n\n getDefaultParams(stream) {\n const vendor = stream.getVendor();\n\n return {\n countryCode: getCountryCode(vendor),\n supplyType: `web_${getDeviceType()}`,\n publisherName: vendor,\n slotIds: {\n preroll: 1,\n midroll: 2,\n postroll: 3\n }\n };\n }\n};\n","import utils from 'utils/utils';\nimport appnexusTag from './appnexus-tag-builder';\n\nconst JwAdsConfig = function (stream) {\n this.stream = stream;\n this.config = {};\n this.params = [];\n};\n\nJwAdsConfig.prototype = {\n setParams(params) {\n this.params = params;\n },\n\n /**\n * @param {object} adSlotConfig\n * @return {string}\n */\n getTag(adSlotConfig) {\n const adConfig = utils.merge(this.params, adSlotConfig);\n\n if (this.stream.isAudio()) {\n return appnexusTag.getPtvTag(adConfig);\n }\n\n return appnexusTag.getVmapTag(adConfig);\n },\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)\n };\n }\n },\n\n getConfig() {\n return this.config;\n }\n};\n\nexport default JwAdsConfig;\n","import utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport appnexusTagBuilder from './appnexus-tag-builder';\nimport JwAdsConfig from './appnexus-jw-config';\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\n adsConfig.setParams(params);\n adsConfig.add(adSlots.preroll, 'pre', 'preroll');\n\n utils.each(stream.getCuePoints(), function (cuePoint) {\n if (cuePoint && cuePoint.timeline) {\n adsConfig.add(adSlots.midroll, cuePoint.timeline, 'midroll');\n }\n });\n\n // postroll is disabled when playnext is available\n if (hasNext === false || (hasNext !== true && stream.get('hasNext') === false)) {\n adsConfig.add(adSlots.postroll, 'post', 'postroll');\n }\n\n return adsConfig.getConfig();\n}\n\nfunction getParams(params, memberId) {\n if (memberId) {\n return utils.extend({}, {\n member: memberId\n }, params);\n }\n\n return params;\n}\n\nfunction parseAdPlacements(adPlacements, globalParams) {\n const placements = {};\n\n utils.each(adPlacements, function (values, placementId) {\n placements[placementId] = appnexusTagBuilder.getAstConfig(values, globalParams);\n });\n\n return placements;\n}\n\nfunction getJwAdSchedule(clientConfig, stream, settings) {\n const { adSlots } = clientConfig;\n\n if (adSlots) {\n return getAdsConfig({\n adSlots: adSlots.schedule,\n params: getParams(adSlots.params, clientConfig.member)\n }, stream, settings);\n }\n\n return {};\n}\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\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(stream, appnexusTagBuilder.getDefaultParams(stream), adn.svpPlayer);\n }\n\n logger('SVP').log('adsConfig', svpAdConfig);\n\n return svpAdConfig;\n};\n\n/**\n * Handle midroll scheduling in player\n *\n * @param tag\n * @param startTime\n * @returns {{onEnter: onEnter, setTime: setTime, onReady: onReady}}\n */\nconst createMidroll = ({ tag, startTime }) => {\n let hasEntered = false;\n let onEnterCallback = () => {};\n\n const onEnter = (callback) => {\n onEnterCallback = callback;\n };\n\n const onReady = (callback) => {\n if (tag) {\n callback();\n }\n };\n\n const setTime = (time) => {\n if (hasEntered === false && (time >= startTime || startTime === 'NOW')) {\n onEnterCallback(tag);\n hasEntered = true;\n }\n };\n\n return {\n setTime,\n onEnter,\n onReady\n };\n};\n\nexport default {\n getConfig(stream, settings) {\n return getClientConfig(stream, settings).then(function (clientConfig) {\n // null equals to empty ads\n if (clientConfig === null) {\n return {};\n }\n\n return {\n adSchedule: getJwAdSchedule(clientConfig, stream, settings),\n adPlacements: getAdPlacements(clientConfig),\n adOptions: clientConfig.options || {}\n };\n });\n },\n\n getLiveMidrollTag(maxDuration, stream, settings) {\n // eslint-disable-next-line consistent-return\n return getClientConfig(stream, settings).then(function (clientConfig) {\n if (clientConfig) {\n const { adSlots } = clientConfig;\n const midroll = adSlots && adSlots.schedule && adSlots.schedule.midroll;\n\n if (midroll) {\n const params = getParams((adSlots || {}).params, clientConfig.member);\n params.vmaxduration = maxDuration;\n\n return appnexusTagBuilder.getVmapTag(utils.merge(params, midroll));\n }\n }\n });\n },\n createMidroll\n};\n","import utils from 'utils/utils';\nimport appnexus from 'player/playback/ads/appnexus';\n\nfunction getPlaylist(streamUrl, stream, options, settings) {\n const {\n locale, poster, title, description, minDvrWindow\n } = options;\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 function addProgressiveMediaSources(playlistItem) {\n utils.each(stream.getMp4Streams(), function (mp4Stream) {\n playlistItem.sources.push({\n label: `${mp4Stream.height}p`,\n file: mp4Stream.source\n });\n });\n\n return playlistItem;\n }\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 function addCaptions(playlistItem) {\n if (stream.getCaptions().length > 0) {\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 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 function add3dSupport(playlistItem) {\n if (stream.getDisplayType() === '360') {\n playlistItem.stereomode = 'monoscopic';\n }\n\n return playlistItem;\n }\n\n return function (config) {\n const type = stream.get('mediaType') === 'audio' && stream.hasMp4Streams() ? 'mp4' : 'hls';\n return Promise.resolve({\n id: stream.getId(),\n image: poster,\n sources: [{\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: 'auto'\n }],\n mediaType: stream.get('mediaType'),\n tracks: []\n })\n .then(addPlaylistMetadata)\n .then(addProgressiveMediaSources)\n .then(addCaptions)\n .then(addSnapshots)\n .then(add3dSupport)\n .then(function (playlistItem) {\n return appnexus.getConfig(stream, settings).then(function (adConfig) {\n const adOptions = adConfig.adOptions || {};\n\n config.advertising = utils.extend({\n client: 'vast'\n }, locale.translate('ads', true));\n\n if (typeof adOptions.autoplayMuted !== 'undefined') {\n config.advertising.autoplayadsmuted = 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 (stream.isMock()) {\n return playlistItem;\n }\n\n return addAppnexusAds(adConfig, playlistItem);\n });\n })\n .then(function (playlistItem) {\n config.playlist = [playlistItem];\n\n playlistItem.svp = {\n stream: stream,\n settings: settings\n };\n\n return config;\n });\n };\n}\n\nexport default getPlaylist;\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\n * @param globals\n * @return {*}\n */\nconst getConfig = ({\n options, stream, 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 = Object.assign({}, 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(*): *}\n */\nconst addSharing = (...args) => 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 {\n getConfig,\n addSharing\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)\n .some((slot) => slot.offset === 'pre');\n }\n\n return false;\n};\n\nexport default function (stream, options) {\n // additional config options required for playback\n return function (config) {\n let canAutostart = options.autoplay;\n\n // firefox requires this flag to be set when playing SecureHD stream\n if (stream && stream.isSecure()) {\n config.withCredentials = true;\n }\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 (hasPreroll(config) && config.advertising.autoplayadsmuted !== true) {\n try {\n if (config.mute === true || localStorage.getItem('jwplayer.mute') === 'true') {\n canAutostart = false;\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 };\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 config from 'player/config';\nimport moduleLoader from 'utils/module-loader';\n\nlet request = null;\n\nconst youboraSdk = {\n state: 'UNLOADED',\n options: {},\n\n load(options = {}) {\n this.options = options;\n if (request === null) {\n this.state = 'LOADING';\n\n request = moduleLoader(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 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(Object.assign(\n options, this.options\n ));\n\n plugin.setAdapter(new youbora.adapters.JWPlayer(player));\n\n this.state = 'LOADED';\n } catch (e) {\n console.error('Could not load youbora plugin', e);\n }\n }\n};\n\nexport default youboraSdk;\n","import utils from 'utils/utils';\nimport Model from 'utils/model';\nimport image from 'utils/image';\nimport { objectToString, prettyObject } from 'utils/string';\n\nimport config from 'player/config';\nimport Domain from 'player/model/domain';\nimport Token from 'player/model/token';\n\nimport locale from 'player/model/locale';\n\nimport appnexus from './ads/appnexus';\nimport addPlaylist 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';\n\nimport * as STATUS_CODES from './config/status-codes';\nimport youbora from './youbora';\n\n/**\n * Config instance for player\n * Contains SVP Player options\n * Parses config\n *\n * @param options\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 // token function for secured streams\n token: null\n };\n\n /**\n * JW Player Config\n */\n this.jwDefaults = {\n primary: null,\n hlshtml: true,\n base: config.cdn.player,\n flashplayer: `${config.cdn.player}/jwplayer.flash.swf`,\n wmode: 'transparent',\n key: config.player.keys.default,\n preload: 'auto'\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 setStream(stream) {\n this.stream = stream;\n\n this.token = new Token(stream.get('id'), stream.get('access'), this.getMaxBitrate());\n },\n\n /**\n * Get config passed to SVP Player constructor\n * @returns {*|{}}\n */\n getRaw() {\n return this.rawOptions || {};\n },\n\n /**\n * Dump Javascript config to a string\n * @returns {Promise}\n */\n async dump() {\n const prettier = await prettyObject();\n return prettier(objectToString(this.getRaw()));\n },\n\n /**\n * TODO add tests\n *\n * @param stream\n * @param container\n * @returns {*}\n */\n getPoster(stream, playerContainer) {\n const container = 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 {string|*}\n */\n getTitle(stream) {\n const title = this.get('title');\n const isAudioWithoutCustomTitle = 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().get('title');\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 getToken() {\n if (this.stream.isSecure()) {\n return this.token.fetch(this.get('token'));\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 // only live streams require custom metadata\n // it's used to trigger ads\n if (this.stream.isLive()) {\n params.push('custom-mdt=on');\n }\n\n return streamUrl + ((params.length > 0) ? `?${params.join('&')}` : '');\n });\n },\n\n /**\n * Check if user is eligible to play stream in his geolocation\n *\n * @param stream\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 (stream.isActive()) {\n if (stream.isGeoblocked() && !stream.isFuture()) {\n this.getStreamUrl('hls').then((streamUrl) => {\n // fetch manifest to check user access\n utils.ajax(streamUrl, resolve, function (...args) {\n const response = args[2] || {};\n\n if (response.status === 403) {\n return reject(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED);\n }\n\n return reject(STATUS_CODES.NETWORK_ERROR);\n }, true);\n }).catch(reject);\n } else {\n resolve(STATUS_CODES.ACTIVE);\n }\n } else if (stream.isPast()) {\n reject(STATUS_CODES.NOT_ACTIVE_PAST);\n } else {\n reject(STATUS_CODES.NOT_ACTIVE);\n }\n });\n },\n\n getJwConfig(stream) {\n const settings = this.getSettings();\n\n return 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 sharing: utils.extend({}, config.sharing.global),\n primary: this.get('primary') || 'html5',\n localization: locale.translate('player', true),\n plugins: {},\n cast: {},\n liveSyncDuration: this.getLiveSyncDuration(stream)\n }).then((jwConfig) => this.getStreamUrl('hls').then((streamUrl) => addPlaylist(\n streamUrl,\n stream,\n {\n poster: this.getPoster(stream),\n title: this.getTitle(stream),\n description: this.getDescription(stream),\n locale: locale,\n minDvrWindow: this.get('minDvrWindow')\n },\n this.getPlaylistSettings()\n )(jwConfig)))\n .then(addSharing({\n options: this.get('sharing'),\n stream\n }))\n .then(setCaptions(this.get('captions')))\n .then(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 }))\n // enable only five percent of traffic for youbora\n .then(addYoubora(\n stream,\n youbora.state === 'READY'\n ))\n .then(setKey(this.get('vendor')))\n .then((jwConfig) => utils.merge(utils.extend({}, this.jwDefaults, jwConfig), settings.jw || {}));\n },\n\n /**\n * Check if recommended is available\n */\n hasRecommended() {\n // recommended truned on and repeat truned off\n return this.get('recommended') !== false && this.get('repeat') === false;\n },\n\n getRecommended() {\n return this.get('recommended');\n },\n\n hasNext() {\n if (!this.hasRecommended()) {\n return false;\n }\n\n if (this.getRecommended() && (this.getRecommended().next === false\n || typeof this.getRecommended().next === 'undefined')) {\n return false;\n }\n\n return true;\n },\n\n getPlaylistSettings() {\n return utils.extend({\n adn: this.get('adn'),\n hasNext: this.hasNext()\n }, this.getSettings());\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({}, (config.skins[options.vendor] || config.skins.default));\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\n options.skin = skin;\n\n // override about link/text\n if (!options.about && about) {\n options.about = about;\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\n// Immutable method for restricted settings like preview or na\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 (permissions.whitelist === false && options.settings && options.settings.jw) {\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","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","export 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 = stream.get('streamConfiguration')\n && stream.get('streamConfiguration').properties;\n\n const category = stream.getCategory();\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.get('id')\n };\n }\n }\n\n return config;\n };\n}\n","import config from 'player/config';\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","/* jshint bitwise: false */\nimport utils from 'utils/utils';\nimport Events from 'utils/backbone.events';\n\nfunction binarySearch(arr, compare) {\n // binary search, with custom compare function\n let l = 0;\n\n let r = arr.length - 1;\n let m;\n let comp;\n\n while (l <= r) {\n // eslint-disable-next-line no-bitwise\n m = l + ((r - l) >> 1);\n comp = compare(arr[m]);\n\n if (comp < 0) {\n // arr[m] comes before the element\n l = m + 1;\n } else if (comp > 0) {\n // arr[m] comes after the element\n r = m - 1;\n } else {\n return m;\n }\n }\n\n return l - 1; // return the index of the next left item\n // usually you would just return -1 in case nothing is found\n}\n\nconst Viewport = function() {\n this.current = null;\n};\n\nViewport.prototype = {\n labels: [\n 'tiny', 'tiny-small', 'tiny-small-medium',\n 'tiny-small-medium-big', 'tiny-small-medium-big-web', 'tiny-small-medium-big-web-wide'\n ],\n sizes: [0, 480, 640, 768, 1024, 1200],\n\n /**\n * Update player viewport which is not equal to browser wiewport\n *\n * @param width\n */\n update(width) {\n const newIndex = binarySearch(this.sizes, (x) => x - width);\n\n if (this.current !== newIndex) {\n const newBreakpoint = this.getViewportByIndex(newIndex);\n const currentBreakpoint = this.getViewportByIndex(this.current);\n\n this.trigger('change', newBreakpoint, currentBreakpoint);\n\n this.current = newIndex;\n }\n },\n\n getViewportByIndex(index) {\n return {\n width: this.sizes[index],\n label: this.labels[index]\n };\n }\n};\n\nutils.extend(Viewport.prototype, Events);\n\nexport default Viewport;\n","/* eslint-disable max-len */\nimport utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport logger from 'utils/logger';\n\nimport playIcon from 'icons/play.svg';\nimport pauseIcon from 'icons/pause.svg';\nimport audioIcon from 'icons/audio.svg';\nimport audioMuted from 'icons/audio-muted.svg';\nimport homad from './homad-lib';\n\nfunction getAdPotTag(offset, adschedule) {\n const keys = Object.keys(adschedule);\n let tag = null;\n\n utils.each(keys, function (key) {\n if (key.indexOf(offset) > -1) {\n // eslint-disable-next-line prefer-destructuring\n tag = adschedule[key].tag;\n }\n });\n\n return tag;\n}\n\nfunction getTagUrl(potOffset) {\n return function (player) {\n const playlistItem = player.getPlaylist()[0];\n let tag = false;\n\n if (playlistItem.adschedule) {\n tag = getAdPotTag(potOffset, playlistItem.adschedule);\n }\n\n if (tag) {\n tag = tag.replace('vmap', 'ssvmap');\n } else {\n tag = false;\n }\n\n return tag;\n };\n}\n\n\nconst getHomadConfig = () => ({\n globalConfig: 'https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json',\n clientConfig: '/homad-config.json',\n admessage() {\n return locale.translate('adblock').admessage;\n },\n skipable: true,\n skipAdOnContextChange: true,\n runInsideContainer: true,\n adjustAdVolumeToContentPlayer: true,\n postrollUseCompleteEvent: false,\n onReady() {\n },\n muteButton: `
${audioIcon}
`,\n unmuteButton: `
${audioMuted}
`,\n playButton: `
${playIcon}
`,\n pauseButton: `
${pauseIcon}
`,\n skipableButton: (function () {\n const adMessages = locale.translate('ads');\n return `
\n ${adMessages.skipmessage.replace('xx', '[time]')}\n \n \n \n
`;\n }()),\n skipButton: (function () {\n const adMessages = locale.translate('ads');\n\n return `
\n ${adMessages.skiptext}\n \n
`;\n }()),\n 'innerWarpper.style': '',\n prerollAdTag: getTagUrl('pre'),\n midrollAdTag: getTagUrl('mid'),\n postrollAdTag: getTagUrl('post')\n});\n\n/**\n * Homad AAB ads have single event bus for all players\n *\n * @param event\n */\nfunction parseHomadEvent(event) {\n // homad event details are under detils property\n const details = event && event.detail;\n logger('HomadPlugin').log('event', details);\n\n // skip parsing when there is missing data or player is not registered\n if (!details || !this.events[details.containerId]) {\n return;\n }\n\n this.events[details.containerId].trigger(details.name, details);\n}\n\nexport default utils.extend({\n // events hashmap playerId -> eventBus\n // each player has its own events bus\n events: {},\n initialize() {\n const SvpPlayer = window.SVP.Player;\n\n if (!SvpPlayer.isHomadLoaded) {\n SvpPlayer.isHomadLoaded = true;\n\n const homadConfig = getHomadConfig();\n\n // override aab config url\n if (SvpPlayer.defaults.aabConfig) {\n homadConfig.clientConfig = SvpPlayer.defaults.aabConfig;\n }\n\n homad(homadConfig);\n\n window.addEventListener('hdEvent', parseHomadEvent.bind(this));\n }\n },\n\n /**\n * Get events for specific player\n * Events are matched by player id\n *\n * @param playerId\n * @returns {*}\n */\n getEvents(playerId) {\n // create event bus for specific player if this doesn't exist\n if (!this.events[playerId]) {\n this.events[playerId] = utils.extend({}, utils.Events);\n }\n\n return this.events[playerId];\n },\n\n /**\n * Remove player events from messaging bus\n * Prevents memory leaks\n *\n * @param playerId\n */\n removeEvents(playerId) {\n if (this.events[playerId]) {\n this.events[playerId].off();\n this.events[playerId].stopListening();\n\n this.events[playerId] = null;\n delete this.events[playerId];\n }\n }\n}, utils.Events);\n","/* global SVP */\nimport utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport HomadAds from './homad';\n\nimport { createHomadSkin } from './homad-skin';\n/**\n * Get Ad Player from player container\n *\n * @param parent\n * @param cb\n */\nfunction getAdPlayer(parent, cb) {\n const observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(mutation) {\n if (mutation.type === 'childList') {\n const nodes = mutation.addedNodes;\n\n if (nodes && nodes[0] && nodes[0].classList.length === 0) {\n const video = nodes[0].querySelector('video');\n\n if (video) {\n cb(video, nodes[0]);\n }\n }\n }\n });\n });\n\n // pass in the target node, as well as the observer options\n observer.observe(parent, {\n attributes: false,\n childList: true,\n characterData: false\n });\n}\n\n/**\n * Initialize ad player\n *\n * @param player\n * @returns {Function}\n */\nfunction initializeAdPlayer(player) {\n /**\n * Called every time ad video player is shown\n */\n return function (adPlayer, adPlayerContainer) {\n adPlayerContainer.classList.add('svp-homad-player');\n player.getContainer().classList.remove('jw-state-buffering');\n createHomadSkin(player, adPlayer, adPlayerContainer);\n };\n}\n\nfunction onAdError() {\n const jw = this.player;\n const container = this.getContainer();\n\n this.hasAdBlocked = true;\n\n // just to be sure\n this.once('adStarted', function () {\n this.adPlayerLoading = false;\n }, this);\n\n this.once('adSlotComplete', function () {\n container.classList.remove('svp-homad-loading');\n }, this);\n\n this.listenToOnce(jw, 'play', function () {\n this.adPlayerLoading = true;\n }, this);\n\n this.listenToOnce(jw, 'pause', 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 }, this);\n}\n\nfunction onAdBreakStart(data) {\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 ((data && data.adposition !== 'mid') || (currentTime > 30 && duration - currentTime > 30)) {\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/**\n * Forward events which are the same\n * @param eventName\n */\nfunction forwardEvent(eventName) {\n this.listenTo(this.events, eventName, function () {\n // trigger ad events only while ads are playing\n if (this.adPlaying === true) {\n // clear event data\n this.trigger(eventName);\n }\n }, this);\n}\n\nfunction onReady() {\n if (SVP.Player.isHomadLoaded !== true) {\n return;\n }\n\n // events are matched by player id\n const playerId = this.config.get('node');\n\n this.events = HomadAds.getEvents(playerId);\n\n this.listenTo(this.events, 'contentPlayerPlay', function () {\n this.getContainer().classList.remove('svp-homad-loading');\n }, this);\n\n this.listenTo(this.events, 'all', function (event, data) {\n logger('AAB').log(event, data);\n }, this);\n\n this.listenTo(this.events, 'adStart', function (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 }, this);\n\n this.listenTo(this.events, 'continueContent', function () {\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 this.listenTo(this.events, 'adTime', function (data) {\n if (data.currentTime && this.adPlaying) {\n this.trigger('adProgress', data.currentTime, data.duration);\n }\n }, this);\n\n this.listenTo(this.events, 'adMeta', function (data) {\n if (data) {\n this.trigger('adData', {\n adId: data.adId || null,\n impression: data.impressionURL || null\n });\n }\n }, this);\n\n utils.each(['adComplete', 'adSkipped', 'adPause', 'adPlay'], forwardEvent.bind(this));\n\n // cleanup events\n this.once('remove', HomadAds.removeEvents.bind(HomadAds, playerId));\n\n this.listenTo(this.player, 'adError', onAdError.bind(this));\n this.listenTo(this.player, 'adBreakStart', onAdBreakStart.bind(this));\n\n // turn off ad player loading when there is no ads\n this.listenTo(this.player, 'playlistItem', (playlistItem) => {\n if (playlistItem.item && !playlistItem.item.adschedule) {\n this.adPlaying = false;\n this.adPlayerLoading = false;\n }\n });\n\n // turn off ad player loading when there is no ads\n this.listenTo(this.player, 'adPlay', () => {\n this.adPlaying = true;\n this.adPlayerLoading = false;\n });\n\n this.adPlayerLoading = false;\n\n getAdPlayer(this.getContainer(), initializeAdPlayer(this));\n}\n\nexport default function (Player) {\n const { setup } = Player.prototype;\n\n // anti adblock works only for desktops\n if (!utils.device.isDesktop()) {\n return Player;\n }\n\n /**\n * Proxy player method\n * Call source when adblock is not present\n *\n * @param name\n * @param cb\n */\n function proxyMethod(name, cb) {\n const sourceMethod = Player.prototype[name];\n\n Player.prototype[name] = function () {\n const args = Array.prototype.slice.call(arguments);\n\n if (SVP.Player.isHomadLoaded !== true) {\n return sourceMethod.apply(this, args);\n }\n\n return cb.call(this, sourceMethod, args);\n };\n }\n\n Player.prototype.setup = function () {\n this.once('ready', onReady);\n return setup.call(this);\n };\n\n\n proxyMethod('onFirstFrameLoad', function (onFirstFrameLoad) {\n if (this.hasAdBlocked) {\n this.player.once('play', function () {\n this.player.once('providerFirstFrame', function () {\n onFirstFrameLoad.call(this, this.playlistItemId);\n }, this);\n }, this);\n } else {\n onFirstFrameLoad.call(this, this.playlistItemId);\n }\n });\n\n proxyMethod('onTime', function (onTime, args) {\n if (!this.adPlaying && this.adPlayerLoading === false) {\n onTime.apply(this, args);\n }\n });\n\n // eslint-disable-next-line consistent-return\n proxyMethod('onPlay', function (onPlay, args) {\n if (this.adPlayerLoading === false) {\n return onPlay.apply(this, args);\n }\n });\n\n //\n proxyMethod('onPause', function (onPause, args) {\n if (this.adPlaying === false && this.adPlayerLoading === false) {\n onPause.apply(this, args);\n }\n });\n\n proxyMethod('onComplete', function (onComplete, args) {\n if (this.adPlaying === false && (this.adPlayerLoading === false || this.adPlayerLoading === undefined)) {\n onComplete.apply(this, args);\n } else {\n this.listenToOnce(this.events, 'continueContent', function () {\n onComplete.apply(this, args);\n }, this);\n }\n });\n\n return Player;\n}\n","const getPlaybackState = (container) => {\n const playerClassList = container.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\nconst getControlsContainer = (adPlayerContainer) => {\n const controlsContainer = adPlayerContainer.querySelector('.jw-icon').parentNode.parentNode;\n\n const appendControl = (domNode) => {\n controlsContainer.appendChild(domNode);\n };\n\n return {\n appendControl\n };\n};\n\nconst createProgressBar = (container) => {\n const seekBar = container.querySelector('.jw-controlbar').cloneNode(true);\n seekBar.querySelector('.jw-button-container').remove();\n seekBar.querySelector('.jw-progress').style.width = '0%';\n\n const progressLoader = seekBar.querySelector('.jw-progress');\n\n const setProgress = (value) => {\n progressLoader.style.width = `${value}%`;\n };\n\n return {\n domNode: seekBar,\n reset: () => setProgress(0),\n setProgress\n };\n};\n\nconst createFullscreenButton = (container) => {\n const fullscreenButton = container.querySelector('.jw-icon-fullscreen').cloneNode(true);\n const onClick = (handleClick) => {\n fullscreenButton.addEventListener('click', handleClick, true);\n };\n\n return {\n domNode: fullscreenButton,\n onClick\n };\n};\n\nconst toggleFullscreen = (jwPlayer) => {\n try {\n jwPlayer.setFullscreen();\n } catch (e) {\n // fullscreen did not work\n }\n};\n\nconst adjustVolumePosition = (adPlayerContainer) => {\n const volumeBtn = adPlayerContainer.querySelector('.jw-icon-volume');\n\n if (volumeBtn) {\n volumeBtn.parentNode.style.float = 'left';\n }\n};\n\nconst createHomadSkin = (player, adPlayer, adPlayerContainer) => {\n const container = player.getContainer();\n const { appendControl } = getControlsContainer(adPlayerContainer);\n\n const fullScreenButton = createFullscreenButton(container);\n fullScreenButton.onClick(() => toggleFullscreen(player.player));\n appendControl(fullScreenButton.domNode);\n\n const seekBar = createProgressBar(container);\n adPlayer.addEventListener(\n 'timeupdate',\n () => seekBar.setProgress((adPlayer.currentTime / adPlayer.duration) * 100),\n true\n );\n appendControl(seekBar.domNode);\n\n const { setAdPlaying, setAdComplete } = getPlaybackState(container);\n player.once('adSlotStart', seekBar.reset);\n player.once('adSlotStart', setAdPlaying);\n player.once('adSlotComplete', setAdComplete);\n\n adjustVolumePosition(adPlayerContainer);\n};\n\nexport {\n createHomadSkin\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","const 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 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, remove\n };\n};\n\nconst load = (svpPlayer) => {\n const handler = handle();\n\n /**\n * Get video tag from SVP Player\n *\n * @param player\n * @returns {Element | any}\n */\n const getVideo = (player) => player.getContainer().querySelector('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","const loadedStylesheets = [];\n\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 ( !done && (!this.readyState ||\n this.readyState === \"loaded\" || this.readyState === \"complete\") ) {\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\nexport default (path) => {\n return new Promise((resolve, reject) => loadStylesheet(path, resolve, reject));\n}","import logger from 'utils/logger';\nimport utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport { forward30Icon } from 'icons/audio';\n\nconst DEFAULT_USE_AUDIO_SKIN = true;\n\nconst CN_FORWARD_BUTTON = 'jw-icon-forward';\nconst CN_FORWARD_CONTROL = 'jw-display-icon-forward';\nconst CN_DURATION_INFO = 'svp-duration';\n\n/** {string} An icon with proper class names */\nconst forwardIcon = forward30Icon.replace('\n \n ${forwardIcon}\n \n `);\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 = Boolean(config.get('audioSkin') || DEFAULT_USE_AUDIO_SKIN);\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 svpPlayer.on('playlistItem', () => {\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 displayControl = container.querySelector('.jw-display-icon-display .jw-icon-display');\n const cover = container.querySelector('.jw-preview .svp-cover');\n let forwardButton = container.querySelector(`.jw-controlbar .${CN_FORWARD_BUTTON}`);\n let forwardControl = container.querySelector(`.jw-display-container .${CN_FORWARD_CONTROL}`);\n let durationInfo = container.querySelector(`.jw-title .${CN_DURATION_INFO}`);\n\n if (!cover) {\n container.querySelector('.jw-preview').appendChild(\n utils.createNode('
')\n );\n }\n\n if (!forwardButton) {\n jwPlayer.addButton(forwardIcon, forwardTooltip, seekForward, 'forward', CN_FORWARD_BUTTON);\n forwardButton = container.querySelector(`.jw-controlbar .${CN_FORWARD_BUTTON}`);\n }\n\n if (!forwardControl) {\n const controls = container.querySelector('.jw-display-controls');\n forwardControl = createForwardControl(forwardTooltip);\n forwardControl.addEventListener('click', seekForward);\n controls.appendChild(forwardControl);\n }\n\n if (!durationInfo) {\n const title = container.querySelector('.jw-title');\n durationInfo = utils.createNode(`
`);\n title.appendChild(durationInfo);\n }\n\n const displayStyle = isAudio ? null : 'none';\n const addOrRemoveClass = isAudio ? utils.addClass : utils.removeClass;\n addOrRemoveClass(container, 'svp-flag-media-audio');\n displayControl.setAttribute('aria-label', isAudio ? translate.listen : translate.playback);\n forwardButton.style.display = displayStyle;\n forwardControl.style.display = displayStyle;\n durationInfo.style.display = displayStyle;\n durationInfo.innerText = isAudio ? timeToText(duration) : '';\n });\n}\n","import utils from 'utils/utils';\nimport * as icons from 'icons';\nimport * as audioIcons from 'icons/audio';\n\n/** @type {object} */\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 avButton: icons.avButton\n};\n\n/** @type {object} */\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/** @type {boolean} */\nlet defsLoaded = false;\n\n/**\n * @param {PlayerModel} svpPlayer\n */\nexport function loadDefs(svpPlayer) {\n if (defsLoaded) {\n return;\n }\n\n defsLoaded = true;\n\n svpPlayer.once('ready', () => {\n const container = svpPlayer.getContainer();\n\n if (container) {\n container.appendChild(utils.createNode(icons.defs));\n }\n });\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}\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(container.querySelectorAll(selector));\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('class', replaceableIcon.getAttribute('class'));\n replaceableIcon.parentNode.replaceChild(svpIcon, replaceableIcon);\n });\n });\n });\n}\n","const submenuHandler = (container) => {\n container.querySelector('.jw-controlbar .jw-button-container').addEventListener('click', (event) => {\n const { target } = event;\n\n // eslint-disable-next-line no-console\n if (target.classList.contains('jw-settings-submenu-button')\n || target.classList.contains('jw-settings-sharing')) {\n const submenu = container.querySelector('.jw-settings-menu');\n\n // eslint-disable-next-line max-len\n const right = Math.round(\n (container.offsetWidth - (target.offsetLeft + target.offsetWidth / 2)) - 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 { 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('contextmenu', () => {\n if (isLoaded === false) {\n const item = container.querySelectorAll('.jw-rightclick-list .jw-rightclick-item')[0];\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 = 'Loaded, click to copy';\n\n item.appendChild(infoNode);\n\n let isPrettierLoaded = false;\n\n infoNode.addEventListener('click', async () => {\n const config = await svpPlayer.config.dump();\n\n infoNode.classList.add('svp-link-tip');\n\n if (isPrettierLoaded === false) {\n setTimeout(() => {\n infoNode.classList.remove('svp-link-tip');\n }, 1000);\n\n isPrettierLoaded = true;\n infoNode.classList.add('svp-config-info--loaded');\n } else {\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 isLoaded = true;\n }\n }, false);\n });\n};\n","/**\n * Audio video switching button\n *\n */\nconst 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 console.log('Unable to copy');\n }\n\n document.body.removeChild(el);\n};\n\n\nexport {\n copyToClipboard\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) => `${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 && el.previousSibling && value) {\n el.previousSibling.innerText = 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('click', () => {\n window.open(link, '_blank');\n }, true);\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 } = 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('.jw-tooltip-sharing-Embed'),\n code\n );\n }\n\n // link can be undefined\n if (link && hasMediaId(link) === false) {\n updateElement(\n container.querySelector('.jw-tooltip-sharing-Link'),\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', () => updateSharingBox(\n svpPlayer.getContainer(),\n svpPlayer.getStream(),\n svpPlayer.config.get('sharing')\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 {\n APPNEXUS_CLASS_NAME,\n SVP_FLAG_STOPPED,\n handleAppnexusClass\n};\n\nexport default function (svpPlayerModel) {\n svpPlayerModel.on('playlistItem', () => {\n const container = svpPlayerModel.getContainer();\n\n handleAppnexusClass(\n container,\n svpPlayerModel.getStream().getVendor()\n );\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) => 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('playlistItem', function () {\n this.listenToOnce(\n svpPlayer.player,\n 'levels',\n (levels) => handleLevelSettingsIcon(levels, getLevelSettingsIcon(svpPlayer.getContainer()))\n );\n }, this);\n};\n","import styleLoader from 'utils/style-loader';\n\nimport audioSkinResolver from './skin/audioSkinResolver';\nimport loadIcons, { loadDefs, getIcon } from './skin/icons-loader';\nimport settingsMenu from './skin/settings-menu';\nimport configButton from './skin/config-button';\nimport sharingBox from './skin/sharing-box';\nimport fullscreenButton from './skin/fullscreen-button';\n\nimport containerClass from './skin/container-class';\nimport levelsIcon from './skin/levels-icon';\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 loadDefs(svpPlayerModel);\n\n audioSkinResolver(svpPlayerModel);\n settingsMenu(svpPlayerModel);\n configButton(svpPlayerModel, {\n icon: getIcon('info')\n });\n loadIcons(svpPlayerModel);\n sharingBox(svpPlayerModel);\n fullscreenButton(svpPlayerModel);\n containerClass(svpPlayerModel);\n levelsIcon(svpPlayerModel);\n}\n","import device from 'utils/device';\n\nexport default (svpPlayer) => {\n if (!svpPlayer.player.getControls()) {\n return;\n }\n\n svpPlayer.on('playlistItem', (playlistItem = {}) => {\n if (device.isIOS()) {\n const fullscreenButton = svpPlayer.getContainer().querySelector('.jw-icon-fullscreen');\n const display = playlistItem.stereomode === 'monoscopic' ? 'none' : 'inherit';\n\n svpPlayer.on('initialPlay', () => {\n fullscreenButton.style.display = display;\n });\n }\n });\n};\n","import utils from 'utils/utils';\nimport device from 'utils/device';\nimport logger from 'utils/logger';\nimport Viewport from './viewport';\nimport HomadAdsJw from './ads/homad-jw';\nimport autoplay from './config/autoplay';\nimport appnexus from './ads/appnexus';\nimport preventAdSeeking from './ads/prevent-seeking';\n\nimport youbora from './youbora';\nimport svpSkin, { skinLoader } from './skin';\n\nconst PlayerModel = function (config) {\n /**\n * JW Player instance\n * @type {null}\n */\n this.player = null;\n this.stream = null;\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 {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 {null}\n */\n this.currentTime = null;\n\n /**\n * Breakpoints for visuals\n * @type {{xsmall: number, small: number, medium: number, big: number, web: number, webWide: number}}\n */\n this.viewport = new Viewport();\n this.listenTo(this.viewport, 'change', this.onViewportChange, this);\n\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/**\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 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 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(`Method ${method} called before player has been initialised`);\n return null;\n }\n\n return this.player[method].apply(this, args);\n };\n}\n\n/**\n * Proxy methods from JW\n */\nfunction forwardMethods(methods) {\n const forwardedMethods = {};\n\n utils.each(methods, function (method) {\n forwardedMethods[method] = bindJwMethod.call(this, method);\n }, this);\n\n return forwardedMethods;\n}\n\nfunction getAdPosition(slotId) {\n const slotKeys = { pre: 'preroll', mid: 'midroll', post: 'postroll' };\n\n return slotKeys[slotId];\n}\n\n/**\n * Parse adresponse for each adslot\n *\n * @param xml\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 playbackEnd\n */\nfunction onPlaybackEndAvailable(playbackEnd) {\n const onTime = (position) => {\n if (position > playbackEnd) { //\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 * Extended ready event with info about device autoplay ability\n * @param data\n */\nfunction onReady(options, eventData) {\n this.trigger('ready', utils.extend(options, eventData));\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(`SVP Player initialization error. DOM ${this.config.get('node')} not found`);\n return;\n }\n\n this.getConfig().then((config) => {\n // speedup lookup\n const { player } = this;\n\n player.setup(config);\n\n svpSkin(this);\n preventAdSeeking(this);\n // load youbora only for non-mock streams\n if (this.stream && this.stream.get('type') !== 'mock') {\n youbora.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 'seek', 'displayClick', 'captionsChanged', 'adPause', 'adPlay', 'autostartNotAllowed', 'adClick',\n 'fullscreen', 'volume', 'mute'\n ], forwardEvent, this);\n\n this.listenTo(player, 'error setupError', this.onError, this);\n this.listenTo(player, 'playlistItem', this.onPlaylistItemLoad, this);\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(player, 'ready', onReady.bind(this, {\n canAutoplay: autoplay.canAutoplay(config)\n }));\n\n this.listenTo(player, 'time', this.onTime, this);\n this.listenTo(player, 'resize', this.onPlayerResize, this);\n this.listenTo(player, 'viewable', this.onViewable, this);\n this.listenTo(player, 'autostartNotAllowed', this.onAutostartNotAllowed, this);\n\n this.listenTo(player, 'meta', this.onMeta, this);\n this.listenTo(player, 'metadataCueParsed', this.onMetadataCueParsed, this);\n\n this.listenTo(player, 'seek', function (data) {\n this.currentTime = data.offset;\n }, this);\n this.listenTo(player, 'seeked', function () {\n this.trigger('seeked', this.currentTime);\n // clearing has to occur after seekend event as getCurrentTime needs it\n this.currentTime = null;\n }, this);\n\n // 'restart' stream only when flash has been blocked\n this.once('flashBlocked', function () {\n this.listenTo(player, 'providerChanged', this.play, this);\n }, this);\n\n this.once('initialPlay', function () {\n this.listenToOnce(player, 'captionsList', function () {\n this.trigger('captionsList', this.getCaptionsList());\n }, this);\n }, this);\n\n this.on('initialPlay', () => {\n this.isStopped = false;\n });\n\n this.listenTo(player, 'adImpression', 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\n if (data && data.response) {\n this.trigger('adData', parseAdData(data));\n }\n }, this);\n\n this.listenTo(player, 'adError', function (data) {\n if (data && data.adposition) {\n this.adPosition = getAdPosition(data.adposition);\n }\n }, this);\n\n this.listenTo(player, 'adTime', function (data) {\n if (data.position && data.duration) {\n this.trigger('adProgress', data.position, data.duration);\n }\n }, this);\n\n this.on('adSlotStart', function () {\n this.listenToOnce(player, 'adBreakEnd', function () {\n if (this.adPlaying === true) {\n this.trigger('adSlotComplete', {\n position: this.adPosition\n });\n\n this.adPlaying = false;\n }\n }, this);\n }, this);\n\n this.listenTo(player, 'adSkipped', function () {\n this.trigger('adSkipped');\n }, this);\n\n this.listenTo(player, 'adComplete', function () {\n this.trigger('adFinished');\n }, this);\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 },\n\n playNext(stream) {\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 // 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 async togglePlayback(type) {\n const streamType = type === 'audio' && this.stream.hasMp4Streams() ? 'mp4' : 'hls';\n console.log(device.isIOS());\n console.log(streamType);\n const streamUrl = await this.config.getStreamUrl(streamType);\n const streamPoster = this.config.getPoster(this.stream);\n this.player.load([{\n id: this.stream.getId(),\n image: streamPoster,\n // image: '',\n sources: [{\n file: streamUrl,\n // force mp4 stream type for ads\n type: streamType,\n default: true\n }],\n starttime: this.getCurrentTime(),\n playbackType: type,\n tracks: []\n }]);\n\n this.player.play(true);\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 (this.getCurrentTime() > 0 && this.getCurrentTime() !== this.getDuration()) {\n this.trigger('complete');\n }\n },\n\n /**\n * Get DOM Node where player is inserted\n * @returns {*}\n */\n getContainer() {\n return this.player.getContainer();\n },\n\n /**\n * Get playback volume\n * @returns {*}\n */\n getVolume() {\n return this.player.getVolume();\n },\n\n /**\n * Set playback volume\n * @param volume\n */\n setVolume(volume) {\n this.player.setVolume(volume);\n },\n\n /**\n * Get mute flag\n * @return {*|boolean}\n */\n getMute() {\n return this.player.getMute();\n },\n\n /**\n * Set mute param in player\n * @param value\n */\n setMute(value) {\n this.player.setMute(value);\n },\n\n /**\n * Seek\n */\n seek(time) {\n // flash bug - player is not seeking when stream hasn't started playing\n if (this.getCurrentTime() === 0) {\n // start stream only it's not playing\n // move this to play method?\n if (this.player.getState() !== 'playing') {\n this.play();\n }\n\n this.once('assetPlay', this.player.seek.bind(this.player, time));\n } else {\n this.player.seek(time);\n }\n },\n\n /**\n * Get player config. Method is asynchronous due to loading info from api\n *\n * @param 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\n */\n setStream(stream) {\n this.stream = stream;\n },\n\n /**\n * Get current stream loaded with player\n *\n * @returns {null|Stream|*}\n */\n getStream() {\n return this.stream;\n },\n\n /**\n * Check is ad is playing or not\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}\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()\n .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 */\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 // cleanup any bind listener\n this.off();\n\n if (this.player) {\n this.pause(true);\n\n this.player.off();\n this.player.remove();\n\n this.trigger('remove');\n }\n },\n\n /**\n * Get stream duration\n *\n * @returns {*}\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 {*}\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 getState() {\n if (this.isAdPlaying()) {\n return 'adPlaying';\n }\n\n return this.player.getState();\n },\n\n // eslint-disable-next-line consistent-return\n getAdBlock() {\n if (this.player) {\n return this.player.getAdBlock();\n }\n },\n\n /**\n * Get poster for current stream\n * Poster may be changed in config\n *\n * @returns {*}\n */\n getPoster(stream, container) {\n return this.config.getPoster(stream, container);\n },\n\n /**\n *\n * Get playback mode\n *\n * @returns {*}\n */\n getProvider() {\n const provider = this.player.getProvider();\n\n if (provider && provider.name === 'flash') {\n return 'flash';\n }\n\n return 'html5';\n },\n\n /**\n * Get list of captions extended by data from api\n *\n * @returns {*}\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 index (number|string) - 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 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 if (code === 210002) {\n // Flash plugin failed to load\n // click to play\n this.pause();\n this.trigger('flashBlocked');\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 */\n onPlaylistItemLoad(playlistItem) {\n if (!this.playlistItem || this.playlistItem.file !== playlistItem.item.file) {\n // cleanup any previous beforePlay event (playnext after countdown or error)\n this.stopListening(this.player, 'beforePlay');\n\n if (!this.playlistItem || this.playlistItem.id !== playlistItem.item.id) {\n // trigger this event every time new playlist item is loaded\n this.listenToOnce(this.player, 'beforePlay', function () {\n if (this.stream.getTimeToStart() < 0) {\n this.trigger('initialPlay');\n }\n }, this);\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(this.player, 'displayClick', function () {\n if (!this.config.hasValidToken() && this.player.getState() !== 'playing') {\n this.play();\n }\n }, this);\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\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 /**\n * Time\n *\n * @param data.position - current playback time\n * @param data.duration - current stream duration\n */\n onTime(data) {\n if (data.position < 0) {\n this.trigger('time', -(data.duration - data.position), -(data.duration));\n } else {\n this.trigger('time', data.position, data.duration);\n }\n },\n\n /**\n * Triggered on first frame of content playback - after ads\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 if (device.isSamsungInternet() && 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 /**\n * Handler for checking player size\n */\n onPlayerResize(data) {\n this.viewport.update(data.width);\n },\n\n onViewable(eventData) {\n const { viewable } = eventData;\n\n this.trigger('viewable', {\n viewable\n });\n },\n\n onAutostartNotAllowed(data) {\n const { reason } = data;\n\n if (reason === 'autoplayDisabled') {\n this.player.setMute(false);\n }\n },\n\n onViewportChange(currentViewport, previousViewport) {\n // remove current class from container if it exist\n if (previousViewport.label) {\n utils.removeClass(this.getContainer(), `svp-viewport-${previousViewport.label}`);\n }\n\n utils.addClass(this.getContainer(), `svp-viewport-${currentViewport.label}`);\n\n this.trigger('viewport', currentViewport, previousViewport);\n },\n\n /**\n * Schedule midroll to\n * @param slotDuration\n * @param startTime\n * @returns {Promise}\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 = () => 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(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.playAd(adTag);\n }.bind(this));\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(PlayerModel.prototype, utils.Events, forwardMethods.call(PlayerModel.prototype, [\n 'getCurrentCaptions', 'setCaptionsStyles'\n]));\n\n/* jshint newcap: false */\nexport default HomadAdsJw(PlayerModel);\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;","function copyProperties(target, source) {\n for (let key of Reflect.ownKeys(source)) {\n if (key !== \"constructor\" && key !== \"prototype\" && key !== \"name\") {\n let desc = Object.getOwnPropertyDescriptor(source, key);\n Object.defineProperty(target, key, desc);\n }\n }\n}\n\nfunction mix(...mixins) {\n class Mix {}\n\n // Programmatically add all the methods and accessors\n // of the mixins to class Mix.\n for (let mixin of mixins) {\n copyProperties(Mix, mixin);\n copyProperties(Mix.prototype, mixin.prototype);\n }\n\n return Mix;\n}\n\nexport {\n mix,\n copyProperties\n};\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 setPlayer(player) {\n this.player = player;\n this.setup(player);\n }\n}\n\nconst createClass = (plugin) => {\n class CustomPluginModel extends PluginModel {}\n copyProperties(CustomPluginModel.prototype, plugin);\n return CustomPluginModel;\n};\n\nexport {\n createClass\n};\n\nexport default PluginModel;\n","import scriptLoader from 'utils/script-loader';\nimport logger from 'utils/logger';\nimport { createClass as createPluginClass } from 'player/plugins/model';\n\nconst plugins = {};\n\nconst Plugins = {\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 get(name) {\n return plugins[name];\n }\n};\n\nexport default Plugins;\n","/* global apntag */\nimport config from 'player/config';\nimport utils from 'utils/utils';\nimport logger from 'utils/logger';\n\nexport default utils.extend({\n isLoaded: null,\n\n load() {\n if (window.apntag) {\n this.isLoaded = true;\n return Promise.resolve();\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 utils.loadScript(config.ads.appnexus.ast).then(() => {\n // check if object really exist\n this.isLoaded = typeof window.apntag === 'object';\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 defineTag(tagId, tagOptions) {\n return this.load().then(() => {\n const tagConfig = utils.merge({\n targetId: tagId\n }, tagOptions);\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('adLoaded', tagId, this.trigger.bind(this, 'adLoaded', tagId));\n }).catch((error) => {\n if (error.firstLoad) {\n logger('SVP').log('Could not load AST tag');\n }\n });\n },\n\n showTag(tagId) {\n if (this.isLoaded) {\n apntag.showTag(tagId);\n }\n },\n\n refreshTag(tagId) {\n if (this.isLoaded) {\n apntag.refresh([tagId]);\n }\n },\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 off(targetId) {\n if (this.isLoaded) {\n apntag.offEvent('adLoaded', targetId);\n }\n }\n}, utils.Events);\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(this, Array.prototype.slice.call(arguments));\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(this, Array.prototype.slice.call(arguments));\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.getContainer().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(appnexus, 'adLoaded', 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 }, this);\n\n appnexus.defineTag(\n appnexusAdId,\n this.adPlacement\n ).then(() => {\n appnexus.showTag(appnexusAdId);\n });\n }),\n\n show: withCounter(withAdTag(function (data) {\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 (pauseReason !== undefined && pauseReason !== 'external' && pauseReason !== 'settingsInteraction'\n && this.player.model.player.getViewable() === 1) {\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 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(this.player.model, 'playlistItem', function (item) {\n const { adPlacements } = item;\n\n if (adPlacements && adPlacements.pause) {\n // eslint-disable-next-line max-len\n this.maxDisplays = (typeof adPlacements.pause.maxDisplays === 'undefined') ? -1 : parseInt(adPlacements.pause.maxDisplays, 10);\n\n this.displayCounter = 0;\n this.render(adPlacements.pause);\n }\n }, this);\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(utils.template(pauseTemplate, {\n appnexusAdContainerId: appnexusAdContainerId,\n closeIcon: closeIcon\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('click', this.onResumeClick.bind(this), true);\n }\n\n if (closeButton) {\n closeButton.addEventListener('click', (event) => {\n event.stopPropagation();\n this.hide();\n }, true);\n }\n this.player.getContainer().appendChild(this.el);\n\n this.listenTo(this.player.model.player, 'resize', function (width, height) {\n if (this.player.getState() === 'paused') {\n this.resizeAd(width, height);\n }\n }, this);\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.getContainer().removeChild(this.el);\n this.el = null;\n }\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 }\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(`ageLimit-${this.ageLimit}`, this.ageLimit);\n\n this.el = utils.createNode(`
${ageLimit}
`);\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 // hide label after 3 seconds\n this.listenToOnce(this.player, 'time', setTimeout.bind(null, this.hide.bind(this), 3000));\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(`
${adFrom} ${this.sponsor}
`);\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 utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport locale from 'player/model/locale';\nimport PluginModel from './model';\n\nconst SVP_FLAG_EXPERIMENT = 'svp-flag-experiment';\nconst SVP_FLAG_EXPERIMENT_EXTENDED = 'svp-flag-experiment-extended';\nconst SVP_LOGIN_OVERLAY = 'svp-login-overlay';\nconst SVP_EXPERIMENT = 'svp-experiment';\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({ id, min: prev[index - 1].max, max: prev[index - 1].max + percentage });\n }\n return [{ id, min: 0, max: percentage }];\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)\n .filter((key) => key.match(/^\\d+variant/g));\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] || {}, { id, [key]: metadata[current] });\n }\n return prev;\n }, {});\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) => `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 (variant.OfferButton) {\n return variant.OfferButton;\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 {\n variant, loginUrl, subscriptionUrl, articleUrl, player\n } = this;\n const { id, provider } = player.asset.attributes;\n const jwPlayer = player.model.player;\n const useExtendedVariant = jwPlayer.getHeight() > 300;\n const container = jwPlayer.getContainer();\n const buttonText = this.getButtonText();\n const uiElementId = getUiElementId(provider, encodeURIComponent(articleUrl), id);\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: { '@id': uiElementId, type: 'UIElement', name: buttonText }\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: { '@id': uiElementId, type: 'UIElement', name: buttonText }\n });\n });\n }\n\n if (!variant) {\n player.once('initialPlay', () => {\n trackEngagement();\n });\n return;\n }\n\n const isOffer = assertUppercased(variant.Offer, 'TRUE');\n if (isOffer) {\n if (useExtendedVariant) {\n utils.addClass(container, SVP_FLAG_EXPERIMENT_EXTENDED);\n }\n utils.addClass(container, SVP_FLAG_EXPERIMENT);\n container.appendChild(\n utils.createNode(`\n
\n
\n ${variant.OfferHeader || ''}\n
\n
\n ${variant.OfferPreamble || ''}\n
\n
\n `)\n );\n }\n\n const redirectUrl = isLoginVariantType(variant) ? loginUrl : subscriptionUrl;\n const onLoginButtonClick = (e) => {\n e.preventDefault();\n if (pulseStatsPlugin) {\n trackEngagement();\n }\n setTimeout(() => {\n window.location.href = redirectUrl;\n }, 400);\n };\n container.appendChild(\n utils.createNode(`\n \n `)\n );\n const loginButton = container.querySelector(`.${SVP_LOGIN_OVERLAY}`);\n loginButton.addEventListener('click', onLoginButtonClick);\n }\n\n destroy() {\n this.stopListening(this.player);\n const jwPlayer = this.player.model.player;\n const container = jwPlayer.getContainer();\n\n utils.removeClass(container, SVP_FLAG_EXPERIMENT);\n utils.removeClass(container, SVP_FLAG_EXPERIMENT_EXTENDED);\n\n const experimentInfo = container.querySelector(`.${SVP_EXPERIMENT}`);\n if (experimentInfo) {\n experimentInfo.parentNode.removeChild(experimentInfo);\n }\n\n const experimentOverlay = container.querySelector(`.${SVP_LOGIN_OVERLAY}`);\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 locale from 'player/model/locale';\n\nimport countdownTemplate from './countdown.html';\nimport PluginModel from './model';\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.start = options.start;\n\n this.liveDOM = null;\n this.countdownDOM = null;\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 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('svp-countdown-live-timer')[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.bind(this, 'start'));\n\n // interval has to be initialized on\n this.intervalId = setInterval(this.refresh.bind(this), 1000);\n this.refresh();\n }\n\n refresh() {\n const start = this.getDateData(this.start);\n\n // trigger only if date has changed\n if (this.repaint(start)) {\n this.trigger('change', start);\n }\n }\n\n repaint(date) {\n const string = [];\n const liveDate = this.start;\n\n if (this.isCountdownActive()) {\n string.push(`${leadingZeros(date.min)}:`);\n string.push(`${leadingZeros(date.sec)}s`);\n\n if (this.currentState !== 'timer') {\n this.currentState = 'timer';\n this.liveDOM.innerHTML = locale.translate('Video will start in');\n\n utils.addClass(this.player.getContainer(), 'svp-countdown-active');\n }\n } else if (this.currentState !== 'date') {\n this.currentState = 'date';\n\n string.push(`${liveDate.getDate()} ${locale.getMonthName(liveDate)} `);\n string.push(`${leadingZeros(liveDate.getHours())}:`);\n string.push((leadingZeros(liveDate.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 return true;\n }\n\n return false;\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(), ['svp-countdown-active', 'svp-countdown-loaded']);\n\n this.trigger('end');\n }\n\n getDateData(endDate) {\n let diff = (endDate - Date.parse(new Date())) / 1000;\n\n // end of counting\n if (diff <= 0) {\n diff = 0;\n\n if (this.intervalId) {\n this.stop();\n }\n }\n\n const dateData = {\n years: 0,\n days: 0,\n hours: 0,\n min: 0,\n sec: 0\n };\n\n if (diff >= (365.25 * 86400)) {\n dateData.years = Math.floor(diff / (365.25 * 86400));\n diff -= dateData.years * 365.25 * 86400;\n }\n\n if (diff >= 86400) {\n dateData.days = Math.floor(diff / 86400);\n diff -= dateData.days * 86400;\n }\n\n if (diff >= 3600) {\n dateData.hours = Math.floor(diff / 3600);\n diff -= dateData.hours * 3600;\n }\n\n if (diff >= 60) {\n dateData.min = Math.floor(diff / 60);\n diff -= dateData.min * 60;\n }\n\n dateData.sec = Math.floor(diff);\n\n return dateData;\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 const now = new Date();\n\n // less than 1 hour\n return (Math.abs(this.start.getTime() - now.getTime())) < 3599999;\n }\n}\n\nexport default CountdownPlugin;\n","\nimport assetService from 'player/services/api/asset';\nimport relatedService from 'player/services/api/related';\nimport Asset from '../asset';\n\n// eslint-disable-next-line\nconst mapResponse = (vendor, assets) => assets.map((asset) => {\n // add vendor to assets\n return new Asset(Object.assign({\n vendor\n }, asset));\n});\n\n/**\n * Get related engine\n *\n * @param useMlEngine\n * @returns {string}\n */\nconst getEngine = (useMlEngine) => (useMlEngine === true ? 'related-ml' : 'related');\n\nconst fetchByIds = async ({ vendor, ids }) => {\n const assets = await assetService.getByIds({\n vendor,\n ids\n });\n\n return mapResponse(vendor, assets);\n};\n\nconst fetchFromRelatedEngine = async({ vendor, assetId, useMlEngine }) => {\n let assets = await relatedService.getList({\n engine: getEngine(useMlEngine),\n vendor,\n assetId\n });\n\n // fetch from old recommended\n if (useMlEngine === true && assets.length === 0) {\n assets = await relatedService.getList({\n engine: getEngine(false),\n vendor,\n assetId\n });\n }\n\n return mapResponse(vendor, assets);\n};\n\n\nexport default {\n fetchByIds,\n fetchFromRelatedEngine\n};\n","/* eslint-disable no-underscore-dangle */\nimport utils from 'utils/utils';\nimport nextAsset from './next-asset';\nimport recommendedList from './recommended/list';\n\nclass Recommended {\n constructor({ asset, ml }) {\n this.asset = asset;\n this.useMlEngine = (ml !== false);\n }\n\n /**\n * Fetch next asset\n *\n * @returns {Promise}\n */\n getNextAsset(options = {}) {\n const { asset, useMlEngine } = 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(this.asset, {\n useMlEngine\n });\n }\n\n\n /**\n * Fetch recommended asset list\n * Fetch assets by ids when items provided as a param\n *\n * @param items optional array of ids\n * @returns {*}\n */\n async getItems(items) {\n const { useMlEngine } = this;\n\n const vendor = this.asset.getVendor();\n const assetId = this.asset.get('id');\n\n if (!utils.isArray(items) || items.length === 0) {\n return recommendedList.fetchFromRelatedEngine({\n vendor,\n assetId,\n useMlEngine\n });\n }\n\n return recommendedList.fetchByIds({\n ids: items,\n vendor\n });\n }\n}\n\nexport default Recommended;\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 assetId - SVP Asset id\n * @param source - source of playnext (auto - when autoplay next, single, grid)\n */\nfunction playNext(assetId, source) {\n const clear = () => {\n utils.removeClass(this.el, ['is-grid-visible', 'is-next-visible', 'is-counting', 'is-next-closing']);\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('nextAssetPlay', this.nextAsset, (source === 'auto') ? 'auto' : 'click', {\n source: this.nextAssetSource\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, 'is-next-visible is-counting is-next-visible');\n}\n\n/**\n * Retrieve full url for play next and grid assets thumbnails\n *\n * @param key\n * @returns {*}\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`] = `repeat(${gridItem.clientWidth}px)`;\n }\n}\n/**\n * Click handler for recommended grid\n *\n * @param node\n */\nfunction onGridItemClicked(node) {\n utils.addClass(node, 'svp-to-active');\n\n this.listenToOnce(this.player, 'assetPlay', function() {\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\n }, this);\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 ml: this.settings.ml\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.getItems(this.settings.grid.items).then((items) => {\n if (utils.isArray(items) && items.length > 0) {\n this.gridItemsReady = true;\n this.trigger('gridItemsReady', items);\n } else {\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\n }\n }).catch(() => {\n try {\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\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 recommended.getNextAsset(this.settings.next).then(({ nextAsset, source }) => {\n this.nextAsset = nextAsset;\n this.nextAssetSource = source;\n\n this.trigger('nextAssetReady', this.nextAsset, {\n source\n });\n }).catch(() => {\n if (this.el) {\n utils.removeClass(this.el, ['is-next-visible', 'is-counting', 'is-next-closing']);\n }\n });\n }\n}\n\n/**\n * Initialize lazy fetching\n */\nfunction onInitialize() {\n // fetch recommended 15s before playback end\n let fetchDuration = this.player.getDuration() - 15;\n\n // for streams shorter than 15s load next in 2s\n if (fetchDuration < 0) {\n fetchDuration = 2;\n }\n const isLive = this.player.model.getStream().isLive();\n const isDisabledNextVideo = this.player.model.getStream().isDisabledNextVideo();\n\n // do not enable recommended for live streams and asset with metadata.disableNextVideo set to true\n if (!isLive && !isDisabledNextVideo) {\n this.listenTo(this.player, 'time', function (time) {\n if (fetchDuration > 0 && time > fetchDuration) {\n fetchDuration = -1;\n onPlaybackStart.call(this);\n }\n }, this);\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 */\nfunction onPlaybackComplete(reason) {\n const stream = this.player.model.getStream();\n\n // do not take any action if complete is triggered by playNext\n if (stream.isAudio() || reason === 'playNext' || reason === 'stop') {\n return;\n }\n\n if (this.nextAsset) {\n this.trigger('nextAssetComplete', this.nextAsset);\n playNext.call(this, this.nextAsset.get('id'), '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(this.player.getContainer(), 'is-recommended-grid-visible');\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 time\n * @param 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 timeout - duration of countdown\n */\nfunction onPlayNextVisible(timeout) {\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('svp-player-recommended-countdown')[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 = 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]\n .addEventListener('click', playNext.bind(this, this.nextAsset.get('id'), 'single'));\n\n this.getByClass('svp-player-recommended-close')[0]\n .addEventListener('click', disableNext.bind(this));\n}\n\n/**\n * Triggered when grid items are available\n */\nfunction onGridItemsReady(recommended) {\n this.getByClass('svp-player-recommended-grid')[0].innerHTML = 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(this.player, 'play', this.trigger.bind(this, 'assetReplay'));\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(this.player.getContainer(), 'is-recommended-grid-visible');\n utils.removeClass(this.el, ['is-grid-visible', 'is-next-visible', 'is-counting', '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 = (options.settings && options.settings.next && options.settings.next.countdown) || 10;\n this.nextAsset = null;\n this.settings = utils.extend({\n grid: {\n items: []\n },\n next: {}\n }, options.settings);\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\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('svp-player-recommended-box');\n\n // clean if previously grid was displayed\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\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 utils from 'utils/utils';\n\nconst ClickTracker = {\n vendor: null,\n\n mode: 'TRACK',\n url: '//click.vgnett.no/svp.gif?s=',\n\n /**\n * Track media event\n *\n * @param data\n */\n trackMediaEvent(data) {\n const query = [];\n\n query.push(`d=${this.getDeviceType()}`);\n query.push(`v=${data.assetId}`);\n\n this.sendRequest('media', query.join('&'));\n },\n\n /**\n * Track playback events in certain time\n *\n * @param data\n */\n trackStreamEvent(data) {\n const query = [];\n\n query.push(`d=${this.getDeviceType()}`);\n query.push(`v=${data.assetId}`);\n query.push(`p=${data.time}`);\n\n // randomize request time for avoiding api peaks\n setTimeout(this.sendRequest.bind(this, 'stream', query.join('&')), Math.floor((Math.random() * 100) + 1));\n },\n\n /**\n * Send API request using 1x1px image\n *\n * @param type\n * @param queryString\n */\n sendRequest(type, queryString) {\n const image = new Image();\n const apiUrl = this.getApiUrl(type);\n const hypen = apiUrl.indexOf('?') > -1 ? '&' : '?';\n\n // track only if tracker is initialized\n if (this.vendor) {\n if (this.mode === 'LOG') {\n // eslint-disable-next-line no-console\n console.log('SVP STATS: ', [\n queryString,\n `${apiUrl + hypen + queryString}&cb=${Math.random() * 10000}`\n ]);\n }\n\n image.src = `${apiUrl + hypen + queryString}&cb=${Math.random() * 10000}`;\n }\n\n return image;\n },\n\n /**\n * Return full API endpoint url\n *\n * @returns {string}\n */\n getApiUrl(type) {\n if (this.vendor === 'vgtv' && type === 'media') {\n return '//click.vgnett.no/vgtv.gif';\n }\n\n return this.url + this.vendor;\n },\n\n /**\n * Tracking is divided by device type\n *\n * @returns {*}\n */\n getDeviceType() {\n if (utils.device.isTablet()) {\n return 'tablet';\n }\n\n if (utils.device.isMobile()) {\n return 'mobile';\n }\n\n return 'desktop';\n }\n};\n\nexport default ClickTracker;\n","import ClickTracker from './svp-stats/tracker';\nimport PluginModel from './model';\n\n/**\n * Seconds intervals for tracking\n * @returns {number}\n */\nfunction getTrackingInterval(duration) {\n // if duration is not set then do not track it\n if (duration > 0) {\n // for streams shorter than 250s tracking interval is 5seconds\n if (duration < 250) {\n return 5;\n }\n\n // otherwise it's every 2% of stream\n return Math.floor(duration * 0.02);\n }\n\n return -1;\n}\n\n\n/**\n * Basic SVP statistics tool\n *\n * @param options\n * @constructor\n */\nclass SvpStatsPlugin extends PluginModel {\n constructor(options) {\n super(options);\n\n this.env = options.env;\n this.vendor = options.vendor;\n this.mode = options.mode;\n }\n\n // eslint-disable-next-line\n getName() {\n return 'SvpStatsPlugin';\n }\n\n setup() {\n // stats can be turned off only on non production env\n if (this.mode === 'OFF' && this.env !== 'production') {\n return;\n }\n\n ClickTracker.mode = this.mode;\n ClickTracker.vendor = this.vendor;\n\n this.listenTo(this.player, 'assetPlay', function (startTime) {\n const asset = this.player.getAsset();\n const assetId = asset.get('id');\n const duration = this.player.getDuration();\n const trackingInterval = getTrackingInterval(duration);\n\n let initialStartTime = startTime || -1;\n let currentTime = -1;\n\n ClickTracker.trackMediaEvent({\n assetId: assetId\n });\n\n // tracking interval maybe invalid when stream is live or do not have proper duration\n if (trackingInterval > 0 && asset.get('streamType') !== 'live') {\n // assetPlay prevents from sending events when it has start time\n this.listenTo(this.player, 'time', (playerTime) => {\n const time = Math.floor(playerTime);\n\n // engagement tracking\n if (time !== currentTime && time % trackingInterval === 0 && time > initialStartTime) {\n currentTime = time;\n // reset start time counter for tracking seek before start point in indexed stream\n initialStartTime = -1;\n\n // prevent requests outside stream size\n if (time > -1 && time <= duration) {\n ClickTracker.trackStreamEvent({\n assetId: assetId,\n time: time\n });\n }\n }\n });\n }\n });\n\n this.listenTo(this.player, 'adSlotStart', function (adSlot) {\n if (adSlot.position === 'preroll') {\n ClickTracker.trackStreamEvent({\n assetId: this.player.getAsset().get('id'),\n time: -1\n });\n }\n });\n\n this.listenTo(this.player, 'adSlotComplete', function (adSlot) {\n if (adSlot.position === 'preroll') {\n ClickTracker.trackStreamEvent({\n assetId: this.player.getAsset().get('id'),\n time: -2\n });\n }\n });\n }\n\n destroy() {\n ClickTracker.vendor = null;\n this.stopListening(this.player);\n }\n}\n\n\nexport default SvpStatsPlugin;\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 = window.pulse || function() {\n window.pulse.q = window.pulse.q || [];\n window.pulse.q.push(arguments);\n };\n\n this.request = scriptLoader('//sdk.pulse.schibsted.com/pulse.min.js');\n } else {\n // pulse is already available\n this.request = Promise.resolve();\n }\n }\n\n return this.request;\n },\n\n init(provider) {\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('init', provider, null, null, PROVIDER_TRACKER_ID);\n\n const promise = new Promise((resolve) => {\n window.pulse(PROVIDER_TRACKER_ID, (tracker) => resolve(tracker));\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","import Eventable from 'utils/eventable';\nimport get from 'lodash/get';\n\n/**\n * Parse SVP Player events and tailor data to pulse requirements\n *\n * Available events: Play, Pause, Stop, Watch\n */\nclass AdEvents extends Eventable {\n constructor(player) {\n super();\n this.player = player;\n this.adData = {};\n this.adSequencePosition = 0;\n this.adSequenceCount = 0;\n this.beforeUnload = ['beforeunload', this.onAdSlotComplete.bind(this), true];\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, 'adProgress', this.onAdProgress, this);\n this.listenTo(this.player, 'adSlotComplete', this.onAdSlotComplete, this);\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(this.player, 'PausePlugin:adVisible', this.onPauseAdVisible, this);\n\n if (get(window, ['SVP', 'Player', 'isHomadLoaded']) === true) {\n window.addEventListener('hdEvent', this.onHomadEvent.bind(this));\n }\n\n window.addEventListener(...this.beforeUnload);\n }\n\n /**\n * Homad AAB ads have single event bus for all players\n *\n * @param event\n */\n onHomadEvent(event) {\n const details = event && event.detail;\n\n if (details.type === 'adRequest' && details.adIds) {\n this.adSequencePosition = 0;\n }\n\n if (details.type === 'adComplete' && details.adIds) {\n this.onAdFinished();\n }\n\n if (details.type === 'adStart' && details.adIds) {\n if (!this.adSequencePosition) {\n this.adSequenceCount = details.adIds.length;\n }\n\n this.adSequencePosition += 1;\n this.adIds = [...details.adIds];\n const { adID } = this.adIds[this.adIds.length - 1];\n\n Object.assign(this.adData, {\n type: details.state,\n duration: details.duration,\n id: adID,\n sequence: this.adSequencePosition,\n count: this.adSequenceCount,\n position: 0\n });\n\n this.trigger('homadAdMeta', this.adData);\n\n return this.onAdPlay();\n }\n\n return false;\n }\n\n onPlaylistItem() {\n this.adSequencePosition = 0;\n this.adSequenceCount = 0;\n this.listenToOnce(this.player, 'complete', this.onAdSlotComplete, this);\n this.listenTo(this.player.model.player, 'adImpression', (adData) => {\n Object.assign(this.adData, {\n duration: Math.round(adData.duration)\n });\n });\n }\n\n onHdEvent(event) {\n if (event && event.detail && event.detail.name === 'contentPlayerPlay') {\n this.abbAdPlayed = true;\n\n this.trigger('Play', Object.assign(this.eventData, {\n start: true,\n duration: 0\n }));\n return window.removeEventListener('hdEvent', this.onHdEvent);\n }\n return false;\n }\n\n onAdSlotStart(slotData) {\n Object.assign(this.adData, {\n type: slotData.position\n });\n }\n\n onAdStarted() {\n Object.assign(this.adData, {\n start: true\n });\n\n this.listenToOnce(this.player.model.player, 'adMeta', (adData) => {\n let adId = null;\n\n try {\n const adXml = adData.response.querySelectorAll('Ad')[adData.sequence - 1];\n adId = adXml.id;\n } catch (e) {\n // could not find Ad element\n }\n\n Object.assign(this.adData, {\n id: adId,\n sequence: adData.sequence,\n count: adData.podcount,\n position: 0\n });\n });\n }\n\n onAdProgress(time) {\n if (!this.adData.id) {\n return;\n }\n\n const position = Math.floor(time);\n const previousPosition = this.adData.position;\n\n Object.assign(this.adData, {\n position\n });\n\n if (previousPosition !== position) {\n this.trigger('Watch', this.adData);\n }\n }\n\n onAdSlotComplete() {\n this.sendStopEvent();\n window.removeEventListener(...this.beforeUnload);\n }\n\n onAdFinished() {\n this.sendStopEvent();\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', Object.assign({}, this.adData, { duration: this.adData.position }));\n this.adData = {};\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 get from 'lodash/get';\nimport session from './session';\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) {\n super();\n this.player = player;\n this.watchData = {\n time: 0,\n duration: -1\n };\n this.isHomadLoaded = get(window, ['SVP', 'Player', 'isHomadLoaded']);\n\n\n this.previousTime = -1;\n\n this.session = this.createSession();\n this.beforeStreamStart = true;\n this.abbAdPlayed = false;\n this.beforeUnload = ['beforeunload', this.onBeforeUnload.bind(this), true];\n this.playMethod = null;\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, options) => this.onRecommendedPlay(`recommendedNext-${options.source}`)\n );\n\n this.listenTo(\n this.player,\n 'RecommendedPlugin:playRecommended',\n this.onRecommendedPlay.bind(this, 'recommendedGrid')\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 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, eventInterval = 1) {\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 this.trigger('Watch', Object.assign(this.eventData, {\n position: time\n }));\n }\n }\n\n onBeforeUnload() {\n if (this.beforeStreamStart === false) {\n this.onComplete();\n }\n }\n\n onPlaylistItem() {\n this.listenToOnce(this.player, 'complete', this.onComplete, this);\n const track = this.trigger.bind(this, 'Load', Object.assign(this.eventData, {\n position: this.stream.getPlaybackTime('begin') || 0,\n duration: 0\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 onHdEvent(event) {\n if (event && event.detail && event.detail.name === 'contentPlayerPlay') {\n this.abbAdPlayed = true;\n\n this.trigger('Play', Object.assign(this.eventData, {\n start: true,\n duration: 0\n }));\n return window.removeEventListener('hdEvent', this.onHdEvent);\n }\n return false;\n }\n\n onAssetPlay() {\n if (this.isHomadLoaded && !this.abbAdPlayed) {\n return window.addEventListener('hdEvent', this.onHdEvent.bind(this));\n }\n\n this.beforeStreamStart = false;\n\n return this.trigger('Play', Object.assign(this.eventData, {\n start: true,\n duration: 0\n }));\n }\n\n onPause() {\n // pause can't be triggered before ABB adPlay\n if (!(this.isHomadLoaded && !this.abbAdPlayed)) {\n this.trigger('Pause', this.eventData);\n }\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 1s - during the first 10 seconds of content playback (no matter of where playback has started\n * every 5s - for rest of content playback, after seeking intervals should be triggered in same time\n * seek 42, then first trigger should be in 45\n */\n onTime(eventTime) {\n const time = Math.floor(eventTime);\n const eventInterval = time > 10 ? 5 : 1;\n\n this.trackTimeEvent(time, eventInterval);\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((this.stream.getTimeToStart() * -1) + this.jw.getPosition());\n // constant tracking interval\n this.trackTimeEvent(eventTime, 5);\n }\n\n onComplete(reason) {\n if (reason === 'playNext') {\n this.onRecommendedPlay('playNext');\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 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","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 AdEvents extends Eventable {\n constructor(player) {\n super();\n this.player = player;\n this.listenTo(this.player, 'ready', this.onReady, this);\n\n\n this.listenTo(\n this.player,\n 'RecommendedPlugin:playNextVisible',\n this.onRecommendedVisible,\n this\n );\n }\n\n onRecommendedVisible() {\n this.trigger('UiElement', {\n id: this.player.getAsset().get('id'),\n name: 'nextAssetCountdown'\n });\n }\n\n destroy() {\n this.stopListening();\n }\n}\n\nexport default AdEvents;\n","import config from 'player/config';\n\nclass CategoryTree {\n constructor(vendor) {\n this.vendor = vendor;\n }\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(categories.map((category) => [category.id, category]));\n });\n }\n return this.request;\n }\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\nconst instances = {};\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';\n\nimport logger from 'utils/logger';\nimport get from 'lodash/get';\n\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';\nimport utils from '../../utils/utils';\n\n/**\n * Retrieve tags from asset\n * @param asset\n */\nconst getTags = (asset) => (asset.get('tags') || []).map((tag) => tag.tag);\n\n/**\n * Get array of plan3 stories ids\n *\n * @param asset\n * @returns {*|Array}\n */\nconst getStories = (asset) => (asset.get('stories') || []);\n\nexport const getMediaAssetId = (provider, mediaId) => `sdrn:${provider}:mediaasset:${mediaId}`;\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) {\n super(options);\n this.provider = options.provider;\n this.decorator = options.decorator || ((data) => data);\n this.embed = options.embed === true;\n this.previousAssetId = options.previousAssetId;\n this.tracker = null;\n this.experiment = experiment;\n this.adSequenceDuration = false;\n this.isHomadLoaded = (utils.device.isDesktop() && get(window, ['SVP', 'Player', 'defaults', 'aab']))\n ? get(window, ['SVP', 'Player', 'isHomadLoaded'], false)\n : undefined;\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 const stories = getStories(asset);\n\n const data = {\n assetType: asset.get('assetType') === 'video' ? 'Video' : 'Audio',\n title: asset.get('title'),\n // duration should be in seconds\n duration: Math.round(asset.get('duration') / 1000)\n };\n\n if (accessControl.length > 0) {\n data.accessControl = accessControl.join(',');\n }\n\n if (tags.length > 0) {\n data.tags = tags;\n }\n\n if (stories.length > 0) {\n // disable stories until there is not id->title translation\n // data.stories = stories;\n }\n\n // check if stream has category\n if (asset.getCategory()) {\n data.category = asset.getCategory().get('id');\n }\n\n // delete duration from live assets\n if (asset.get('streamType') === 'live') {\n delete data.duration;\n }\n\n if (additional.originAssetId) {\n data.originAssetId = additional.originAssetId;\n }\n\n return data;\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.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(data, eventData, this.experiment && {\n experiments: [{\n id: this.experiment.id,\n variant: this.experiment.variant ? this.experiment.variant.id : '0',\n platform: this.provider\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 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 // eslint-disable-next-line\n data.object.category = categoryPath;\n }\n await this.track('engagementEvent', this.decorator(data, this.playerAsset));\n } catch (e) {\n // nothing to do\n logger('Pulse').log('Could not track event');\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\n this.categoryTree = CategoryTree(this.playerAsset.getVendor());\n\n this.adEvents = new AdEvents(this.player);\n this.playbackEvents = new PlaybackEvents(this.player);\n this.uiEvents = new UiEvents(this.player);\n\n // initialize only once\n Promise.all([\n PulseTracker.init(this.provider),\n this.categoryTree.fetch()\n ]).then((data) => this.onReady(data));\n\n this.listenTo(this.adEvents, 'all', this.onAdEvent, this);\n this.listenTo(this.playbackEvents, 'all', this.onPlaybackEvent, this);\n this.listenTo(this.uiEvents, 'all', this.onUiEvent, this);\n this.listenTo(this.player, 'adStarted', () => {\n this.listenToOnce(this.player.model.player, 'adMeta', this.onAdMeta);\n });\n this.listenTo(this.adEvents, 'homadAdMeta', this.onHomadAdMeta, this);\n // eslint-disable-next-line no-return-assign\n this.listenTo(this.player, 'playlistItem', () => this.adSequenceDuration = false);\n }\n\n onReady(data) {\n const [tracker] = data;\n\n this.tracker = tracker;\n this.trigger('ready');\n this.listenTo(this.adEvents, 'adStarted');\n }\n\n onHomadAdMeta(adData) {\n if (!this.adSequenceDuration) {\n this.adSequenceDuration = Array(adData.count);\n }\n\n // skip midroll and postroll\n if (adData.type !== 'preroll') {\n return;\n }\n\n this.adSequenceDuration[adData.sequence - 1] = adData.duration;\n this.adSequenceCount = this.adSequenceDuration.length;\n }\n\n onAdMeta(adData) {\n if (!this.adSequenceDuration) {\n this.adSequenceDuration = Array(adData.podcount);\n }\n\n // skip midroll and postroll\n if (get(adData, 'adschedule.offset') !== 'pre') {\n return;\n }\n\n const { textContent: duration } = adData.response\n .querySelector(`Ad:nth-of-type(${adData.sequence}) InLine Creatives Linear Duration`) || {};\n if (duration) {\n this.adSequenceDuration[adData.sequence - 1] = utils.time.durationToSeconds(duration);\n }\n }\n\n onPlaybackEvent(intent, data = {}) {\n const asset = this.playerAsset;\n const { config } = this.player;\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: Object.assign({\n '@id': getMediaAssetId(this.provider, asset.get('id')),\n '@type': 'MediaAsset',\n name: asset.getTitle(),\n muted: this.jw.getMute(),\n fullScreen: this.jw.getFullscreen(),\n autoplay: data.playMethod === null\n ? (config.get('autoplay') === true)\n : (data.playMethod === 'autostart' || data.playMethod === 'external'),\n adSequenceCount: data.count,\n embed: this.embed,\n streamType: asset.get('streamType'),\n adBlock: this.isHomadLoaded\n }, this.asset)\n };\n\n if (this.adSequenceDuration) {\n trackingData.object.adSequenceDuration = this.adSequenceDuration;\n trackingData.object.adSequenceCount = this.adSequenceDuration.length;\n }\n\n if (data.start === true) {\n trackingData.start = true;\n }\n\n if (data.previousAssetId) {\n trackingData.object.previousAssetId = getMediaAssetId(this.provider, data.previousAssetId);\n trackingData.object.playbackSource = data.playbackSource;\n } else if (this.previousAssetId) {\n trackingData.object.previousAssetId = getMediaAssetId(this.provider, this.previousAssetId);\n trackingData.object.playbackSource = 'config';\n }\n\n this.trackMediaEvent(trackingData);\n }\n\n onAdEvent(intent, data) {\n // do not track homadAdMeta events\n if (intent === 'homadAdMeta') {\n return false;\n }\n\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 * 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 mediaAssetId: getMediaAssetId(this.provider, asset.get('id')),\n adSequenceCount: data.count,\n adBlock: this.isHomadLoaded\n }\n };\n\n if (this.adSequenceDuration) {\n trackingData.object.adSequenceDuration = this.adSequenceDuration;\n trackingData.object.adSequenceCount = this.adSequenceDuration.length;\n }\n\n if (data.sequence) {\n trackingData.object.adSequencePosition = data.sequence;\n }\n\n if (data.duration) {\n trackingData.object.duration = data.duration;\n }\n\n if (data.start === true) {\n trackingData.start = true;\n }\n\n if (asset.getCategory()) {\n trackingData.object.category = this.categoryTree.getPath(asset.getCategory().attributes.id)\n .map((i) => i.title)\n .join(' > ')\n .toLocaleLowerCase();\n }\n\n return this.trackMediaEvent(trackingData);\n }\n\n async onUiEvent(eventName, data) {\n const trackingData = {\n '@type': 'View',\n object: Object.assign(data, {\n '@id': getMediaAssetId(this.provider, data.id),\n '@type': 'UIElement'\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 logger from 'utils/logger';\nimport ServerTime from 'utils/server-time';\nimport config from 'player/config';\nimport errorIcon from 'icons/error.svg';\nimport Asset from './model/asset';\nimport NextAsset from './model/next-asset';\nimport Stream from './model/stream';\nimport locale from './model/locale';\nimport Config from './playback/config';\nimport Provider from './playback/provider';\nimport { APPNEXUS_PROVIDER_ID } from './services/api';\nimport assetService from './services/api/asset';\nimport Domain from './model/domain';\nimport SvpPlugins from './plugins';\nimport PausePlugin from './plugins/pause';\nimport AgeLimitPlugin from './plugins/age-limit';\nimport SponsorLabelPlugin from './plugins/sponsor-label';\nimport PodcastExperimentPlugin, { prepareVariantsForExperiment, chooseVariant } from './plugins/podcast-experiment';\nimport CountdownPlugin from './plugins/countdown';\nimport RecommendedPlugin from './plugins/recommended';\nimport SvpStatsPlugin from './plugins/svp-stats';\nimport PulseTracker from './plugins/pulse-stats/tracker';\nimport PulseStatsPlugin from './plugins/pulse-stats';\n\nimport statusCode, { NOT_FOUND, GENERAL_ERROR } from './playback/config/status-codes';\n\n/**\n * Remove single plugin instance\n * Clear all listeners\n * Remove from plugins hashmap\n *\n * @param plugin\n */\nfunction 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/**\n * Clear error message\n * @param node\n */\nfunction clearError(node) {\n const previousErrorNode = node.getElementsByClassName('svp-player-error-wrapper');\n\n // clear old node\n if (previousErrorNode.length > 0) {\n utils.removeClass(node, ['svp-player-error', 'svp-player-error-hasImage']);\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 * @param node\n * @param message\n * @param code\n */\nfunction displayError(node, message, code = null) {\n let template = `
${errorIcon}${message}`;\n\n if (code) {\n template += `
${locale.translate('Error code')}: ${code}
`;\n }\n\n template += '
';\n\n const posterSrc = this.model && this.model.getStream() && 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 += `
`;\n }\n\n const errorNode = utils.createNode(`
${template}
`);\n\n node.appendChild(errorNode);\n\n this.once('complete', function () {\n utils.removeClass(node, ['svp-player-error', 'svp-player-error-hasImage']);\n\n if (errorNode.parentNode) {\n errorNode.parentNode.removeChild(errorNode);\n }\n }, this);\n}\n\n/**\n * Display error message\n *\n * @param event\n * @param details\n */\nfunction onError(details = {}) {\n const node = document.getElementById(this.config.get('node'));\n const { code, message } = details;\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 };\n\n if (details.type) {\n errorDetails.type = details.type;\n }\n\n displayError.call(this, node, translatedMessage, code);\n\n if (this.model.player) {\n this.model.player.stop();\n }\n\n this.trigger('error', errorDetails);\n}\n\n/**\n * Player initialized and single playlistItem is laoded\n */\nfunction onPlaylistItem() {\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 // add translation for live button via data-label\n container.getElementsByClassName('jw-icon-display')[0]\n .setAttribute('data-label', locale.translate('Live button'));\n }\n\n this.trigger('playlistItem');\n}\n\n/**\n * Stream completed, fired for every item in playlist\n * Clear settings which are only for one stream\n */\nfunction 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\n/**\n * Proxy player events\n */\nfunction 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\n\n/**\n *\n *\n * @param options Caution, param is bound in constructor\n */\nfunction 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(this.model, 'play', function () {\n this.isCompleted = false;\n }, this);\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('error', function () {\n utils.addStyleSheet(this.config.get('skin').url);\n }, this);\n\n Promise.all([\n new Promise((resolve) => {\n const handleReady = () => {\n resolve();\n this.off('assetError', handleError); // eslint-disable-line no-use-before-define\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\n/**\n * this always points to Player object\n */\nfunction 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\n if (node) {\n clearError(node);\n }\n\n // add hasNext checking\n stream.set('hasNext', NextAsset.hasPlayNext(this.asset));\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 // set start time if chapter is provided\n if (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 (configuration.get('time')) {\n stream.set('playAhead', configuration.get('time'));\n }\n\n if (configuration.hasRecommended()) {\n this.addPlugin(new RecommendedPlugin({\n settings: configuration.getRecommended()\n }));\n }\n\n // stream is not available yet, display countdown\n if (stream.getTimeToStart() > 0) {\n // countdown is disable in preview mode on non live streams\n if (settings.preview !== true || stream.isLive()) {\n this.addPlugin(new CountdownPlugin({\n start: new Date((new Date().getTime()) + stream.getTimeToStart() * 1000)\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(new AgeLimitPlugin({\n ageLimit: this.asset.getAgeLimit()\n }));\n }\n\n if (configuration.get('showSponsorLabel') && this.asset.isSponsored()) {\n this.addPlugin(new SponsorLabelPlugin({\n sponsor: this.asset.getCategoryTitle()\n }));\n }\n\n const metadata = this.asset.get('metadata') || {};\n const userStatus = configuration.get('userStatus') || {};\n\n let experiment;\n const isExperiment = !userStatus.loggedIn && metadata.experimentId && metadata.isPodcast === 'true';\n\n if (isExperiment) {\n try {\n let experimentRange = JSON.parse(sessionStorage.getItem('svpExperimentRange'));\n if (!experimentRange) {\n experimentRange = Math.random() * 100;\n sessionStorage.setItem('svpExperimentRange', JSON.stringify(experimentRange));\n }\n\n experiment = {\n id: metadata.experimentId,\n variant: chooseVariant(prepareVariantsForExperiment(metadata), experimentRange)\n };\n\n this.addPlugin(new PodcastExperimentPlugin(experiment,\n {\n loginUrl: configuration.get('loginUrl'),\n subscriptionUrl: configuration.get('subscriptionUrl'),\n articleUrl: configuration.get('articleUrl')\n }));\n } catch (error) {\n logger('ExperimentPlugin').error('An error occur while initializing experiment', 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 && pulseConfig.provider && stream.isMock() === false) {\n this.addPlugin(new PulseStatsPlugin(pulseConfig, isExperiment ? experiment : null));\n }\n\n /**\n * Disable SVP Stats for mock\n */\n if (stream.isMock() === false) {\n this.addPlugin(new SvpStatsPlugin({\n vendor: configuration.get('vendor'),\n mode: configuration.get('stats'),\n env: configuration.get('env')\n }));\n }\n\n this.addPlugin(new PausePlugin());\n\n // set stream to display error\n this.model.setStream(stream);\n\n configuration.isStreamPlayable().then(() => {\n // restart asset state\n // this.isCompleted = false;\n this.trigger('assetReady');\n }).catch((code) => {\n this.trigger('assetError', {\n message: statusCode(code),\n code\n });\n\n onError.call(this, {\n type: 'assetError',\n // message is translated in next functions\n message: statusCode(code),\n code\n });\n });\n}\n\n/**\n * Asset fetch failed. Usually happens when network issue occurred\n */\nfunction onAssetError(error) {\n const code = (error && error.status === 404) ? NOT_FOUND : GENERAL_ERROR;\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, Object.assign({\n type: 'assetFetchError'\n }, details));\n\n logger('SVP').log('error', error);\n\n // display errors in development mode\n if (config.env === 'development') {\n throw error;\n }\n}\n\nconst Player = function (configuration) {\n const options = Object.assign({}, configuration);\n\n // Little bit of monkey patching\n config.api.vendor = options.vendor || 'vgtv';\n config.env = (config.env === 'production') ? 'production' : (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 (options.vendor === APPNEXUS_PROVIDER_ID || options.id === -1) {\n options.asset = assetService.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 // 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('api/v1', 'thumbnails/v1');\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 // sync browser time with server\n if (!options.serverTime) {\n ServerTime.fetch(config.time);\n }\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 && options.pulse.provider) {\n PulseTracker.load();\n }\n\n logger('SVP').log(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 * Player public API\n */\nPlayer.prototype = {\n /**\n * Play\n * @param position - seconds (int)\n */\n play(position) {\n // stream will play only if publication date is valid\n if (this.model.getStream().getTimeToStart() < 0) {\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 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 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 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 id\n */\n playNext(id, options = {}) {\n const onNextAssetReady = function () {\n const stream = this.model.getStream();\n\n if (options && options.time) {\n stream.set('playAhead', options.time);\n }\n\n // trick to avoid create of new stream as it's set in assetReady\n this.model.playNext(stream);\n this.isPlayNextAvailable = true;\n }.bind(this);\n\n if (this.isPlayNextAvailable) {\n // complete current stream\n onComplete.call(this, 'playNext');\n\n // block multiple occurences\n this.isPlayNextAvailable = false;\n\n this.once('assetReady', onNextAssetReady, this);\n\n this.once('assetError', function () {\n if (this.model && this.model.player) {\n this.pause();\n }\n\n this.isPlayNextAvailable = true;\n this.off('assetReady', onNextAssetReady);\n }, this);\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 volume\n *\n * @param volume - number between 0 and 100\n */\n setVolume(volume) {\n this.model.setVolume(volume);\n },\n\n /**\n * Get playback volume\n * @returns {*}\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 value\n */\n setMute(value = true) {\n this.model.setMute(value);\n },\n\n /**\n * Get playback volume\n * @returns {*}\n */\n getMute() {\n return this.model.getMute();\n },\n\n /**\n * Get player state\n */\n getState() {\n return this.model.getState();\n },\n\n /**\n * Get stream duration\n *\n * @returns {*}\n */\n getDuration() {\n return this.model.getDuration();\n },\n\n /**\n * Get current playback time\n */\n getCurrentTime() {\n return this.model.getCurrentTime();\n },\n\n /**\n * Get quarter of stream.\n * Can be used for tracking\n *\n * @returns {number}\n */\n getCurrentQuartile() {\n return Math.ceil((this.getCurrentTime() / this.getDuration()) / 0.25);\n },\n\n /**\n * Get device type\n *\n * @returns {*}\n */\n getDeviceType() {\n if (utils.device.isIPhone()) {\n return 'iPhone';\n }\n\n if (utils.device.isIPad()) {\n return 'iPad';\n }\n\n if (utils.device.isAndroid()) {\n return 'android';\n }\n\n return 'desktop';\n },\n\n /**\n * Get current playback provider\n */\n getProvider() {\n return this.model.getProvider();\n },\n\n /**\n * Get current captions list\n */\n getCaptionsList() {\n return this.model.getCaptionsList();\n },\n\n /**\n * Get currently playing captions\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 */\n setCurrentCaptions(index) {\n return this.model.setCurrentCaptions(index);\n },\n\n /**\n * Override captions styles\n * @param styles\n */\n setCaptionsStyles(styles) {\n return this.model.setCaptionsStyles(styles);\n },\n\n /**\n * Get Player DOM Node\n *\n * @returns {*}\n */\n getContainer() {\n return this.model.getContainer();\n },\n\n stop() {\n return this.model.stop();\n },\n\n /**\n * Set asset resource\n * @param 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.get('vendor')) {\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 * Get current loaded asset\n * @returns {null}\n */\n getAsset() {\n return this.asset;\n },\n\n /**\n * Add plugin to the player\n *\n * @param 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 plugin - name of the plugin\n * @returns {*}\n */\n getPlugin(plugin) {\n return this.plugins[plugin];\n }\n};\n\n/**\n * Checks if device can autoplay stream\n *\n * @returns {*}\n */\nPlayer.canDeviceAutoplay = function () {\n // eslint-disable-next-line no-console\n if (console && console.warn) {\n // eslint-disable-next-line no-console\n console.warn('SVP Player SKD deprecation warning. '\n + 'Due to changes in browser policies, player will detect itself if it can autoplay.');\n }\n\n return utils.device.canAutoplay();\n};\n\nutils.extend(Player.prototype, utils.Events);\n\nexport default Player;\n","const hasAdblock = () => {\n let detected = false;\n\n // create the bait\n try {\n const bait = document.createElement('div');\n bait.setAttribute('class', 'pub_300x250 pub_300x250m pub_728x90 text-ad textAd text_ad text_ads text-ads text-ad-links');\n bait.setAttribute('style', 'width: 1px ! important; height: 1px !important; position: absolute !important; left: -10000px !important; top: -1000px !important;');\n window.document.body.appendChild(bait);\n\n // check if the bait has been affected by an adblocker\n if(window.document.body.getAttribute('abp') !== null\n || bait.offsetParent === null\n || bait.offsetHeight == 0\n || bait.offsetLeft == 0\n || bait.offsetTop == 0\n || bait.offsetWidth == 0\n || bait.clientHeight == 0\n || bait.clientWidth == 0) {\n detected = true;\n } else if(window.getComputedStyle !== undefined) {\n const baitTemp = window.getComputedStyle(bait, null);\n\n if(baitTemp && (baitTemp.getPropertyValue('display') === 'none' || baitTemp.getPropertyValue('visibility') === 'hidden')) {\n detected = true;\n }\n }\n\n // destroy the bait\n window.document.body.removeChild(bait);\n } catch (e) {\n detected = false;\n }\n\n return detected;\n};\n\n\n\nexport default hasAdblock;","import config from 'player/config';\nimport Player from 'player/player';\nimport image from 'utils/image';\nimport utils from 'utils/utils';\nimport hasAdblock from 'utils/adblock-detect';\n\nimport locale from 'player/model/locale';\nimport Domain from 'player/model/domain';\nimport HomadAds from 'player/playback/ads/homad';\n\nimport youbora 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 // eslint-disable-next-line no-underscore-dangle\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 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 * Determine if user is in 5% range of available traffic\n * We set half of 5% because autoplay gives around 2x traffic\n * @type {boolean}\n */\nconst loadYoubora = (options) => {\n // youbora plugin can be disabled completely\n try {\n if (localStorage.svpYoubora === 'true' || (options !== false && Math.random() < 0.025)) {\n youbora.load(options);\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(utils.extend(config.images, {\n getPixelRatio: utils.device.getPixelRatio\n }));\n\n Domain.initialize(window.location.hostname);\n};\n\nconst postInitialize = () => {\n const { aab } = SVP.Player.defaults;\n\n // set locale for all players\n setLocale(SVP.Player.defaults.locale);\n\n // load homad only for desktop\n // detect if adblock exist for \"auto\" mode\n // force loading when mode is set to \"true\" (forces for all desktops)\n if (utils.device.getDeviceType() === 'desktop' && ((aab === 'auto' && hasAdblock() === true) || aab === true)) {\n HomadAds.initialize();\n }\n\n loadYoubora(SVP.Player.defaults.youbora);\n};\n\nexport default SVP;\nexport { preInitialize, postInitialize };\n"],"sourceRoot":""}