{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./cartridges/app_monnalisa/cartridge/client/default/js/components/userActivity.js","webpack:///./cartridges/app_monnalisa/cartridge/client/default/js/components/newsletterModal.js","webpack:///(webpack)/buildin/global.js","webpack:///plyr.js","webpack:///node_modules/rangetouch/dist/rangetouch.mjs","webpack:///src/js/utils/is.js","webpack:///src/js/utils/animation.js","webpack:///src/js/utils/browser.js","webpack:///src/js/utils/objects.js","webpack:///src/js/utils/elements.js","webpack:///src/js/support.js","webpack:///src/js/utils/events.js","webpack:///src/js/utils/promise.js","webpack:///src/js/utils/arrays.js","webpack:///src/js/utils/style.js","webpack:///src/js/html5.js","webpack:///src/js/utils/strings.js","webpack:///src/js/utils/i18n.js","webpack:///src/js/storage.js","webpack:///src/js/utils/fetch.js","webpack:///src/js/utils/load-sprite.js","webpack:///src/js/utils/time.js","webpack:///src/js/controls.js","webpack:///src/js/utils/urls.js","webpack:///src/js/captions.js","webpack:///src/js/config/defaults.js","webpack:///src/js/config/states.js","webpack:///src/js/config/types.js","webpack:///src/js/console.js","webpack:///src/js/fullscreen.js","webpack:///src/js/utils/load-image.js","webpack:///src/js/ui.js","webpack:///src/js/listeners.js","webpack:///node_modules/loadjs/dist/loadjs.umd.js","webpack:///src/js/utils/load-script.js","webpack:///src/js/plugins/vimeo.js","webpack:///src/js/plugins/youtube.js","webpack:///src/js/media.js","webpack:///src/js/plugins/ads.js","webpack:///src/js/utils/numbers.js","webpack:///src/js/plugins/preview-thumbnails.js","webpack:///src/js/source.js","webpack:///src/js/plyr.js","webpack:///./node_modules/@babel/runtime/helpers/defineProperty.js","webpack:///./cartridges/app_monnalisa/cartridge/client/default/js/homepage.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","UserActivity","constructor","callback","this","resetListener","reset","start","events","forEach","event","document","addEventListener","clearTimeout","timeoutId","setTimeout","stop","removeEventListener","newsletterModal","isClosed","localStorage","getItem","modal","$","length","userActivity","on","setItem","show","g","Function","e","window","navigator","_defineProperty$1","obj","configurable","writable","_defineProperties","_defineProperty","ownKeys","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","push","apply","_objectSpread2","arguments","getOwnPropertyDescriptors","defineProperties","defaults","addCSS","thumbWidth","watch","matches","Array","from","querySelectorAll","includes","getConstructor","instanceOf","isString","String","isArray","isNodeList","NodeList","is","Element","Event","isNullOrUndefined","isObject","RangeTouch","TypeError","element","querySelector","rangeTouch","config","init","enabled","style","userSelect","webKitUserSelect","touchAction","listeners","set","target","changedTouches","parseFloat","getAttribute","u","getBoundingClientRect","a","width","clientX","left","concat","match","Math","max","toFixed","round","disabled","preventDefault","bubbles","dispatchEvent","type","MutationObserver","addedNodes","observe","body","childList","subtree","map","documentElement","input","Boolean","isFunction","isEmpty","Number","isNaN","nodeType","ownerDocument","KeyboardEvent","TextTrack","kind","URL","string","startsWith","hostname","_","transitionEndEvent","createElement","WebkitTransition","MozTransition","OTransition","transition","find","repaint","delay","hidden","offsetHeight","browser","isIE","documentMode","isEdge","test","userAgent","isWebkit","isIPhone","maxTouchPoints","isIos","getDeep","path","split","reduce","extend","sources","source","shift","assign","wrap","elements","wrapper","targets","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","setAttribute","text","innerText","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","trim","className","replace","parts","charAt","class","id","toggleHidden","hide","toggleClass","force","method","classList","contains","hasClass","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","container","getElement","setFocus","tabFocus","focus","preventScroll","classNames","defaultCodecs","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","mediaType","isHTML5","media","canPlayType","textTracks","range","touch","transitions","reducedMotion","matchMedia","supportsPassiveListeners","supported","options","toggleListener","toggle","passive","capture","eventListeners","off","once","onceCallback","args","triggerEvent","detail","CustomEvent","plyr","unbindListeners","item","ready","Promise","resolve","then","silencePromise","dedupe","array","indexOf","closest","prev","curr","abs","supportsCSS","declaration","CSS","supports","standardRatios","out","x","y","validateAspectRatio","every","reduceAspectRatio","ratio","height","getDivider","w","h","divider","getAspectRatio","parse","embed","videoWidth","videoHeight","setAspectRatio","isVideo","padding","aspectRatio","paddingBottom","isVimeo","vimeo","premium","offsetWidth","parseInt","getComputedStyle","offset","fullscreen","active","transform","add","videoFixedRatio","roundAspectRatio","tolerance","closestRatio","html5","getSources","getQualityOptions","quality","forced","setup","player","speed","onChange","currentTime","paused","preload","readyState","playbackRate","src","play","load","cancelRequests","blankVideo","debug","log","format","toString","replaceAll","RegExp","toTitleCase","toUpperCase","slice","toLowerCase","getHTML","innerHTML","resources","youtube","i18n","seekTime","title","v","k","Storage","store","json","JSON","storage","stringify","removeItem","fetch","url","responseType","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","error","loadSprite","hasId","isCached","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","trunc","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","iconUrl","location","host","top","cors","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","focusable","use","setAttributeNS","createLabel","attr","join","createBadge","badge","menu","createButton","buttonType","toCamelCase","props","label","labelPressed","iconPressed","some","control","button","createRange","min","step","autocomplete","role","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","attrs","bindMenuItemShortcuts","menuItem","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","checked","flex","children","node","currentTrack","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","setProgress","val","getElementsByTagName","nodeValue","current","buffered","percent","setProperty","updateSeekTooltip","tooltips","tipElement","visible","clientRect","pageX","point","_this$config$markers","markers","_this$config$markers$","points","insertAdjacentHTML","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","setMarkers","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","checkMenu","getBadge","sort","b","sorting","setCaptionsMenu","tracks","getTracks","track","toggled","language","unshift","setSpeedMenu","minimumSpeed","maximumSpeed","values","popup","firstItem","toggleMenu","composedPath","isMenuItem","getMenuSize","tab","clone","position","opacity","removeAttribute","scrollWidth","scrollHeight","size","restore","propertyName","setDownloadUrl","download","defaultAttributes","progressContainer","inner","home","backButton","href","urls","isEmbed","inject","floor","random","seektime","addProperty","controlPressed","labels","setMediaMetadata","mediaSession","metadata","MediaMetadata","mediaMetadata","artist","album","artwork","_this$config$markers2","_this$config$markers3","containerFragment","createDocumentFragment","pointsFragment","tipVisible","toggleTip","markerElement","marker","tip","parseUrl","safe","parser","buildUrlParams","params","URLSearchParams","isYouTube","protocol","blob","createObjectURL","languages","userLanguage","trackEvents","meta","currentTrackNode","languageExists","updateCues","setLanguage","activeClass","findTrack","enableTextTrack","has","sortIsDefault","sorted","getCurrentTrack","cues","activeCues","cue","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","global","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","end","all","advertisement","qualityBadge","2160","1440","1080","720","576","480","sdk","iframe","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","hash","publisherId","tagUrl","byline","portrait","transparent","customControls","referrerPolicy","rel","showinfo","iv_load_policy","modestbranding","noCookie","providers","noop","Console","console","Fullscreen","scrollPosition","scrollX","scrollY","scrollTo","overflow","viewport","head","hasProperty","cleanupViewport","part","activeElement","first","last","shiftKey","forceFallback","native","requestFullscreen","webkitEnterFullscreen","toggleFallback","prefix","navigationUI","webkitExitFullscreen","action","cancelFullScreen","exit","enter","el","parentElement","proxy","trapFocus","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","usingNative","pre","getRootNode","fullscreenElement","shadowRoot","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","timers","controlsElement","recentTouchSeek","lastSeekTime","Date","now","migrateStyles","getPropertyValue","removeProperty","Listeners","timeStamp","focusTimer","lastKeyDown","wasKeyDown","handleKey","firstTouch","setTabFocus","setGutter","useNativeAspectRatio","maxWidth","margin","viewportWidth","viewportHeight","clientWidth","innerWidth","clientHeight","innerHeight","resized","isAudio","ended","togglePlay","proxyEvents","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","forward","toggleCaptions","rect","currentTarget","attribute","hasAttribute","done","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","deltaX","deltaY","direction","sign","increaseVolume","lastKey","altKey","ctrlKey","metaKey","repeat","increment","decreaseVolume","globalThis","self","loadjs_umd","fn","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","q","splice","executeCallbacks","depsNotFound","success","loadFile","callbackFn","numTries","isLegacyIECss","doc","async","maxTries","numRetries","beforeCallbackFn","before","pathname","pathStripped","relList","as","onbeforeload","ev","sheet","cssText","code","defaultPrevented","loadFiles","paths","numWaiting","loadjs","arg1","arg2","loadFn","returnPromise","deps","bundleIds","subscribe","isDefined","loadScript","assurePlaybackState","hasPlayed","Vimeo","frameParams","found","hashParam","sidedock","gesture","$2","thumbnail_url","Player","disableTextTrack","restorePause","setVolume","setCurrentTime","setPlaybackRate","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","fragment","firstChild","getPaused","seconds","getHost","YT","onYouTubeIframeAPIReady","getTitle","videoId","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","message","2","5","100","101","150","onPlaybackRateChange","instance","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","speeds","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","google","ima","trigger","manager","destroy","displayContainer","remove","startSafetyTimer","managerPromise","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","loader","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","requestAds","AdsRequest","adTagUrl","linearAdSlotWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","countdownTimer","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","cuePoints","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","STARTED","ALL_ADS_COMPLETED","loadAds","contentComplete","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","LOG","adError","getMessage","cancel","addCuePoints","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","initialized","zIndex","handlers","safetyTimer","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","clamp","parseVtt","vttDataString","processedList","frame","line","startTime","lineSplit","matchTimes","endTime","fitRatio","outer","PreviewThumbnails","getThumbnails","render","determineContainerAutoSizing","sortAndResolve","thumbnails","promises","getThumbnail","thumbnail","frames","urlPrefix","substring","lastIndexOf","tempImage","naturalHeight","percentage","mousePosX","thumb","_this$player$config$m","_this$player$config$m2","showImageAtCurrentTime","toggleThumbContainer","mouseDown","toggleScrubbingContainer","ceil","lastTime","scrubbing","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","findIndex","hasThumb","qualityIndex","loadedImages","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","filename","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","tagName","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","sizeSpecifiedInCSS","thumbAspectRatio","thumbHeight","setThumbContainerPos","scrubberRect","containerRect","right","clamped","multiplier","lastMouseMoveTime","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","change","crossorigin","Plyr","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","original","unload","failed","jQuery","WeakMap","search","truthy","searchParams","tabindex","inputIsValid","fauxDuration","realDuration","Infinity","hasAudio","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","updateStorage","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","setPreviewThumbnails","thumbnailSource","static","inline","factory","players","intersectionObserver","IntersectionObserver","entry","intersectionRatio","initHomepageVideos","Breakpoints","header","scrollHandler","background","initTransparentHeader"],"mappings":"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","file":"homepage.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 = 40);\n","const TIMEOUT = 5000;\n\nclass UserActivity {\n\n callback;\n\n events = [\n 'mousemove',\n 'mousedown',\n 'keydown',\n 'touchstart',\n 'touchmove',\n 'scroll',\n 'click',\n 'pointermove',\n 'pointerdown'\n ];\n\n timeoutId;\n\n constructor(callback) {\n this.callback = callback;\n this.resetListener = () => this.reset();\n }\n\n start() {\n this.reset();\n\n this.events.forEach(event => {\n document.addEventListener(event, this.resetListener, true);\n });\n }\n\n reset() {\n clearTimeout(this.timeoutId);\n this.timeoutId = setTimeout(this.callback, TIMEOUT);\n }\n\n stop() {\n clearTimeout(this.timeoutId);\n this.events.forEach(event => {\n document.removeEventListener(event, this.resetListener, true);\n });\n }\n}\n\nexport default UserActivity;\n","import UserActivity from './userActivity';\n\nconst NEWSLETTER_STORAGE_KEY = 'newsletterModalClosed';\n\nfunction newsletterModal () {\n const isClosed = localStorage.getItem(NEWSLETTER_STORAGE_KEY);\n const modal = $('#newsletterModal');\n\n if (isClosed || !modal.length) return;\n\n const idleCallback = () => {\n modal.modal('show');\n };\n\n const userActivity = new UserActivity(idleCallback);\n userActivity.start();\n\n modal.on('hidden.bs.modal', function () {\n localStorage.setItem(NEWSLETTER_STORAGE_KEY, true);\n userActivity.stop();\n });\n\n $('#newsletterModal [name=\"emailId\"]').on('focus', () => {\n $('#newsletterModal .subscribe-email, #newsletterModal .privacy-group').show();\n });\n\n $('body').on('newsletter:subscribeSuccess', () => {\n localStorage.setItem(NEWSLETTER_STORAGE_KEY, true);\n modal.modal('hide');\n });\n}\n\nexport default newsletterModal;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","typeof navigator === \"object\" && (function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define('Plyr', factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Plyr = factory());\n})(this, (function () { 'use strict';\n\n function _defineProperty$1(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n }\n\n function _classCallCheck(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n }\n function _defineProperties(e, t) {\n for (var n = 0; n < t.length; n++) {\n var r = t[n];\n r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);\n }\n }\n function _createClass(e, t, n) {\n return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e;\n }\n function _defineProperty(e, t, n) {\n return t in e ? Object.defineProperty(e, t, {\n value: n,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = n, e;\n }\n function ownKeys(e, t) {\n var n = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var r = Object.getOwnPropertySymbols(e);\n t && (r = r.filter(function (t) {\n return Object.getOwnPropertyDescriptor(e, t).enumerable;\n })), n.push.apply(n, r);\n }\n return n;\n }\n function _objectSpread2(e) {\n for (var t = 1; t < arguments.length; t++) {\n var n = null != arguments[t] ? arguments[t] : {};\n t % 2 ? ownKeys(Object(n), !0).forEach(function (t) {\n _defineProperty(e, t, n[t]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys(Object(n)).forEach(function (t) {\n Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));\n });\n }\n return e;\n }\n var defaults$1 = {\n addCSS: !0,\n thumbWidth: 15,\n watch: !0\n };\n function matches$1(e, t) {\n return function () {\n return Array.from(document.querySelectorAll(t)).includes(this);\n }.call(e, t);\n }\n function trigger(e, t) {\n if (e && t) {\n var n = new Event(t, {\n bubbles: !0\n });\n e.dispatchEvent(n);\n }\n }\n var getConstructor$1 = function (e) {\n return null != e ? e.constructor : null;\n },\n instanceOf$1 = function (e, t) {\n return !!(e && t && e instanceof t);\n },\n isNullOrUndefined$1 = function (e) {\n return null == e;\n },\n isObject$1 = function (e) {\n return getConstructor$1(e) === Object;\n },\n isNumber$1 = function (e) {\n return getConstructor$1(e) === Number && !Number.isNaN(e);\n },\n isString$1 = function (e) {\n return getConstructor$1(e) === String;\n },\n isBoolean$1 = function (e) {\n return getConstructor$1(e) === Boolean;\n },\n isFunction$1 = function (e) {\n return getConstructor$1(e) === Function;\n },\n isArray$1 = function (e) {\n return Array.isArray(e);\n },\n isNodeList$1 = function (e) {\n return instanceOf$1(e, NodeList);\n },\n isElement$1 = function (e) {\n return instanceOf$1(e, Element);\n },\n isEvent$1 = function (e) {\n return instanceOf$1(e, Event);\n },\n isEmpty$1 = function (e) {\n return isNullOrUndefined$1(e) || (isString$1(e) || isArray$1(e) || isNodeList$1(e)) && !e.length || isObject$1(e) && !Object.keys(e).length;\n },\n is$1 = {\n nullOrUndefined: isNullOrUndefined$1,\n object: isObject$1,\n number: isNumber$1,\n string: isString$1,\n boolean: isBoolean$1,\n function: isFunction$1,\n array: isArray$1,\n nodeList: isNodeList$1,\n element: isElement$1,\n event: isEvent$1,\n empty: isEmpty$1\n };\n function getDecimalPlaces(e) {\n var t = \"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;\n }\n function round(e, t) {\n if (1 > t) {\n var n = getDecimalPlaces(t);\n return parseFloat(e.toFixed(n));\n }\n return Math.round(e / t) * t;\n }\n var RangeTouch = function () {\n function e(t, n) {\n _classCallCheck(this, e), is$1.element(t) ? this.element = t : is$1.string(t) && (this.element = document.querySelector(t)), is$1.element(this.element) && is$1.empty(this.element.rangeTouch) && (this.config = _objectSpread2({}, defaults$1, {}, n), this.init());\n }\n return _createClass(e, [{\n key: \"init\",\n value: function () {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"none\", this.element.style.webKitUserSelect = \"none\", this.element.style.touchAction = \"manipulation\"), this.listeners(!0), this.element.rangeTouch = this);\n }\n }, {\n key: \"destroy\",\n value: function () {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"\", this.element.style.webKitUserSelect = \"\", this.element.style.touchAction = \"\"), this.listeners(!1), this.element.rangeTouch = null);\n }\n }, {\n key: \"listeners\",\n value: function (e) {\n var t = this,\n n = e ? \"addEventListener\" : \"removeEventListener\";\n [\"touchstart\", \"touchmove\", \"touchend\"].forEach(function (e) {\n t.element[n](e, function (e) {\n return t.set(e);\n }, !1);\n });\n }\n }, {\n key: \"get\",\n value: function (t) {\n if (!e.enabled || !is$1.event(t)) return null;\n var n,\n r = t.target,\n i = t.changedTouches[0],\n o = parseFloat(r.getAttribute(\"min\")) || 0,\n s = parseFloat(r.getAttribute(\"max\")) || 100,\n u = parseFloat(r.getAttribute(\"step\")) || 1,\n c = r.getBoundingClientRect(),\n a = 100 / c.width * (this.config.thumbWidth / 2) / 100;\n return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u);\n }\n }, {\n key: \"set\",\n value: function (t) {\n e.enabled && is$1.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, \"touchend\" === t.type ? \"change\" : \"input\"));\n }\n }], [{\n key: \"setup\",\n value: function (t) {\n var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n r = null;\n if (is$1.empty(t) || is$1.string(t) ? r = Array.from(document.querySelectorAll(is$1.string(t) ? t : 'input[type=\"range\"]')) : is$1.element(t) ? r = [t] : is$1.nodeList(t) ? r = Array.from(t) : is$1.array(t) && (r = t.filter(is$1.element)), is$1.empty(r)) return null;\n var i = _objectSpread2({}, defaults$1, {}, n);\n if (is$1.string(t) && i.watch) {\n var o = new MutationObserver(function (n) {\n Array.from(n).forEach(function (n) {\n Array.from(n.addedNodes).forEach(function (n) {\n is$1.element(n) && matches$1(n, t) && new e(n, i);\n });\n });\n });\n o.observe(document.body, {\n childList: !0,\n subtree: !0\n });\n }\n return r.map(function (t) {\n return new e(t, n);\n });\n }\n }, {\n key: \"enabled\",\n get: function () {\n return \"ontouchstart\" in document.documentElement;\n }\n }]), e;\n }();\n\n // ==========================================================================\n // Type checking utils\n // ==========================================================================\n\n const getConstructor = input => input !== null && typeof input !== 'undefined' ? input.constructor : null;\n const instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n const isNullOrUndefined = input => input === null || typeof input === 'undefined';\n const isObject = input => getConstructor(input) === Object;\n const isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\n const isString = input => getConstructor(input) === String;\n const isBoolean = input => getConstructor(input) === Boolean;\n const isFunction = input => typeof input === 'function';\n const isArray = input => Array.isArray(input);\n const isWeakMap = input => instanceOf(input, WeakMap);\n const isNodeList = input => instanceOf(input, NodeList);\n const isTextNode = input => getConstructor(input) === Text;\n const isEvent = input => instanceOf(input, Event);\n const isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\n const isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\n const isTrack = input => instanceOf(input, TextTrack) || !isNullOrUndefined(input) && isString(input.kind);\n const isPromise = input => instanceOf(input, Promise) && isFunction(input.then);\n const isElement = input => input !== null && typeof input === 'object' && input.nodeType === 1 && typeof input.style === 'object' && typeof input.ownerDocument === 'object';\n const isEmpty = input => isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;\n const isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Must be string from here\n if (!isString(input)) {\n return false;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (_) {\n return false;\n }\n };\n var is = {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty\n };\n\n // ==========================================================================\n const transitionEndEvent = (() => {\n const element = document.createElement('span');\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend'\n };\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n return is.string(type) ? events[type] : false;\n })();\n\n // Force repaint of element\n function repaint(element, delay) {\n setTimeout(() => {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true;\n\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight;\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = false;\n } catch (_) {\n // Do nothing\n }\n }, delay);\n }\n\n // ==========================================================================\n // Browser sniffing\n // Unfortunately, due to mixed support, UA sniffing is required\n // ==========================================================================\n\n const browser = {\n isIE: Boolean(window.document.documentMode),\n isEdge: /Edge/g.test(navigator.userAgent),\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/g.test(navigator.userAgent),\n isIPhone: /iPhone|iPod/gi.test(navigator.userAgent) && navigator.maxTouchPoints > 1,\n isIos: /iPad|iPhone|iPod/gi.test(navigator.userAgent) && navigator.maxTouchPoints > 1\n };\n\n // ==========================================================================\n\n // Clone nested objects\n function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n // Get a nested value in an object\n function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n }\n\n // Deep extend destination object with N more objects\n function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n const source = sources.shift();\n if (!is.object(source)) {\n return target;\n }\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, {\n [key]: {}\n });\n }\n extend(target[key], source[key]);\n } else {\n Object.assign(target, {\n [key]: source[key]\n });\n }\n });\n return extend(target, ...sources);\n }\n\n // ==========================================================================\n\n // Wrap an element\n function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets).reverse().forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n }\n\n // Set attributes\n function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes).filter(([, value]) => !is.nullOrUndefined(value)).forEach(([key, value]) => element.setAttribute(key, value));\n }\n\n // Create a DocumentFragment\n function createElement(type, attributes, text) {\n // Create a new \n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n }\n\n // Inaert an element after another\n function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) {\n return;\n }\n target.parentNode.insertBefore(element, target.nextSibling);\n }\n\n // Insert a DocumentFragment\n function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n parent.appendChild(createElement(type, attributes, text));\n }\n\n // Remove element(s)\n function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n element.parentNode.removeChild(element);\n }\n\n // Remove all child elements\n function emptyElement(element) {\n if (!is.element(element)) {\n return;\n }\n let {\n length\n } = element.childNodes;\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n }\n\n // Replace element\n function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n oldChild.parentNode.replaceChild(newChild, oldChild);\n return newChild;\n }\n\n // Get an attribute object from a string selector\n function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n const attributes = {};\n const existing = extend({}, existingAttributes);\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n // Get the parts and value\n const parts = stripped.split('=');\n const [key] = parts;\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n // Get the first character\n const start = selector.charAt(0);\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.string(existing.class)) {\n attributes.class = `${existing.class} ${className}`;\n } else {\n attributes.class = className;\n }\n break;\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n case '[':\n // Attribute selector\n attributes[key] = value;\n break;\n }\n });\n return extend(existing, attributes);\n }\n\n // Toggle hidden\n function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n let hide = hidden;\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = hide;\n }\n\n // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n element.classList[method](className);\n return element.classList.contains(className);\n }\n return false;\n }\n\n // Has class name\n function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n }\n\n // Element matches selector\n function matches(element, selector) {\n const {\n prototype\n } = Element;\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n const method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n return method.call(element, selector);\n }\n\n // Closest ancestor element matching selector (also tests element itself)\n function closest$1(element, selector) {\n const {\n prototype\n } = Element;\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n function closestElement() {\n let el = this;\n do {\n if (matches.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n }\n const method = prototype.closest || closestElement;\n return method.call(element, selector);\n }\n\n // Find all elements\n function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n }\n\n // Find a single element\n function getElement(selector) {\n return this.elements.container.querySelector(selector);\n }\n\n // Set focus and tab focus class\n function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus({\n preventScroll: true\n });\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n }\n\n // ==========================================================================\n\n // Default codecs for checking mimetype support\n const defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora'\n };\n\n // Check for feature support\n const support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n return {\n api,\n ui\n };\n },\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: (() => {\n // While iPhone's support picture-in-picture for some apps, seemingly Safari isn't one of them\n // It will throw the following error when trying to enter picture-in-picture\n // `NotSupportedError: The Picture-in-Picture mode is not supported.`\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n return false;\n })(),\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(input) {\n if (is.empty(input)) {\n return false;\n }\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (_) {\n return false;\n }\n },\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n // Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches\n };\n\n // ==========================================================================\n\n // Check for passive event listener support\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // https://www.youtube.com/watch?v=NPM6172J22g\n const supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n }\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (_) {\n // Do nothing\n }\n return supported;\n })();\n\n // Toggle event listener\n function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({\n element,\n type,\n callback,\n options\n });\n }\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n }\n\n // Bind event handler\n function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n }\n\n // Unbind event handler\n function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n }\n\n // Bind once-only event handler\n function once(element, events = '', callback, passive = true, capture = false) {\n const onceCallback = (...args) => {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n };\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n }\n\n // Trigger event\n function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: {\n ...detail,\n plyr: this\n }\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n }\n\n // Unbind all cached event listeners\n function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const {\n element,\n type,\n callback,\n options\n } = item;\n element.removeEventListener(type, callback, options);\n });\n this.eventListeners = [];\n }\n }\n\n // Run method when / if player is ready\n function ready() {\n return new Promise(resolve => this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)).then(() => {});\n }\n\n /**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\n function silencePromise(value) {\n if (is.promise(value)) {\n value.then(null, () => {});\n }\n }\n\n // ==========================================================================\n\n // Remove duplicates in an array\n function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n return array.filter((item, index) => array.indexOf(item) === index);\n }\n\n // Get the closest value in an array\n function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n return array.reduce((prev, curr) => Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev);\n }\n\n // ==========================================================================\n\n // Check support for a CSS declaration\n function supportsCSS(declaration) {\n if (!window || !window.CSS) {\n return false;\n }\n return window.CSS.supports(declaration);\n }\n\n // Standard/common aspect ratios\n const standardRatios = [[1, 1], [4, 3], [3, 4], [5, 4], [4, 5], [3, 2], [2, 3], [16, 10], [10, 16], [16, 9], [9, 16], [21, 9], [9, 21], [32, 9], [9, 32]].reduce((out, [x, y]) => ({\n ...out,\n [x / y]: [x, y]\n }), {});\n\n // Validate an aspect ratio\n function validateAspectRatio(input) {\n if (!is.array(input) && (!is.string(input) || !input.includes(':'))) {\n return false;\n }\n const ratio = is.array(input) ? input : input.split(':');\n return ratio.map(Number).every(is.number);\n }\n\n // Reduce an aspect ratio to it's lowest form\n function reduceAspectRatio(ratio) {\n if (!is.array(ratio) || !ratio.every(is.number)) {\n return null;\n }\n const [width, height] = ratio;\n const getDivider = (w, h) => h === 0 ? w : getDivider(h, w % h);\n const divider = getDivider(width, height);\n return [width / divider, height / divider];\n }\n\n // Calculate an aspect ratio\n function getAspectRatio(input) {\n const parse = ratio => validateAspectRatio(ratio) ? ratio.split(':').map(Number) : null;\n // Try provided ratio\n let ratio = parse(input);\n\n // Get from config\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n }\n\n // Get from embed\n if (ratio === null && !is.empty(this.embed) && is.array(this.embed.ratio)) {\n ({\n ratio\n } = this.embed);\n }\n\n // Get from HTML5 video\n if (ratio === null && this.isHTML5) {\n const {\n videoWidth,\n videoHeight\n } = this.media;\n ratio = [videoWidth, videoHeight];\n }\n return reduceAspectRatio(ratio);\n }\n\n // Set aspect ratio for responsive container\n function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n const {\n wrapper\n } = this.elements;\n const ratio = getAspectRatio.call(this, input);\n if (!is.array(ratio)) {\n return {};\n }\n const [x, y] = reduceAspectRatio(ratio);\n const useNative = supportsCSS(`aspect-ratio: ${x}/${y}`);\n const padding = 100 / x * y;\n if (useNative) {\n wrapper.style.aspectRatio = `${x}/${y}`;\n } else {\n wrapper.style.paddingBottom = `${padding}%`;\n }\n\n // For Vimeo we have an extra
to hide the standard controls and UI\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n const height = 100 / this.media.offsetWidth * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n const offset = (height - padding) / (height / 50);\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n } else if (this.isHTML5) {\n wrapper.classList.add(this.config.classNames.videoFixedRatio);\n }\n return {\n padding,\n ratio\n };\n }\n\n // Round an aspect ratio to closest standard ratio\n function roundAspectRatio(x, y, tolerance = 0.05) {\n const ratio = x / y;\n const closestRatio = closest(Object.keys(standardRatios), ratio);\n\n // Check match is within tolerance\n if (Math.abs(closestRatio - ratio) <= tolerance) {\n return standardRatios[closestRatio];\n }\n\n // No match\n return [x, y];\n }\n\n // Get the size of the viewport\n // https://stackoverflow.com/questions/1248081/how-to-get-the-browser-viewport-dimensions\n function getViewportSize() {\n const width = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);\n const height = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);\n return [width, height];\n }\n\n // ==========================================================================\n const html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources (if type is specified)\n return sources.filter(source => {\n const type = source.getAttribute('type');\n if (is.empty(type)) {\n return true;\n }\n return support.mime.call(this, type);\n });\n },\n // Get quality levels\n getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n }\n\n // Get sizes from elements\n return html5.getSources.call(this).map(source => Number(source.getAttribute('size'))).filter(Boolean);\n },\n setup() {\n if (!this.isHTML5) {\n return;\n }\n const player = this;\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set aspect ratio if fixed\n if (!is.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n }\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(s => s.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n if (player.quality === input) {\n return;\n }\n\n // If we're using an external handler...\n if (player.config.quality.forced && is.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n const sources = html5.getSources.call(player);\n // Get first match for requested size\n const source = sources.find(s => Number(s.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const {\n currentTime,\n paused,\n preload,\n readyState,\n playbackRate\n } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.speed = playbackRate;\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n silencePromise(player.play());\n }\n });\n\n // Load new source\n player.media.load();\n }\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input\n });\n }\n });\n },\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n }\n };\n\n // ==========================================================================\n\n // Generate a random ID\n function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n }\n\n // Format string\n function format(input, ...args) {\n if (is.empty(input)) return input;\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n }\n\n // Get percentage\n function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n return (current / max * 100).toFixed(2);\n }\n\n // Replace all occurrences of a string in a string\n const replaceAll = (input = '', find = '', replace = '') => input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n\n // Convert to title case\n const toTitleCase = (input = '') => input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.slice(1).toLowerCase());\n\n // Convert string to pascalCase\n function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n }\n\n // Convert string to pascalCase\n function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n }\n\n // Remove HTML from a string\n function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n }\n\n // Like outerHTML, but also works for DocumentFragment\n function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n }\n\n // ==========================================================================\n\n // Skip i18n for abbreviations and brand names\n const resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube'\n };\n const i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n let string = getDeep(config.i18n, key);\n if (is.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n return '';\n }\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title\n };\n Object.entries(replace).forEach(([k, v]) => {\n string = replaceAll(string, k, v);\n });\n return string;\n }\n };\n\n class Storage {\n constructor(player) {\n _defineProperty$1(this, \"get\", key => {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n const store = window.localStorage.getItem(this.key);\n if (is.empty(store)) {\n return null;\n }\n const json = JSON.parse(store);\n return is.string(key) && key.length ? json[key] : json;\n });\n _defineProperty$1(this, \"set\", object => {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n try {\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n } catch (_) {\n // Do nothing\n }\n });\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n } catch (_) {\n return false;\n }\n }\n }\n\n // ==========================================================================\n // Fetch wrapper\n // Using XHR to avoid issues with older browsers\n // ==========================================================================\n\n function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (_) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n request.send();\n } catch (error) {\n reject(error);\n }\n });\n }\n\n // ==========================================================================\n\n // Load an external SVG sprite\n function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n const exists = () => document.getElementById(id) !== null;\n const update = (container, data) => {\n // eslint-disable-next-line no-param-reassign\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url).then(result => {\n if (is.empty(result)) {\n return;\n }\n if (useStorage) {\n try {\n window.localStorage.setItem(`${prefix}-${id}`, JSON.stringify({\n content: result\n }));\n } catch (_) {\n // Do nothing\n }\n }\n update(container, result);\n }).catch(() => {});\n }\n }\n\n // ==========================================================================\n\n // Time helpers\n const getHours = value => Math.trunc(value / 60 / 60 % 60, 10);\n const getMinutes = value => Math.trunc(value / 60 % 60, 10);\n const getSeconds = value => Math.trunc(value % 60, 10);\n\n // Format time to UI friendly string\n function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(undefined, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n }\n\n // ==========================================================================\n\n // TODO: Don't export a massive object - break down and create class\n const controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const host = window.location.host ? window.location.host : window.top.location.host;\n const cors = url.host !== host || browser.isIE && !window.svg4everybody;\n return {\n url: this.config.iconUrl,\n cors\n };\n },\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume)\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration)\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`);\n }\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n return false;\n }\n },\n // Create icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n // Create \n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(icon, extend(attributes, {\n 'aria-hidden': 'true',\n focusable: 'false'\n }));\n\n // Create the to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add to \n icon.appendChild(use);\n return icon;\n },\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n const attributes = {\n ...attr,\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n };\n return createElement('span', attributes, text);\n },\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n const badge = createElement('span', {\n class: this.config.classNames.menu.value\n });\n badge.appendChild(createElement('span', {\n class: this.config.classNames.menu.badge\n }, text));\n return badge;\n },\n // Create a
`);\n }\n\n // Set position\n tipElement.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || !this.config.invertTime && this.currentTime) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n if (this.config.markers.enabled) {\n controls.setMarkers.call(this);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n if (is.element(target)) {\n target.checked = true;\n }\n },\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}×`;\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n if (!label.length) {\n return `${value}p`;\n }\n return label;\n }\n return toTitleCase(value);\n case 'captions':\n return captions.getLabel.call(this);\n default:\n return null;\n }\n },\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n if (!label.length) {\n return null;\n }\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality.sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n }).forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n // Empty the menu\n emptyElement(list);\n options.forEach(option => {\n const item = createElement('li');\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language'\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language'\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n controls.updateSetting.call(this, type, list);\n },\n // Set a list of available captions languages\n setSpeedMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Filter out invalid speeds\n this.options.speed = this.options.speed.filter(o => o >= this.minimumSpeed && o <= this.maximumSpeed);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const {\n buttons\n } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n toggleHidden(this.elements.settings.menu, !visible);\n },\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n let target = pane;\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(p => !p.hidden);\n }\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n setFocus.call(this, firstItem, tabFocus);\n },\n // Show/hide menu\n toggleMenu(input) {\n const {\n popup\n } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const {\n hidden\n } = popup;\n let show = hidden;\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.key === 'Escape') {\n show = false;\n } else if (is.event(input)) {\n // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n const target = is.function(input.composedPath) ? input.composedPath()[0] : input.target;\n const isMenuItem = popup.contains(target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || !isMenuItem && input.target !== button && show) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n return {\n width,\n height\n };\n },\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = this.elements.container.querySelector(`#plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n // Set the download URL\n setDownloadUrl() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set attribute\n button.setAttribute('href', this.download);\n },\n // Build the default HTML\n create(data) {\n const {\n bindMenuItemShortcuts,\n createButton,\n createProgress,\n createRange,\n createTime,\n setQualityMenu,\n setSpeedMenu,\n showMenuPanel\n } = controls;\n this.elements.controls = null;\n\n // Larger overlaid play button\n if (is.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container;\n\n // Default item attributes\n const defaultAttributes = {\n class: 'plyr__controls__item'\n };\n\n // Loop through controls in order\n dedupe(is.array(this.config.controls) ? this.config.controls : []).forEach(control => {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(this, 'restart', defaultAttributes));\n }\n\n // Rewind button\n if (control === 'rewind') {\n container.appendChild(createButton.call(this, 'rewind', defaultAttributes));\n }\n\n // Play/Pause button\n if (control === 'play') {\n container.appendChild(createButton.call(this, 'play', defaultAttributes));\n }\n\n // Fast forward button\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(this, 'fast-forward', defaultAttributes));\n }\n\n // Progress\n if (control === 'progress') {\n const progressContainer = createElement('div', {\n class: `${defaultAttributes.class} plyr__progress__container`\n });\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`\n }));\n\n // Buffer progress\n progress.appendChild(createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement('span', {\n class: this.config.classNames.tooltip\n }, '00:00');\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n this.elements.progress = progress;\n progressContainer.appendChild(this.elements.progress);\n container.appendChild(progressContainer);\n }\n\n // Media current time display\n if (control === 'current-time') {\n container.appendChild(createTime.call(this, 'currentTime', defaultAttributes));\n }\n\n // Media duration display\n if (control === 'duration') {\n container.appendChild(createTime.call(this, 'duration', defaultAttributes));\n }\n\n // Volume controls\n if (control === 'mute' || control === 'volume') {\n let {\n volume\n } = this.elements;\n\n // Create the volume container if needed\n if (!is.element(volume) || !container.contains(volume)) {\n volume = createElement('div', extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__volume`.trim()\n }));\n this.elements.volume = volume;\n container.appendChild(volume);\n }\n\n // Toggle mute button\n if (control === 'mute') {\n volume.appendChild(createButton.call(this, 'mute'));\n }\n\n // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n if (control === 'volume' && !browser.isIos) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume\n };\n\n // Create the volume range slider\n volume.appendChild(createRange.call(this, 'volume', extend(attributes, {\n id: `plyr-volume-${data.id}`\n })));\n }\n }\n\n // Toggle captions button\n if (control === 'captions') {\n container.appendChild(createButton.call(this, 'captions', defaultAttributes));\n }\n\n // Settings button / menu\n if (control === 'settings' && !is.empty(this.config.settings)) {\n const wrapper = createElement('div', extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__menu`.trim(),\n hidden: ''\n }));\n wrapper.appendChild(createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false\n }));\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: ''\n });\n const inner = createElement('div');\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu'\n });\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement('button', extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: ''\n }));\n\n // Bind menu shortcuts for keyboard users\n bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on.call(this, menuItem, 'click', () => {\n showMenuPanel.call(this, type, false);\n });\n const flex = createElement('span', null, i18n.get(type, this.config));\n const value = createElement('span', {\n class: this.config.classNames.menu.value\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: ''\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`\n });\n\n // Visible label\n backButton.appendChild(createElement('span', {\n 'aria-hidden': true\n }, i18n.get(type, this.config)));\n\n // Screen reader label\n backButton.appendChild(createElement('span', {\n class: this.config.classNames.hidden\n }, i18n.get('menuBack', this.config)));\n\n // Go back via keyboard\n on.call(this, pane, 'keydown', event => {\n if (event.key !== 'ArrowLeft') return;\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n showMenuPanel.call(this, 'home', true);\n }, false);\n\n // Go back via button click\n on.call(this, backButton, 'click', () => {\n showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(createElement('div', {\n role: 'menu'\n }));\n inner.appendChild(pane);\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n popup.appendChild(inner);\n wrapper.appendChild(popup);\n container.appendChild(wrapper);\n this.elements.settings.popup = popup;\n this.elements.settings.menu = wrapper;\n }\n\n // Picture in picture button\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(this, 'pip', defaultAttributes));\n }\n\n // Airplay button\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(this, 'airplay', defaultAttributes));\n }\n\n // Download button\n if (control === 'download') {\n const attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: this.download,\n target: '_blank'\n });\n\n // Set download attribute for HTML5 only\n if (this.isHTML5) {\n attributes.download = '';\n }\n const {\n download\n } = this.config.urls;\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider\n });\n }\n container.appendChild(createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(this, 'fullscreen', defaultAttributes));\n }\n });\n\n // Set available quality levels\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n setSpeedMenu.call(this);\n return container;\n },\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this)\n // TODO: Looping\n // loop: 'None',\n });\n\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n button.setAttribute('aria-pressed', 'false');\n Object.defineProperty(button, 'pressed', {\n configurable: true,\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n button.setAttribute('aria-pressed', pressed ? 'true' : 'false');\n }\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons).filter(Boolean).forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a repaint\n if (browser.isEdge) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const {\n classNames,\n selectors\n } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n // Set media metadata\n setMediaMetadata() {\n try {\n if ('mediaSession' in navigator) {\n navigator.mediaSession.metadata = new window.MediaMetadata({\n title: this.config.mediaMetadata.title,\n artist: this.config.mediaMetadata.artist,\n album: this.config.mediaMetadata.album,\n artwork: this.config.mediaMetadata.artwork\n });\n }\n } catch (_) {\n // Do nothing\n }\n },\n // Add markers\n setMarkers() {\n var _this$config$markers2, _this$config$markers3;\n if (!this.duration || this.elements.markers) return;\n\n // Get valid points\n const points = (_this$config$markers2 = this.config.markers) === null || _this$config$markers2 === void 0 ? void 0 : (_this$config$markers3 = _this$config$markers2.points) === null || _this$config$markers3 === void 0 ? void 0 : _this$config$markers3.filter(({\n time\n }) => time > 0 && time < this.duration);\n if (!(points !== null && points !== void 0 && points.length)) return;\n const containerFragment = document.createDocumentFragment();\n const pointsFragment = document.createDocumentFragment();\n let tipElement = null;\n const tipVisible = `${this.config.classNames.tooltip}--visible`;\n const toggleTip = show => toggleClass(tipElement, tipVisible, show);\n\n // Inject markers to progress container\n points.forEach(point => {\n const markerElement = createElement('span', {\n class: this.config.classNames.marker\n }, '');\n const left = `${point.time / this.duration * 100}%`;\n if (tipElement) {\n // Show on hover\n markerElement.addEventListener('mouseenter', () => {\n if (point.label) return;\n tipElement.style.left = left;\n tipElement.innerHTML = point.label;\n toggleTip(true);\n });\n\n // Hide on leave\n markerElement.addEventListener('mouseleave', () => {\n toggleTip(false);\n });\n }\n markerElement.addEventListener('click', () => {\n this.currentTime = point.time;\n });\n markerElement.style.left = left;\n pointsFragment.appendChild(markerElement);\n });\n containerFragment.appendChild(pointsFragment);\n\n // Inject a tooltip if needed\n if (!this.config.tooltips.seek) {\n tipElement = createElement('span', {\n class: this.config.classNames.tooltip\n }, '');\n containerFragment.appendChild(tipElement);\n }\n this.elements.markers = {\n points: pointsFragment,\n tip: tipElement\n };\n this.elements.progress.appendChild(containerFragment);\n }\n };\n\n // ==========================================================================\n\n /**\n * Parse a string to a URL object\n * @param {String} input - the URL to be parsed\n * @param {Boolean} safe - failsafe parsing\n */\n function parseUrl(input, safe = true) {\n let url = input;\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n try {\n return new URL(url);\n } catch (_) {\n return null;\n }\n }\n\n // Convert object to URLSearchParams\n function buildUrlParams(input) {\n const params = new URLSearchParams();\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n return params;\n }\n\n // ==========================================================================\n const captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n // Clear menu and hide\n if (is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n this.elements.captions.setAttribute('dir', 'auto');\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n fetch(src, 'blob').then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n }).catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({\n active\n } = this.config.captions);\n }\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const {\n active,\n language,\n meta,\n currentTrackNode\n } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing'\n });\n\n // Turn off native caption rendering to avoid double captions\n // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n }\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n if (this.elements) {\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n }\n\n // Update available languages in list\n if (is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n const {\n toggled\n } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({\n captions: active\n });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n\n // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n setTimeout(() => {\n if (active && this.captions.toggled) {\n this.captions.currentTrackNode.mode = 'hidden';\n }\n });\n },\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const {\n language\n } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({\n language\n });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks.filter(track => !this.isHTML5 || update || this.captions.meta.has(track)).filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(t => t.language === language);\n return !track; // Break iteration if there is a match\n });\n\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n return i18n.get('enabled', this.config);\n }\n return i18n.get('disabled', this.config);\n },\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || []).map(cue => cue.getCueAsHTML()).map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n }\n };\n\n // ==========================================================================\n // Plyr default config\n // ==========================================================================\n\n const defaults = {\n // Disable\n enabled: true,\n // Custom media title\n title: '',\n // Logging to console\n debug: false,\n // Auto play (if supported)\n autoplay: false,\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n // Default volume\n volume: 1,\n muted: false,\n // Pass a custom duration\n duration: null,\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n // Invert the current time to be a countdown\n invertTime: true,\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\n // Click video container to play/pause\n clickToPlay: true,\n // Auto hide the controls\n hideControls: true,\n // Reset to start when playback ended\n resetOnEnd: false,\n // Disable the standard context menu\n disableContextMenu: true,\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.7.3/plyr.svg',\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n // Quality default\n quality: {\n default: 576,\n // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null\n },\n // Set loops\n loop: {\n active: false\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4]\n },\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false\n },\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true\n },\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false\n },\n // Fullscreen settings\n fullscreen: {\n enabled: true,\n // Allow fullscreen?\n fallback: true,\n // Fallback using full viewport/window\n iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr'\n },\n // Default controls\n controls: ['play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress', 'current-time',\n // 'duration',\n 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay',\n // 'download',\n 'fullscreen'],\n settings: ['captions', 'quality', 'speed'],\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD'\n }\n },\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/oembed.json?url={0}'\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\n }\n },\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null\n },\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange',\n // Custom events\n 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready',\n // YouTube\n 'statechange',\n // Quality\n 'qualitychange',\n // Ads\n 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls'\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]'\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]'\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop',\n // Used later\n volume: '.plyr__volume--display'\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption'\n },\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n marker: 'plyr__progress__marker',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time'\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open'\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active'\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback'\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active'\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active'\n },\n tabFocus: 'plyr__tab-focus',\n previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n }\n },\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n hash: 'data-plyr-embed-hash'\n }\n },\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n tagUrl: ''\n },\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: ''\n },\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null,\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false\n },\n // YouTube plugin\n youtube: {\n rel: 0,\n // No related vids\n showinfo: 0,\n // Hide info\n iv_load_policy: 3,\n // Hide annotations\n modestbranding: 1,\n // Hide logos as much as possible (they still show one in the corner when paused)\n // Custom settings from Plyr\n customControls: true,\n noCookie: false // Whether to use an alternative version of YouTube without cookies\n },\n\n // Media Metadata\n mediaMetadata: {\n title: '',\n artist: '',\n album: '',\n artwork: []\n },\n // Markers\n markers: {\n enabled: false,\n points: []\n }\n };\n\n // ==========================================================================\n // Plyr states\n // ==========================================================================\n\n const pip = {\n active: 'picture-in-picture',\n inactive: 'inline'\n };\n\n // ==========================================================================\n // Plyr supported types and providers\n // ==========================================================================\n\n const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo'\n };\n const types = {\n audio: 'audio',\n video: 'video'\n };\n\n /**\n * Get provider by URL\n * @param {String} url\n */\n function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n return null;\n }\n\n // ==========================================================================\n // Console wrapper\n // ==========================================================================\n\n const noop = () => {};\n class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n }\n\n class Fullscreen {\n constructor(player) {\n _defineProperty$1(this, \"onChange\", () => {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n const target = this.target === this.player.media ? this.target : this.player.elements.container;\n // Trigger an event\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n });\n _defineProperty$1(this, \"toggleFallback\", (toggle = false) => {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content.split(',').filter(part => part.trim() !== property).join(',');\n }\n }\n\n // Toggle button and fire events\n this.onChange();\n });\n _defineProperty$1(this, \"trapFocus\", event => {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !this.active || event.key !== 'Tab') {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n const focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n const [first] = focusable;\n const last = focusable[focusable.length - 1];\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n });\n _defineProperty$1(this, \"update\", () => {\n if (this.enabled) {\n let mode;\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n this.player.debug.log(`${mode} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n });\n _defineProperty$1(this, \"enter\", () => {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.isVimeo) {\n this.player.embed.requestFullscreen();\n } else {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({\n navigationUI: 'hide'\n });\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n });\n _defineProperty$1(this, \"exit\", () => {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n silencePromise(this.player.play());\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n });\n _defineProperty$1(this, \"toggle\", () => {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n });\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = {\n x: 0,\n y: 0\n };\n\n // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n this.player.elements.fullscreen = player.config.fullscreen.container && closest$1(this.player.elements.container, player.config.fullscreen.container);\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => {\n // TODO: Filter for target??\n this.onChange();\n });\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n this.player.listeners.proxy(event, this.toggle, 'fullscreen');\n });\n\n // Tap focus when in fullscreen\n on.call(this, this.player.elements.container, 'keydown', event => this.trapFocus(event));\n\n // Update the UI\n this.update();\n\n // this.toggle = this.toggle.bind(this);\n }\n\n // Determine if native supported\n static get native() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // If we're actually using native\n get usingNative() {\n return Fullscreen.native && !this.forceFallback;\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n return false;\n });\n return value;\n }\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n const element = !this.prefix ? this.target.getRootNode().fullscreenElement : this.target.getRootNode()[`${this.prefix}${this.property}Element`];\n return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen || this.player.elements.container;\n }\n }\n\n // ==========================================================================\n // Load image avoiding xhr/fetch CORS issues\n // Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n // By default it checks if it is at least 1px, but you can add a second argument to change this\n // ==========================================================================\n\n function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n Object.assign(image, {\n onload: handler,\n onerror: handler,\n src\n });\n });\n }\n\n // ==========================================================================\n const ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Reset duration display\n controls.durationUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo);\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n\n // Media metadata\n if (this.config.mediaMetadata) {\n controls.setMediaMetadata.call(this);\n }\n },\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('data-poster', poster);\n\n // Show the poster\n this.elements.poster.removeAttribute('hidden');\n\n // Wait until ui is ready\n return ready.call(this)\n // Load image\n .then(() => loadImage(poster)).catch(error => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw error;\n }).then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n }).then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: ''\n });\n ui.togglePoster.call(this, true);\n return poster;\n });\n },\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n Object.assign(target, {\n pressed: this.playing\n });\n target.setAttribute('aria-label', i18n.get(this.playing ? 'pause' : 'play', this.config));\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const {\n controls: controlsElement\n } = this.elements;\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now();\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));\n }\n },\n // Migrate any custom properties from the media to the parent\n migrateStyles() {\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values({\n ...this.media.style\n })\n // We're only fussed about Plyr specific properties\n .filter(key => !is.empty(key) && is.string(key) && key.startsWith('--plyr')).forEach(key => {\n // Set on the container\n this.elements.container.style.setProperty(key, this.media.style.getPropertyValue(key));\n\n // Clean up from media element\n this.media.style.removeProperty(key);\n });\n\n // Remove attribute if empty\n if (is.empty(this.media.style)) {\n this.media.removeAttribute('style');\n }\n }\n };\n\n class Listeners {\n constructor(_player) {\n _defineProperty$1(this, \"firstTouch\", () => {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n });\n _defineProperty$1(this, \"setTabFocus\", event => {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n const {\n key,\n type,\n timeStamp\n } = event;\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (type === 'keydown' && key !== 'Tab') {\n return;\n }\n\n // Store reference to event timeStamp\n if (type === 'keydown') {\n this.lastKeyDown = timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n if (type !== 'focusout') {\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n });\n _defineProperty$1(this, \"global\", (toggle = true) => {\n const {\n player\n } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur focusout', this.setTabFocus, toggle, false, true);\n });\n _defineProperty$1(this, \"container\", () => {\n const {\n player\n } = this;\n const {\n config,\n elements,\n timers\n } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {\n const {\n controls: controlsElement\n } = elements;\n\n // Remove button states for fullscreen\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n let delay = 0;\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Set a gutter for Vimeo\n const setGutter = () => {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n const target = elements.wrapper;\n const {\n active\n } = player.fullscreen;\n const [videoWidth, videoHeight] = getAspectRatio.call(player);\n const useNativeAspectRatio = supportsCSS(`aspect-ratio: ${videoWidth} / ${videoHeight}`);\n\n // If not active, remove styles\n if (!active) {\n if (useNativeAspectRatio) {\n target.style.width = null;\n target.style.height = null;\n } else {\n target.style.maxWidth = null;\n target.style.margin = null;\n }\n return;\n }\n\n // Determine which dimension will overflow and constrain view\n const [viewportWidth, viewportHeight] = getViewportSize();\n const overflow = viewportWidth / viewportHeight > videoWidth / videoHeight;\n if (useNativeAspectRatio) {\n target.style.width = overflow ? 'auto' : '100%';\n target.style.height = overflow ? '100%' : 'auto';\n } else {\n target.style.maxWidth = overflow ? `${viewportHeight / videoHeight * videoWidth}px` : null;\n target.style.margin = overflow ? '0 auto' : null;\n }\n };\n\n // Handle resizing\n const resized = () => {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setGutter, 50);\n };\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', event => {\n const {\n target\n } = player.fullscreen;\n\n // Ignore events not from target\n if (target !== elements.container) {\n return;\n }\n\n // If it's not an embed and no ratio specified\n if (!player.isEmbed && is.empty(player.config.ratio)) {\n return;\n }\n\n // Set Vimeo gutter\n setGutter();\n\n // Watch for resizes\n const method = event.type === 'enterfullscreen' ? on : off;\n method.call(player, window, 'resize', resized);\n });\n });\n _defineProperty$1(this, \"media\", () => {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(player, event));\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n\n // Call pause otherwise IE11 will start playing the video again\n player.pause();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(player, event));\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(player, event));\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause or restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n if (player.ended) {\n this.proxy(event, player.restart, 'restart');\n this.proxy(event, () => {\n silencePromise(player.play());\n }, 'play');\n } else {\n this.proxy(event, () => {\n silencePromise(player.togglePlay());\n }, 'play');\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(player, elements.wrapper, 'contextmenu', event => {\n event.preventDefault();\n }, false);\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({\n speed: player.speed\n });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadUrl.call(player);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(player, player.media, proxyEvents, event => {\n let {\n detail = {}\n } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n });\n _defineProperty$1(this, \"proxy\", (event, defaultHandler, customHandlerKey) => {\n const {\n player\n } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned !== false && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n });\n _defineProperty$1(this, \"bind\", (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const {\n player\n } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n on.call(player, element, type, event => this.proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n });\n _defineProperty$1(this, \"controls\", () => {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', () => {\n silencePromise(player.togglePlay());\n }, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', () => {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n }, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', () => {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n }, 'fastForward');\n\n // Mute toggle\n this.bind(elements.buttons.mute, 'click', () => {\n player.muted = !player.muted;\n }, 'mute');\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Download\n this.bind(elements.buttons.download, 'click', () => {\n triggerEvent.call(player, player.media, 'download');\n }, 'download');\n\n // Fullscreen toggle\n this.bind(elements.buttons.fullscreen, 'click', () => {\n player.fullscreen.toggle();\n }, 'fullscreen');\n\n // Picture-in-Picture\n this.bind(elements.buttons.pip, 'click', () => {\n player.pip = 'toggle';\n }, 'pip');\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n controls.toggleMenu.call(player, event);\n }, null, false); // Can't be passive as we're preventing default\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(elements.buttons.settings, 'keyup', event => {\n if (!['Space', 'Enter'].includes(event.key)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (event.key === 'Enter') {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n }, null, false // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.key === 'Escape') {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const attribute = 'play-on-seeked';\n if (is.keyboardEvent(event) && !['ArrowLeft', 'ArrowRight'].includes(event.key)) {\n return;\n }\n\n // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n silencePromise(player.play());\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an ,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(elements.inputs.seek, inputEvent, event => {\n const seek = event.currentTarget;\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n seek.removeAttribute('seek-value');\n player.currentTime = seekTo / seek.max * player.duration;\n }, 'seek');\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(player, event));\n\n // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', event => {\n const {\n previewThumbnails\n } = player;\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave touchend click', () => {\n const {\n previewThumbnails\n } = player;\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', event => {\n const {\n previewThumbnails\n } = player;\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n this.bind(elements.progress, 'mouseup touchend', event => {\n const {\n previewThumbnails\n } = player;\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n });\n\n // Polyfill for lower fill in for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n player.config.invertTime = !player.config.invertTime;\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(elements.inputs.volume, inputEvent, event => {\n player.volume = event.target.value;\n }, 'volume');\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Also update controls.hover state for any non-player children of fullscreen element (as above)\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children).filter(c => !c.contains(elements.container)).forEach(child => {\n this.bind(child, 'mouseenter mouseleave', event => {\n if (elements.controls) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }\n });\n });\n }\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const {\n config,\n timers\n } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Mouse wheel for volume\n this.bind(elements.inputs.volume, 'wheel', event => {\n // Detect \"natural\" scroll - supported on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => inverted ? -value : value);\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const {\n volume\n } = player.media;\n if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n event.preventDefault();\n }\n }, 'volume', false);\n });\n this.player = _player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n const {\n key,\n type,\n altKey,\n ctrlKey,\n metaKey,\n shiftKey\n } = event;\n const pressed = type === 'keydown';\n const repeat = pressed && key === this.lastKey;\n\n // Bail if a modifier key is set\n if (altKey || ctrlKey || metaKey || shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the key for whatever reason\n if (!key) {\n return;\n }\n\n // Seek by increment\n const seekByIncrement = increment => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * increment;\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const {\n editable\n } = player.config.selectors;\n const {\n seek\n } = elements.inputs;\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n if (event.key === 'Space' && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keys should we prevent default\n const preventDefault = ['Space', 'ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'c', 'f', 'k', 'l', 'm'];\n\n // If the key is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(key)) {\n event.preventDefault();\n event.stopPropagation();\n }\n switch (key) {\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n if (!repeat) {\n seekByIncrement(parseInt(key, 10));\n }\n break;\n case 'Space':\n case 'k':\n if (!repeat) {\n silencePromise(player.togglePlay());\n }\n break;\n case 'ArrowUp':\n player.increaseVolume(0.1);\n break;\n case 'ArrowDown':\n player.decreaseVolume(0.1);\n break;\n case 'm':\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n case 'ArrowRight':\n player.forward();\n break;\n case 'ArrowLeft':\n player.rewind();\n break;\n case 'f':\n player.fullscreen.toggle();\n break;\n case 'c':\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n case 'l':\n player.loop = !player.loop;\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (key === 'Escape' && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n }\n\n // Store last key for next cycle\n this.lastKey = key;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n }\n\n var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n function createCommonjsModule(fn, module) {\n \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n }\n\n var loadjs_umd = createCommonjsModule(function (module, exports) {\n (function (root, factory) {\n {\n module.exports = factory();\n }\n })(commonjsGlobal, function () {\n /**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\n var devnull = function () {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n /**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\n function subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n }\n\n /**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\n function publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n }\n\n /**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\n function executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {\n success: args\n };\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n }\n\n /**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\n function loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n numTries = numTries || 0;\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped;\n\n // tag IE9+\n isLegacyIECss = 'hideFocus' in e;\n\n // use preload in IE Edge (to detect load errors)\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped;\n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n if (isLegacyIECss) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n }\n\n /**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\n function loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function (path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);else return;\n }\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i = 0; i < x; i++) loadFile(paths[i], fn, args);\n }\n\n /**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\n */\n function loadjs(paths, arg1, arg2) {\n var bundleId, args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // resolve Promise\n if (resolve) {\n executeCallbacks({\n success: resolve,\n error: reject\n }, pathsNotFound);\n }\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n }\n if (args.returnPromise) return new Promise(loadFn);else loadFn();\n }\n\n /**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\n loadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n return loadjs;\n };\n\n /**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\n loadjs.done = function done(bundleId) {\n publish(bundleId, []);\n };\n\n /**\n * Reset loadjs dependencies statuses\n */\n loadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n };\n\n /**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\n loadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n };\n\n // export\n return loadjs;\n });\n });\n\n // ==========================================================================\n function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs_umd(url, {\n success: resolve,\n error: reject\n });\n });\n }\n\n // ==========================================================================\n\n // Parse Vimeo ID from URL\n function parseId$1(url) {\n if (is.empty(url)) {\n return null;\n }\n if (is.number(Number(url))) {\n return url;\n }\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n }\n\n // Try to extract a hash for private videos from the URL\n function parseHash(url) {\n /* This regex matches a hexadecimal hash if given in any of these forms:\n * - [https://player.]vimeo.com/video/{id}/{hash}[?params]\n * - [https://player.]vimeo.com/video/{id}?h={hash}[¶ms]\n * - [https://player.]vimeo.com/video/{id}?[params]&h={hash}\n * - video/{id}/{hash}\n * If matched, the hash is available in capture group 4\n */\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+)(\\?.*&*h=|\\/)+([\\d,a-f]+)/;\n const found = url.match(regex);\n return found && found.length === 5 ? found[4] : null;\n }\n\n // Set playback state and trigger change (only on actual change)\n function assurePlaybackState$1(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n const vimeo = {\n setup() {\n const player = this;\n\n // Add embed class for responsive\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true);\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set intial ratio\n setAspectRatio.call(player);\n\n // Load the SDK if not already\n if (!is.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk).then(() => {\n vimeo.ready.call(player);\n }).catch(error => {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n const {\n premium,\n referrerPolicy,\n ...frameParams\n } = config;\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n let hash = '';\n // Get from
if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n // hash can also be set as attribute on the
\n hash = player.media.getAttribute(player.config.attributes.embed.hash);\n } else {\n hash = parseHash(source);\n }\n const hashParam = hash ? {\n h: hash\n } : {};\n\n // If the owner has a pro or premium account then we can hide controls etc\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false\n });\n }\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n // hash has to be added to iframe-URL\n ...hashParam,\n ...frameParams\n });\n const id = parseId$1(source);\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allow', ['autoplay', 'fullscreen', 'picture-in-picture', 'encrypted-media', 'accelerometer', 'gyroscope'].join('; '));\n\n // Set the referrer policy if required\n if (!is.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n }\n\n // Inject the package\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n const wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n }\n\n // Get poster image\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then(response => {\n if (is.empty(response) || !response.thumbnail_url) {\n return;\n }\n\n // Set and show poster\n ui.setPoster.call(player, response.thumbnail_url).catch(() => {});\n });\n }\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted\n });\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState$1.call(player, true);\n return player.embed.play();\n };\n player.media.pause = () => {\n assurePlaybackState$1.call(player, false);\n return player.embed.pause();\n };\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let {\n currentTime\n } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const {\n embed,\n media,\n paused,\n volume\n } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume)).catch(() => {\n // Do nothing\n });\n }\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed.setPlaybackRate(input).then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n }).catch(() => {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\n });\n }\n });\n\n // Volume\n let {\n volume\n } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n });\n\n // Muted\n let {\n muted\n } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n });\n\n // Loop\n let {\n loop\n } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n }\n });\n\n // Source\n let currentSrc;\n player.embed.getVideoUrl().then(value => {\n currentSrc = value;\n controls.setDownloadUrl.call(player);\n }).catch(error => {\n this.debug.warn(error);\n });\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n }\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n }\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const [width, height] = dimensions;\n player.embed.ratio = roundAspectRatio(width, height);\n setAspectRatio.call(this);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n player.embed.on('cuechange', ({\n cues = []\n }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState$1.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n player.embed.on('bufferstart', () => {\n triggerEvent.call(player, player.media, 'waiting');\n });\n player.embed.on('bufferend', () => {\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('play', () => {\n assurePlaybackState$1.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('pause', () => {\n assurePlaybackState$1.call(player, false);\n });\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n if (config.customControls) {\n setTimeout(() => ui.build.call(player), 0);\n }\n }\n };\n\n // ==========================================================================\n\n // Parse YouTube ID from URL\n function parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n }\n\n // Set playback state and trigger change (only on actual change)\n function assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n function getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n }\n\n // Use YouTube's default\n return undefined;\n }\n const youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n const callback = window.onYouTubeIframeAPIReady;\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n // Call global callback if set\n if (is.function(callback)) {\n callback();\n }\n youtube.ready.call(this);\n };\n\n // Load the SDK\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n // Get the media title\n getTitle(videoId) {\n const url = format(this.config.urls.youtube.api, videoId);\n fetch(url).then(data => {\n if (is.object(data)) {\n const {\n title,\n height,\n width\n } = data;\n\n // Set title\n this.config.title = title;\n ui.setTitle.call(this);\n\n // Set aspect ratio\n this.embed.ratio = roundAspectRatio(width, height);\n }\n setAspectRatio.call(this);\n }).catch(() => {\n // Set aspect ratio\n setAspectRatio.call(this);\n });\n },\n // API ready\n ready() {\n const player = this;\n const config = player.config.youtube;\n // Ignore already setup (race condition)\n const currentId = player.media && player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from
if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the