{"version":3,"file":"pillarbox-core.cjs","sources":["../src/components/player.js","../src/components/audio-track-menu-item.js","../src/pillarbox.js"],"sourcesContent":["import videojs from 'video.js';\nimport 'videojs-contrib-eme';\n\n/** @import VJSPlayer from 'video.js/dist/types/player' */\n/** @import AudioTrack from 'video.js/dist/types/tracks/audio-track' */\n/** @import TextTrack from 'video.js/dist/types/tracks/text-track' */\n/** @import {TrackSelector} from './typedef' */\n\n/**\n * @ignore\n * @type {typeof VJSPlayer}\n */\nconst vjsPlayer = videojs.getComponent('player');\n\n/**\n * This class extends the video.js Player.\n *\n * @class Player\n * @see https://docs.videojs.com/player\n */\nclass Player extends vjsPlayer {\n  constructor(tag, options, ready) {\n    /**\n     * Configuration for plugins.\n     *\n     * @see [Video.js Plugins Option]{@link https://videojs.com/guides/options/#plugins}\n     * @type {Object}\n     * @property {boolean} eme - Enable the EME (Encrypted Media Extensions) plugin.\n     */\n    options = videojs.obj.merge(options, { plugins: { eme: true }});\n    super(tag, options, ready);\n  }\n\n  /**\n   * A getter/setter for the media's audio track.\n   * Activates the audio track according to the language and kind properties.\n   * Falls back on the first audio track found if the kind property is not satisfied.\n   *\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/AudioTrack/kind\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/AudioTrack/language\n   *\n   * @param {TrackSelector} [trackSelector]\n   *\n   * @example\n   * // Get the current audio track\n   * player.audioTrack();\n   *\n   * @example\n   * // Activate an audio track based on language and kind properties\n   * player.audioTrack({language:'en', kind:'description'});\n   *\n   * @example\n   * // Activate first audio track found corresponding to language\n   * player.audioTrack({language:'fr'});\n   *\n   * @return {AudioTrack | undefined} The\n   *         currently enabled audio track. See {@link https://docs.videojs.com/audiotrack}.\n   */\n  audioTrack(trackSelector) {\n    const audioTracks = Array.from(this.player().audioTracks());\n\n    if (!trackSelector) {\n      return audioTracks.find((audioTrack) => audioTrack.enabled);\n    }\n\n    const { kind, language } = trackSelector;\n    const audioTrack =\n      audioTracks.find(\n        (audioTrack) =>\n          audioTrack.language === language && audioTrack.kind === kind\n      ) || audioTracks.find((audioTrack) => audioTrack.language === language);\n\n    if (audioTrack) {\n      audioTrack.enabled = true;\n    }\n\n    return audioTrack;\n  }\n\n  /**\n   * Calculates an array of ranges based on the `buffered()` data.\n   *\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/buffered\n   *\n   * @returns {Array<{start: number, end: number}>} An array of objects representing start and end points of buffered ranges.\n   */\n  bufferedRanges() {\n    const ranges = [];\n\n    for (let i = 0; i < this.buffered().length; i++) {\n      const start = this.buffered().start(i);\n      const end = this.buffered().end(i);\n\n      ranges.push({ start, end });\n    }\n\n    return ranges;\n  }\n\n  /**\n   * Get the percent (as a decimal) of the media that's been played.\n   * This method is not a part of the native HTML video API.\n   *\n   * Live streams with DVR are not currently supported.\n   *\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement#htmlmediaelement.played\n   *\n   * @return {number}\n   *         A decimal between 0 and 1 representing the percent\n   *         that is played 0 being 0% and 1 being 100%\n   */\n  playedPercent() {\n    if (!Number.isFinite(this.duration())) return NaN;\n\n    let timePlayed = 0;\n\n    for (let i = 0; i != this.played().length; i++) {\n      timePlayed += this.played().end(i) - this.played().start(i);\n    }\n\n    const percentPlayed = timePlayed / this.duration();\n\n    return percentPlayed;\n  }\n\n  /**\n   * Get an array of ranges based on the `played` data.\n   *\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement#htmlmediaelement.played\n   *\n   * @returns {Array<{start: number, end: number}>} An array of objects representing start and end points of played ranges.\n   */\n  playedRanges() {\n    const ranges = [];\n\n    for (let i = 0; i < this.played().length; i++) {\n      const start = this.played().start(i);\n      const end = this.played().end(i);\n\n      ranges.push({ start, end });\n    }\n\n    return ranges;\n  }\n\n  /**\n   * Calculates an array of ranges based on the `seekable()` data.\n   *\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/seekable\n   *\n   * @returns {Array<{start: number, end: number}>} An array of objects representing start and end points of seekable ranges.\n   */\n  seekableRanges() {\n    const ranges = [];\n\n    for (let i = 0; i < this.seekable().length; i++) {\n      const start = this.seekable().start(i);\n      const end = this.seekable().end(i);\n\n      ranges.push({ start, end });\n    }\n\n    return ranges;\n  }\n\n  /**\n   * A getter/setter for the media's text track.\n   * Activates the text track according to the language and kind properties.\n   * Falls back on the first text track found if the kind property is not satisfied.\n   * Disables all subtitle tracks that are `showing` if the `trackSelector` is truthy but does not satisfy any condition.\n   *\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/TextTrack/kind\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/textTrack/language\n   *\n   * @param {TrackSelector} [trackSelector]\n   *\n   * @example\n   * // Get the current text track\n   * player.textTrack();\n   *\n   * @example\n   * // Disable all text tracks has a side effect\n   * player.textTrack('off');\n   * player.textTrack({});\n   *\n   * @example\n   * // Activate an text track based on language and kind properties\n   * player.textTrack({language:'en', kind:'captions'});\n   *\n   * @example\n   * // Activate first text track found corresponding to language\n   * player.textTrack({language:'fr'});\n   *\n   * @return {TextTrack | undefined} The\n   *         currently enabled text track. See {@link https://docs.videojs.com/texttrack}.\n   */\n  textTrack(trackSelector) {\n    const textTracks = Array.from(this.player().textTracks()).filter(\n      (textTrack) => !['chapters', 'metadata'].includes(textTrack.kind)\n    );\n\n    if (!trackSelector) {\n      return textTracks.find((textTrack) => textTrack.mode === 'showing');\n    }\n\n    textTracks.forEach((textTrack) => (textTrack.mode = 'disabled'));\n\n    const { kind, language } = trackSelector;\n    const textTrack =\n      textTracks.find((textTrack) => {\n        if (textTrack.language === language && textTrack.kind === kind) {\n          textTrack.mode = 'showing';\n        }\n\n        return textTrack.mode === 'showing';\n      }) ||\n      textTracks.find((textTrack) => {\n        if (textTrack.language === language) {\n          textTrack.mode = 'showing';\n        }\n\n        return textTrack.mode === 'showing';\n      });\n\n    return textTrack;\n  }\n}\n\nvideojs.registerComponent('player', Player);\n\nexport default Player;\n","import videojs from 'video.js';\n\n/** @import MenuItem from 'video.js/dist/types/menu/menu-item' */\n\n/**\n * @ignore\n */\nconst VJSAudioTrackButton = videojs.getComponent('AudioTrackButton');\n\n/**\n * @ignore\n * @type {typeof MenuItem}\n */\nconst MenuItem = videojs.getComponent('MenuItem');\n\n/**\n * An {@link AudioTrack} {@link MenuItem}\n *\n * This is a temporary workaround.\n *\n * @extends MenuItem\n */\nclass AudioTrackMenuItem extends MenuItem {\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  constructor(player, options) {\n    const track = options.track;\n    const tracks = player.audioTracks();\n\n    // Modify options for parent MenuItem class's init.\n    options.label = track.label || track.language || 'Unknown';\n    options.selected = track.enabled;\n\n    super(player, options);\n\n    this.track = track;\n\n    this.addClass(`vjs-${track.kind}-menu-item`);\n\n    const changeHandler = (...args) => {\n      this.handleTracksChange.apply(this, args);\n    };\n\n    tracks.addEventListener('change', changeHandler);\n    this.on('dispose', () => {\n      tracks.removeEventListener('change', changeHandler);\n    });\n  }\n\n  createEl(type, props, attrs) {\n    const el = super.createEl(type, props, attrs);\n    const parentSpan = el.querySelector('.vjs-menu-item-text');\n\n    if (['main-desc', 'descriptions', 'description'].indexOf(this.options_.track.kind) >= 0) {\n      parentSpan.appendChild(videojs.dom.createEl('span', {\n        className: 'vjs-icon-placeholder'\n      }, {\n        'aria-hidden': true\n      }));\n      parentSpan.appendChild(videojs.dom.createEl('span', {\n        className: 'vjs-control-text',\n        textContent: ' ' + this.localize('Descriptions')\n      }));\n    }\n\n    return el;\n  }\n\n  /**\n   * This gets called when an `AudioTrackMenuItem is \"clicked\". See {@link ClickableComponent}\n   * for more detailed information on what a click can be.\n   *\n   * @param {Event} [event]\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n  handleClick(event) {\n    super.handleClick(event);\n\n    // the audio track list will automatically toggle other tracks\n    // off for us.\n    this.track.enabled = true;\n\n    if (!this.player_.tech_.featuresNativeAudioTracks) return;\n\n    // when native audio tracks are used, we want to make sure that other tracks are turned off\n    const tracks = this.player_.audioTracks();\n\n    for (let i = 0; i < tracks.length; i++) {\n      const track = tracks[i];\n\n      // skip the current track since we enabled it above\n      if (track === this.track) {\n        continue;\n      }\n\n      track.enabled = track === this.track;\n    }\n\n  }\n\n  /**\n   * Handle any {@link AudioTrack} change.\n   *\n   * @param {Event} [event]\n   *        The {@link AudioTrackList#change} event that caused this to run.\n   *\n   * @listens AudioTrackList#change\n   */\n  handleTracksChange() {\n    this.selected(this.track.enabled);\n  }\n}\n\n/**\n * The base class for buttons that toggle specific {@link AudioTrack} types.\n *\n * @extends VJSAudioTrackButton\n */\nclass AudioTrackButton extends VJSAudioTrackButton {\n\n\n  /**\n   * Create a menu item for each audio track\n   *\n   * @param {AudioTrackMenuItem[]} [items=[]]\n   *        An array of existing menu items to use.\n   *\n   * @return {AudioTrackMenuItem[]}\n   *         An array of menu items\n   */\n  createItems(items = []) {\n    // if there's only one audio track, there no point in showing it\n    this.hideThreshold_ = 1;\n\n    const tracks = this.player_.audioTracks();\n\n    for (let i = 0; i < tracks.length; i++) {\n      const track = tracks[i];\n\n      items.push(new AudioTrackMenuItem(this.player_, {\n        track,\n        // MenuItem is selectable\n        selectable: true,\n        // MenuItem is NOT multiSelectable (i.e. only one can be marked \"selected\" at a time)\n        multiSelectable: false\n      }));\n    }\n\n    return items;\n  }\n}\n\nvideojs.registerComponent('AudioTrackMenuItem', AudioTrackMenuItem);\nvideojs.registerComponent('AudioTrackButton', AudioTrackButton);\n","import { version } from '../package.json';\nimport videojs from 'video.js';\nimport './components/player.js';\nimport './components/audio-track-menu-item.js';\n\n/**\n * Pillarbox is an alias for the video.js namespace with additional options.\n *\n * @namespace\n * @see https://docs.videojs.com/module-videojs-videojs\n * @type {videojs}\n */\nconst pillarbox = videojs;\n\npillarbox.VERSION = {\n  pillarbox: version,\n  videojs: videojs.VERSION,\n  [videojs.VhsSourceHandler.name]: videojs.VhsSourceHandler.VERSION,\n  eme: videojs.getPlugin('eme').VERSION,\n};\n\n/**\n * Enable smooth seeking for Pillarbox.\n *\n * @see [Video.js enableSmoothSeeking Option]{@link https://videojs.com/guides/options/#enablesmoothseeking}\n * @type {boolean}\n * @default true\n */\npillarbox.options.enableSmoothSeeking = true;\n/**\n * Enable fill mode for the video player, allowing it to expand to fill the container.\n *\n * @see [Video.js Fill Option]{@link https://videojs.com/guides/layout/#fill-mode}\n * @type {boolean}\n * @default true\n */\npillarbox.options.fill = true;\n/**\n * Configuration options for HTML5 settings in Pillarbox.\n *\n * @see [VHS useForcedSubtitles Option]{@link https://github.com/videojs/http-streaming/blob/main/README.md#useforcedsubtitles}\n * @type {Object}\n * @property {Object} vhs - Configuration for the Video.js HTTP Streaming.\n * @property {boolean} useForcedSubtitles - Enables the player to display forced subtitles by default.\n * Forced subtitles are pieces of information intended for display when no other text representation\n * is selected. They are used to clarify dialogue, provide alternate languages, display texted graphics,\n * or present location/person IDs that are not otherwise covered in the dubbed/localized audio.\n */\npillarbox.options.html5 = {\n  vhs: { useForcedSubtitles: true }\n};\n/**\n * Configuration for the live tracker.\n *\n * @see [Video.js liveTracker Option]{@link https://videojs.com/guides/options/#livetrackertrackingthreshold}\n * @type {Object}\n * @property {number} trackingThreshold - A threshold that controls when the liveui should be shown.\n * @property {number} liveTolerance - An option that controls how far from the seekable end should be considered live playback.\n */\npillarbox.options.liveTracker = {\n  trackingThreshold: 120,\n  liveTolerance: 15,\n};\n/**\n * Allows the player to use the live ui that includes:\n *\n * - A progress bar for seeking within the live window\n * - A button that can be clicked to seek to the live edge with a circle indicating if you are at the live edge or not.\n *\n * @see [Video.js liveui Option]{@link https://videojs.com/guides/options/#liveui}\n * @type {boolean}\n */\npillarbox.options.liveui = true;\n/**\n * Indicates that the video is to be played \"inline\", that is within the element's playback area.\n *\n * @see [Video element playsinline attribute]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video#playsinline}\n * @type {boolean}\n */\npillarbox.options.playsinline = true;\n/**\n * Enable responsive mode, this will cause the player to customize itself based on responsive breakpoints.\n *\n * @see [Video.js Responsive Option]{@link https://videojs.com/guides/options/#responsive}\n * @type {boolean}\n */\npillarbox.options.responsive = true;\n/**\n * A placeholder for accessing trackers directly from the player.\n *\n * @type {Object}\n */\npillarbox.options.trackers = {};\n\nexport default pillarbox;\n"],"names":["vjsPlayer","videojs","getComponent","Player","constructor","tag","options","ready","obj","merge","plugins","eme","audioTrack","trackSelector","audioTracks","Array","from","player","find","enabled","kind","language","bufferedRanges","ranges","i","buffered","length","start","end","push","playedPercent","Number","isFinite","duration","NaN","timePlayed","played","percentPlayed","playedRanges","seekableRanges","seekable","textTrack","textTracks","filter","includes","mode","forEach","registerComponent","VJSAudioTrackButton","MenuItem","AudioTrackMenuItem","track","tracks","label","selected","addClass","changeHandler","args","handleTracksChange","apply","addEventListener","on","removeEventListener","createEl","type","props","attrs","el","parentSpan","querySelector","indexOf","options_","appendChild","dom","className","textContent","localize","handleClick","event","player_","tech_","featuresNativeAudioTracks","AudioTrackButton","createItems","items","hideThreshold_","selectable","multiSelectable","pillarbox","VERSION","version","VhsSourceHandler","name","getPlugin","enableSmoothSeeking","fill","html5","vhs","useForcedSubtitles","liveTracker","trackingThreshold","liveTolerance","liveui","playsinline","responsive","trackers"],"mappings":";;;;;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAMA,SAAS,GAAGC,OAAO,CAACC,YAAY,CAAC,QAAQ,CAAC;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,MAAM,SAASH,SAAS,CAAC;AAC7BI,EAAAA,WAAWA,CAACC,GAAG,EAAEC,OAAO,EAAEC,KAAK,EAAE;AAC/B;AACJ;AACA;AACA;AACA;AACA;AACA;IACID,OAAO,GAAGL,OAAO,CAACO,GAAG,CAACC,KAAK,CAACH,OAAO,EAAE;AAAEI,MAAAA,OAAO,EAAE;AAAEC,QAAAA,GAAG,EAAE;AAAK;AAAC,KAAC,CAAC;AAC/D,IAAA,KAAK,CAACN,GAAG,EAAEC,OAAO,EAAEC,KAAK,CAAC;AAC5B,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEK,UAAUA,CAACC,aAAa,EAAE;AACxB,IAAA,MAAMC,WAAW,GAAGC,KAAK,CAACC,IAAI,CAAC,IAAI,CAACC,MAAM,EAAE,CAACH,WAAW,EAAE,CAAC;IAE3D,IAAI,CAACD,aAAa,EAAE;MAClB,OAAOC,WAAW,CAACI,IAAI,CAAEN,UAAU,IAAKA,UAAU,CAACO,OAAO,CAAC;AAC7D,IAAA;IAEA,MAAM;MAAEC,IAAI;AAAEC,MAAAA;AAAS,KAAC,GAAGR,aAAa;AACxC,IAAA,MAAMD,UAAU,GACdE,WAAW,CAACI,IAAI,CACbN,UAAU,IACTA,UAAU,CAACS,QAAQ,KAAKA,QAAQ,IAAIT,UAAU,CAACQ,IAAI,KAAKA,IAC5D,CAAC,IAAIN,WAAW,CAACI,IAAI,CAAEN,UAAU,IAAKA,UAAU,CAACS,QAAQ,KAAKA,QAAQ,CAAC;AAEzE,IAAA,IAAIT,UAAU,EAAE;MACdA,UAAU,CAACO,OAAO,GAAG,IAAI;AAC3B,IAAA;AAEA,IAAA,OAAOP,UAAU;AACnB,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACEU,EAAAA,cAAcA,GAAG;IACf,MAAMC,MAAM,GAAG,EAAE;AAEjB,IAAA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,IAAI,CAACC,QAAQ,EAAE,CAACC,MAAM,EAAEF,CAAC,EAAE,EAAE;MAC/C,MAAMG,KAAK,GAAG,IAAI,CAACF,QAAQ,EAAE,CAACE,KAAK,CAACH,CAAC,CAAC;MACtC,MAAMI,GAAG,GAAG,IAAI,CAACH,QAAQ,EAAE,CAACG,GAAG,CAACJ,CAAC,CAAC;MAElCD,MAAM,CAACM,IAAI,CAAC;QAAEF,KAAK;AAAEC,QAAAA;AAAI,OAAC,CAAC;AAC7B,IAAA;AAEA,IAAA,OAAOL,MAAM;AACf,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACEO,EAAAA,aAAaA,GAAG;AACd,IAAA,IAAI,CAACC,MAAM,CAACC,QAAQ,CAAC,IAAI,CAACC,QAAQ,EAAE,CAAC,EAAE,OAAOC,GAAG;IAEjD,IAAIC,UAAU,GAAG,CAAC;AAElB,IAAA,KAAK,IAAIX,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAI,IAAI,CAACY,MAAM,EAAE,CAACV,MAAM,EAAEF,CAAC,EAAE,EAAE;MAC9CW,UAAU,IAAI,IAAI,CAACC,MAAM,EAAE,CAACR,GAAG,CAACJ,CAAC,CAAC,GAAG,IAAI,CAACY,MAAM,EAAE,CAACT,KAAK,CAACH,CAAC,CAAC;AAC7D,IAAA;IAEA,MAAMa,aAAa,GAAGF,UAAU,GAAG,IAAI,CAACF,QAAQ,EAAE;AAElD,IAAA,OAAOI,aAAa;AACtB,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACEC,EAAAA,YAAYA,GAAG;IACb,MAAMf,MAAM,GAAG,EAAE;AAEjB,IAAA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,IAAI,CAACY,MAAM,EAAE,CAACV,MAAM,EAAEF,CAAC,EAAE,EAAE;MAC7C,MAAMG,KAAK,GAAG,IAAI,CAACS,MAAM,EAAE,CAACT,KAAK,CAACH,CAAC,CAAC;MACpC,MAAMI,GAAG,GAAG,IAAI,CAACQ,MAAM,EAAE,CAACR,GAAG,CAACJ,CAAC,CAAC;MAEhCD,MAAM,CAACM,IAAI,CAAC;QAAEF,KAAK;AAAEC,QAAAA;AAAI,OAAC,CAAC;AAC7B,IAAA;AAEA,IAAA,OAAOL,MAAM;AACf,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACEgB,EAAAA,cAAcA,GAAG;IACf,MAAMhB,MAAM,GAAG,EAAE;AAEjB,IAAA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,IAAI,CAACgB,QAAQ,EAAE,CAACd,MAAM,EAAEF,CAAC,EAAE,EAAE;MAC/C,MAAMG,KAAK,GAAG,IAAI,CAACa,QAAQ,EAAE,CAACb,KAAK,CAACH,CAAC,CAAC;MACtC,MAAMI,GAAG,GAAG,IAAI,CAACY,QAAQ,EAAE,CAACZ,GAAG,CAACJ,CAAC,CAAC;MAElCD,MAAM,CAACM,IAAI,CAAC;QAAEF,KAAK;AAAEC,QAAAA;AAAI,OAAC,CAAC;AAC7B,IAAA;AAEA,IAAA,OAAOL,MAAM;AACf,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEkB,SAASA,CAAC5B,aAAa,EAAE;AACvB,IAAA,MAAM6B,UAAU,GAAG3B,KAAK,CAACC,IAAI,CAAC,IAAI,CAACC,MAAM,EAAE,CAACyB,UAAU,EAAE,CAAC,CAACC,MAAM,CAC7DF,SAAS,IAAK,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAACG,QAAQ,CAACH,SAAS,CAACrB,IAAI,CAClE,CAAC;IAED,IAAI,CAACP,aAAa,EAAE;MAClB,OAAO6B,UAAU,CAACxB,IAAI,CAAEuB,SAAS,IAAKA,SAAS,CAACI,IAAI,KAAK,SAAS,CAAC;AACrE,IAAA;IAEAH,UAAU,CAACI,OAAO,CAAEL,SAAS,IAAMA,SAAS,CAACI,IAAI,GAAG,UAAW,CAAC;IAEhE,MAAM;MAAEzB,IAAI;AAAEC,MAAAA;AAAS,KAAC,GAAGR,aAAa;AACxC,IAAA,MAAM4B,SAAS,GACbC,UAAU,CAACxB,IAAI,CAAEuB,SAAS,IAAK;MAC7B,IAAIA,SAAS,CAACpB,QAAQ,KAAKA,QAAQ,IAAIoB,SAAS,CAACrB,IAAI,KAAKA,IAAI,EAAE;QAC9DqB,SAAS,CAACI,IAAI,GAAG,SAAS;AAC5B,MAAA;AAEA,MAAA,OAAOJ,SAAS,CAACI,IAAI,KAAK,SAAS;AACrC,IAAA,CAAC,CAAC,IACFH,UAAU,CAACxB,IAAI,CAAEuB,SAAS,IAAK;AAC7B,MAAA,IAAIA,SAAS,CAACpB,QAAQ,KAAKA,QAAQ,EAAE;QACnCoB,SAAS,CAACI,IAAI,GAAG,SAAS;AAC5B,MAAA;AAEA,MAAA,OAAOJ,SAAS,CAACI,IAAI,KAAK,SAAS;AACrC,IAAA,CAAC,CAAC;AAEJ,IAAA,OAAOJ,SAAS;AAClB,EAAA;AACF;AAEAxC,OAAO,CAAC8C,iBAAiB,CAAC,QAAQ,EAAE5C,MAAM,CAAC;;AClO3C;;AAEA;AACA;AACA;AACA,MAAM6C,mBAAmB,GAAG/C,OAAO,CAACC,YAAY,CAAC,kBAAkB,CAAC;;AAEpE;AACA;AACA;AACA;AACA,MAAM+C,QAAQ,GAAGhD,OAAO,CAACC,YAAY,CAAC,UAAU,CAAC;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMgD,kBAAkB,SAASD,QAAQ,CAAC;AAExC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACE7C,EAAAA,WAAWA,CAACa,MAAM,EAAEX,OAAO,EAAE;AAC3B,IAAA,MAAM6C,KAAK,GAAG7C,OAAO,CAAC6C,KAAK;AAC3B,IAAA,MAAMC,MAAM,GAAGnC,MAAM,CAACH,WAAW,EAAE;;AAEnC;IACAR,OAAO,CAAC+C,KAAK,GAAGF,KAAK,CAACE,KAAK,IAAIF,KAAK,CAAC9B,QAAQ,IAAI,SAAS;AAC1Df,IAAAA,OAAO,CAACgD,QAAQ,GAAGH,KAAK,CAAChC,OAAO;AAEhC,IAAA,KAAK,CAACF,MAAM,EAAEX,OAAO,CAAC;IAEtB,IAAI,CAAC6C,KAAK,GAAGA,KAAK;IAElB,IAAI,CAACI,QAAQ,CAAC,CAAA,IAAA,EAAOJ,KAAK,CAAC/B,IAAI,YAAY,CAAC;AAE5C,IAAA,MAAMoC,aAAa,GAAGA,CAAC,GAAGC,IAAI,KAAK;MACjC,IAAI,CAACC,kBAAkB,CAACC,KAAK,CAAC,IAAI,EAAEF,IAAI,CAAC;IAC3C,CAAC;AAEDL,IAAAA,MAAM,CAACQ,gBAAgB,CAAC,QAAQ,EAAEJ,aAAa,CAAC;AAChD,IAAA,IAAI,CAACK,EAAE,CAAC,SAAS,EAAE,MAAM;AACvBT,MAAAA,MAAM,CAACU,mBAAmB,CAAC,QAAQ,EAAEN,aAAa,CAAC;AACrD,IAAA,CAAC,CAAC;AACJ,EAAA;AAEAO,EAAAA,QAAQA,CAACC,IAAI,EAAEC,KAAK,EAAEC,KAAK,EAAE;IAC3B,MAAMC,EAAE,GAAG,KAAK,CAACJ,QAAQ,CAACC,IAAI,EAAEC,KAAK,EAAEC,KAAK,CAAC;AAC7C,IAAA,MAAME,UAAU,GAAGD,EAAE,CAACE,aAAa,CAAC,qBAAqB,CAAC;IAE1D,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,aAAa,CAAC,CAACC,OAAO,CAAC,IAAI,CAACC,QAAQ,CAACpB,KAAK,CAAC/B,IAAI,CAAC,IAAI,CAAC,EAAE;MACvFgD,UAAU,CAACI,WAAW,CAACvE,OAAO,CAACwE,GAAG,CAACV,QAAQ,CAAC,MAAM,EAAE;AAClDW,QAAAA,SAAS,EAAE;AACb,OAAC,EAAE;AACD,QAAA,aAAa,EAAE;AACjB,OAAC,CAAC,CAAC;MACHN,UAAU,CAACI,WAAW,CAACvE,OAAO,CAACwE,GAAG,CAACV,QAAQ,CAAC,MAAM,EAAE;AAClDW,QAAAA,SAAS,EAAE,kBAAkB;AAC7BC,QAAAA,WAAW,EAAE,GAAG,GAAG,IAAI,CAACC,QAAQ,CAAC,cAAc;AACjD,OAAC,CAAC,CAAC;AACL,IAAA;AAEA,IAAA,OAAOT,EAAE;AACX,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEU,WAAWA,CAACC,KAAK,EAAE;AACjB,IAAA,KAAK,CAACD,WAAW,CAACC,KAAK,CAAC;;AAExB;AACA;AACA,IAAA,IAAI,CAAC3B,KAAK,CAAChC,OAAO,GAAG,IAAI;IAEzB,IAAI,CAAC,IAAI,CAAC4D,OAAO,CAACC,KAAK,CAACC,yBAAyB,EAAE;;AAEnD;IACA,MAAM7B,MAAM,GAAG,IAAI,CAAC2B,OAAO,CAACjE,WAAW,EAAE;AAEzC,IAAA,KAAK,IAAIU,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG4B,MAAM,CAAC1B,MAAM,EAAEF,CAAC,EAAE,EAAE;AACtC,MAAA,MAAM2B,KAAK,GAAGC,MAAM,CAAC5B,CAAC,CAAC;;AAEvB;AACA,MAAA,IAAI2B,KAAK,KAAK,IAAI,CAACA,KAAK,EAAE;AACxB,QAAA;AACF,MAAA;AAEAA,MAAAA,KAAK,CAAChC,OAAO,GAAGgC,KAAK,KAAK,IAAI,CAACA,KAAK;AACtC,IAAA;AAEF,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACEO,EAAAA,kBAAkBA,GAAG;IACnB,IAAI,CAACJ,QAAQ,CAAC,IAAI,CAACH,KAAK,CAAChC,OAAO,CAAC;AACnC,EAAA;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM+D,gBAAgB,SAASlC,mBAAmB,CAAC;AAGjD;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACEmC,EAAAA,WAAWA,CAACC,KAAK,GAAG,EAAE,EAAE;AACtB;IACA,IAAI,CAACC,cAAc,GAAG,CAAC;IAEvB,MAAMjC,MAAM,GAAG,IAAI,CAAC2B,OAAO,CAACjE,WAAW,EAAE;AAEzC,IAAA,KAAK,IAAIU,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG4B,MAAM,CAAC1B,MAAM,EAAEF,CAAC,EAAE,EAAE;AACtC,MAAA,MAAM2B,KAAK,GAAGC,MAAM,CAAC5B,CAAC,CAAC;MAEvB4D,KAAK,CAACvD,IAAI,CAAC,IAAIqB,kBAAkB,CAAC,IAAI,CAAC6B,OAAO,EAAE;QAC9C5B,KAAK;AACL;AACAmC,QAAAA,UAAU,EAAE,IAAI;AAChB;AACAC,QAAAA,eAAe,EAAE;AACnB,OAAC,CAAC,CAAC;AACL,IAAA;AAEA,IAAA,OAAOH,KAAK;AACd,EAAA;AACF;AAEAnF,OAAO,CAAC8C,iBAAiB,CAAC,oBAAoB,EAAEG,kBAAkB,CAAC;AACnEjD,OAAO,CAAC8C,iBAAiB,CAAC,kBAAkB,EAAEmC,gBAAgB,CAAC;;AChK/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMM,SAAS,GAAGvF;AAElBuF,SAAS,CAACC,OAAO,GAAG;AAClBD,EAAAA,SAAS,EAAEE,OAAO;EAClBzF,OAAO,EAAEA,OAAO,CAACwF,OAAO;EACxB,CAACxF,OAAO,CAAC0F,gBAAgB,CAACC,IAAI,GAAG3F,OAAO,CAAC0F,gBAAgB,CAACF,OAAO;AACjE9E,EAAAA,GAAG,EAAEV,OAAO,CAAC4F,SAAS,CAAC,KAAK,CAAC,CAACJ;AAChC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACAD,SAAS,CAAClF,OAAO,CAACwF,mBAAmB,GAAG,IAAI;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACAN,SAAS,CAAClF,OAAO,CAACyF,IAAI,GAAG,IAAI;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAP,SAAS,CAAClF,OAAO,CAAC0F,KAAK,GAAG;AACxBC,EAAAA,GAAG,EAAE;AAAEC,IAAAA,kBAAkB,EAAE;AAAK;AAClC,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAV,SAAS,CAAClF,OAAO,CAAC6F,WAAW,GAAG;AAC9BC,EAAAA,iBAAiB,EAAE,GAAG;AACtBC,EAAAA,aAAa,EAAE;AACjB,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAb,SAAS,CAAClF,OAAO,CAACgG,MAAM,GAAG,IAAI;AAC/B;AACA;AACA;AACA;AACA;AACA;AACAd,SAAS,CAAClF,OAAO,CAACiG,WAAW,GAAG,IAAI;AACpC;AACA;AACA;AACA;AACA;AACA;AACAf,SAAS,CAAClF,OAAO,CAACkG,UAAU,GAAG,IAAI;AACnC;AACA;AACA;AACA;AACA;AACAhB,SAAS,CAAClF,OAAO,CAACmG,QAAQ,GAAG,EAAE;;;;"}