{"version":3,"file":"youtube-player.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/youtube-player/youtube-player-placeholder.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/youtube-player/youtube-player.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/youtube-player/youtube-module.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Component, ViewEncapsulation, computed, input} from '@angular/core';\n\n/**  Quality of the placeholder image.  */\nexport type PlaceholderImageQuality = 'high' | 'standard' | 'low';\n\nconst VIDEO_ID_REGEX = /^[a-zA-Z0-9_-]+$/;\n\n@Component({\n  selector: 'youtube-player-placeholder',\n  encapsulation: ViewEncapsulation.None,\n  template: `\n    <button type=\"button\" class=\"youtube-player-placeholder-button\" [attr.aria-label]=\"buttonLabel()\">\n      <svg\n        height=\"100%\"\n        version=\"1.1\"\n        viewBox=\"0 0 68 48\"\n        focusable=\"false\"\n        aria-hidden=\"true\">\n        <path d=\"M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z\" fill=\"#f00\"></path>\n        <path d=\"M 45,24 27,14 27,34\" fill=\"#fff\"></path>\n      </svg>\n    </button>\n  `,\n  styleUrl: 'youtube-player-placeholder.css',\n  host: {\n    'class': 'youtube-player-placeholder',\n    '[class.youtube-player-placeholder-loading]': 'isLoading()',\n    '[style.background-image]': '_backgroundImage()',\n    '[style.width.px]': 'width()',\n    '[style.height.px]': 'height()',\n  },\n})\nexport class YouTubePlayerPlaceholder {\n  /** ID of the video for which to show the placeholder. */\n  readonly videoId = input.required<string>();\n\n  /** Width of the video for which to show the placeholder. */\n  readonly width = input.required<number>();\n\n  /** Height of the video for which to show the placeholder. */\n  readonly height = input.required<number>();\n\n  /** Whether the video is currently being loaded. */\n  readonly isLoading = input.required<boolean>();\n\n  /** Accessible label for the play button. */\n  readonly buttonLabel = input.required<string>();\n\n  /** Quality of the placeholder image. */\n  readonly quality = input.required<PlaceholderImageQuality>();\n\n  /** Gets the background image showing the placeholder. */\n  protected _backgroundImage = computed(() => {\n    const quality = this.quality();\n    const videoId = this.videoId();\n\n    // Since we're interpolating the ID into a CSS value, we need\n    // to ensure that it doesn't become an XSS attack vector.\n    if (!VIDEO_ID_REGEX.test(videoId)) {\n      if (typeof ngDevMode === 'undefined' || ngDevMode) {\n        console.error(\n          `Skipping placeholder image generation for invalid YouTube video ID: ${videoId}`,\n        );\n      }\n      return null;\n    }\n\n    let url: string;\n\n    if (quality === 'low') {\n      url = `https://i.ytimg.com/vi/${videoId}/hqdefault.jpg`;\n    } else if (quality === 'high') {\n      url = `https://i.ytimg.com/vi/${videoId}/maxresdefault.jpg`;\n    } else {\n      url = `https://i.ytimg.com/vi_webp/${videoId}/sddefault.webp`;\n    }\n\n    return `url(${url})`;\n  });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// Workaround for: https://github.com/bazelbuild/rules_nodejs/issues/1265\n/// <reference types=\"youtube\" preserve=\"true\" />\n\nimport type * as YT from 'youtube';\n\nimport {\n  Component,\n  ElementRef,\n  Input,\n  NgZone,\n  OnDestroy,\n  Output,\n  ViewChild,\n  ViewEncapsulation,\n  PLATFORM_ID,\n  OnChanges,\n  SimpleChanges,\n  booleanAttribute,\n  numberAttribute,\n  InjectionToken,\n  inject,\n  CSP_NONCE,\n  ChangeDetectorRef,\n  AfterViewInit,\n  EventEmitter,\n} from '@angular/core';\nimport {isPlatformBrowser} from '@angular/common';\nimport {trustedResourceUrl} from 'safevalues';\nimport {setScriptSrc} from 'safevalues/dom';\nimport {Observable, of as observableOf, Subject, BehaviorSubject, fromEventPattern} from 'rxjs';\nimport {takeUntil, switchMap} from 'rxjs/operators';\nimport {PlaceholderImageQuality, YouTubePlayerPlaceholder} from './youtube-player-placeholder';\n\ntype YoutubeWindow = {\n  onYouTubeIframeAPIReady?: (() => void) | undefined;\n};\n\n/** Injection token used to configure the `YouTubePlayer`. */\nexport const YOUTUBE_PLAYER_CONFIG = new InjectionToken<YouTubePlayerConfig>(\n  'YOUTUBE_PLAYER_CONFIG',\n);\n\n/** Object that can be used to configure the `YouTubePlayer`. */\nexport interface YouTubePlayerConfig {\n  /** Whether to load the YouTube iframe API automatically. Defaults to `true`. */\n  loadApi?: boolean;\n\n  /**\n   * By default the player shows a placeholder image instead of loading the YouTube API which\n   * improves the initial page load performance. Use this option to disable the placeholder loading\n   * behavior globally. Defaults to `false`.\n   */\n  disablePlaceholder?: boolean;\n\n  /** Accessible label for the play button inside of the placeholder. */\n  placeholderButtonLabel?: string;\n\n  /**\n   * Quality of the displayed placeholder image. Defaults to `standard`,\n   * because not all video have a high-quality placeholder.\n   */\n  placeholderImageQuality?: PlaceholderImageQuality;\n}\n\nexport const DEFAULT_PLAYER_WIDTH = 640;\nexport const DEFAULT_PLAYER_HEIGHT = 390;\n\n/**\n * Object used to store the state of the player if the\n * user tries to interact with the API before it has been loaded.\n */\ninterface PendingPlayerState {\n  playbackState?: PlayerState.PLAYING | PlayerState.PAUSED | PlayerState.CUED;\n  playbackRate?: number;\n  volume?: number;\n  muted?: boolean;\n  seek?: {seconds: number; allowSeekAhead: boolean};\n}\n\n/** Coercion function for time values. */\nfunction coerceTime(value: number | undefined): number | undefined {\n  return value == null ? value : numberAttribute(value, 0);\n}\n\n/**\n * Equivalent of `YT.PlayerState` which we can't use, because it's meant to\n * be read off the `window` which we can't do before the API has been loaded.\n */\nenum PlayerState {\n  UNSTARTED = -1,\n  ENDED = 0,\n  PLAYING = 1,\n  PAUSED = 2,\n  BUFFERING = 3,\n  CUED = 5,\n}\n\n/**\n * Angular component that renders a YouTube player via the YouTube player\n * iframe API.\n * @see https://developers.google.com/youtube/iframe_api_reference\n */\n@Component({\n  selector: 'youtube-player',\n  encapsulation: ViewEncapsulation.None,\n  imports: [YouTubePlayerPlaceholder],\n  styleUrl: 'youtube-player.css',\n  template: `\n    @if (_shouldShowPlaceholder()) {\n      <youtube-player-placeholder\n        [videoId]=\"videoId!\"\n        [width]=\"width\"\n        [height]=\"height\"\n        [isLoading]=\"_isLoading\"\n        [buttonLabel]=\"placeholderButtonLabel\"\n        [quality]=\"placeholderImageQuality\"\n        (click)=\"_load(true)\"/>\n    }\n    <div [style.display]=\"_shouldShowPlaceholder() ? 'none' : ''\">\n      <div #youtubeContainer></div>\n    </div>\n  `,\n})\nexport class YouTubePlayer implements AfterViewInit, OnChanges, OnDestroy {\n  private _ngZone = inject(NgZone);\n  private readonly _nonce = inject(CSP_NONCE, {optional: true});\n  private readonly _changeDetectorRef = inject(ChangeDetectorRef);\n  private readonly _elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n  private _player: YT.Player | undefined;\n  private _pendingPlayer: YT.Player | undefined;\n  private _existingApiReadyCallback: (() => void) | undefined;\n  private _pendingPlayerState: PendingPlayerState | undefined;\n  private readonly _destroyed = new Subject<void>();\n  private readonly _playerChanges = new BehaviorSubject<YT.Player | undefined>(undefined);\n  protected _isLoading = false;\n  protected _hasPlaceholder = true;\n\n  /** Whether we're currently rendering inside a browser. */\n  private readonly _isBrowser: boolean;\n\n  /** YouTube Video ID to view */\n  @Input()\n  videoId: string | undefined;\n\n  /** Height of video player */\n  @Input({transform: numberAttribute})\n  get height(): number {\n    return this._height;\n  }\n  set height(height: number | undefined) {\n    this._height = height == null || isNaN(height) ? DEFAULT_PLAYER_HEIGHT : height;\n  }\n  private _height = DEFAULT_PLAYER_HEIGHT;\n\n  /** Width of video player */\n  @Input({transform: numberAttribute})\n  get width(): number {\n    return this._width;\n  }\n  set width(width: number | undefined) {\n    this._width = width == null || isNaN(width) ? DEFAULT_PLAYER_WIDTH : width;\n  }\n  private _width = DEFAULT_PLAYER_WIDTH;\n\n  /** The moment when the player is supposed to start playing */\n  @Input({transform: coerceTime})\n  startSeconds: number | undefined;\n\n  /** The moment when the player is supposed to stop playing */\n  @Input({transform: coerceTime})\n  endSeconds: number | undefined;\n\n  /** The suggested quality of the player */\n  @Input()\n  suggestedQuality: YT.SuggestedVideoQuality | undefined;\n\n  /**\n   * Extra parameters used to configure the player. See:\n   * https://developers.google.com/youtube/player_parameters.html?playerVersion=HTML5#Parameters\n   */\n  @Input()\n  playerVars: YT.PlayerVars | undefined;\n\n  /** Whether cookies inside the player have been disabled. */\n  @Input({transform: booleanAttribute})\n  disableCookies: boolean = false;\n\n  /** Whether to automatically load the YouTube iframe API. Defaults to `true`. */\n  @Input({transform: booleanAttribute})\n  loadApi: boolean;\n\n  /**\n   * By default the player shows a placeholder image instead of loading the YouTube API which\n   * improves the initial page load performance. This input allows for the behavior to be disabled.\n   */\n  @Input({transform: booleanAttribute})\n  disablePlaceholder: boolean = false;\n\n  /**\n   * Whether the iframe will attempt to load regardless of the status of the api on the\n   * page. Set this to true if you don't want the `onYouTubeIframeAPIReady` field to be\n   * set on the global window.\n   */\n  @Input({transform: booleanAttribute}) showBeforeIframeApiLoads: boolean = false;\n\n  /** Accessible label for the play button inside of the placeholder. */\n  @Input() placeholderButtonLabel: string;\n\n  /**\n   * Quality of the displayed placeholder image. Defaults to `standard`,\n   * because not all video have a high-quality placeholder.\n   */\n  @Input() placeholderImageQuality: PlaceholderImageQuality;\n\n  // Note: ready event can't go through the lazy emitter, because it\n  // happens before the `_playerChanges` stream emits the new player.\n\n  /** Emits when the player is initialized. */\n  @Output() readonly ready: Observable<YT.PlayerEvent> = new EventEmitter<YT.PlayerEvent>();\n\n  /** Emits when the state of the player has changed. */\n  @Output() readonly stateChange: Observable<YT.OnStateChangeEvent> =\n    this._getLazyEmitter<YT.OnStateChangeEvent>('onStateChange');\n\n  /** Emits when there's an error while initializing the player. */\n  @Output() readonly error: Observable<YT.OnErrorEvent> =\n    this._getLazyEmitter<YT.OnErrorEvent>('onError');\n\n  /** Emits when the underlying API of the player has changed. */\n  @Output() readonly apiChange: Observable<YT.PlayerEvent> =\n    this._getLazyEmitter<YT.PlayerEvent>('onApiChange');\n\n  /** Emits when the playback quality has changed. */\n  @Output() readonly playbackQualityChange: Observable<YT.OnPlaybackQualityChangeEvent> =\n    this._getLazyEmitter<YT.OnPlaybackQualityChangeEvent>('onPlaybackQualityChange');\n\n  /** Emits when the playback rate has changed. */\n  @Output() readonly playbackRateChange: Observable<YT.OnPlaybackRateChangeEvent> =\n    this._getLazyEmitter<YT.OnPlaybackRateChangeEvent>('onPlaybackRateChange');\n\n  /** The element that will be replaced by the iframe. */\n  @ViewChild('youtubeContainer', {static: true})\n  youtubeContainer!: ElementRef<HTMLElement>;\n\n  constructor() {\n    const platformId = inject<Object>(PLATFORM_ID);\n    const config = inject(YOUTUBE_PLAYER_CONFIG, {optional: true});\n    this.loadApi = config?.loadApi ?? true;\n    this.disablePlaceholder = !!config?.disablePlaceholder;\n    this.placeholderButtonLabel = config?.placeholderButtonLabel || 'Play video';\n    this.placeholderImageQuality = config?.placeholderImageQuality || 'standard';\n    this._isBrowser = isPlatformBrowser(platformId);\n  }\n\n  ngAfterViewInit() {\n    this._conditionallyLoad();\n  }\n\n  ngOnChanges(changes: SimpleChanges<this>): void {\n    if (this._shouldRecreatePlayer(changes)) {\n      this._conditionallyLoad();\n    } else if (this._player) {\n      if (changes['width'] || changes['height']) {\n        this._setSize();\n      }\n\n      if (changes['suggestedQuality']) {\n        this._setQuality();\n      }\n\n      if (changes['startSeconds'] || changes['endSeconds'] || changes['suggestedQuality']) {\n        this._cuePlayer();\n      }\n    }\n  }\n\n  ngOnDestroy() {\n    this._pendingPlayer?.destroy();\n\n    if (this._player) {\n      this._player.destroy();\n      (window as YoutubeWindow).onYouTubeIframeAPIReady = this._existingApiReadyCallback;\n    }\n\n    this._playerChanges.complete();\n    this._destroyed.next();\n    this._destroyed.complete();\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#playVideo */\n  playVideo() {\n    if (this._player) {\n      this._player.playVideo();\n    } else {\n      this._getPendingState().playbackState = PlayerState.PLAYING;\n      this._load(true);\n    }\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#pauseVideo */\n  pauseVideo() {\n    if (this._player) {\n      this._player.pauseVideo();\n    } else {\n      this._getPendingState().playbackState = PlayerState.PAUSED;\n    }\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#stopVideo */\n  stopVideo() {\n    if (this._player) {\n      this._player.stopVideo();\n    } else {\n      // It seems like YouTube sets the player to CUED when it's stopped.\n      this._getPendingState().playbackState = PlayerState.CUED;\n    }\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#seekTo */\n  seekTo(seconds: number, allowSeekAhead: boolean) {\n    if (this._player) {\n      this._player.seekTo(seconds, allowSeekAhead);\n    } else {\n      this._getPendingState().seek = {seconds, allowSeekAhead};\n    }\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#mute */\n  mute() {\n    if (this._player) {\n      this._player.mute();\n    } else {\n      this._getPendingState().muted = true;\n    }\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#unMute */\n  unMute() {\n    if (this._player) {\n      this._player.unMute();\n    } else {\n      this._getPendingState().muted = false;\n    }\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#isMuted */\n  isMuted(): boolean {\n    if (this._player) {\n      return this._player.isMuted();\n    }\n\n    if (this._pendingPlayerState) {\n      return !!this._pendingPlayerState.muted;\n    }\n\n    return false;\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#setVolume */\n  setVolume(volume: number) {\n    if (this._player) {\n      this._player.setVolume(volume);\n    } else {\n      this._getPendingState().volume = volume;\n    }\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#getVolume */\n  getVolume(): number {\n    if (this._player) {\n      return this._player.getVolume();\n    }\n\n    if (this._pendingPlayerState && this._pendingPlayerState.volume != null) {\n      return this._pendingPlayerState.volume;\n    }\n\n    return 0;\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate */\n  setPlaybackRate(playbackRate: number) {\n    if (this._player) {\n      return this._player.setPlaybackRate(playbackRate);\n    } else {\n      this._getPendingState().playbackRate = playbackRate;\n    }\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackRate */\n  getPlaybackRate(): number {\n    if (this._player) {\n      return this._player.getPlaybackRate();\n    }\n\n    if (this._pendingPlayerState && this._pendingPlayerState.playbackRate != null) {\n      return this._pendingPlayerState.playbackRate;\n    }\n\n    return 0;\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#getAvailablePlaybackRates */\n  getAvailablePlaybackRates(): number[] {\n    return this._player ? this._player.getAvailablePlaybackRates() : [];\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#getVideoLoadedFraction */\n  getVideoLoadedFraction(): number {\n    return this._player ? this._player.getVideoLoadedFraction() : 0;\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#getPlayerState */\n  getPlayerState(): YT.PlayerState | undefined {\n    if (!this._isBrowser || !window.YT) {\n      return undefined;\n    }\n\n    if (this._player) {\n      return this._player.getPlayerState();\n    }\n\n    if (this._pendingPlayerState && this._pendingPlayerState.playbackState != null) {\n      return this._pendingPlayerState.playbackState;\n    }\n\n    return PlayerState.UNSTARTED;\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#getCurrentTime */\n  getCurrentTime(): number {\n    if (this._player) {\n      return this._player.getCurrentTime();\n    }\n\n    if (this._pendingPlayerState && this._pendingPlayerState.seek) {\n      return this._pendingPlayerState.seek.seconds;\n    }\n\n    return 0;\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackQuality */\n  getPlaybackQuality(): YT.SuggestedVideoQuality {\n    return this._player ? this._player.getPlaybackQuality() : 'default';\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#getAvailableQualityLevels */\n  getAvailableQualityLevels(): YT.SuggestedVideoQuality[] {\n    return this._player ? this._player.getAvailableQualityLevels() : [];\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#getDuration */\n  getDuration(): number {\n    return this._player ? this._player.getDuration() : 0;\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#getVideoUrl */\n  getVideoUrl(): string {\n    return this._player ? this._player.getVideoUrl() : '';\n  }\n\n  /** See https://developers.google.com/youtube/iframe_api_reference#getVideoEmbedCode */\n  getVideoEmbedCode(): string {\n    return this._player ? this._player.getVideoEmbedCode() : '';\n  }\n\n  /**\n   * Attempts to put the player into fullscreen mode, depending on browser support.\n   * @param options Options controlling how the element behaves in fullscreen mode.\n   */\n  async requestFullscreen(options?: FullscreenOptions): Promise<void> {\n    // Note that we do this on the host, rather than the iframe, because it allows us to handle the\n    // placeholder in fullscreen mode. Null check the method since it's not supported everywhere.\n    const element = this._elementRef.nativeElement;\n    return element.requestFullscreen\n      ? element.requestFullscreen(options)\n      : Promise.reject(new Error('Fullscreen API not supported by browser.'));\n  }\n\n  /**\n   * Loads the YouTube API and sets up the player.\n   * @param playVideo Whether to automatically play the video once the player is loaded.\n   */\n  protected _load(playVideo: boolean) {\n    // Don't do anything if we're not in a browser environment.\n    if (!this._isBrowser) {\n      return;\n    }\n\n    // Might be clobbered by something like `<form id=\"YT\"><input name=\"Player\"></form>`.\n    if (\n      typeof window.YT !== 'object' ||\n      !window.YT ||\n      !window.YT.Player ||\n      typeof window.YT.Player !== 'function'\n    ) {\n      if (this.loadApi) {\n        this._isLoading = true;\n        loadApi(this._nonce);\n      } else if (this.showBeforeIframeApiLoads && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n        throw new Error(\n          'Namespace YT not found, cannot construct embedded youtube player. ' +\n            'Please install the YouTube Player API Reference for iframe Embeds: ' +\n            'https://developers.google.com/youtube/iframe_api_reference',\n        );\n      }\n\n      const existingCallback = (window as YoutubeWindow).onYouTubeIframeAPIReady;\n\n      // The callback might be clobbered by an element with an ID of `onYouTubeIframeAPIReady`.\n      if (typeof existingCallback === 'function') {\n        this._existingApiReadyCallback = (window as YoutubeWindow).onYouTubeIframeAPIReady;\n      }\n\n      (window as YoutubeWindow).onYouTubeIframeAPIReady = () => {\n        this._existingApiReadyCallback?.();\n        this._ngZone.run(() => this._createPlayer(playVideo));\n      };\n    } else {\n      this._createPlayer(playVideo);\n    }\n  }\n\n  /** Loads the player depending on the internal state of the component. */\n  private _conditionallyLoad() {\n    // If the placeholder isn't shown anymore, we have to trigger a load.\n    if (!this._shouldShowPlaceholder()) {\n      this._load(false);\n    } else if (this.playerVars?.autoplay === 1) {\n      // If it's an autoplaying video, we have to hide the placeholder and start playing.\n      this._load(true);\n    }\n  }\n\n  /** Whether to show the placeholder element. */\n  protected _shouldShowPlaceholder(): boolean {\n    if (this.disablePlaceholder) {\n      return false;\n    }\n\n    // Since we don't load the API on the server, we show the placeholder permanently.\n    if (!this._isBrowser) {\n      return true;\n    }\n\n    return this._hasPlaceholder && !!this.videoId && !this._player;\n  }\n\n  /** Gets an object that should be used to store the temporary API state. */\n  private _getPendingState(): PendingPlayerState {\n    if (!this._pendingPlayerState) {\n      this._pendingPlayerState = {};\n    }\n\n    return this._pendingPlayerState;\n  }\n\n  /**\n   * Determines whether a change in the component state\n   * requires the YouTube player to be recreated.\n   */\n  private _shouldRecreatePlayer(changes: SimpleChanges): boolean {\n    const change =\n      changes['videoId'] ||\n      changes['playerVars'] ||\n      changes['disableCookies'] ||\n      changes['disablePlaceholder'];\n    return !!change && !change.isFirstChange();\n  }\n\n  /**\n   * Creates a new YouTube player and destroys the existing one.\n   * @param playVideo Whether to play the video once it loads.\n   */\n  private _createPlayer(playVideo: boolean) {\n    this._player?.destroy();\n    this._pendingPlayer?.destroy();\n\n    // A player can't be created if the API isn't loaded,\n    // or there isn't a video or playlist to be played.\n    if (\n      typeof (window as Window & {YT?: typeof YT}).YT === 'undefined' ||\n      (!this.videoId && !this.playerVars?.list)\n    ) {\n      return;\n    }\n\n    // Important! We need to create the Player object outside of the `NgZone`, because it kicks\n    // off a 250ms setInterval which will continually trigger change detection if we don't.\n    const params: YT.PlayerOptions = {\n      host: this.disableCookies ? 'https://www.youtube-nocookie.com' : undefined,\n      width: this.width,\n      height: this.height,\n      // Calling `playVideo` on load doesn't appear to actually play\n      // the video so we need to trigger it through `playerVars` instead.\n      playerVars: playVideo ? {...(this.playerVars || {}), autoplay: 1} : this.playerVars,\n    };\n    // We only want to injecct a videoId if one is provided, otherwise loading a playlist via\n    // playerVars.list, the missing videoId will create a null value in the youtube iframe url\n    // and that can trigger a JS error `Invalid video id` in widget api.\n    if (this.videoId) {\n      params.videoId = this.videoId;\n    }\n    const player = this._ngZone.runOutsideAngular(\n      () =>\n        new (window as Window & {YT?: typeof YT}).YT!.Player(\n          this.youtubeContainer.nativeElement,\n          params,\n        ),\n    );\n\n    const whenReady = (event: YT.PlayerEvent) => {\n      // Only assign the player once it's ready, otherwise YouTube doesn't expose some APIs.\n      this._ngZone.run(() => {\n        this._isLoading = false;\n        this._hasPlaceholder = false;\n        this._player = player;\n        this._pendingPlayer = undefined;\n        player.removeEventListener('onReady', whenReady);\n        this._playerChanges.next(player);\n        (this.ready as EventEmitter<YT.PlayerEvent>).emit(event);\n        this._setSize();\n        this._setQuality();\n\n        if (this._pendingPlayerState) {\n          this._applyPendingPlayerState(player, this._pendingPlayerState);\n          this._pendingPlayerState = undefined;\n        }\n\n        // Only cue the player when it either hasn't started yet or it's cued,\n        // otherwise cuing it can interrupt a player with autoplay enabled.\n        const state = player.getPlayerState();\n        if (state === PlayerState.UNSTARTED || state === PlayerState.CUED || state == null) {\n          this._cuePlayer();\n        } else if (\n          (playVideo || this.playerVars?.autoplay === 1) &&\n          this.startSeconds &&\n          this.startSeconds > 0\n        ) {\n          // We have to use `seekTo` when `startSeconds` are specified with a playing video\n          // (either from user interaction or autoplay). The \"proper\" way to do it would be to\n          // either go through `cueVideoById` or `playerVars.start`, but at the time of writing\n          // both end up resetting the video to the state as if the user hasn't interacted with it.\n          player.seekTo(this.startSeconds, true);\n        }\n\n        this._changeDetectorRef.markForCheck();\n      });\n    };\n\n    this._pendingPlayer = player;\n    player.addEventListener('onReady', whenReady);\n  }\n\n  /** Applies any state that changed before the player was initialized. */\n  private _applyPendingPlayerState(player: YT.Player, pendingState: PendingPlayerState): void {\n    const {playbackState, playbackRate, volume, muted, seek} = pendingState;\n\n    switch (playbackState) {\n      case PlayerState.PLAYING:\n        player.playVideo();\n        break;\n      case PlayerState.PAUSED:\n        player.pauseVideo();\n        break;\n      case PlayerState.CUED:\n        player.stopVideo();\n        break;\n    }\n\n    if (playbackRate != null) {\n      player.setPlaybackRate(playbackRate);\n    }\n\n    if (volume != null) {\n      player.setVolume(volume);\n    }\n\n    if (muted != null) {\n      muted ? player.mute() : player.unMute();\n    }\n\n    if (seek != null) {\n      player.seekTo(seek.seconds, seek.allowSeekAhead);\n    }\n  }\n\n  /** Cues the player based on the current component state. */\n  private _cuePlayer() {\n    if (this._player && this.videoId) {\n      this._player.cueVideoById({\n        videoId: this.videoId,\n        startSeconds: this.startSeconds,\n        endSeconds: this.endSeconds,\n        suggestedQuality: this.suggestedQuality,\n      });\n    }\n  }\n\n  /** Sets the player's size based on the current input values. */\n  private _setSize() {\n    this._player?.setSize(this.width, this.height);\n  }\n\n  /** Sets the player's quality based on the current input values. */\n  private _setQuality() {\n    if (this._player && this.suggestedQuality) {\n      this._player.setPlaybackQuality(this.suggestedQuality);\n    }\n  }\n\n  /** Gets an observable that adds an event listener to the player when a user subscribes to it. */\n  private _getLazyEmitter<T extends YT.PlayerEvent>(name: keyof YT.Events): Observable<T> {\n    // Start with the stream of players. This way the events will be transferred\n    // over to the new player if it gets swapped out under-the-hood.\n    return this._playerChanges.pipe(\n      // Switch to the bound event. `switchMap` ensures that the old event is removed when the\n      // player is changed. If there's no player, return an observable that never emits.\n      switchMap(player => {\n        return player\n          ? fromEventPattern<T>(\n              listener => {\n                player.addEventListener(name, listener);\n              },\n              listener => {\n                // The API seems to throw when we try to unbind from a destroyed player and it\n                // doesn'texpose whether the player has been destroyed so we have to wrap it in a\n                // try/catch to prevent the entire stream from erroring out.\n                try {\n                  player?.removeEventListener?.(name, listener);\n                } catch {}\n              },\n            )\n          : observableOf<T>();\n      }),\n      // By default we run all the API interactions outside the zone\n      // so we have to bring the events back in manually when they emit.\n      source =>\n        new Observable<T>(observer =>\n          source.subscribe({\n            next: value => this._ngZone.run(() => observer.next(value)),\n            error: error => observer.error(error),\n            complete: () => observer.complete(),\n          }),\n        ),\n      // Ensures that everything is cleared out on destroy.\n      takeUntil(this._destroyed),\n    );\n  }\n}\n\nlet apiLoaded = false;\n\n/** Loads the YouTube API from a specified URL only once. */\nfunction loadApi(nonce: string | null): void {\n  if (apiLoaded) {\n    return;\n  }\n\n  // We can use `document` directly here, because this logic doesn't run outside the browser.\n  const url = trustedResourceUrl`https://www.youtube.com/iframe_api`;\n  const script = document.createElement('script');\n  const callback = (event: Event) => {\n    script.removeEventListener('load', callback);\n    script.removeEventListener('error', callback);\n\n    if (event.type === 'error') {\n      apiLoaded = false;\n\n      if (typeof ngDevMode === 'undefined' || ngDevMode) {\n        console.error(`Failed to load YouTube API from ${url}`);\n      }\n    }\n  };\n  script.addEventListener('load', callback);\n  script.addEventListener('error', callback);\n  setScriptSrc(script, url);\n  script.async = true;\n\n  if (nonce) {\n    script.setAttribute('nonce', nonce);\n  }\n\n  // Set this immediately to true so we don't start loading another script\n  // while this one is pending. If loading fails, we'll flip it back to false.\n  apiLoaded = true;\n  document.body.appendChild(script);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {YouTubePlayer} from './youtube-player';\n\n@NgModule({\n  imports: [YouTubePlayer],\n  exports: [YouTubePlayer],\n})\nexport class YouTubePlayerModule {}\n"],"names":["VIDEO_ID_REGEX","YouTubePlayerPlaceholder","videoId","input","required","width","height","isLoading","buttonLabel","quality","_backgroundImage","computed","test","ngDevMode","console","error","url","deps","target","i0","ɵɵFactoryTarget","Component","ɵcmp","ɵɵngDeclareComponent","minVersion","version","type","isStandalone","selector","inputs","classPropertyName","publicName","isSignal","isRequired","transformFunction","host","properties","classAttribute","ngImport","template","isInline","styles","encapsulation","ViewEncapsulation","None","decorators","args","YOUTUBE_PLAYER_CONFIG","InjectionToken","DEFAULT_PLAYER_WIDTH","DEFAULT_PLAYER_HEIGHT","coerceTime","value","numberAttribute","PlayerState","YouTubePlayer","_ngZone","inject","NgZone","_nonce","CSP_NONCE","optional","_changeDetectorRef","ChangeDetectorRef","_elementRef","ElementRef","_player","_pendingPlayer","_existingApiReadyCallback","_pendingPlayerState","_destroyed","Subject","_playerChanges","BehaviorSubject","undefined","_isLoading","_hasPlaceholder","_isBrowser","_height","isNaN","_width","startSeconds","endSeconds","suggestedQuality","playerVars","disableCookies","loadApi","disablePlaceholder","showBeforeIframeApiLoads","placeholderButtonLabel","placeholderImageQuality","ready","EventEmitter","stateChange","_getLazyEmitter","apiChange","playbackQualityChange","playbackRateChange","youtubeContainer","constructor","platformId","PLATFORM_ID","config","isPlatformBrowser","ngAfterViewInit","_conditionallyLoad","ngOnChanges","changes","_shouldRecreatePlayer","_setSize","_setQuality","_cuePlayer","ngOnDestroy","destroy","window","onYouTubeIframeAPIReady","complete","next","playVideo","_getPendingState","playbackState","PLAYING","_load","pauseVideo","PAUSED","stopVideo","CUED","seekTo","seconds","allowSeekAhead","seek","mute","muted","unMute","isMuted","setVolume","volume","getVolume","setPlaybackRate","playbackRate","getPlaybackRate","getAvailablePlaybackRates","getVideoLoadedFraction","getPlayerState","YT","UNSTARTED","getCurrentTime","getPlaybackQuality","getAvailableQualityLevels","getDuration","getVideoUrl","getVideoEmbedCode","requestFullscreen","options","element","nativeElement","Promise","reject","Error","Player","existingCallback","run","_createPlayer","_shouldShowPlaceholder","autoplay","change","isFirstChange","list","params","player","runOutsideAngular","whenReady","event","removeEventListener","emit","_applyPendingPlayerState","state","markForCheck","addEventListener","pendingState","cueVideoById","setSize","setPlaybackQuality","name","pipe","switchMap","fromEventPattern","listener","observableOf","source","Observable","observer","subscribe","takeUntil","booleanAttribute","outputs","viewQueries","propertyName","first","predicate","descendants","static","usesOnChanges","dependencies","kind","Input","transform","Output","ViewChild","apiLoaded","nonce","trustedResourceUrl","script","document","createElement","callback","setScriptSrc","async","setAttribute","body","appendChild","YouTubePlayerModule","NgModule","imports","exports"],"mappings":";;;;;;;;AAaA,MAAMA,cAAc,GAAG,kBAAkB;MA2B5BC,wBAAwB,CAAA;EAE1BC,OAAO,GAAGC,KAAK,CAACC,QAAQ;;WAAU;EAGlCC,KAAK,GAAGF,KAAK,CAACC,QAAQ;;WAAU;EAGhCE,MAAM,GAAGH,KAAK,CAACC,QAAQ;;WAAU;EAGjCG,SAAS,GAAGJ,KAAK,CAACC,QAAQ;;WAAW;EAGrCI,WAAW,GAAGL,KAAK,CAACC,QAAQ;;WAAU;EAGtCK,OAAO,GAAGN,KAAK,CAACC,QAAQ;;WAA2B;EAGlDM,gBAAgB,GAAGC,QAAQ,CAAC,MAAK;AACzC,IAAA,MAAMF,OAAO,GAAG,IAAI,CAACA,OAAO,EAAE;AAC9B,IAAA,MAAMP,OAAO,GAAG,IAAI,CAACA,OAAO,EAAE;AAI9B,IAAA,IAAI,CAACF,cAAc,CAACY,IAAI,CAACV,OAAO,CAAC,EAAE;AACjC,MAAA,IAAI,OAAOW,SAAS,KAAK,WAAW,IAAIA,SAAS,EAAE;AACjDC,QAAAA,OAAO,CAACC,KAAK,CACX,CAAA,oEAAA,EAAuEb,OAAO,EAAE,CACjF;AACH,MAAA;AACA,MAAA,OAAO,IAAI;AACb,IAAA;AAEA,IAAA,IAAIc,GAAW;IAEf,IAAIP,OAAO,KAAK,KAAK,EAAE;MACrBO,GAAG,GAAG,CAAA,uBAAA,EAA0Bd,OAAO,CAAA,cAAA,CAAgB;AACzD,IAAA,CAAA,MAAO,IAAIO,OAAO,KAAK,MAAM,EAAE;MAC7BO,GAAG,GAAG,CAAA,uBAAA,EAA0Bd,OAAO,CAAA,kBAAA,CAAoB;AAC7D,IAAA,CAAA,MAAO;MACLc,GAAG,GAAG,CAAA,4BAAA,EAA+Bd,OAAO,CAAA,eAAA,CAAiB;AAC/D,IAAA;IAEA,OAAO,CAAA,IAAA,EAAOc,GAAG,CAAA,CAAA,CAAG;AACtB,EAAA,CAAC;;WAAC;;;;;UA9CSf,wBAAwB;AAAAgB,IAAAA,IAAA,EAAA,EAAA;AAAAC,IAAAA,MAAA,EAAAC,EAAA,CAAAC,eAAA,CAAAC;AAAA,GAAA,CAAA;AAAxB,EAAA,OAAAC,IAAA,GAAAH,EAAA,CAAAI,oBAAA,CAAA;AAAAC,IAAAA,UAAA,EAAA,QAAA;AAAAC,IAAAA,OAAA,EAAA,QAAA;AAAAC,IAAAA,IAAA,EAAAzB,wBAAwB;AAAA0B,IAAAA,YAAA,EAAA,IAAA;AAAAC,IAAAA,QAAA,EAAA,4BAAA;AAAAC,IAAAA,MAAA,EAAA;AAAA3B,MAAAA,OAAA,EAAA;AAAA4B,QAAAA,iBAAA,EAAA,SAAA;AAAAC,QAAAA,UAAA,EAAA,SAAA;AAAAC,QAAAA,QAAA,EAAA,IAAA;AAAAC,QAAAA,UAAA,EAAA,IAAA;AAAAC,QAAAA,iBAAA,EAAA;OAAA;AAAA7B,MAAAA,KAAA,EAAA;AAAAyB,QAAAA,iBAAA,EAAA,OAAA;AAAAC,QAAAA,UAAA,EAAA,OAAA;AAAAC,QAAAA,QAAA,EAAA,IAAA;AAAAC,QAAAA,UAAA,EAAA,IAAA;AAAAC,QAAAA,iBAAA,EAAA;OAAA;AAAA5B,MAAAA,MAAA,EAAA;AAAAwB,QAAAA,iBAAA,EAAA,QAAA;AAAAC,QAAAA,UAAA,EAAA,QAAA;AAAAC,QAAAA,QAAA,EAAA,IAAA;AAAAC,QAAAA,UAAA,EAAA,IAAA;AAAAC,QAAAA,iBAAA,EAAA;OAAA;AAAA3B,MAAAA,SAAA,EAAA;AAAAuB,QAAAA,iBAAA,EAAA,WAAA;AAAAC,QAAAA,UAAA,EAAA,WAAA;AAAAC,QAAAA,QAAA,EAAA,IAAA;AAAAC,QAAAA,UAAA,EAAA,IAAA;AAAAC,QAAAA,iBAAA,EAAA;OAAA;AAAA1B,MAAAA,WAAA,EAAA;AAAAsB,QAAAA,iBAAA,EAAA,aAAA;AAAAC,QAAAA,UAAA,EAAA,aAAA;AAAAC,QAAAA,QAAA,EAAA,IAAA;AAAAC,QAAAA,UAAA,EAAA,IAAA;AAAAC,QAAAA,iBAAA,EAAA;OAAA;AAAAzB,MAAAA,OAAA,EAAA;AAAAqB,QAAAA,iBAAA,EAAA,SAAA;AAAAC,QAAAA,UAAA,EAAA,SAAA;AAAAC,QAAAA,QAAA,EAAA,IAAA;AAAAC,QAAAA,UAAA,EAAA,IAAA;AAAAC,QAAAA,iBAAA,EAAA;AAAA;KAAA;AAAAC,IAAAA,IAAA,EAAA;AAAAC,MAAAA,UAAA,EAAA;AAAA,QAAA,0CAAA,EAAA,aAAA;AAAA,QAAA,wBAAA,EAAA,oBAAA;AAAA,QAAA,gBAAA,EAAA,SAAA;AAAA,QAAA,iBAAA,EAAA;OAAA;AAAAC,MAAAA,cAAA,EAAA;KAAA;AAAAC,IAAAA,QAAA,EAAAnB,EAAA;AAAAoB,IAAAA,QAAA,EAtBzB;;;;;;;;;;;;AAYT,EAAA,CAAA;AAAAC,IAAAA,QAAA,EAAA,IAAA;IAAAC,MAAA,EAAA,CAAA,k3BAAA,CAAA;AAAAC,IAAAA,aAAA,EAAAvB,EAAA,CAAAwB,iBAAA,CAAAC;AAAA,GAAA,CAAA;;;;;;QAUU3C,wBAAwB;AAAA4C,EAAAA,UAAA,EAAA,CAAA;UAzBpCxB,SAAS;AACEyB,IAAAA,IAAA,EAAA,CAAA;AAAAlB,MAAAA,QAAA,EAAA,4BAA4B;MAAAc,aAAA,EACvBC,iBAAiB,CAACC,IAAI;AAAAL,MAAAA,QAAA,EAC3B;;;;;;;;;;;;GAYT;AAAAJ,MAAAA,IAAA,EAEK;AACJ,QAAA,OAAO,EAAE,4BAA4B;AACrC,QAAA,4CAA4C,EAAE,aAAa;AAC3D,QAAA,0BAA0B,EAAE,oBAAoB;AAChD,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,mBAAmB,EAAE;OACtB;MAAAM,MAAA,EAAA,CAAA,k3BAAA;KAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MCQUM,qBAAqB,GAAG,IAAIC,cAAc,CACrD,uBAAuB;AAyBlB,MAAMC,oBAAoB,GAAG,GAAG;AAChC,MAAMC,qBAAqB,GAAG,GAAG;AAexC,SAASC,UAAUA,CAACC,KAAyB,EAAA;EAC3C,OAAOA,KAAK,IAAI,IAAI,GAAGA,KAAK,GAAGC,eAAe,CAACD,KAAK,EAAE,CAAC,CAAC;AAC1D;AAMA,IAAKE,WAOJ;AAPD,CAAA,UAAKA,WAAW,EAAA;EACdA,WAAA,CAAAA,WAAA,CAAA,WAAA,CAAA,GAAA,EAAA,CAAA,GAAA,WAAc;EACdA,WAAA,CAAAA,WAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAS;EACTA,WAAA,CAAAA,WAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAW;EACXA,WAAA,CAAAA,WAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAU;EACVA,WAAA,CAAAA,WAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAa;EACbA,WAAA,CAAAA,WAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAQ;AACV,CAAC,EAPIA,WAAW,KAAXA,WAAW,GAAA,EAAA,CAAA,CAAA;MAmCHC,aAAa,CAAA;AAChBC,EAAAA,OAAO,GAAGC,MAAM,CAACC,MAAM,CAAC;AACfC,EAAAA,MAAM,GAAGF,MAAM,CAACG,SAAS,EAAE;AAACC,IAAAA,QAAQ,EAAE;AAAI,GAAC,CAAC;AAC5CC,EAAAA,kBAAkB,GAAGL,MAAM,CAACM,iBAAiB,CAAC;AAC9CC,EAAAA,WAAW,GAAGP,MAAM,CAA0BQ,UAAU,CAAC;EAClEC,OAAO;EACPC,cAAc;EACdC,yBAAyB;EACzBC,mBAAmB;AACVC,EAAAA,UAAU,GAAG,IAAIC,OAAO,EAAQ;AAChCC,EAAAA,cAAc,GAAG,IAAIC,eAAe,CAAwBC,SAAS,CAAC;AAC7EC,EAAAA,UAAU,GAAG,KAAK;AAClBC,EAAAA,eAAe,GAAG,IAAI;EAGfC,UAAU;EAI3B3E,OAAO;EAGP,IACII,MAAMA,GAAA;IACR,OAAO,IAAI,CAACwE,OAAO;AACrB,EAAA;EACA,IAAIxE,MAAMA,CAACA,MAA0B,EAAA;AACnC,IAAA,IAAI,CAACwE,OAAO,GAAGxE,MAAM,IAAI,IAAI,IAAIyE,KAAK,CAACzE,MAAM,CAAC,GAAG4C,qBAAqB,GAAG5C,MAAM;AACjF,EAAA;AACQwE,EAAAA,OAAO,GAAG5B,qBAAqB;EAGvC,IACI7C,KAAKA,GAAA;IACP,OAAO,IAAI,CAAC2E,MAAM;AACpB,EAAA;EACA,IAAI3E,KAAKA,CAACA,KAAyB,EAAA;AACjC,IAAA,IAAI,CAAC2E,MAAM,GAAG3E,KAAK,IAAI,IAAI,IAAI0E,KAAK,CAAC1E,KAAK,CAAC,GAAG4C,oBAAoB,GAAG5C,KAAK;AAC5E,EAAA;AACQ2E,EAAAA,MAAM,GAAG/B,oBAAoB;EAIrCgC,YAAY;EAIZC,UAAU;EAIVC,gBAAgB;EAOhBC,UAAU;AAIVC,EAAAA,cAAc,GAAY,KAAK;EAI/BC,OAAO;AAOPC,EAAAA,kBAAkB,GAAY,KAAK;AAOGC,EAAAA,wBAAwB,GAAY,KAAK;EAGtEC,sBAAsB;EAMtBC,uBAAuB;AAMbC,EAAAA,KAAK,GAA+B,IAAIC,YAAY,EAAkB;AAGtEC,EAAAA,WAAW,GAC5B,IAAI,CAACC,eAAe,CAAwB,eAAe,CAAC;AAG3C/E,EAAAA,KAAK,GACtB,IAAI,CAAC+E,eAAe,CAAkB,SAAS,CAAC;AAG/BC,EAAAA,SAAS,GAC1B,IAAI,CAACD,eAAe,CAAiB,aAAa,CAAC;AAGlCE,EAAAA,qBAAqB,GACtC,IAAI,CAACF,eAAe,CAAkC,yBAAyB,CAAC;AAG/DG,EAAAA,kBAAkB,GACnC,IAAI,CAACH,eAAe,CAA+B,sBAAsB,CAAC;EAI5EI,gBAAgB;AAEhBC,EAAAA,WAAAA,GAAA;AACE,IAAA,MAAMC,UAAU,GAAG3C,MAAM,CAAS4C,WAAW,CAAC;AAC9C,IAAA,MAAMC,MAAM,GAAG7C,MAAM,CAACV,qBAAqB,EAAE;AAACc,MAAAA,QAAQ,EAAE;AAAI,KAAC,CAAC;AAC9D,IAAA,IAAI,CAACyB,OAAO,GAAGgB,MAAM,EAAEhB,OAAO,IAAI,IAAI;AACtC,IAAA,IAAI,CAACC,kBAAkB,GAAG,CAAC,CAACe,MAAM,EAAEf,kBAAkB;AACtD,IAAA,IAAI,CAACE,sBAAsB,GAAGa,MAAM,EAAEb,sBAAsB,IAAI,YAAY;AAC5E,IAAA,IAAI,CAACC,uBAAuB,GAAGY,MAAM,EAAEZ,uBAAuB,IAAI,UAAU;AAC5E,IAAA,IAAI,CAACb,UAAU,GAAG0B,iBAAiB,CAACH,UAAU,CAAC;AACjD,EAAA;AAEAI,EAAAA,eAAeA,GAAA;IACb,IAAI,CAACC,kBAAkB,EAAE;AAC3B,EAAA;EAEAC,WAAWA,CAACC,OAA4B,EAAA;AACtC,IAAA,IAAI,IAAI,CAACC,qBAAqB,CAACD,OAAO,CAAC,EAAE;MACvC,IAAI,CAACF,kBAAkB,EAAE;AAC3B,IAAA,CAAC,MAAM,IAAI,IAAI,CAACvC,OAAO,EAAE;MACvB,IAAIyC,OAAO,CAAC,OAAO,CAAC,IAAIA,OAAO,CAAC,QAAQ,CAAC,EAAE;QACzC,IAAI,CAACE,QAAQ,EAAE;AACjB,MAAA;AAEA,MAAA,IAAIF,OAAO,CAAC,kBAAkB,CAAC,EAAE;QAC/B,IAAI,CAACG,WAAW,EAAE;AACpB,MAAA;AAEA,MAAA,IAAIH,OAAO,CAAC,cAAc,CAAC,IAAIA,OAAO,CAAC,YAAY,CAAC,IAAIA,OAAO,CAAC,kBAAkB,CAAC,EAAE;QACnF,IAAI,CAACI,UAAU,EAAE;AACnB,MAAA;AACF,IAAA;AACF,EAAA;AAEAC,EAAAA,WAAWA,GAAA;AACT,IAAA,IAAI,CAAC7C,cAAc,EAAE8C,OAAO,EAAE;IAE9B,IAAI,IAAI,CAAC/C,OAAO,EAAE;AAChB,MAAA,IAAI,CAACA,OAAO,CAAC+C,OAAO,EAAE;AACrBC,MAAAA,MAAwB,CAACC,uBAAuB,GAAG,IAAI,CAAC/C,yBAAyB;AACpF,IAAA;AAEA,IAAA,IAAI,CAACI,cAAc,CAAC4C,QAAQ,EAAE;AAC9B,IAAA,IAAI,CAAC9C,UAAU,CAAC+C,IAAI,EAAE;AACtB,IAAA,IAAI,CAAC/C,UAAU,CAAC8C,QAAQ,EAAE;AAC5B,EAAA;AAGAE,EAAAA,SAASA,GAAA;IACP,IAAI,IAAI,CAACpD,OAAO,EAAE;AAChB,MAAA,IAAI,CAACA,OAAO,CAACoD,SAAS,EAAE;AAC1B,IAAA,CAAC,MAAM;MACL,IAAI,CAACC,gBAAgB,EAAE,CAACC,aAAa,GAAGlE,WAAW,CAACmE,OAAO;AAC3D,MAAA,IAAI,CAACC,KAAK,CAAC,IAAI,CAAC;AAClB,IAAA;AACF,EAAA;AAGAC,EAAAA,UAAUA,GAAA;IACR,IAAI,IAAI,CAACzD,OAAO,EAAE;AAChB,MAAA,IAAI,CAACA,OAAO,CAACyD,UAAU,EAAE;AAC3B,IAAA,CAAC,MAAM;MACL,IAAI,CAACJ,gBAAgB,EAAE,CAACC,aAAa,GAAGlE,WAAW,CAACsE,MAAM;AAC5D,IAAA;AACF,EAAA;AAGAC,EAAAA,SAASA,GAAA;IACP,IAAI,IAAI,CAAC3D,OAAO,EAAE;AAChB,MAAA,IAAI,CAACA,OAAO,CAAC2D,SAAS,EAAE;AAC1B,IAAA,CAAC,MAAM;MAEL,IAAI,CAACN,gBAAgB,EAAE,CAACC,aAAa,GAAGlE,WAAW,CAACwE,IAAI;AAC1D,IAAA;AACF,EAAA;AAGAC,EAAAA,MAAMA,CAACC,OAAe,EAAEC,cAAuB,EAAA;IAC7C,IAAI,IAAI,CAAC/D,OAAO,EAAE;MAChB,IAAI,CAACA,OAAO,CAAC6D,MAAM,CAACC,OAAO,EAAEC,cAAc,CAAC;AAC9C,IAAA,CAAC,MAAM;AACL,MAAA,IAAI,CAACV,gBAAgB,EAAE,CAACW,IAAI,GAAG;QAACF,OAAO;AAAEC,QAAAA;OAAe;AAC1D,IAAA;AACF,EAAA;AAGAE,EAAAA,IAAIA,GAAA;IACF,IAAI,IAAI,CAACjE,OAAO,EAAE;AAChB,MAAA,IAAI,CAACA,OAAO,CAACiE,IAAI,EAAE;AACrB,IAAA,CAAC,MAAM;AACL,MAAA,IAAI,CAACZ,gBAAgB,EAAE,CAACa,KAAK,GAAG,IAAI;AACtC,IAAA;AACF,EAAA;AAGAC,EAAAA,MAAMA,GAAA;IACJ,IAAI,IAAI,CAACnE,OAAO,EAAE;AAChB,MAAA,IAAI,CAACA,OAAO,CAACmE,MAAM,EAAE;AACvB,IAAA,CAAC,MAAM;AACL,MAAA,IAAI,CAACd,gBAAgB,EAAE,CAACa,KAAK,GAAG,KAAK;AACvC,IAAA;AACF,EAAA;AAGAE,EAAAA,OAAOA,GAAA;IACL,IAAI,IAAI,CAACpE,OAAO,EAAE;AAChB,MAAA,OAAO,IAAI,CAACA,OAAO,CAACoE,OAAO,EAAE;AAC/B,IAAA;IAEA,IAAI,IAAI,CAACjE,mBAAmB,EAAE;AAC5B,MAAA,OAAO,CAAC,CAAC,IAAI,CAACA,mBAAmB,CAAC+D,KAAK;AACzC,IAAA;AAEA,IAAA,OAAO,KAAK;AACd,EAAA;EAGAG,SAASA,CAACC,MAAc,EAAA;IACtB,IAAI,IAAI,CAACtE,OAAO,EAAE;AAChB,MAAA,IAAI,CAACA,OAAO,CAACqE,SAAS,CAACC,MAAM,CAAC;AAChC,IAAA,CAAC,MAAM;AACL,MAAA,IAAI,CAACjB,gBAAgB,EAAE,CAACiB,MAAM,GAAGA,MAAM;AACzC,IAAA;AACF,EAAA;AAGAC,EAAAA,SAASA,GAAA;IACP,IAAI,IAAI,CAACvE,OAAO,EAAE;AAChB,MAAA,OAAO,IAAI,CAACA,OAAO,CAACuE,SAAS,EAAE;AACjC,IAAA;IAEA,IAAI,IAAI,CAACpE,mBAAmB,IAAI,IAAI,CAACA,mBAAmB,CAACmE,MAAM,IAAI,IAAI,EAAE;AACvE,MAAA,OAAO,IAAI,CAACnE,mBAAmB,CAACmE,MAAM;AACxC,IAAA;AAEA,IAAA,OAAO,CAAC;AACV,EAAA;EAGAE,eAAeA,CAACC,YAAoB,EAAA;IAClC,IAAI,IAAI,CAACzE,OAAO,EAAE;AAChB,MAAA,OAAO,IAAI,CAACA,OAAO,CAACwE,eAAe,CAACC,YAAY,CAAC;AACnD,IAAA,CAAC,MAAM;AACL,MAAA,IAAI,CAACpB,gBAAgB,EAAE,CAACoB,YAAY,GAAGA,YAAY;AACrD,IAAA;AACF,EAAA;AAGAC,EAAAA,eAAeA,GAAA;IACb,IAAI,IAAI,CAAC1E,OAAO,EAAE;AAChB,MAAA,OAAO,IAAI,CAACA,OAAO,CAAC0E,eAAe,EAAE;AACvC,IAAA;IAEA,IAAI,IAAI,CAACvE,mBAAmB,IAAI,IAAI,CAACA,mBAAmB,CAACsE,YAAY,IAAI,IAAI,EAAE;AAC7E,MAAA,OAAO,IAAI,CAACtE,mBAAmB,CAACsE,YAAY;AAC9C,IAAA;AAEA,IAAA,OAAO,CAAC;AACV,EAAA;AAGAE,EAAAA,yBAAyBA,GAAA;AACvB,IAAA,OAAO,IAAI,CAAC3E,OAAO,GAAG,IAAI,CAACA,OAAO,CAAC2E,yBAAyB,EAAE,GAAG,EAAE;AACrE,EAAA;AAGAC,EAAAA,sBAAsBA,GAAA;AACpB,IAAA,OAAO,IAAI,CAAC5E,OAAO,GAAG,IAAI,CAACA,OAAO,CAAC4E,sBAAsB,EAAE,GAAG,CAAC;AACjE,EAAA;AAGAC,EAAAA,cAAcA,GAAA;IACZ,IAAI,CAAC,IAAI,CAAClE,UAAU,IAAI,CAACqC,MAAM,CAAC8B,EAAE,EAAE;AAClC,MAAA,OAAOtE,SAAS;AAClB,IAAA;IAEA,IAAI,IAAI,CAACR,OAAO,EAAE;AAChB,MAAA,OAAO,IAAI,CAACA,OAAO,CAAC6E,cAAc,EAAE;AACtC,IAAA;IAEA,IAAI,IAAI,CAAC1E,mBAAmB,IAAI,IAAI,CAACA,mBAAmB,CAACmD,aAAa,IAAI,IAAI,EAAE;AAC9E,MAAA,OAAO,IAAI,CAACnD,mBAAmB,CAACmD,aAAa;AAC/C,IAAA;IAEA,OAAOlE,WAAW,CAAC2F,SAAS;AAC9B,EAAA;AAGAC,EAAAA,cAAcA,GAAA;IACZ,IAAI,IAAI,CAAChF,OAAO,EAAE;AAChB,MAAA,OAAO,IAAI,CAACA,OAAO,CAACgF,cAAc,EAAE;AACtC,IAAA;IAEA,IAAI,IAAI,CAAC7E,mBAAmB,IAAI,IAAI,CAACA,mBAAmB,CAAC6D,IAAI,EAAE;AAC7D,MAAA,OAAO,IAAI,CAAC7D,mBAAmB,CAAC6D,IAAI,CAACF,OAAO;AAC9C,IAAA;AAEA,IAAA,OAAO,CAAC;AACV,EAAA;AAGAmB,EAAAA,kBAAkBA,GAAA;AAChB,IAAA,OAAO,IAAI,CAACjF,OAAO,GAAG,IAAI,CAACA,OAAO,CAACiF,kBAAkB,EAAE,GAAG,SAAS;AACrE,EAAA;AAGAC,EAAAA,yBAAyBA,GAAA;AACvB,IAAA,OAAO,IAAI,CAAClF,OAAO,GAAG,IAAI,CAACA,OAAO,CAACkF,yBAAyB,EAAE,GAAG,EAAE;AACrE,EAAA;AAGAC,EAAAA,WAAWA,GAAA;AACT,IAAA,OAAO,IAAI,CAACnF,OAAO,GAAG,IAAI,CAACA,OAAO,CAACmF,WAAW,EAAE,GAAG,CAAC;AACtD,EAAA;AAGAC,EAAAA,WAAWA,GAAA;AACT,IAAA,OAAO,IAAI,CAACpF,OAAO,GAAG,IAAI,CAACA,OAAO,CAACoF,WAAW,EAAE,GAAG,EAAE;AACvD,EAAA;AAGAC,EAAAA,iBAAiBA,GAAA;AACf,IAAA,OAAO,IAAI,CAACrF,OAAO,GAAG,IAAI,CAACA,OAAO,CAACqF,iBAAiB,EAAE,GAAG,EAAE;AAC7D,EAAA;EAMA,MAAMC,iBAAiBA,CAACC,OAA2B,EAAA;AAGjD,IAAA,MAAMC,OAAO,GAAG,IAAI,CAAC1F,WAAW,CAAC2F,aAAa;IAC9C,OAAOD,OAAO,CAACF,iBAAiB,GAC5BE,OAAO,CAACF,iBAAiB,CAACC,OAAO,CAAC,GAClCG,OAAO,CAACC,MAAM,CAAC,IAAIC,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC3E,EAAA;EAMUpC,KAAKA,CAACJ,SAAkB,EAAA;AAEhC,IAAA,IAAI,CAAC,IAAI,CAACzC,UAAU,EAAE;AACpB,MAAA;AACF,IAAA;IAGA,IACE,OAAOqC,MAAM,CAAC8B,EAAE,KAAK,QAAQ,IAC7B,CAAC9B,MAAM,CAAC8B,EAAE,IACV,CAAC9B,MAAM,CAAC8B,EAAE,CAACe,MAAM,IACjB,OAAO7C,MAAM,CAAC8B,EAAE,CAACe,MAAM,KAAK,UAAU,EACtC;MACA,IAAI,IAAI,CAACzE,OAAO,EAAE;QAChB,IAAI,CAACX,UAAU,GAAG,IAAI;AACtBW,QAAAA,OAAO,CAAC,IAAI,CAAC3B,MAAM,CAAC;AACtB,MAAA,CAAC,MAAM,IAAI,IAAI,CAAC6B,wBAAwB,KAAK,OAAO3E,SAAS,KAAK,WAAW,IAAIA,SAAS,CAAC,EAAE;QAC3F,MAAM,IAAIiJ,KAAK,CACb,oEAAoE,GAClE,qEAAqE,GACrE,4DAA4D,CAC/D;AACH,MAAA;AAEA,MAAA,MAAME,gBAAgB,GAAI9C,MAAwB,CAACC,uBAAuB;AAG1E,MAAA,IAAI,OAAO6C,gBAAgB,KAAK,UAAU,EAAE;AAC1C,QAAA,IAAI,CAAC5F,yBAAyB,GAAI8C,MAAwB,CAACC,uBAAuB;AACpF,MAAA;MAECD,MAAwB,CAACC,uBAAuB,GAAG,MAAK;QACvD,IAAI,CAAC/C,yBAAyB,IAAI;AAClC,QAAA,IAAI,CAACZ,OAAO,CAACyG,GAAG,CAAC,MAAM,IAAI,CAACC,aAAa,CAAC5C,SAAS,CAAC,CAAC;MACvD,CAAC;AACH,IAAA,CAAC,MAAM;AACL,MAAA,IAAI,CAAC4C,aAAa,CAAC5C,SAAS,CAAC;AAC/B,IAAA;AACF,EAAA;AAGQb,EAAAA,kBAAkBA,GAAA;AAExB,IAAA,IAAI,CAAC,IAAI,CAAC0D,sBAAsB,EAAE,EAAE;AAClC,MAAA,IAAI,CAACzC,KAAK,CAAC,KAAK,CAAC;IACnB,CAAC,MAAM,IAAI,IAAI,CAACtC,UAAU,EAAEgF,QAAQ,KAAK,CAAC,EAAE;AAE1C,MAAA,IAAI,CAAC1C,KAAK,CAAC,IAAI,CAAC;AAClB,IAAA;AACF,EAAA;AAGUyC,EAAAA,sBAAsBA,GAAA;IAC9B,IAAI,IAAI,CAAC5E,kBAAkB,EAAE;AAC3B,MAAA,OAAO,KAAK;AACd,IAAA;AAGA,IAAA,IAAI,CAAC,IAAI,CAACV,UAAU,EAAE;AACpB,MAAA,OAAO,IAAI;AACb,IAAA;AAEA,IAAA,OAAO,IAAI,CAACD,eAAe,IAAI,CAAC,CAAC,IAAI,CAAC1E,OAAO,IAAI,CAAC,IAAI,CAACgE,OAAO;AAChE,EAAA;AAGQqD,EAAAA,gBAAgBA,GAAA;AACtB,IAAA,IAAI,CAAC,IAAI,CAAClD,mBAAmB,EAAE;AAC7B,MAAA,IAAI,CAACA,mBAAmB,GAAG,EAAE;AAC/B,IAAA;IAEA,OAAO,IAAI,CAACA,mBAAmB;AACjC,EAAA;EAMQuC,qBAAqBA,CAACD,OAAsB,EAAA;IAClD,MAAM0D,MAAM,GACV1D,OAAO,CAAC,SAAS,CAAC,IAClBA,OAAO,CAAC,YAAY,CAAC,IACrBA,OAAO,CAAC,gBAAgB,CAAC,IACzBA,OAAO,CAAC,oBAAoB,CAAC;IAC/B,OAAO,CAAC,CAAC0D,MAAM,IAAI,CAACA,MAAM,CAACC,aAAa,EAAE;AAC5C,EAAA;EAMQJ,aAAaA,CAAC5C,SAAkB,EAAA;AACtC,IAAA,IAAI,CAACpD,OAAO,EAAE+C,OAAO,EAAE;AACvB,IAAA,IAAI,CAAC9C,cAAc,EAAE8C,OAAO,EAAE;AAI9B,IAAA,IACE,OAAQC,MAAoC,CAAC8B,EAAE,KAAK,WAAW,IAC9D,CAAC,IAAI,CAAC9I,OAAO,IAAI,CAAC,IAAI,CAACkF,UAAU,EAAEmF,IAAK,EACzC;AACA,MAAA;AACF,IAAA;AAIA,IAAA,MAAMC,MAAM,GAAqB;AAC/BrI,MAAAA,IAAI,EAAE,IAAI,CAACkD,cAAc,GAAG,kCAAkC,GAAGX,SAAS;MAC1ErE,KAAK,EAAE,IAAI,CAACA,KAAK;MACjBC,MAAM,EAAE,IAAI,CAACA,MAAM;MAGnB8E,UAAU,EAAEkC,SAAS,GAAG;AAAC,QAAA,IAAI,IAAI,CAAClC,UAAU,IAAI,EAAE,CAAC;AAAEgF,QAAAA,QAAQ,EAAE;OAAE,GAAG,IAAI,CAAChF;KAC1E;IAID,IAAI,IAAI,CAAClF,OAAO,EAAE;AAChBsK,MAAAA,MAAM,CAACtK,OAAO,GAAG,IAAI,CAACA,OAAO;AAC/B,IAAA;IACA,MAAMuK,MAAM,GAAG,IAAI,CAACjH,OAAO,CAACkH,iBAAiB,CAC3C,MACE,IAAKxD,MAAoC,CAAC8B,EAAG,CAACe,MAAM,CAClD,IAAI,CAAC7D,gBAAgB,CAACyD,aAAa,EACnCa,MAAM,CACP,CACJ;IAED,MAAMG,SAAS,GAAIC,KAAqB,IAAI;AAE1C,MAAA,IAAI,CAACpH,OAAO,CAACyG,GAAG,CAAC,MAAK;QACpB,IAAI,CAACtF,UAAU,GAAG,KAAK;QACvB,IAAI,CAACC,eAAe,GAAG,KAAK;QAC5B,IAAI,CAACV,OAAO,GAAGuG,MAAM;QACrB,IAAI,CAACtG,cAAc,GAAGO,SAAS;AAC/B+F,QAAAA,MAAM,CAACI,mBAAmB,CAAC,SAAS,EAAEF,SAAS,CAAC;AAChD,QAAA,IAAI,CAACnG,cAAc,CAAC6C,IAAI,CAACoD,MAAM,CAAC;AAC/B,QAAA,IAAI,CAAC9E,KAAsC,CAACmF,IAAI,CAACF,KAAK,CAAC;QACxD,IAAI,CAAC/D,QAAQ,EAAE;QACf,IAAI,CAACC,WAAW,EAAE;QAElB,IAAI,IAAI,CAACzC,mBAAmB,EAAE;UAC5B,IAAI,CAAC0G,wBAAwB,CAACN,MAAM,EAAE,IAAI,CAACpG,mBAAmB,CAAC;UAC/D,IAAI,CAACA,mBAAmB,GAAGK,SAAS;AACtC,QAAA;AAIA,QAAA,MAAMsG,KAAK,GAAGP,MAAM,CAAC1B,cAAc,EAAE;AACrC,QAAA,IAAIiC,KAAK,KAAK1H,WAAW,CAAC2F,SAAS,IAAI+B,KAAK,KAAK1H,WAAW,CAACwE,IAAI,IAAIkD,KAAK,IAAI,IAAI,EAAE;UAClF,IAAI,CAACjE,UAAU,EAAE;QACnB,CAAC,MAAM,IACL,CAACO,SAAS,IAAI,IAAI,CAAClC,UAAU,EAAEgF,QAAQ,KAAK,CAAC,KAC7C,IAAI,CAACnF,YAAY,IACjB,IAAI,CAACA,YAAY,GAAG,CAAC,EACrB;UAKAwF,MAAM,CAAC1C,MAAM,CAAC,IAAI,CAAC9C,YAAY,EAAE,IAAI,CAAC;AACxC,QAAA;AAEA,QAAA,IAAI,CAACnB,kBAAkB,CAACmH,YAAY,EAAE;AACxC,MAAA,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC9G,cAAc,GAAGsG,MAAM;AAC5BA,IAAAA,MAAM,CAACS,gBAAgB,CAAC,SAAS,EAAEP,SAAS,CAAC;AAC/C,EAAA;AAGQI,EAAAA,wBAAwBA,CAACN,MAAiB,EAAEU,YAAgC,EAAA;IAClF,MAAM;MAAC3D,aAAa;MAAEmB,YAAY;MAAEH,MAAM;MAAEJ,KAAK;AAAEF,MAAAA;AAAI,KAAC,GAAGiD,YAAY;AAEvE,IAAA,QAAQ3D,aAAa;MACnB,KAAKlE,WAAW,CAACmE,OAAO;QACtBgD,MAAM,CAACnD,SAAS,EAAE;AAClB,QAAA;MACF,KAAKhE,WAAW,CAACsE,MAAM;QACrB6C,MAAM,CAAC9C,UAAU,EAAE;AACnB,QAAA;MACF,KAAKrE,WAAW,CAACwE,IAAI;QACnB2C,MAAM,CAAC5C,SAAS,EAAE;AAClB,QAAA;AACJ;IAEA,IAAIc,YAAY,IAAI,IAAI,EAAE;AACxB8B,MAAAA,MAAM,CAAC/B,eAAe,CAACC,YAAY,CAAC;AACtC,IAAA;IAEA,IAAIH,MAAM,IAAI,IAAI,EAAE;AAClBiC,MAAAA,MAAM,CAAClC,SAAS,CAACC,MAAM,CAAC;AAC1B,IAAA;IAEA,IAAIJ,KAAK,IAAI,IAAI,EAAE;MACjBA,KAAK,GAAGqC,MAAM,CAACtC,IAAI,EAAE,GAAGsC,MAAM,CAACpC,MAAM,EAAE;AACzC,IAAA;IAEA,IAAIH,IAAI,IAAI,IAAI,EAAE;MAChBuC,MAAM,CAAC1C,MAAM,CAACG,IAAI,CAACF,OAAO,EAAEE,IAAI,CAACD,cAAc,CAAC;AAClD,IAAA;AACF,EAAA;AAGQlB,EAAAA,UAAUA,GAAA;AAChB,IAAA,IAAI,IAAI,CAAC7C,OAAO,IAAI,IAAI,CAAChE,OAAO,EAAE;AAChC,MAAA,IAAI,CAACgE,OAAO,CAACkH,YAAY,CAAC;QACxBlL,OAAO,EAAE,IAAI,CAACA,OAAO;QACrB+E,YAAY,EAAE,IAAI,CAACA,YAAY;QAC/BC,UAAU,EAAE,IAAI,CAACA,UAAU;QAC3BC,gBAAgB,EAAE,IAAI,CAACA;AACxB,OAAA,CAAC;AACJ,IAAA;AACF,EAAA;AAGQ0B,EAAAA,QAAQA,GAAA;AACd,IAAA,IAAI,CAAC3C,OAAO,EAAEmH,OAAO,CAAC,IAAI,CAAChL,KAAK,EAAE,IAAI,CAACC,MAAM,CAAC;AAChD,EAAA;AAGQwG,EAAAA,WAAWA,GAAA;AACjB,IAAA,IAAI,IAAI,CAAC5C,OAAO,IAAI,IAAI,CAACiB,gBAAgB,EAAE;MACzC,IAAI,CAACjB,OAAO,CAACoH,kBAAkB,CAAC,IAAI,CAACnG,gBAAgB,CAAC;AACxD,IAAA;AACF,EAAA;EAGQW,eAAeA,CAA2ByF,IAAqB,EAAA;IAGrE,OAAO,IAAI,CAAC/G,cAAc,CAACgH,IAAI,CAG7BC,SAAS,CAAChB,MAAM,IAAG;AACjB,MAAA,OAAOA,MAAM,GACTiB,gBAAgB,CACdC,QAAQ,IAAG;AACTlB,QAAAA,MAAM,CAACS,gBAAgB,CAACK,IAAI,EAAEI,QAAQ,CAAC;MACzC,CAAC,EACDA,QAAQ,IAAG;QAIT,IAAI;AACFlB,UAAAA,MAAM,EAAEI,mBAAmB,GAAGU,IAAI,EAAEI,QAAQ,CAAC;QAC/C,CAAC,CAAC,MAAM,CAAC;AACX,MAAA,CAAC,CACF,GACDC,EAAY,EAAK;AACvB,IAAA,CAAC,CAAC,EAGFC,MAAM,IACJ,IAAIC,UAAU,CAAIC,QAAQ,IACxBF,MAAM,CAACG,SAAS,CAAC;AACf3E,MAAAA,IAAI,EAAEjE,KAAK,IAAI,IAAI,CAACI,OAAO,CAACyG,GAAG,CAAC,MAAM8B,QAAQ,CAAC1E,IAAI,CAACjE,KAAK,CAAC,CAAC;MAC3DrC,KAAK,EAAEA,KAAK,IAAIgL,QAAQ,CAAChL,KAAK,CAACA,KAAK,CAAC;AACrCqG,MAAAA,QAAQ,EAAEA,MAAM2E,QAAQ,CAAC3E,QAAQ;KAClC,CAAC,CACH,EAEH6E,SAAS,CAAC,IAAI,CAAC3H,UAAU,CAAC,CAC3B;AACH,EAAA;;;;;UAlnBWf,aAAa;AAAAtC,IAAAA,IAAA,EAAA,EAAA;AAAAC,IAAAA,MAAA,EAAAC,EAAA,CAAAC,eAAA,CAAAC;AAAA,GAAA,CAAA;AAAb,EAAA,OAAAC,IAAA,GAAAH,EAAA,CAAAI,oBAAA,CAAA;AAAAC,IAAAA,UAAA,EAAA,QAAA;AAAAC,IAAAA,OAAA,EAAA,QAAA;AAAAC,IAAAA,IAAA,EAAA6B,aAAa;;;;;mCAsBLF,eAAe,CAAA;AAAAhD,MAAAA,KAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAUfgD,eAAe,CAAA;AAAA4B,MAAAA,YAAA,EAAA,CAAA,cAAA,EAAA,cAAA,EA3E3B9B,UAAU,CAAA;AAAA+B,MAAAA,UAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAV/B,UAAU,CAAA;AAAAgC,MAAAA,gBAAA,EAAA,kBAAA;AAAAC,MAAAA,UAAA,EAAA,YAAA;AAAAC,MAAAA,cAAA,EAAA,CAAA,gBAAA,EAAA,gBAAA,EAwGE6G,gBAAgB;sCAIhBA,gBAAgB,CAAA;AAAA3G,MAAAA,kBAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAOhB2G,gBAAgB,CAAA;AAAA1G,MAAAA,wBAAA,EAAA,CAAA,0BAAA,EAAA,0BAAA,EAQhB0G,gBAAgB,CAAA;AAAAzG,MAAAA,sBAAA,EAAA,wBAAA;AAAAC,MAAAA,uBAAA,EAAA;KAAA;AAAAyG,IAAAA,OAAA,EAAA;AAAAxG,MAAAA,KAAA,EAAA,OAAA;AAAAE,MAAAA,WAAA,EAAA,aAAA;AAAA9E,MAAAA,KAAA,EAAA,OAAA;AAAAgF,MAAAA,SAAA,EAAA,WAAA;AAAAC,MAAAA,qBAAA,EAAA,uBAAA;AAAAC,MAAAA,kBAAA,EAAA;KAAA;AAAAmG,IAAAA,WAAA,EAAA,CAAA;AAAAC,MAAAA,YAAA,EAAA,kBAAA;AAAAC,MAAAA,KAAA,EAAA,IAAA;MAAAC,SAAA,EAAA,CAAA,kBAAA,CAAA;AAAAC,MAAAA,WAAA,EAAA,IAAA;AAAAC,MAAAA,MAAA,EAAA;AAAA,KAAA,CAAA;AAAAC,IAAAA,aAAA,EAAA,IAAA;AAAApK,IAAAA,QAAA,EAAAnB,EAAA;AAAAoB,IAAAA,QAAA,EAhGzB;;;;;;;;;;;;;;AAcT,EAAA,CAAA;AAAAC,IAAAA,QAAA,EAAA,IAAA;IAAAC,MAAA,EAAA,CAAA,+GAAA,CAAA;AAAAkK,IAAAA,YAAA,EAAA,CAAA;AAAAC,MAAAA,IAAA,EAAA,WAAA;AAAAlL,MAAAA,IAAA,EAhBSzB,wBAAwB;AAAA2B,MAAAA,QAAA,EAAA,4BAAA;AAAAC,MAAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,SAAA;AAAA,KAAA,CAAA;AAAAa,IAAAA,aAAA,EAAAvB,EAAA,CAAAwB,iBAAA,CAAAC;AAAA,GAAA,CAAA;;;;;;QAkBvBW,aAAa;AAAAV,EAAAA,UAAA,EAAA,CAAA;UArBzBxB,SAAS;;gBACE,gBAAgB;MAAAqB,aAAA,EACXC,iBAAiB,CAACC,IAAI;eAC5B,CAAC3C,wBAAwB,CAAC;AAAAsC,MAAAA,QAAA,EAEzB;;;;;;;;;;;;;;AAcT,EAAA,CAAA;MAAAE,MAAA,EAAA,CAAA,+GAAA;KAAA;;;;;YAoBAoK;;;YAIAA,KAAK;aAAC;AAACC,QAAAA,SAAS,EAAEzJ;OAAgB;;;YAUlCwJ,KAAK;aAAC;AAACC,QAAAA,SAAS,EAAEzJ;OAAgB;;;YAUlCwJ,KAAK;aAAC;AAACC,QAAAA,SAAS,EAAE3J;OAAW;;;YAI7B0J,KAAK;aAAC;AAACC,QAAAA,SAAS,EAAE3J;OAAW;;;YAI7B0J;;;YAOAA;;;YAIAA,KAAK;aAAC;AAACC,QAAAA,SAAS,EAAEZ;OAAiB;;;YAInCW,KAAK;aAAC;AAACC,QAAAA,SAAS,EAAEZ;OAAiB;;;YAOnCW,KAAK;aAAC;AAACC,QAAAA,SAAS,EAAEZ;OAAiB;;;YAQnCW,KAAK;aAAC;AAACC,QAAAA,SAAS,EAAEZ;OAAiB;;;YAGnCW;;;YAMAA;;;YAMAE;;;YAGAA;;;YAIAA;;;YAIAA;;;YAIAA;;;YAIAA;;;YAIAC,SAAS;MAAClK,IAAA,EAAA,CAAA,kBAAkB,EAAE;AAAC2J,QAAAA,MAAM,EAAE;OAAK;;;;AA+f/C,IAAIQ,SAAS,GAAG,KAAK;AAGrB,SAAS3H,OAAOA,CAAC4H,KAAoB,EAAA;AACnC,EAAA,IAAID,SAAS,EAAE;AACb,IAAA;AACF,EAAA;EAGA,MAAMjM,GAAG,GAAGmM,kBAAkB,CAAA,kCAAA,CAAoC;AAClE,EAAA,MAAMC,MAAM,GAAGC,QAAQ,CAACC,aAAa,CAAC,QAAQ,CAAC;EAC/C,MAAMC,QAAQ,GAAI3C,KAAY,IAAI;AAChCwC,IAAAA,MAAM,CAACvC,mBAAmB,CAAC,MAAM,EAAE0C,QAAQ,CAAC;AAC5CH,IAAAA,MAAM,CAACvC,mBAAmB,CAAC,OAAO,EAAE0C,QAAQ,CAAC;AAE7C,IAAA,IAAI3C,KAAK,CAAClJ,IAAI,KAAK,OAAO,EAAE;AAC1BuL,MAAAA,SAAS,GAAG,KAAK;AAEjB,MAAA,IAAI,OAAOpM,SAAS,KAAK,WAAW,IAAIA,SAAS,EAAE;AACjDC,QAAAA,OAAO,CAACC,KAAK,CAAC,CAAA,gCAAA,EAAmCC,GAAG,EAAE,CAAC;AACzD,MAAA;AACF,IAAA;EACF,CAAC;AACDoM,EAAAA,MAAM,CAAClC,gBAAgB,CAAC,MAAM,EAAEqC,QAAQ,CAAC;AACzCH,EAAAA,MAAM,CAAClC,gBAAgB,CAAC,OAAO,EAAEqC,QAAQ,CAAC;AAC1CC,EAAAA,YAAY,CAACJ,MAAM,EAAEpM,GAAG,CAAC;EACzBoM,MAAM,CAACK,KAAK,GAAG,IAAI;AAEnB,EAAA,IAAIP,KAAK,EAAE;AACTE,IAAAA,MAAM,CAACM,YAAY,CAAC,OAAO,EAAER,KAAK,CAAC;AACrC,EAAA;AAIAD,EAAAA,SAAS,GAAG,IAAI;AAChBI,EAAAA,QAAQ,CAACM,IAAI,CAACC,WAAW,CAACR,MAAM,CAAC;AACnC;;MC7wBaS,mBAAmB,CAAA;;;;;UAAnBA,mBAAmB;AAAA5M,IAAAA,IAAA,EAAA,EAAA;AAAAC,IAAAA,MAAA,EAAAC,EAAA,CAAAC,eAAA,CAAA0M;AAAA,GAAA,CAAA;;;;;UAAnBD,mBAAmB;IAAAE,OAAA,EAAA,CAHpBxK,aAAa,CAAA;IAAAyK,OAAA,EAAA,CACbzK,aAAa;AAAA,GAAA,CAAA;;;;;UAEZsK;AAAmB,GAAA,CAAA;;;;;;QAAnBA,mBAAmB;AAAAhL,EAAAA,UAAA,EAAA,CAAA;UAJ/BiL,QAAQ;AAAChL,IAAAA,IAAA,EAAA,CAAA;MACRiL,OAAO,EAAE,CAACxK,aAAa,CAAC;MACxByK,OAAO,EAAE,CAACzK,aAAa;KACxB;;;;;;"}