whole_func_string: function setup() {
  	    // Requires UI support
  	    if (!this.supported.ui) {
  	      return;
  	    } // Only Vimeo and HTML5 video supported at this point
  
  
  	    if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {
  	      // Clear menu and hide
  	      if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {
  	        controls.setCaptionsMenu.call(this);
  	      }
  
  	      return;
  	    } // Inject the container
  
  
  	    if (!is$1.element(this.elements.captions)) {
  	      this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));
  	      insertAfter(this.elements.captions, this.elements.wrapper);
  	    } // Fix IE captions if CORS is used
  	    // Fetch captions and inject as blobs instead (data URIs not supported!)
  
  
  	    if (browser.isIE && window.URL) {
  	      var elements = this.media.querySelectorAll('track');
  	      Array.from(elements).forEach(function (track) {
  	        var src = track.getAttribute('src');
  	        var url = parseUrl$2(src);
  
  	        if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {
  	          fetch(src, 'blob').then(function (blob) {
  	            track.setAttribute('src', window.URL.createObjectURL(blob));
  	          }).catch(function () {
  	            removeElement(track);
  	          });
  	        }
  	      });
  	    } // Get and set initial data
  	    // The "preferred" options are not realized unless / until the wanted language has a match
  	    // * languages: Array of user's browser languages.
  	    // * language:  The language preferred by user settings or config
  	    // * active:    The state preferred by user settings or config
  	    // * toggled:   The real captions state
  
  
  	    var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];
  	    var languages = dedupe(browserLanguages.map(function (language) {
  	      return language.split('-')[0];
  	    }));
  	    var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'
  
  	    if (language === 'auto') {
  	      var _languages = _slicedToArray(languages, 1);
  
  	      language = _languages[0];
  	    }
  
  	    var active = this.storage.get('captions');
  
  	    if (!is$1.boolean(active)) {
  	      active = this.config.captions.active;
  	    }
  
  	    Object.assign(this.captions, {
  	      toggled: false,
  	      active: active,
  	      language: language,
  	      languages: languages
  	    }); // Watch changes to textTracks and update captions menu
  
  	    if (this.isHTML5) {
  	      var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';
  	      on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));
  	    } // Update available languages in list next tick (the event must not be triggered before the listeners)
  
  
  	    setTimeout(captions.update.bind(this), 0);
  	  }
func_code_string: function setup() {
  	    // Requires UI support
  	    if (!this.supported.ui) {
  	      return;
  	    } // Only Vimeo and HTML5 video supported at this point
  
  
  	    if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {
  	      // Clear menu and hide
  	      if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {
  	        controls.setCaptionsMenu.call(this);
  	      }
  
  	      return;
  	    } // Inject the container
  
  
  	    if (!is$1.element(this.elements.captions)) {
  	      this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));
  	      insertAfter(this.elements.captions, this.elements.wrapper);
  	    } // Fix IE captions if CORS is used
  	    // Fetch captions and inject as blobs instead (data URIs not supported!)
  
  
  	    if (browser.isIE && window.URL) {
  	      var elements = this.media.querySelectorAll('track');
  	      Array.from(elements).forEach(function (track) {
  	        var src = track.getAttribute('src');
  	        var url = parseUrl$2(src);
  
  	        if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {
  	          fetch(src, 'blob').then(function (blob) {
  	            track.setAttribute('src', window.URL.createObjectURL(blob));
  	          }).catch(function () {
  	            removeElement(track);
  	          });
  	        }
  	      });
  	    } // Get and set initial data
  	    // The "preferred" options are not realized unless / until the wanted language has a match
  	    // * languages: Array of user's browser languages.
  	    // * language:  The language preferred by user settings or config
  	    // * active:    The state preferred by user settings or config
  	    // * toggled:   The real captions state
  
  
  	    var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];
  	    var languages = dedupe(browserLanguages.map(function (language) {
  	      return language.split('-')[0];
  	    }));
  	    var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'
  
  	    if (language === 'auto') {
  	      var _languages = _slicedToArray(languages, 1);
  
  	      language = _languages[0];
  	    }
  
  	    var active = this.storage.get('captions');
  
  	    if (!is$1.boolean(active)) {
  	      active = this.config.captions.active;
  	    }
  
  	    Object.assign(this.captions, {
  	      toggled: false,
  	      active: active,
  	      language: language,
  	      languages: languages
  	    }); // Watch changes to textTracks and update captions menu
  
  	    if (this.isHTML5) {
  	      var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';
  	      on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));
  	    } // Update available languages in list next tick (the event must not be triggered before the listeners)
  
  
  	    setTimeout(captions.update.bind(this), 0);
  	  }
func_documentation_string: Setup captions