{"version":3,"file":"ogs-gmbh-ngx-utils.mjs","sources":["../../../src/types/timestamp.ts","../../../src/types/storage.ts","../../../src/types/custom-validators.ts","../../../src/consts/keyboard-keys.ts","../../../src/directives/text-clamp/canvas-measurer.service.ts","../../../src/directives/text-clamp/text-clamp.directive.ts","../../../src/directives/throttle-click.directive.ts","../../../src/public-api.ts","../../../src/ogs-gmbh-ngx-utils.ts"],"sourcesContent":["/**\n * Static timestamp helper functions\n * @category Utilities\n *\n * @since 1.0.0\n * @author Simon Kovtyk\n */\n\n\n/** TODO: Take out of types as it is not a type */\n// eslint-disable-next-line @tseslint/no-extraneous-class\nexport class TimestampUtil {\n  /**\n   * Validate timestamp by its value against current timestamp\n   * @param timestamp - Timestamp, that'll be checked\n   * @returns - Returns true if Timestamp is greater than current Timestamp, otherwise false\n   */\n  public static isValidAgainstNow (timestamp: number): boolean {\n    return timestamp > Date.now();\n  }\n}\n","/**\n * Static storage helper methods\n * @category Utilities\n *\n * @since 1.0.0\n * @author Simon Kovtyk\n */\n\n\n/** TODO: Take out of types as it is not a type */\n// eslint-disable-next-line @tseslint/no-extraneous-class\nexport class StorageUtil {\n  /**\n   * Generate random UUID\n   * @returns Random UUID\n   */\n  public static generateRandomUUID (): string {\n    return crypto.randomUUID();\n  }\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from \"@angular/forms\";\n\n/**\n * Creates a validator function that checks whether a control's string value has the specified length.\n * @category Validators\n *\n * @since 1.0.0\n * @author Simon Kovtyk\n */\nexport namespace CustomValidators {\n  /**\n   * @param requiredLength - the exact length that the control's value must have.\n   * @returns \"invalid: true\" or null.\n   */\n  /* eslint-disable-next-line @tseslint/no-shadow */\n  export const length = (requiredLength: number): ValidatorFn => (control: AbstractControl): ValidationErrors | null => ((control.value as string).length === requiredLength\n    ? { invalid: true }\n    : null);\n}\n","/**\n * KeyboardKeys is a collection of constant string values representing commonly used keyboard characters. It includes symbols (such as colon, hash, and space), digits, and both uppercase and lowercase letters, providing a reliable source of normalized key identifiers across the application.\n * @readonly\n * @category Keyboard\n * @since 1.0.0\n * @author Simon Kovtyk\n */\nexport namespace KeyboardKeys {\n  export const BACKSPACE: string = \"Backspace\";\n  export const ENTER: string = \"Enter\";\n  export const ESCAPE: string = \"Escape\";\n  export const COMMA: string = \",\";\n  export const PERIOD: string = \".\";\n  export const COLON: string = \":\";\n  export const HASH: string = \"#\";\n  export const SPACE: string = \" \";\n  export const PLUS: string = \"+\";\n  export const MINUS: string = \"-\";\n  export const DIGIT_0: string = \"0\";\n  export const DIGIT_1: string = \"1\";\n  export const DIGIT_2: string = \"2\";\n  export const DIGIT_3: string = \"3\";\n  export const DIGIT_4: string = \"4\";\n  export const DIGIT_5: string = \"5\";\n  export const DIGIT_6: string = \"6\";\n  export const DIGIT_7: string = \"7\";\n  export const DIGIT_8: string = \"8\";\n  export const DIGIT_9: string = \"9\";\n  export const LOWER_A: string = \"a\";\n  export const LOWER_B: string = \"b\";\n  export const LOWER_C: string = \"c\";\n  export const LOWER_D: string = \"d\";\n  export const LOWER_E: string = \"e\";\n  export const LOWER_F: string = \"f\";\n  export const LOWER_G: string = \"g\";\n  export const LOWER_H: string = \"h\";\n  export const LOWER_I: string = \"i\";\n  export const LOWER_J: string = \"j\";\n  export const LOWER_K: string = \"k\";\n  export const LOWER_L: string = \"l\";\n  export const LOWER_M: string = \"m\";\n  export const LOWER_N: string = \"n\";\n  export const LOWER_O: string = \"o\";\n  export const LOWER_P: string = \"p\";\n  export const LOWER_Q: string = \"q\";\n  export const LOWER_R: string = \"r\";\n  export const LOWER_S: string = \"s\";\n  export const LOWER_T: string = \"t\";\n  export const LOWER_U: string = \"u\";\n  export const LOWER_V: string = \"v\";\n  export const LOWER_W: string = \"w\";\n  export const LOWER_X: string = \"x\";\n  export const LOWER_Y: string = \"y\";\n  export const LOWER_Z: string = \"z\";\n  export const UPPER_A: string = \"A\";\n  export const UPPER_B: string = \"B\";\n  export const UPPER_C: string = \"C\";\n  export const UPPER_D: string = \"D\";\n  export const UPPER_E: string = \"E\";\n  export const UPPER_F: string = \"F\";\n  export const UPPER_G: string = \"G\";\n  export const UPPER_H: string = \"H\";\n  export const UPPER_I: string = \"I\";\n  export const UPPER_J: string = \"J\";\n  export const UPPER_K: string = \"K\";\n  export const UPPER_L: string = \"L\";\n  export const UPPER_M: string = \"M\";\n  export const UPPER_N: string = \"N\";\n  export const UPPER_O: string = \"O\";\n  export const UPPER_P: string = \"P\";\n  export const UPPER_Q: string = \"Q\";\n  export const UPPER_R: string = \"R\";\n  export const UPPER_S: string = \"S\";\n  export const UPPER_T: string = \"T\";\n  export const UPPER_U: string = \"U\";\n  export const UPPER_V: string = \"V\";\n  export const UPPER_W: string = \"W\";\n  export const UPPER_X: string = \"X\";\n  export const UPPER_Y: string = \"Y\";\n  export const UPPER_Z: string = \"Z\";\n}\n/**\n * KeyboardKeyArrays provides grouped collections of keyboard characters, including arrays for digits, all letters, lowercase letters, and uppercase letters. These arrays offer a convenient way to work with character sets in validation, parsing, and input processing.\n * @category Keyboard\n * @readonly\n * @since 1.0.0\n * @author Simon Kovtyk\n */\nexport namespace KeyboardKeyArrays {\n  export const DIGITS: string[] = [ KeyboardKeys.DIGIT_0,\n    KeyboardKeys.DIGIT_1,\n    KeyboardKeys.DIGIT_2,\n    KeyboardKeys.DIGIT_3,\n    KeyboardKeys.DIGIT_4,\n    KeyboardKeys.DIGIT_5,\n    KeyboardKeys.DIGIT_6,\n    KeyboardKeys.DIGIT_7,\n    KeyboardKeys.DIGIT_8,\n    KeyboardKeys.DIGIT_9 ];\n  export const UPPER_LETTERS: string[] = [ KeyboardKeys.UPPER_A,\n    KeyboardKeys.UPPER_B,\n    KeyboardKeys.UPPER_C,\n    KeyboardKeys.UPPER_D,\n    KeyboardKeys.UPPER_E,\n    KeyboardKeys.UPPER_F,\n    KeyboardKeys.UPPER_G,\n    KeyboardKeys.UPPER_H,\n    KeyboardKeys.UPPER_I,\n    KeyboardKeys.UPPER_J,\n    KeyboardKeys.UPPER_K,\n    KeyboardKeys.UPPER_L,\n    KeyboardKeys.UPPER_M,\n    KeyboardKeys.UPPER_N,\n    KeyboardKeys.UPPER_O,\n    KeyboardKeys.UPPER_P,\n    KeyboardKeys.UPPER_Q,\n    KeyboardKeys.UPPER_R,\n    KeyboardKeys.UPPER_S,\n    KeyboardKeys.UPPER_T,\n    KeyboardKeys.UPPER_U,\n    KeyboardKeys.UPPER_V,\n    KeyboardKeys.UPPER_W,\n    KeyboardKeys.UPPER_X,\n    KeyboardKeys.UPPER_Y,\n    KeyboardKeys.UPPER_Z ];\n  export const LOWER_LETTERS: string[] = [ KeyboardKeys.LOWER_A,\n    KeyboardKeys.LOWER_B,\n    KeyboardKeys.LOWER_C,\n    KeyboardKeys.LOWER_D,\n    KeyboardKeys.LOWER_E,\n    KeyboardKeys.LOWER_F,\n    KeyboardKeys.LOWER_G,\n    KeyboardKeys.LOWER_H,\n    KeyboardKeys.LOWER_I,\n    KeyboardKeys.LOWER_J,\n    KeyboardKeys.LOWER_K,\n    KeyboardKeys.LOWER_L,\n    KeyboardKeys.LOWER_M,\n    KeyboardKeys.LOWER_N,\n    KeyboardKeys.LOWER_O,\n    KeyboardKeys.LOWER_P,\n    KeyboardKeys.LOWER_Q,\n    KeyboardKeys.LOWER_R,\n    KeyboardKeys.LOWER_S,\n    KeyboardKeys.LOWER_T,\n    KeyboardKeys.LOWER_U,\n    KeyboardKeys.LOWER_V,\n    KeyboardKeys.LOWER_W,\n    KeyboardKeys.LOWER_X,\n    KeyboardKeys.LOWER_Y,\n    KeyboardKeys.LOWER_Z ];\n  export const LETTERS: string[] = [ ...UPPER_LETTERS, ...LOWER_LETTERS ];\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * Builds a CSS font shorthand string from a computed style declaration.\n *\n * @param elementStyle - The computed CSS style of an element, containing font properties.\n * @param options - If `ìsFontKey` true, includes letter-spacing in the resulting string for use as a cache key.\n * @returns A font shorthand string suitable for CanvasRenderingContext2D.font or as a unique font key.\n */\nfunction getFontString (elementStyle: CSSStyleDeclaration, options: { isFontKey: boolean; } | undefined = undefined): string {\n  let fontString: string = `${ elementStyle.fontStyle } ${ elementStyle.fontVariant } ${ elementStyle.fontWeight } ${ elementStyle.fontSize }/${ elementStyle.lineHeight } ${ elementStyle.fontFamily }`;\n\n  if (options?.isFontKey) {\n    fontString += elementStyle.letterSpacing;\n    fontString.trim();\n  }\n\n  return fontString;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class CanvasMeasurerService {\n  private _canvas: HTMLCanvasElement | undefined;\n\n  private get canvas (): HTMLCanvasElement {\n    if (this._canvas) return this._canvas;\n\n    this._canvas = document.createElement(\"canvas\");\n\n    return this._canvas;\n  }\n\n  private _canvasContext: CanvasRenderingContext2D | null = this.canvas.getContext(\"2d\");\n\n  // Map of maps where each child-map represents a font and each child-map-entry is a string with the measured width\n  private _stringWidthCache: Map<string, Map<string, number>> = new Map<string, Map<string, number>>();\n\n  /**\n   * Measures text width for a given element style and string,\n   * caching results per font configuration.\n   *\n   * @param elementStyle - Computed CSS style of the element (font info).\n   * @param stringToMeasure - The string to measure.\n   * @returns The width in pixels, or undefined if measurement failed.\n   */\n  public getRenderedStringWidth (elementStyle: CSSStyleDeclaration | undefined, stringToMeasure: string): number | undefined {\n    if (!elementStyle) return undefined;\n\n    const fontString: string = getFontString(elementStyle, { isFontKey: true });\n\n    let fontMap: Map<string, number> | undefined = this._stringWidthCache.get(fontString);\n\n    if (!fontMap) {\n      fontMap = new Map<string, number>();\n      this._stringWidthCache.set(fontString, fontMap);\n    }\n\n    let width: number | undefined = fontMap.get(stringToMeasure);\n\n    if (width) return width;\n\n\n    if (this._canvasContext) {\n      this.setCanvasFont(elementStyle);\n      width = this._canvasContext.measureText(stringToMeasure).width;\n      fontMap.set(stringToMeasure, width);\n\n      return width;\n    }\n\n    return undefined;\n  }\n\n  private setCanvasFont (elementStyle: CSSStyleDeclaration): void {\n    if (this._canvasContext?.font) {\n      const fontString: string = getFontString(elementStyle);\n\n      if (this._canvasContext.font === fontString && this._canvasContext.letterSpacing === elementStyle.letterSpacing) return;\n\n      this._canvasContext.font = fontString;\n      this._canvasContext.letterSpacing = elementStyle.letterSpacing;\n    }\n  }\n}\n","/* eslint-disable @tseslint/no-non-null-assertion */\nimport { AfterViewInit, computed, Directive, ElementRef, inject, input, InputSignal, Renderer2, Signal } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\n/* eslint-disable-next-line @tseslint/no-shadow */\nimport { animationFrameScheduler, debounceTime, filter, fromEvent, merge, Observable, throttleTime } from 'rxjs';\nimport { CanvasMeasurerService } from './canvas-measurer.service';\n\n/**\n * Rounds a number up only if its fractional part is at or above the given threshold.\n *\n * @function\n * @param value - The value to round.\n * @param threshold - The fractional cutoff (0–1) above which to round up.\n * @returns The rounded integer.\n *\n * @since 1.2.0\n * @author Ian Wenneckers\n */\nfunction roundWithThreshold (value: number, threshold: number): number {\n  const integerPart: number = Math.floor(value);\n  const fraction: number = value - integerPart;\n\n  return fraction >= threshold\n    ? Math.ceil(value)\n    : integerPart;\n}\n\n/**\n * Determines whether a word of a given width fits into the remaining line width,\n * taking into account the ellipsis width on the last line.\n *\n * @function\n * @param wordWidth - Pixel width of the current word.\n * @param remainingWidth - Remaining pixel width in the current line.\n * @param currentLine - 1-based index of the current line.\n * @param maxLines - Total number of allowed lines.\n * @param ellipsisWidth - Pixel width of the ellipsis string.\n * @returns True if the word can fit, false otherwise.\n *\n * @since 1.2.0\n * @author Ian Wenneckers\n */\n// eslint-disable-next-line @tseslint/max-params\nfunction fits (\n  wordWidth: number,\n  remainingWidth: number,\n  currentLine: number,\n  maxLines: number,\n  ellipsisWidth: number\n): boolean {\n  // If last word reached take ellipsis into account\n  if (currentLine === maxLines)\n    return wordWidth + ellipsisWidth <= remainingWidth;\n\n  return wordWidth <= remainingWidth;\n}\n\n/**\n * Clamps text to its available space and appends a custom ellipsis.\n *\n * @category Directives\n * @remarks\n * Limits content automatically to the available size of the parent container.\n * Takes Line height into account as well as preserving whole words.\n * Works with changing input in form of signals as well as static input.\n *\n * @example\n * ```html\n * <p\n *   textClamp\n *   [text]=\"myText()\"\n *   [ellipsis]=\"'… more'\"\n * ></p>\n * ```\n *\n * @example\n * ```ts\n * @Component({\n *   standalone: true,\n *   selector: 'app-foo',\n *   imports: [TextClampDirective]\n * })\n * export class ArticleCardComponent {\n *   protected myText: WritableSignal<string> = signal<string>(\"...\");\n *\n *   protected onMyEvent(): void {\n *    this.myText.set(\"something else...\")\n *   }\n * }\n * ```\n *\n * @since 1.2.0\n * @author Ian Wenneckers\n */\n@Directive({\n  selector: '[ogsTextClamp]',\n  standalone: true\n})\nexport class TextClampDirective implements AfterViewInit {\n  private _isTextInitialized: boolean = false;\n\n  private readonly _renderer: Renderer2 = inject(Renderer2);\n\n  private _htmlElement: ElementRef<HTMLElement> | undefined = inject<ElementRef<HTMLElement>>(ElementRef<HTMLElement>);\n\n  private get _nativeElement (): HTMLElement | undefined {\n    if (this._htmlElement?.nativeElement)\n      return this._htmlElement.nativeElement;\n\n    return undefined;\n  }\n\n  /**\n   * The text value for this input.\n   *\n   * @remarks\n   * This property is required. Accepts a string or `undefined`.\n   */\n  public readonly text: InputSignal<string | undefined> = input.required();\n\n  /**\n   * The string used as an ellipsis.\n   *\n   * @remarks\n   * This value can be customized to control how truncated text is indicated.\n   * @defaultValue \"...\"\n   */\n  public readonly ellipsis: InputSignal<string> = input(\"...\");\n\n  private _textChange$: Observable<string | undefined> = toObservable(this.text);\n\n  private _canvasMeasureService: CanvasMeasurerService = inject(CanvasMeasurerService);\n\n  // eslint-disable-next-line @unicorn/consistent-function-scoping\n  private readonly _words: Signal<string[]> = computed(() => {\n    let words: string[] = [];\n\n    if (this.text())\n\n      words = this.text()!.split(\" \");\n\n    return words;\n  });\n\n  ngAfterViewInit (): void {\n    const visibility$: Observable<Event> = fromEvent(document, \"visibilitychange\");\n    const focus$: Observable<Event> = fromEvent(window, \"focus\");\n    const resize$: Observable<Event> = fromEvent(window, \"resize\");\n    // Slower throttle for refocus\n    // eslint-disable-next-line @tseslint/typedef\n    const refocus$ = merge(visibility$, focus$).pipe(throttleTime(500));\n    // Fast throttle for change in text or resize\n    // eslint-disable-next-line @tseslint/typedef\n    const fastChange$ = merge(resize$, this._textChange$).pipe(debounceTime(10));\n\n    merge(refocus$, fastChange$)\n      .pipe(\n        filter(() => !document.hidden),\n        debounceTime(0, animationFrameScheduler)\n      )\n      .subscribe(() => {\n        void this.scheduleEllipsis();\n      });\n    // Setting initial text\n    setTimeout(() => {\n      if (this._isTextInitialized)\n        void this.scheduleEllipsis();\n    }, 0);\n  }\n\n  setText (text: string): void {\n    if (this._nativeElement)\n      this._renderer.setProperty(this._nativeElement, 'textContent', text);\n  }\n\n  /**\n   * Schedules the ellipsis calculation by waiting for the font to be fully loaded so it can be measured correctly\n   *\n   * @returns Promise that resolves when the ellipsis has been scheduled\n   */\n  private async scheduleEllipsis (): Promise<void> {\n    await document.fonts.ready;\n    setTimeout(() => {\n      if (this._nativeElement && this.text()) {\n        // Setting text for the text-container to adjust to its full possible height\n        this.setText(this.text()!);\n\n        if (this._nativeElement.clientHeight === this._nativeElement.scrollHeight) return;\n\n        requestAnimationFrame(() => {\n          const clampedText: string | undefined = this.getClampedText();\n\n          if (clampedText)\n            this.setText(clampedText);\n        });\n      }\n    }, 0);\n  }\n\n\n  /**\n   * Calculates the multiline ellipsis by measuring word widths\n   * against the available space and line count.\n   *\n   * @returns clamped text or undefined if measurement went wrong\n   */\n  public getClampedText (): string | undefined {\n    if (this._nativeElement && this.text()) {\n      if (!this._isTextInitialized)\n        this._isTextInitialized = true;\n\n\n      let clampText: string = \"\";\n\n      const elementStyle: CSSStyleDeclaration | undefined = getComputedStyle(this._nativeElement);\n      const lineHeight: number = Number.parseFloat(elementStyle.lineHeight);\n      const lineCount: number = roundWithThreshold(this._nativeElement.clientHeight / lineHeight, 0.9);\n      const ellipsisWidth: number | undefined = this._canvasMeasureService.getRenderedStringWidth(elementStyle, ` ${ this.ellipsis() } `);\n\n      if (!ellipsisWidth) return undefined;\n\n      let usedWordsCount: number = 0;\n      let linePointer: number = 1;\n      let remainingLineWidth: number = this._nativeElement.clientWidth;\n\n      if (lineCount > 0) {\n        for (let i: number = 0; i < this._words().length; i++) {\n          // eslint-disable-next-line prefer-template\n          const word: string = i === 0 ? this._words()[ i ]! : \" \" + this._words()[ i ]!;\n          const wordWidth: number | undefined = this._canvasMeasureService.getRenderedStringWidth(elementStyle, word);\n\n          if (!wordWidth) return undefined;\n\n          // Check if word fits in line\n          if (fits(wordWidth, remainingLineWidth, linePointer, lineCount, ellipsisWidth)) {\n            clampText += word;\n            remainingLineWidth -= wordWidth;\n            usedWordsCount++;\n          }\n          // Check if there is a next line\n          else if (linePointer < lineCount) {\n            linePointer++;\n            remainingLineWidth = this._nativeElement.clientWidth;\n\n            // Check if word fits in line\n            if (fits(wordWidth, remainingLineWidth, linePointer, lineCount, ellipsisWidth)) {\n              clampText += word;\n              remainingLineWidth -= wordWidth;\n              usedWordsCount++;\n            } else\n              break;\n          } else\n            break;\n        }\n\n        if (usedWordsCount > 0 && usedWordsCount < this._words().length)\n          clampText += this.ellipsis();\n      }\n\n      return clampText;\n    }\n\n    return undefined;\n  }\n}\n\n","import { Directive, ElementRef, EventEmitter, inject, input, InputSignal, Output } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { fromEvent, throttleTime } from 'rxjs';\n\n/**\n * Throttles click events on an HTML element.\n *\n * @category Directives\n * @remarks\n * Prevents rapid repeated clicks by allowing only one `(throttleClick)` event\n * to fire within the configured interval. Works with any clickable element.\n *\n * @example **Template (HTML)**\n * ```html\n * <button\n *   (throttleClick)=\"onCounterClick($event)\"\n *   [throttleTimeMs]=\"300\">\n *  Counter\n * </button>\n * ```\n *\n * @example **Component (TypeScript)**\n * ```ts\n * @Component({\n *   standalone: true,\n *   selector: 'app-foo',\n *   imports: [ThrottleClickDirective]\n * })\n * export class FooComponent {\n *   onCounterClick(mouseEvent: MouseEvent): void {\n *     // ...\n *   }\n * }\n * ```\n * @since 1.2.0\n * @author Ian Wenneckers\n */\n@Directive({\n  selector: '[ogsThrottleClick]',\n  standalone: true\n})\nexport class ThrottleClickDirective {\n  private readonly _element: ElementRef<HTMLElement> = inject<ElementRef<HTMLElement>>(ElementRef);\n\n  /**\n   * Whether the first click is emitted - default is true\n   * @remarks\n   * @defaultValue true\n   */\n  public readonly leading: InputSignal<boolean> = input(true);\n\n  /**\n   * Whether the last click is emitted - default is true\n   * @remarks\n   * @defaultValue true\n   */\n  public readonly trailing: InputSignal<boolean> = input(true);\n\n  /**\n   * Duration of the throttle period in milliseconds.\n   * @remarks\n   * This value configures the timing used by the directive's throttling mechanism\n   * @defaultValue 800\n   */\n  public readonly throttleTimeMs: InputSignal<number> = input(800);\n\n  @Output() public readonly throttleClick: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();\n\n  constructor () {\n    /**\n     * TODO: throttleTimeMs is set in the consturctor which runs only once when the directive is instantiated. At that point, the input binding hasn't been set yet, so it gets the default value (800)\n     * Solution =>  set up the RxJS pipeline in a lifecycle hook or use an effect\n     *\n     */\n    fromEvent<MouseEvent>(this._element.nativeElement, \"click\")\n      .pipe(\n        throttleTime(this.throttleTimeMs(), undefined, {\n          leading: this.leading(),\n          trailing: this.trailing()\n        }),\n        takeUntilDestroyed()\n      )\n      .subscribe((mouseEvent: MouseEvent) => {\n        this.throttleClick.emit(mouseEvent);\n      });\n  }\n}\n","/*\n * Public API Surface of utils\n */\n\nexport * from \"./types/timestamp\";\nexport * from \"./types/storage\";\nexport * from \"./types/custom-validators\";\nexport * from \"./consts/keyboard-keys\";\nexport * from \"./directives/text-clamp/text-clamp.directive\";\nexport * from \"./directives/throttle-click.directive\";\nexport * from \"./types/to-form.type\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;AAAA;;;;;;AAMG;AAGH;AACA;MACa,aAAa,CAAA;AACxB;;;;AAIG;IACI,OAAO,iBAAiB,CAAE,SAAiB,EAAA;AAChD,QAAA,OAAO,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;IAC/B;AACD;;ACpBD;;;;;;AAMG;AAGH;AACA;MACa,WAAW,CAAA;AACtB;;;AAGG;AACI,IAAA,OAAO,kBAAkB,GAAA;AAC9B,QAAA,OAAO,MAAM,CAAC,UAAU,EAAE;IAC5B;AACD;;ACjBD;;;;;;AAMG;AACG,IAAW;AAAjB,CAAA,UAAiB,gBAAgB,EAAA;AAC/B;;;AAGG;;AAEU,IAAA,gBAAA,CAAA,MAAM,GAAG,CAAC,cAAsB,KAAkB,CAAC,OAAwB,MAAgC,OAAO,CAAC,KAAgB,CAAC,MAAM,KAAK;AAC1J,UAAE,EAAE,OAAO,EAAE,IAAI;UACf,IAAI,CAAC;AACX,CAAC,EATgB,gBAAgB,KAAhB,gBAAgB,GAAA,EAAA,CAAA,CAAA;;ACTjC;;;;;;AAMG;AACG,IAAW;AAAjB,CAAA,UAAiB,YAAY,EAAA;IACd,YAAA,CAAA,SAAS,GAAW,WAAW;IAC/B,YAAA,CAAA,KAAK,GAAW,OAAO;IACvB,YAAA,CAAA,MAAM,GAAW,QAAQ;IACzB,YAAA,CAAA,KAAK,GAAW,GAAG;IACnB,YAAA,CAAA,MAAM,GAAW,GAAG;IACpB,YAAA,CAAA,KAAK,GAAW,GAAG;IACnB,YAAA,CAAA,IAAI,GAAW,GAAG;IAClB,YAAA,CAAA,KAAK,GAAW,GAAG;IACnB,YAAA,CAAA,IAAI,GAAW,GAAG;IAClB,YAAA,CAAA,KAAK,GAAW,GAAG;IACnB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IAC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"}