{"version":3,"file":"c8y-ngx-components-widgets-implementations-html-widget.mjs","sources":["../../widgets/implementations/html-widget/html-widget.model.ts","../../widgets/implementations/html-widget/webcomponent-template.ts","../../widgets/implementations/html-widget/legacy-template.ts","../../widgets/implementations/html-widget/html-widget-config.service.ts","../../widgets/implementations/html-widget/advanced-settings/advanced-settings.component.ts","../../widgets/implementations/html-widget/advanced-settings/advanced-settings.component.html","../../widgets/implementations/html-widget/html-ai-chat-tool-details.component.ts","../../widgets/implementations/html-widget/html-ai-chat-tool-details.component.html","../../widgets/implementations/html-widget/html-frame/html-frame.component.ts","../../widgets/implementations/html-widget/html-frame/html-frame.component.html","../../widgets/implementations/html-widget/widget-code-editor-section/widget-code-editor.component.ts","../../widgets/implementations/html-widget/widget-code-editor-section/widget-code-editor.component.html","../../widgets/implementations/html-widget/html-widget-config.component.ts","../../widgets/implementations/html-widget/html-widget-config.component.html","../../widgets/implementations/html-widget/html-widget-properties-selector/html-widget-properties-selector.component.ts","../../widgets/implementations/html-widget/html-widget-properties-selector/html-widget-properties-selector.component.html","../../widgets/implementations/html-widget/html-widget.component.ts","../../widgets/implementations/html-widget/html-widget.component.html","../../widgets/implementations/html-widget/c8y-ngx-components-widgets-implementations-html-widget.ts"],"sourcesContent":["import type { IIdentified, IManagedObject } from '@c8y/client';\nimport type { WidgetSettings } from '@c8y/ngx-components';\nimport type { InterpolationParameters, Translation } from '@ngx-translate/core';\nimport type {\n  AssetPropertyMappings,\n  ContextWidgetConfig\n} from '@c8y/ngx-components/context-dashboard';\n\nexport interface HtmlWidgetConfig extends ContextWidgetConfig {\n  device?: IIdentified | null;\n  config: HtmlWidget;\n  settings?: WidgetSettings;\n  properties?: AssetPropertyMappings;\n\n  /**\n   * On HTML WIdget 1.0 this property was used to store the HTML code.\n   * It is not used anymore, but we need to keep it for backward compatibility.\n   * The HTML code is now stored in the config property.\n   * @deprecated Use config.code instead.\n   */\n  html?: any;\n}\n\nexport type C8yProperties = Array<PathProperty | ComputedProperty>;\n\nexport interface HtmlWidget {\n  css: string;\n  code: string;\n  options: HtmlWidgetOptions;\n  legacy: boolean;\n  devMode: boolean;\n  latestCodeHash?: string;\n}\n\nexport interface HtmlWidgetOptions {\n  cssEncapsulation: boolean;\n  advancedSecurity: boolean;\n}\n\nexport interface WebcomponentContext extends HTMLElement {\n  c8yContext: IManagedObject;\n  c8yProperties?: Record<string, unknown>;\n  c8yTranslate: (\n    key: string | string[],\n    interpolateParams?: InterpolationParameters\n  ) => Translation;\n}\n\nexport interface PathProperty {\n  name: string;\n  path: string;\n  query?: never;\n  reducer?: never;\n}\n\nexport interface ComputedProperty {\n  name: string;\n  path?: never;\n  query: string;\n  reducer?: string;\n}\n\nexport const INITIAL_HTML_FORMATTED = `<div>\n  <h2>Hello from <span class=\"branded\">HTML widget</span></h2>\n\n  <p class=\"m-t-16\">\n    \\$\\{this.c8yTranslate('You can use HTML and JavaScript template literals:')\\}\n  </p>\n\n  <p class=\"m-t-16\">\n    <b>Context properties:</b> Access the assigned asset's properties via <code>c8yContext</code>: <br>\n    <tt>\\$\\{this.c8yContext ? this.c8yTranslate('Selected asset: {{ assetName }}', { assetName: this.c8yContext.name }) : this.c8yTranslate('No asset selected')\\}</tt>\n  </p>\n  \n  <p class=\"m-t-16\">\n    <b>Asset properties:</b> Use \"Asset properties\" to select other properties (incl. computed ones) and access their values via <code>c8yProperties</code>: <br>\n    <i>Last updated:</i> <tt>\\${this.c8yProperties?.lastUpdated || '-'}</tt> <br>\n    <i>Last device message:</i> <tt>\\${this.c8yProperties?.lastDeviceMessage || '-'}</tt>\n  </p>\n\n  <p class=\"m-t-16\">\n    <b>Styles:</b> Use the CSS editor to customize styles. You can use <span class=\"text-bold\">any design-token CSS variable</span> in there.\n  </p>\n\n  <p class=\"m-t-16\">\n    <b>Translations:</b> Use the <code>c8yTranslate('text {{ var }}', { var: value })</code> function to translate strings.\n    <i>Note: texts must be written in English and their translations must be available in the loaded standard or custom translation resources.</i>\n  </p>\n\n  <p class=\"m-t-16\">\n    <b>Buttons:</b> Use other HTML elements like buttons: <br>\n    <a class=\"btn btn-primary m-t-8\" href=\"#/group\">\\$\\{this.c8yTranslate('Go to groups')\\}</a>\n  </p>\n</div>`;\nexport const INITIAL_CSS_FORMATTED = `\n:host > div {\n  padding: var(--c8y-root-component-padding-default);\n}\nspan.branded { \n  color: var(--brand-primary, var(--c8y-brand-primary)); \n}`;\n\nexport const defaultWebComponentName = 'DefaultWebComponent';\n\nexport const defaultWebComponentAttributeNameContext = 'c8yContext';\n","import { defaultWebComponentName } from './html-widget.model';\n\nexport const webComponentTemplate = (\n  html: string,\n  css?: string,\n  viewEncapsulation?: boolean,\n  name = defaultWebComponentName\n) => `\nimport { LitElement, html, css} from 'lit';\n${!viewEncapsulation ? `import { styleImports } from 'styles';` : ''}\n\nexport default class ${name} extends LitElement {\n  static styles = css\\`\n    ${css}\n  \\`;\n\n  static properties = {\n    // The managed object this widget is assigned to. Can be null.\n    c8yContext: { type: Object },\n    // The object with realtime values of configured properties. Can be null.\n    c8yProperties: { type: Object },\n    // The instant translation function.\n    c8yTranslate: { type: Function },\n  };\n\n  constructor() {\n    super();\n  }\n\n  render() {\n    return html\\`${\n      viewEncapsulation\n        ? html\n        : `\n      <style>\n        \\${styleImports}\n      </style>\n      ${html}\n    `\n    }\\`;\n  }\n}\n`;\n","export const legacyTemplate = (html: string, deviceId?: string | number, deviceName?: string) => {\n  const escapedHtml = html\n    // Finds: \\  Replaces with: \\\\\n    .replace(/\\\\/g, '\\\\\\\\')\n    // Finds: ` Replaces with: \\`\n    .replace(/`/g, '\\\\`')\n    // Finds: $ Replaces with: \\$\n    .replace(/\\$/g, '\\\\$');\n\n  return `\nimport { angular } from 'angular';\n\n// NOTE: This is a legacy template for the HTML widget.\n// It is used to compile the HTML content in the context of the AngularJS application.\n// The template is injected into the AngularJS application and compiled using the AngularJS compiler.\n// The template should only be used for backward compatibility purposes.\n// It is recommended to use a web component instead.\n\nif(!angular) {\n  throw new Error('AngularJS is not available. Please make sure to include AngularJS in your project.');\n}\n\nconst $injector = angular.element(document.querySelector('c8y-ui-root')).injector();\nif (!$injector) {\n  throw new Error('AngularJS injector is not available. Maybe not an hybrid application?');\n}\n\n// defining a new scope\nconst $rootScope = $injector.get('$rootScope');\nconst $scope = $rootScope.$new(true); \n\n// faking the old angularjs config \n$scope.child = { \n  config: {\n    ${deviceId ? `device: { id: \"${deviceId}\", name: \"${deviceName}\" },` : ''}\n    html: \\`<div ng-controller=\"HtmlWidgetCtrl\">${escapedHtml}</div>\\`\n  }\n};\n\n// load the needed services\nconst $compile = $injector.get('$compile');\nconst $controller = $injector.get('$controller');\n\n// create the element\nconst htmlElement = angular.element($scope.child.config.html);\n\n// The default controller providing the context\n$controller('HtmlWidgetCtrl', { $scope });\n\n// Compile the element\n$compile(htmlElement)($scope);\n\n// Apply the scope changes\n$rootScope.$apply();\n\nexport default htmlElement[0];`;\n};\n","import { inject, Injectable } from '@angular/core';\nimport { AppStateService } from '@c8y/ngx-components';\nimport { CockpitConfig } from '@c8y/ngx-components/cockpit-config';\nimport {\n  ContextWidgetConfig,\n  WidgetConfigNotification,\n  WidgetConfigService\n} from '@c8y/ngx-components/context-dashboard';\nimport { isEmpty } from 'lodash';\nimport {\n  combineLatest,\n  debounceTime,\n  distinctUntilChanged,\n  filter,\n  first,\n  map,\n  Observable,\n  of,\n  shareReplay,\n  startWith,\n  Subject,\n  switchMap,\n  takeUntil,\n  withLatestFrom\n} from 'rxjs';\nimport { HtmlWidget, INITIAL_CSS_FORMATTED, INITIAL_HTML_FORMATTED } from './html-widget.model';\nimport { webComponentTemplate } from './webcomponent-template';\nimport { legacyTemplate } from './legacy-template';\n\n@Injectable()\nexport class HtmlWidgetConfigService {\n  readonly DEFAULT_AUTO_SAVE_DEBOUNCE = 1000;\n  codeChange$ = new Subject<{ value: string; type: 'css' | 'code' }>();\n  widgetConfigService = inject(WidgetConfigService);\n  appState = inject(AppStateService);\n  destroy$ = new Subject<void>();\n  readonly notify$: Observable<WidgetConfigNotification> = this.widgetConfigService.notify$;\n\n  init$ = this.widgetConfigService.currentConfig$.pipe(\n    first(),\n    map(current => {\n      if (current.html) {\n        current.config = this.mapLegacyConfig(current);\n      }\n\n      return (current.config || {}) as HtmlWidget;\n    }),\n    filter(config => !!config),\n    withLatestFrom(this.appState.currentApplicationConfig),\n    switchMap(([widgetConfig, appConfig]) => this.initConfig(appConfig, widgetConfig)),\n    shareReplay(),\n    takeUntil(this.destroy$)\n  );\n\n  config$ = this.init$.pipe(switchMap(initValue => this.configChanged$.pipe(startWith(initValue))));\n\n  codeEditorChangeConfig$ = combineLatest([\n    this.codeChange$.pipe(startWith(undefined)),\n    this.config$\n  ]).pipe(\n    distinctUntilChanged(),\n    takeUntil(this.destroy$),\n    debounceTime(this.DEFAULT_AUTO_SAVE_DEBOUNCE),\n    map(([change, config]) => {\n      if (!change) {\n        return config;\n      }\n      if (change.type === 'css') {\n        config.css = change.value;\n      } else {\n        config.code = change.value;\n      }\n      return { ...config };\n    })\n  );\n\n  configChanged$ = new Subject<HtmlWidget>();\n\n  initConfig(appConfig: CockpitConfig, widgetConfig: HtmlWidget): Observable<HtmlWidget> {\n    const defaultToAdvancedMode = appConfig?.htmlWidgetDefaultToAdvancedMode ?? false;\n    const isEmptyConfig = isEmpty(widgetConfig);\n    if (isEmptyConfig && !defaultToAdvancedMode) {\n      widgetConfig = this.initDefaultMode(!appConfig?.htmlWidgetDisableSanitization);\n      this.save(widgetConfig);\n      return of(widgetConfig);\n    }\n    if (isEmptyConfig) {\n      widgetConfig = this.enableAdvancedMode(widgetConfig);\n    }\n\n    // new config is needed to trigger ngOnChanges\n    const newConfig = { ...widgetConfig };\n    this.save(newConfig);\n    return of(newConfig);\n  }\n\n  destroy(): void {\n    this.destroy$.next();\n    this.codeChange$.complete();\n    this.configChanged$.complete();\n  }\n\n  save(config: HtmlWidget) {\n    this.widgetConfigService.updateConfig({\n      config\n    });\n  }\n\n  changeCode(value: string) {\n    this.codeChange$.next({ value, type: 'code' });\n  }\n\n  changeCss(value: string) {\n    this.codeChange$.next({ value, type: 'css' });\n  }\n\n  enableAdvancedMode(currentConfig: HtmlWidget) {\n    const currentHTML = currentConfig?.code || INITIAL_HTML_FORMATTED;\n    const currentCSS = currentConfig?.css || INITIAL_CSS_FORMATTED;\n    const code = currentConfig?.legacy\n      ? legacyTemplate(\n          currentHTML,\n          this.widgetConfigService.currentConfig?.device?.id,\n          this.widgetConfigService.currentConfig?.device?.name\n        )\n      : webComponentTemplate(currentHTML, currentCSS, false);\n    currentConfig = {\n      css: '',\n      code,\n      legacy: false,\n      devMode: true,\n      options: {\n        cssEncapsulation: false,\n        advancedSecurity: false\n      }\n    };\n    return currentConfig;\n  }\n\n  initDefaultMode(advancedSecurity = true): HtmlWidget {\n    return {\n      css: INITIAL_CSS_FORMATTED,\n      code: INITIAL_HTML_FORMATTED,\n      legacy: false,\n      devMode: false,\n      options: {\n        cssEncapsulation: false,\n        advancedSecurity\n      }\n    };\n  }\n\n  private mapLegacyConfig(current: ContextWidgetConfig): HtmlWidget {\n    const isAlreadyInAdvancedMode = current?.config?.devMode === true;\n    if (isAlreadyInAdvancedMode) {\n      return current.config as HtmlWidget;\n    }\n\n    const isAlreadyMapped = current?.config?.legacy === true;\n    if (isAlreadyMapped) {\n      return current.config as HtmlWidget;\n    }\n\n    return {\n      code: current.html,\n      css: '',\n      legacy: true,\n      devMode: false,\n      options: {\n        cssEncapsulation: false,\n        advancedSecurity: current.sanitization === 'strict'\n      }\n    };\n  }\n}\n","import { NgIf } from '@angular/common';\nimport { Component, inject, Input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { C8yTranslatePipe, IconDirective, Permissions } from '@c8y/ngx-components';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { HtmlWidgetConfigService } from '../html-widget-config.service';\nimport { HtmlWidgetConfig, HtmlWidgetOptions } from '../html-widget.model';\n\n@Component({\n  standalone: true,\n  imports: [IconDirective, NgIf, TooltipModule, PopoverModule, C8yTranslatePipe, FormsModule],\n  selector: 'c8y-html-widget-advanced-settings',\n  templateUrl: './advanced-settings.component.html'\n})\nexport class AdvancedSettingsComponent {\n  widgetConfigService = inject(WidgetConfigService);\n  htmlWidgetConfigService = inject(HtmlWidgetConfigService);\n  router = inject(Router);\n  permissionService = inject(Permissions);\n\n  canChangeSettings = false;\n  @Input()\n  devMode: boolean;\n  @Input()\n  cssEncapsulation: boolean;\n\n  CSS_ENCAPSULATION_HELP_CONTEXT = gettext(\n    'If enabled, the CSS will be encapsulated and no platform styling will be applied.'\n  );\n\n  ngOnInit(): void {\n    this.canChangeSettings = this.permissionService.hasAnyRole([\n      Permissions.ROLE_APPLICATION_MANAGEMENT_ADMIN,\n      Permissions.ROLE_TENANT_ADMIN\n    ]);\n  }\n\n  disableAdvancedMode() {\n    const config = this.htmlWidgetConfigService.initDefaultMode();\n    this.htmlWidgetConfigService.save(config);\n    this.htmlWidgetConfigService.configChanged$.next(config);\n  }\n\n  enableAdvancedMode() {\n    let { config } = this.widgetConfigService.currentConfig as HtmlWidgetConfig;\n    config = this.htmlWidgetConfigService.enableAdvancedMode(config);\n    this.htmlWidgetConfigService.save(config);\n    this.htmlWidgetConfigService.configChanged$.next(config);\n  }\n\n  toggleAdvancedMode() {\n    this.devMode ? this.disableAdvancedMode() : this.enableAdvancedMode();\n    this.devMode = !this.devMode;\n  }\n\n  async changeOption(option: keyof HtmlWidgetOptions) {\n    const { config } = this.widgetConfigService.currentConfig as HtmlWidgetConfig;\n    config.options[option] = !config.options[option];\n    this.htmlWidgetConfigService.save(config);\n    this.htmlWidgetConfigService.configChanged$.next(config);\n  }\n}\n","<fieldset class=\"c8y-fieldset m-t-0\">\n  <legend>{{ 'Developer mode' | translate }}</legend>\n\n  <div class=\"d-flex a-i-center p-b-16\">\n    <label class=\"c8y-switch\">\n      <input\n        type=\"checkbox\"\n        [ngModel]=\"devMode\"\n        (change)=\"toggleAdvancedMode()\"\n        [disabled]=\"!canChangeSettings\"\n      />\n      <span></span>\n      <span>{{ 'Advanced developer mode' | translate }}</span>\n    </label>\n\n    <button class=\"btn-help\"\n      [attr.aria-label]=\"'Help' | translate\"\n      [popover]=\"devMode ? disableAdvanced : enableAdvanced\"\n      container=\"body\"\n      placement=\"right\"\n      triggers=\"focus\"\n      type=\"button\"\n    ></button>\n\n    <ng-template #enableAdvanced>\n      <p class=\"text-16 text-bold p-b-8\">\n        <i [c8yIcon]=\"'imac-settings'\"></i>\n        {{ 'Advanced developer mode' | translate }}\n      </p>\n      <p class=\"p-b-8\" translate>\n        Create custom widgets by modifying a basic WebComponent with HTML and JavaScript. This\n        <strong>unsupported</strong>\n        feature is ideal for rapid prototyping and simple customizations.\n      </p>\n      <p class=\"p-b-8\" translate>\n        For production environments, we recommend our fully-supported Angular-based\n        <a href=\"https://styleguide.cumulocity.com\" target=\"_blank\">Web SDK</a>.\n        <br />\n        Enable advanced developer mode to start coding!\n      </p>\n    </ng-template>\n\n    <ng-template #disableAdvanced>\n      <p class=\"text-16 text-bold p-b-8\">\n        {{ 'Advanced developer mode' | translate }}\n      </p>\n      <p class=\"p-b-8\" translate>\n        The advanced developer mode is enabled for this widget allowing to build extensive Web\n        Components.\n      </p>\n      <p class=\"p-b-8\" translate>\n        You can disable this mode again, but it will reset the current code.\n      </p>\n    </ng-template>\n\n    <ng-container *ngIf=\"!devMode\">\n      <label\n        class=\"c8y-switch m-l-auto\"\n      >\n        <input\n          type=\"checkbox\"\n          (change)=\"changeOption('cssEncapsulation')\"\n          [disabled]=\"!canChangeSettings\"\n          [ngModel]=\"cssEncapsulation\"\n        />\n        <span></span>\n        <span>{{ 'CSS encapsulation' | translate }}</span>\n      </label>\n      <button\n        class=\"btn-help m-0\"\n        [attr.aria-label]=\"'Help' | translate\"\n        popover=\"{{ CSS_ENCAPSULATION_HELP_CONTEXT | translate }}\"\n        triggers=\"focus\"\n        placement=\"left\"\n        container=\"body\"\n        type=\"button\"\n      ></button>\n    </ng-container>\n\n  </div>\n</fieldset>\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { C8yTranslatePipe, IconDirective } from '@c8y/ngx-components';\nimport { ToolCallPart } from '@c8y/ngx-components/ai';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { HtmlWidgetConfigService } from './html-widget-config.service';\n\n@Component({\n  selector: 'c8y-html-ai-chat-tool-details',\n  templateUrl: './html-ai-chat-tool-details.component.html',\n  imports: [TooltipDirective, C8yTranslatePipe, IconDirective],\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class HtmlAiChatToolDetailsComponent {\n  tool = input.required<ToolCallPart<{ code: string }>>();\n  code = computed(() => this.tool().input?.code || '');\n  isExecuting = computed(() => this.tool().type !== 'tool-result');\n\n  private readonly htmlWidgetConfigService = inject(HtmlWidgetConfigService);\n\n  /**\n   * Revert to the last applied code.\n   */\n  revert() {\n    this.applyCurrentCode();\n  }\n\n  private applyCurrentCode() {\n    const newConfig = {\n      code: this.code(),\n      css: '',\n      devMode: true,\n      legacy: false,\n      options: { advancedSecurity: false, cssEncapsulation: false }\n    };\n    this.htmlWidgetConfigService.configChanged$.next(newConfig);\n    this.htmlWidgetConfigService.widgetConfigService.updateConfig({ config: newConfig });\n  }\n}\n","<pre\n  class=\"fit-w\"\n  style=\"max-height: 320px\"\n  >{{ code() }}</pre\n>\n@if (!isExecuting()) {\n  <button\n    class=\"btn btn-default btn-sm\"\n    [attr.aria-label]=\"'Revert to this version' | translate\"\n    [tooltip]=\"'Revert to this version' | translate\"\n    container=\"body\"\n    (click)=\"revert()\"\n  >\n    <i c8yIcon=\"undo\"></i>\n  </button>\n}\n","import { NgClass } from '@angular/common';\nimport {\n  Component,\n  ElementRef,\n  inject,\n  Input,\n  OnChanges,\n  OnDestroy,\n  SecurityContext,\n  SimpleChanges,\n  viewChild\n} from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { IIdentified, IManagedObject, InventoryService } from '@c8y/client';\nimport { Alert, ManagedObjectRealtimeService } from '@c8y/ngx-components';\nimport { kebabCase } from 'lodash-es';\nimport {\n  catchError,\n  EMPTY,\n  filter,\n  from,\n  fromEvent,\n  isEmpty,\n  map,\n  merge,\n  Observable,\n  Subject,\n  switchMap,\n  takeUntil\n} from 'rxjs';\nimport { defaultWebComponentName, HtmlWidget, WebcomponentContext } from '../html-widget.model';\nimport { webComponentTemplate } from '../webcomponent-template';\nimport { legacyTemplate } from '../legacy-template';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n  standalone: true,\n  imports: [NgClass],\n  selector: 'c8y-html-frame',\n  templateUrl: './html-frame.component.html',\n  host: { class: 'd-contents' }\n})\nexport class HtmlFrameComponent implements OnChanges, OnDestroy {\n  @Input()\n  config: HtmlWidget;\n\n  @Input()\n  device: IManagedObject | IIdentified;\n\n  @Input()\n  propertyValues$: Observable<Record<string, unknown>> = EMPTY;\n\n  /**\n   * If set to true, it will be ensured that a unique hash is generated\n   * for every webcomponent. This is useful if configured as otherwise it might\n   * happen that the same code is already used in another webcomponent and the\n   * error messages can not be assigned correctly.\n   */\n  @Input()\n  useSalt = false;\n\n  alerts: Alert[] = [];\n\n  private sanitizer = inject(DomSanitizer);\n  private translateService = inject(TranslateService);\n  private moRealtime = inject(ManagedObjectRealtimeService);\n  private destroy$ = new Subject<void>();\n  private hostElement = viewChild<ElementRef<HTMLDivElement>>('hostElement');\n  private reload$ = new Subject<void>();\n  private latestUrl?: string;\n  private htmlContentInitialization$ = this.reload$.pipe(\n    filter(() => !!this.hostElement()),\n    map(() => this.hostElement().nativeElement),\n    switchMap((div: HTMLDivElement) =>\n      merge(\n        this.listenToErrors(),\n        from(this.initDiv(div)).pipe(\n          isEmpty(),\n          filter(isEmpty => !!isEmpty),\n          catchError(error => from([{ text: error, type: 'danger' }]))\n        )\n      )\n    ),\n    filter(alert => !!alert),\n    takeUntil(this.destroy$)\n  );\n  private inventoryService = inject(InventoryService);\n\n  constructor() {\n    this.htmlContentInitialization$.pipe(takeUntil(this.destroy$)).subscribe((alert: Alert) => {\n      this.alerts.push(alert);\n      console.error(alert.text);\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (\n      changes.config?.currentValue ||\n      (this.config && changes.device?.previousValue !== changes.device?.currentValue)\n    ) {\n      this.reloadComponent();\n    }\n  }\n\n  reloadComponent() {\n    this.alerts = [];\n    const div = this.hostElement();\n    div.nativeElement.innerHTML = '';\n    this.reload$.next();\n  }\n\n  async initDiv(divHostElement: HTMLDivElement) {\n    const code = this.getCode();\n    const hash = await this.generateHash(code, this.useSalt);\n    const webComponentName = kebabCase(defaultWebComponentName) + hash;\n    const context: IManagedObject = await this.getContext(this.device);\n\n    if (customElements.get(webComponentName)) {\n      return this.createWebComponent(webComponentName, divHostElement, context);\n    }\n\n    const url = this.generateUrl(code);\n    const defaultModule = await this.loadScript(url);\n\n    // if the default module is a string, we will not use a webcomponent\n    // instead we will simply parse the string and add it to the div\n    // this is the case for legacy HTML widgets\n    if (typeof defaultModule.default === 'string') {\n      divHostElement.innerHTML = defaultModule.default;\n      return EMPTY;\n    }\n\n    // same goes for an HTML Element\n    if (defaultModule.default instanceof HTMLElement) {\n      divHostElement.appendChild(defaultModule.default);\n\n      // Find and execute scripts\n      const scripts = divHostElement.querySelectorAll('script');\n      scripts.forEach(script => {\n        const newScript = document.createElement('script');\n        Array.from(script.attributes).forEach(attr => {\n          newScript.setAttribute(attr.name, attr.value);\n        });\n        newScript.textContent = script.textContent;\n        script.parentNode.replaceChild(newScript, script);\n      });\n      return EMPTY;\n    }\n\n    // as a race condition can happen on loading, we need\n    // to check again if the web component is already defined\n    if (!customElements.get(webComponentName)) {\n      customElements.define(webComponentName, defaultModule.default);\n    }\n    this.createWebComponent(webComponentName, divHostElement, context);\n    return EMPTY;\n  }\n\n  private async getContext(\n    device: IManagedObject | IIdentified | undefined\n  ): Promise<IManagedObject> {\n    if (!device) {\n      return;\n    }\n\n    if (!device.self) {\n      const { data } = await this.inventoryService.detail(device.id);\n      return data;\n    }\n    return device as IManagedObject;\n  }\n\n  private async loadScript(url: string): Promise<{ default: any }> {\n    const module = await import(/* webpackIgnore: true */ url);\n    if (!module.default) {\n      throw 'No default export found. Add an \"export default\" statement to your code.';\n    }\n\n    return module;\n  }\n\n  private generateUrl(script: string): string {\n    const blob = new Blob([script], { type: 'application/javascript' });\n    const url = URL.createObjectURL(blob);\n    if (this.latestUrl) {\n      URL.revokeObjectURL(this.latestUrl);\n    }\n    this.latestUrl = url;\n    return url;\n  }\n\n  private listenToErrors(): Observable<Alert> {\n    const errorEvents$ = fromEvent<ErrorEvent>(window, 'error').pipe(\n      filter(event => event.filename?.includes(this.latestUrl)),\n      map(event => this.mapErrorEventToAlert(event))\n    );\n\n    const rejectionEvents$ = fromEvent<PromiseRejectionEvent>(window, 'unhandledrejection').pipe(\n      filter(event => event.reason?.stack?.includes(this.latestUrl)),\n      map(event => this.mapErrorEventToAlert(event)),\n      takeUntil(this.destroy$)\n    );\n\n    return merge(errorEvents$, rejectionEvents$);\n  }\n\n  private createWebComponent(\n    webComponentName: string,\n    divHostElement: HTMLDivElement,\n    context: IManagedObject\n  ) {\n    const webComponent: WebcomponentContext = document.createElement<any>(webComponentName);\n    const instantTranslate = this.translateService.instant.bind(this.translateService);\n    webComponent.c8yTranslate = instantTranslate;\n\n    // TODO: should c8yContext be updated in realtime and also connected under global time controls?\n    webComponent.c8yContext = context;\n    if (context?.id) {\n      this.moRealtime\n        .onAll$(context.id)\n        .pipe(takeUntil(merge(this.reload$, this.destroy$)))\n        .subscribe(res => {\n          webComponent.c8yContext = res.data as IManagedObject;\n        });\n    }\n    this.propertyValues$.pipe(takeUntil(merge(this.reload$, this.destroy$))).subscribe(values => {\n      webComponent.c8yProperties = values;\n    });\n    divHostElement.appendChild(webComponent);\n    return webComponent;\n  }\n\n  private mapErrorEventToAlert(event: PromiseRejectionEvent | ErrorEvent): Alert {\n    const hasReason = 'reason' in event;\n    if (hasReason && event.reason?.name === ReferenceError.name) {\n      const undefinedVar = event.reason.message.split(' ')[0];\n      return { text: undefinedVar + ' is not defined', type: 'info' };\n    }\n    return { text: hasReason ? event.reason.message : event.message, type: 'danger' };\n  }\n\n  private getCode() {\n    const isDevMode = this.config.devMode;\n    if (isDevMode) {\n      return this.config.code;\n    }\n    return this.createDefaultWebcomponentCode();\n  }\n\n  private async generateHash(value: string, useSalt: boolean): Promise<string> {\n    const encoder = new TextEncoder();\n    const data = encoder.encode(value + (useSalt ? Math.random() : ''));\n    const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n    const hashArray = Array.from(new Uint8Array(hashBuffer));\n    const hashHex = hashArray.map(byte => byte.toString(16).padStart(2, '0')).join('');\n    return hashHex;\n  }\n\n  private createDefaultWebcomponentCode(): string {\n    if (this.config.legacy) {\n      const legacyWebComponent = legacyTemplate(\n        this.config.options.advancedSecurity\n          ? this.sanitizer.sanitize(SecurityContext.HTML, this.config.code)\n          : this.config.code,\n        this.device?.id,\n        this.device?.name\n      );\n      return legacyWebComponent;\n    }\n\n    const webComponentScript = webComponentTemplate(\n      this.config.options.advancedSecurity\n        ? this.sanitizer.sanitize(SecurityContext.HTML, this.config.code)\n        : this.config.code,\n      this.config.options.advancedSecurity\n        ? this.sanitizer.sanitize(SecurityContext.STYLE, this.config.css)\n        : this.config.css,\n      this.config.options.cssEncapsulation\n    );\n    return webComponentScript;\n  }\n}\n","@for (alert of alerts; track alert) {\n  <div\n    class=\"alert m-8\"\n    role=\"alert\"\n    [ngClass]=\"{\n      'alert-danger': alert.type === 'danger',\n      'alert-warning': alert.type === 'warning',\n      'alert-info': alert.type === 'info',\n      'alert-success': alert.type === 'success'\n    }\"\n  >\n    <p><strong translate>There was an issue in the HTML widget:</strong></p>\n    <pre>{{ alert.text }}</pre>\n  </div>\n}\n<div\n  class=\"fit-w fit-h\"\n  #hostElement\n></div>\n","import { AsyncPipe } from '@angular/common';\nimport { Component, inject, Input, OnDestroy, SimpleChanges, ViewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { C8yTranslatePipe, IconDirective, LoadingComponent, TabsModule } from '@c8y/ngx-components';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport {\n  WidgetConfigFeedbackComponent,\n  WidgetConfigService,\n  quoteAndEscape\n} from '@c8y/ngx-components/context-dashboard';\nimport { EditorComponent } from '@c8y/ngx-components/editor';\nimport type * as Monaco from 'monaco-editor';\nimport { map, Subject, takeUntil } from 'rxjs';\nimport { HtmlWidgetConfigService } from '../html-widget-config.service';\nimport { HtmlWidget } from '../html-widget.model';\nimport { AdvancedSettingsComponent } from '../advanced-settings/advanced-settings.component';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n  standalone: true,\n  imports: [\n    AsyncPipe,\n    EditorComponent,\n    FormsModule,\n    IconDirective,\n    C8yTranslatePipe,\n    WidgetConfigFeedbackComponent,\n    TabsModule,\n    TooltipModule,\n    PopoverModule,\n    BsDropdownModule,\n    LoadingComponent,\n    AdvancedSettingsComponent\n  ],\n  selector: 'c8y-widget-code-editor',\n  templateUrl: './widget-code-editor.component.html'\n})\nexport class WidgetCodeEditorComponent implements OnDestroy {\n  @Input()\n  mode: 'code' | 'css' = 'code';\n\n  @Input()\n  config: HtmlWidget;\n\n  @ViewChild(EditorComponent) editorComponent!: EditorComponent;\n\n  configService = inject(HtmlWidgetConfigService);\n  translate = inject(TranslateService);\n  private widgetConfigService = inject(WidgetConfigService);\n\n  propertyKeys$ = this.widgetConfigService.currentConfig$.pipe(\n    map(config => Object.keys(config?.properties || {}).sort((a, b) => a.localeCompare(b)))\n  );\n\n  editor: Monaco.editor.IStandaloneCodeEditor;\n  isAutoSaveEnabled = true;\n  language: 'html' | 'css' | 'javascript' = 'html';\n  value: string;\n  isLoading = false;\n\n  readonly TAB_WEBCOMPONENT_LABEL = gettext('Web Component`Tab label of HTML Widget`');\n  readonly TAB_HTML_LABEL = gettext('HTML`Tab label of HTML Widget`');\n  readonly TAB_CSS_LABEL = gettext('CSS`Tab label of HTML Widget`');\n  readonly BUTTON_DISABLE_AUTOSAVE_LABEL = gettext(\n    'Disable auto save`An action you can do on the html widget editor`'\n  );\n  readonly BUTTON_ENABLE_AUTOSAVE_LABEL = gettext(\n    'Enable auto save`An action you can do on the html widget editor`'\n  );\n  readonly TAB_OUTLET_NAME = 'html-widget-tab-outlet';\n\n  private destroy$ = new Subject<void>();\n  private suggestionProviders: Monaco.IDisposable[] = [];\n\n  ngOnDestroy(): void {\n    this.suggestionProviders.forEach(a => a.dispose());\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes.config) {\n      this.changeCode(this.config.code);\n    }\n\n    if (changes.config?.currentValue) {\n      this.loadCode();\n    }\n  }\n\n  loadCode() {\n    this.isLoading = true;\n    const isInDevMode = this.config?.devMode;\n    this.language = 'html';\n\n    if (isInDevMode) {\n      this.language = 'javascript';\n    }\n\n    if (this.mode === 'css') {\n      this.language = 'css';\n    }\n\n    this.value = this.mode === 'code' ? this.config.code : this.config.css;\n\n    this.isLoading = false;\n\n    if (this.editor) {\n      queueMicrotask(() => this.formatCode());\n    }\n  }\n\n  switchMode(mode: 'code' | 'css') {\n    this.mode = mode;\n    this.loadCode();\n  }\n\n  editorLoaded(editor: Monaco.editor.IStandaloneCodeEditor) {\n    this.editor = editor;\n    const monaco = this.editorComponent.monaco;\n    this.editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, () => {\n      this.saveCode();\n    });\n\n    this.propertyKeys$.pipe(takeUntil(this.destroy$)).subscribe(keys => {\n      this.registerPropertySuggestions(keys);\n    });\n  }\n\n  formatCode() {\n    this.editor.getAction('editor.action.formatDocument').run();\n  }\n\n  redo() {\n    this.editor.trigger('keyboard', 'redo', null);\n  }\n\n  undo() {\n    this.editor.trigger('keyboard', 'undo', null);\n  }\n\n  changeCode($event: string) {\n    if (this.isAutoSaveEnabled) {\n      this.saveCode($event);\n    }\n  }\n\n  saveCode(codeStr?: string) {\n    const code = codeStr || this.editor.getValue();\n    if (this.mode === 'code') {\n      this.configService.changeCode(code);\n      return;\n    }\n    this.configService.changeCss(code);\n  }\n\n  insertPropertyAtCursor(key: string) {\n    if (!this.editor) {\n      return;\n    }\n    const text = this.getFormattedPropertyExpression(key);\n\n    const monaco = this.editorComponent.monaco;\n    const position = this.editor.getPosition();\n    const range = new monaco.Range(\n      position.lineNumber,\n      position.column,\n      position.lineNumber,\n      position.column\n    );\n\n    this.editor.executeEdits('insert-property', [{ range, text, forceMoveMarkers: true }]);\n    this.editor.focus();\n  }\n\n  private registerPropertySuggestions(keys: string[]) {\n    this.suggestionProviders.forEach(a => a.dispose());\n    this.suggestionProviders = [];\n\n    if (!keys.length) return;\n\n    const monaco = this.editorComponent.monaco;\n\n    const providerOptions: Monaco.languages.CompletionItemProvider = {\n      triggerCharacters: ['$', '.', '[', \"'\"],\n      provideCompletionItems: (model, position) => {\n        const lineText = model.getValueInRange({\n          startLineNumber: position.lineNumber,\n          startColumn: 1,\n          endLineNumber: position.lineNumber,\n          endColumn: position.column\n        });\n\n        const makeRange = (startColumn: number): Monaco.IRange => ({\n          startLineNumber: position.lineNumber,\n          endLineNumber: position.lineNumber,\n          startColumn,\n          endColumn: position.column\n        });\n\n        // Case 1: after dot access – this.c8yProperties?. or this.c8yProperties.\n        const dotMatch = /this\\.c8yProperties\\??\\.(\\w*)$/.exec(lineText);\n        if (dotMatch) {\n          const typed = dotMatch[1];\n          const startColumn = position.column - typed.length;\n          const suggestions: Monaco.languages.CompletionItem[] = keys\n            .filter(key => !/[^a-zA-Z0-9_]/.test(key) && key.startsWith(typed))\n            .map(key => ({\n              label: key,\n              kind: monaco.languages.CompletionItemKind.Property,\n              insertText: key,\n              range: makeRange(startColumn),\n              sortText: key\n            }));\n          return { suggestions };\n        }\n\n        // Case 2: after bracket access – this.c8yProperties?.[ or this.c8yProperties[\n        const bracketMatch = /this\\.c8yProperties(?:\\?\\.)?\\[([^\\]]*)$/.exec(lineText);\n        if (bracketMatch) {\n          const typed = bracketMatch[1];\n          const charAfterCursor = model.getValueInRange({\n            startLineNumber: position.lineNumber,\n            startColumn: position.column,\n            endLineNumber: position.lineNumber,\n            endColumn: position.column + 1\n          });\n          const closingBracketAlreadyPresent = charAfterCursor === ']';\n          const startColumn = position.column - typed.length;\n          const endColumn = closingBracketAlreadyPresent ? position.column + 1 : position.column;\n          const suggestions: Monaco.languages.CompletionItem[] = keys.map(key => ({\n            label: key,\n            kind: monaco.languages.CompletionItemKind.Property,\n            insertText: `${quoteAndEscape(key)}]`,\n            range: {\n              startLineNumber: position.lineNumber,\n              endLineNumber: position.lineNumber,\n              startColumn,\n              endColumn\n            },\n            sortText: key\n          }));\n          return { suggestions };\n        }\n\n        // Case 3: fresh new expression – cursor is at a word boundary and the user\n        // has started typing a key name.\n        const freshMatch = /(?:^|[\\s=(<>,;{}\\[\\]\"'`])(\\w*)$/.exec(lineText);\n        if (freshMatch) {\n          const typed = freshMatch[1];\n          if (!typed) return { suggestions: [] };\n          const startColumn = position.column - typed.length;\n          const suggestions: Monaco.languages.CompletionItem[] = keys\n            .filter(key => key.startsWith(typed))\n            .map(key => {\n              const insertText = this.getFormattedPropertyExpression(key);\n              return {\n                label: key,\n                kind: monaco.languages.CompletionItemKind.Property,\n                insertText,\n                range: makeRange(startColumn),\n                detail: insertText,\n                filterText: key,\n                sortText: key\n              };\n            });\n          return { suggestions };\n        }\n\n        return { suggestions: [] };\n      }\n    };\n\n    this.suggestionProviders.push(\n      monaco.languages.registerCompletionItemProvider('html', providerOptions),\n      monaco.languages.registerCompletionItemProvider('javascript', providerOptions)\n    );\n  }\n\n  private getFormattedPropertyExpression(key: string): string {\n    const nonAlphanumericRegex = /[^a-zA-Z0-9]/;\n    const formattedKey = nonAlphanumericRegex.test(key) ? `[${quoteAndEscape(key)}]` : `${key}`;\n    return '${this.c8yProperties?.' + formattedKey + '}';\n  }\n}\n","<c8y-widget-config-feedback>\n  <div class=\"d-flex\">\n    @if (config?.devMode && !config?.legacy) {\n      <span\n        class=\"tag tag--warning text-12\"\n        translate\n      >\n        Advanced developer mode\n      </span>\n    }\n  </div>\n  <div class=\"d-flex\">\n    @if (config?.legacy) {\n      <span\n        class=\"tag tag--warning text-12\"\n        [title]=\"\n          'This widget is in legacy mode. Consider to upgrade this to a new HTML widget. Read our documentation on details to transform your widget'\n            | translate\n        \"\n        translate\n      >\n        Legacy mode\n      </span>\n    }\n  </div>\n</c8y-widget-config-feedback>\n\n<div class=\"d-flex d-col fit-h fit-w\">\n  <c8y-html-widget-advanced-settings\n    [devMode]=\"config?.devMode\"\n    [cssEncapsulation]=\"config?.options?.cssEncapsulation\"\n  ></c8y-html-widget-advanced-settings>\n\n  <fieldset class=\"c8y-fieldset p-0 overflow-hidden\">\n    <legend class=\"m-l-16 p-l-0\">{{ 'Code' | translate }}</legend>\n\n    <div class=\"btn-group btn-group-sm m-l-0 p-t-8 p-b-8 p-l-16 p-r-16 fit-w d-flex\">\n      <button\n        class=\"btn btn-default\"\n        [attr.aria-label]=\"'Undo' | translate\"\n        [tooltip]=\"'Undo' | translate\"\n        placement=\"top\"\n        container=\"body\"\n        type=\"button\"\n        [delay]=\"500\"\n        (click)=\"undo()\"\n      >\n        <i [c8yIcon]=\"'undo'\"></i>\n      </button>\n\n      <button\n        class=\"btn btn-default\"\n        [attr.aria-label]=\"'Redo' | translate\"\n        [tooltip]=\"'Redo' | translate\"\n        placement=\"top\"\n        container=\"body\"\n        type=\"button\"\n        [delay]=\"500\"\n        (click)=\"redo()\"\n      >\n        <i [c8yIcon]=\"'redo'\"></i>\n      </button>\n\n      <button\n        class=\"btn btn-default\"\n        [attr.aria-label]=\"'Format code' | translate\"\n        [tooltip]=\"'Format code' | translate\"\n        placement=\"top\"\n        container=\"body\"\n        type=\"button\"\n        [delay]=\"500\"\n        (click)=\"formatCode()\"\n      >\n        <i [c8yIcon]=\"'format-align-left'\"></i>\n      </button>\n\n      @let propertyKeys = propertyKeys$ | async;\n      @if (mode !== 'css' && propertyKeys?.length) {\n        <div\n          class=\"btn-group btn-group-sm m-l-4\"\n          container=\"body\"\n          dropdown\n        >\n          <button\n            class=\"btn btn-default\"\n            [attr.aria-label]=\"'Insert property' | translate\"\n            [tooltip]=\"'Insert property' | translate\"\n            placement=\"top\"\n            container=\"body\"\n            type=\"button\"\n            [delay]=\"500\"\n            dropdownToggle\n          >\n            <i [c8yIcon]=\"'plus-circle'\"></i>\n          </button>\n          <ul\n            class=\"dropdown-menu\"\n            *dropdownMenu\n          >\n            @for (key of propertyKeys; track key) {\n              <li>\n                <button\n                  class=\"dropdown-item\"\n                  type=\"button\"\n                  (click)=\"insertPropertyAtCursor(key)\"\n                >\n                  {{ key }}\n                </button>\n              </li>\n            }\n          </ul>\n        </div>\n      }\n\n      <label class=\"c8y-switch m-l-auto\">\n        <input\n          type=\"checkbox\"\n          [checked]=\"isAutoSaveEnabled\"\n          (change)=\"isAutoSaveEnabled = !isAutoSaveEnabled\"\n        />\n        <span></span>\n        <span translate>Auto save</span>\n      </label>\n    </div>\n\n    <div\n      class=\"btn-toolbar m-0 p-relative\"\n      role=\"toolbar\"\n    >\n      <c8y-tabs-outlet\n        class=\"elevation-none\"\n        [outletName]=\"TAB_OUTLET_NAME\"\n        [orientation]=\"'horizontal'\"\n        [openFirstTab]=\"false\"\n      ></c8y-tabs-outlet>\n      <c8y-tab\n        [icon]=\"'code'\"\n        [label]=\"(config?.devMode ? TAB_WEBCOMPONENT_LABEL : TAB_HTML_LABEL) | translate\"\n        [priority]=\"100\"\n        [showAlways]=\"true\"\n        [tabsOutlet]=\"TAB_OUTLET_NAME\"\n        [isActive]=\"mode === 'code'\"\n        (onSelect)=\"switchMode('code')\"\n      ></c8y-tab>\n      @if (!config?.devMode && !config?.legacy) {\n        <c8y-tab\n          [icon]=\"'c8y-css'\"\n          [label]=\"TAB_CSS_LABEL | translate\"\n          [priority]=\"0\"\n          [tabsOutlet]=\"TAB_OUTLET_NAME\"\n          [isActive]=\"mode === 'css'\"\n          (onSelect)=\"switchMode('css')\"\n        ></c8y-tab>\n      }\n    </div>\n\n    @if (!isLoading) {\n      @if (!(mode === 'css' && config?.devMode)) {\n        <c8y-editor\n          class=\"flex-grow d-block\"\n          style=\"height: 450px\"\n          [ngModel]=\"value\"\n          (ngModelChange)=\"changeCode($event)\"\n          [editorOptions]=\"{\n            language,\n            tabSize: 2,\n            insertSpaces: true,\n            minimap: { enabled: false }\n          }\"\n          (editorInit)=\"editorLoaded($event)\"\n        ></c8y-editor>\n      }\n    } @else {\n      <c8y-loading></c8y-loading>\n    }\n  </fieldset>\n</div>\n","import { AsyncPipe } from '@angular/common';\nimport { Component, DestroyRef, inject, OnDestroy, TemplateRef, ViewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\nimport { AlertService, OptionsService } from '@c8y/ngx-components';\nimport {\n  AssetPropertyMappingKeyRenamedNotification,\n  AssetPropertyMappingsService,\n  WidgetConfigService,\n  renamePropertyKeyInCode\n} from '@c8y/ngx-components/context-dashboard';\nimport {\n  GlobalContextState,\n  LocalControlsComponent,\n  PRESET_NAME,\n  PresetName,\n  REFRESH_OPTION\n} from '@c8y/ngx-components/global-context';\nimport { HtmlWidgetConfig } from './html-widget.model';\nimport { HtmlFrameComponent } from './html-frame/html-frame.component';\nimport { HtmlWidgetConfigService } from './html-widget-config.service';\nimport { WidgetCodeEditorComponent } from './widget-code-editor-section/widget-code-editor.component';\nimport { distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\n@Component({\n  selector: 'c8y-html-widget-config',\n  templateUrl: './html-widget-config.component.html',\n  standalone: true,\n  imports: [\n    RouterModule,\n    FormsModule,\n    AsyncPipe,\n    HtmlFrameComponent,\n    WidgetCodeEditorComponent,\n    LocalControlsComponent\n  ]\n})\nexport class HtmlWidgetConfigComponent implements OnDestroy {\n  @ViewChild('htmlPreview')\n  set htmlPreviewTemplate(template: TemplateRef<any>) {\n    if (template) {\n      this.widgetConfigService.setPreview(template);\n    } else {\n      this.widgetConfigService.setPreview(null);\n    }\n  }\n  alert = inject(AlertService);\n  options = inject(OptionsService);\n  htmlWidgetConfigService = inject(HtmlWidgetConfigService);\n  widgetConfigService = inject(WidgetConfigService);\n  assetPropertyMappings = inject(AssetPropertyMappingsService);\n  controls: PresetName = PRESET_NAME.AUTO_REFRESH_ONLY;\n  private readonly destroyRef = inject(DestroyRef);\n  private realtimeControl$ = this.widgetConfigService.currentConfig$.pipe(\n    map(\n      config =>\n        config?.refreshOption === REFRESH_OPTION.LIVE && config?.isAutoRefreshEnabled === true\n    ),\n    distinctUntilChanged()\n  );\n  propertyValues$ = this.widgetConfigService.currentConfig$.pipe(\n    switchMap(config =>\n      this.assetPropertyMappings.getValues$(config?.properties, this.realtimeControl$)\n    )\n  );\n  globalContextState$ = this.widgetConfigService.currentConfig$.pipe(\n    map(config => config as GlobalContextState)\n  );\n\n  constructor() {\n    this.htmlWidgetConfigService.notify$\n      .pipe(\n        takeUntilDestroyed(this.destroyRef),\n        filter(\n          (n): n is AssetPropertyMappingKeyRenamedNotification =>\n            n.type === 'asset-property-mapping-key-renamed'\n        )\n      )\n      .subscribe(notification => this.handleRename(notification));\n  }\n\n  ngOnDestroy(): void {\n    // sadly the service is component scoped\n    // but still not recycled correctly. That is why we do\n    // it here.\n    this.htmlWidgetConfigService.destroy();\n  }\n\n  private handleRename(notification: AssetPropertyMappingKeyRenamedNotification): void {\n    const { oldKey, newKey } = notification;\n    const htmlWidgetConfig = this.widgetConfigService.currentConfig as HtmlWidgetConfig;\n    if (!htmlWidgetConfig?.config) {\n      return;\n    }\n    const newCode = renamePropertyKeyInCode(htmlWidgetConfig.config.code, oldKey, newKey);\n    if (newCode === htmlWidgetConfig.config.code) {\n      return;\n    }\n    const updated = { ...htmlWidgetConfig.config, code: newCode };\n    this.htmlWidgetConfigService.save(updated);\n    this.htmlWidgetConfigService.configChanged$.next(updated);\n    this.alert.success(gettext('Renamed asset property and updated references in HTML code.'));\n  }\n}\n","<c8y-widget-code-editor\n  [config]=\"htmlWidgetConfigService.config$ | async\"\n  [mode]=\"'code'\"\n></c8y-widget-code-editor>\n\n<ng-template #htmlPreview>\n  @if ((widgetConfigService.currentConfig$ | async)?.displayMode !== 'dashboard') {\n    <c8y-local-controls\n      [controls]=\"controls\"\n      [displayMode]=\"(widgetConfigService.currentConfig$ | async)?.displayMode\"\n      [config]=\"globalContextState$ | async\"\n      [disabled]=\"true\"\n    ></c8y-local-controls>\n  }\n  <c8y-html-frame\n    [config]=\"htmlWidgetConfigService.codeEditorChangeConfig$ | async\"\n    [device]=\"(widgetConfigService.currentConfig$ | async).device\"\n    [propertyValues$]=\"propertyValues$\"\n    [useSalt]=\"true\"\n  ></c8y-html-frame>\n</ng-template>\n","import { AsyncPipe } from '@angular/common';\nimport { Component, inject } from '@angular/core';\nimport { C8yTranslatePipe, ClipboardService } from '@c8y/ngx-components';\nimport {\n  AssetPropertyActionDirective,\n  AssetPropertyListComponent,\n  AssetPropertyType\n} from '@c8y/ngx-components/asset-properties';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\n\n@Component({\n  selector: 'c8y-html-widget-properties-selector',\n  templateUrl: './html-widget-properties-selector.component.html',\n  host: {\n    class: 'bg-level-1'\n  },\n  standalone: true,\n  imports: [\n    AssetPropertyListComponent,\n    AssetPropertyActionDirective,\n    AsyncPipe,\n    C8yTranslatePipe,\n    PopoverModule,\n    TooltipModule\n  ]\n})\nexport class HtmlWidgetPropertiesSelectorComponent {\n  widgetConfigService = inject(WidgetConfigService);\n  clipboardService = inject(ClipboardService);\n\n  /**\n   * Copies the property path to the clipboard in a format suitable for use in HTML widget.\n   * For nested properties, it uses the keyPath to create a path to nested property.\n   * @param context The context containing the property information.\n   */\n  async copyProperty(context: AssetPropertyType) {\n    const nonAlphanumericRegex = /[^a-zA-Z0-9]/;\n    let path: string;\n    if (context.keyPath) {\n      path = context.keyPath\n        .map(key => (nonAlphanumericRegex.test(key) ? `['${key}']` : `.${key}`))\n        .join('');\n    } else {\n      path = nonAlphanumericRegex.test(context.name) ? `['${context.name}']` : `.${context.name}`;\n    }\n    const content = '${this.c8yContext' + path + '}';\n    await this.clipboardService.writeText(content);\n  }\n}\n","<div\n  class=\"d-flex m-b-8\"\n  style=\"margin-top: -16px\"\n>\n  <em\n    class=\"m-l-24 text-muted\"\n    translate\n  >\n    How to use properties in the widget\n  </em>\n  <button\n    class=\"btn-help btn-help--sm\"\n    [attr.aria-label]=\"'Help' | translate\"\n    [popover]=\"helpContent\"\n    placement=\"right\"\n    triggers=\"focus\"\n    container=\"body\"\n    type=\"button\"\n  ></button>\n</div>\n<c8y-asset-property-list\n  class=\"inner-scroll bg-inherit d-block\"\n  style=\"max-height: 450px\"\n  [asset]=\"(widgetConfigService.currentConfig$ | async).device\"\n  [config]=\"{\n    selectMode: 'none',\n    expansionMode: 'expandedByDefault',\n    filterable: false,\n    allowDragAndDrop: true\n  }\"\n>\n  <button\n    class=\"btn-dot btn fit-h\"\n    [attr.aria-label]=\"'Copy' | translate\"\n    tooltip=\"{{ 'Copy' | translate }}\"\n    type=\"button\"\n    *c8yAssetPropertyAction=\"let context\"\n    [delay]=\"500\"\n    (click)=\"copyProperty(context)\"\n  >\n    <i class=\"dlt-c8y-icon-copy\"></i>\n  </button>\n</c8y-asset-property-list>\n\n<ng-template #helpContent>\n  <p\n    class=\"p-b-8\"\n    translate\n  >\n    Click the copy icon next to a property, then paste it into the HTML editor below as a template\n    literal.\n  </p>\n</ng-template>\n","import { Component, computed, inject, input, signal } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { BehaviorSubject } from 'rxjs';\nimport {\n  AssetPropertyMappingsService,\n  ContextWidgetConfig\n} from '@c8y/ngx-components/context-dashboard';\nimport { HtmlFrameComponent } from './html-frame/html-frame.component';\nimport { HtmlWidget, HtmlWidgetConfig } from './html-widget.model';\nimport {\n  DisplayMode,\n  GLOBAL_CONTEXT_DISPLAY_MODE,\n  GlobalContextConnectorComponent,\n  GlobalContextState,\n  LocalControlsComponent,\n  PRESET_NAME,\n  REFRESH_OPTION\n} from '@c8y/ngx-components/global-context';\nimport { DashboardChildComponent } from '@c8y/ngx-components';\n\n@Component({\n  selector: 'c8y-html-widget',\n  templateUrl: './html-widget.component.html',\n  standalone: true,\n  imports: [\n    RouterModule,\n    HtmlFrameComponent,\n    GlobalContextConnectorComponent,\n    LocalControlsComponent\n  ]\n})\nexport class HtmlWidgetComponent {\n  config = input<HtmlWidgetConfig>();\n  private realtimeControl$ = new BehaviorSubject<boolean>(false);\n  propertyValues$ = computed(() =>\n    this.assetPropertiesMappings.getValues$(\n      this.config()?.properties,\n      this.realtimeControl$.asObservable()\n    )\n  );\n\n  private dashboardChild = inject(DashboardChildComponent);\n  displayMode = signal<DisplayMode>(GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD);\n  contextConfig = signal<GlobalContextState>({});\n  isLoading = signal<boolean>(false);\n  /**\n   * Controls link state to global context:\n   * - true/undefined: Widget follows global time context\n   * - false: Widget uses local state, ignores global changes\n   * Set to false when user is interacting (scrolling, zooming) to prevent interruption\n   */\n  isLinkedToGlobal = signal<boolean | undefined>(undefined);\n\n  readonly GLOBAL_CONTEXT_DISPLAY_MODE = GLOBAL_CONTEXT_DISPLAY_MODE;\n  readonly PRESET_NAME = PRESET_NAME;\n\n  private assetPropertiesMappings = inject(AssetPropertyMappingsService);\n\n  ngOnInit(): void {\n    const config = this.config();\n    if (config?.html && !config.config) {\n      config.config = this.mapLegacyConfig(config);\n    }\n\n    const {\n      displayMode = GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD,\n      dateTimeContext,\n      aggregation,\n      isAutoRefreshEnabled,\n      refreshInterval,\n      refreshOption\n    } = config;\n\n    this.displayMode.set(displayMode as DisplayMode);\n    this.contextConfig.set({\n      dateTimeContext,\n      aggregation,\n      isAutoRefreshEnabled,\n      refreshInterval,\n      refreshOption\n    });\n\n    // Initialize realtime from persisted config — controls may be hidden in\n    // config display mode (AUTO_REFRESH_ONLY.config = []), in which case\n    // onContextChange never fires and realtimeControl$ would stay false.\n    this.realtimeControl$.next(this.shouldEnableRealtime());\n  }\n\n  onContextChange(event: { context: GlobalContextState; diff: GlobalContextState }): void {\n    const { context } = event;\n    this.contextConfig.set(context);\n    this.realtimeControl$.next(this.shouldEnableRealtime());\n  }\n\n  getDashboardChild(): DashboardChildComponent {\n    return this.dashboardChild;\n  }\n\n  private shouldEnableRealtime(): boolean {\n    const ctx = this.contextConfig();\n    return ctx.refreshOption === REFRESH_OPTION.LIVE && ctx.isAutoRefreshEnabled === true;\n  }\n\n  private mapLegacyConfig(current: ContextWidgetConfig): HtmlWidget {\n    const isAlreadyInAdvancedMode = current?.config?.devMode === true;\n    if (isAlreadyInAdvancedMode) {\n      return current.config as HtmlWidget;\n    }\n    return {\n      code: current.html,\n      css: '',\n      legacy: true,\n      devMode: false,\n      options: {\n        cssEncapsulation: false,\n        advancedSecurity: current.sanitization === 'strict'\n      }\n    };\n  }\n}\n","@if (displayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n  <c8y-global-context-connector\n    [controls]=\"PRESET_NAME.AUTO_REFRESH_ONLY\"\n    [config]=\"contextConfig()\"\n    [isLoading]=\"isLoading()\"\n    [dashboardChild]=\"getDashboardChild()\"\n    [linked]=\"isLinkedToGlobal()\"\n    [emitRefresh]=\"false\"\n    (configChange)=\"onContextChange($event)\"\n  >\n  </c8y-global-context-connector>\n} @else {\n  <c8y-local-controls\n    [controls]=\"PRESET_NAME.AUTO_REFRESH_ONLY\"\n    [displayMode]=\"displayMode()\"\n    [config]=\"contextConfig()\"\n    [isLoading]=\"isLoading()\"\n    [emitRefresh]=\"false\"\n    (configChange)=\"onContextChange($event)\"\n  >\n  </c8y-local-controls>\n}\n\n<div class=\"p-16\">\n  <c8y-html-frame\n    [config]=\"config().config\"\n    [device]=\"config().device\"\n    [propertyValues$]=\"propertyValues$()\"\n  ></c8y-html-frame>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["isEmpty","i1","i2","map","distinctUntilChanged","switchMap","filter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DO,MAAM,sBAAsB,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgC/B,MAAM,qBAAqB,GAAG;;;;;;;AAQ9B,MAAM,uBAAuB,GAAG;AAEhC,MAAM,uCAAuC,GAAG;;ACtGhD,MAAM,oBAAoB,GAAG,CAClC,IAAY,EACZ,GAAY,EACZ,iBAA2B,EAC3B,IAAI,GAAG,uBAAuB,KAC3B;;EAEH,CAAC,iBAAiB,GAAG,wCAAwC,GAAG,EAAE;;uBAE7C,IAAI,CAAA;;MAErB,GAAG;;;;;;;;;;;;;;;;;mBAkBH;AACE,MAAE;AACF,MAAE;;;;QAIF,IAAI;AAER,IAAA,CAAA,CAAA;;;;;ACvCG,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,QAA0B,EAAE,UAAmB,KAAI;IAC9F,MAAM,WAAW,GAAG;;AAEjB,SAAA,OAAO,CAAC,KAAK,EAAE,MAAM;;AAErB,SAAA,OAAO,CAAC,IAAI,EAAE,KAAK;;AAEnB,SAAA,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;IAExB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;MAyBH,QAAQ,GAAG,CAAA,eAAA,EAAkB,QAAQ,CAAA,UAAA,EAAa,UAAU,CAAA,IAAA,CAAM,GAAG,EAAE;kDAC3B,WAAW,CAAA;;;;;;;;;;;;;;;;;;;;+BAoB9B;AAC/B;;MC1Ba,uBAAuB,CAAA;AADpC,IAAA,WAAA,GAAA;QAEW,IAAA,CAAA,0BAA0B,GAAG,IAAI;AAC1C,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,OAAO,EAA2C;AACpE,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC;AAClC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AACrB,QAAA,IAAA,CAAA,OAAO,GAAyC,IAAI,CAAC,mBAAmB,CAAC,OAAO;AAEzF,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,IAAI,CAClD,KAAK,EAAE,EACP,GAAG,CAAC,OAAO,IAAG;AACZ,YAAA,IAAI,OAAO,CAAC,IAAI,EAAE;gBAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;YAChD;AAEA,YAAA,QAAQ,OAAO,CAAC,MAAM,IAAI,EAAE;QAC9B,CAAC,CAAC,EACF,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,EAC1B,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EACtD,SAAS,CAAC,CAAC,CAAC,YAAY,EAAE,SAAS,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,EAClF,WAAW,EAAE,EACb,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB;QAED,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAEjG,IAAA,CAAA,uBAAuB,GAAG,aAAa,CAAC;YACtC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAC3C,YAAA,IAAI,CAAC;AACN,SAAA,CAAC,CAAC,IAAI,CACL,oBAAoB,EAAE,EACtB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,YAAY,CAAC,IAAI,CAAC,0BAA0B,CAAC,EAC7C,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,KAAI;YACvB,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,OAAO,MAAM;YACf;AACA,YAAA,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE;AACzB,gBAAA,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK;YAC3B;iBAAO;AACL,gBAAA,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK;YAC5B;AACA,YAAA,OAAO,EAAE,GAAG,MAAM,EAAE;QACtB,CAAC,CAAC,CACH;AAED,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,OAAO,EAAc;AAkG3C,IAAA;IAhGC,UAAU,CAAC,SAAwB,EAAE,YAAwB,EAAA;AAC3D,QAAA,MAAM,qBAAqB,GAAG,SAAS,EAAE,+BAA+B,IAAI,KAAK;AACjF,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;AAC3C,QAAA,IAAI,aAAa,IAAI,CAAC,qBAAqB,EAAE;YAC3C,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,SAAS,EAAE,6BAA6B,CAAC;AAC9E,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;AACvB,YAAA,OAAO,EAAE,CAAC,YAAY,CAAC;QACzB;QACA,IAAI,aAAa,EAAE;AACjB,YAAA,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;QACtD;;AAGA,QAAA,MAAM,SAAS,GAAG,EAAE,GAAG,YAAY,EAAE;AACrC,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;AACpB,QAAA,OAAO,EAAE,CAAC,SAAS,CAAC;IACtB;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;IAChC;AAEA,IAAA,IAAI,CAAC,MAAkB,EAAA;AACrB,QAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC;YACpC;AACD,SAAA,CAAC;IACJ;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAChD;AAEA,IAAA,SAAS,CAAC,KAAa,EAAA;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC/C;AAEA,IAAA,kBAAkB,CAAC,aAAyB,EAAA;AAC1C,QAAA,MAAM,WAAW,GAAG,aAAa,EAAE,IAAI,IAAI,sBAAsB;AACjE,QAAA,MAAM,UAAU,GAAG,aAAa,EAAE,GAAG,IAAI,qBAAqB;AAC9D,QAAA,MAAM,IAAI,GAAG,aAAa,EAAE;cACxB,cAAc,CACZ,WAAW,EACX,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,EAClD,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI;cAEtD,oBAAoB,CAAC,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC;AACxD,QAAA,aAAa,GAAG;AACd,YAAA,GAAG,EAAE,EAAE;YACP,IAAI;AACJ,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,OAAO,EAAE;AACP,gBAAA,gBAAgB,EAAE,KAAK;AACvB,gBAAA,gBAAgB,EAAE;AACnB;SACF;AACD,QAAA,OAAO,aAAa;IACtB;IAEA,eAAe,CAAC,gBAAgB,GAAG,IAAI,EAAA;QACrC,OAAO;AACL,YAAA,GAAG,EAAE,qBAAqB;AAC1B,YAAA,IAAI,EAAE,sBAAsB;AAC5B,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,gBAAgB,EAAE,KAAK;gBACvB;AACD;SACF;IACH;AAEQ,IAAA,eAAe,CAAC,OAA4B,EAAA;QAClD,MAAM,uBAAuB,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI;QACjE,IAAI,uBAAuB,EAAE;YAC3B,OAAO,OAAO,CAAC,MAAoB;QACrC;QAEA,MAAM,eAAe,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI;QACxD,IAAI,eAAe,EAAE;YACnB,OAAO,OAAO,CAAC,MAAoB;QACrC;QAEA,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;AAClB,YAAA,GAAG,EAAE,EAAE;AACP,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,gBAAgB,EAAE,KAAK;AACvB,gBAAA,gBAAgB,EAAE,OAAO,CAAC,YAAY,KAAK;AAC5C;SACF;IACH;+GA/IW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAvB,uBAAuB,EAAA,CAAA,CAAA;;4FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC;;;MCXY,yBAAyB,CAAA;AANtC,IAAA,WAAA,GAAA;AAOE,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,QAAA,IAAA,CAAA,uBAAuB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AACzD,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,WAAW,CAAC;QAEvC,IAAA,CAAA,iBAAiB,GAAG,KAAK;AAMzB,QAAA,IAAA,CAAA,8BAA8B,GAAG,OAAO,CACtC,mFAAmF,CACpF;AAiCF,IAAA;IA/BC,QAAQ,GAAA;QACN,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC;AACzD,YAAA,WAAW,CAAC,iCAAiC;AAC7C,YAAA,WAAW,CAAC;AACb,SAAA,CAAC;IACJ;IAEA,mBAAmB,GAAA;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,uBAAuB,CAAC,eAAe,EAAE;AAC7D,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC;QACzC,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1D;IAEA,kBAAkB,GAAA;QAChB,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAiC;QAC3E,MAAM,GAAG,IAAI,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,MAAM,CAAC;AAChE,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC;QACzC,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1D;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACrE,QAAA,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO;IAC9B;IAEA,MAAM,YAAY,CAAC,MAA+B,EAAA;QAChD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAiC;AAC7E,QAAA,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;AAChD,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC;QACzC,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1D;+GA9CW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClBtC,snFAiFA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDnEY,aAAa,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,IAAI,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAoB,WAAW,2gBAA7B,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIlE,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBANrC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,IAAI,EAAA,OAAA,EACP,CAAC,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,CAAC,YACjF,mCAAmC,EAAA,QAAA,EAAA,snFAAA,EAAA;;sBAU5C;;sBAEA;;;MEdU,8BAA8B,CAAA;AAP3C,IAAA,WAAA,GAAA;AAQE,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAkC;AACvD,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,gDAAC;AACpD,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,aAAa,uDAAC;AAE/C,QAAA,IAAA,CAAA,uBAAuB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAoB3E,IAAA;AAlBC;;AAEG;IACH,MAAM,GAAA;QACJ,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEQ,gBAAgB,GAAA;AACtB,QAAA,MAAM,SAAS,GAAG;AAChB,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AACjB,YAAA,GAAG,EAAE,EAAE;AACP,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK;SAC5D;QACD,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;AAC3D,QAAA,IAAI,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACtF;+GAxBW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,yNCb3C,yXAgBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDPY,gBAAgB,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,OAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAoB,aAAa,sEAA/B,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAIjC,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAP1C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,+BAA+B,EAAA,OAAA,EAEhC,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,CAAC,EAAA,UAAA,EAChD,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,yXAAA,EAAA;;;ME+BpC,kBAAkB,CAAA;AA8C7B,IAAA,WAAA,GAAA;QAtCA,IAAA,CAAA,eAAe,GAAwC,KAAK;AAE5D;;;;;AAKG;QAEH,IAAA,CAAA,OAAO,GAAG,KAAK;QAEf,IAAA,CAAA,MAAM,GAAY,EAAE;AAEZ,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAChC,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3C,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,4BAA4B,CAAC;AACjD,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAC9B,QAAA,IAAA,CAAA,WAAW,GAAG,SAAS,CAA6B,aAAa,uDAAC;AAClE,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,OAAO,EAAQ;QAE7B,IAAA,CAAA,0BAA0B,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CACpD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAClC,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,EAC3C,SAAS,CAAC,CAAC,GAAmB,KAC5B,KAAK,CACH,IAAI,CAAC,cAAc,EAAE,EACrB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAC1BA,SAAO,EAAE,EACT,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,EAC5B,UAAU,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAC7D,CACF,CACF,EACD,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,EACxB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB;AACO,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAGjD,QAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAY,KAAI;AACxF,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AACvB,YAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;AAC3B,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC1B;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IACE,OAAO,CAAC,MAAM,EAAE,YAAY;AAC5B,aAAC,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAC/E;YACA,IAAI,CAAC,eAAe,EAAE;QACxB;IACF;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE;AAChB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,GAAG,CAAC,aAAa,CAAC,SAAS,GAAG,EAAE;AAChC,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;IAEA,MAAM,OAAO,CAAC,cAA8B,EAAA;AAC1C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;AAC3B,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC;QACxD,MAAM,gBAAgB,GAAG,SAAS,CAAC,uBAAuB,CAAC,GAAG,IAAI;QAClE,MAAM,OAAO,GAAmB,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;AAElE,QAAA,IAAI,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE;YACxC,OAAO,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,cAAc,EAAE,OAAO,CAAC;QAC3E;QAEA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAClC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;;;;AAKhD,QAAA,IAAI,OAAO,aAAa,CAAC,OAAO,KAAK,QAAQ,EAAE;AAC7C,YAAA,cAAc,CAAC,SAAS,GAAG,aAAa,CAAC,OAAO;AAChD,YAAA,OAAO,KAAK;QACd;;AAGA,QAAA,IAAI,aAAa,CAAC,OAAO,YAAY,WAAW,EAAE;AAChD,YAAA,cAAc,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC;;YAGjD,MAAM,OAAO,GAAG,cAAc,CAAC,gBAAgB,CAAC,QAAQ,CAAC;AACzD,YAAA,OAAO,CAAC,OAAO,CAAC,MAAM,IAAG;gBACvB,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAClD,gBAAA,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,IAAI,IAAG;oBAC3C,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;AAC/C,gBAAA,CAAC,CAAC;AACF,gBAAA,SAAS,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW;gBAC1C,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC;AACnD,YAAA,CAAC,CAAC;AACF,YAAA,OAAO,KAAK;QACd;;;QAIA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE;YACzC,cAAc,CAAC,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC,OAAO,CAAC;QAChE;QACA,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,cAAc,EAAE,OAAO,CAAC;AAClE,QAAA,OAAO,KAAK;IACd;IAEQ,MAAM,UAAU,CACtB,MAAgD,EAAA;QAEhD,IAAI,CAAC,MAAM,EAAE;YACX;QACF;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AAChB,YAAA,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AAC9D,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,MAAwB;IACjC;IAEQ,MAAM,UAAU,CAAC,GAAW,EAAA;QAClC,MAAM,MAAM,GAAG,MAAM,iCAAiC,GAAG,CAAC;AAC1D,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AACnB,YAAA,MAAM,0EAA0E;QAClF;AAEA,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,WAAW,CAAC,MAAc,EAAA;AAChC,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;QACnE,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACrC,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;QACrC;AACA,QAAA,IAAI,CAAC,SAAS,GAAG,GAAG;AACpB,QAAA,OAAO,GAAG;IACZ;IAEQ,cAAc,GAAA;AACpB,QAAA,MAAM,YAAY,GAAG,SAAS,CAAa,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAC9D,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EACzD,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAC/C;QAED,MAAM,gBAAgB,GAAG,SAAS,CAAwB,MAAM,EAAE,oBAAoB,CAAC,CAAC,IAAI,CAC1F,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAC9D,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,EAC9C,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB;AAED,QAAA,OAAO,KAAK,CAAC,YAAY,EAAE,gBAAgB,CAAC;IAC9C;AAEQ,IAAA,kBAAkB,CACxB,gBAAwB,EACxB,cAA8B,EAC9B,OAAuB,EAAA;QAEvB,MAAM,YAAY,GAAwB,QAAQ,CAAC,aAAa,CAAM,gBAAgB,CAAC;AACvF,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAClF,QAAA,YAAY,CAAC,YAAY,GAAG,gBAAgB;;AAG5C,QAAA,YAAY,CAAC,UAAU,GAAG,OAAO;AACjC,QAAA,IAAI,OAAO,EAAE,EAAE,EAAE;AACf,YAAA,IAAI,CAAC;AACF,iBAAA,MAAM,CAAC,OAAO,CAAC,EAAE;AACjB,iBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;iBAClD,SAAS,CAAC,GAAG,IAAG;AACf,gBAAA,YAAY,CAAC,UAAU,GAAG,GAAG,CAAC,IAAsB;AACtD,YAAA,CAAC,CAAC;QACN;QACA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,IAAG;AAC1F,YAAA,YAAY,CAAC,aAAa,GAAG,MAAM;AACrC,QAAA,CAAC,CAAC;AACF,QAAA,cAAc,CAAC,WAAW,CAAC,YAAY,CAAC;AACxC,QAAA,OAAO,YAAY;IACrB;AAEQ,IAAA,oBAAoB,CAAC,KAAyC,EAAA;AACpE,QAAA,MAAM,SAAS,GAAG,QAAQ,IAAI,KAAK;AACnC,QAAA,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,cAAc,CAAC,IAAI,EAAE;AAC3D,YAAA,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO,EAAE,IAAI,EAAE,YAAY,GAAG,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE;QACjE;QACA,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;IACnF;IAEQ,OAAO,GAAA;AACb,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;QACrC,IAAI,SAAS,EAAE;AACb,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI;QACzB;AACA,QAAA,OAAO,IAAI,CAAC,6BAA6B,EAAE;IAC7C;AAEQ,IAAA,MAAM,YAAY,CAAC,KAAa,EAAE,OAAgB,EAAA;AACxD,QAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AACnE,QAAA,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC;AAC9D,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;AACxD,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AAClF,QAAA,OAAO,OAAO;IAChB;IAEQ,6BAA6B,GAAA;AACnC,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACtB,MAAM,kBAAkB,GAAG,cAAc,CACvC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAClB,kBAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;AAChE,kBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EACpB,IAAI,CAAC,MAAM,EAAE,EAAE,EACf,IAAI,CAAC,MAAM,EAAE,IAAI,CAClB;AACD,YAAA,OAAO,kBAAkB;QAC3B;QAEA,MAAM,kBAAkB,GAAG,oBAAoB,CAC7C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAClB,cAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;AAChE,cAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EACpB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAClB,cAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;AAChE,cAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EACnB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CACrC;AACD,QAAA,OAAO,kBAAkB;IAC3B;+GAnPW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,YAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1C/B,kfAmBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDkBY,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAKN,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAP9B,SAAS;iCACI,IAAI,EAAA,OAAA,EACP,CAAC,OAAO,CAAC,EAAA,QAAA,EACR,gBAAgB,EAAA,IAAA,EAEpB,EAAE,KAAK,EAAE,YAAY,EAAE,EAAA,QAAA,EAAA,kfAAA,EAAA;;sBAG5B;;sBAGA;;sBAGA;;sBASA;2DAS2D,aAAa,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ME3B9D,yBAAyB,CAAA;AAnBtC,IAAA,WAAA,GAAA;QAqBE,IAAA,CAAA,IAAI,GAAmB,MAAM;AAO7B,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAC/C,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC5B,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;QAEzD,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,IAAI,CAC1D,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CACxF;QAGD,IAAA,CAAA,iBAAiB,GAAG,IAAI;QACxB,IAAA,CAAA,QAAQ,GAAkC,MAAM;QAEhD,IAAA,CAAA,SAAS,GAAG,KAAK;AAER,QAAA,IAAA,CAAA,sBAAsB,GAAG,OAAO,CAAC,yCAAyC,CAAC;AAC3E,QAAA,IAAA,CAAA,cAAc,GAAG,OAAO,CAAC,gCAAgC,CAAC;AAC1D,QAAA,IAAA,CAAA,aAAa,GAAG,OAAO,CAAC,+BAA+B,CAAC;AACxD,QAAA,IAAA,CAAA,6BAA6B,GAAG,OAAO,CAC9C,mEAAmE,CACpE;AACQ,QAAA,IAAA,CAAA,4BAA4B,GAAG,OAAO,CAC7C,kEAAkE,CACnE;QACQ,IAAA,CAAA,eAAe,GAAG,wBAAwB;AAE3C,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;QAC9B,IAAA,CAAA,mBAAmB,GAAyB,EAAE;AAoNvD,IAAA;IAlNC,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AAClD,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC1B;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE;YAClB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QACnC;AAEA,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE;YAChC,IAAI,CAAC,QAAQ,EAAE;QACjB;IACF;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO;AACxC,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM;QAEtB,IAAI,WAAW,EAAE;AACf,YAAA,IAAI,CAAC,QAAQ,GAAG,YAAY;QAC9B;AAEA,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE;AACvB,YAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;QACvB;QAEA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG;AAEtE,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AAEtB,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,cAAc,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACzC;IACF;AAEA,IAAA,UAAU,CAAC,IAAoB,EAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;QAChB,IAAI,CAAC,QAAQ,EAAE;IACjB;AAEA,IAAA,YAAY,CAAC,MAA2C,EAAA;AACtD,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM;AAC1C,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAK;YACvE,IAAI,CAAC,QAAQ,EAAE;AACjB,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,IAAG;AACjE,YAAA,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC;AACxC,QAAA,CAAC,CAAC;IACJ;IAEA,UAAU,GAAA;QACR,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC,GAAG,EAAE;IAC7D;IAEA,IAAI,GAAA;QACF,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC;IAC/C;IAEA,IAAI,GAAA;QACF,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC;IAC/C;AAEA,IAAA,UAAU,CAAC,MAAc,EAAA;AACvB,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACvB;IACF;AAEA,IAAA,QAAQ,CAAC,OAAgB,EAAA;QACvB,MAAM,IAAI,GAAG,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;AAC9C,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;AACxB,YAAA,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC;YACnC;QACF;AACA,QAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC;IACpC;AAEA,IAAA,sBAAsB,CAAC,GAAW,EAAA;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB;QACF;QACA,MAAM,IAAI,GAAG,IAAI,CAAC,8BAA8B,CAAC,GAAG,CAAC;AAErD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,KAAK,CAC5B,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,MAAM,CAChB;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;AACtF,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;IACrB;AAEQ,IAAA,2BAA2B,CAAC,IAAc,EAAA;AAChD,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AAClD,QAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE;QAE7B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE;AAElB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM;AAE1C,QAAA,MAAM,eAAe,GAA4C;YAC/D,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACvC,YAAA,sBAAsB,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAI;AAC1C,gBAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,CAAC;oBACrC,eAAe,EAAE,QAAQ,CAAC,UAAU;AACpC,oBAAA,WAAW,EAAE,CAAC;oBACd,aAAa,EAAE,QAAQ,CAAC,UAAU;oBAClC,SAAS,EAAE,QAAQ,CAAC;AACrB,iBAAA,CAAC;AAEF,gBAAA,MAAM,SAAS,GAAG,CAAC,WAAmB,MAAqB;oBACzD,eAAe,EAAE,QAAQ,CAAC,UAAU;oBACpC,aAAa,EAAE,QAAQ,CAAC,UAAU;oBAClC,WAAW;oBACX,SAAS,EAAE,QAAQ,CAAC;AACrB,iBAAA,CAAC;;gBAGF,MAAM,QAAQ,GAAG,gCAAgC,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAChE,IAAI,QAAQ,EAAE;AACZ,oBAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;oBACzB,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;oBAClD,MAAM,WAAW,GAAsC;AACpD,yBAAA,MAAM,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;AACjE,yBAAA,GAAG,CAAC,GAAG,KAAK;AACX,wBAAA,KAAK,EAAE,GAAG;AACV,wBAAA,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,QAAQ;AAClD,wBAAA,UAAU,EAAE,GAAG;AACf,wBAAA,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC;AAC7B,wBAAA,QAAQ,EAAE;AACX,qBAAA,CAAC,CAAC;oBACL,OAAO,EAAE,WAAW,EAAE;gBACxB;;gBAGA,MAAM,YAAY,GAAG,yCAAyC,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAC7E,IAAI,YAAY,EAAE;AAChB,oBAAA,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC;AAC7B,oBAAA,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;wBAC5C,eAAe,EAAE,QAAQ,CAAC,UAAU;wBACpC,WAAW,EAAE,QAAQ,CAAC,MAAM;wBAC5B,aAAa,EAAE,QAAQ,CAAC,UAAU;AAClC,wBAAA,SAAS,EAAE,QAAQ,CAAC,MAAM,GAAG;AAC9B,qBAAA,CAAC;AACF,oBAAA,MAAM,4BAA4B,GAAG,eAAe,KAAK,GAAG;oBAC5D,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;AAClD,oBAAA,MAAM,SAAS,GAAG,4BAA4B,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM;oBACtF,MAAM,WAAW,GAAsC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK;AACtE,wBAAA,KAAK,EAAE,GAAG;AACV,wBAAA,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,QAAQ;AAClD,wBAAA,UAAU,EAAE,CAAA,EAAG,cAAc,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG;AACrC,wBAAA,KAAK,EAAE;4BACL,eAAe,EAAE,QAAQ,CAAC,UAAU;4BACpC,aAAa,EAAE,QAAQ,CAAC,UAAU;4BAClC,WAAW;4BACX;AACD,yBAAA;AACD,wBAAA,QAAQ,EAAE;AACX,qBAAA,CAAC,CAAC;oBACH,OAAO,EAAE,WAAW,EAAE;gBACxB;;;gBAIA,MAAM,UAAU,GAAG,iCAAiC,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACnE,IAAI,UAAU,EAAE;AACd,oBAAA,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC;AAC3B,oBAAA,IAAI,CAAC,KAAK;AAAE,wBAAA,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE;oBACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;oBAClD,MAAM,WAAW,GAAsC;yBACpD,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;yBACnC,GAAG,CAAC,GAAG,IAAG;wBACT,MAAM,UAAU,GAAG,IAAI,CAAC,8BAA8B,CAAC,GAAG,CAAC;wBAC3D,OAAO;AACL,4BAAA,KAAK,EAAE,GAAG;AACV,4BAAA,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,QAAQ;4BAClD,UAAU;AACV,4BAAA,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC;AAC7B,4BAAA,MAAM,EAAE,UAAU;AAClB,4BAAA,UAAU,EAAE,GAAG;AACf,4BAAA,QAAQ,EAAE;yBACX;AACH,oBAAA,CAAC,CAAC;oBACJ,OAAO,EAAE,WAAW,EAAE;gBACxB;AAEA,gBAAA,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE;YAC5B;SACD;QAED,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAC3B,MAAM,CAAC,SAAS,CAAC,8BAA8B,CAAC,MAAM,EAAE,eAAe,CAAC,EACxE,MAAM,CAAC,SAAS,CAAC,8BAA8B,CAAC,YAAY,EAAE,eAAe,CAAC,CAC/E;IACH;AAEQ,IAAA,8BAA8B,CAAC,GAAW,EAAA;QAChD,MAAM,oBAAoB,GAAG,cAAc;QAC3C,MAAM,YAAY,GAAG,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,GAAG,CAAA,EAAG,GAAG,CAAA,CAAE;AAC3F,QAAA,OAAO,wBAAwB,GAAG,YAAY,GAAG,GAAG;IACtD;+GAtPW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAOzB,eAAe,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/C5B,8iKAiLA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDxJI,eAAe,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,aAAa,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEb,6BAA6B,EAAA,QAAA,EAAA,4BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAC7B,UAAU,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,SAAA,EAAA,cAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,MAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACV,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,OAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,YAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,gBAAgB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,yBAAyB,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAXzB,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAIT,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAYP,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAnBrC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,IAAI,EAAA,OAAA,EACP;wBACP,SAAS;wBACT,eAAe;wBACf,WAAW;wBACX,aAAa;wBACb,gBAAgB;wBAChB,6BAA6B;wBAC7B,UAAU;wBACV,aAAa;wBACb,aAAa;wBACb,gBAAgB;wBAChB,gBAAgB;wBAChB;AACD,qBAAA,EAAA,QAAA,EACS,wBAAwB,EAAA,QAAA,EAAA,8iKAAA,EAAA;;sBAIjC;;sBAGA;;sBAGA,SAAS;uBAAC,eAAe;;;MERf,yBAAyB,CAAA;IACpC,IACI,mBAAmB,CAAC,QAA0B,EAAA;QAChD,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC/C;aAAO;AACL,YAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC;QAC3C;IACF;AAwBA,IAAA,WAAA,GAAA;AAvBA,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAC5B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;AAChC,QAAA,IAAA,CAAA,uBAAuB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AACzD,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,QAAA,IAAA,CAAA,qBAAqB,GAAG,MAAM,CAAC,4BAA4B,CAAC;AAC5D,QAAA,IAAA,CAAA,QAAQ,GAAe,WAAW,CAAC,iBAAiB;AACnC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AACxC,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,IAAI,CACrEC,KAAG,CACD,MAAM,IACJ,MAAM,EAAE,aAAa,KAAK,cAAc,CAAC,IAAI,IAAI,MAAM,EAAE,oBAAoB,KAAK,IAAI,CACzF,EACDC,sBAAoB,EAAE,CACvB;AACD,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,IAAI,CAC5DC,WAAS,CAAC,MAAM,IACd,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,CACjF,CACF;AACD,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,IAAI,CAChEF,KAAG,CAAC,MAAM,IAAI,MAA4B,CAAC,CAC5C;QAGC,IAAI,CAAC,uBAAuB,CAAC;aAC1B,IAAI,CACH,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EACnCG,QAAM,CACJ,CAAC,CAAC,KACA,CAAC,CAAC,IAAI,KAAK,oCAAoC,CAClD;AAEF,aAAA,SAAS,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;IAC/D;IAEA,WAAW,GAAA;;;;AAIT,QAAA,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE;IACxC;AAEQ,IAAA,YAAY,CAAC,YAAwD,EAAA;AAC3E,QAAA,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY;AACvC,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAiC;AACnF,QAAA,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE;YAC7B;QACF;AACA,QAAA,MAAM,OAAO,GAAG,uBAAuB,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC;QACrF,IAAI,OAAO,KAAK,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE;YAC5C;QACF;AACA,QAAA,MAAM,OAAO,GAAG,EAAE,GAAG,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;AAC7D,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC;QAC1C,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAC;IAC5F;+GAjEW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvCtC,0vBAqBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDUI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEX,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,yBAAyB,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,sBAAsB,uLAHtB,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAMA,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAbrC,SAAS;+BACE,wBAAwB,EAAA,UAAA,EAEtB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,SAAS;wBACT,kBAAkB;wBAClB,yBAAyB;wBACzB;AACD,qBAAA,EAAA,QAAA,EAAA,0vBAAA,EAAA;;sBAGA,SAAS;uBAAC,aAAa;;;MEZb,qCAAqC,CAAA;AAhBlD,IAAA,WAAA,GAAA;AAiBE,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAoB5C,IAAA;AAlBC;;;;AAIG;IACH,MAAM,YAAY,CAAC,OAA0B,EAAA;QAC3C,MAAM,oBAAoB,GAAG,cAAc;AAC3C,QAAA,IAAI,IAAY;AAChB,QAAA,IAAI,OAAO,CAAC,OAAO,EAAE;YACnB,IAAI,GAAG,OAAO,CAAC;iBACZ,GAAG,CAAC,GAAG,KAAK,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,CAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAC;iBACtE,IAAI,CAAC,EAAE,CAAC;QACb;aAAO;YACL,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,OAAO,CAAC,IAAI,CAAA,EAAA,CAAI,GAAG,CAAA,CAAA,EAAI,OAAO,CAAC,IAAI,CAAA,CAAE;QAC7F;AACA,QAAA,MAAM,OAAO,GAAG,mBAAmB,GAAG,IAAI,GAAG,GAAG;QAChD,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC;IAChD;+GArBW,qCAAqC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qCAAqC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5BlD,4wCAqDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjCI,0BAA0B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC1B,4BAA4B,EAAA,QAAA,EAAA,0BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAG5B,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,OAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAHb,SAAS,yCACT,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAKP,qCAAqC,EAAA,UAAA,EAAA,CAAA;kBAhBjD,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qCAAqC,EAAA,IAAA,EAEzC;AACJ,wBAAA,KAAK,EAAE;AACR,qBAAA,EAAA,UAAA,EACW,IAAI,EAAA,OAAA,EACP;wBACP,0BAA0B;wBAC1B,4BAA4B;wBAC5B,SAAS;wBACT,gBAAgB;wBAChB,aAAa;wBACb;AACD,qBAAA,EAAA,QAAA,EAAA,4wCAAA,EAAA;;;MEKU,mBAAmB,CAAA;AAXhC,IAAA,WAAA,GAAA;QAYE,IAAA,CAAA,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAoB;AAC1B,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;QAC9D,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MACzB,IAAI,CAAC,uBAAuB,CAAC,UAAU,CACrC,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,EACzB,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CACrC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACF;AAEO,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,uBAAuB,CAAC;AACxD,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAc,2BAA2B,CAAC,SAAS,uDAAC;AACxE,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAqB,EAAE,yDAAC;AAC9C,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAU,KAAK,qDAAC;AAClC;;;;;AAKG;AACH,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAsB,SAAS,4DAAC;QAEhD,IAAA,CAAA,2BAA2B,GAAG,2BAA2B;QACzD,IAAA,CAAA,WAAW,GAAG,WAAW;AAE1B,QAAA,IAAA,CAAA,uBAAuB,GAAG,MAAM,CAAC,4BAA4B,CAAC;AA+DvE,IAAA;IA7DC,QAAQ,GAAA;AACN,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;QAC5B,IAAI,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAClC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;QAC9C;AAEA,QAAA,MAAM,EACJ,WAAW,GAAG,2BAA2B,CAAC,SAAS,EACnD,eAAe,EACf,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,aAAa,EACd,GAAG,MAAM;AAEV,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAA0B,CAAC;AAChD,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;YACrB,eAAe;YACf,WAAW;YACX,oBAAoB;YACpB,eAAe;YACf;AACD,SAAA,CAAC;;;;QAKF,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACzD;AAEA,IAAA,eAAe,CAAC,KAAgE,EAAA;AAC9E,QAAA,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACzD;IAEA,iBAAiB,GAAA;QACf,OAAO,IAAI,CAAC,cAAc;IAC5B;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE;AAChC,QAAA,OAAO,GAAG,CAAC,aAAa,KAAK,cAAc,CAAC,IAAI,IAAI,GAAG,CAAC,oBAAoB,KAAK,IAAI;IACvF;AAEQ,IAAA,eAAe,CAAC,OAA4B,EAAA;QAClD,MAAM,uBAAuB,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI;QACjE,IAAI,uBAAuB,EAAE;YAC3B,OAAO,OAAO,CAAC,MAAoB;QACrC;QACA,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;AAClB,YAAA,GAAG,EAAE,EAAE;AACP,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,gBAAgB,EAAE,KAAK;AACvB,gBAAA,gBAAgB,EAAE,OAAO,CAAC,YAAY,KAAK;AAC5C;SACF;IACH;+GAvFW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/BhC,q4BA8BA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDLI,YAAY,+BACZ,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,+BAA+B,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC/B,sBAAsB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGb,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAX/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EAEf,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,kBAAkB;wBAClB,+BAA+B;wBAC/B;AACD,qBAAA,EAAA,QAAA,EAAA,q4BAAA,EAAA;;;AE7BH;;AAEG;;;;"}