{"version":3,"file":"witspry-ng-html-editor.mjs","sources":["../../../projects/witspry-ng-html-editor/src/lib/services/syntax-highlight.service.ts","../../../projects/witspry-ng-html-editor/src/lib/services/editor-config.service.ts","../../../projects/witspry-ng-html-editor/src/lib/components/html-editor/html-editor.component.ts","../../../projects/witspry-ng-html-editor/src/lib/witspry-ng-html-editor.service.ts","../../../projects/witspry-ng-html-editor/src/lib/witspry-ng-html-editor.component.ts","../../../projects/witspry-ng-html-editor/src/public-api.ts","../../../projects/witspry-ng-html-editor/src/witspry-ng-html-editor.ts"],"sourcesContent":["import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Token } from '../interfaces/editor-config.interface';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class SyntaxHighlightService {\r\n\r\n  constructor(@Inject(PLATFORM_ID) private platformId: Object) {}\r\n\r\n  highlightHtml(content: string): string {\r\n    if (!content) return '';\r\n    \r\n    const tokens = this.tokenizeHtml(content);\r\n    return this.applyHighlighting(tokens, content);\r\n  }\r\n\r\n  private tokenizeHtml(content: string): Token[] {\r\n    const tokens: Token[] = [];\r\n    let index = 0;\r\n\r\n    while (index < content.length) {\r\n      // HTML Comments\r\n      if (content.substring(index, index + 4) === '<!--') {\r\n        const endIndex = content.indexOf('-->', index);\r\n        if (endIndex !== -1) {\r\n          tokens.push({\r\n            type: 'comment',\r\n            value: content.substring(index, endIndex + 3),\r\n            startIndex: index,\r\n            endIndex: endIndex + 3\r\n          });\r\n          index = endIndex + 3;\r\n          continue;\r\n        }\r\n      }\r\n\r\n      // HTML Tags\r\n      if (content[index] === '<') {\r\n        const tagEndIndex = content.indexOf('>', index);\r\n        if (tagEndIndex !== -1) {\r\n          const tagContent = content.substring(index, tagEndIndex + 1);\r\n          \r\n          // Parse tag and attributes\r\n          const tagMatch = tagContent.match(/^<\\/?([a-zA-Z][a-zA-Z0-9]*)/);\r\n          if (tagMatch) {\r\n            let currentIndex = index;\r\n            \r\n            // Opening bracket and tag name\r\n            tokens.push({\r\n              type: 'tag',\r\n              value: tagMatch[0],\r\n              startIndex: currentIndex,\r\n              endIndex: currentIndex + tagMatch[0].length\r\n            });\r\n            currentIndex += tagMatch[0].length;\r\n\r\n            // Parse attributes\r\n            const attributeRegex = /\\s+([a-zA-Z][a-zA-Z0-9-]*)\\s*=\\s*(\"[^\"]*\"|'[^']*'|[^\\s>]*)/g;\r\n            let attrMatch;\r\n\r\n            while ((attrMatch = attributeRegex.exec(tagContent)) !== null) {\r\n              const attrStartIndex = index + attrMatch.index;\r\n              \r\n              // Attribute name\r\n              tokens.push({\r\n                type: 'attribute',\r\n                value: attrMatch[1],\r\n                startIndex: attrStartIndex + attrMatch[0].indexOf(attrMatch[1]),\r\n                endIndex: attrStartIndex + attrMatch[0].indexOf(attrMatch[1]) + attrMatch[1].length\r\n              });\r\n\r\n              // Attribute value\r\n              tokens.push({\r\n                type: 'string',\r\n                value: attrMatch[2],\r\n                startIndex: attrStartIndex + attrMatch[0].indexOf(attrMatch[2]),\r\n                endIndex: attrStartIndex + attrMatch[0].indexOf(attrMatch[2]) + attrMatch[2].length\r\n              });\r\n            }\r\n            \r\n            // Closing bracket\r\n            tokens.push({\r\n              type: 'tag',\r\n              value: '>',\r\n              startIndex: tagEndIndex,\r\n              endIndex: tagEndIndex + 1\r\n            });\r\n          }\r\n\r\n          index = tagEndIndex + 1;\r\n          continue;\r\n        }\r\n      }\r\n\r\n      // Text content\r\n      const nextTagIndex = content.indexOf('<', index);\r\n      const textEnd = nextTagIndex === -1 ? content.length : nextTagIndex;\r\n      \r\n      if (textEnd > index) {\r\n        const textContent = content.substring(index, textEnd);\r\n        if (textContent.trim()) {\r\n          tokens.push({\r\n            type: 'text',\r\n            value: textContent,\r\n            startIndex: index,\r\n            endIndex: textEnd\r\n          });\r\n        }\r\n        index = textEnd;\r\n      } else {\r\n        index++;\r\n      }\r\n    }\r\n\r\n    return tokens;\r\n  }\r\n\r\n  private applyHighlighting(tokens: Token[], originalContent: string): string {\r\n    let result = '';\r\n    let lastIndex = 0;\r\n\r\n    // Sort tokens by start index\r\n    tokens.sort((a, b) => a.startIndex - b.startIndex);\r\n\r\n    for (const token of tokens) {\r\n      // Add any content between tokens\r\n      if (token.startIndex > lastIndex) {\r\n        result += this.escapeHtmlPreservingContent(originalContent.substring(lastIndex, token.startIndex));\r\n      }\r\n\r\n      // Add highlighted token\r\n      const escapedValue = this.escapeHtmlPreservingContent(token.value);\r\n      result += `<span class=\"html-editor-${token.type}\">${escapedValue}</span>`;\r\n      \r\n      lastIndex = token.endIndex;\r\n    }\r\n\r\n    // Add remaining content\r\n    if (lastIndex < originalContent.length) {\r\n      result += this.escapeHtmlPreservingContent(originalContent.substring(lastIndex));\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  private escapeHtml(text: string): string {\r\n    if (isPlatformBrowser(this.platformId)) {\r\n      // Use DOM method in browser\r\n      const div = document.createElement('div');\r\n      div.textContent = text;\r\n      return div.innerHTML;\r\n    } else {\r\n      // Manual escaping for SSR\r\n      return text\r\n        .replace(/&/g, '&amp;')\r\n        .replace(/</g, '&lt;')\r\n        .replace(/>/g, '&gt;')\r\n        .replace(/\"/g, '&quot;')\r\n        .replace(/'/g, '&#39;');\r\n    }\r\n  }\r\n\r\n  private escapeHtmlPreservingContent(text: string): string {\r\n    // For syntax highlighting, we need to escape HTML properly to prevent it from being interpreted\r\n    // but we want to preserve the original content structure for display\r\n    return text\r\n      .replace(/&/g, '&amp;')\r\n      .replace(/</g, '&lt;')\r\n      .replace(/>/g, '&gt;')\r\n      .replace(/\"/g, '&quot;')\r\n      .replace(/'/g, '&#39;');\r\n  }\r\n}","import { Injectable } from '@angular/core';\r\nimport { EditorConfig } from '../interfaces/editor-config.interface';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class EditorConfigService {\r\n\r\n  getDefaultConfig(): EditorConfig {\r\n    return {\r\n      tabSize: 2,\r\n      autoIndent: true,\r\n      lineNumbers: true,\r\n      wordWrap: false,\r\n      fontSize: '14px'\r\n    };\r\n  }\r\n\r\n  validateConfig(config: EditorConfig): boolean {\r\n    if (!config) return false;\r\n    \r\n    return (\r\n      typeof config.tabSize === 'number' && \r\n      config.tabSize > 0 && \r\n      config.tabSize <= 8 &&\r\n      typeof config.autoIndent === 'boolean' &&\r\n      typeof config.lineNumbers === 'boolean' &&\r\n      typeof config.wordWrap === 'boolean' &&\r\n      typeof config.fontSize === 'string' &&\r\n      this.isValidFontSize(config.fontSize)\r\n    );\r\n  }\r\n\r\n  mergeWithDefaults(config: Partial<EditorConfig>): EditorConfig {\r\n    const defaultConfig = this.getDefaultConfig();\r\n    return { ...defaultConfig, ...config };\r\n  }\r\n\r\n  private isValidFontSize(fontSize: string): boolean {\r\n    // Check if fontSize is a valid CSS font-size value\r\n    const validUnits = ['px', 'em', 'rem', '%', 'pt'];\r\n    return validUnits.some(unit => fontSize.endsWith(unit)) && \r\n           !isNaN(parseFloat(fontSize));\r\n  }\r\n}","import {\r\n  Component,\r\n  Input,\r\n  Output,\r\n  EventEmitter,\r\n  forwardRef,\r\n  ElementRef,\r\n  ViewChild,\r\n  AfterViewInit,\r\n  OnDestroy,\r\n  ChangeDetectorRef,\r\n  OnChanges,\r\n  SimpleChanges,\r\n  ViewEncapsulation,\r\n  Inject,\r\n  PLATFORM_ID\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { EditorConfig, ThemeType } from '../../interfaces/editor-config.interface';\r\nimport { SyntaxHighlightService } from '../../services/syntax-highlight.service';\r\nimport { EditorConfigService } from '../../services/editor-config.service';\r\n\r\n@Component({\r\n  selector: 'witspry-html-editor',\r\n  standalone: true,\r\n  imports: [CommonModule],\r\n  encapsulation: ViewEncapsulation.None,\r\n  template: `\r\n    <div class=\"html-editor-container\" [attr.data-theme]=\"theme\">\r\n      <div class=\"html-editor-wrapper\" [style.height]=\"height\">\r\n        <!-- Line Numbers -->\r\n        <div\r\n          #lineNumbersContainer\r\n          *ngIf=\"config.lineNumbers\"\r\n          class=\"html-editor-line-numbers\"\r\n          [style.font-size]=\"config.fontSize\">\r\n          <div\r\n            *ngFor=\"let lineNumber of lineNumbers; trackBy: trackByLineNumber\"\r\n            class=\"html-editor-line-number\">\r\n            {{ lineNumber }}\r\n          </div>\r\n        </div>\r\n        \r\n        <!-- Editor Content -->\r\n        <div class=\"html-editor-content\">\r\n          <!-- Syntax Highlighted Background -->\r\n          <div\r\n            #highlightLayer\r\n            class=\"html-editor-highlight-layer\"\r\n            [style.font-size]=\"config.fontSize\"\r\n            [style.white-space]=\"config.wordWrap ? 'pre-wrap' : 'pre'\"\r\n            [style.word-wrap]=\"config.wordWrap ? 'break-word' : 'normal'\">\r\n          </div>\r\n          \r\n          <!-- Editable Text Area -->\r\n          <textarea\r\n            #editorTextarea\r\n            class=\"html-editor-textarea\"\r\n            [style.font-size]=\"config.fontSize\"\r\n            [style.tab-size]=\"config.tabSize\"\r\n            [style.white-space]=\"config.wordWrap ? 'pre-wrap' : 'pre'\"\r\n            [style.word-wrap]=\"config.wordWrap ? 'break-word' : 'normal'\"\r\n            [style.overflow-x]=\"config.wordWrap ? 'hidden' : 'auto'\"\r\n            [placeholder]=\"placeholder\"\r\n            [readonly]=\"readonly\"\r\n            [value]=\"value\"\r\n            (input)=\"handleInput($event)\"\r\n            (keydown)=\"handleKeydown($event)\"\r\n            (focus)=\"handleFocus()\"\r\n            (blur)=\"handleBlur()\"\r\n            (scroll)=\"handleScroll($event)\"\r\n            spellcheck=\"false\"\r\n            autocomplete=\"off\"\r\n            autocorrect=\"off\"\r\n            autocapitalize=\"off\">\r\n          </textarea>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  `,\r\n  styleUrls: ['./html-editor.component.css'],\r\n  providers: [\r\n    {\r\n      provide: NG_VALUE_ACCESSOR,\r\n      useExisting: forwardRef(() => HtmlEditorComponent),\r\n      multi: true\r\n    }\r\n  ]\r\n})\r\nexport class HtmlEditorComponent implements ControlValueAccessor, AfterViewInit, OnDestroy, OnChanges {\r\n  @Input() config: EditorConfig = {\r\n    tabSize: 2,\r\n    autoIndent: true,\r\n    lineNumbers: true,\r\n    wordWrap: false,\r\n    fontSize: '14px'\r\n  };\r\n  @Input() theme: ThemeType = 'default';\r\n  @Input() readonly: boolean = false;\r\n  @Input() placeholder: string = 'Enter HTML content...';\r\n  @Input() height: string = '200px';\r\n\r\n  @Output() contentChange = new EventEmitter<string>();\r\n  @Output() focus = new EventEmitter<void>();\r\n  @Output() blur = new EventEmitter<void>();\r\n\r\n  @ViewChild('editorTextarea', { static: false }) editorTextarea!: ElementRef<HTMLTextAreaElement>;\r\n  @ViewChild('highlightLayer', { static: false }) highlightLayer!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('lineNumbersContainer', { static: false }) lineNumbersElement!: ElementRef<HTMLDivElement>;\r\n\r\n  value: string = '';\r\n  lineNumbers: number[] = [];\r\n  lineHeights: number[] = [];\r\n  private pendingHighlightUpdate = false;\r\n  private resizeObserver?: ResizeObserver;\r\n  \r\n  private onChange = (value: string) => {};\r\n  private onTouched = () => {};\r\n  private isDisabled = false;\r\n\r\n  constructor(\r\n    private syntaxHighlightService: SyntaxHighlightService,\r\n    private editorConfigService: EditorConfigService,\r\n    private cdr: ChangeDetectorRef,\r\n    @Inject(PLATFORM_ID) private platformId: Object\r\n  ) {}\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['config']) {\r\n      this.config = this.editorConfigService.mergeWithDefaults(this.config);\r\n      \r\n      // If word wrap setting changed, recalculate line heights\r\n      if (changes['config'].previousValue &&\r\n          changes['config'].previousValue.wordWrap !== this.config.wordWrap) {\r\n        setTimeout(() => {\r\n          this.calculateLineHeights();\r\n        }, 0);\r\n      }\r\n    }\r\n    \r\n    if (changes['value'] || changes['config']) {\r\n      this.updateHighlighting();\r\n      this.updateLineNumbers();\r\n    }\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    // Ensure highlighting is applied after ViewChild is ready\r\n    if (isPlatformBrowser(this.platformId)) {\r\n      // Use requestAnimationFrame in browser to ensure DOM is fully rendered\r\n      requestAnimationFrame(() => {\r\n        setTimeout(() => {\r\n          this.applyInitialHighlighting();\r\n          this.setupResizeObserver();\r\n        }, 50);\r\n      });\r\n    } else {\r\n      // Fallback for SSR\r\n      setTimeout(() => {\r\n        this.applyInitialHighlighting();\r\n      }, 100);\r\n    }\r\n  }\r\n\r\n  private applyInitialHighlighting(): void {\r\n    // Force update highlighting for any existing content\r\n    this.updateHighlighting();\r\n    this.updateLineNumbers();\r\n    // Force change detection to ensure the view is updated\r\n    this.cdr.detectChanges();\r\n    \r\n    // If there was a pending highlight update, apply it now\r\n    if (this.pendingHighlightUpdate) {\r\n      this.pendingHighlightUpdate = false;\r\n      this.updateHighlighting();\r\n      this.cdr.detectChanges();\r\n    }\r\n    \r\n    // Force a repaint of the highlight layer to ensure visibility\r\n    this.forceHighlightLayerRepaint();\r\n    \r\n    // Additional delay to ensure everything is rendered\r\n    setTimeout(() => {\r\n      this.forceHighlightLayerRepaint();\r\n    }, 100);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    // Cleanup resize observer\r\n    if (this.resizeObserver) {\r\n      this.resizeObserver.disconnect();\r\n    }\r\n  }\r\n\r\n  // ControlValueAccessor implementation\r\n  writeValue(value: any): void {\r\n    this.value = value || '';\r\n    // Try to update highlighting, but mark as pending if ViewChild isn't ready\r\n    if (!this.updateHighlighting()) {\r\n      this.pendingHighlightUpdate = true;\r\n    }\r\n    this.updateLineNumbers();\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  registerOnChange(fn: any): void {\r\n    this.onChange = fn;\r\n  }\r\n\r\n  registerOnTouched(fn: any): void {\r\n    this.onTouched = fn;\r\n  }\r\n\r\n  setDisabledState(isDisabled: boolean): void {\r\n    this.isDisabled = isDisabled;\r\n    this.readonly = isDisabled;\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  // Event handlers\r\n  handleInput(event: Event): void {\r\n    const target = event.target as HTMLTextAreaElement;\r\n    this.value = target.value;\r\n    this.onChange(this.value);\r\n    this.contentChange.emit(this.value);\r\n    this.updateHighlighting();\r\n    this.updateLineNumbers();\r\n\r\n    // Handle auto-indentation for closing tags\r\n    if (this.config.autoIndent) {\r\n      setTimeout(() => this.handleClosingTagIndentation(), 0);\r\n    }\r\n  }\r\n\r\n  handleKeydown(event: KeyboardEvent): void {\r\n    if (this.readonly || this.isDisabled) return;\r\n\r\n    // Handle Tab key for indentation\r\n    if (event.key === 'Tab') {\r\n      event.preventDefault();\r\n      this.insertTab(event.shiftKey);\r\n      return;\r\n    }\r\n\r\n    // Handle Enter key for auto-indentation\r\n    if (event.key === 'Enter' && this.config.autoIndent) {\r\n      event.preventDefault();\r\n      this.handleAutoIndentation();\r\n      return;\r\n    }\r\n\r\n    // Handle closing tag auto-indentation\r\n    if (event.key === '>' && this.config.autoIndent) {\r\n      setTimeout(() => this.handleClosingTagIndentation(), 0);\r\n    }\r\n  }\r\n\r\n  handleFocus(): void {\r\n    this.focus.emit();\r\n  }\r\n\r\n  handleBlur(): void {\r\n    this.onTouched();\r\n    this.blur.emit();\r\n  }\r\n\r\n  handleScroll(event: Event): void {\r\n    const textarea = event.target as HTMLTextAreaElement;\r\n    \r\n    // Synchronize highlight layer with textarea scroll\r\n    if (this.highlightLayer && this.highlightLayer.nativeElement) {\r\n      this.highlightLayer.nativeElement.scrollTop = textarea.scrollTop;\r\n      this.highlightLayer.nativeElement.scrollLeft = textarea.scrollLeft;\r\n    }\r\n    \r\n    // Synchronize line numbers with textarea scroll\r\n    if (this.lineNumbersElement && this.lineNumbersElement.nativeElement) {\r\n      this.lineNumbersElement.nativeElement.scrollTop = textarea.scrollTop;\r\n    }\r\n  }\r\n\r\n  // Helper methods\r\n  private updateHighlighting(): boolean {\r\n    if (this.highlightLayer && this.highlightLayer.nativeElement) {\r\n      const rawHighlightedContent = this.syntaxHighlightService.highlightHtml(this.value);\r\n      // Use direct DOM manipulation to avoid Angular's sanitization\r\n      this.highlightLayer.nativeElement.innerHTML = rawHighlightedContent;\r\n      return true;\r\n    }\r\n    // Return false if ViewChild is not ready yet\r\n    return false;\r\n  }\r\n\r\n  private forceHighlightLayerRepaint(): void {\r\n    if (this.highlightLayer && this.highlightLayer.nativeElement) {\r\n      const element = this.highlightLayer.nativeElement;\r\n      // Force a repaint by temporarily changing and restoring a style property\r\n      const originalDisplay = element.style.display;\r\n      element.style.display = 'none';\r\n      // Force a reflow\r\n      element.offsetHeight;\r\n      element.style.display = originalDisplay || '';\r\n      \r\n      // Also ensure the content is properly set\r\n      if (this.value) {\r\n        const rawHighlightedContent = this.syntaxHighlightService.highlightHtml(this.value);\r\n        element.innerHTML = rawHighlightedContent;\r\n      }\r\n    }\r\n  }\r\n\r\n  private updateLineNumbers(): void {\r\n    const lines = this.value.split('\\n').length;\r\n    this.lineNumbers = Array.from({ length: lines }, (_, i) => i + 1);\r\n    \r\n    // Calculate line heights after DOM update\r\n    setTimeout(() => {\r\n      this.calculateLineHeights();\r\n    }, 0);\r\n  }\r\n\r\n  private calculateLineHeights(): void {\r\n    if (!this.editorTextarea?.nativeElement || !isPlatformBrowser(this.platformId)) {\r\n      return;\r\n    }\r\n\r\n    const textarea = this.editorTextarea.nativeElement;\r\n    const lines = this.value.split('\\n');\r\n    this.lineHeights = [];\r\n\r\n    // If word wrap is disabled, all lines have the same height\r\n    if (!this.config.wordWrap) {\r\n      const computedStyle = getComputedStyle(textarea);\r\n      const lineHeight = parseFloat(computedStyle.lineHeight) || parseFloat(computedStyle.fontSize) * 1.5;\r\n      \r\n      for (let i = 0; i < lines.length; i++) {\r\n        this.lineHeights.push(lineHeight);\r\n      }\r\n      \r\n      this.updateLineNumberHeights();\r\n      return;\r\n    }\r\n\r\n    // For word wrap enabled, calculate dynamic heights\r\n    const tempDiv = document.createElement('div');\r\n    tempDiv.style.position = 'absolute';\r\n    tempDiv.style.visibility = 'hidden';\r\n    tempDiv.style.height = 'auto';\r\n    tempDiv.style.width = textarea.clientWidth - 24 + 'px'; // Account for padding\r\n    tempDiv.style.padding = '0';\r\n    tempDiv.style.margin = '0';\r\n    tempDiv.style.border = 'none';\r\n    tempDiv.style.fontFamily = getComputedStyle(textarea).fontFamily;\r\n    tempDiv.style.fontSize = getComputedStyle(textarea).fontSize;\r\n    tempDiv.style.lineHeight = getComputedStyle(textarea).lineHeight;\r\n    tempDiv.style.whiteSpace = 'pre-wrap';\r\n    tempDiv.style.wordWrap = 'break-word';\r\n    tempDiv.style.overflow = 'hidden';\r\n\r\n    document.body.appendChild(tempDiv);\r\n\r\n    try {\r\n      for (let i = 0; i < lines.length; i++) {\r\n        const lineContent = lines[i] || ' '; // Use space for empty lines\r\n        tempDiv.textContent = lineContent;\r\n        const height = tempDiv.offsetHeight;\r\n        this.lineHeights.push(height);\r\n      }\r\n    } finally {\r\n      document.body.removeChild(tempDiv);\r\n    }\r\n\r\n    // Update line number container heights\r\n    this.updateLineNumberHeights();\r\n  }\r\n\r\n  private updateLineNumberHeights(): void {\r\n    if (!this.lineNumbersElement?.nativeElement || !isPlatformBrowser(this.platformId)) {\r\n      return;\r\n    }\r\n\r\n    const lineNumberElements = this.lineNumbersElement.nativeElement.querySelectorAll('.html-editor-line-number');\r\n    \r\n    lineNumberElements.forEach((element: Element, index: number) => {\r\n      if (this.lineHeights[index]) {\r\n        (element as HTMLElement).style.height = this.lineHeights[index] + 'px';\r\n        (element as HTMLElement).style.minHeight = this.lineHeights[index] + 'px';\r\n      }\r\n    });\r\n  }\r\n\r\n  private setupResizeObserver(): void {\r\n    if (!isPlatformBrowser(this.platformId) || !this.editorTextarea?.nativeElement) {\r\n      return;\r\n    }\r\n\r\n    // Create ResizeObserver to watch for textarea size changes\r\n    this.resizeObserver = new ResizeObserver((entries) => {\r\n      for (const entry of entries) {\r\n        // Debounce the recalculation to avoid excessive calls\r\n        setTimeout(() => {\r\n          this.calculateLineHeights();\r\n        }, 100);\r\n      }\r\n    });\r\n\r\n    // Observe the textarea for size changes\r\n    this.resizeObserver.observe(this.editorTextarea.nativeElement);\r\n  }\r\n\r\n  private insertTab(isShiftTab: boolean): void {\r\n    const textarea = this.editorTextarea.nativeElement;\r\n    const start = textarea.selectionStart;\r\n    const end = textarea.selectionEnd;\r\n    const spaces = ' '.repeat(this.config.tabSize);\r\n\r\n    if (isShiftTab) {\r\n      // Remove indentation\r\n      const beforeCursor = this.value.substring(0, start);\r\n      const afterCursor = this.value.substring(end);\r\n      const lineStart = beforeCursor.lastIndexOf('\\n') + 1;\r\n      const lineBeforeCursor = beforeCursor.substring(lineStart);\r\n      \r\n      if (lineBeforeCursor.startsWith(spaces)) {\r\n        const newValue = beforeCursor.substring(0, lineStart) + \r\n                        lineBeforeCursor.substring(this.config.tabSize) + \r\n                        afterCursor;\r\n        this.updateValue(newValue, start - this.config.tabSize, end - this.config.tabSize);\r\n      }\r\n    } else {\r\n      // Add indentation\r\n      const newValue = this.value.substring(0, start) + spaces + this.value.substring(end);\r\n      this.updateValue(newValue, start + this.config.tabSize, start + this.config.tabSize);\r\n    }\r\n  }\r\n\r\n  private handleAutoIndentation(): void {\r\n    const textarea = this.editorTextarea.nativeElement;\r\n    const start = textarea.selectionStart;\r\n    const beforeCursor = this.value.substring(0, start);\r\n    const afterCursor = this.value.substring(start);\r\n    const currentLineStart = beforeCursor.lastIndexOf('\\n') + 1;\r\n    const currentLine = beforeCursor.substring(currentLineStart);\r\n    \r\n    // Calculate indentation level\r\n    const indentMatch = currentLine.match(/^(\\s*)/);\r\n    let indent = indentMatch ? indentMatch[1] : '';\r\n    \r\n    // Check if we're inside a tag that should increase indentation\r\n    const openTagMatch = currentLine.match(/<([a-zA-Z][a-zA-Z0-9]*)[^>]*>$/);\r\n    const isOpeningTag = openTagMatch && !currentLine.includes(`</${openTagMatch[1]}>`);\r\n    \r\n    // Check if the next content is IMMEDIATELY a closing tag (no whitespace, same line)\r\n    const immediateClosingTagMatch = afterCursor.match(/^<\\/([a-zA-Z][a-zA-Z0-9]*)/);\r\n    const isImmediatelyBeforeClosingTag = immediateClosingTagMatch && openTagMatch &&\r\n                                         immediateClosingTagMatch[1] === openTagMatch[1];\r\n    \r\n    if (isOpeningTag) {\r\n      const tagIndent = indent + ' '.repeat(this.config.tabSize);\r\n      \r\n      if (isImmediatelyBeforeClosingTag) {\r\n        // Only add extra line if closing tag is IMMEDIATELY after opening tag with no content\r\n        // Example: <div>|</div> -> should become <div>\\n  |\\n</div>\r\n        const newValue = beforeCursor + '\\n' + tagIndent + '\\n' + indent + afterCursor;\r\n        this.updateValue(newValue, start + 1 + tagIndent.length, start + 1 + tagIndent.length);\r\n      } else {\r\n        // Normal case: just add increased indentation\r\n        // Example: <div>| -> should become <div>\\n  |\r\n        const newValue = beforeCursor + '\\n' + tagIndent + afterCursor;\r\n        this.updateValue(newValue, start + 1 + tagIndent.length, start + 1 + tagIndent.length);\r\n      }\r\n    } else {\r\n      // Normal indentation - maintain current level\r\n      const newValue = beforeCursor + '\\n' + indent + afterCursor;\r\n      this.updateValue(newValue, start + 1 + indent.length, start + 1 + indent.length);\r\n    }\r\n  }\r\n\r\n  private handleClosingTagIndentation(): void {\r\n    const textarea = this.editorTextarea.nativeElement;\r\n    const start = textarea.selectionStart;\r\n    const beforeCursor = this.value.substring(0, start);\r\n    \r\n    // Check if we just typed a closing tag\r\n    const closingTagMatch = beforeCursor.match(/<\\/([a-zA-Z][a-zA-Z0-9]*)>$/);\r\n    if (!closingTagMatch) return;\r\n    \r\n    const tagName = closingTagMatch[1];\r\n    const currentLineStart = beforeCursor.lastIndexOf('\\n') + 1;\r\n    const currentLine = beforeCursor.substring(currentLineStart);\r\n    \r\n    // Find the matching opening tag to determine proper indentation\r\n    const openingTagIndent = this.findMatchingOpeningTagIndent(beforeCursor.substring(0, currentLineStart), tagName);\r\n    if (openingTagIndent === null) return;\r\n    \r\n    // Get current indentation of the closing tag line\r\n    const currentIndentMatch = currentLine.match(/^(\\s*)/);\r\n    const currentIndent = currentIndentMatch ? currentIndentMatch[1] : '';\r\n    \r\n    // If the indentation is already correct, don't change it\r\n    if (currentIndent === openingTagIndent) return;\r\n    \r\n    // Replace current line indentation with correct indentation\r\n    const lineContentAfterIndent = currentLine.substring(currentIndent.length);\r\n    const newLine = openingTagIndent + lineContentAfterIndent;\r\n    const newValue = beforeCursor.substring(0, currentLineStart) + newLine + this.value.substring(start);\r\n    \r\n    const newCursorPosition = start + (openingTagIndent.length - currentIndent.length);\r\n    this.updateValue(newValue, newCursorPosition, newCursorPosition);\r\n  }\r\n\r\n  private findMatchingOpeningTagIndent(content: string, tagName: string): string | null {\r\n    const lines = content.split('\\n');\r\n    let tagStack: { name: string; indent: string }[] = [];\r\n    \r\n    for (let i = 0; i < lines.length; i++) {\r\n      const line = lines[i];\r\n      const indentMatch = line.match(/^(\\s*)/);\r\n      const indent = indentMatch ? indentMatch[1] : '';\r\n      \r\n      // Find all tags in this line\r\n      const tagRegex = /<\\/?([a-zA-Z][a-zA-Z0-9]*)[^>]*>/g;\r\n      let match;\r\n      \r\n      while ((match = tagRegex.exec(line)) !== null) {\r\n        const fullTag = match[0];\r\n        const currentTagName = match[1];\r\n        \r\n        if (fullTag.startsWith('</')) {\r\n          // Closing tag - pop from stack\r\n          if (tagStack.length > 0 && tagStack[tagStack.length - 1].name === currentTagName) {\r\n            tagStack.pop();\r\n          }\r\n        } else if (!fullTag.endsWith('/>')) {\r\n          // Opening tag (not self-closing) - push to stack\r\n          tagStack.push({ name: currentTagName, indent });\r\n        }\r\n      }\r\n    }\r\n    \r\n    // Find the matching opening tag for our closing tag\r\n    for (let i = tagStack.length - 1; i >= 0; i--) {\r\n      if (tagStack[i].name === tagName) {\r\n        return tagStack[i].indent;\r\n      }\r\n    }\r\n    \r\n    return null;\r\n  }\r\n\r\n  private updateValue(newValue: string, selectionStart: number, selectionEnd: number): void {\r\n    this.value = newValue;\r\n    this.onChange(this.value);\r\n    this.contentChange.emit(this.value);\r\n    this.updateHighlighting();\r\n    this.updateLineNumbers();\r\n    \r\n    // Restore cursor position\r\n    setTimeout(() => {\r\n      const textarea = this.editorTextarea.nativeElement;\r\n      textarea.setSelectionRange(selectionStart, selectionEnd);\r\n    });\r\n  }\r\n\r\n  trackByLineNumber(index: number, lineNumber: number): number {\r\n    return lineNumber;\r\n  }\r\n}","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class WitspryNgHtmlEditorService {\r\n\r\n  constructor() { }\r\n}\r\n","// Re-export the main HTML editor component for backward compatibility\r\nexport { HtmlEditorComponent as WitspryNgHtmlEditorComponent } from './components/html-editor/html-editor.component';\r\n","/*\r\n * Public API Surface of witspry-ng-html-editor\r\n */\r\n\r\n// Main component\r\nexport * from './lib/components/html-editor/html-editor.component';\r\n\r\n// Services\r\nexport * from './lib/services/syntax-highlight.service';\r\nexport * from './lib/services/editor-config.service';\r\n\r\n// Interfaces and types\r\nexport * from './lib/interfaces/editor-config.interface';\r\n\r\n// Legacy exports for backward compatibility\r\nexport * from './lib/witspry-ng-html-editor.service';\r\nexport * from './lib/witspry-ng-html-editor.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;MAOa,sBAAsB,CAAA;AAEQ,IAAA,UAAA;AAAzC,IAAA,WAAA,CAAyC,UAAkB,EAAA;QAAlB,IAAU,CAAA,UAAA,GAAV,UAAU;;AAEnD,IAAA,aAAa,CAAC,OAAe,EAAA;AAC3B,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,EAAE;QAEvB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;QACzC,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC;;AAGxC,IAAA,YAAY,CAAC,OAAe,EAAA;QAClC,MAAM,MAAM,GAAY,EAAE;QAC1B,IAAI,KAAK,GAAG,CAAC;AAEb,QAAA,OAAO,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE;;AAE7B,YAAA,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE;gBAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;AAC9C,gBAAA,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE;oBACnB,MAAM,CAAC,IAAI,CAAC;AACV,wBAAA,IAAI,EAAE,SAAS;wBACf,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC;AAC7C,wBAAA,UAAU,EAAE,KAAK;wBACjB,QAAQ,EAAE,QAAQ,GAAG;AACtB,qBAAA,CAAC;AACF,oBAAA,KAAK,GAAG,QAAQ,GAAG,CAAC;oBACpB;;;;AAKJ,YAAA,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;gBAC1B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;AAC/C,gBAAA,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE;AACtB,oBAAA,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,CAAC,CAAC;;oBAG5D,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,6BAA6B,CAAC;oBAChE,IAAI,QAAQ,EAAE;wBACZ,IAAI,YAAY,GAAG,KAAK;;wBAGxB,MAAM,CAAC,IAAI,CAAC;AACV,4BAAA,IAAI,EAAE,KAAK;AACX,4BAAA,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AAClB,4BAAA,UAAU,EAAE,YAAY;4BACxB,QAAQ,EAAE,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;AACtC,yBAAA,CAAC;AACF,wBAAA,YAAY,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM;;wBAGlC,MAAM,cAAc,GAAG,6DAA6D;AACpF,wBAAA,IAAI,SAAS;AAEb,wBAAA,OAAO,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE;AAC7D,4BAAA,MAAM,cAAc,GAAG,KAAK,GAAG,SAAS,CAAC,KAAK;;4BAG9C,MAAM,CAAC,IAAI,CAAC;AACV,gCAAA,IAAI,EAAE,WAAW;AACjB,gCAAA,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;AACnB,gCAAA,UAAU,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gCAC/D,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;AAC9E,6BAAA,CAAC;;4BAGF,MAAM,CAAC,IAAI,CAAC;AACV,gCAAA,IAAI,EAAE,QAAQ;AACd,gCAAA,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;AACnB,gCAAA,UAAU,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gCAC/D,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;AAC9E,6BAAA,CAAC;;;wBAIJ,MAAM,CAAC,IAAI,CAAC;AACV,4BAAA,IAAI,EAAE,KAAK;AACX,4BAAA,KAAK,EAAE,GAAG;AACV,4BAAA,UAAU,EAAE,WAAW;4BACvB,QAAQ,EAAE,WAAW,GAAG;AACzB,yBAAA,CAAC;;AAGJ,oBAAA,KAAK,GAAG,WAAW,GAAG,CAAC;oBACvB;;;;YAKJ,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;AAChD,YAAA,MAAM,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,YAAY;AAEnE,YAAA,IAAI,OAAO,GAAG,KAAK,EAAE;gBACnB,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC;AACrD,gBAAA,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE;oBACtB,MAAM,CAAC,IAAI,CAAC;AACV,wBAAA,IAAI,EAAE,MAAM;AACZ,wBAAA,KAAK,EAAE,WAAW;AAClB,wBAAA,UAAU,EAAE,KAAK;AACjB,wBAAA,QAAQ,EAAE;AACX,qBAAA,CAAC;;gBAEJ,KAAK,GAAG,OAAO;;iBACV;AACL,gBAAA,KAAK,EAAE;;;AAIX,QAAA,OAAO,MAAM;;IAGP,iBAAiB,CAAC,MAAe,EAAE,eAAuB,EAAA;QAChE,IAAI,MAAM,GAAG,EAAE;QACf,IAAI,SAAS,GAAG,CAAC;;AAGjB,QAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;AAElD,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;;AAE1B,YAAA,IAAI,KAAK,CAAC,UAAU,GAAG,SAAS,EAAE;AAChC,gBAAA,MAAM,IAAI,IAAI,CAAC,2BAA2B,CAAC,eAAe,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;;;YAIpG,MAAM,YAAY,GAAG,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,KAAK,CAAC;YAClE,MAAM,IAAI,4BAA4B,KAAK,CAAC,IAAI,CAAK,EAAA,EAAA,YAAY,SAAS;AAE1E,YAAA,SAAS,GAAG,KAAK,CAAC,QAAQ;;;AAI5B,QAAA,IAAI,SAAS,GAAG,eAAe,CAAC,MAAM,EAAE;AACtC,YAAA,MAAM,IAAI,IAAI,CAAC,2BAA2B,CAAC,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;;AAGlF,QAAA,OAAO,MAAM;;AAGP,IAAA,UAAU,CAAC,IAAY,EAAA;AAC7B,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;;YAEtC,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACzC,YAAA,GAAG,CAAC,WAAW,GAAG,IAAI;YACtB,OAAO,GAAG,CAAC,SAAS;;aACf;;AAEL,YAAA,OAAO;AACJ,iBAAA,OAAO,CAAC,IAAI,EAAE,OAAO;AACrB,iBAAA,OAAO,CAAC,IAAI,EAAE,MAAM;AACpB,iBAAA,OAAO,CAAC,IAAI,EAAE,MAAM;AACpB,iBAAA,OAAO,CAAC,IAAI,EAAE,QAAQ;AACtB,iBAAA,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;;;AAIrB,IAAA,2BAA2B,CAAC,IAAY,EAAA;;;AAG9C,QAAA,OAAO;AACJ,aAAA,OAAO,CAAC,IAAI,EAAE,OAAO;AACrB,aAAA,OAAO,CAAC,IAAI,EAAE,MAAM;AACpB,aAAA,OAAO,CAAC,IAAI,EAAE,MAAM;AACpB,aAAA,OAAO,CAAC,IAAI,EAAE,QAAQ;AACtB,aAAA,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;;AArKhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,kBAEb,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAFpB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cAFrB,MAAM,EAAA,CAAA;;4FAEP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;0BAGc,MAAM;2BAAC,WAAW;;;MCHpB,mBAAmB,CAAA;IAE9B,gBAAgB,GAAA;QACd,OAAO;AACL,YAAA,OAAO,EAAE,CAAC;AACV,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,QAAQ,EAAE;SACX;;AAGH,IAAA,cAAc,CAAC,MAAoB,EAAA;AACjC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;AAEzB,QAAA,QACE,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;YAClC,MAAM,CAAC,OAAO,GAAG,CAAC;YAClB,MAAM,CAAC,OAAO,IAAI,CAAC;AACnB,YAAA,OAAO,MAAM,CAAC,UAAU,KAAK,SAAS;AACtC,YAAA,OAAO,MAAM,CAAC,WAAW,KAAK,SAAS;AACvC,YAAA,OAAO,MAAM,CAAC,QAAQ,KAAK,SAAS;AACpC,YAAA,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;YACnC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC;;AAIzC,IAAA,iBAAiB,CAAC,MAA6B,EAAA;AAC7C,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAC7C,QAAA,OAAO,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,EAAE;;AAGhC,IAAA,eAAe,CAAC,QAAgB,EAAA;;AAEtC,QAAA,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC;AACjD,QAAA,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAChD,YAAA,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;;wGApC1B,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCsFY,mBAAmB,CAAA;AAgCpB,IAAA,sBAAA;AACA,IAAA,mBAAA;AACA,IAAA,GAAA;AACqB,IAAA,UAAA;AAlCtB,IAAA,MAAM,GAAiB;AAC9B,QAAA,OAAO,EAAE,CAAC;AACV,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,QAAQ,EAAE,KAAK;AACf,QAAA,QAAQ,EAAE;KACX;IACQ,KAAK,GAAc,SAAS;IAC5B,QAAQ,GAAY,KAAK;IACzB,WAAW,GAAW,uBAAuB;IAC7C,MAAM,GAAW,OAAO;AAEvB,IAAA,aAAa,GAAG,IAAI,YAAY,EAAU;AAC1C,IAAA,KAAK,GAAG,IAAI,YAAY,EAAQ;AAChC,IAAA,IAAI,GAAG,IAAI,YAAY,EAAQ;AAEO,IAAA,cAAc;AACd,IAAA,cAAc;AACR,IAAA,kBAAkB;IAExE,KAAK,GAAW,EAAE;IAClB,WAAW,GAAa,EAAE;IAC1B,WAAW,GAAa,EAAE;IAClB,sBAAsB,GAAG,KAAK;AAC9B,IAAA,cAAc;AAEd,IAAA,QAAQ,GAAG,CAAC,KAAa,KAAI,GAAG;AAChC,IAAA,SAAS,GAAG,MAAK,GAAG;IACpB,UAAU,GAAG,KAAK;AAE1B,IAAA,WAAA,CACU,sBAA8C,EAC9C,mBAAwC,EACxC,GAAsB,EACD,UAAkB,EAAA;QAHvC,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB;QACtB,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB;QACnB,IAAG,CAAA,GAAA,GAAH,GAAG;QACkB,IAAU,CAAA,UAAA,GAAV,UAAU;;AAGzC,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE;AACrB,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC;;AAGrE,YAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,aAAa;AAC/B,gBAAA,OAAO,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,QAAQ,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;gBACrE,UAAU,CAAC,MAAK;oBACd,IAAI,CAAC,oBAAoB,EAAE;iBAC5B,EAAE,CAAC,CAAC;;;QAIT,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE;YACzC,IAAI,CAAC,kBAAkB,EAAE;YACzB,IAAI,CAAC,iBAAiB,EAAE;;;IAI5B,eAAe,GAAA;;AAEb,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;;YAEtC,qBAAqB,CAAC,MAAK;gBACzB,UAAU,CAAC,MAAK;oBACd,IAAI,CAAC,wBAAwB,EAAE;oBAC/B,IAAI,CAAC,mBAAmB,EAAE;iBAC3B,EAAE,EAAE,CAAC;AACR,aAAC,CAAC;;aACG;;YAEL,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,wBAAwB,EAAE;aAChC,EAAE,GAAG,CAAC;;;IAIH,wBAAwB,GAAA;;QAE9B,IAAI,CAAC,kBAAkB,EAAE;QACzB,IAAI,CAAC,iBAAiB,EAAE;;AAExB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;;AAGxB,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE;AAC/B,YAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK;YACnC,IAAI,CAAC,kBAAkB,EAAE;AACzB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;;;QAI1B,IAAI,CAAC,0BAA0B,EAAE;;QAGjC,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,0BAA0B,EAAE;SAClC,EAAE,GAAG,CAAC;;IAGT,WAAW,GAAA;;AAET,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;;;;AAKpC,IAAA,UAAU,CAAC,KAAU,EAAA;AACnB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;;AAExB,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;AAC9B,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;;QAEpC,IAAI,CAAC,iBAAiB,EAAE;AACxB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;;AAG1B,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;;AAGpB,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;;AAGrB,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;AAC5B,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;AAC1B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;;;AAI1B,IAAA,WAAW,CAAC,KAAY,EAAA;AACtB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA6B;AAClD,QAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QACnC,IAAI,CAAC,kBAAkB,EAAE;QACzB,IAAI,CAAC,iBAAiB,EAAE;;AAGxB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;YAC1B,UAAU,CAAC,MAAM,IAAI,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;;;AAI3D,IAAA,aAAa,CAAC,KAAoB,EAAA;AAChC,QAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU;YAAE;;AAGtC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE;YACvB,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC9B;;;AAIF,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;YACnD,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,qBAAqB,EAAE;YAC5B;;;AAIF,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;YAC/C,UAAU,CAAC,MAAM,IAAI,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;;;IAI3D,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;;IAGnB,UAAU,GAAA;QACR,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;;AAGlB,IAAA,YAAY,CAAC,KAAY,EAAA;AACvB,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,MAA6B;;QAGpD,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;YAC5D,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS;YAChE,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU;;;QAIpE,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE;YACpE,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS;;;;IAKhE,kBAAkB,GAAA;QACxB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;AAC5D,YAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;;YAEnF,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,GAAG,qBAAqB;AACnE,YAAA,OAAO,IAAI;;;AAGb,QAAA,OAAO,KAAK;;IAGN,0BAA0B,GAAA;QAChC,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;AAC5D,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa;;AAEjD,YAAA,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO;AAC7C,YAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;;YAE9B,OAAO,CAAC,YAAY;YACpB,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,eAAe,IAAI,EAAE;;AAG7C,YAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,gBAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;AACnF,gBAAA,OAAO,CAAC,SAAS,GAAG,qBAAqB;;;;IAKvC,iBAAiB,GAAA;AACvB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM;QAC3C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;;QAGjE,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,oBAAoB,EAAE;SAC5B,EAAE,CAAC,CAAC;;IAGC,oBAAoB,GAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YAC9E;;AAGF,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;AACpC,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;;AAGrB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;AACzB,YAAA,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC;AAChD,YAAA,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,GAAG;AAEnG,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC;;YAGnC,IAAI,CAAC,uBAAuB,EAAE;YAC9B;;;QAIF,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC7C,QAAA,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AACnC,QAAA,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ;AACnC,QAAA,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AAC7B,QAAA,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC;AACvD,QAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAC3B,QAAA,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG;AAC1B,QAAA,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;QAC7B,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,UAAU;QAChE,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,QAAQ;QAC5D,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,UAAU;AAChE,QAAA,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,UAAU;AACrC,QAAA,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,YAAY;AACrC,QAAA,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;AAEjC,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;AAElC,QAAA,IAAI;AACF,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACrC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;AACpC,gBAAA,OAAO,CAAC,WAAW,GAAG,WAAW;AACjC,gBAAA,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY;AACnC,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;;;gBAEvB;AACR,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;;;QAIpC,IAAI,CAAC,uBAAuB,EAAE;;IAGxB,uBAAuB,GAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,aAAa,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YAClF;;AAGF,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,gBAAgB,CAAC,0BAA0B,CAAC;QAE7G,kBAAkB,CAAC,OAAO,CAAC,CAAC,OAAgB,EAAE,KAAa,KAAI;AAC7D,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;AAC1B,gBAAA,OAAuB,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,IAAI;AACrE,gBAAA,OAAuB,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,IAAI;;AAE7E,SAAC,CAAC;;IAGI,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,EAAE;YAC9E;;;QAIF,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;AACnD,YAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;;gBAE3B,UAAU,CAAC,MAAK;oBACd,IAAI,CAAC,oBAAoB,EAAE;iBAC5B,EAAE,GAAG,CAAC;;AAEX,SAAC,CAAC;;QAGF,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;;AAGxD,IAAA,SAAS,CAAC,UAAmB,EAAA;AACnC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa;AAClD,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc;AACrC,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY;AACjC,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAE9C,IAAI,UAAU,EAAE;;AAEd,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC;YACnD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;YAC7C,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;YACpD,MAAM,gBAAgB,GAAG,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC;AAE1D,YAAA,IAAI,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;gBACvC,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC;oBACrC,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAC/C,oBAAA,WAAW;gBAC3B,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;;;aAE/E;;YAEL,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;YACpF,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;;;IAIhF,qBAAqB,GAAA;AAC3B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa;AAClD,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc;AACrC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;QAC/C,MAAM,gBAAgB,GAAG,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3D,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC,gBAAgB,CAAC;;QAG5D,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC;AAC/C,QAAA,IAAI,MAAM,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE;;QAG9C,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,gCAAgC,CAAC;AACxE,QAAA,MAAM,YAAY,GAAG,YAAY,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA,EAAA,EAAK,YAAY,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC;;QAGnF,MAAM,wBAAwB,GAAG,WAAW,CAAC,KAAK,CAAC,4BAA4B,CAAC;AAChF,QAAA,MAAM,6BAA6B,GAAG,wBAAwB,IAAI,YAAY;YACzC,wBAAwB,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC;QAEpF,IAAI,YAAY,EAAE;AAChB,YAAA,MAAM,SAAS,GAAG,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YAE1D,IAAI,6BAA6B,EAAE;;;AAGjC,gBAAA,MAAM,QAAQ,GAAG,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,WAAW;gBAC9E,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;;iBACjF;;;gBAGL,MAAM,QAAQ,GAAG,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW;gBAC9D,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;;;aAEnF;;YAEL,MAAM,QAAQ,GAAG,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,WAAW;YAC3D,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;;;IAI5E,2BAA2B,GAAA;AACjC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa;AAClD,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc;AACrC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC;;QAGnD,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC,6BAA6B,CAAC;AACzE,QAAA,IAAI,CAAC,eAAe;YAAE;AAEtB,QAAA,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC;QAClC,MAAM,gBAAgB,GAAG,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3D,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC,gBAAgB,CAAC;;AAG5D,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,4BAA4B,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAChH,IAAI,gBAAgB,KAAK,IAAI;YAAE;;QAG/B,MAAM,kBAAkB,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC;AACtD,QAAA,MAAM,aAAa,GAAG,kBAAkB,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,EAAE;;QAGrE,IAAI,aAAa,KAAK,gBAAgB;YAAE;;QAGxC,MAAM,sBAAsB,GAAG,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC;AAC1E,QAAA,MAAM,OAAO,GAAG,gBAAgB,GAAG,sBAAsB;QACzD,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;AAEpG,QAAA,MAAM,iBAAiB,GAAG,KAAK,IAAI,gBAAgB,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;QAClF,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,iBAAiB,EAAE,iBAAiB,CAAC;;IAG1D,4BAA4B,CAAC,OAAe,EAAE,OAAe,EAAA;QACnE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;QACjC,IAAI,QAAQ,GAAuC,EAAE;AAErD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;YACrB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;AACxC,YAAA,MAAM,MAAM,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE;;YAGhD,MAAM,QAAQ,GAAG,mCAAmC;AACpD,YAAA,IAAI,KAAK;AAET,YAAA,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE;AAC7C,gBAAA,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;AACxB,gBAAA,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC;AAE/B,gBAAA,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;;AAE5B,oBAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,EAAE;wBAChF,QAAQ,CAAC,GAAG,EAAE;;;qBAEX,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;;oBAElC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;;;;;AAMrD,QAAA,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YAC7C,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE;AAChC,gBAAA,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM;;;AAI7B,QAAA,OAAO,IAAI;;AAGL,IAAA,WAAW,CAAC,QAAgB,EAAE,cAAsB,EAAE,YAAoB,EAAA;AAChF,QAAA,IAAI,CAAC,KAAK,GAAG,QAAQ;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QACnC,IAAI,CAAC,kBAAkB,EAAE;QACzB,IAAI,CAAC,iBAAiB,EAAE;;QAGxB,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa;AAClD,YAAA,QAAQ,CAAC,iBAAiB,CAAC,cAAc,EAAE,YAAY,CAAC;AAC1D,SAAC,CAAC;;IAGJ,iBAAiB,CAAC,KAAa,EAAE,UAAkB,EAAA;AACjD,QAAA,OAAO,UAAU;;AA5dR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,sHAmCpB,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAnCV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EARnB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,mBAAmB,CAAC;AAClD,gBAAA,KAAK,EAAE;AACR;SACF,EA5DS,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,ktIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAtDS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAgEX,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAnE/B,SAAS;+BACE,qBAAqB,EAAA,UAAA,EACnB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EACR,aAAA,EAAA,iBAAiB,CAAC,IAAI,EAC3B,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDT,EAEU,SAAA,EAAA;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,yBAAyB,CAAC;AAClD,4BAAA,KAAK,EAAE;AACR;AACF,qBAAA,EAAA,MAAA,EAAA,CAAA,ktIAAA,CAAA,EAAA;;0BAqCE,MAAM;2BAAC,WAAW;yCAlCZ,MAAM,EAAA,CAAA;sBAAd;gBAOQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,MAAM,EAAA,CAAA;sBAAd;gBAES,aAAa,EAAA,CAAA;sBAAtB;gBACS,KAAK,EAAA,CAAA;sBAAd;gBACS,IAAI,EAAA,CAAA;sBAAb;gBAE+C,cAAc,EAAA,CAAA;sBAA7D,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,gBAAgB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;gBACE,cAAc,EAAA,CAAA;sBAA7D,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,gBAAgB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;gBACQ,kBAAkB,EAAA,CAAA;sBAAvE,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,sBAAsB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;;MCzGzC,0BAA0B,CAAA;AAErC,IAAA,WAAA,GAAA;wGAFW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAA1B,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,0BAA0B,cAFzB,MAAM,EAAA,CAAA;;4FAEP,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAHtC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACJD;;ACAA;;AAEG;AAEH;;ACJA;;AAEG;;;;"}