{"version":3,"file":"ngx-dynamic-hooks.mjs","sources":["../../../projects/ngx-dynamic-hooks/src/lib/interfaces.ts","../../../projects/ngx-dynamic-hooks/src/lib/constants/core.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/settings/settings.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/settings/options.ts","../../../projects/ngx-dynamic-hooks/src/lib/constants/regexes.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/utils/utils.ts","../../../projects/ngx-dynamic-hooks/src/lib/parsers/selector/text/textSelectorHookParser.ts","../../../projects/ngx-dynamic-hooks/src/lib/parsers/selector/element/elementSelectorHookParser.ts","../../../projects/ngx-dynamic-hooks/src/lib/parsers/selector/selectorHookParserConfig.ts","../../../projects/ngx-dynamic-hooks/src/lib/parsers/selector/selectorHookParserConfigResolver.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/platform/platformService.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/platform/defaultPlatformService.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/platform/autoPlatformService.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/utils/logger.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/utils/hookFinder.ts","../../../projects/ngx-dynamic-hooks/src/lib/parsers/selector/text/tagHookFinder.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/utils/dataTypeEncoder.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/utils/dataTypeParser.ts","../../../projects/ngx-dynamic-hooks/src/lib/parsers/selector/bindingsValueManager.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/settings/parserEntryResolver.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/settings/settingsResolver.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/core/textHookFinder.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/core/elementHookFinder.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/utils/contentSanitizer.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/utils/deepComparer.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/core/componentUpdater.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/core/componentCreator.ts","../../../projects/ngx-dynamic-hooks/src/lib/services/dynamicHooksService.ts","../../../projects/ngx-dynamic-hooks/src/lib/dynamicHooksProviders.ts","../../../projects/ngx-dynamic-hooks/src/lib/standalone.ts","../../../projects/ngx-dynamic-hooks/src/lib/standaloneHelper.ts","../../../projects/ngx-dynamic-hooks/src/lib/components/dynamicHooksComponent.ts","../../../projects/ngx-dynamic-hooks/src/lib/components/dynamicSingleComponent.ts","../../../projects/ngx-dynamic-hooks/src/public-api.ts","../../../projects/ngx-dynamic-hooks/src/ngx-dynamic-hooks.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { DynamicHooksSettings } from './services/settings/settings';\n\n/**\n * Custom injector tokens that are used for varous internal communication purposes\n */\nexport const DYNAMICHOOKS_ALLSETTINGS = new InjectionToken<DynamicHooksSettings[]>('All of the settings registered in the whole app.');\nexport const DYNAMICHOOKS_ANCESTORSETTINGS = new InjectionToken<DynamicHooksSettings[]>('The settings collected from all ancestor injectors');\nexport const DYNAMICHOOKS_MODULESETTINGS = new InjectionToken<DynamicHooksSettings>('The settings for the currently loaded module.');\n\nexport interface SavedBindings {\n    inputs?: {[key: string]: RichBindingData};\n    outputs?: {[key: string]: RichBindingData};\n}\n\n/**\n * A detailed information object for a single binding, containing the raw unparsed binding,\n * its parsed value and all used context variables, if any\n */\nexport interface RichBindingData {\n    raw: string;\n    parsed: boolean;\n    value: any;\n    boundContextVariables: {[key: string]: any};\n}\n","export const contentElementAttr = '__ngx_dynamic_hooks_content'\nexport const anchorElementTag = 'dynamic-component-anchor';\nexport const anchorAttrHookId = '__ngx_dynamic_hooks_anchor_id';\nexport const anchorAttrParseToken = '__ngx_dynamic_hooks_anchor_parsetoken';\nexport const voidElementTags = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr'];","import { HookParserEntry } from './parserEntry';\nimport { HookParser } from '../../interfacesPublic';\nimport { ParseOptions } from './options';\n\nexport enum DynamicHooksInheritance {\n    /**\n     * Merges with settings from all injectors in the app.\n     */\n    All,\n\n    /**\n     * (Default) Only merges with settings from direct ancestor injectors (such a father and grandfather injectors, but not \"uncle\" injectors).\n     */\n    Linear,\n\n    /**\n     * Does not merge at all. Injector only uses own settings.\n     */\n    None\n}\n\n/**\n * The interface for users to define the global options\n */\nexport interface DynamicHooksSettings {\n\n    /**\n     * A list of parsers to use globally\n     */\n    parsers?: HookParserEntry[];\n\n    /**\n     * Options to use globally\n     */\n    options?: ParseOptions;\n\n    /**\n     * Used for providing child settings in child injector contexts\n     */\n    inheritance?: DynamicHooksInheritance;\n}","/**\n * Options that allow you to customize the parsing process\n */\nexport interface ParseOptions {\n    /**\n     * Whether to use Angular's `DomSanitizer` to sanitize the content (hooks are unaffected by this). Defaults to `true` if content is a string, `false` if its an HTML element.\n     */\n    sanitize?: boolean;\n\n    /**\n     * Whether to replace HTML entities like `&amp;` with normal characters.\n     */\n    convertHTMLEntities?: boolean;\n\n    /**\n     * When using a WYSIWYG-editor, enclosing text hooks may collide with its generated HTML (the `<p>`-tag starting before the hook and the corresponding `</p>`-tag ending inside, and vice versa). This will result in faulty HTML when rendered in a browser. This setting removes these ripped-apart tags.\n     */\n    fixParagraphTags?: boolean;\n\n    /**\n     * Whether to update the bindings of dynamic components only when the context object passed to the `DynamicHooksComponent` changes by reference.\n     */\n    updateOnPushOnly?: boolean;\n\n    /**\n     * Whether to deeply-compare inputs for dynamic components by their value instead of by their reference on updates.\n     */\n    compareInputsByValue?: boolean;\n\n    /**\n     * Whether to deeply-compare outputs for dynamic components by their value instead of by their reference on updates.\n     */\n    compareOutputsByValue?: boolean;\n\n    /**\n     * When comparing by value, how many levels deep to compare them (may impact performance).\n     */\n    compareByValueDepth?: number;\n\n    /**\n     * Whether to emit CustomEvents from the component host elements when an output emits. The event name will be the output name. Defaults to true in standalone mode, otherwise false.\n     */\n    triggerDOMEvents?: boolean;\n\n    /**\n     * Whether to ignore input aliases like `@Input('someAlias')` in dynamic components and use the actual property names instead.\n     */\n    ignoreInputAliases?: boolean;\n\n    /**\n     * Whether to ignore output aliases like `@Output('someAlias')` in dynamic components and use the actual property names instead.\n     */\n    ignoreOutputAliases?: boolean;\n\n    /**\n     * Whether to disregard `@Input()`-decorators completely and allow passing in values to any property in dynamic components.\n     */\n    acceptInputsForAnyProperty?: boolean;\n\n    /**\n     * Whether to disregard `@Output()`-decorators completely and allow subscribing to any `Observable` in dynamic components.\n     */\n    acceptOutputsForAnyObservable?: boolean;\n\n    /**\n     * Accepts a `LogOptions` object to customize when to log text, warnings and errors.\n     */\n    logOptions?: LogOptions;\n}\n\nexport interface LogOptions {\n\n    /**\n     * Whether to enable logging when in dev mode\n     */\n    dev?: boolean;\n\n    /**\n     * Whether to enable logging when in prod mode\n     */\n    prod?: boolean;\n\n    /**\n     * Whether to enable logging during Server-Side-Rendering\n     */\n    ssr?: boolean;\n}\n\n/**\n * Returns the default values for the ParseOptions\n */\nexport const getParseOptionDefaults: () => ParseOptions = () => {\n    return {\n        sanitize: true,\n        convertHTMLEntities: true,\n        fixParagraphTags: true,\n        updateOnPushOnly: false,\n        compareInputsByValue: false,\n        compareOutputsByValue: false,\n        compareByValueDepth: 5,\n        triggerDOMEvents: false,\n        ignoreInputAliases: false,\n        ignoreOutputAliases: false,\n        acceptInputsForAnyProperty: false,\n        acceptOutputsForAnyObservable: false,\n        logOptions: {\n            dev: true,\n            prod: false,\n            ssr: false\n        }\n    };\n}\n\n\n","export const regexes: any = {};\n\n// General\nconst variableName = '[a-zA-Z_$]+[a-zA-Z0-9_$]*';\nconst attributeName = '[a-zA-Z$\\\\-_:][a-zA-Z$\\\\-_:0-9\\\\.]*';\n\n// Attribute regex\nregexes.attributeNameNoBracketsRegex = '(' + attributeName + ')';\nregexes.attributeNameBracketsRegex = '\\\\[(' + attributeName + ')\\\\]';\nregexes.attributeNameRoundBracketsRegex = '\\\\((' + attributeName + ')\\\\)';\nregexes.attributeNameRegex = '(?:' + regexes.attributeNameNoBracketsRegex + '|' + regexes.attributeNameBracketsRegex + '|' + regexes.attributeNameRoundBracketsRegex + ')';\nregexes.attributeValueDoubleQuotesRegex = '\\\"((?:\\\\\\\\.|[^\\\"])*?)\\\"';    // Clever bit of regex to allow escaped chars in strings: https://stackoverflow.com/a/1016356/3099523\nregexes.attributeValueSingleQuotesRegex = '\\'((?:\\\\\\\\.|[^\\'])*?)\\'';\n\n// Context var regex examples: https://regex101.com/r/zSbY7M/4\n// Supports the dot notation, the [] notation as well as function calls () for building variable paths\nregexes.variablePathDotNotation = '\\\\.' + variableName;\nregexes.variableBracketsNotation = '\\\\[[^\\\\]]*\\\\]'; // Relies on nested '[]'brackets being encoded\nregexes.variablePathFunctionCall = '\\\\([^\\\\)]*\\\\)'; // Relies on nested '()'-brackets being encoded.\nregexes.variablePathPartRegex = '(?:' + regexes.variablePathDotNotation + '|' + regexes.variableBracketsNotation + '|' + regexes.variablePathFunctionCall + ')';\nregexes.contextVariableRegex = 'context' + regexes.variablePathPartRegex + '*';\n\nregexes.placeholderVariablePathDotNotation = '\\\\@@@cxtDot@@@' + variableName;\nregexes.placeholderVariableBracketsNotation = '@@@cxtOpenSquareBracket@@@[^\\\\]]*@@@cxtCloseSquareBracket@@@';\nregexes.placeholderVariablePathFunctionCall = '@@@cxtOpenRoundBracket@@@[^\\\\)]*@@@cxtCloseRoundBracket@@@';\nregexes.placeholderVariablePathPartRegex = '(?:' + regexes.placeholderVariablePathDotNotation + '|' + regexes.placeholderVariableBracketsNotation + '|' + regexes.placeholderVariablePathFunctionCall + ')';\nregexes.placeholderContextVariableRegex = '__CXT__' + regexes.placeholderVariablePathPartRegex + '*';","\n/**\n * Polyfill for String.prototype.matchAll() from the ES2020 spec\n *\n * Note: The 'string.prototype.matchall' npm package was unstable for me so providing my own version here\n *\n * @param text - The text to search\n * @param regExp - The RegExp object to use\n */\nexport function matchAll(text: string, regExp: RegExp): {[index: number]: string, index: number, input: string}[] {\n  // Must be global\n  if (!regExp.global) {\n    throw Error('TypeError: matchAll called with a non-global RegExp argument');\n  }\n\n  // Get matches\n  const result = [];\n  let match = regExp.exec(text);\n  while (match !== null) {\n    result.push(match);\n    match = regExp.exec(text);\n  }\n\n  // Reset internal index\n  regExp.lastIndex = 0;\n\n  return result;\n}\n\n/**\n * Sort elements/nodes based on the order of their appearance in the document\n *\n * @param arr - The array to sort\n * @param sortCallback - The callback to use to sort the elements\n * @param getElement - An optional callback that returns the element to compare from each arr entry\n */\nexport function sortElements<T>(arr: T[], sortCallback: (a: any, b: any) => number, getElementCallback: (entry: T) => any): T[] {\n  const result = [...arr];\n  return result.sort(function(a, b) {\n\n    if (typeof getElementCallback === 'function') {\n      a = getElementCallback(a);\n      b = getElementCallback(b);\n    }\n\n    return sortCallback(a, b);\n  });\n}\n\n  /**\n   * Indicates if an element is either a component host element or part of a component's view/template\n   * \n   * @param element - The element to inspect\n   */\n  export function isAngularManagedElement(element: any): boolean {\n    // Angular gives component host and view elements the following property, so can simply check for that\n    return element?.__ngContext__ !== undefined;\n  }","import { RichBindingData, SavedBindings } from '../../../interfaces';\nimport { HookParser, HookPosition, HookValue, HookComponentData, HookBindings } from '../../../interfacesPublic';\nimport { TagHookFinder } from './tagHookFinder';\nimport { BindingsValueManager } from '../bindingsValueManager';\nimport { SelectorHookParserConfig } from '../selectorHookParserConfig';\nimport { SelectorHookParserConfigResolver } from '../selectorHookParserConfigResolver';\nimport { regexes } from '../../../constants/regexes';\nimport { matchAll } from '../../../services/utils/utils';\nimport { ParseOptions } from '../../../services/settings/options';\n\n/**\n * A text parser to load components with their bindings like in Angular templates.\n */\nexport class TextSelectorHookParser implements HookParser {\n  name: string|undefined;\n  config: SelectorHookParserConfig;\n  savedBindings: {[key: number]: SavedBindings} = {};\n\n  constructor(config: SelectorHookParserConfig, private configResolver: SelectorHookParserConfigResolver, private tagHookFinder: TagHookFinder, private bindingsValueManager: BindingsValueManager) {\n    this.config = this.configResolver.processConfig(config);\n    this.name = this.config.name;\n  }\n\n  public findHooks(content: string, context: any, options: ParseOptions): HookPosition[] {\n    let hookPositions = this.config.enclosing ?\n      this.tagHookFinder.findEnclosingTags(content, this.config.selector!, this.config.bracketStyle, options) :\n      this.tagHookFinder.findSingleTags(content, this.config.selector!, this.config.bracketStyle, options);\n\n    if (this.config.allowSelfClosing) {\n      hookPositions = [\n        ...hookPositions, \n        ...this.tagHookFinder.findSelfClosingTags(content, this.config.selector!, this.config.bracketStyle, options)\n      ];\n      hookPositions.sort((a, b) => a.openingTagStartIndex - b.openingTagStartIndex);\n    }\n    \n    return hookPositions;\n  }\n\n  public loadComponent(hookId: number, hookValue: HookValue, context: any, childNodes: any[], options: ParseOptions): HookComponentData {\n    return {\n      component: this.config.component,\n      hostElementTag: this.config.hostElementTag || this.config.selector, // If no hostElementTag specified, use selector (which in the case of TextSelectorHookParser is only allowed to be tag name)\n      injector: this.config.injector,\n      environmentInjector: this.config.environmentInjector\n    };\n  }\n\n  public getBindings(hookId: number, hookValue: HookValue, context: any, options: ParseOptions): HookBindings {\n    let hookBindings = this.savedBindings[hookId];\n\n    // Parse bindings once from hookValue, then reuse on subsequent runs\n    if (hookBindings === undefined) {\n      hookBindings = this.createBindings(hookValue.openingTag!);\n      this.savedBindings[hookId] = hookBindings;\n    }\n\n    // (Re)evaluate if needed\n    this.bindingsValueManager.checkInputBindings(hookBindings.inputs!, context, this.config, options);\n    this.bindingsValueManager.checkOutputBindings(hookBindings.outputs!, this.config, options);\n\n    return {\n      inputs: this.getValuesFromSavedBindings(hookBindings.inputs!),\n      outputs: this.getValuesFromSavedBindings(hookBindings.outputs!)\n    };\n  }\n\n  // Bindings\n  // --------------------------------------------------------------------------\n\n  /**\n   * Returns RichBindingData for Angular-style inputs & output attrs from an openingTag\n   * \n   * @param openingTag - The openingTag to inspect\n   */\n  createBindings(openingTag: string): SavedBindings {\n    const rawInputs = this.collectRawInputs(openingTag!);\n    const inputBindings: {[key: string]: RichBindingData} = {};\n    for (const [rawInputKey, rawInputValue] of Object.entries(rawInputs)) {\n      inputBindings[rawInputKey] = {raw: rawInputValue, parsed: false, value: null, boundContextVariables: {}};\n    }\n\n    const rawOutputs = this.collectRawOutputs(openingTag!);\n    const outputBindings: {[key: string]: RichBindingData} = {};\n    for (const [rawOutputKey, rawOutputValue] of Object.entries(rawOutputs)) {\n      outputBindings[rawOutputKey] = {raw: rawOutputValue, parsed: false, value: null, boundContextVariables: {}};\n    }\n\n    return {\n      inputs: inputBindings,\n      outputs: outputBindings\n    };\n  }\n\n  /**\n   * Collects Angular-style inputs from an openingTag\n   *\n   * @param openingTag - The openingTag to inspect\n   */\n  collectRawInputs (openingTag: string): {[key: string]: any} {\n    const rawNoBracketInputs = this.getBindingsFromOpeningTag(openingTag, 'noBracketInputs', this.config.inputsBlacklist || null, this.config.inputsWhitelist || null);\n    const rawBracketInputs = this.getBindingsFromOpeningTag(openingTag, 'bracketInputs', this.config.inputsBlacklist || null, this.config.inputsWhitelist || null);\n\n    // NoBracketInputs are to be interpreted as plain strings, so wrap them in quotes\n    for (const [noBracketInputName, noBracketInputValue] of Object.entries(rawNoBracketInputs)) {\n      rawNoBracketInputs[noBracketInputName] = \"'\" + noBracketInputValue + \"'\";\n    }\n\n    // Merge both input objects\n    return {...rawNoBracketInputs, ...rawBracketInputs};\n  }\n\n  /**\n   * Collects Angular-style outputs from an openingTag\n   *\n   * @param openingTag - The openingTag to inspect\n   */\n  collectRawOutputs(openingTag: string): {[key: string]: any} {\n    return this.getBindingsFromOpeningTag(openingTag!, 'outputs', this.config.outputsBlacklist || null, this.config.outputsWhitelist || null);\n  }\n\n  /**\n   * Collects Angular-style inputs or outputs from an openingTag\n   *\n   * @param type - What kind of bindings to extract\n   * @param openingTag - The opening tag to inspect\n   * @param blacklist - A list of inputs/outputs to blacklist\n   * @param whitelist - A list of inputs/outputs to whitelist\n   */\n    private getBindingsFromOpeningTag(openingTag: string, type: 'noBracketInputs'|'bracketInputs'|'outputs', blacklist: string[]|null, whitelist: string[]|null): {[key: string]: any} {\n      const bindings: {[key: string]: any} = {};\n  \n      // Examples: https://regex101.com/r/17x3cc/16\n      const attributeValuesOR = '(?:' + regexes.attributeValueDoubleQuotesRegex + '|' + regexes.attributeValueSingleQuotesRegex + ')';\n      let attributeNameRegex;\n      switch (type) {\n        case 'noBracketInputs': attributeNameRegex = regexes.attributeNameNoBracketsRegex; break;\n        case 'bracketInputs': attributeNameRegex = regexes.attributeNameBracketsRegex; break;\n        case 'outputs': attributeNameRegex = regexes.attributeNameRoundBracketsRegex; break;\n      }\n      const attributeRegex = attributeNameRegex + '\\=' + attributeValuesOR;\n      const attributePattern = new RegExp(attributeRegex, 'gim');\n      const attributeMatches = matchAll(openingTag, attributePattern);\n  \n      // Collect raw bindings\n      for (const match of attributeMatches) {\n        // Could be either of the attribute value capturing groups\n        let rawBindingValue = match[2] || match[3];\n        // If value is empty (someInput=\"\"), it will return undefined for it. When using noBracketInputs, return empty string instead.\n        if (rawBindingValue === undefined && type === 'noBracketInputs') {\n          rawBindingValue = '';\n        }\n        bindings[match[1]] = rawBindingValue;\n      }\n  \n      // Filter bindings\n      const filteredBindings: {[key: string]: any} = {};\n      for (const [bindingName, bindingValue] of Object.entries(bindings)) {\n        if (blacklist && blacklist.includes(bindingName)) {\n          continue;\n        }\n        if (whitelist && !whitelist.includes(bindingName)) {\n          continue;\n        }\n        filteredBindings[bindingName] = bindingValue;\n      }\n  \n      return filteredBindings;\n    }\n\n  /**\n   * Transforms a RichBindingData object into a normal bindings object\n   *\n   * @param richBindingsObject - The object containing the RichBindingData\n   */\n  private getValuesFromSavedBindings(richBindingsObject: {[key: string]: RichBindingData}): {[key: string]: any} {\n    const result: {[key: string]: any} = {};\n    for (const [key, value] of Object.entries(richBindingsObject)) {\n      result[key] = value.value;\n    }\n    return result;\n  }\n}\n","import { RichBindingData, SavedBindings } from '../../../interfaces';\nimport { HookParser, HookValue, HookComponentData, HookBindings } from '../../../interfacesPublic';\nimport { BindingsValueManager } from '../bindingsValueManager';\nimport { SelectorHookParserConfig } from '../selectorHookParserConfig';\nimport { SelectorHookParserConfigResolver } from '../selectorHookParserConfigResolver';\nimport { AutoPlatformService } from '../../../services/platform/autoPlatformService';\nimport { ParseOptions } from '../../../services/settings/options';\n\n/**\n * An element parser to load components with their bindings like in Angular templates.\n */\nexport class ElementSelectorHookParser implements HookParser {\n  name: string|undefined;\n  config: SelectorHookParserConfig;\n  savedBindings: {[key: number]: SavedBindings} = {};\n\n  constructor(config: SelectorHookParserConfig, private configResolver: SelectorHookParserConfigResolver, private platformService: AutoPlatformService, private bindingsValueManager: BindingsValueManager) {\n    this.config = this.configResolver.processConfig(config);\n    this.name = this.config.name;\n  }\n\n  public findHookElements(contentElement: any, context: any, options: ParseOptions): any[] {\n    return Array.from(this.platformService.querySelectorAll(contentElement, this.config.selector!));\n  }\n\n  public loadComponent(hookId: number, hookValue: HookValue, context: any, childNodes: any[], options: ParseOptions): HookComponentData {\n\n    // Always scrub potential []-input- and ()-output-attrs from anchor elements \n    this.scrubAngularBindingAttrs(hookValue.element);\n\n    return {\n      component: this.config.component,\n      hostElementTag: this.config.hostElementTag,\n      injector: this.config.injector,\n      environmentInjector: this.config.environmentInjector\n    };\n  }\n\n  public getBindings(hookId: number, hookValue: HookValue, context: any, options: ParseOptions): HookBindings {\n    let hookBindings = this.savedBindings[hookId];\n\n    // Parse bindings once from hookValue, then reuse on subsequent runs (raw values will never change as hookValue.element is a snapshot)\n    if (hookBindings === undefined) {\n      hookBindings = this.createBindings(hookValue.elementSnapshot!);\n      this.savedBindings[hookId] = hookBindings;\n    }\n\n    // (Re)evaluate if needed\n    this.bindingsValueManager.checkInputBindings(hookBindings.inputs!, context, this.config, options);\n    this.bindingsValueManager.checkOutputBindings(hookBindings.outputs!, this.config, options);\n\n    return {\n      inputs: this.getValuesFromSavedBindings(hookBindings.inputs!),\n      outputs: this.getValuesFromSavedBindings(hookBindings.outputs!)\n    };\n  }\n\n  // Bindings\n  // --------------------------------------------------------------------------\n\n  /**\n   * Always removes angular-typical template attrs like []-input and ()-outputs from anchors\n   *\n   * @param anchorElement - The element to strub\n   */\n  scrubAngularBindingAttrs(anchorElement: any) {\n    const attrsToScrub = Array.from(anchorElement.attributes)\n      .map((attrObj: any) => attrObj.name)\n      .filter((attr: string) => \n        (attr.startsWith('[') && attr.endsWith(']')) ||\n        (attr.startsWith('(') && attr.endsWith(')'))\n      );\n\n    for (const attr of attrsToScrub) {\n      this.platformService.removeAttribute(anchorElement, attr);\n    }\n  }\n\n  /**\n   * Returns RichBindingData for Angular-style inputs & output attrs from an element\n   * \n   * @param element - The element to inspect\n   */\n  createBindings(element: any): SavedBindings {\n    const rawInputs = this.collectRawBindings(element!, 'inputs', this.config.inputsBlacklist || null, this.config.inputsWhitelist || null);\n    const inputBindings: {[key: string]: RichBindingData} = {};\n    for (const [rawInputKey, rawInputValue] of Object.entries(rawInputs)) {\n      inputBindings[rawInputKey] = {raw: rawInputValue, parsed: false, value: null, boundContextVariables: {}};\n    }\n\n    const rawOutputs = this.collectRawBindings(element!, 'outputs', this.config.outputsBlacklist || null, this.config.outputsWhitelist || null);\n    const outputBindings: {[key: string]: RichBindingData} = {};\n    for (const [rawOutputKey, rawOutputValue] of Object.entries(rawOutputs)) {\n      outputBindings[rawOutputKey] = {raw: rawOutputValue, parsed: false, value: null, boundContextVariables: {}};\n    }\n\n    return {\n      inputs: inputBindings,\n      outputs: outputBindings\n    };\n  }\n\n  /**\n   * Returns Angular-style inputs or output attrs from an element\n   * \n   * @param element - The element to inspect\n   * @param type - Whether to return the inputs or outputs\n   * @param blacklist - A list of inputs/outputs to blacklist\n   * @param whitelist - A list of inputs/outputs to whitelist\n   */\n  collectRawBindings (element: any, type: 'inputs'|'outputs', blacklist: string[]|null, whitelist: string[]|null): {[key: string]: any} {\n    const bindings: {[key: string]: any} = {};\n\n    // Collect raw bindings\n    const attrNames = this.platformService.getAttributeNames(element);\n    for (let attrName of attrNames) {\n      if (\n        type === 'inputs' && (!attrName.startsWith('(') || !attrName.endsWith(')')) ||\n        type === 'outputs' && (attrName.startsWith('(') && attrName.endsWith(')'))\n      ) {\n        let binding: any = this.platformService.getAttribute(element, attrName);\n\n        // If input has []-brackets: Transform empty attr to undefined\n        if (type === 'inputs' && attrName.startsWith('[') && attrName.endsWith(']') && binding === '') {\n          binding = undefined;\n        }\n\n        // If input has no []-brackets: Should be interpreted as plain strings, so wrap in quotes\n        if (type === 'inputs' && (!attrName.startsWith('[') || !attrName.endsWith(']'))) {\n          binding = `'${binding}'`;\n        }\n\n        // Trim [] and () brackets from attr name\n        attrName = attrName.replace(/^\\[|^\\(|\\]$|\\)$/g, '');\n\n        bindings[attrName] = binding;\n      }\n    }\n    \n    // Filter bindings\n    const filteredBindings: {[key: string]: any} = {};\n    for (const [bindingName, bindingValue] of Object.entries(bindings)) {\n      if (blacklist && blacklist.includes(bindingName)) {\n        continue;\n      }\n      if (whitelist && !whitelist.includes(bindingName)) {\n        continue;\n      }\n      filteredBindings[bindingName] = bindingValue;\n    }\n\n    return filteredBindings;\n  }\n\n  /**\n   * Transforms a RichBindingData object into a normal bindings object\n   *\n   * @param richBindingsObject - The object containing the RichBindingData\n   */\n  private getValuesFromSavedBindings(richBindingsObject: {[key: string]: RichBindingData}): {[key: string]: any} {\n    const result: {[key: string]: any} = {};\n    for (const [key, value] of Object.entries(richBindingsObject)) {\n      result[key] = value.value;\n    }\n    return result;\n  }\n}\n","import { EnvironmentInjector, Injector } from '@angular/core';\nimport { ComponentConfig } from '../../interfacesPublic';\n\n/**\n * Several options to configure and instantiate a `SelectorHookParser` with\n */\nexport interface SelectorHookParserConfig {\n    /**\n     * The component to be used. Can be its class or a `LazyLoadComponentConfig`.\n     */\n    component: ComponentConfig;\n\n    /**\n     * The name of the parser. Only required if you want to black- or whitelist it.\n     */\n    name?: string;\n\n    /**\n     * The selector to use to find the hook.\n     */\n    selector?: string;\n\n    /**\n     * A custom tag to be used for the component host element.\n     */\n    hostElementTag?: string;\n\n    /**\n     * Whether to use regular expressions rather than HTML/DOM-based methods to find the hook elements\n     */\n    parseWithRegex?: boolean;\n\n    /**\n     * Whether to allow using self-closing selector tags (`<hook/>`) in addition to enclosing tags (`<hook>...</hook>`)\n     */\n    allowSelfClosing?: boolean;\n\n    /**\n     * @deprecated Whether the selector is enclosing (`<hook>...</hook>`) or not (`<hook>`). Use the \"allowSelfClosing\" option for a more modern approach.\n     */\n    enclosing?: boolean;\n\n    /**\n     * The brackets to use for the selector.\n     */\n    bracketStyle?: {opening: string, closing: string};\n\n    /**\n     * Whether to parse inputs into data types or leave them as strings.\n     */\n    parseInputs?: boolean;\n\n    /**\n     * Whether to remove escaping backslashes from inputs.\n     */\n    unescapeStrings?: boolean;\n\n    /**\n     * The Injector to create the component with.\n     */\n    injector?: Injector;\n\n    /**\n     * The EnvironmentInjector to create the component with.\n     */\n    environmentInjector?: EnvironmentInjector;\n\n    /**\n     * A list of inputs to ignore.\n     */\n    inputsBlacklist?: string[];\n\n    /**\n     * A list of inputs to allow exclusively.\n     */\n    inputsWhitelist?: string[];\n\n    /**\n     * A list of outputs to ignore.\n     */\n    outputsBlacklist?: string[];\n\n    /**\n     * A list of outputs to allow exclusively.\n     */\n    outputsWhitelist?: string[];\n\n    /**\n     * Whether to allow the use of context object variables in inputs and outputs.\n     */\n    allowContextInBindings?: boolean;\n\n    /**\n     * Whether to allow calling context object functions in inputs and outputs.\n     */\n    allowContextFunctionCalls?: boolean;\n}\n\n// Overwrites SelectorHookParserConfig so some values can be undefined for the defaults. If still undefined after merging with user config, throws error programmatically.\nexport type SelectorHookParserConfigDefaults = Omit<SelectorHookParserConfig, 'component'> & { component: ComponentConfig|undefined };\n\n/**\n * The default values for the SelectorHookParserConfig\n */\nexport const selectorHookParserConfigDefaults: SelectorHookParserConfigDefaults = {\n    component: undefined,\n    name: undefined,\n    parseWithRegex: false,\n    selector: undefined,\n    hostElementTag: undefined,\n    injector: undefined,\n    allowSelfClosing: true,\n    enclosing: true,\n    bracketStyle: {opening: '<', closing: '>'},\n    parseInputs: true,\n    unescapeStrings: true,\n    inputsBlacklist: undefined,\n    inputsWhitelist: undefined,\n    outputsBlacklist: undefined,\n    outputsWhitelist: undefined,\n    allowContextInBindings: true,\n    allowContextFunctionCalls: true\n};\n","import { Injectable, reflectComponentType } from '@angular/core';\nimport { SelectorHookParserConfig, SelectorHookParserConfigDefaults, selectorHookParserConfigDefaults } from './selectorHookParserConfig';\n\n/**\n * A helper class for resolving a SelectorHookParserConfig\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class SelectorHookParserConfigResolver {\n\n  constructor() {\n  }\n\n  /**\n   * Overwrites the default parser config with a (partial) SelectorHookParserConfig object and returns the result\n   *\n   * @param userParserConfig - The (partial) SelectorHookParserConfig object\n   */\n  processConfig(userParserConfig: SelectorHookParserConfig): SelectorHookParserConfig {\n    const parserConfig: SelectorHookParserConfigDefaults = JSON.parse(JSON.stringify(selectorHookParserConfigDefaults));\n\n    // component\n    if (!userParserConfig || !userParserConfig.hasOwnProperty('component')) {\n      throw Error('Missing the required \"component\" property for the SelectorHookParserConfig. Must be either the component class or a LazyLoadComponentConfig.');\n    }\n    parserConfig.component = userParserConfig.component;\n\n    // If is class\n    if (userParserConfig.component.hasOwnProperty('prototype')) {\n      const compMeta = reflectComponentType(userParserConfig.component as (new(...args: any[]) => any))!;\n      parserConfig.selector = compMeta.selector;\n\n    // If is LazyLoadingComponentConfig\n    } else if (userParserConfig.component.hasOwnProperty('importPromise') && userParserConfig.component.hasOwnProperty('importName')) {\n      if (!userParserConfig.hasOwnProperty('selector')) {\n        throw Error(`When using lazy-loaded dynamic components, you have to specify the \"selector\" property in the parser config, as the real selector can't be known before the component is loaded.`); \n      }\n    // If is neither\n    } else {\n      throw Error('The \"component\" property in the SelectorHookParserConfig must either contain the component class or a LazyLoadComponentConfig.');\n    }\n\n    // name\n    if (userParserConfig.hasOwnProperty('name')) {\n      if (typeof userParserConfig.name !== 'string') { throw Error('The submitted \"name\" property in the SelectorHookParserConfig must be of type string, was ' + typeof userParserConfig.name); }\n      parserConfig.name = userParserConfig.name;\n    }\n\n    // selector (defaults to component selector)\n    if (userParserConfig.hasOwnProperty('selector')) {\n      if (typeof userParserConfig.selector !== 'string') { throw Error('The submitted \"selector\" property in the SelectorHookParserConfig must be of type string, was ' + typeof userParserConfig.selector); }\n      parserConfig.selector = userParserConfig.selector;\n    }\n\n    // hostElementTag\n    if (userParserConfig.hasOwnProperty('hostElementTag')) {\n      if (typeof userParserConfig.hostElementTag !== 'string') { throw Error('The submitted \"hostElementTag\" property in the SelectorHookParserConfig must be of type string, was ' + typeof userParserConfig.hostElementTag); }\n      parserConfig.hostElementTag = userParserConfig.hostElementTag;\n    }\n\n    // parseWithRegex\n    if (userParserConfig.hasOwnProperty('parseWithRegex')) {\n      if (typeof userParserConfig.parseWithRegex !== 'boolean') { throw Error('The submitted \"parseWithRegex\" property in the SelectorHookParserConfig must be of type boolean, was ' + typeof userParserConfig.parseWithRegex); }\n      parserConfig.parseWithRegex = userParserConfig.parseWithRegex;\n    }\n\n    // allowSelfClosing\n    if (userParserConfig.hasOwnProperty('allowSelfClosing')) {\n      if (typeof userParserConfig.allowSelfClosing !== 'boolean') { throw Error('The submitted \"allowSelfClosing\" property in the SelectorHookParserConfig must be of type boolean, was ' + typeof userParserConfig.allowSelfClosing); }\n      parserConfig.allowSelfClosing = userParserConfig.allowSelfClosing;\n    }\n\n    // enclosing\n    if (userParserConfig.hasOwnProperty('enclosing')) {\n      if (typeof userParserConfig.enclosing !== 'boolean') { throw Error('The submitted \"enclosing\" property in the SelectorHookParserConfig must be of type boolean, was ' + typeof userParserConfig.enclosing); }\n      parserConfig.enclosing = userParserConfig.enclosing;\n    }\n\n    // bracketStyle\n    if (userParserConfig.hasOwnProperty('bracketStyle')) {\n      if (typeof userParserConfig.bracketStyle !== 'object' || typeof userParserConfig.bracketStyle.opening !== 'string' || typeof userParserConfig.bracketStyle.closing !== 'string') {\n        throw Error('The submitted \"bracketStyle\" property in the SelectorHookParserConfig must have the form {opening: string, closing: string}');\n      }\n      parserConfig.bracketStyle = userParserConfig.bracketStyle;\n    }\n\n    // injector (defaults to undefined)\n    if (userParserConfig.hasOwnProperty('injector')) {\n      parserConfig.injector = userParserConfig.injector;\n    }\n\n    // environmentInjector (defaults to undefined)\n    if (userParserConfig.hasOwnProperty('environmentInjector')) {\n      parserConfig.environmentInjector = userParserConfig.environmentInjector;\n    }\n\n    // unescapeStrings\n    if (userParserConfig.hasOwnProperty('unescapeStrings')) {\n      if (typeof userParserConfig.unescapeStrings !== 'boolean') { throw Error('The submitted \"unescapeStrings\" property in the SelectorHookParserConfig must be of type boolean, was ' + typeof userParserConfig.unescapeStrings); }\n      parserConfig.unescapeStrings = userParserConfig.unescapeStrings;\n    }\n\n    // parseInputs\n    if (userParserConfig.hasOwnProperty('parseInputs')) {\n      if (typeof userParserConfig.parseInputs !== 'boolean') { throw Error('The submitted \"parseInputs\" property in the SelectorHookParserConfig must be of type boolean, was ' + typeof userParserConfig.parseInputs); }\n      parserConfig.parseInputs = userParserConfig.parseInputs;\n    }\n\n    // inputsBlacklist\n    if (userParserConfig.hasOwnProperty('inputsBlacklist')) {\n      if (!Array.isArray(userParserConfig.inputsBlacklist)) { throw Error('The submitted \"inputsBlacklist\" property in the SelectorHookParserConfig must be an array of strings.'); }\n      for (const entry of userParserConfig.inputsBlacklist) {\n        if (typeof entry !== 'string') { throw Error('All entries of the submitted \"inputsBlacklist\" property in the SelectorHookParserConfig must be of type string, ' + typeof entry + ' found.'); }\n      }\n      parserConfig.inputsBlacklist = userParserConfig.inputsBlacklist;\n    }\n\n    // inputsWhitelist\n    if (userParserConfig.hasOwnProperty('inputsWhitelist')) {\n      if (!Array.isArray(userParserConfig.inputsWhitelist)) { throw Error('The submitted \"inputsWhitelist\" property in the SelectorHookParserConfig must be an array of strings.'); }\n      for (const entry of userParserConfig.inputsWhitelist) {\n        if (typeof entry !== 'string') { throw Error('All entries of the submitted \"inputsWhitelist\" property in the SelectorHookParserConfig must be of type string, ' + typeof entry + ' found.'); }\n      }\n      parserConfig.inputsWhitelist = userParserConfig.inputsWhitelist;\n    }\n\n    // outputsBlacklist\n    if (userParserConfig.hasOwnProperty('outputsBlacklist')) {\n      if (!Array.isArray(userParserConfig.outputsBlacklist)) { throw Error('The submitted \"outputsBlacklist\" property in the SelectorHookParserConfig must be an array of strings.'); }\n      for (const entry of userParserConfig.outputsBlacklist) {\n        if (typeof entry !== 'string') { throw Error('All entries of the submitted \"outputsBlacklist\" property in the SelectorHookParserConfig must be of type string, ' + typeof entry + ' found.'); }\n      }\n      parserConfig.outputsBlacklist = userParserConfig.outputsBlacklist;\n    }\n\n    // outputsWhitelist\n    if (userParserConfig.hasOwnProperty('outputsWhitelist')) {\n      if (!Array.isArray(userParserConfig.outputsWhitelist)) { throw Error('The submitted \"outputsWhitelist\" property in the SelectorHookParserConfig must be an array of strings.'); }\n      for (const entry of userParserConfig.outputsWhitelist) {\n        if (typeof entry !== 'string') { throw Error('All entries of the submitted \"outputsWhitelist\" property in the SelectorHookParserConfig must be of type string, ' + typeof entry + ' found.'); }\n      }\n      parserConfig.outputsWhitelist = userParserConfig.outputsWhitelist;\n    }\n\n    // allowContextInBindings\n    if (userParserConfig.hasOwnProperty('allowContextInBindings')) {\n      if (typeof userParserConfig.allowContextInBindings !== 'boolean') { throw Error('The submitted \"allowContextInBindings\" property in the SelectorHookParserConfig must be of type boolean, was ' + typeof userParserConfig.allowContextInBindings); }\n      parserConfig.allowContextInBindings = userParserConfig.allowContextInBindings;\n    }\n\n    // allowContextFunctionCalls\n    if (userParserConfig.hasOwnProperty('allowContextFunctionCalls')) {\n      if (typeof userParserConfig.allowContextFunctionCalls !== 'boolean') { throw Error('The submitted \"allowContextFunctionCalls\" property in the SelectorHookParserConfig must be of type boolean, was ' + typeof userParserConfig.allowContextFunctionCalls); }\n      parserConfig.allowContextFunctionCalls = userParserConfig.allowContextFunctionCalls;\n    }\n\n    return parserConfig as SelectorHookParserConfig;\n  }\n}\n","import { InjectionToken } from \"@angular/core\";\n\nexport type PlatformService =  Partial<CompletePlatformService>;\n\nexport const PLATFORM_SERVICE = new InjectionToken<PlatformService>('An injection token to retrieve an optionally user-provided PlatformService');\n\n/**\n * Extend this service to implement custom platform.\n */\nexport interface CompletePlatformService {\n\n  /**\n   * Returns the Angular Version.\n   * Returns null when it couldn't be retrieved\n   */\n  getNgVersion(): number|null;\n\n  /**\n   * Sanitizes a string of arbitrary html content to be safe for use in innerHTML\n   * Returns the sanitized html string\n   * @param content The content to be sanitized.\n   */\n  sanitize(content: string): string;\n\n  /**\n   * Creates an element and returns it\n   * @param tagName The name of the element\n   */\n  createElement(tagName: string): any;\n\n  /**\n   * Given two elements, return a number indicating which one comes first\n   * @param a - The first element\n   * @param b - The second element\n   * @returns - 1 if b comes before a, -1 if a comes before b, 0 if equivalent\n   */\n  sortElements(a: any, b: any): number\n\n  /**\n   * Return a shallow clone of an element (just the element itself, not its children)\n   *\n   * @param element - The element to clone\n   */\n  cloneElement(element: any): any\n\n  /**\n   * Returns the tag name of an element\n   * @param element An element\n   */\n  getTagName(element: any): string;\n\n  /**\n   * Returns the opening tag of an element as a string\n   * @param element An element\n   */\n  getOpeningTag(element: any): string;\n\n  /**\n   * Returns the closing tag of an element as a string\n   * @param element An element\n   */\n  getClosingTag(element: any): string;\n\n  /**\n   * Returns the names of all existing attributes of an element\n   * Return an emtpy array if none exist\n   * @param element The element\n   */\n  getAttributeNames(element: any): string[];\n\n  /**\n   * Returns the value of an element attribute.\n   * Returns null when the attribute doesn't exist\n   * @param element The element\n   * @param attributeName Attribute Name\n   */\n  getAttribute(element: any, attributeName: string): string|null;\n\n  /**\n   * Sets the value of an element attribute.\n   * @param element The element\n   * @param attributeName Attribute Name\n   * @param value The attribute value\n   */\n  setAttribute(element: any, attributeName: string, value: string): void;\n\n  /**\n   * Removes the value of an element attribute.\n   * @param element The element\n   * @param attributeName Attribute Name\n   */\n  removeAttribute(element: any, attributeName: string): void;\n\n  /**\n   * Returns the parent of a node.\n   * Returns null when a parent node doesn't exist\n   * @param parentany The parent element\n   */\n  getParentNode(parentNode: any): any|null;\n\n  /**\n   * Returns child elements of a parent element that match a certain css selector\n   * Returns an empty array of none could be found\n   * @param parentElement The parent element\n   * @param selector A css-style selector (like \"div.myClass\")\n   */\n  querySelectorAll(parentElement: any, selector: string): any[];\n\n  /**\n   * Returns an array of child nodes.\n   * Returns an empty array if none exist\n   * @param parentNode A node\n   */\n  getChildNodes(parentNode: any): any[];\n\n  /**\n   * Appends a child node to a parent.\n   * @param parentNode The parent node\n   * @param childNode The child node to be removed\n   */\n  appendChild(parentNode: any, childNode: any): void;\n\n  /**\n   * Inserts a child node before another child node of a parent node.\n   * @param parentNode The parent node\n   * @param childNode The child node to be inserted\n   * @param referenceNode The existing node before which childNode is inserted\n   */\n  insertBefore(parentNode: any, childNode: any, referenceNode: any): void;\n\n  /**\n  * Removes all child nodes from a parent node.\n  * @param parentNode The parent node\n  */\n  clearChildNodes(parentNode: any): void;\n\n  /**\n   * Removes a child node from its parent.\n   * @param parentNode The parent node\n   * @param childNode The child node to be removed\n   */\n  removeChild(parentNode: any, childNode: any): void;\n\n  /**\n   * Returns the inner content of an element (like HTMLElement.innerHTML)\n   * @param element An element\n   */\n  getInnerContent(element: any): string;\n\n  /**\n   * Sets the content of an element.\n   * @param element An element\n   * @param content The element content\n   */\n  setInnerContent(element: any, content: string): void;\n\n  /**\n   * Returns a boolean determining whether an element is a text node or not\n   * @param element An element\n   */\n  isTextNode(element: any): boolean;\n\n   /**\n   * Creates a text node and returns it\n   * @param content The text content of the node\n   */\n  createTextNode(content: string): any;\n\n  /**\n   * Returns the pure text content of an element (like Node.textContent)\n   * @param element An element\n   */\n  getTextContent(element: any): string|null;\n\n  /**\n   * Dispatches a event from an element\n   * @param element The element\n   * @param name The event name\n   * @param payload The event content\n   */\n  dispatchEvent(element: any, name: string, payload: any): void;\n\n}\n","import { Inject, Injectable, Renderer2, RendererFactory2, SecurityContext } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { CompletePlatformService } from './platformService';\nimport { DOCUMENT } from '@angular/common';\n\n/**\n * General implementation of PlatformService suited for both the standard browser and server environments\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class DefaultPlatformService implements CompletePlatformService {\n  private renderer: Renderer2;\n\n  constructor(@Inject(DOCUMENT) private document: Document, private rendererFactory: RendererFactory2, private sanitizer: DomSanitizer) { \n    this.renderer = this.rendererFactory.createRenderer(null, null);\n  }\n\n  getNgVersion() {\n    if (typeof this.document !== \"undefined\") {\n      const versionElement = this.querySelectorAll(this.document, '[ng-version]')?.[0];\n      const versionAttr = versionElement?.getAttribute('ng-version');\n      if (versionAttr) {\n        return parseInt(versionAttr, 10);\n      }\n    }\n\n    return null;\n  }\n  \n  sanitize(content: string) {\n    return this.sanitizer.sanitize(SecurityContext.HTML, content) || '';\n  }\n\n  createElement(tagName: string): Element {\n    return this.renderer.createElement(tagName);\n  }\n\n  sortElements(a: Element, b: Element): number {\n    if ( a === b) return 0;\n\n    if ( !a.compareDocumentPosition) {\n      // support for IE8 and below\n      return (a as any).sourceIndex - (b as any).sourceIndex;\n    }\n\n    if ( a.compareDocumentPosition(b) & 2) {\n      // b comes before a\n      return 1;\n    }\n\n    return -1;\n  }\n\n  cloneElement(element: Element) {\n    return element.cloneNode(true);\n  }\n\n  getTagName(element: Element) {\n    return element.tagName;\n  }\n\n  getOpeningTag(element: any) {\n    // Approach by: https://stackoverflow.com/a/55859966/3099523\n    const innerLength = element.innerHTML.length\n    const outerLength = element.outerHTML.length;\n    \n    // Check for self-closing elements\n    const openingTagLength = element.outerHTML[outerLength - 2] === '/' ?\n      outerLength :\n      outerLength - innerLength - element.tagName.length - 3;\n    \n    return element.outerHTML.slice(0, openingTagLength);\n  }\n\n  getClosingTag(element: any) {\n    return element.outerHTML.slice(element.outerHTML.length - element.tagName.length - 3);\n  }\n\n  getAttributeNames(element: Node) {\n    return typeof (element as any).getAttributeNames === 'function' ? (element as any).getAttributeNames() : [];\n  }\n\n  getAttribute(element: Element, attributeName: string) {\n    return typeof (element as any).getAttribute === 'function' ? (element as any).getAttribute(attributeName) : null;\n  }\n\n  setAttribute(element: Element, attributeName: string, value: string) {\n    this.renderer.setAttribute(element, attributeName, value);\n  }\n\n  removeAttribute(element: any, attributeName: string) {\n    this.renderer.removeAttribute(element, attributeName);\n  }\n\n  getParentNode(element: Node): Node|null {\n    try {\n      return this.renderer.parentNode(element);\n    } catch (e) {\n      return null;\n    }\n  }\n\n  querySelectorAll(parentElement: Document|Element, selector: string): Element[] {\n    return Array.from(parentElement.querySelectorAll(selector));\n  }\n\n  getChildNodes(node: Node): Node[] {\n    return Array.prototype.slice.call(node.childNodes);\n  }\n\n  appendChild(parentElement: Node, childElement: Node) {\n    this.renderer.appendChild(parentElement, childElement);\n  }\n\n  insertBefore(parentElement: Node, childElement: Node, referenceElement: Node) {\n    this.renderer.insertBefore(parentElement, childElement, referenceElement);\n  }\n  \n  clearChildNodes(element: Node) {\n    if (element) {\n      while (element.firstChild) {\n        this.removeChild(element, element.firstChild);\n      }\n    }\n  }\n\n  removeChild(parentElement: Node, childElement: Node) {\n    parentElement.removeChild(childElement);\n  }\n\n  getInnerContent(element: Element) {\n    return element.innerHTML;\n  }\n\n  setInnerContent(element: Element, content: string) {\n    if (element) {\n      element.innerHTML = content;\n    }\n  }\n\n  isTextNode(element: Node) {\n    return element.nodeType === Node.TEXT_NODE;\n  }\n\n  createTextNode(content: string) {\n    return document.createTextNode(content);\n  }\n\n  getTextContent(element: Node) {\n    return element.textContent;\n  }\n\n  dispatchEvent(element: Node, name: string, payload: any) {\n    element.dispatchEvent(new CustomEvent(name, { detail: payload, bubbles: true }));\n  }\n}","import { Inject, Injectable, Optional } from '@angular/core';\nimport { CompletePlatformService, PLATFORM_SERVICE, PlatformService } from './platformService';\nimport { DefaultPlatformService } from './defaultPlatformService';\n\n/**\n * Wrapper class that either calls user-provided PlatformService methods or falls back to default implementations\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class AutoPlatformService implements CompletePlatformService {\n\n  constructor(@Optional() @Inject(PLATFORM_SERVICE) private userPlatformService: PlatformService, private defaultPlatformService: DefaultPlatformService) {\n  }\n\n  private getFor (methodName: string): PlatformService {\n    if (this.userPlatformService && typeof (this.userPlatformService as any)[methodName] === 'function') {\n      return this.userPlatformService\n    } else {\n      return this.defaultPlatformService;\n    }\n  }\n\n  getNgVersion() {\n    return this.getFor('getNgVersion').getNgVersion!();\n  }\n  \n  sanitize(content: string) {\n    return this.getFor('sanitize').sanitize!(content);\n  }\n\n  createElement(tagName: string) {\n    return this.getFor('createElement').createElement!(tagName);\n  }\n\n  sortElements(a: any, b: any): number {\n    return this.getFor('sortElements').sortElements!(a, b);\n  }\n\n  cloneElement(element: any) {\n    return this.getFor('cloneElement').cloneElement!(element);\n  }\n\n  getTagName(element: any) {\n    return this.getFor('getTagName').getTagName!(element);\n  }\n\n  getOpeningTag(element: any) {\n    return this.getFor('getOpeningTag').getOpeningTag!(element);\n  }\n\n  getClosingTag(element: any) {\n    return this.getFor('getClosingTag').getClosingTag!(element);\n  }\n\n  getAttributeNames(element: any) {\n    return this.getFor('getAttributeNames').getAttributeNames!(element);\n  }\n\n  getAttribute(element: any, attributeName: string) {\n    return this.getFor('getAttribute').getAttribute!(element, attributeName);\n  }\n\n  setAttribute(element: any, attributeName: string, value: string) {\n    return this.getFor('setAttribute').setAttribute!(element, attributeName, value);\n  }\n\n  removeAttribute(element: any, attributeName: string) {\n    return this.getFor('removeAttribute').removeAttribute!(element, attributeName);\n  }\n\n  getParentNode(element: any) {\n    return this.getFor('getParentNode').getParentNode!(element);\n  }\n\n  querySelectorAll(parentElement: any, selector: string) {\n    return this.getFor('querySelectorAll').querySelectorAll!(parentElement, selector);\n  }\n\n  getChildNodes(node: any) {\n    return this.getFor('getChildNodes').getChildNodes!(node);\n  }\n\n  appendChild(parentElement: any, childElement: any) {\n    return this.getFor('appendChild').appendChild!(parentElement, childElement);\n  }\n\n  insertBefore(parentElement: any, childElement: any, referenceElement: any) {\n    return this.getFor('insertBefore').insertBefore!(parentElement, childElement, referenceElement);\n  }\n  \n  clearChildNodes(element: any) {\n    return this.getFor('clearChildNodes').clearChildNodes!(element);\n  }\n\n  removeChild(parentElement: any, childElement: any) {\n    return this.getFor('removeChild').removeChild!(parentElement, childElement);\n  }\n\n  getInnerContent(element: any) {\n    return this.getFor('getInnerContent').getInnerContent!(element);\n  }\n\n  setInnerContent(element: any, content: string) {\n    return this.getFor('setInnerContent').setInnerContent!(element, content);\n  }\n\n  isTextNode(element: any) {\n    return this.getFor('isTextNode').isTextNode!(element);\n  }\n\n  createTextNode(content: string) {\n    return this.getFor('createTextNode').createTextNode!(content);\n  }\n\n  getTextContent(element: any) {\n    return this.getFor('getTextContent').getTextContent!(element);\n  }\n\n  dispatchEvent(element: any, name: string, payload: any) {\n    return this.getFor('dispatchEvent').dispatchEvent!(element, name, payload);\n  }\n\n}","import { isPlatformBrowser } from '@angular/common';\nimport { isDevMode, Injectable, Inject, PLATFORM_ID } from '@angular/core';\nimport { ParseOptions } from '../settings/options';\n\n/**\n * A utility service to print logs and warnings\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class Logger {\n\n  constructor(@Inject(PLATFORM_ID) private platformId: string) {\n  }\n\n  log(content: any[], options: ParseOptions): void {\n    this.handleLog(content, options, 'log');\n  }\n\n  warn(content: any[], options: ParseOptions): void {\n    this.handleLog(content, options, 'warn');\n  }\n\n  error(content: any[], options: ParseOptions): void {\n    this.handleLog(content, options, 'error');\n  }\n\n  /**\n   * Logs an array of content according to the submitted options\n   * \n   * @param content - The content to log\n   * @param options - The current ParseOptions\n   * @param method - The console method to use\n   */\n  private handleLog(content: any[], options: ParseOptions, method: string) {\n    if (\n      options.logOptions?.dev && this.isDevMode() && isPlatformBrowser(this.platformId) ||\n      options.logOptions?.prod && !this.isDevMode() && isPlatformBrowser(this.platformId) ||\n      options.logOptions?.ssr && !isPlatformBrowser(this.platformId)\n    ) { \n      (console as any)[method](...content);\n    }\n  }\n\n  /**\n   * Use local method that is easier to mock in tests\n   */\n  private isDevMode(): boolean {\n    return isDevMode();\n  } \n}\n","import { Injectable } from '@angular/core';\nimport { HookPosition } from '../../interfacesPublic';\nimport { matchAll } from './utils';\nimport { Logger } from './logger';\nimport { getParseOptionDefaults, ParseOptions } from '../settings/options';\n\n/**\n * A utility service to easily parse hooks from text content\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class HookFinder {\n\n  constructor(private logger: Logger) {}\n\n  /**\n   * Finds all text hooks in a piece of content, e.g. <hook>...</hook>, and returns their positions\n   * \n   * @param content - The text to parse\n   * @param openingTagRegex - The regex for the opening tag\n   * @param closingTagRegex - The regex for the closing tag\n   * @param includeNested - Whether to include nested hooks in the result\n   * @param options - The current ParseOptions\n   */\n  find(content: string, openingTagRegex: RegExp, closingTagRegex?: RegExp, includeNested?: boolean, options: ParseOptions = getParseOptionDefaults()): HookPosition[] {\n    if (!closingTagRegex) {\n      return this.findSingletagHooks(content, openingTagRegex);\n    } else {\n      return this.findEnclosingHooks(content, openingTagRegex, closingTagRegex, includeNested, options)\n    }\n  }\n\n  /**\n   * Finds all text hooks that are non-enclosing in a piece of text, e.g. <hook>\n   *\n   * @param content - The text to search\n   * @param hookRegex - The regex to use for the hook\n   */\n  findSingletagHooks(content: string, hookRegex: RegExp): HookPosition[] {\n    const result: HookPosition[] = [];\n\n    // Find all hooks\n    const openingTagMatches = matchAll(content, hookRegex);\n\n    for (const match of openingTagMatches) {\n      result.push({\n        openingTagStartIndex: match.index,\n        openingTagEndIndex: match.index + match[0].length,\n        closingTagStartIndex: null,\n        closingTagEndIndex: null,\n      });\n    }\n\n    return result;\n  }\n\n  /**\n   * Finds all text hooks that are enclosing in a piece of text, e.g. <hook>...</hook>\n   *\n   * Correctly finding enclosing hooks requires a programmatic parser rather then just regex alone, as regex cannot handle\n   * patterns that are potentially nested within themselves.\n   *\n   * - If the content between the opening and closing is lazy (.*?), it would take the first closing tag after the opening tag,\n   *   regardless if it belongs to the opening tag or actually a nested hook. This would falsely match the first and third tag\n   *   in this example: '<hook><hook></hook></hook>'\n   *\n   * - If the content between the opening and closing is greedy (.*), it would only end on the last closing tag in the string,\n   *   ignoring any previous closing tags. This would falsely match the first and fourth tag in this example:\n   *   '<hook></hook><hook></hook>'\n   *\n   * There is no regex that works for both scenarios. This method therefore manually counts and compares the opening tags with the closing tags.\n   *\n   * @param content - The text to parse\n   * @param openingTagRegex - The regex for the opening tag\n   * @param closingTagRegex - The regex for the closing tag\n   * @param includeNested - Whether to include nested hooks in the result\n   * @param options - The current parseOptions\n   */\n  findEnclosingHooks(content: string, openingTagRegex: RegExp, closingTagRegex: RegExp, includeNested?: boolean, options: ParseOptions = getParseOptionDefaults()): HookPosition[] {\n    const allTags = [];\n    const result: HookPosition[] = [];\n\n    // Find all opening tags\n    const openingTagMatches = matchAll(content, openingTagRegex);\n    for (const match of openingTagMatches) {\n      allTags.push({\n        isOpening: true,\n        value: match[0],\n        startIndex: match.index,\n        endIndex: match.index + match[0].length\n      });\n    }\n\n    // Find all closing tags\n    const closingTagMatches = matchAll(content, closingTagRegex);\n    for (const match of closingTagMatches) {\n      allTags.push({\n        isOpening: false,\n        value: match[0],\n        startIndex: match.index,\n        endIndex: match.index + match[0].length\n      });\n    }\n\n    // Sort by startIndex\n    allTags.sort((a, b) => a.startIndex - b.startIndex);\n\n    // Create HookPositions by figuring out which opening tag belongs to which closing tag\n    const openedTags = [];\n    allTagsLoop: for (const [index, tag] of allTags.entries()) {\n\n      // Any subsequent tag is only allowed to start after previous tag has ended\n      if (index > 0 && tag.startIndex < allTags[index - 1].endIndex) {\n        this.logger.warn(['Syntax error - New tag \"' + tag.value + '\" started at position ' + tag.startIndex + ' before previous tag \"' + allTags[index - 1].value + '\" ended at position ' + allTags[index - 1].endIndex + '. Ignoring.'], options);\n        continue;\n      }\n\n      // Opening or closing tag?\n      if (tag.isOpening) {\n        openedTags.push(tag);\n      } else {\n        // Syntax error: Closing tag without preceding opening tag. Syntax error.\n        if (openedTags.length === 0) {\n          this.logger.warn(['Syntax error - Closing tag without preceding opening tag found: \"' + tag.value + '\". Ignoring.'], options);\n          continue;\n        }\n\n        // If nested hooks not allowed and more than one tag is open, discard both this closing tag and the latest opening tag\n        if (includeNested === false && openedTags.length > 1) {\n          openedTags.pop();\n          continue;\n        }\n\n        // Valid hook! Add to result array\n        const openingTag = openedTags[openedTags.length - 1];\n        result.push({\n          openingTagStartIndex: openingTag.startIndex,\n          openingTagEndIndex: openingTag.startIndex + openingTag.value.length,\n          closingTagStartIndex: tag.startIndex,\n          closingTagEndIndex: tag.startIndex + tag.value.length\n        });\n        openedTags.pop();\n      }\n    }\n\n    if (openedTags.length > 0) {\n      this.logger.warn(['Syntax error - Opening tags without corresponding closing tags found.'], options);\n    }\n\n    return result;\n  }\n}\n","import { Injectable } from '@angular/core';\n\nimport { HookPosition } from '../../../interfacesPublic';\nimport { regexes } from '../../../constants/regexes';\nimport { HookFinder } from '../../../services/utils/hookFinder';\nimport { ParseOptions } from '../../../services/settings/options';\n\n\n/**\n * A utility service for the TextSelectorHookParser that finds Angular component selectors in the content\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class TagHookFinder {\n\n  constructor(private hookFinder: HookFinder) {\n  }\n\n  /**\n   * Finds singletag Angular component selectors\n   *\n   * @param content - The content to parse\n   * @param selector - The Angular selector to find\n   * @param bracketStyle - What bracket style to use\n   * @param options - The current ParseOptions\n   */\n  findSingleTags(content: string, selector: string, bracketStyle: {opening: string, closing: string} = {opening: '<', closing: '>'}, options: ParseOptions): HookPosition[] {\n    // Create opening tag regex\n    const openingTagRegex = this.generateOpeningTagRegex(selector, bracketStyle);\n\n    return this.hookFinder.find(content, openingTagRegex, undefined, undefined, options);\n  }\n\n  /**\n   * Finds enclosing Angular component selectors\n   *\n   * @param content - The content to parse\n   * @param selector - The Angular selector to find\n   * @param bracketStyle - What bracket style to use\n   * @param options - The current ParseOptions\n   */\n  findEnclosingTags(content: string, selector: string, bracketStyle: {opening: string, closing: string} = {opening: '<', closing: '>'}, options: ParseOptions): HookPosition[] {\n    // Create opening and closing tag regex\n    const openingTagRegex = this.generateOpeningTagRegex(selector, bracketStyle);\n    const closingTagRegex =  this.generateClosingTagRegex(selector, bracketStyle);\n\n    return this.hookFinder.find(content, openingTagRegex, closingTagRegex, true, options);\n  }\n\n  /**\n   * Finds self-closing Angular component selectors\n   *\n   * @param content - The content to parse\n   * @param selector - The Angular selector to find\n   * @param bracketStyle - What bracket style to use\n   * @param options - The current ParseOptions\n   */\n    findSelfClosingTags(content: string, selector: string, bracketStyle: {opening: string, closing: string} = {opening: '<', closing: '>'}, options: ParseOptions): HookPosition[] {\n      const selfClosingTagRegex = this.generateOpeningTagRegex(selector, bracketStyle, true);\n  \n      return this.hookFinder.find(content, selfClosingTagRegex, undefined, undefined, options);\n    }\n\n  // Hook regex helper\n  // ----------------------------------------------------------------------------------------------------------------------------------------\n\n  /**\n   * Generates the opening tag regex for a standard Angular component selector\n   *\n   * @param selector - The selector name\n   * @param bracketStyle - What bracket style to use\n   */\n  private generateOpeningTagRegex(selector: string, bracketStyle: {opening: string, closing: string} = {opening: '<', closing: '>'}, selfClosing: boolean = false): RegExp {\n    // Find opening tag of hook lazily\n    // Examples for this regex: https://regex101.com/r/Glyt2Z/1\n    // Features: Ignores redundant whitespace & line-breaks, supports n attributes, both normal and []-attribute-name-syntax, both ' and \" as attribute-value delimiters\n    const openingArrow = this.escapeRegex(bracketStyle.opening);\n    const selectorName = this.escapeRegex(selector);\n    const closingArrow = (selfClosing ? '\\\\/' : '') + this.escapeRegex(bracketStyle.closing);\n    const space = '\\\\s';\n\n    const attributeValuesOR = '(?:' + regexes.attributeValueDoubleQuotesRegex + '|' + regexes.attributeValueSingleQuotesRegex + ')';\n    const attributes = '(?:' + space + '+' + regexes.attributeNameRegex + '\\=' + attributeValuesOR + ')+';\n\n    const fullRegex = openingArrow + selectorName + '(?:' + space + '*' + closingArrow + '|' + attributes + space + '*' + closingArrow + ')';\n\n    const regexObject = new RegExp(fullRegex, 'gim');\n\n    return regexObject;\n  }\n\n  /**\n   * Generates the opening tag regex for a standard hook\n   *\n   * @param selector - The selector of the hook\n   * @param bracketStyle - What bracket style to use\n   */\n  private generateClosingTagRegex(selector: string, bracketStyle: {opening: string, closing: string} = {opening: '<', closing: '>'}): RegExp {\n    const openingArrow = this.escapeRegex(bracketStyle.opening) + '\\/';\n    const selectorName = this.escapeRegex(selector);\n    const closingArrow = this.escapeRegex(bracketStyle.closing);\n\n    const fullRegex = openingArrow + selectorName + closingArrow;\n\n    const regexObject = new RegExp(fullRegex, 'gim');\n\n    return regexObject;\n  }\n\n  /**\n   * Safely escapes a string for use in regex\n   *\n   * @param text - The string to escape\n   */\n  escapeRegex(text: string): string {\n    return text.replace(new RegExp('[-\\\\/\\\\\\\\^$*+?.()|[\\\\]{}]', 'g'), '\\\\$&');\n  }\n\n}\n","import { Injectable } from '@angular/core';\nimport { matchAll } from './utils';\n\ninterface TextSegment {\n  startIndex: number;\n  endIndex: number;\n}\n\n/**\n * A service that provides various functions for en- and decoding data type strings in order to make them\n * meaningfully parseable by regex\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class DataTypeEncoder {\n\n  // Substrings\n  // -----------------------------------------------------\n\n  /**\n   * Finds all substrings in a piece of text and replaces all special characters within with @@@...@@@-placeholders.\n   *\n   * @param text - The text to parse for substrings\n   */\n  encodeSubstrings(text: string): string {\n    // Get a list of all quotes (that are not preceded by an escaping backslash)\n    const singleQuotes: any = matchAll(text, /'/gm).filter(match => match.index === 0 || text[match.index - 1] !== '\\\\');\n    const doubleQuotes: any = matchAll(text, /\"/gm).filter(match => match.index === 0 || text[match.index - 1] !== '\\\\');\n    const graveQuotes: any = matchAll(text, /`/gm).filter(match => match.index === 0 || text[match.index - 1] !== '\\\\');\n    const allQuotes = [...singleQuotes, ...doubleQuotes, ...graveQuotes];\n    allQuotes.sort((a, b) => a['index'] - b['index']);\n\n    // Create quotes text segments\n    const quoteSegments: TextSegment[] = [];\n    let outermostOpenedQuote = null;\n    for (const quote of allQuotes) {\n      if (!outermostOpenedQuote) {\n        outermostOpenedQuote = quote;\n      } else {\n        if (outermostOpenedQuote[0] === quote[0]) {\n          quoteSegments.push({\n            startIndex: outermostOpenedQuote.index + 1,\n            endIndex: quote['index']\n          });\n          outermostOpenedQuote = null;\n        }\n      }\n    }\n\n    if (outermostOpenedQuote !== null) {\n      throw Error('Input parse error. String was opened, but not closed.');\n    }\n\n    // Encode quote segments\n    const encodedBracketsText = this.encodeTextSegments(text, quoteSegments, this.encodeStringSpecialChars);\n\n    return encodedBracketsText;\n  }\n\n  /**\n   * Encodes all special characters that might be confused as code syntax in a piece of string\n   *\n   * @param text - The text to encode\n   */\n  encodeStringSpecialChars(text: string): string {\n    text = text.replace(/'/g, '@@@singlequote@@@');\n    text = text.replace(/\"/g, '@@@doublequote@@@');\n    text = text.replace(/`/g, '@@@gravequote@@@');\n    text = text.replace(/:/g, '@@@colon@@@');\n    text = text.replace(/;/g, '@@@semicolon@@@');\n    text = text.replace(/\\./g, '@@@dot@@@');\n    text = text.replace(/,/g, '@@@comma@@@');\n    text = text.replace(/\\\\/g, '@@@backslash@@@');\n    text = text.replace(/\\(/g, '@@@openRoundBracket@@@');\n    text = text.replace(/\\)/g, '@@@closeRoundBracket@@@');\n    text = text.replace(/\\[/g, '@@@openSquareBracket@@@');\n    text = text.replace(/\\]/g, '@@@closeSquareBracket@@@');\n    text = text.replace(/\\{/g, '@@@openCurlyBracket@@@');\n    text = text.replace(/\\}/g, '@@@closeCurlyBracket@@@');\n    return text;\n  }\n\n  /**\n   * Decodes the special characters again\n   *\n   * @param text - The text to decode\n   */\n  decodeStringSpecialChars(text: string): string {\n    text = text.replace(/@@@singlequote@@@/g, '\\'');\n    text = text.replace(/@@@doublequote@@@/g, '\"');\n    text = text.replace(/@@@gravequote@@@/g, '`');\n    text = text.replace(/@@@colon@@@/g, ':');\n    text = text.replace(/@@@semicolon@@@/g, ';');\n    text = text.replace(/@@@dot@@@/g, '.');\n    text = text.replace(/@@@comma@@@/g, ',');\n    text = text.replace(/@@@backslash@@@/g, '\\\\');\n    text = text.replace(/@@@openRoundBracket@@@/g, '(');\n    text = text.replace(/@@@closeRoundBracket@@@/g, ')');\n    text = text.replace(/@@@openSquareBracket@@@/g, '[');\n    text = text.replace(/@@@closeSquareBracket@@@/g, ']');\n    text = text.replace(/@@@openCurlyBracket@@@/g, '{');\n    text = text.replace(/@@@closeCurlyBracket@@@/g, '}');\n    return text;\n  }\n\n  // Subfunctions\n  // -----------------------------------------------------\n\n  /**\n   * Finds all subfunctions in a piece of text and replaces their round brackets with @@@...@@@-placeholders.\n   *\n   * @param text - The text to parse for substrings\n   */\n  encodeSubfunctions(text: string): string {\n    const openingBrackets = matchAll(text, /\\(/gm);\n    const closingBrackets = matchAll(text, /\\)/gm);\n    const allBrackets = [...openingBrackets, ...closingBrackets];\n    allBrackets.sort((a, b) => a['index'] - b['index']);\n\n    // Create functions text segments\n    const functionSegments: TextSegment[] = [];\n    const openedBrackets = [];\n    for (const bracket of allBrackets) {\n      if (bracket[0] === '(') {\n        openedBrackets.push(bracket);\n      } else {\n        if (openedBrackets.length === 0) {\n          throw Error('Input parse error. Closed function bracket without opening it first.');\n        }\n        // Only collect the outermost function brackets, not nested ones\n        if (openedBrackets.length === 1) {\n          functionSegments.push({\n            startIndex: openedBrackets[0].index + 1,\n            endIndex: bracket['index']\n          });\n        }\n        openedBrackets.pop();\n      }\n    }\n\n    if (openedBrackets.length !== 0) {\n      throw Error('Input parse error. Opened function bracket without closing it.');\n    }\n\n    // Encode quote segments\n    const encodedFunctionsText = this.encodeTextSegments(text, functionSegments, this.encodeFunctionBrackets);\n\n    return encodedFunctionsText;\n  }\n\n  /**\n   * Encodes all round brackets with harmless placeholders\n   *\n   * @param text - The text to encode\n   */\n  encodeFunctionBrackets(text: string): string {\n    text = text.replace(/\\(/g, '@@@fnOpenBracket@@@');\n    text = text.replace(/\\)/g, '@@@fnCloseBracket@@@');\n    return text;\n  }\n\n  /**\n   * Decodes all round brackets again\n   *\n   * @param text - The text to decode\n   */\n  decodeFunctionBrackets(text: string): string {\n    text = text.replace(/@@@fnOpenBracket@@@/g, '\\(');\n    text = text.replace(/@@@fnCloseBracket@@@/g, '\\)');\n    return text;\n  }\n\n  // Subbrackets\n  // -----------------------------------------------------\n\n  /**\n   * Finds all subbrackets in a piece of text and replaces their brackets with @@@...@@@-placeholders.\n   *\n   * @param text - The text to parse for substrings\n   */\n  encodeVariableSubbrackets(text: string): string {\n\n    // Property accessor opening brackets can be identified by what they are preceded by.\n    // Must be a) text, b) closing square bracket or c) closing round bracket. Arrays can't be preceded by any of these.\n    const variableOpeningBracketsWithLookbehinds = '(?<=[a-zA-Z_$\\\\]\\)])\\\\['; // Too new for many older browsers\n    const variableOpeningBrackets = '(?:[a-zA-Z_$\\\\]\\)])(\\\\[)';\n\n    const openingBrackets = matchAll(text, new RegExp(variableOpeningBrackets, 'gm'));\n    // Note: Can't simply find closing brackets as well (as is done in the other encoder functions), because the closing\n    // bracket doesn't have a uniquely identifiable syntax. Might also be array endings.\n\n    // Find the corresponding closing bracket for each opening bracket by parsing the following brackets\n    const bracketSegments: TextSegment[] = [];\n    for (const openingBracket of openingBrackets) {\n      const followingText = text.substring(openingBracket.index + 2); // openingBracket.index + 2, b/c the regex starts at the character before the opening bracket and followingText is supposed to start after the opening bracket\n      const followingOpeningBrackets = matchAll(followingText, /\\[/gm);\n      const followingClosingBrackets = matchAll(followingText, /\\]/gm);\n      const allFollowingBrackets = [...followingOpeningBrackets, ...followingClosingBrackets];\n      allFollowingBrackets.sort((a, b) => a['index'] - b['index']);\n\n      let openedBrackets = 1; // Start with the first opening bracket already counted\n      for (const followingBracket of allFollowingBrackets) {\n        openedBrackets = followingBracket[0] === ']' ? openedBrackets - 1 : openedBrackets + 1;\n        if (openedBrackets === 0) {\n          bracketSegments.push({\n            startIndex: openingBracket.index + 2,\n            endIndex: openingBracket.index + 2 + followingBracket['index']\n          });\n          break;\n        }\n      }\n\n      if (openedBrackets !== 0) {\n        throw Error('Input parse error. Opened bracket without closing it.');\n      }\n    }\n\n    // Throw out nested brackets\n    const outerBracketSegments = [];\n    for (const bracketSegment of bracketSegments) {\n      if (outerBracketSegments.length === 0) {\n        outerBracketSegments.push(bracketSegment);\n      } else {\n        if (outerBracketSegments[outerBracketSegments.length - 1].endIndex < bracketSegment.startIndex) {\n          outerBracketSegments.push(bracketSegment);\n        }\n      }\n    }\n\n    // Encode bracket segments\n    const encodedBracketsText = this.encodeTextSegments(text, outerBracketSegments, this.encodeVariableBrackets);\n\n    return encodedBracketsText;\n  }\n\n  /**\n   * Encodes all brackets with harmless placeholders\n   *\n   * @param text - The text to encode\n   */\n  encodeVariableBrackets(text: string): string {\n    text = text.replace(/\\[/g, '@@@variableOpeningBracket@@@');\n    text = text.replace(/\\]/g, '@@@variableClosingBracket@@@');\n    return text;\n  }\n\n  /**\n   * Decodes all brackets again\n   *\n   * @param text - The text to encode\n   */\n  decodeVariableBrackets(text: string): string {\n    text = text.replace(/@@@variableOpeningBracket@@@/g, '\\[');\n    text = text.replace(/@@@variableClosingBracket@@@/g, '\\]');\n    return text;\n  }\n\n  // Context var placeholder\n  // -----------------------------------------------------\n\n  /**\n   * Transforms a context var (that is already encoded for substrings, subfunctions and subbrackets) into a string placeholder\n   * by encoding the context var syntax itself. This is so that can be safely parsed by JSON.parse() as a string and also so it\n   * won't be misinterpreted by other regexes looking for JSON syntax (especially arrays b/c of context-var []-property-brackets)\n   *\n   * @param contextVar - The context var to transform\n   */\n  transformContextVarIntoPlacerholder(contextVar: string): string {\n    // Replace context. with __CXT__\n    contextVar = '__CXT__' + contextVar.substring(7);\n    // Encode variable syntax\n    contextVar = contextVar.replace(/\\\"/g, '@@@cxtDoubleQuote@@@');\n    contextVar = contextVar.replace(/\\./g, '@@@cxtDot@@@');\n    contextVar = contextVar.replace(/\\[/g, '@@@cxtOpenSquareBracket@@@');\n    contextVar = contextVar.replace(/\\]/g, '@@@cxtCloseSquareBracket@@@');\n    contextVar = contextVar.replace(/\\(/g, '@@@cxtOpenRoundBracket@@@');\n    contextVar = contextVar.replace(/\\)/g, '@@@cxtCloseRoundBracket@@@');\n    return contextVar;\n  }\n\n  /**\n   * Transforms a context var placeholder back into the actual context var\n   * \n   * @param contextVar - The placeholder context var\n   */\n  transformPlaceholderIntoContextVar(contextVar: string): string {\n    contextVar = 'context' + contextVar.substring(7);\n    contextVar = contextVar.replace(/@@@cxtDoubleQuote@@@/g, '\"');\n    contextVar = contextVar.replace(/@@@cxtDot@@@/g, '.');\n    contextVar = contextVar.replace(/@@@cxtOpenSquareBracket@@@/g, '[');\n    contextVar = contextVar.replace(/@@@cxtCloseSquareBracket@@@/g, ']');\n    contextVar = contextVar.replace(/@@@cxtOpenRoundBracket@@@/g, '(');\n    contextVar = contextVar.replace(/@@@cxtCloseRoundBracket@@@/g, ')');\n    return contextVar;\n  }\n\n  // Other\n  // -----------------------------------------------------\n\n  /**\n   * Takes a piece of text as well as array of TextSegments and encodes them with the help of an encodingFunction\n   * The encoded text is then automatically assembled and returned.\n   *\n   * @param text - The text in question\n   * @param specialTextSegments - The segments in the text to encode\n   * @param encodingFunction - The encoding function to use\n   */\n  private encodeTextSegments(text: string, specialTextSegments: TextSegment[], encodingFunction: any): string {\n    // 1. Divide whole text into two types of segments: Those to be encoded and those to be left as they are\n    const allTextSegments = [];\n    for (const specialTextSegment of specialTextSegments) {\n      // Push normal text segment since last special segment\n      const lastSegmentEndIndex: number = allTextSegments.length === 0 ? 0 : allTextSegments[allTextSegments.length - 1].endIndex;\n      allTextSegments.push({\n        type: 'text',\n        startIndex: lastSegmentEndIndex,\n        endIndex: specialTextSegment.startIndex,\n        string: text.substring(lastSegmentEndIndex, specialTextSegment.startIndex)\n      });\n\n      // Push next special segment\n      allTextSegments.push({\n        type: 'special',\n        startIndex: specialTextSegment.startIndex,\n        endIndex: specialTextSegment.endIndex,\n        string: text.substring(specialTextSegment.startIndex, specialTextSegment.endIndex)\n      });\n    }\n    // Add text segment for trailing text after last special segment\n    const lastBracketEndIndex = allTextSegments.length === 0 ? 0 : allTextSegments[allTextSegments.length - 1].endIndex;\n    allTextSegments.push({\n      type: 'text',\n      startIndex: lastBracketEndIndex,\n      endIndex: text.length - 1,\n      string: text.substring(lastBracketEndIndex)\n    });\n\n    // 2. Encode all special segments\n    for (const segment of allTextSegments) {\n      if (segment.type === 'special') {\n        segment.string = encodingFunction(segment.string);\n      }\n    }\n\n    // 3. Concat everything together again\n    let encodedString = '';\n    for (const segment of allTextSegments) {\n      encodedString += segment.string;\n    }\n\n    return encodedString;\n  }\n\n  /**\n   * Strips all escaping backslashes from a piece of text\n   *\n   * @param text - The text in question\n   */\n  stripSlashes(text: string): string {\n    return text.replace(/\\\\(.)/g, '$1');\n    // return text.replace(new RegExp('\\\\\\\\(.)', 'g'), '$1');\n  }\n\n  /**\n   * Escapes all double quotes in a piece of text\n   *\n   * @param text - The text in question\n   */\n  escapeDoubleQuotes(text: string): string {\n    const result = text.replace(/\\\\/g, '\\\\\\\\').replace(/\\\"/g, '\\\\\"');\n    return result;\n  }\n}\n","import { Injectable } from '@angular/core';\n\nimport { regexes } from '../../constants/regexes';\nimport { DataTypeEncoder } from './dataTypeEncoder';\nimport { matchAll } from './utils';\nimport { Logger } from './logger';\nimport { getParseOptionDefaults, ParseOptions } from '../settings/options';\n\n\n/**\n * A parser that can evaluate stringified variables and turn them into their corresponding data types\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class DataTypeParser {\n\n  constructor(private dataTypeEncoder: DataTypeEncoder, private logger: Logger) {\n  }\n\n  /**\n   * Takes a string containing a Javascript data type as it would appear in code, such a number ('15'), a string ('\"hello\"'),\n   * an array ('[1,2,3]'), an object ('{prop: \"something\"}') etc., and evaluates it to be an an actual variable.\n   *\n   * Note: This function works without invoking eval() and instead uses JSON.parse() for the heavy lifting. As such, it should be safe\n   * to use and should cover most forms of input.\n   *\n   * @param dataTypeString - The string to parse\n   * @param context - (optional) A context object to load variables from\n   * @param event - (optional) An event object to place $event vars with\n   * @param unescapeStrings - (optional) Whether to unescape strings or not\n   * @param trackContextVariables - (optional) An object that will be filled out with all found context vars\n   * @param allowContextFunctionCalls - (optional) Whether to allow function calls in context vars\n   * @param options - (optional) The current parseOptions\n   */\n  evaluate(dataTypeString: string, context: any = {}, event?: any, unescapeStrings: boolean = true, trackContextVariables: any = {}, allowContextFunctionCalls: boolean = true, options: ParseOptions = getParseOptionDefaults()): any {\n\n    // a) Simple types\n    // --------------------\n    // null or undefined\n    if (dataTypeString === 'null') { return null; }\n    if (dataTypeString === 'undefined') { return undefined; }\n    // boolean\n    if (dataTypeString === 'true') { return true; }\n    if (dataTypeString === 'false') { return false; }\n    // number\n    if (!isNaN(dataTypeString as any))  { return parseInt(dataTypeString, 10); }\n    // string\n    if (\n      (dataTypeString.startsWith('\"') && dataTypeString.endsWith('\"')) ||\n      (dataTypeString.startsWith(\"'\") && dataTypeString.endsWith(\"'\")) ||\n      (dataTypeString.startsWith(\"`\") && dataTypeString.endsWith(\"`\"))\n    ) {\n      // Remove outer quotes, potentially unescape and return\n      let decodedString = dataTypeString.substring(1, dataTypeString.length - 1);\n      decodedString = unescapeStrings ? this.dataTypeEncoder.stripSlashes(decodedString) : decodedString;\n      return decodedString;\n    }\n\n    // b) Complex types\n    // --------------------\n    // IMPORTANT: To properly parse complex object structures as well as context variables with regex, the string needs to be prepared. This means:\n    // 1. Substrings must be rendered 'harmless', meaning all special characters that regex might confuse with variable syntax must be encoded.\n    // 2. The brackets of subfunctions (e.g. context.fn(otherFn(param)).var), must be encoded as well. Regex can't handle nested substructures and wouldn't know which bracket closes the outer function.\n    // 3. The brackets of subbrackets (e.g. context[context['something']].var) must be encoded for the same reason.\n    dataTypeString = this.encodeDataTypeString(dataTypeString);\n\n    // array or object literal\n    if (\n      (dataTypeString.startsWith('{') && dataTypeString.endsWith('}')) ||\n      (dataTypeString.startsWith('[') && dataTypeString.endsWith(']'))\n    ) {\n      // Prepare string and parse as JSON\n      const json = this.parseAsJSON(dataTypeString, unescapeStrings);\n      // Load variables\n      return this.loadJSONVariables(json, context, event, unescapeStrings, trackContextVariables, allowContextFunctionCalls, options);\n    }\n\n    // event variable name\n    if (dataTypeString === '$event') {\n      return event;\n    }\n\n    // context variable name\n    if (dataTypeString.match(new RegExp('^\\\\s*' + regexes.contextVariableRegex + '\\\\s*$', 'gm'))) {\n      return this.loadContextVariable(dataTypeString, context, event, unescapeStrings, trackContextVariables, allowContextFunctionCalls, options);\n    }\n\n    throw Error('Data type for following input was not recognized and could not be parsed: \"' + dataTypeString + '\"');\n  }\n\n  /**\n   * Encodes a data type string\n   *\n   * @param dataTypeString - The string to encode\n   */\n  encodeDataTypeString(dataTypeString: string): string {\n    dataTypeString = this.dataTypeEncoder.encodeSubstrings(dataTypeString);              // Encode all potential substrings\n    dataTypeString = this.dataTypeEncoder.encodeSubfunctions(dataTypeString);            // Encode all potential subfunctions\n    dataTypeString = this.dataTypeEncoder.encodeVariableSubbrackets(dataTypeString);     // Encode all potential subbrackets of variables\n    return dataTypeString;\n  }\n\n  /**\n   * Decodes a data type string\n   *\n   * @param dataTypeString - The string to decode\n   */\n  decodeDataTypeString(dataTypeString: string): string {\n    dataTypeString = this.dataTypeEncoder.decodeStringSpecialChars(dataTypeString);     // Decode special chars from substrings\n    dataTypeString = this.dataTypeEncoder.decodeFunctionBrackets(dataTypeString);       // Decode subfunctions\n    dataTypeString = this.dataTypeEncoder.decodeVariableBrackets(dataTypeString);       // Decode subbrackets\n    dataTypeString = dataTypeString.trim();                                             // Trim whitespace\n    return dataTypeString;\n  }\n\n  /**\n   * In order to successfully parse a data type string with JSON.parse(), it needs to follow certain formatting rules.\n   * This function ensures that these are followed and corrects the input if not.\n   *\n   * @param JSONString - The string to be given to JSON.parse()\n   * @param unescapeStrings - Whether to unescape the strings of this JSON\n   */\n  private parseAsJSON(JSONString: string, unescapeStrings: boolean): any {\n\n    // Find all single- and grave-quote-delimited strings and convert them to double quote strings\n    const singleQuoteStringRegex = /\\'(\\\\.|[^\\'])*?\\'/gm;\n    JSONString = JSONString.replace(singleQuoteStringRegex, match => {\n      return '\"' + match.slice(1, -1) + '\"';\n    });\n    const graveQuoteStringRegex = /\\`(\\\\.|[^\\`])*?\\`/gm;\n    JSONString = JSONString.replace(graveQuoteStringRegex, match => {\n      return '\"' + match.slice(1, -1) + '\"';\n    });\n\n    // Add double-quotes around JSON property names where still missing\n    const JSONPropertyRegex = /\"?([a-z0-9A-Z_]+)\"?\\s*:/g;\n    JSONString = JSONString.replace(JSONPropertyRegex, '\"$1\": ');\n\n    // Prevent setting protected properties\n    if (JSONString.match(/\"?__proto__\"?\\s*:/g)) {\n      throw Error('Setting the \"__proto__\" property in a hook input object is not allowed.');\n    }\n    if (JSONString.match(/\"?prototype\"?\\s*:/g)) {\n      throw Error('Setting the \"prototype\" property in a hook input object is not allowed.');\n    }\n    if (JSONString.match(/\"?constructor\"?\\s*:/g)) {\n      throw Error('Setting the \"constructor\" property in a hook input object is not allowed.');\n    }\n\n    // Replace undefined with null\n    JSONString = this.replaceValuesInJSONString(JSONString, 'undefined', match => 'null');\n\n    // Replace context vars with string placeholders\n    JSONString = this.replaceValuesInJSONString(JSONString, regexes.contextVariableRegex, (match) => {\n      return '\"' + this.dataTypeEncoder.transformContextVarIntoPlacerholder(match) + '\"';\n    });\n\n    // Replace $event with string placeholders\n    JSONString = this.replaceValuesInJSONString(JSONString, '\\\\$event', match => '\"__EVENT__\"');\n\n    // PARSE\n    const json = JSON.parse(JSONString);\n\n    // Decode all strings that are not context vars or the event object\n    this.decodeJSONStrings(json, unescapeStrings);\n\n    return json;\n  }\n\n  /**\n   * Given a stringified json and a json value regex, allows you to replace all occurences\n   * of those values in the json via a callback function.\n   *\n   * IMPORTANT: JSONString must be already encoded via this.encodeDataTypeString() for this to work.\n   *\n   * @param JSONString - The stringified JSON\n   * @param valueRegex - The values to find\n   * @param callbackFn - A callback fn that returns what you want to replace them with\n   */\n  private replaceValuesInJSONString(JSONString: string, valueRegex: string, callbackFn: (match: string) => string): string {\n    // With lookbehinds (too new for some browsers)\n    const withLookBehindsRegex = '(?:' +\n      '(?<=:\\\\s*)' + valueRegex + '(?=\\\\s*[,}])' + '|' +\n      '(?<=[\\\\[,]\\\\s*)' + valueRegex + '(?=\\\\s*[\\\\],])' +\n    ')';\n\n    // Without lookbehinds (make sure to keep the lookaheads, though. This way, the same comma can be the end of one regex and the beginning of the next)\n    const regex = '(?:' +\n      '(:\\\\s*)(' + valueRegex + ')(?=\\\\s*[,}])' + '|' +    // Value in object: ':' followed by value followed by ',' or '}'\n      '([\\\\[,]\\\\s*)(' + valueRegex + ')(?=\\\\s*[\\\\],])' +   // Value in array: '[' or ',' followed by value followed by ',' or ']'\n    ')';\n\n    return JSONString.replace(new RegExp(regex, 'gm'), (full, p1, p2, p3, p4) => {\n      const startPart = p1 ? p1 : p3;\n      const value = p2 ? p2 : p4;\n      return startPart + callbackFn(value);\n    });\n  }\n\n  /**\n   * Decodes all 'normal' strings without special meaning in a JSON-like object\n   *\n   * @param jsonLevel - The current level of parsing\n   * @param unescapeStrings - Whether to unescape the decoded strings as well\n   */\n  private decodeJSONStrings(jsonLevel: any, unescapeStrings: boolean): void {\n    for (const prop in jsonLevel) {\n      if (typeof jsonLevel[prop] === 'string') {\n        // Ignore var placeholders\n        if (jsonLevel[prop] === '__EVENT__\"' || jsonLevel[prop].match(new RegExp('^\\\\s*' + regexes.placeholderContextVariableRegex + '\\\\s*$', 'gm'))) {\n          continue;\n        }\n        // Otherwise decode string\n        let decodedString = this.decodeDataTypeString(jsonLevel[prop]);\n        decodedString = unescapeStrings ? this.dataTypeEncoder.stripSlashes(decodedString) : decodedString;\n        jsonLevel[prop] = decodedString;\n      } else if (typeof jsonLevel[prop] === 'object') {\n        this.decodeJSONStrings(jsonLevel[prop], unescapeStrings);\n      }\n    }\n  }\n\n  // Loading variables\n  // ----------------------------------------------------------------------------------------------------------------------------------------\n\n  /**\n   * Travels a JSON-like object to find all context vars and event objects and replaces their placeholders with the actual values\n   *\n   * @param arrayOrObject - The property of the JSON to analyze\n   * @param context - The current context object, if any\n   * @param event - The current event object, if any\n   * @param unescapeStrings - Whether to unescape strings or not\n   * @param trackContextVariables - Whether to unescape strings or not\n   * @param allowContextFunctionCalls - Whether function calls in context vars are allowed\n   * @param options - The current parseOptions\n   */\n  private loadJSONVariables(arrayOrObject: any, context: any, event: any, unescapeStrings: boolean, trackContextVariables: any, allowContextFunctionCalls: boolean, options: ParseOptions): any {\n    for (const prop in arrayOrObject) {\n      // Only interested in strings\n      if (typeof arrayOrObject[prop] === 'string') {\n        // If event placeholder\n        if (arrayOrObject[prop] === '__EVENT__') {\n          arrayOrObject[prop] = event;\n\n        // If context var placeholder\n        } else if (arrayOrObject[prop].match(new RegExp('^\\\\s*' + regexes.placeholderContextVariableRegex + '\\\\s*$', 'gm'))) {\n          const contextVar = this.dataTypeEncoder.transformPlaceholderIntoContextVar(arrayOrObject[prop].trim());\n          arrayOrObject[prop] = this.loadContextVariable(contextVar, context, event, unescapeStrings, trackContextVariables, allowContextFunctionCalls, options);\n        }\n      } else if (typeof arrayOrObject[prop] === 'object') {\n        this.loadJSONVariables(arrayOrObject[prop], context, event, unescapeStrings, trackContextVariables, allowContextFunctionCalls, options);\n      }\n    }\n\n    return arrayOrObject;\n  }\n\n  /**\n   * Takes a context variable string and evaluates it to get the desired value\n   *\n   * IMPORTANT: To correctly parse variables, their substrings, subfunction and subbrackets must be encoded (done in evaluate())\n   *\n   * @param contextVar - The context var\n   * @param context - The context object\n   * @param event - An event object, if available\n   * @param unescapeStrings - Whether to unescape strings or not\n   * @param trackContextVariables - An optional object that will be filled out with all found context vars\n   * @param allowContextFunctionCalls - Whether function calls in context vars are allowed\n   * @param options - The current parseOptions \n   */\n  loadContextVariable(contextVar: string, context: any = {}, event?: any, unescapeStrings: boolean = true, trackContextVariables: any = {}, allowContextFunctionCalls: boolean = true, options: ParseOptions = getParseOptionDefaults()): any {\n    try {\n      const shortContextVar = contextVar.substring(7);  // Cut off 'context' from the front\n\n      // If context object is requested directly\n      if (shortContextVar.trim() === '') {\n        return context;\n      }\n\n      // Otherwise, create variable path array and fetch value, so the context object can be easily travelled.\n      // Variable path example: 'restaurants[\"newOrleans\"].reviews[5]' becomes ['restaurants', 'newOrleans', 'reviews', 5],\n      const path = [];\n      const pathMatches = matchAll(shortContextVar, new RegExp(regexes.variablePathPartRegex, 'gm'));\n      for (const match of pathMatches) {\n\n        // 1. If dot notation\n        if (match[0].startsWith('.')) {\n          path.push({\n            type: 'property',\n            value: match[0].substring(1)\n          });\n        }\n\n        // 2. If bracket notation\n        if (match[0].startsWith('[') && match[0].endsWith(']')) {\n          let bracketValue = match[0].substring(1, match[0].length - 1);\n\n          // Evaluate bracket parameter\n          bracketValue = this.decodeDataTypeString(bracketValue);                                                                                             // Decode variable\n          bracketValue = this.evaluate(bracketValue, context, event, unescapeStrings, trackContextVariables, allowContextFunctionCalls);    // Recursively repeat the process\n          path.push({\n            type: 'property',\n            value: bracketValue\n          });\n        }\n\n        // 3. If function call\n        if (match[0].startsWith('(') && match[0].endsWith(')')) {\n          // Check if function calls are allowed\n          if (!allowContextFunctionCalls) {\n            throw Error('Tried to call a function in a context variable. This has been disallowed in the current config.');\n          }\n\n          const funcParams = match[0].substring(1, match[0].length - 1);  // Strip outer brackets\n          // Evaluate function parameters\n          const paramsArray = [];\n          if (funcParams !== '') {\n            for (const param of funcParams.split(',')) {\n              let p = this.decodeDataTypeString(param);                                                                   // Decode variable\n              p = this.evaluate(p, context, event, unescapeStrings, trackContextVariables, allowContextFunctionCalls);    // Recursively repeat the process\n              paramsArray.push(p);\n            }\n          }\n          // Add function to path\n          path.push({\n            type: 'function',\n            value: paramsArray\n          });\n        }\n      }\n\n      try {\n        const resolvedContextVar = this.fetchContextVariable(context, path);\n        trackContextVariables[this.decodeDataTypeString(contextVar)] = resolvedContextVar;\n        return resolvedContextVar;\n      } catch (e) {\n        throw Error('The required context variable \"' + this.decodeDataTypeString(contextVar) + '\" could not be found in the context object. Returning undefined instead.');\n      }\n    } catch (e) {\n      this.logger.warn([e], options);\n      trackContextVariables[this.decodeDataTypeString(contextVar)] = undefined;\n      return undefined;\n    }\n  }\n\n  /**\n   * Recursively travels an object with the help of a path array and returns the specified value,\n   * or undefined if not found\n   *\n   * @param contextLevel - The object to travel\n   * @param path - The property path array\n   */\n  private fetchContextVariable(contextLevel: any, path: any[]): any {\n    // Prevent accessing protected properties\n    if (path[0].value ===  '__proto__') {\n      throw Error('Accessing the __proto__ property through a context variable is not allowed.');\n    }\n    if (path[0].value ===  'prototype') {\n      throw Error('Accessing the prototype property through a context variable is not allowed.');\n    }\n    if (path[0].value ===  'constructor') {\n      throw Error('Accessing the constructor property through a context variable is not allowed.');\n    }\n\n    if (contextLevel === undefined) {\n      throw Error('Context variable path could not be resolved. Trying to access ' + (path[0].type === 'property' ? 'property \"' + path[0].value + '\" of undefined.' : 'undefined function.'));\n    }\n\n    // Get property\n    let result;\n    if (path[0].type === 'property') {\n      if (contextLevel.hasOwnProperty(path[0].value)) {\n        result = contextLevel[path[0].value];\n        // It makes a difference to JavaScript whether you call a function by 'obj.func()' or by 'let func = obj.func; func();'\n        // In the latter case, 'this' will be undefined and not point to the parent. Since this recursive approach uses that latter version,\n        // manually bind each function to the parent to restore the normal behavior.\n        // Also: If the user has submitted a bound function himself, calling .bind here again does nothing, which is the desired behaviour.\n        if (typeof result === 'function') {\n          result = result.bind(contextLevel);\n        }\n      // Check '__proto__' as well as functions tend to live here instead of directly on the instance\n      } else if (contextLevel.__proto__.hasOwnProperty(path[0].value))  {\n        result = contextLevel.__proto__[path[0].value];\n        if (typeof result === 'function') {\n          result = result.bind(contextLevel);\n        }\n      } else {\n        result = undefined;\n      }\n    } else if (path[0].type === 'function') {\n      result = contextLevel(...path[0].value);\n    }\n    path.shift();\n\n    // Recursively travel path\n    if (path.length > 0) {\n      result = this.fetchContextVariable(result, path);\n    }\n    return result;\n  }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { DataTypeParser } from '../../services/utils/dataTypeParser';\nimport { SelectorHookParserConfig } from './selectorHookParserConfig';\nimport { RichBindingData } from '../../interfaces';\nimport { Logger } from '../../services/utils/logger';\nimport { ParseOptions } from '../../services/settings/options';\n\n\n/**\n * A helper service for the SelectorHookParsers that evaluates bindings and only updates them when needed so references are retained when possible\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class BindingsValueManager {\n\n  constructor(private dataTypeParser: DataTypeParser, private logger: Logger) {\n  }\n\n  // Inputs\n  // -------------------------------------------------------------------------------------\n\n  /**\n   * Checks input bindings and evaluates/updates them as needed\n   *\n   * @param bindings - A list of @Input() bindings\n   * @param context - The current context object\n   * @param parserConfig - The parser config\n   * @param options - The current ParseOptions\n   */\n  checkInputBindings(bindings: {[key: string]: RichBindingData}, context: any, parserConfig: SelectorHookParserConfig, options: ParseOptions) {\n    for (const [inputName, inputBinding] of Object.entries(bindings)) {\n      // If no need to parse, use raw as value\n      if (!parserConfig.parseInputs) {\n        inputBinding.value = inputBinding.raw;\n    \n      } else {\n        // If not yet parsed, do so\n        if (!inputBinding.parsed) {\n          try {\n            inputBinding.value = this.dataTypeParser.evaluate(\n              inputBinding.raw,\n              parserConfig.allowContextInBindings ? context : {},\n              undefined,\n              parserConfig.unescapeStrings,\n              inputBinding.boundContextVariables,\n              parserConfig.allowContextFunctionCalls,\n              options\n            );\n            inputBinding.parsed = true;\n          } catch (e: any) {\n            this.logger.error([`Hook input parsing error\\nselector: ` + parserConfig.selector +  `\\ninput: ` + inputName + `\\nvalue: \"` + inputBinding.value + `\"`], options);\n            this.logger.error([e.stack], options);\n            // If binding could not be parsed at all due to syntax error, remove from list of inputs.\n            // No amount of calls to updateInputBindings() will fix this kind of error.\n            delete bindings[inputName];\n          }\n\n        // Otherwise check if needs an update\n        } else {\n          this.updateInputBindingIfStale(inputBinding, context, parserConfig);\n        }\n      }\n    }\n  }\n\n  /**\n   * We can detect if a binding needs to be reevaluated via the bound context variables. There are three cases to consider:\n   *\n   * a) If a binding does not use context vars, don't reevaluate (binding is static and won't ever need to be updated)\n   * b) If a binding does use context vars, but context vars haven't changed, don't reevaluate either (would evalute the same)\n   * c) If a binding uses context vars and they have changed, reevaluate the binding from scratch to get the new version\n   *\n   * This is in line with the standard Angular behavior when evaluating template vars like [input]=\"{prop: this.something}\".\n   * When 'this.something' changes so that it returns false on a === comparison with its previous value, Angular does not\n   * simply replace the reference bound to 'prop', but recreates the whole object literal and passes a new reference into the\n   * input, triggering ngOnChanges.\n   *\n   * @param binding - The previous bindings\n   * @param context - The current context object\n   * @param parserConfig - The current parser config\n   */\n  private updateInputBindingIfStale(binding: RichBindingData, context: any, parserConfig: SelectorHookParserConfig): void {\n\n    if (Object.keys(binding.boundContextVariables).length > 0) {\n      // Check if bound context vars have changed\n      let boundContextVarHasChanged = false;\n      for (const [contextVarName, contextVarValue] of Object.entries(binding.boundContextVariables)) {\n        const encodedContextVarName = this.dataTypeParser.encodeDataTypeString(contextVarName);\n        // Compare with previous value\n        const newContextVarValue = this.dataTypeParser.loadContextVariable(encodedContextVarName, context, undefined, parserConfig.unescapeStrings, {}, parserConfig.allowContextFunctionCalls);\n        if (newContextVarValue !== contextVarValue) {\n          boundContextVarHasChanged = true;\n          break;\n        }\n      }\n\n      // Bound context var has changed! Reevaluate whole binding (which may include more than one context var, or point to some child property)\n      if (boundContextVarHasChanged) {\n        binding.boundContextVariables = {};\n        binding.value = this.dataTypeParser.evaluate(\n          binding.raw,\n          parserConfig.allowContextInBindings ? context : {},\n          undefined,\n          parserConfig.unescapeStrings,\n          binding.boundContextVariables,\n          parserConfig.allowContextFunctionCalls\n        );\n      }\n    }\n  }\n\n  // Outputs\n  // -------------------------------------------------------------------------------------\n\n  /**\n   * Checks output bindings and evaluates/updates them as needed\n   *\n   * @param bindings - A list of @Output() bindings\n   * @param parserConfig - The current parser config\n   * @param options - The current ParseOptions\n   */\n  checkOutputBindings(bindings: {[key: string]: RichBindingData}, parserConfig: SelectorHookParserConfig, options: ParseOptions) {\n    for (const [outputName, outputBinding] of Object.entries(bindings)) {\n      // Unlike inputs, outputs only need to be created once by the parser, never updated, as you only create a wrapper function around the logic to execute.\n      // As this logic is run fresh whenever the output triggers, there is no need to replace this wrapper function on updates.\n      if (!outputBinding.parsed) {\n        outputBinding.value = (event: any, context: any) => {\n          try {\n            this.dataTypeParser.evaluate(\n              outputBinding.raw,\n              parserConfig.allowContextInBindings ? context : {},\n              event,\n              parserConfig.unescapeStrings,\n              outputBinding.boundContextVariables,\n              parserConfig.allowContextFunctionCalls\n            );\n          } catch (e: any) {\n            this.logger.error([`Hook output parsing error\\nselector: ` + parserConfig.selector +  `\\noutput: ` + outputName + `\\nvalue: \"` + outputBinding.value + `\"`], options);\n            this.logger.error([e.stack], options);\n          }\n        };\n        outputBinding.parsed = true;\n      }\n    }\n  }\n\n}\n","import { Injectable, Injector, reflectComponentType } from '@angular/core';\nimport { HookParser } from '../../interfacesPublic';\nimport { TextSelectorHookParser } from '../../parsers/selector/text/textSelectorHookParser';\nimport { SelectorHookParserConfig } from '../../parsers/selector/selectorHookParserConfig';\nimport { SelectorHookParserConfigResolver } from '../../parsers/selector/selectorHookParserConfigResolver';\nimport { TagHookFinder } from '../../parsers/selector/text/tagHookFinder';\nimport { BindingsValueManager } from '../../parsers/selector/bindingsValueManager';\nimport { HookParserEntry } from './parserEntry';\nimport { ElementSelectorHookParser } from '../../parsers/selector/element/elementSelectorHookParser';\nimport { AutoPlatformService } from '../platform/autoPlatformService';\nimport { Logger } from '../utils/logger';\nimport { ParseOptions } from '../settings/options';\n\n/**\n * A helper class for resolving HookParserEntries\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class ParserEntryResolver {\n\n  constructor(\n    private injector: Injector, \n    private parserResolver: SelectorHookParserConfigResolver, \n    private platformService: AutoPlatformService, \n    private tagHookFinder: TagHookFinder, \n    private bindingsValueManager: BindingsValueManager,\n    private logger: Logger\n  ) {\n  }\n\n  /**\n   * Takes a list of HookParserEntries and transforms them into a list of loaded HookParsers\n   *\n   * @param parserEntries - The list of HookParserEntries to process\n   * @param injector - The injector to use for resolving parsers\n   * @param blacklist - (optional) Which parsers to blacklist by name\n   * @param whitelist - (optional) Which parsers to whitelist by name\n   * @param options - The current ParseOptions\n   */\n  resolve(parserEntries: HookParserEntry[], injector: Injector, blacklist: string[]|null, whitelist: string[]|null, options: ParseOptions): HookParser[] {\n\n    // Load all requested parsers\n    const parsers: HookParser[] = [];\n    for (const parser of parserEntries) {\n      const resolvedParser = this.resolveEntry(parser, injector, options);\n      if (resolvedParser) {\n        parsers.push(resolvedParser);\n      }\n    }\n\n    // Check parser functions\n    const validParsers = this.validateParserFunctions(parsers, options);\n\n    // Check parser names\n    this.checkParserNames(validParsers, options);\n\n    // If no need to filter, return resolved parsers\n    if (!blacklist && !whitelist) {\n        return validParsers;\n    }\n\n    // Check black/whitelist\n    this.checkBlackAndWhitelist(validParsers, blacklist, whitelist, options);\n\n    // Filter parsers\n    const filteredParsers = [];\n    for (const validParser of validParsers) {\n      if (validParser.hasOwnProperty('name') && typeof validParser.name === 'string') {\n        if (blacklist && blacklist.includes(validParser.name)) {\n          continue;\n        }\n        if (whitelist && !whitelist.includes(validParser.name)) {\n          continue;\n        }\n      }\n      filteredParsers.push(validParser);\n    }\n\n    return filteredParsers;\n  }\n\n  /**\n   * Figures out what kind of config type the HookParserEntry is and loads it appropriately.\n   *\n   * The potential types are:\n   * - 1. a component class (shorthand for nr. 5)\n   * - 2. a parser service\n   * - 3. a parser class\n   * - 4. a parser instance\n   * - 5. an object literal to configure SelectorHookParser with\n   *\n   * @param parserEntry - The HookParserEntry to process\n   * @param injector - The injector to use for resolving this parser\n   * @param options - The current ParseOptions\n   */\n  resolveEntry(parserEntry: HookParserEntry, injector: Injector, options: ParseOptions): HookParser|null {\n    // Check if class\n    if (parserEntry.hasOwnProperty('prototype')) {\n      // Check if component class\n      const componentMeta = reflectComponentType(parserEntry as any);\n      if (componentMeta) {\n        return this.createSelectorHookParser({component: parserEntry as any});\n      // Else must be parser class\n      } else {\n        // Check if service\n        try {\n          return injector.get(parserEntry);\n        // Otherwise instantiate manually\n        } catch (e) {\n          return new (parserEntry as new(...args: any[]) => any)();\n        }\n      }\n    }\n\n    // Check if object\n    else if (typeof parserEntry === 'object') {\n      // Is instance\n      if (parserEntry.constructor.name !== 'Object') {\n        return parserEntry as HookParser;\n      // Is object literal\n      } else {\n        try {\n          return this.createSelectorHookParser(parserEntry as SelectorHookParserConfig);\n        } catch (e: any)  {\n          this.logger.error(['Invalid parser config - ' + e.message, parserEntry], options);\n          return null;\n        }\n      }\n    }\n    \n    this.logger.error(['Invalid parser config - ', parserEntry], options)\n    return null;\n  }\n\n  /**\n   * Depending on the config, load either string or element SelectorHookParser\n   *\n   * @param config - The selectorHookParserConfig\n   */\n  private createSelectorHookParser(config: SelectorHookParserConfig): HookParser {\n    if (\n      (config.hasOwnProperty('parseWithRegex') && config.parseWithRegex) || \n      (config.hasOwnProperty('enclosing') && !config.enclosing) || \n      (config.hasOwnProperty('bracketStyle') && config.bracketStyle)\n    ) {\n      return new TextSelectorHookParser(config, this.parserResolver, this.tagHookFinder, this.bindingsValueManager);\n    } else {\n      return new ElementSelectorHookParser(config, this.parserResolver, this.platformService, this.bindingsValueManager);\n    }    \n  }\n\n  /**\n   * Makes sure that the parsers have all required functions\n   *\n   * @param parsers - The parsers in question\n   * @param options - The current ParseOptions\n   */\n  validateParserFunctions(parsers: HookParser[], options: ParseOptions): HookParser[] {\n    const validParsers = [];\n    for (const parser of parsers) {\n      if (typeof parser.findHooks !== 'function' && typeof parser.findHookElements !== 'function') {\n        this.logger.error(['Submitted parser neither implements \"findHooks()\" nor \"findHookElements()\". One is required. Removing from list of active parsers:', parser], options);\n        continue;\n      }\n      if (typeof parser.loadComponent !== 'function') {\n        this.logger.error(['Submitted parser does not implement \"loadComponent()\". Removing from list of active parsers:', parser], options);\n        continue;\n      }\n      if (typeof parser.getBindings !== 'function') {\n        this.logger.error(['Submitted parser does not implement \"getBindings()\". Removing from list of active parsers:', parser], options);\n        continue;\n      }\n      validParsers.push(parser);\n    }\n    return validParsers;\n  }\n\n  /**\n   * Makes sure that all parser names are unique\n   *\n   * @param parsers - The parsers in question\n   * @param options - The current ParseOptions\n   */\n  checkParserNames(parsers: HookParser[], options: ParseOptions): void {\n    const parserNames: string[] = parsers.map(entry => entry.name).filter(entry => entry !== undefined) as string[];\n    const previousNames: string[] = [];\n    const alreadyWarnedNames: string[] = [];\n    for (const parserName of parserNames) {\n      if (previousNames.includes(parserName) && !alreadyWarnedNames.includes(parserName)) {\n        this.logger.warn(['Parser name \"' + parserName + '\" is not unique and appears multiple times in the list of active parsers.'], options);\n        alreadyWarnedNames.push(parserName);\n      }\n      previousNames.push(parserName);\n    }\n  }\n\n  /**\n   * A black/whitelist validation function for the benefit of the user. Outputs warnings in the console if something is off.\n   *\n   * @param parsers - The parsers in question\n   * @param blacklist - The blacklist in question\n   * @param whitelist - The whitelist in question\n   * @param options - The current ParseOptions\n   */\n  checkBlackAndWhitelist(parsers: HookParser[], blacklist: string[]|null, whitelist: string[]|null, options: ParseOptions): void {\n    const parserNames: string[] = parsers.map(entry => entry.name).filter(entry => entry !== undefined) as string[];\n    if (blacklist) {\n      for (const blacklistedParser of blacklist) {\n        if (!parserNames.includes(blacklistedParser)) {\n          this.logger.warn(['Blacklisted parser name \"' + blacklistedParser + '\" does not appear in the list of global parsers names. Make sure both spellings are identical.'], options);\n        }\n      }\n    }\n    if (whitelist) {\n      for (const whitelistedParser of whitelist) {\n        if (!parserNames.includes(whitelistedParser)) {\n          this.logger.warn(['Whitelisted parser name \"' + whitelistedParser + '\" does not appear in the list of global parsers names. Make sure both spellings are identical.'], options);\n        }\n      }\n    }\n  }\n\n}\n","import { Inject, Injectable, Injector, Optional } from '@angular/core';\nimport { DynamicHooksSettings, DynamicHooksInheritance } from './settings';\nimport { ParserEntryResolver } from './parserEntryResolver';\nimport { HookParserEntry } from './parserEntry';\nimport { HookParser } from '../../interfacesPublic';\nimport { ParseOptions, getParseOptionDefaults } from './options';\n\n/**\n * A helper class for resolving a combined settings object from all provided ones\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class SettingsResolver {\n\n  constructor(\n    private parserEntryResolver: ParserEntryResolver\n  ) {\n  }\n\n  /**\n   * Takes all provided settings objects and combines them into a final settings object\n   * \n   * @param injector - The current injector\n   * @param content - The content\n   * @param allSettings - All settings provided anywhere\n   * @param ancestorSettings - All ancestor settings\n   * @param moduleSettings - The current module settings\n   * @param localParsers - A list of local parsers\n   * @param localOptions - A local options object\n   * @param globalParsersBlacklist - A list of global parsers to blacklist\n   * @param globalParsersWhitelist - A list of global parsers to whitelist\n   */\n  public resolve(\n    injector: Injector,\n    content: any,\n    allSettings: DynamicHooksSettings[]|null,\n    ancestorSettings: DynamicHooksSettings[]|null,\n    moduleSettings: DynamicHooksSettings|null, \n    localParsers: HookParserEntry[]|null = null, \n    localOptions: ParseOptions|null = null,\n    globalParsersBlacklist: string[]|null = null,\n    globalParsersWhitelist: string[]|null = null,\n  ): {\n    parsers: HookParser[];\n    options: ParseOptions;\n  } {\n    let resolvedSettings: DynamicHooksSettings = {};\n    allSettings = allSettings || [];\n    ancestorSettings = ancestorSettings || [];\n    moduleSettings = moduleSettings || {};\n    const defaultSettings: DynamicHooksSettings = { options: getParseOptionDefaults() };\n\n    // Merge settings according to inheritance\n    if (!moduleSettings.hasOwnProperty('inheritance') || moduleSettings.inheritance === DynamicHooksInheritance.Linear) {\n      resolvedSettings = this.mergeSettings([\n        defaultSettings,\n        ...ancestorSettings,\n        {parsers: localParsers || undefined, options: localOptions || undefined}\n      ]);\n\n    } else if (moduleSettings.inheritance === DynamicHooksInheritance.All) {\n      // Additionally merge ancestorSettings after allSettings to give settings closer to the current injector priority\n      resolvedSettings = this.mergeSettings([\n        defaultSettings,\n        ...allSettings, \n        ...ancestorSettings,\n        {options: localOptions || undefined}\n      ]);\n\n    } else {\n      resolvedSettings = this.mergeSettings([\n        defaultSettings,\n        moduleSettings || {},\n        {options: localOptions || undefined}\n      ])  \n    }\n\n    const finalOptions = resolvedSettings.options!;\n\n    // Disabled sanitization if content is not string\n    if (content && typeof content !== 'string') {\n      finalOptions.sanitize = false;\n  }\n    \n    // Process parsers entries. Local parsers fully replace global ones.\n    let finalParsers: HookParser[] = [];\n    if (localParsers) {\n      finalParsers = this.parserEntryResolver.resolve(localParsers, injector, null, null, finalOptions);\n    } else if (resolvedSettings.parsers) {\n      finalParsers = this.parserEntryResolver.resolve(resolvedSettings.parsers, injector, globalParsersBlacklist, globalParsersWhitelist, finalOptions);\n    }\n\n    return {\n      parsers: finalParsers,\n      options: finalOptions\n    };\n  }\n\n  /**\n   * Merges multiple settings objects, overwriting previous ones with later ones in the provided array\n   *\n   * @param settingsArray - The settings objects to merge\n   */\n  private mergeSettings(settingsArray: DynamicHooksSettings[]): DynamicHooksSettings {\n    const mergedSettings: DynamicHooksSettings = {};\n\n    for (const settings of settingsArray) {\n      // Unique parsers are simply all collected, not overwritten\n      if (settings.parsers !== undefined) {\n        if (mergedSettings.parsers === undefined) {\n          mergedSettings.parsers = [];\n        }\n        for (const parserEntry of settings.parsers) {\n          if (!mergedSettings.parsers.includes(parserEntry)) {\n            mergedSettings.parsers.push(parserEntry);\n          }\n        }\n      }\n      // Options are individually overwritten\n      if (settings.options !== undefined) {\n        if (mergedSettings.options === undefined) {\n          mergedSettings.options = {};\n        }\n\n        mergedSettings.options = this.recursiveAssign(mergedSettings.options, settings.options);\n      }\n    }\n\n    return mergedSettings;\n  }\n\n  /**\n   * Recursively merges two objects\n   * \n   * @param a - The target object to merge into\n   * @param b - The other object being merged\n   */\n  private recursiveAssign (a: any, b: any) {\n    if (Object(b) !== b) return b;\n    if (Object(a) !== a) a = {};\n    for (const key in b) {\n        a[key] = this.recursiveAssign(a[key], b[key]);\n    }\n    return a;\n  }\n\n}\n","import { HookIndex } from '../../interfacesPublic';\nimport { HookParser, HookPosition } from '../../interfacesPublic';\nimport { Injectable } from '@angular/core';\nimport { AutoPlatformService } from '../platform/autoPlatformService';\nimport { anchorAttrHookId, anchorAttrParseToken, anchorElementTag } from '../../constants/core';\nimport { matchAll } from '../utils/utils';\nimport { ParseOptions } from '../settings/options';\nimport { Logger } from '../utils/logger';\n\nconst findInElementsNodePlaceholder = '_ngx_dynamic_hooks_node_placeholder';\n\n/**\n * An atomic replace instruction. Reads as: Replace the text from startIndex to endIndex with replacement.\n */\nexport interface ReplaceInstruction {\n  startIndex: number;\n  endIndex: number;\n  replacement: string;\n}\n\n/**\n * Stores a HookPosition along with the parser who found it\n */\nexport interface ParserFindHooksResult {\n  parser: HookParser;\n  hookPosition: HookPosition;\n}\n\n/**\n * Stores the HookValue as well as the text surrounding it\n */\nexport interface HookSegments {\n  enclosing: boolean;\n  textBefore: string;\n  openingTag: string;\n  innerValue: string|null;\n  closingTag: string|null;\n  textAfter: string;\n}\n\n/**\n * The service responsible for finding text hooks in the content and replacing them with component anchors\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class TextHookFinder {\n\n  constructor(private platformService: AutoPlatformService, private logger: Logger) {\n  }\n\n  /**\n   * Finds all text hooks in an existing element and creates the corresponding anchors\n   * \n   * @param element - The element to parse\n   * @param context - The current context object\n   * @param parsers - The parsers to use\n   * @param token - The current parse token\n   * @param options - The current ParseOptions\n   * @param hookIndex - The hookIndex object to fill\n   */\n  findInElement(element: any, context: any, parsers: HookParser[], token: string, options: ParseOptions, hookIndex: HookIndex) {\n    // Only bother looking for text hooks if there even are text hook parsers\n    for (const parser of parsers) {\n      if (typeof parser.findHooks === 'function') {\n        this.checkElement(element, context, parsers, token, options, hookIndex);\n        break;\n      }\n    }\n  }\n\n  /**\n   * Checks an individual element and travels it recursively\n   * \n   * @param element - The element to parse\n   * @param context - The current context object\n   * @param parsers - The parsers to use\n   * @param token - The current parse token\n   * @param options - The current ParseOptions\n   * @param hookIndex - The hookIndex object to fill \n   * @param extractedNodes - A recursively-used object holding all temporarily extracted nodes\n   */\n  checkElement(element: any, context: any, parsers: HookParser[], token: string, options: ParseOptions, hookIndex: HookIndex, extractedNodes: {counter: number, nodes: {[key: string]: any}} = {counter: 0, nodes: {}}, ) {\n    let childNodes = this.platformService.getChildNodes(element);\n\n    // To find text hooks in an already existing node, first replace non-text child nodes with string placeholders, then concat all text content.\n    // This is so enclosing text hooks can be found even if they are separated by other elements\n    let collectedText = '';\n    const collectedNodes: {[key: string]: any} = {};\n    for (const childNode of childNodes) {\n      if (this.platformService.isTextNode(childNode)) {\n        collectedText += this.platformService.getTextContent(childNode);\n      } else {\n        const nodeId = extractedNodes.counter++;\n        collectedText += `${findInElementsNodePlaceholder}__${nodeId}__`;\n        collectedNodes[nodeId] = childNode;\n      }\n    }\n\n    // Then check for text hooks\n    const prevHookCount = Object.keys(hookIndex).length;\n    const result = this.find(collectedText, context, parsers, token, options, hookIndex);\n\n    // If hooks were found, replace element content with result.content\n    if (Object.keys(hookIndex).length > prevHookCount) {\n      this.platformService.clearChildNodes(element);\n      this.platformService.setInnerContent(element, result.content);\n      childNodes = this.platformService.getChildNodes(element);\n\n      // Also add locally removed nodes to total extractedNodes\n      extractedNodes.nodes = {...extractedNodes.nodes, ...collectedNodes};\n    }\n\n    // If still have extractedNodes, always look for their placeholders on every level (could be deeper than when they were extracted) and reinsert them\n    if (Object.keys(extractedNodes.nodes).length) {\n      for (const childNode of childNodes) {\n        if (this.platformService.isTextNode(childNode)) {\n          let text = this.platformService.getTextContent(childNode);\n          if (text) {\n            const matches = matchAll(text, new RegExp(`${findInElementsNodePlaceholder}__(\\\\d*)__`, 'g'));\n\n            // If placeholders found\n            if (matches.length) {\n              const textReplacementNodes = [];\n              let currentPos = 0;\n\n              // Split text node containing placeholder into nodes array with restored nodes\n              for (const match of matches) {\n                const textBefore = text.substring(currentPos, match.index);\n                const extractedNodeId = parseInt(match[1]);\n\n                if (textBefore) {\n                  textReplacementNodes.push(this.platformService.createTextNode(textBefore));\n                }\n                if (extractedNodeId && extractedNodes.nodes[extractedNodeId]) {\n                  textReplacementNodes.push(extractedNodes.nodes[extractedNodeId]);\n                  delete extractedNodes.nodes[extractedNodeId];\n                }\n                \n                currentPos = match.index + match[0].length;\n              }\n              const textRemaining = text.substring(currentPos);\n              if (textRemaining) {\n                textReplacementNodes.push(this.platformService.createTextNode(textRemaining));\n              }\n\n              // Replace text node with that array\n              const parent = this.platformService.getParentNode(childNode);\n              for (const replacementNode of textReplacementNodes) {\n                this.platformService.insertBefore(parent, replacementNode, childNode);\n              }\n              this.platformService.removeChild(parent, childNode);\n\n              // Update child nodes var\n              childNodes = this.platformService.getChildNodes(parent);\n            }\n          }\n        }\n      }\n    }\n\n    // Travel child nodes recursively\n    for (const childNode of childNodes) {\n      if (childNode.nodeType !== Node.TEXT_NODE) {\n        this.checkElement(childNode, context, parsers, token, options, hookIndex, extractedNodes);\n      }\n    }\n  }\n\n  /**\n   * Finds all text hooks in a string variable and creates the corresponding anchors\n   *\n   * @param content - The text to parse\n   * @param context - The current context object\n   * @param parsers - The parsers to use\n   * @param token - The current parse token\n   * @param options - The current ParseOptions\n   * @param hookIndex - The hookIndex object to fill\n   */\n  find(content: string, context: any, parsers: HookParser[], token: string, options: ParseOptions, hookIndex: HookIndex): {content: string, hookIndex: HookIndex} {\n    if (content === '') {\n      return {\n        content: content,\n        hookIndex: hookIndex\n      }\n    }\n\n    // Convert input HTML entities?\n    if (options.convertHTMLEntities) {\n      content = this.convertHTMLEntities(content);\n    }\n\n    // Collect all parser results, sort by order of appearance\n    let parserResults: ParserFindHooksResult[] = [];\n    for (const parser of parsers) {\n      if (typeof parser.findHooks === 'function') {\n        for (const hookPosition of parser.findHooks(content, context, options)) {\n          parserResults.push({parser, hookPosition});\n        }\n      }\n    }\n    parserResults.sort((a, b) => a.hookPosition.openingTagStartIndex - b.hookPosition.openingTagStartIndex);\n\n    // Validate parser results\n    parserResults = this.validateHookPositions(parserResults, content, options);\n\n    // Process parser results\n    const selectorReplaceInstructions: ReplaceInstruction[] = [];\n    for (const pr of parserResults) {\n      const hookId = Object.keys(hookIndex).length + 1;\n\n      // Some info about this hook\n      const hookSegments = this.getHookSegments(pr.hookPosition, content);\n\n      // Prepare ReplaceInstructions array to replace all found hooks with anchor elements\n      selectorReplaceInstructions.push({\n        startIndex: pr.hookPosition.openingTagStartIndex,\n        endIndex: pr.hookPosition.openingTagEndIndex,\n        replacement: `<${anchorElementTag} ${anchorAttrHookId}=\"${hookId}\" ${anchorAttrParseToken}=\"${token}\">`\n      });\n      selectorReplaceInstructions.push({\n        startIndex: hookSegments.enclosing ? pr.hookPosition.closingTagStartIndex! : pr.hookPosition.openingTagEndIndex,\n        endIndex: hookSegments.enclosing ? pr.hookPosition.closingTagEndIndex! : pr.hookPosition.openingTagEndIndex,\n        replacement: `</${anchorElementTag}>`\n      });\n\n      // Enter hook into index\n      hookIndex[hookId] = {\n        id: hookId,\n        parser: pr.parser,\n        value: {\n          openingTag: hookSegments.openingTag,\n          closingTag: hookSegments.closingTag,\n          element: null,\n          elementSnapshot: null\n        },\n        data: null,\n        isLazy: false,\n        bindings: null,\n        previousBindings: null,\n        componentRef: null,\n        dirtyInputs: new Set(),\n        outputSubscriptions: {},\n        htmlEventSubscriptions: {}\n      };\n\n      // Remove tag artifacts (does not change parser results indexes)\n      if (hookSegments.enclosing && options.fixParagraphTags) {\n        const firstResult = this.removeTagArtifacts(hookSegments.textBefore, '<p>', '</p>', hookSegments.innerValue!, '</p>', '<p>');\n        hookSegments.textBefore = firstResult.firstText;\n        hookSegments.innerValue = firstResult.secondText;\n\n        const secondResult = this.removeTagArtifacts(hookSegments.innerValue, '<p>', '</p>', hookSegments.textAfter, '</p>', '<p>');\n        hookSegments.innerValue = secondResult.firstText;\n        hookSegments.textAfter = secondResult.secondText;\n\n        content = hookSegments.textBefore + hookSegments.openingTag + hookSegments.innerValue + hookSegments.closingTag + hookSegments.textAfter;\n      }\n    }\n\n    // Finally replace hooks with anchors\n    // Process in backwards order, so no need to change indexes.\n    // Primarily sort by startIndex. If multiple startIndexes are identical (possible with a follow-up hook to a self-closing hook), secondarily sort by endIndex.\n    selectorReplaceInstructions.sort((a, b) => {\n      let sortResult = b.startIndex - a.startIndex;\n      if (sortResult === 0) sortResult = b.endIndex - a.endIndex;\n      return sortResult;\n    });\n\n    for (const selectorReplaceInstruction of selectorReplaceInstructions) {\n      const textBeforeSelector = content.substring(0, selectorReplaceInstruction.startIndex);\n      const textAfterSelector = content.substring(selectorReplaceInstruction.endIndex);\n      content = textBeforeSelector + selectorReplaceInstruction.replacement + textAfterSelector;\n    }\n\n    return {\n      content: content,\n      hookIndex: hookIndex\n    };\n  }\n\n  /**\n   * Takes a HookPosition and returns the HookValue as well as the text surrounding it\n   *\n   * @param hookPosition - The HookPosition in question\n   * @param content - The source text for the HookPosition\n   */\n  private getHookSegments(hookPosition: HookPosition, content: string): HookSegments {\n    const enclosing = (Number.isInteger(hookPosition.closingTagStartIndex) && Number.isInteger(hookPosition.closingTagEndIndex));\n    return {\n      enclosing: enclosing,\n      textBefore: content.substring(0, hookPosition.openingTagStartIndex),\n      openingTag: content.substring(hookPosition.openingTagStartIndex, hookPosition.openingTagEndIndex),\n      innerValue: enclosing ? content.substring(hookPosition.openingTagEndIndex, hookPosition.closingTagStartIndex!) : null,\n      closingTag: enclosing ? content.substring(hookPosition.closingTagStartIndex!, hookPosition.closingTagEndIndex!) : null,\n      textAfter: enclosing ? content.substring(hookPosition.closingTagEndIndex!) : content.substring(hookPosition.openingTagEndIndex)\n    };\n  }\n\n  /**\n   * Checks the combined parserResults and validates them. Invalid ones are removed.\n   *\n   * @param parserResults - The parserResults to check\n   * @param content - The content string\n   * @param options - The current ParseOptions\n   */\n  private validateHookPositions(parserResults: ParserFindHooksResult[], content: string, options: ParseOptions): ParserFindHooksResult[] {\n    const checkedParserResults = [];\n\n    outerloop: for (const [index, parserResult] of parserResults.entries()) {\n      const enclosing = (Number.isInteger(parserResult.hookPosition.closingTagStartIndex) && Number.isInteger(parserResult.hookPosition.closingTagEndIndex));\n      const hookPos = parserResult.hookPosition;\n\n      // Check if hook is in itself well-formed\n      if (hookPos.openingTagStartIndex >= hookPos.openingTagEndIndex) {\n        this.logger.warn(['Text hook error: openingTagEndIndex has to be greater than openingTagStartIndex. Ignoring.', hookPos], options);\n        continue;\n      }\n      if (enclosing && hookPos.openingTagEndIndex > hookPos.closingTagStartIndex!) {\n        this.logger.warn(['Text hook error: closingTagStartIndex has to be greater than openingTagEndIndex. Ignoring.', hookPos], options);\n        continue;\n      }\n      if (enclosing && hookPos.closingTagStartIndex! >= hookPos.closingTagEndIndex!) {\n        this.logger.warn(['Text hook error: closingTagEndIndex has to be greater than closingTagStartIndex. Ignoring.', hookPos], options);\n        continue;\n      }\n\n      // Check if hook overlaps with other hooks\n      const previousHooks = parserResults.slice(0, index);\n      innerloop: for (const previousHook of previousHooks) {\n        const prevHookPos = previousHook.hookPosition;\n        const prevIsEnclosing = (Number.isInteger(prevHookPos.closingTagStartIndex) && Number.isInteger(prevHookPos.closingTagEndIndex));\n\n        // Check if identical hook position\n        if (\n          hookPos.openingTagStartIndex === prevHookPos.openingTagStartIndex &&\n          hookPos.openingTagEndIndex === prevHookPos.openingTagEndIndex &&\n          (!enclosing || !prevIsEnclosing || (\n            hookPos.closingTagStartIndex === prevHookPos.closingTagStartIndex &&\n            hookPos.closingTagEndIndex === prevHookPos.closingTagEndIndex\n          ))\n          ) {\n          this.generateHookPosWarning('A text hook with the same position as another text hook was found. There may be multiple parsers looking for the same text pattern. Ignoring duplicates.', hookPos, prevHookPos, content, options);\n          continue outerloop;\n        }\n\n        // Opening tag must begin after previous opening tag has ended\n        if (hookPos.openingTagStartIndex < prevHookPos.openingTagEndIndex) {\n          this.generateHookPosWarning('Text hook error: Hook opening tag starts before previous hook opening tag ends. Ignoring.', hookPos, prevHookPos, content, options);\n          continue outerloop;\n        }\n\n        // Just need to check for collisions with previous closing tag now\n        \n        // Opening tag must not overlap with previous closing tag\n        if (prevIsEnclosing && !(\n          hookPos.openingTagEndIndex <= prevHookPos.closingTagStartIndex! ||\n          hookPos.openingTagStartIndex >= prevHookPos.closingTagEndIndex!\n        )) {\n          this.generateHookPosWarning('Text hook error: Opening tag of hook overlaps with closing tag of previous hook. Ignoring.', hookPos, prevHookPos, content, options);\n          continue outerloop;\n        }\n\n        // Closing tag must not overlap with previous closing tag\n        if (prevIsEnclosing && enclosing && !(\n          hookPos.closingTagEndIndex! <= prevHookPos.closingTagStartIndex! ||\n          hookPos.closingTagStartIndex! >= prevHookPos.closingTagEndIndex!\n        )) {\n          this.generateHookPosWarning('Text hook error: Closing tag of hook overlaps with closing tag of previous hook. Ignoring.', hookPos, prevHookPos, content, options);\n          continue outerloop;\n        }\n\n        // Check if hooks are incorrectly nested, e.g. \"<outer-hook><inner-hook></outer-hook></inner-hook>\"\n        if (enclosing && prevIsEnclosing &&\n          hookPos.openingTagEndIndex <= prevHookPos.closingTagStartIndex! &&\n          hookPos.closingTagStartIndex! >= prevHookPos.closingTagEndIndex!\n          ) {\n            this.generateHookPosWarning('Text hook error: The closing tag of a nested hook lies beyond the closing tag of the outer hook. Ignoring.', hookPos, prevHookPos, content, options);\n            continue outerloop;\n        }\n      }\n\n      // If everything okay, add to result array\n      checkedParserResults.push(parserResult);\n    }\n\n    return checkedParserResults;\n  }\n\n  /**\n   * Outputs a warning in the console when the positions of two hooks are invalid in some manner\n   *\n   * @param message - The error message\n   * @param hookPos - The first HookPosition\n   * @param prevHookPos - The second HookPosition\n   * @param content - The content string\n   * @param options - The current ParseOptions\n   */\n  private generateHookPosWarning(message: string, hookPos: HookPosition, prevHookPos: HookPosition, content: string, options: ParseOptions): void {\n    const prevHookSegments = this.getHookSegments(prevHookPos, content);\n    const hookSegments = this.getHookSegments(hookPos, content);\n\n    const prevHookData = {\n      openingTag: prevHookSegments.openingTag,\n      openingTagStartIndex: prevHookPos.openingTagStartIndex,\n      openingTagEndIndex: prevHookPos.openingTagEndIndex,\n      closingTag: prevHookSegments.closingTag,\n      closingTagStartIndex: prevHookPos.closingTagStartIndex,\n      closingTagEndIndex: prevHookPos.closingTagEndIndex\n    };\n    const hookData = {\n      openingTag: hookSegments.openingTag,\n      openingTagStartIndex: hookPos.openingTagStartIndex,\n      openingTagEndIndex: hookPos.openingTagEndIndex,\n      closingTag: hookSegments.closingTag,\n      closingTagStartIndex: hookPos.closingTagStartIndex,\n      closingTagEndIndex: hookPos.closingTagEndIndex\n    };\n\n    this.logger.warn([message + '\\nFirst hook: ', prevHookData, '\\nSecond hook:', hookData], options);\n  }\n\n  /**\n   * When using an enclosing hook that is spread over several lines in an HTML editor, p-elements tend to get ripped apart. For example:\n   *\n   * <p><app-hook></p>\n   *   <h2>This is the hook content</h2>\n   * <p></app-hook></p>\n   *\n   * would cause the innerValue of app-hook to have a lone closing and opening p-tag (as their counterparts are outside of the hook).\n   * To clean up the HTML, this function removes a pair of these artifacts (e.g. <p> before hook, </p> inside hook) if BOTH are found.\n   * This is important as the HTML parser will otherwise mess up the intended HTML and sometimes even put what should be ng-content below the component.\n   *\n   * @param firstText - The text on one side of the hook\n   * @param firstArtifact - A string that should be removed from firstText...\n   * @param firstRemoveIfAfter - ...if it appears after the last occurrence of this string\n   * @param secondText - The text on the other side of the hook\n   * @param secondArtifact - A string that should be removed from secondText...\n   * @param secondRemoveIfBefore - ...if it appears before the first occurrence of this string\n   */\n  private removeTagArtifacts(firstText: string, firstArtifact: string, firstRemoveIfAfter: string, secondText: string, secondArtifact: string, secondRemoveIfBefore: string): {firstText: string, secondText: string} {\n    let firstArtifactFound = false;\n    let secondArtifactFound = false;\n\n    // a) Look for first artifact\n    const firstArtifactIndex = firstText.lastIndexOf(firstArtifact);\n    const firstArtifactIfAfterIndex = firstText.lastIndexOf(firstRemoveIfAfter);\n    if (\n      (firstArtifactIndex >= 0 && firstArtifactIfAfterIndex === -1) ||\n      (firstArtifactIndex > firstArtifactIfAfterIndex)\n    ) {\n      firstArtifactFound = true;\n    }\n\n    // b) Look for second artifact\n    const secondArtifactIndex = secondText.indexOf(secondArtifact);\n    const secondArtifactIfBeforeIndex = secondText.indexOf(secondRemoveIfBefore);\n    if (\n      // If startArtifact appears before startArtifactNotBefore\n      (secondArtifactIndex >= 0 && secondArtifactIfBeforeIndex === -1) ||\n      (secondArtifactIndex < secondArtifactIfBeforeIndex)\n    ) {\n      secondArtifactFound = true;\n    }\n\n    // If artifacts found on both sides, remove both by overwriting them with empty spaces (doesn't change index)\n    if (firstArtifactFound && secondArtifactFound) {\n      firstText = firstText.substring(0, firstArtifactIndex) + ' '.repeat(firstArtifact.length) + firstText.substring(firstArtifactIndex + firstArtifact.length);\n      secondText = secondText.substring(0, secondArtifactIndex) + ' '.repeat(secondArtifact.length) + secondText.substring(secondArtifactIndex + secondArtifact.length);\n    }\n\n    // Trim after artifacts removed\n    return {\n      firstText: firstText,\n      secondText: secondText\n    };\n  }\n\n  /**\n   * Converts all HTML entities to normal characters\n   *\n   * @param text - The text with the potential HTML entities\n   */\n  convertHTMLEntities(text: string): string {\n    const div = this.platformService.createElement('div');\n    const result = text.replace(/&[#A-Za-z0-9]+;/gi, (hmtlEntity) => {\n        // Replace invisible nbsp-whitespace with normal whitespace (not \\u00A0). Leads to problems with JSON.parse() otherwise.\n        if (hmtlEntity === ('&nbsp;')) { return ' '; }\n        this.platformService.setInnerContent(div, hmtlEntity);\n        return this.platformService.getTextContent(div)!;\n    });\n    return result;\n  }\n}\n","import { HookIndex } from '../../interfacesPublic';\nimport { HookParser } from '../../interfacesPublic';\nimport { Injectable } from '@angular/core';\nimport { AutoPlatformService } from '../platform/autoPlatformService';\nimport { isAngularManagedElement, sortElements } from '../utils/utils';\nimport { anchorAttrHookId, anchorAttrParseToken } from '../../constants/core';\nimport { ParseOptions } from '../settings/options';\nimport { Logger } from '../utils/logger';\n\n/**\n * Stores a hook element along with the parser who found it\n */\nexport interface ParserFindHookElementsResult {\n  parser: HookParser;\n  hookElement: any;\n}\n\n/**\n * The service responsible for finding element hooks in the content and marking them with anchor attrs\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class ElementHookFinder {\n\n  constructor(private platformService: AutoPlatformService, private logger: Logger) {\n  }\n\n  /**\n   * Finds all element hooks in an element and marks the corresponding anchor elements\n   *\n   * @param contentElement - The content element to parse\n   * @param context - The current context object\n   * @param parsers - The parsers to use\n   * @param token - The current parse token\n   * @param options - The current ParseOptions\n   * @param hookIndex - The hookIndex object to fill\n   */\n  find(contentElement: any, context: any, parsers: HookParser[], token: string, options: ParseOptions, hookIndex: HookIndex): HookIndex {\n\n    // Collect all parser results\n    let parserResults: ParserFindHookElementsResult[] = [];\n    for (const parser of parsers) {\n      if (typeof parser.findHookElements === 'function') {\n        for (const hookElement of parser.findHookElements(contentElement, context, options)) {\n          parserResults.push({parser, hookElement});\n        }\n      }\n    }\n    parserResults = sortElements(parserResults, this.platformService.sortElements.bind(this.platformService), entry => entry.hookElement);\n\n    // Validate parser results\n    parserResults = this.validateHookElements(parserResults, contentElement, options);\n\n    // Process parser results\n    for (const pr of parserResults) {\n      const hookId = Object.keys(hookIndex).length + 1;\n\n      // Enter hook into index\n      hookIndex[hookId] = {\n        id: hookId,\n        parser: pr.parser,\n        value: {\n          openingTag: this.platformService.getOpeningTag(pr.hookElement),\n          closingTag: this.platformService.getClosingTag(pr.hookElement),\n          element: pr.hookElement,\n          elementSnapshot: this.platformService.cloneElement(pr.hookElement)\n        },\n        data: null,\n        isLazy: false,\n        bindings: null,\n        previousBindings: null,\n        componentRef: null,\n        dirtyInputs: new Set(),\n        outputSubscriptions: {},\n        htmlEventSubscriptions: {}\n      };\n\n      // Add anchor attrs\n      this.platformService.setAttribute(pr.hookElement, anchorAttrHookId, hookId.toString());\n      this.platformService.setAttribute(pr.hookElement, anchorAttrParseToken, token);\n    }\n\n    return hookIndex;\n  }\n\n  /**\n   * Checks the combined parserResults and validates them. Invalid ones are removed.\n   *\n   * @param parserResults - The parserResults to check\n   * @param contentElement - The content element\n   * @param options - The current ParseOptions\n   */\n  private validateHookElements(parserResults: ParserFindHookElementsResult[], contentElement: any, options: ParseOptions): ParserFindHookElementsResult[] {\n    const checkedParserResults = [];\n\n    for (const [index, parserResult] of parserResults.entries()) {\n      const previousCheckedParserResults = checkedParserResults.slice(0, index);\n      const wasFoundAsElementHookAlready = previousCheckedParserResults.findIndex(entry => entry.hookElement === parserResult.hookElement) >= 0;\n\n      // Must not already be a hook anchor (either from previous iteration of loop or text hook finder)\n      if (\n        wasFoundAsElementHookAlready ||\n        this.platformService.getAttributeNames(parserResult.hookElement).includes(anchorAttrHookId) || \n        this.platformService.getAttributeNames(parserResult.hookElement).includes(anchorAttrParseToken)\n      ) {\n        this.logger.warn(['An element hook tried to use an element that was found by another hook before. There may be multiple parsers looking for the same elements. Ignoring duplicates.', parserResult.hookElement], options)\n        continue;\n      }\n\n      // Must not already be host or view element for an Angular component\n      if (isAngularManagedElement(parserResult.hookElement)) {\n        // this.logger.warn(['A hook element was found that is already a host or view element of an active Angular component. Ignoring.'], options);\n        continue;\n      }\n\n      // If everything okay, add to result array\n      checkedParserResults.push(parserResult);\n    }\n\n    return checkedParserResults;\n  }\n  \n\n}\n","import { Injectable } from '@angular/core';\nimport { HookIndex } from '../../interfacesPublic';\nimport { AutoPlatformService } from '../platform/autoPlatformService';\nimport { anchorAttrHookId, anchorAttrParseToken } from '../../constants/core';\nimport { matchAll } from './utils';\n\nconst sanitizerPlaceholderTag = 'dynamic-hooks-sanitization-placeholder';\nconst sanitizerPlaceholderRegex = new RegExp(`<\\/?${sanitizerPlaceholderTag}.*?>`, 'g');\n\n/**\n * A utility service that sanitizes an Element and all of its children while exluding found hook elements\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class ContentSanitizer {\n  \n  attrWhitelist = [anchorAttrHookId, anchorAttrParseToken, 'class', 'href', 'src']\n\n  constructor(private platformService: AutoPlatformService) {}\n\n  /**\n   * Sanitizes an element while preserving marked hook anchors\n   * \n   * @param contentElement - The element to sanitize\n   * @param hookIndex - The current hookIndex\n   * @param token - The current ParseToken\n   */\n  sanitize(contentElement: any, hookIndex: HookIndex, token: string): any {\n    const originalHookAnchors: {[key: string]: any} = {};\n\n    // Replace all hook anchors with custom placeholder elements\n    // This is so the browser has no predefined rules where they can and can't exist in the dom hierarchy and doesn't edit the html.\n    for (const hook of Object.values(hookIndex)) {\n      const anchorElement = this.platformService.querySelectorAll(contentElement, `[${anchorAttrHookId}=\"${hook.id}\"][${anchorAttrParseToken}=\"${token}\"]`)?.[0];\n      if (anchorElement) {\n        originalHookAnchors[hook.id] = anchorElement;\n\n        const parentElement = this.platformService.getParentNode(anchorElement);\n        const childNodes = this.platformService.getChildNodes(anchorElement);\n\n        const placeholderElement = this.platformService.createElement(sanitizerPlaceholderTag);\n        this.platformService.setAttribute(placeholderElement, anchorAttrHookId, hook.id.toString());\n        this.platformService.setAttribute(placeholderElement, anchorAttrParseToken, token);\n        this.platformService.insertBefore(parentElement, placeholderElement, anchorElement);\n        this.platformService.removeChild(parentElement, anchorElement);\n        for (const node of childNodes) {\n          this.platformService.appendChild(placeholderElement, node);\n        }\n      }\n    }\n\n    // Encode sanitization placeholders (so they survive sanitization)\n    let innerHTML = this.platformService.getInnerContent(contentElement);\n    innerHTML = this.findAndEncodeTags(innerHTML, sanitizerPlaceholderRegex);\n\n    // Sanitize (without warnings)\n    const consoleWarnFn = console.warn;\n    console.warn = () => {};\n    let sanitizedInnerHtml = this.platformService.sanitize(innerHTML);\n    console.warn = consoleWarnFn;\n\n    // Decode sanitization placeholders\n    sanitizedInnerHtml = this.decodeTagString(sanitizedInnerHtml);\n    contentElement.innerHTML = sanitizedInnerHtml || '';\n\n    // Restore original hook anchors\n    for (const [hookId, anchorElement] of Object.entries(originalHookAnchors)) {\n      const placeholderElement = this.platformService.querySelectorAll(contentElement, `${sanitizerPlaceholderTag}[${anchorAttrHookId}=\"${hookId}\"]`)?.[0];\n      if (placeholderElement) {\n        const parentElement = this.platformService.getParentNode(placeholderElement);\n        const childNodes = this.platformService.getChildNodes(placeholderElement);\n        this.platformService.insertBefore(parentElement, anchorElement, placeholderElement);\n        this.platformService.removeChild(parentElement, placeholderElement);\n        for (const node of childNodes) {\n          this.platformService.appendChild(anchorElement, node);\n        }\n\n        // As a last step, sanitize the hook anchor attrs as well\n        this.sanitizeElementAttrs(anchorElement);\n      }\n    }\n\n    return contentElement;\n  }\n\n  /**\n   * Sanitizes a single element's attributes\n   *\n   * @param element - The element in question\n   */\n  private sanitizeElementAttrs(element: any): any {\n      // Collect all existing attributes, put them on span-element, sanitize it, then copy surviving attrs back onto hook anchor element\n      const attrs = this.platformService.getAttributeNames(element);\n      const tmpWrapperElement = this.platformService.createElement('div');\n      const tmpElement = this.platformService.createElement('span');\n      this.platformService.appendChild(tmpWrapperElement, tmpElement);\n      \n      // Move attr to tmp\n      for (const attr of attrs) {\n        try {\n          this.platformService.setAttribute(tmpElement, attr, this.platformService.getAttribute(element, attr)!);\n        } catch (e) {}\n        // Keep in separate try-catch, so the first doesn't stop the second\n        try {\n          // Always keep those two\n          if (attr !== anchorAttrHookId && attr !== anchorAttrParseToken) {\n            this.platformService.removeAttribute(element, attr);\n          }\n        } catch (e) {}          \n      }\n\n      // Sanitize tmp\n      tmpWrapperElement.innerHTML = this.platformService.sanitize(this.platformService.getInnerContent(tmpWrapperElement));\n\n      // Move surviving attrs back to element\n      const sanitizedTmpElement = this.platformService.querySelectorAll(tmpWrapperElement, 'span')[0];\n      const survivingAttrs = this.platformService.getAttributeNames(sanitizedTmpElement);\n      for (const survivingAttr of survivingAttrs) {\n        try {\n          this.platformService.setAttribute(element, survivingAttr, this.platformService.getAttribute(sanitizedTmpElement, survivingAttr)!);\n        } catch (e) {}\n      }\n\n      return element;\n  }\n\n  // En/decoding placeholders\n  // ------------------------\n\n  /**\n   * Finds and encodes all tags that match the specified regex so that they survive sanitization\n   * \n   * @param content - The stringified html content to search\n   * @param substrRegex - The regex that matches the element tags\n   */\n  private findAndEncodeTags(content: string, substrRegex: RegExp): string {\n    let encodedContent = content;\n\n    const matches = matchAll(content, substrRegex);\n    matches.sort((a, b) => b.index - a.index);\n\n    for (const match of matches) {\n      const startIndex = match.index;\n      const endIndex = match.index + match[0].length;\n\n      const textBeforeSelector = encodedContent.substring(0, startIndex);\n      const encodedPlaceholder = this.encodeTagString(encodedContent.substring(startIndex, endIndex));\n      const textAfterSelector = encodedContent.substring(endIndex);\n      encodedContent = textBeforeSelector + encodedPlaceholder + textAfterSelector;\n    }\n\n    return encodedContent;\n  }\n\n  /**\n   * Encodes the special html chars in a html tag so that is is considered a harmless string\n   *\n   * @param element - The element as a string\n   */\n  private encodeTagString(element: string): string {\n    element = element.replace(/</g, '@@@hook-lt@@@');\n    element = element.replace(/>/g, '@@@hook-gt@@@');\n    element = element.replace(/\"/g, '@@@hook-dq@@@');\n    return element;\n  }\n\n  /**\n   * Decodes the encoded html chars in a html tag again\n   *\n   * @param element - The element as a string\n   */\n  private decodeTagString(element: string): string {\n    element = element.replace(/@@@hook-lt@@@/g, '<');\n    element = element.replace(/@@@hook-gt@@@/g, '>');\n    element = element.replace(/@@@hook-dq@@@/g, '\"');\n    return element;\n  }\n\n}\n","import { Injectable } from '@angular/core';\nimport { Logger } from './logger';\nimport { getParseOptionDefaults, ParseOptions } from '../settings/options';\n\n\n/**\n * The object returned by the detailedStringify function in DeepComparer.\n * Contains the stringified value as well as the number of times the maximum stringify depth was reached.\n */\nexport interface DetailedStringifyResult {\n  result: string|null;\n  depthReachedCount: number;\n}\n\n/**\n * A service for comparing two variables by value instead of by reference\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class DeepComparer {\n\n  // 1. Inputs\n  // -----------------------------------------------------------------\n\n  constructor(private logger: Logger) {\n  }\n\n  /**\n   * Tests if two objects are equal by value\n   *\n   * @param a - The first object\n   * @param b - The second object\n   * @param compareDepth - How many levels deep to compare\n   * @param options - The current parseOptions\n   */\n  isEqual(a: any, b: any, compareDepth?: number, options: ParseOptions = getParseOptionDefaults()): boolean {\n    const aStringified = this.detailedStringify(a, compareDepth);\n    const bStringified = this.detailedStringify(b, compareDepth);\n\n    if (aStringified.result === null || bStringified.result === null) {\n      this.logger.warn([\n        'Objects could not be compared by value as one or both of them could not be stringified. Returning false. \\n',\n        'Objects:', a, b\n      ], options);\n      return false;\n    }\n\n    return aStringified.result === bStringified.result;\n  }\n\n  /**\n   * Like JSON.stringify, but stringifies additional datatypes that would have been\n   * nulled otherwise. It also doesn't throw errors on cyclic property paths.\n   *\n   * If obj can't be stringified for whatever reason, returns null.\n   *\n   * @param obj - The object to stringify\n   * @param depth - How many levels deep to stringify\n   */\n  detailedStringify(obj: any, depth?: number): DetailedStringifyResult {\n    try {\n      // Null cyclic paths\n      const depthReached = {count: 0};\n      const decylcedObj = this.decycle(obj, [], depth, depthReached);\n\n      const stringified = JSON.stringify(decylcedObj, (key, value) => {\n        // If undefined\n        if (value === undefined) {\n          return 'undefined';\n        }\n        // If function or class\n        if (typeof value === 'function') {\n          return value.toString();\n        }\n        // If symbol\n        if (typeof value === 'symbol') {\n          return value.toString();\n        }\n        return value;\n      });\n\n      return {result: stringified, depthReachedCount: depthReached.count};\n    } catch (e) {\n      return {result: null, depthReachedCount: 0};\n    }\n  }\n\n  /**\n   * Travels on object and replaces cyclical references with null\n   *\n   * @param obj - The object to travel\n   * @param stack - To keep track of already travelled objects\n   * @param depth - How many levels deep to decycle\n   * @param depthReached - An object to track the number of times the max depth was reached\n   */\n  decycle(obj: any, stack: any[] = [], depth: number = 5, depthReached: { count: number; }): any {\n    if (stack.length > depth) {\n      depthReached.count++;\n      return null;\n    }\n\n    if (!obj || typeof obj !== 'object' || obj instanceof Date) {\n        return obj;\n    }\n\n    // Check if cyclical and we've traveled this obj already\n    //\n    // Note: Test this not by object reference, but by object PROPERTY reference/equality. If an object has identical properties,\n    // the object is to be considered identical even if it has a different reference itself.\n    //\n    // Explanation: This is to prevent a sneaky bug when comparing by value and a parser returns an object as an input that contains a reference to the object holding it\n    // (like returning the context object that contains a reference to the parent component holding the context object).\n    // In this example, when the context object changes by reference, the old input will be compared with the new input. However, as the old input consists of\n    // the old context object that now (through the parent component) contains a reference to the new context object, while the new input references the new context\n    // object exclusively, the decycle function would produce different results for them if it only checked cyclical paths by reference (even if the context object\n    // remained identical in value!)\n    //\n    // Though an unlikely scenario, checking cyclical paths via object properties rather than the object reference itself solves this problem.\n    for (const stackObj of stack) {\n      if (this.objEqualsProperties(obj, stackObj)) {\n        return null;\n      }\n    }\n\n    const s = stack.concat([obj]);\n\n    if (Array.isArray(obj)) {\n      const newArray = [];\n      for (const entry of obj) {\n        newArray.push(this.decycle(entry, s, depth, depthReached));\n      }\n      return newArray;\n    } else {\n      const newObj: any = {};\n      for (const key of Object.keys(obj)) {\n        newObj[key] = this.decycle(obj[key], s, depth, depthReached);\n      }\n      return newObj;\n    }\n  }\n\n  /**\n   * Returns true when all the properties of one object equal those of another object, otherwise false.\n   *\n   * @param a - The first object\n   * @param b - The second object\n   */\n  objEqualsProperties(a: any, b: any): boolean {\n    const aKeys = Object.keys(a);\n    const bKeys = Object.keys(b);\n\n    if (aKeys.length !== bKeys.length) {\n      return false;\n    }\n\n    for (const aKey of aKeys) {\n      if (a[aKey] !== b[aKey]) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n}\n","import { Injectable, reflectComponentType, ChangeDetectorRef} from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { Hook, HookIndex, PreviousHookBinding } from '../../interfacesPublic';\nimport { ParseOptions } from '../../services/settings/options';\nimport { DeepComparer, DetailedStringifyResult } from '../utils/deepComparer';\nimport { Logger } from '../utils/logger';\n\n/**\n * The service responsible for updating dynamically created components\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class ComponentUpdater {\n\n  constructor(private deepComparer: DeepComparer, private logger: Logger) {\n  }\n\n  /**\n   * Invoked when the inputs/outputs should be checked for updates\n   *\n   * @param hookIndex - The current hookIndex\n   * @param context - The new context object\n   * @param options - The current ParseOptions\n   * @param triggerOnDynamicChanges - Whether to trigger the OnDynamicChanges method of dynamically loaded components\n   */\n  refresh(hookIndex: HookIndex, context: any, options: ParseOptions, triggerOnDynamicChanges: boolean): void {\n\n    // Update bindings for all loaded hooks\n    for (const [hookId, hook] of Object.entries(hookIndex)) {\n      this.updateBindings(hook, context, options);\n    }\n\n    // Also: If context has changed by reference, call OnDynamicChanges() for all created components.\n    if (triggerOnDynamicChanges) {\n      for (const hook of Object.values(hookIndex)) {\n        if (!hook.componentRef) { \n          return; \n        }\n\n        if (typeof hook.componentRef.instance['onDynamicChanges'] === 'function') {\n          hook.componentRef.instance['onDynamicChanges']({context});\n        }\n      }\n    }\n  }\n\n  /**\n   * Creates or updates bindings for a hook with a loaded component\n   * \n   * @param hook - THe hook to update\n   * @param context - The context object\n   * @param options - The current ParseOptions\n   */\n  updateBindings(hook: Hook, context: any, options: ParseOptions) {\n    if (!hook.componentRef) { \n      return; \n    }\n\n    // Update bindings\n    hook.bindings = hook.parser.getBindings(hook.id, hook.value, context, options);\n    this.updateComponentWithNewInputs(hook, options);\n    this.updateComponentWithNewOutputs(hook, context, options);\n\n    // Snapshot bindings for comparison next time\n    hook.previousBindings = {\n      inputs: this.savePreviousBindings(hook, 'inputs', options.compareInputsByValue!, options.compareByValueDepth!),\n      outputs: this.savePreviousBindings(hook, 'outputs', options.compareOutputsByValue!, options.compareByValueDepth!)\n    };\n  }\n\n  /**\n   * Creates a list of all previous bindings along with their stringified values\n   *\n   * @param hook - The hook to check\n   * @param type - The type of bindings that should be saved\n   * @param saveStringified - Whether to save the stringified value in addition to the reference\n   * @param stringifyDepth - How many levels deep to stringify the previous bindings\n   */\n  savePreviousBindings(hook: Hook, type: 'inputs'|'outputs', saveStringified: boolean, stringifyDepth: number): {[key: string]: PreviousHookBinding} {\n    const result: {[key: string]: PreviousHookBinding} = {};\n    if (hook.bindings!.hasOwnProperty(type)) {\n      for (const [bindingName, bindingValue] of Object.entries(hook.bindings![type] as any)) {\n        result[bindingName] = {\n          reference: bindingValue,\n          stringified: saveStringified ? this.deepComparer.detailedStringify(bindingValue, stringifyDepth) : null // To compare by value\n        };\n      }\n    }\n    return result;\n  }\n\n  // Updating bindings\n  // ----------------------------------------------------------------------------------------------------------------\n\n  /**\n   * Processes a hook object and updates the inputs of a dynamic component where required\n   *\n   * @param hook - The hook in question\n   * @param options - The current ParseOptions\n   */\n  updateComponentWithNewInputs(hook: Hook, options: ParseOptions): void {\n    const component = hook.componentRef!.instance;\n\n    // Find out which inputs have changed\n    const changedInputs = this.getChangedBindings(hook, 'inputs', options);\n\n    // Check if inputs exists on component\n    const existingInputs: {\n      propName: string,\n      templateName: string|null,\n      value: any\n    }[] = [];\n\n    const compMeta = reflectComponentType(hook.componentRef!.componentType)!;\n\n    for (const [inputName, inputValue] of Object.entries(changedInputs)) {\n      // Some naming tolerance: Input name can be case-insensitive and in dash-case.\n      // Look for more literal matches first (transformed dash-case + case-insensitive has lowest priority)\n      const metaKey = options.ignoreInputAliases ? 'propName' : 'templateName';\n      const inputEntry = \n        compMeta.inputs.find(inputObject => inputName === inputObject[metaKey]) ||\n        compMeta.inputs.find(inputObject => inputName.toLowerCase() === inputObject[metaKey].toLowerCase()) ||\n        compMeta.inputs.find(inputObject => inputName.replace(/-/g, '') === inputObject[metaKey]) ||\n        compMeta.inputs.find(inputObject => inputName.replace(/-/g, '').toLowerCase() === inputObject[metaKey].toLowerCase())\n\n      // If actual input was found, add it\n      if (inputEntry) {\n        existingInputs.push({\n          propName: inputEntry.propName,\n          templateName: inputEntry.templateName,\n          value: inputValue\n        });\n\n      // If not, but accepts any property as input, add it anyway\n      } else if (options.acceptInputsForAnyProperty) {\n        // If property exists (in a case-agnostic way), use it. Otherwise create literal new property.\n        let foundInputProp = \n          Object.getOwnPropertyNames(component).find(propName => inputName === propName) ||\n          Object.getOwnPropertyNames(component).find(propName => inputName.toLowerCase() === propName.toLowerCase());\n\n        const finalInputProp = foundInputProp || inputName;\n\n        // Even this setting has limits. Don't allow setting fundamental JavaScript object properties.\n        if (!['__proto__', 'prototype', 'constructor'].includes(finalInputProp)) {\n          existingInputs.push({\n            propName: finalInputProp,\n            templateName: null,\n            value: inputValue\n          });\n        } else {\n          this.logger.error(['Tried to overwrite a __proto__, prototype or constructor property with input \"' + finalInputProp + '\" for hook \"' + hook.componentRef!.componentType.name + '\". This is not allowed.'], options);\n          continue;\n        }\n      }\n    }\n\n    // Set inputs in component\n    for (const {propName, templateName, value} of existingInputs) {\n      if (templateName) {\n        hook.componentRef?.setInput(templateName, value);             // Official method to set inputs. Sets property, triggers OnChanges and marks for OnPush. Also works with new signal inputs.\n      } else if (propName) {\n        hook.componentRef!.instance[propName] = value;                // Resort to manual setting only if prop isn't a declared input (may happen with \"acceptInputsForAnyProperty\")\n      }\n    }\n\n    // Important: Still need to trigger cd, even with componentRef.setInput\n    if (existingInputs.length) {\n      hook.componentRef?.changeDetectorRef.detectChanges();\n    }\n  }\n\n  /**\n   * Processes a hook object and (re)subscribes the outputs of a dynamic component where required\n   *\n   * @param hook - The hook in question\n   * @param context - The current context object\n   * @param options - The current ParseOptions\n   */\n  updateComponentWithNewOutputs(hook: Hook, context: any, options: ParseOptions): void {\n    const component = hook.componentRef!.instance;\n\n    // Find out which outputs have changed\n    const changedOutputs: {[key: string]: (e: any, c: any) => any} = this.getChangedBindings(hook, 'outputs', options);\n\n    // Check if outputs exist on component\n    const existingOutputs: {\n      propName: string,\n      templateName: string|null,\n      value: (e: any, c: any) => any\n    }[] = [];\n\n    const compMeta = reflectComponentType(hook.componentRef!.componentType)!;\n\n    for (const [outputName, outputCallback] of Object.entries(changedOutputs)) {\n      const metaKey = options.ignoreOutputAliases ? 'propName' : 'templateName';\n      const outputEntry = \n        compMeta.outputs.find(outputObject => outputName === outputObject[metaKey]) ||\n        compMeta.outputs.find(outputObject => outputName.toLowerCase() === outputObject[metaKey].toLowerCase()) ||\n        compMeta.outputs.find(outputObject => outputName.replace(/-/g, '') === outputObject[metaKey]) ||\n        compMeta.outputs.find(outputObject => outputName.replace(/-/g, '').toLowerCase() === outputObject[metaKey].toLowerCase())\n\n      if (outputEntry) {\n        existingOutputs.push({\n          propName: outputEntry.propName,\n          templateName: outputEntry.templateName,\n          value: outputCallback\n        });\n      \n      } else if (options.acceptOutputsForAnyObservable) {\n        // If observable exists (in a case-agnostic way), use it\n        let foundOutputProp = \n          Object.getOwnPropertyNames(component).find(propName => component[propName] instanceof Observable && outputName === propName) ||\n          Object.getOwnPropertyNames(component).find(propName => component[propName] instanceof Observable && outputName.toLowerCase() === propName.toLowerCase());\n      \n        if (foundOutputProp) {\n          existingOutputs.push({\n            propName: foundOutputProp,\n            templateName: null,\n            value: outputCallback\n          });\n        }\n      }\n    }  \n\n    // (Re)subscribe to outputs, store subscription in Hook\n    for (const {propName, templateName, value} of existingOutputs) {\n      if (hook.outputSubscriptions[propName]) { hook.outputSubscriptions[propName].unsubscribe(); }\n      hook.outputSubscriptions[propName] = hook.componentRef!.instance[propName].subscribe((event: any) => {\n        value(event, context);\n      });\n    }\n  }\n\n  /**\n   * Compares the current with the previous bindings and returns those that have changed\n   *\n   * @param hook - The hook in question\n   * @param type - What kind of binding to check\n   * @param options - The current ParseOptions\n   */\n  getChangedBindings(hook: Hook, type: 'inputs'|'outputs', options: ParseOptions): {[key: string]: any} {\n    const changedBindings: {[key: string]: any} = {};\n    if (hook.bindings!.hasOwnProperty(type)) {\n      for (const [key, binding] of Object.entries(hook.bindings![type] as any)) {\n\n        // If binding did not exist in previous hook data, binding is considered changed\n        if (!hook.previousBindings || !hook.previousBindings[type].hasOwnProperty(key)) {\n          changedBindings[key] = binding;\n          continue;\n        }\n\n        // Compare old with new\n        // a) By reference\n        if (type === 'inputs' ? !options.compareInputsByValue : !options.compareOutputsByValue) {\n          if (binding !== hook.previousBindings[type][key].reference) {\n            changedBindings[key] = binding;\n          }\n        // b) By value\n        } else {\n          const stringifiedBinding = this.deepComparer.detailedStringify(binding, options.compareByValueDepth);\n          const canBeComparedByValue = this.checkDetailedStringifyResultPair(key, hook.componentRef!.componentType.name, options, hook.previousBindings[type][key].stringified!, stringifiedBinding);\n\n          if (canBeComparedByValue) {\n            if (stringifiedBinding.result !== hook.previousBindings[type][key].stringified!.result) {\n              changedBindings[key] = binding;\n            }\n          } else {\n            if (binding !== hook.previousBindings[type][key].reference) {\n              changedBindings[key] = binding;\n            }\n          }\n        }\n      }\n    }\n\n    return changedBindings;\n  }\n\n  /**\n   * Checks whether two detailedStringifiedResults can be compared and throws lots of errors and warnings if not\n   *\n   * @param bindingName - The binding in question\n   * @param componentName - The component in question\n   * @param options - The current ParseOptions\n   * @param oldResult - The detailedStringifiedResult for the old value\n   * @param newResult - The detailedStringifiedResult for the new value\n   */\n  checkDetailedStringifyResultPair(bindingName: string, componentName: string, options: ParseOptions, oldResult: DetailedStringifyResult, newResult: DetailedStringifyResult): boolean {\n    // Stringify successful?\n    if (oldResult.result === null && newResult.result === null) {\n      this.logger.warn(['Could stringify neither new nor old value for hook binding \"' + bindingName + '\" for component \"' + componentName + '\" to compare by value. Defaulting to comparison by reference instead.'], options);\n      return false;\n    }\n    if (oldResult.result === null) {\n      this.logger.warn(['Could not stringify old value for hook binding \"' + bindingName + '\" for component \"' + componentName + '\" to compare by value. Defaulting to comparison by reference instead.'], options);\n      return false;\n    }\n    if (newResult.result === null) {\n      this.logger.warn(['Could not stringify new value for hook binding \"' + bindingName + '\" for component \"' + componentName + '\" to compare by value. Defaulting to comparison by reference instead.'], options);\n      return false;\n    }\n\n    // Max depth reached?\n    if (oldResult.depthReachedCount > 0 && newResult.depthReachedCount > 0) {\n      this.logger.warn([\n        'Maximum compareByValueDepth of ' + options.compareByValueDepth + ' reached ' + newResult.depthReachedCount + ' time(s) for new value and ' + oldResult.depthReachedCount + ' time(s) for old value while comparing binding \"' + bindingName + '\" for component \"' + componentName + '.\\n',\n        'If this impacts performance, consider simplifying this binding, reducing comparison depth or setting compareInputsByValue/compareOutputsByValue to false.'\n      ], options);\n    } else if (oldResult.depthReachedCount > 0) {\n      this.logger.warn([\n        'Maximum compareByValueDepth of ' + options.compareByValueDepth + ' reached ' + oldResult.depthReachedCount + ' time(s) for old value while comparing binding \"' + bindingName + '\" for component \"' + componentName + '.\\n',\n        'If this impacts performance, consider simplifying this binding, reducing comparison depth or setting compareInputsByValue/compareOutputsByValue to false.',\n      ], options);\n    } else if (newResult.depthReachedCount > 0) {\n      this.logger.warn([\n        'Maximum compareByValueDepth of ' + options.compareByValueDepth + ' reached ' + newResult.depthReachedCount + ' time(s) for new value while comparing binding \"' + bindingName + '\" for component \"' + componentName + '.\\n',\n        'If this impacts performance, consider simplifying this binding, reducing comparison depth or setting compareInputsByValue/compareOutputsByValue to false.',\n      ], options);\n    }\n\n    return true;\n  }\n}\n","import { Inject, Injector, PLATFORM_ID, ApplicationRef, Injectable, createComponent, EnvironmentInjector, reflectComponentType } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { combineLatest, ReplaySubject, of } from 'rxjs';\nimport { first, mergeMap, tap, catchError } from 'rxjs/operators';\n\nimport { Hook, HookIndex } from '../../interfacesPublic';\nimport { DynamicContentChild, ComponentConfig, LazyLoadComponentConfig } from '../../interfacesPublic';\nimport { ComponentUpdater } from './componentUpdater';\nimport { AutoPlatformService } from '../platform/autoPlatformService';\nimport { anchorAttrHookId, anchorAttrParseToken, anchorElementTag, voidElementTags } from '../../constants/core';\nimport { ParseOptions } from '../settings/options';\nimport { Logger } from '../utils/logger';\n\n/**\n * The service responsible for dynamically creating components for all found Hooks\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class ComponentCreator {\n\n  constructor(\n    @Inject(PLATFORM_ID) private platformId: string,\n    private appRef: ApplicationRef,\n    private componentUpdater: ComponentUpdater, \n    private platformService: AutoPlatformService,\n    private logger: Logger\n  ) {\n  }\n\n  /**\n   * The main entry function to start the dynamic component initialization process\n   *\n   * @param contentElement - The main content element\n   * @param hookIndex - The current hookIndex\n   * @param token - The current parse token\n   * @param context - The current context object\n   * @param options - The current ParseOptions\n   * @param environmentInjector - The environment injector to use for the dynamically-created components\n   * @param injector - The injector to use for the dynamically-created components\n   */\n  init(contentElement: any, hookIndex: HookIndex, token: string, context: any, options: ParseOptions, environmentInjector: EnvironmentInjector, injector: Injector): ReplaySubject<boolean> {\n    const allComponentsLoaded: ReplaySubject<boolean> = new ReplaySubject(1);\n    const componentLoadSubjects = [];\n    const anchorElements: {[key: string]: any} = {};\n\n    // If no hooks found, no need to progress further\n    if (Object.keys(hookIndex).length === 0) {\n      allComponentsLoaded.next(true);\n      return allComponentsLoaded;\n    }\n\n    // Check anchor elements prepare loading components\n    // Note: Loop queried anchor elements instead of hookIndex entries as it will be in order of appearance, allowing for subsequent ones \n    // to potentially be skipped when overwritten by custom ng-content\n    for (let anchorElement of this.platformService.querySelectorAll(contentElement, `[${anchorAttrHookId}][${anchorAttrParseToken}]`)) {\n      const hookId = parseInt(this.platformService.getAttribute(anchorElement, anchorAttrHookId)!);\n      \n      // Discard hook if anchor element was removed by previous hook in loop via ng-content replacement\n      if (this.platformService.querySelectorAll(contentElement, `[${anchorAttrHookId}=\"${hookId}\"][${anchorAttrParseToken}=\"${token}\"]`).length === 0) {\n        delete hookIndex[hookId];\n        continue;\n      }\n\n      const hook = hookIndex[hookId];\n      hook.data = hook.parser.loadComponent(hook.id, hook.value, context, this.platformService.getChildNodes(anchorElement), options);\n      hook.isLazy = hook.data.component.hasOwnProperty('importPromise') && hook.data.component.hasOwnProperty('importName');\n\n      // Skip loading lazy components during SSR\n      if (!isPlatformBrowser(this.platformId) && hook.isLazy) {\n        delete hookIndex[hookId];\n        continue;\n      }\n\n      // If anchor element is a void element and no custom host element specified, fallback to default anchor element\n      if (!hook.data.hostElementTag && voidElementTags.includes(this.platformService.getTagName(anchorElement).toLowerCase())) {\n        hook.data.hostElementTag = anchorElementTag;\n      }\n\n      /*\n      * Replace anchor element with custom one, if desired. Do this before loading any components.\n      * \n      * Explanation: \n      * When a component is created, one of its projectableNodes happens to be another components anchor element, but the parent component doesn't render the anchor right away\n      * (due to *ngIf, for example), you can't replace that anchor anymore as it is now tracked in Angular's memory as a reference. And that exact reference will \n      * be rendered when the component's *ngIf eventually resolved to true. So need to process all custom host element requests before loading components.\n      */\n      if (hook.data.hostElementTag) {\n        anchorElement = this.useCustomHostElement(anchorElement, hook.data.hostElementTag);\n        hook.value.element = anchorElement;\n      }\n\n      // Insert child content according to hook.data immediately\n      // This has the benefit that if the child content is custom, the next iterations of this loop will throw out all hooks whose placeholder elements \n      // can no longer be found (b/c they were in the discarded child content) so their component won't be unnecessarily loaded.\n      this.createContentSlotElements(anchorElement, hook, token);\n\n      anchorElements[hookId] = anchorElement;\n    }\n\n    // For safety: Remove hooks from index whose anchor element for whatever reason could no longer be found\n    const foundHookIds = Object.keys(anchorElements).map(hookId => parseInt(hookId));\n    for (const [hookId, hook] of Object.entries(hookIndex)) {\n      if (!foundHookIds.includes(parseInt(hookId))) {\n        this.logger.warn(['Error when trying to load components - The anchor element for the following hook was found initially, but could not be found again for loading the component. Ignoring.', hook], options);\n        delete hookIndex[hookId];\n      }\n    }\n\n    // Load components\n    for (const [hookId, anchorElement] of Object.entries(anchorElements)) {\n      const hook = hookIndex[hookId];\n\n      // Start with of(true) to catch errors from loadComponentClass in the observable stream as well\n      componentLoadSubjects.push(of(true)\n        // Load component class first (might be lazy-loaded)\n        .pipe(mergeMap(() => this.loadComponentClass(hook.data!.component)))\n        .pipe(tap((compClass) => {\n          // Get projectableNodes from the content slots\n          const projectableNodes = this.extractContentSlotElements(anchorElement, token);\n          // Instantiate component\n          this.createComponent(hook, context, anchorElement, projectableNodes, options, compClass, environmentInjector, injector);\n        }))\n        // If could not be created, remove from hookIndex\n        .pipe(catchError((e) => {\n          this.logger.error([e.stack], options);\n          delete hookIndex[hook.id];\n          return of(null);\n        })));\n    }\n\n    // If no components in text, no need to progress further\n    if (componentLoadSubjects.length === 0) {\n      allComponentsLoaded.next(true);\n      return allComponentsLoaded;\n    }\n\n    // Once all normal and lazy components have loaded\n    combineLatest([...componentLoadSubjects]).pipe(first()).subscribe(() => {\n\n      // Call dynamic lifecycle methods for all created components\n      for (const hook of Object.values(hookIndex)) {\n        // Find all content children components\n        const contentChildren: DynamicContentChild[] = [];\n        if (typeof hook.componentRef!.instance['onDynamicMount'] === 'function' || typeof hook.componentRef!.instance['onDynamicChanges'] === 'function') {\n          this.findContentChildren(hook.componentRef!.location.nativeElement, contentChildren, hookIndex, token);\n        }\n\n        // OnDynamicChanges\n        if (typeof hook.componentRef!.instance['onDynamicChanges'] === 'function') {\n          hook.componentRef!.instance['onDynamicChanges']({contentChildren});\n        }\n\n        // OnDynamicMount\n        if (typeof hook.componentRef!.instance['onDynamicMount'] === 'function') {\n          hook.componentRef!.instance['onDynamicMount']({context, contentChildren});\n        }\n      }\n\n      // Remove now redundant attributes from component elements\n      for (const anchorElement of Object.values(anchorElements)) {\n        this.platformService.removeAttribute(anchorElement, anchorAttrHookId);\n        this.platformService.removeAttribute(anchorElement, anchorAttrParseToken);\n        this.platformService.removeAttribute(anchorElement, 'ng-version');\n      }\n\n      // Done!\n      allComponentsLoaded.next(true);\n    });\n\n    return allComponentsLoaded;\n  }\n\n  // DOM manipulation\n  // ----------------------------------------------------------------------------------------------------------------\n\n  /**\n   * Replaces a default anchor element with a custom element \n   * \n   * @param anchorElement - The default component anchor element\n   * @param customTagName - The custom tag that should be used instead\n   */\n  useCustomHostElement(anchorElement: any, customTagName: string): any {\n    const customHostElement = this.platformService.createElement(customTagName);\n\n    // Move attributes to selector\n    this.platformService.setAttribute(customHostElement, anchorAttrHookId, this.platformService.getAttribute(anchorElement, anchorAttrHookId)!);\n    this.platformService.setAttribute(customHostElement, anchorAttrParseToken, this.platformService.getAttribute(anchorElement, anchorAttrParseToken)!);\n    this.platformService.removeAttribute(anchorElement, anchorAttrHookId);\n    this.platformService.removeAttribute(anchorElement, anchorAttrParseToken);\n\n    // Move child nodes to selector\n    const childNodes = this.platformService.getChildNodes(anchorElement);\n    for (const node of childNodes) {\n      this.platformService.appendChild(customHostElement, node);\n    }\n\n    // Replace anchorElement\n    this.platformService.insertBefore(this.platformService.getParentNode(anchorElement)!, customHostElement, anchorElement);\n    this.platformService.removeChild(this.platformService.getParentNode(anchorElement)!, anchorElement);\n\n    return customHostElement;\n  }\n\n  /**\n   * Creates a content slot dom element for each ng-content tag of the dynamically loaded component.\n   *\n   * This is to create a direct dom-representation of each entry in the projectableNodes array returned\n   * by parser.loadComponent, so it can be cleanly resolved back into projectableNodes later on. Without these\n   * content slots for separation, you wouldn't know which child nodes go into which ng-content slot.\n   *\n   * @param hostElement - The dom element to create the content slots in\n   * @param hook - The hook of the component\n   * @param token - The current parse token\n   */\n  createContentSlotElements(hostElement: any, hook: Hook, token: string): void {\n    let content;\n\n    // If content property is defined, use the submitted content slots\n    if (hook.data!.hasOwnProperty('content') && Array.isArray(hook.data!.content)) {\n      content = hook.data!.content;\n    // Otherwise just wrap existing content into single content slot\n    } else {\n      content = [this.platformService.getChildNodes(hostElement)];\n    }\n\n    // Empty child nodes\n    this.platformService.clearChildNodes(hostElement);\n\n    // Insert new ones\n    for (const [index, contentSlot] of content.entries()) {\n      if (contentSlot !== undefined && contentSlot !== null) {\n        const contentSlotElement = this.platformService.createElement('dynamic-component-contentslot');\n        this.platformService.setAttribute(contentSlotElement, 'slotIndex', index.toString());\n        this.platformService.setAttribute(contentSlotElement, 'parsetoken', token);\n        for (const node of contentSlot) {\n          this.platformService.appendChild(contentSlotElement, node);\n        }\n        this.platformService.appendChild(hostElement, contentSlotElement);\n      }\n    }\n  }\n\n  /**\n   * Returns all previously created content slots for a component element as a projectableNodes[][] array\n   *\n   * @param componentHostElement - The dom element with the content slots\n   * @param token - The current parse token\n   */\n  extractContentSlotElements(componentHostElement: any, token: string): any[][] {\n    // Resolve ng-content from content slots\n    const projectableNodes: any[][] = [];\n    const contentSlotElements = this.platformService.getChildNodes(componentHostElement)\n      .filter(entry => this.platformService.getTagName(entry) === 'DYNAMIC-COMPONENT-CONTENTSLOT' && this.platformService.getAttribute(entry, 'parsetoken') === token);\n\n    for (const contentSlotElement of contentSlotElements) {\n      const slotIndex = this.platformService.getAttribute(contentSlotElement, 'slotIndex')!;\n      projectableNodes[parseInt(slotIndex)] = this.platformService.getChildNodes(contentSlotElement);\n    }\n\n    // Bugfix: Make sure to manually remove the content slots and not just rely on createComponent() to do so. \n    // Otherwise they will persist with SSR due to hydration bug.\n    this.platformService.clearChildNodes(componentHostElement);\n\n    return projectableNodes;\n  }\n\n\n  // Component creation\n  // ----------------------------------------------------------------------------------------------------------------\n\n  /**\n   * Loads the component class from a ComponentConfig. Returns a subject the emits the class when ready.\n   *\n   * @param componentConfig - The componentConfig from HookData\n   */\n  loadComponentClass(componentConfig: ComponentConfig): ReplaySubject<new(...args: any[]) => any> {\n    const componentClassLoaded: ReplaySubject<new(...args: any[]) => any> = new ReplaySubject(1);\n\n    // a) If is component class\n    if (componentConfig.hasOwnProperty('prototype')) {\n      componentClassLoaded.next(componentConfig as (new(...args: any[]) => any));\n\n    // c) If is function that returns promise with component class\n    } else if (typeof componentConfig === 'function') {\n      (componentConfig as (() => Promise<(new(...args: any[]) => any)>))().then(compClass => {\n        componentClassLoaded.next(compClass);\n      })\n\n    // c) If is LazyLoadComponentConfig\n    } else if (componentConfig.hasOwnProperty('importPromise') && componentConfig.hasOwnProperty('importName')) {\n      // Catch typical importPromise error\n      if ((componentConfig as LazyLoadComponentConfig).importPromise instanceof Promise) {\n        throw Error(`When lazy-loading a component, the \"importPromise\"-field must contain a function returning the import-promise, but it contained the promise itself.`);\n      }\n\n      (componentConfig as LazyLoadComponentConfig).importPromise().then((m) => {\n        const importName = (componentConfig as LazyLoadComponentConfig).importName;\n        const compClass = Object.prototype.hasOwnProperty.call(m, importName) ? m[importName] : m['default'];\n        componentClassLoaded.next(compClass);\n      });\n\n    } else {\n      throw Error('The \"component\" property of a returned HookData object must either contain the component class, a function that returns a promise with the component class or an explicit LazyLoadComponentConfig');\n    }\n\n    return componentClassLoaded;\n  }\n\n  /**\n   * Dynamically creates the component with Angular methods\n   *\n   * @param hook - The hook for this component\n   * @param context - The current context\n   * @param componentHostElement - The hostElement for the component\n   * @param projectableNodes - The nodes to inject as ng-content\n   * @param options - The current ParseOptions\n   * @param compClass - The component class\n   * @param environmentInjector - The default environmentInjector\n   * @param injector - The default injector\n   */\n  createComponent(hook: Hook, context: any, componentHostElement: any, projectableNodes: any[][], options: ParseOptions, compClass: new(...args: any[]) => any, environmentInjector: EnvironmentInjector, injector: Injector): void {\n    \n    // Dynamically create component\n    // Note: Transcluded content (including components) for ng-content can simply be added here in the form of the projectableNodes-argument.\n    // The order of component creation or injection via projectableNodes does not seem to matter.\n    const dynamicComponentRef = createComponent(compClass, {\n      hostElement: componentHostElement,\n      environmentInjector: hook.data!.environmentInjector || environmentInjector,\n      elementInjector: hook.data!.injector || injector, \n      projectableNodes: projectableNodes\n    });\n    \n    // Track component\n    hook.componentRef = dynamicComponentRef;\n\n    // Optionally trigger HTML events when outputs emit\n    this.mapOutputsToHTMLEvents(hook, options);\n\n    // Pass in initial bindings\n    this.componentUpdater.updateBindings(hook, context, options);\n\n    // Call initial OnDynamicChanges with context (if not undefined)\n    if (typeof hook.componentRef.instance['onDynamicChanges'] === 'function' && context !== undefined) {\n      hook.componentRef.instance['onDynamicChanges']({context});\n    }\n\n    // Activate change detection\n    this.appRef.attachView(dynamicComponentRef.hostView);\n\n    // Trigger an Initial cd call to:\n    // - have Angular automatically invoke ngOnInit(), which happens the first time the change detector runs for a component\n    // - prevent ExpressionHasChangedErrors in Angular<8\n    dynamicComponentRef.changeDetectorRef.detectChanges();\n  }\n\n  // Other\n  // ----------------------------------------------------------------------------------------------------------------\n\n  /**\n   * Register DOM events to trigger when component outputs emit\n   * \n   * @param hook - The component hook\n   * @param options - The current ParseOptions\n   */\n  mapOutputsToHTMLEvents(hook: Hook, options: ParseOptions) {\n    const compMeta = reflectComponentType(hook.componentRef!.componentType)!;\n\n    for (const outputObject of compMeta.outputs) {\n      const outputName = options.ignoreOutputAliases ? outputObject.propName : outputObject.templateName;\n      \n      // Trigger events, if requested\n      hook.htmlEventSubscriptions[outputName] = hook.componentRef!.instance[outputObject.propName].subscribe((event: any) => {\n        if (options.triggerDOMEvents) {\n          this.platformService.dispatchEvent(hook.componentRef?.location.nativeElement, outputName, event);\n        }\n      });\n    }\n  }\n\n  /**\n   * Find all components that would be the ContentChildren of a dynamic component and returns them in a hierarchical tree object\n   * Important: This function depends on the anchor attributes not being removed yet\n   *\n   * @param node - The HTML node to parse\n   * @param treeLevel - The current tree level of DynamicContentChildren (for recursiveness)\n   * @param hookIndex - The current hookIndex\n   * @param token - The current parseToken\n   */\n  findContentChildren(node: any, treeLevel: DynamicContentChild[] = [], hookIndex: HookIndex, token: string): void {\n    const childNodes = this.platformService.getChildNodes(node);\n    if (childNodes != undefined && childNodes.length > 0) {\n      childNodes.forEach((childNode, key) => {\n        let componentFound = false;\n        // If element has a parsetoken and hookid, it is a dynamic component\n        const parseToken = this.platformService.getAttribute(childNode, anchorAttrParseToken);\n\n        if (\n          parseToken !== null &&\n          parseToken === token &&\n          this.platformService.getAttribute(childNode, anchorAttrHookId)\n        ) {\n          const hookId = parseInt(this.platformService.getAttribute(childNode, anchorAttrHookId)!, 10);\n          if (hookIndex.hasOwnProperty(hookId)) {\n            treeLevel.push({\n              componentRef: hookIndex[hookId].componentRef!,\n              contentChildren: [],\n              hookValue: hookIndex[hookId].value\n            });\n            componentFound = true;\n          }\n        }\n\n        // The hierarchical structure of the result is solely built on found components. It DOES NOT reflect the actual HTML structure.\n        // E.g. two components returned on the same array level in the result may be on completely different nesting levels in the HTML,\n        // as the only reason to 'go a level deeper' in the result is when a component was found.\n        const treeLevelForNested = componentFound ? treeLevel[treeLevel.length - 1].contentChildren : treeLevel;\n        this.findContentChildren(childNode, treeLevelForNested, hookIndex, token);\n      });\n    }\n  }\n}\n","import { Injectable, Optional, Inject, Injector, EnvironmentInjector } from '@angular/core';\nimport { of, Observable } from 'rxjs';\nimport { first, map } from 'rxjs/operators';\n\nimport { HookIndex, ParseResult } from '../interfacesPublic';\nimport { ParseOptions } from './settings/options';\nimport { TextHookFinder } from './core/textHookFinder';\nimport { ComponentCreator } from './core/componentCreator';\nimport { DynamicHooksSettings } from './settings/settings';\nimport { HookParserEntry } from './settings/parserEntry';\nimport { DYNAMICHOOKS_ALLSETTINGS, DYNAMICHOOKS_ANCESTORSETTINGS, DYNAMICHOOKS_MODULESETTINGS } from '../interfaces';\nimport { SettingsResolver } from './settings/settingsResolver';\nimport { ContentSanitizer } from './utils/contentSanitizer';\nimport { AutoPlatformService } from './platform/autoPlatformService';\nimport { ElementHookFinder } from './core/elementHookFinder';\nimport { contentElementAttr } from '../constants/core';\n\n/**\n * The core service for the ngx-dynamic-hooks library. Provides the main logic internally used by all components.\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class DynamicHooksService {\n\n  constructor(\n    @Optional() @Inject(DYNAMICHOOKS_ALLSETTINGS) private allSettings: DynamicHooksSettings[]|null,\n    @Optional() @Inject(DYNAMICHOOKS_ANCESTORSETTINGS) public ancestorSettings: DynamicHooksSettings[]|null,\n    @Optional() @Inject(DYNAMICHOOKS_MODULESETTINGS) private moduleSettings: DynamicHooksSettings|null,\n    private settingsResolver: SettingsResolver,\n    private textHookFinder: TextHookFinder,\n    private elementHookFinder: ElementHookFinder,\n    private contentSanitizer: ContentSanitizer,\n    private componentCreator: ComponentCreator,\n    private platformService: AutoPlatformService,\n    private environmentInjector: EnvironmentInjector,\n    private injector: Injector\n  ) {\n  }\n\n  /**\n   * Parses content and loads components for all found hooks\n   *\n   * @param content - The content to parse\n   * @param parsers - An optional list of parsers to use instead of the global ones\n   * @param context - An optional context object\n   * @param options - An optional list of options\n   * @param globalParsersBlacklist - An optional list of global parsers to blacklist\n   * @param globalParsersWhitelist - An optional list of global parsers to whitelist\n   * @param targetElement - An optional HTML element to use as the container for the loaded content.\n   * @param targetHookIndex - An optional object to fill with the programmatic hook data. If none is provided, one is created and returned for you.\n   * @param environmentInjector - An optional environmentInjector to use for the dynamically-loaded components. If none is provided, the default environmentInjector is used.\n   * @param injector - An optional injector to use for the dynamically-loaded components. If none is provided, the default injector is used.\n   */\n  parse(\n    content: any = null,\n    parsers: HookParserEntry[]|null = null,\n    context: any = null,\n    options: ParseOptions|null = null,\n    globalParsersBlacklist: string[]|null = null,\n    globalParsersWhitelist: string[]|null = null,\n    targetElement: HTMLElement|null = null,\n    targetHookIndex: HookIndex = {},\n    environmentInjector: EnvironmentInjector|null = null,\n    injector: Injector|null = null\n  ): Observable<ParseResult> {\n    const usedEnvironmentInjector = environmentInjector || this.environmentInjector;\n    const usedInjector = injector || this.injector;\n\n    // Resolve options and parsers\n    const { parsers: usedParsers, options: usedOptions } = this.settingsResolver.resolve(\n      usedInjector, // Use element injector for resolving service parsers (instead of environment injector). Will fallback to environment injector anyway if doesn't find anything.\n      content,\n      this.allSettings, \n      this.ancestorSettings, \n      this.moduleSettings, \n      parsers, \n      options, \n      globalParsersBlacklist, \n      globalParsersWhitelist\n    );\n\n    // Needs string or element as content\n    if (!content) {\n      return of({\n        element: targetElement || this.platformService.createElement('div'),\n        hookIndex: targetHookIndex,\n        context: context,\n        usedParsers,\n        usedOptions,\n        usedInjector,\n        usedEnvironmentInjector,\n        destroy: () => this.destroy(targetHookIndex)\n      });\n    }\n\n    const token = Math.random().toString(36).substring(2, 12);\n    let contentElement = typeof content === 'string' ? this.platformService.createElement('div') : content;\n    this.platformService.setAttribute(contentElement, contentElementAttr, '1');\n\n    // a) Find all text hooks in string content\n    if (typeof content === 'string') {\n      const result = this.textHookFinder.find(content, context, usedParsers, token, usedOptions, targetHookIndex);\n      this.platformService.setInnerContent(contentElement, result.content);\n      \n    // b) Find all text hooks in element content\n    } else {\n      this.textHookFinder.findInElement(contentElement, context, usedParsers, token, usedOptions, targetHookIndex);\n    }\n\n    // Find all element hooks\n    targetHookIndex = this.elementHookFinder.find(contentElement, context, usedParsers, token, usedOptions, targetHookIndex);\n\n    // Sanitize?\n    if (usedOptions?.sanitize) {\n      this.contentSanitizer.sanitize(contentElement, targetHookIndex, token);\n    }\n\n    // After sanitizing, insert into targetElement, if any\n    if (targetElement && targetElement !== contentElement) {\n      this.platformService.removeAttribute(contentElement, contentElementAttr);\n      this.platformService.setAttribute(targetElement, contentElementAttr, '1');\n      this.platformService.clearChildNodes(targetElement);\n      for (const childNode of this.platformService.getChildNodes(contentElement)) {\n        this.platformService.appendChild(targetElement, childNode);\n      }\n      contentElement = targetElement\n    }\n\n    // Dynamically create components in component selector elements\n    return this.componentCreator.init(contentElement, targetHookIndex, token, context, usedOptions, usedEnvironmentInjector, usedInjector)\n    .pipe(first())\n    .pipe(map((allComponentsLoaded: boolean) => {\n      // Everything done!\n      this.platformService.removeAttribute(contentElement, contentElementAttr);\n      return {\n        element: contentElement,\n        hookIndex: targetHookIndex,\n        context: context,\n        usedParsers,\n        usedOptions,\n        usedInjector,\n        usedEnvironmentInjector,\n        destroy: () => this.destroy(targetHookIndex)\n      };\n    }));\n  }\n\n  /**\n   * Cleanly destroys all loaded components in a given HookIndex\n   *\n   * @param hookIndex - The hookIndex to process\n   */\n  destroy(hookIndex: HookIndex): void {\n    if (hookIndex) {\n      // Destroy dynamic components\n      for (const hookIndexEntry of Object.values(hookIndex)) {\n        if (hookIndexEntry.componentRef) {\n          hookIndexEntry.componentRef.destroy();\n        }\n      }\n\n      // Unsubscribe from hook outputs\n      for (const hook of Object.values(hookIndex)) {\n        for (const parserSub of Object.values(hook.outputSubscriptions)) {\n          if (parserSub) { parserSub.unsubscribe(); }\n        }\n        for (const htmlEventSub of Object.values(hook.htmlEventSubscriptions)) {\n          if (htmlEventSub) { htmlEventSub.unsubscribe(); }\n        }\n      }\n    }\n  }\n\n}\n","import { Type, SkipSelf, Optional, Provider, APP_INITIALIZER, Injectable, OnDestroy } from '@angular/core'; // Don't remove InjectionToken here. It will compile with a dynamic import otherwise which breaks Ng<5 support\nimport { DynamicHooksSettings } from './services/settings/settings';\nimport { DynamicHooksService } from './services/dynamicHooksService';\nimport { PLATFORM_SERVICE, PlatformService } from './services/platform/platformService';\nimport { DYNAMICHOOKS_ALLSETTINGS, DYNAMICHOOKS_ANCESTORSETTINGS, DYNAMICHOOKS_MODULESETTINGS } from './interfaces';\nimport { HookParserEntry } from './services/settings/parserEntry';\n\nexport const allSettings: DynamicHooksSettings[] = [];\n\n/**\n * Sets up global parsers and options for the ngx-dynamic-hooks library\n *\n * @param settings - Parsers/options to be are shared in this injection context\n * @param platformService - (optional) If desired, you can specify a custom PlatformService to use here\n */\nexport const provideDynamicHooks: (settings?: DynamicHooksSettings|HookParserEntry[], platformService?: Type<PlatformService>) => Provider[] = (settings, platformService) => {\n  const moduleSettings: DynamicHooksSettings|undefined = Array.isArray(settings) ? {parsers: settings} : settings;\n\n  if (moduleSettings !== undefined) {\n    allSettings.push(moduleSettings);\n  }\n\n  const providers: Provider[] = [\n    {\n      provide: APP_INITIALIZER,\n      useFactory: () => () => {},\n      multi: true,\n      deps: [DynamicHooksInitService]\n    },\n\n    // Settings\n    { provide: DYNAMICHOOKS_ALLSETTINGS, useValue: allSettings },\n    // AncestorSettings is a hierarchical array of provided settings\n    // By having itself as a dependency with SkipSelf, a circular reference is avoided as Angular will look for DYNAMICHOOKS_ANCESTORSETTINGS in the parent injector.\n    // It will keep traveling injectors upwards until it finds another or just use null as the dep.\n    // Also, by returning a new array reference each time, the result will only contain the direct ancestor child settings, not all child settings from every module in the app.\n    // See: https://stackoverflow.com/questions/49406615/is-there-a-way-how-to-use-angular-multi-providers-from-all-multiple-levels\n    {\n      provide: DYNAMICHOOKS_ANCESTORSETTINGS,\n      useFactory: (ancestorSettings: DynamicHooksSettings[]) => {\n        ancestorSettings = Array.isArray(ancestorSettings) ? ancestorSettings : [];\n        ancestorSettings = moduleSettings !== undefined ? [...ancestorSettings, moduleSettings] : ancestorSettings;\n        return ancestorSettings;\n      },\n      deps: [[new SkipSelf(), new Optional(), DYNAMICHOOKS_ANCESTORSETTINGS]]\n    },\n    { provide: DYNAMICHOOKS_MODULESETTINGS, useValue: moduleSettings },\n\n    // Must provide a separate instance of DynamicHooksService each time you call provideDynamicHooks, \n    // so it can see passed settings of this level\n    DynamicHooksService\n  ]\n\n  if (platformService) {\n    providers.push({ provide: PLATFORM_SERVICE, useClass: platformService });\n  }\n  \n  return providers;\n}\n\n/**\n * A service that will always be created on app init, even without using a DynamicHooksComponent\n */\n@Injectable({\n  providedIn: 'root'\n})\nclass DynamicHooksInitService implements OnDestroy {\n  ngOnDestroy(): void {\n    // Reset allSettings on app close for the benefit of vite live reloads and tests (which does not destroy allSettings reference between app reloads)\n    // Safer to do this only on app close rather than on app start as it acts like a cleanup function and the order of execution matters less\n    allSettings.length = 0;\n  }\n}\n\nexport const resetDynamicHooks: () => void = () => {\n  allSettings.length = 0;\n}","import { EnvironmentInjector, EnvironmentProviders, NgZone, Provider, createEnvironmentInjector } from '@angular/core';\nimport { createApplication } from '@angular/platform-browser';\nimport { firstValueFrom } from 'rxjs';\n\nimport { HookParserEntry } from './services/settings/parserEntry';\nimport { ParseOptions } from './services/settings/options';\nimport { HookIndex, ParseResult } from './interfacesPublic';\nimport { DynamicHooksService } from './services/dynamicHooksService';\n\n// Global state\n// ----------\n\nlet sharedInjector: EnvironmentInjector|null = null;\nlet scopes: ProvidersScope[] = [];\nlet allParseResults: ParseResult[] = [];\n\nconst createInjector = async (providers: (Provider | EnvironmentProviders)[] = [], parent?: EnvironmentInjector) => {\n  // If no parent, create new root injector, so passed providers will also be actual root providers\n  return parent ? createEnvironmentInjector(providers, parent) : (await createApplication({providers})).injector;\n}\n\n/**\n * Destroys all scopes and components created by standalone mode\n */\nexport const destroyAll = () => {\n  // Destroy all scopes\n  for (const scope of scopes) {\n    scope.destroy();\n  }\n\n  // Then all remaining independent parseResults\n  for (const parseResult of allParseResults) {\n    parseResult.destroy();\n  }\n\n  sharedInjector = null;\n  scopes = [];\n  allParseResults = [];\n}\n\n// Providers scope\n// ----------\n\n/**\n * Creates an isolated scope with its own providers that the dynamically-created components will then have access to.\n * \n * @param providers - A list of providers\n * @param parentScope - An optional parent scope created previously. Makes the parent providers also accessible to this scope.\n */\nexport const createProviders = (providers: (Provider | EnvironmentProviders)[] = [], parentScope?: ProvidersScope): ProvidersScope => {\n  return new ProvidersScope(providers, parentScope);\n}\n\n/**\n * A scope with an internal list of providers. All dynamic components created by its `parse` method will have access to them.\n */\nexport class ProvidersScope {\n  private _injector: EnvironmentInjector|null = null;\n  public get injector(): EnvironmentInjector|null { \n    return this._injector;\n  };\n  private _parseResults: ParseResult[] = [];\n  public get parseResults(): ParseResult[] { \n    return this._parseResults;\n  };\n  private _isDestroyed: boolean = false;\n  get isDestroyed(): boolean {\n    return this._isDestroyed;\n  };\n\n  constructor(private providers: (Provider | EnvironmentProviders)[] = [], private parentScope?: ProvidersScope) {\n    scopes.push(this);\n  }\n\n  /**\n  * Parses content and loads components for all found hooks in standalone mode\n  * \n  * @param content - The content to parse\n  * @param parsers - The parsers to use\n  * @param context - An optional context object\n  * @param options - An optional list of options\n  * @param targetElement - An optional HTML element to use as the container for the loaded content.\n  * @param targetHookIndex - An optional object to fill with the programmatic hook data. If none is provided, one is created and returned for you.\n  * @param environmentInjector - An optional environmentInjector to use for the dynamically-loaded components. If none is provided, the default environmentInjector is used.\n  */\n  public async parse(\n    content: any,\n    parsers: HookParserEntry[],\n    context: any = null,  \n    options: ParseOptions|null = null,\n    targetElement: HTMLElement|null = null,\n    targetHookIndex: HookIndex = {},\n    environmentInjector: EnvironmentInjector|null = null\n  ): Promise<ParseResult> {\n    this.checkIfDestroyed();\n\n    return parse(content, parsers, context, options,  targetElement, targetHookIndex, environmentInjector || await this.resolveInjector())\n    .then(parseResult => {\n      this.parseResults.push(parseResult);\n      return parseResult;\n    });\n  }\n\n  /**\n   * Returns the injector for this scope\n   */\n  public async resolveInjector() {\n    this.checkIfDestroyed();\n\n    if (!this.injector) {\n      const parentInjector = this.parentScope ? await this.parentScope.resolveInjector() : undefined;\n      this._injector = await createInjector(this.providers, parentInjector);\n    }\n  \n    return this.injector!;\n  }\n\n  /**\n   * Destroys this scope and all of its created components\n   */\n  public destroy(): void {\n    this.checkIfDestroyed();\n\n    for (const parseResult of this.parseResults) {\n      parseResult.destroy();\n      allParseResults = allParseResults.filter(entry => entry !== parseResult);\n    }\n\n    if (this.injector) {\n      this.injector.destroy();\n    }\n\n    scopes = scopes.filter(scope => scope !== this);\n    this._isDestroyed = true;\n  }\n\n  private checkIfDestroyed() {\n    if (this.isDestroyed) {\n      throw new Error('This scope has already been destroyed. It or its methods cannot be used any longer.');\n    }\n  }\n}\n\n// parse\n// ----------\n\n/**\n * Parses content and loads components for all found hooks in standalone mode\n * \n * @param content - The content to parse\n * @param parsers - The parsers to use\n * @param context - An optional context object\n * @param options - An optional list of options\n * @param targetElement - An optional HTML element to use as the container for the loaded content.\n * @param targetHookIndex - An optional object to fill with the programmatic hook data. If none is provided, one is created and returned for you.\n * @param environmentInjector - An optional environmentInjector to use for the dynamically-loaded components. If none is provided, the default environmentInjector is used.\n */\nexport const parse = async (\n  content: any,\n  parsers: HookParserEntry[],\n  context: any = null,  \n  options: ParseOptions|null = null,\n  targetElement: HTMLElement|null = null,\n  targetHookIndex: HookIndex = {},\n  environmentInjector: EnvironmentInjector|null = null,\n): Promise<ParseResult> => {\n\n  // Reuse the same global injector for all independent parse calls\n  if (!environmentInjector) {\n    if (!sharedInjector) {\n      sharedInjector = await createInjector();\n    }\n    environmentInjector = sharedInjector;\n  }\n\n  // In standalone mode, emit HTML events from outputs by default\n  if (!options) {\n    options = {}\n  }\n  if (!options.hasOwnProperty('triggerDOMEvents')) {\n    options.triggerDOMEvents = true;\n  }\n\n  const dynHooksService = environmentInjector.get(DynamicHooksService);\n\n  // Needs to be run inside NgZone manually\n  return environmentInjector.get(NgZone).run(() => {\n    return firstValueFrom(dynHooksService\n      .parse(\n        content, \n        parsers,\n        context, \n        options, \n        null, \n        null,\n        targetElement, \n        targetHookIndex, \n        environmentInjector,\n        null\n      )\n    ).then(parseResult => {\n      allParseResults.push(parseResult);\n      return parseResult;\n    });\n  });\n}","import { isAngularManagedElement } from './services/utils/utils';\nimport { contentElementAttr } from './constants/core';\n\n/**\n * A function that observes an HTMLElement and triggers a callback when new elements are added to it.\n * Does NOT trigger for Angular components or logic, only for neutral HTML elements.\n * \n * @param content - The HTMLElement to watch for element additions\n * @param callbackFn - The callback function to call when a change occurs. Will be called with the closest parent element of all added elements.\n */\nexport const observeElement = (content: HTMLElement, callbackFn: (parentElement: HTMLElement) => void): MutationObserver => {\n  const observer = new MutationObserver((mutationsList, observer) => {\n\n    // Collect only addded nodes\n    let newNodes: Node[] = [];\n    for (const mutation of mutationsList) {\n      mutation.addedNodes.forEach(addedNode => newNodes.push(addedNode));\n      mutation.removedNodes.forEach(removedNode => newNodes = newNodes.filter(newNode => newNode !== removedNode));\n    }\n\n    // Ignore new nodes created as part of Angular component views\n    newNodes = newNodes.filter(newNode => \n      newNode.nodeType === 1 && !isAngularManagedElement(newNode) ||            // Check HTMLElements\n      newNode.nodeType === 3 && !isAngularManagedElement(newNode.parentNode!)   // Check text node parents\n    );\n\n    // Ignore new nodes that are children of a content element that is currently being parsed (lots of elements get created/removed during that time)\n    newNodes = newNodes.filter(newNode => {\n      const element: HTMLElement = newNode.nodeType === 1 ? newNode as HTMLElement : newNode.parentElement!;\n      return element.closest(`[${contentElementAttr}]`) === null;\n    });\n\n    if (newNodes.length) {\n      // Find closest common parent\n      const commonParent = findClosestCommonParent(newNodes)!;\n\n      // Run callback\n      callbackFn(commonParent);\n    }\n  });\n\n  observer.observe(content, { childList: true, subtree: true });\n\n  return observer;\n}\n\n/**\n * Finds the closest common parent element for multiple elements\n * \n * @param elements - The elements in question\n */\nconst findClosestCommonParent = (elements: Node[]): HTMLElement|null => {\n  if (elements.length === 0) return null;\n  let parent = elements[0];\n\n  for (const element of elements) {\n    while (parent === element || !parent.contains(element)) {\n      parent = parent.parentElement!;\n    }\n  }\n\n  return parent as HTMLElement;\n}","import { Component, OnInit, AfterViewInit, OnDestroy, Input, OnChanges, ElementRef, DoCheck, AfterViewChecked, Output, EventEmitter, Injector, Optional, Inject, SimpleChanges, EnvironmentInjector } from '@angular/core';\nimport { HookIndex, Hook, ParseResult } from '../interfacesPublic';\nimport { HookParser, LoadedComponent } from '../interfacesPublic';\nimport { DynamicHooksService } from '../services/dynamicHooksService';\nimport { HookParserEntry } from '../services/settings/parserEntry';\nimport { ComponentUpdater } from '../services/core/componentUpdater';\nimport { AutoPlatformService } from '../services/platform/autoPlatformService';\nimport { ParseOptions, getParseOptionDefaults } from '../../public-api';\n\n/**\n * The main component of the ngx-dynamic-hooks library to dynamically load components into content\n */\n@Component({\n  selector: 'ngx-dynamic-hooks',\n  template: '',\n  standalone: true,\n  styles: []\n})\nexport class DynamicHooksComponent implements DoCheck, OnChanges, AfterViewInit, AfterViewChecked, OnDestroy {\n  @Input() content: any = null;\n  @Input() context: any = null;\n  @Input() globalParsersBlacklist: string[]|null = null;\n  @Input() globalParsersWhitelist: string[]|null = null;\n  @Input() parsers: HookParserEntry[]|null = null;\n  @Input() options: ParseOptions|null = null;\n  @Output() componentsLoaded: EventEmitter<LoadedComponent[]> = new EventEmitter();\n  hookIndex: HookIndex = {};\n  activeOptions: ParseOptions = getParseOptionDefaults();\n  activeParsers: HookParser[] = [];\n  token = Math.random().toString(36).substring(2, 12);\n  initialized: boolean = false;\n\n  constructor(\n    private hostElement: ElementRef,\n    private dynamicHooksService: DynamicHooksService,\n    private componentUpdater: ComponentUpdater,\n    private platformService: AutoPlatformService,\n    private environmentInjector: EnvironmentInjector,\n    private injector: Injector\n  ) {\n  }\n\n  ngDoCheck(): void {\n    // Update bindings on every change detection run?\n    if (!this.activeOptions.updateOnPushOnly) {\n      this.refresh(false);\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    // If text or options change, reset and parse from scratch\n    if (\n      changes.hasOwnProperty('content') ||\n      changes.hasOwnProperty('globalParsersBlacklist') ||\n      changes.hasOwnProperty('globalParsersWhitelist') ||\n      changes.hasOwnProperty('parsers') ||\n      changes.hasOwnProperty('options')\n    ) {\n      this.reset();\n      this.parse(this.content);\n\n    // If only context changed, just refresh hook inputs/outputs\n    } else if (changes.hasOwnProperty('context')) {\n      this.refresh(true);\n    }\n  }\n\n  ngAfterViewInit(): void {\n  }\n\n  ngAfterViewChecked(): void {\n  }\n\n  ngOnDestroy(): void {\n    this.reset();\n  }\n\n  // ----------------------------------------------------------------------\n\n  /**\n   * Empties the state of this component\n   */\n  reset(): void {\n    this.dynamicHooksService.destroy(this.hookIndex);\n\n    // Reset state\n    this.platformService.setInnerContent(this.hostElement.nativeElement, '');\n    this.hookIndex = {};\n    this.activeOptions = getParseOptionDefaults();\n    this.activeParsers = [];\n    this.initialized = false;\n  }\n\n  /**\n   * Parses the content and load components\n   *\n   * @param content - The content to parse\n   */\n  parse(content: any): void {\n    this.dynamicHooksService.parse(\n      content,\n      this.parsers,\n      this.context,\n      this.options,\n      this.globalParsersBlacklist,\n      this.globalParsersWhitelist,\n      this.hostElement.nativeElement,\n      this.hookIndex,\n      this.environmentInjector,\n      this.injector\n    ).subscribe((parseResult: ParseResult) => {\n      // hostElement and hookIndex are automatically filled\n      this.activeParsers = parseResult.usedParsers;\n      this.activeOptions = parseResult.usedOptions;\n      this.initialized = true;\n\n      // Return all loaded components\n      const loadedComponents: LoadedComponent[] = Object.values(this.hookIndex).map((hook: Hook) => {\n        return {\n          hookId: hook.id,\n          hookValue: hook.value,\n          hookParser: hook.parser,\n          componentRef: hook.componentRef!\n        };\n      });\n      this.componentsLoaded.emit(loadedComponents);\n    });\n  }\n\n  /**\n   * Updates the bindings for all existing components\n   *\n   * @param triggerOnDynamicChanges - Whether to trigger the OnDynamicChanges method of dynamically loaded components\n   */\n  refresh(triggerOnDynamicChanges: boolean): void {\n    if (this.initialized) {\n      this.componentUpdater.refresh(this.hookIndex, this.context, this.activeOptions, triggerOnDynamicChanges);\n    }\n  }\n}\n","import { Component, OnInit, AfterViewInit, OnDestroy, Input, OnChanges, ElementRef, DoCheck, AfterViewChecked, Output, EventEmitter, Injector, Optional, Inject, SimpleChanges, EnvironmentInjector, reflectComponentType, ComponentRef } from '@angular/core';\nimport { HookIndex, Hook, ParseResult, HookComponentData, HookValue, HookBindings } from '../interfacesPublic';\nimport { HookParser } from '../interfacesPublic';\nimport { DynamicHooksService } from '../services/dynamicHooksService';\nimport { ComponentUpdater } from '../services/core/componentUpdater';\nimport { AutoPlatformService } from '../services/platform/autoPlatformService';\nimport { ParseOptions, getParseOptionDefaults } from '../../public-api';\nimport { anchorElementTag } from '../constants/core';\n\nexport interface DynamicHooksSingleOptions {\n  updateOnPushOnly?: boolean;\n  compareInputsByValue?: boolean;\n  compareOutputsByValue?: boolean;\n  compareByValueDepth?: number;\n  ignoreInputAliases?: boolean;\n  ignoreOutputAliases?: boolean;\n  acceptInputsForAnyProperty?: boolean;\n  acceptOutputsForAnyObservable?: boolean;\n}\n\n\n/**\n * A component that can be used to dynamically load a single component and pass bindings to it\n */\n@Component({\n  selector: 'ngx-dynamic-single',\n  template: '',\n  standalone: true,\n  styles: []\n})\nexport class DynamicSingleComponent implements DoCheck, OnChanges, AfterViewInit, AfterViewChecked, OnDestroy {\n  @Input() component: (new(...args: any[]) => any)|null = null;\n  @Input() inputs: {[key:string]: any} = {};\n  @Input() outputs: {[key:string]: any} = {};\n  @Input() options: DynamicHooksSingleOptions = {};\n  @Output() componentLoaded: EventEmitter<ComponentRef<any>> = new EventEmitter();\n  parseResult: ParseResult|null = null;\n  parseOptions: ParseOptions = {};\n\n  constructor(\n    private hostElement: ElementRef,\n    private platformService: AutoPlatformService,\n    private dynamicHooksService: DynamicHooksService,\n    private componentUpdater: ComponentUpdater\n  ) {\n  }\n\n  ngDoCheck(): void {\n    // Update on every change detection run?\n    if (!this.parseOptions.updateOnPushOnly) {\n      this.refresh();\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    // If component changed, reset and load from scratch\n    if (\n      changes.hasOwnProperty('component')\n    ) {\n      this.reset();\n      this.parseOptions = {...getParseOptionDefaults(), ...this.options};\n      this.loadComponent();\n\n    // If anything else changed, just refresh inputs/outputs\n    } else if (\n      changes.hasOwnProperty('inputs') ||\n      changes.hasOwnProperty('outputs') || \n      changes.hasOwnProperty('options')\n    ) {      \n      this.parseOptions = {...getParseOptionDefaults(), ...this.options};\n      this.refresh();\n    }\n  }\n\n  ngAfterViewInit(): void {\n  }\n\n  ngAfterViewChecked(): void {\n  }\n\n  ngOnDestroy(): void {\n    this.reset();\n  }\n\n  // ----------------------------------------------------------------------\n\n  /**\n   * Destroys the dynamic component and resets the state\n   */\n  reset() {\n    if (this.parseResult) {\n      this.dynamicHooksService.destroy(this.parseResult.hookIndex);\n    }\n\n    this.platformService.setInnerContent(this.hostElement.nativeElement, '');\n    this.parseResult = null;\n    this.parseOptions = {};\n  }\n\n  /**\n   * Loads the dynamic component\n   */\n  loadComponent() {\n    if (this.component) {\n      const compMeta = reflectComponentType(this.component);\n\n      if (!compMeta) {\n        throw new Error('Provided component class input is not a valid Angular component.');\n      }\n\n      // Try to use component selector as hostElement. Otherwise default to standard anchor.\n      let selector;\n      let componentHostElement;\n      try {\n        selector = compMeta.selector;\n        componentHostElement = this.platformService.createElement(selector);\n      } catch (e) {\n        selector = anchorElementTag;\n        componentHostElement = this.platformService.createElement(anchorElementTag);\n      }\n      this.platformService.clearChildNodes(this.hostElement.nativeElement);\n      this.platformService.appendChild(this.hostElement.nativeElement, componentHostElement);\n\n      // Create parser that finds created hostElement as hook and loads requested component into it\n      const parser = this.createAdHocParser(selector);\n\n      this.dynamicHooksService.parse(this.hostElement.nativeElement, [parser], {}, this.parseOptions)\n      .subscribe(parseResult => {\n        this.parseResult = parseResult;\n        this.componentLoaded.next(parseResult.hookIndex[1].componentRef!);\n      });\n    }\n  }\n\n  /**\n   * Creates a parser specifically for the dynamic component\n   * \n   * @param selector - The selector to use for the component\n   */\n  createAdHocParser(selector: string): (new(...args: any[]) => HookParser) {\n    const that = this;\n\n    class AdHocSingleComponentParser implements HookParser {\n\n      findHookElements(contentElement: any, context: any): any[] {\n        return that.platformService.querySelectorAll(contentElement, selector);\n      }\n\n      loadComponent(hookId: number, hookValue: HookValue, context: any, childNodes: any[]): HookComponentData {\n        return {\n          component: that.component!\n        }\n      }\n\n      getBindings(hookId: number, hookValue: HookValue, context: any): HookBindings {\n        return {\n          inputs: that.inputs,\n          outputs: that.outputs\n        }\n      }\n    }\n\n    return AdHocSingleComponentParser;\n  }\n\n  /**\n   * Updates the bindings for the loaded component\n   */\n  refresh() {\n    if (this.parseResult) {\n      this.componentUpdater.refresh(this.parseResult.hookIndex, {}, this.parseOptions, false);\n    }\n  }\n\n}\n","/*\n * Public API Surface of ngx-dynamic-hooks\n */\n\n// General\nexport * from './lib/dynamicHooksProviders';\nexport * from './lib/standalone';\nexport * from './lib/standaloneHelper';\nexport * from './lib/interfacesPublic';\n\n// Settings\nexport * from './lib/services/settings/options';\nexport * from './lib/services/settings/parserEntry';\n\n// Main logic\nexport * from './lib/components/dynamicHooksComponent';\nexport * from './lib/components/dynamicSingleComponent';\nexport * from './lib/services/dynamicHooksService';\nexport * from './lib/services/settings/settings';\n\n// SelectorHookParser\nexport * from './lib/parsers/selector/text/textSelectorHookParser';\nexport * from './lib/parsers/selector/element/elementSelectorHookParser';\nexport * from './lib/parsers/selector/selectorHookParserConfig';\n\n// Utils\nexport * from './lib/services/utils/dataTypeParser';\nexport * from './lib/services/utils/deepComparer';\nexport * from './lib/services/utils/hookFinder';\nexport * from './lib/constants/regexes';\n\n// Utils\nexport * from './lib/services/utils/utils';\n\n// Platform\nexport * from './lib/services/platform/platformService';\nexport * from './lib/services/platform/defaultPlatformService';\n\n// Testing\n// export * from './tests/testing-api';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DefaultPlatformService","i1.Logger","i1.HookFinder","i1.DataTypeEncoder","i2.Logger","i1.DataTypeParser","i1.SelectorHookParserConfigResolver","i2.AutoPlatformService","i3.TagHookFinder","i4.BindingsValueManager","i5.Logger","i1.ParserEntryResolver","i1.AutoPlatformService","i1.DeepComparer","i1.ComponentUpdater","i3.Logger","i1.SettingsResolver","i2.TextHookFinder","i3.ElementHookFinder","i4.ContentSanitizer","i5.ComponentCreator","i6.AutoPlatformService","i1.DynamicHooksService","i2.ComponentUpdater","i3.AutoPlatformService","i2.DynamicHooksService","i3.ComponentUpdater"],"mappings":";;;;;;;;AAGA;;AAEG;AACI,MAAM,wBAAwB,GAAG,IAAI,cAAc,CAAyB,kDAAkD,CAAC,CAAC;AAChI,MAAM,6BAA6B,GAAG,IAAI,cAAc,CAAyB,oDAAoD,CAAC,CAAC;AACvI,MAAM,2BAA2B,GAAG,IAAI,cAAc,CAAuB,+CAA+C,CAAC;;ACR7H,MAAM,kBAAkB,GAAG,6BAA6B,CAAA;AACxD,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AACpD,MAAM,gBAAgB,GAAG,+BAA+B,CAAC;AACzD,MAAM,oBAAoB,GAAG,uCAAuC,CAAC;AACrE,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC;;ICAvJ,wBAeX;AAfD,CAAA,UAAY,uBAAuB,EAAA;AAC/B;;AAEG;AACH,IAAA,uBAAA,CAAA,uBAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAG,CAAA;AAEH;;AAEG;AACH,IAAA,uBAAA,CAAA,uBAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAM,CAAA;AAEN;;AAEG;AACH,IAAA,uBAAA,CAAA,uBAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAI,CAAA;AACR,CAAC,EAfW,uBAAuB,KAAvB,uBAAuB,GAelC,EAAA,CAAA,CAAA;;ACqED;;AAEG;AACI,MAAM,sBAAsB,GAAuB,MAAK;IAC3D,OAAO;AACH,QAAA,QAAQ,EAAE,IAAI;AACd,QAAA,mBAAmB,EAAE,IAAI;AACzB,QAAA,gBAAgB,EAAE,IAAI;AACtB,QAAA,gBAAgB,EAAE,KAAK;AACvB,QAAA,oBAAoB,EAAE,KAAK;AAC3B,QAAA,qBAAqB,EAAE,KAAK;AAC5B,QAAA,mBAAmB,EAAE,CAAC;AACtB,QAAA,gBAAgB,EAAE,KAAK;AACvB,QAAA,kBAAkB,EAAE,KAAK;AACzB,QAAA,mBAAmB,EAAE,KAAK;AAC1B,QAAA,0BAA0B,EAAE,KAAK;AACjC,QAAA,6BAA6B,EAAE,KAAK;AACpC,QAAA,UAAU,EAAE;AACR,YAAA,GAAG,EAAE,IAAI;AACT,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,GAAG,EAAE,KAAK;AACb,SAAA;KACJ,CAAC;AACN;;AC/GO,MAAM,OAAO,GAAQ,GAAG;AAE/B;AACA,MAAM,YAAY,GAAG,2BAA2B,CAAC;AACjD,MAAM,aAAa,GAAG,qCAAqC,CAAC;AAE5D;AACA,OAAO,CAAC,4BAA4B,GAAG,GAAG,GAAG,aAAa,GAAG,GAAG,CAAC;AACjE,OAAO,CAAC,0BAA0B,GAAG,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC;AACrE,OAAO,CAAC,+BAA+B,GAAG,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC;AAC1E,OAAO,CAAC,kBAAkB,GAAG,KAAK,GAAG,OAAO,CAAC,4BAA4B,GAAG,GAAG,GAAG,OAAO,CAAC,0BAA0B,GAAG,GAAG,GAAG,OAAO,CAAC,+BAA+B,GAAG,GAAG,CAAC;AAC3K,OAAO,CAAC,+BAA+B,GAAG,yBAAyB,CAAC;AACpE,OAAO,CAAC,+BAA+B,GAAG,yBAAyB,CAAC;AAEpE;AACA;AACA,OAAO,CAAC,uBAAuB,GAAG,KAAK,GAAG,YAAY,CAAC;AACvD,OAAO,CAAC,wBAAwB,GAAG,eAAe,CAAC;AACnD,OAAO,CAAC,wBAAwB,GAAG,eAAe,CAAC;AACnD,OAAO,CAAC,qBAAqB,GAAG,KAAK,GAAG,OAAO,CAAC,uBAAuB,GAAG,GAAG,GAAG,OAAO,CAAC,wBAAwB,GAAG,GAAG,GAAG,OAAO,CAAC,wBAAwB,GAAG,GAAG,CAAC;AAChK,OAAO,CAAC,oBAAoB,GAAG,SAAS,GAAG,OAAO,CAAC,qBAAqB,GAAG,GAAG,CAAC;AAE/E,OAAO,CAAC,kCAAkC,GAAG,gBAAgB,GAAG,YAAY,CAAC;AAC7E,OAAO,CAAC,mCAAmC,GAAG,8DAA8D,CAAC;AAC7G,OAAO,CAAC,mCAAmC,GAAG,4DAA4D,CAAC;AAC3G,OAAO,CAAC,gCAAgC,GAAG,KAAK,GAAG,OAAO,CAAC,kCAAkC,GAAG,GAAG,GAAG,OAAO,CAAC,mCAAmC,GAAG,GAAG,GAAG,OAAO,CAAC,mCAAmC,GAAG,GAAG,CAAC;AAC5M,OAAO,CAAC,+BAA+B,GAAG,SAAS,GAAG,OAAO,CAAC,gCAAgC,GAAG,GAAG;;ACzBpG;;;;;;;AAOG;AACa,SAAA,QAAQ,CAAC,IAAY,EAAE,MAAc,EAAA;;AAEnD,IAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AAClB,QAAA,MAAM,KAAK,CAAC,8DAA8D,CAAC,CAAC;KAC7E;;IAGD,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,IAAI,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9B,IAAA,OAAO,KAAK,KAAK,IAAI,EAAE;AACrB,QAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnB,QAAA,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC3B;;AAGD,IAAA,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;AAErB,IAAA,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;AAMG;SACa,YAAY,CAAI,GAAQ,EAAE,YAAwC,EAAE,kBAAqC,EAAA;AACvH,IAAA,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AACxB,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,UAAS,CAAC,EAAE,CAAC,EAAA;AAE9B,QAAA,IAAI,OAAO,kBAAkB,KAAK,UAAU,EAAE;AAC5C,YAAA,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;SAC3B;AAED,QAAA,OAAO,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5B,KAAC,CAAC,CAAC;AACL,CAAC;AAEC;;;;AAIG;AACG,SAAU,uBAAuB,CAAC,OAAY,EAAA;;AAElD,IAAA,OAAO,OAAO,EAAE,aAAa,KAAK,SAAS,CAAC;AAC9C;;AC/CF;;AAEG;MACU,sBAAsB,CAAA;AAKjC,IAAA,WAAA,CAAY,MAAgC,EAAU,cAAgD,EAAU,aAA4B,EAAU,oBAA0C,EAAA;QAA1I,IAAc,CAAA,cAAA,GAAd,cAAc,CAAkC;QAAU,IAAa,CAAA,aAAA,GAAb,aAAa,CAAe;QAAU,IAAoB,CAAA,oBAAA,GAApB,oBAAoB,CAAsB;QAFhM,IAAa,CAAA,aAAA,GAAmC,EAAE,CAAC;QAGjD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;KAC9B;AAEM,IAAA,SAAS,CAAC,OAAe,EAAE,OAAY,EAAE,OAAqB,EAAA;QACnE,IAAI,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS;YACvC,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,QAAS,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC;YACvG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,QAAS,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AAEvG,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;AAChC,YAAA,aAAa,GAAG;AACd,gBAAA,GAAG,aAAa;gBAChB,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,QAAS,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC;aAC7G,CAAC;AACF,YAAA,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,oBAAoB,GAAG,CAAC,CAAC,oBAAoB,CAAC,CAAC;SAC/E;AAED,QAAA,OAAO,aAAa,CAAC;KACtB;IAEM,aAAa,CAAC,MAAc,EAAE,SAAoB,EAAE,OAAY,EAAE,UAAiB,EAAE,OAAqB,EAAA;QAC/G,OAAO;AACL,YAAA,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;AAChC,YAAA,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ;AAClE,YAAA,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;AAC9B,YAAA,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB;SACrD,CAAC;KACH;AAEM,IAAA,WAAW,CAAC,MAAc,EAAE,SAAoB,EAAE,OAAY,EAAE,OAAqB,EAAA;QAC1F,IAAI,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;;AAG9C,QAAA,IAAI,YAAY,KAAK,SAAS,EAAE;YAC9B,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,UAAW,CAAC,CAAC;AAC1D,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC;SAC3C;;AAGD,QAAA,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,YAAY,CAAC,MAAO,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAClG,QAAA,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,YAAY,CAAC,OAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAE3F,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,0BAA0B,CAAC,YAAY,CAAC,MAAO,CAAC;YAC7D,OAAO,EAAE,IAAI,CAAC,0BAA0B,CAAC,YAAY,CAAC,OAAQ,CAAC;SAChE,CAAC;KACH;;;AAKD;;;;AAIG;AACH,IAAA,cAAc,CAAC,UAAkB,EAAA;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAW,CAAC,CAAC;QACrD,MAAM,aAAa,GAAqC,EAAE,CAAC;AAC3D,QAAA,KAAK,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YACpE,aAAa,CAAC,WAAW,CAAC,GAAG,EAAC,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAC,CAAC;SAC1G;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAW,CAAC,CAAC;QACvD,MAAM,cAAc,GAAqC,EAAE,CAAC;AAC5D,QAAA,KAAK,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;YACvE,cAAc,CAAC,YAAY,CAAC,GAAG,EAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAC,CAAC;SAC7G;QAED,OAAO;AACL,YAAA,MAAM,EAAE,aAAa;AACrB,YAAA,OAAO,EAAE,cAAc;SACxB,CAAC;KACH;AAED;;;;AAIG;AACH,IAAA,gBAAgB,CAAE,UAAkB,EAAA;QAClC,MAAM,kBAAkB,GAAG,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC;QACnK,MAAM,gBAAgB,GAAG,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC;;AAG/J,QAAA,KAAK,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE;YAC1F,kBAAkB,CAAC,kBAAkB,CAAC,GAAG,GAAG,GAAG,mBAAmB,GAAG,GAAG,CAAC;SAC1E;;AAGD,QAAA,OAAO,EAAC,GAAG,kBAAkB,EAAE,GAAG,gBAAgB,EAAC,CAAC;KACrD;AAED;;;;AAIG;AACH,IAAA,iBAAiB,CAAC,UAAkB,EAAA;QAClC,OAAO,IAAI,CAAC,yBAAyB,CAAC,UAAW,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC;KAC3I;AAED;;;;;;;AAOG;AACO,IAAA,yBAAyB,CAAC,UAAkB,EAAE,IAAiD,EAAE,SAAwB,EAAE,SAAwB,EAAA;QACzJ,MAAM,QAAQ,GAAyB,EAAE,CAAC;;AAG1C,QAAA,MAAM,iBAAiB,GAAG,KAAK,GAAG,OAAO,CAAC,+BAA+B,GAAG,GAAG,GAAG,OAAO,CAAC,+BAA+B,GAAG,GAAG,CAAC;AAChI,QAAA,IAAI,kBAAkB,CAAC;QACvB,QAAQ,IAAI;AACV,YAAA,KAAK,iBAAiB;AAAE,gBAAA,kBAAkB,GAAG,OAAO,CAAC,4BAA4B,CAAC;gBAAC,MAAM;AACzF,YAAA,KAAK,eAAe;AAAE,gBAAA,kBAAkB,GAAG,OAAO,CAAC,0BAA0B,CAAC;gBAAC,MAAM;AACrF,YAAA,KAAK,SAAS;AAAE,gBAAA,kBAAkB,GAAG,OAAO,CAAC,+BAA+B,CAAC;gBAAC,MAAM;SACrF;AACD,QAAA,MAAM,cAAc,GAAG,kBAAkB,GAAG,IAAI,GAAG,iBAAiB,CAAC;QACrE,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAC3D,MAAM,gBAAgB,GAAG,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;;AAGhE,QAAA,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE;;YAEpC,IAAI,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;;YAE3C,IAAI,eAAe,KAAK,SAAS,IAAI,IAAI,KAAK,iBAAiB,EAAE;gBAC/D,eAAe,GAAG,EAAE,CAAC;aACtB;YACD,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC;SACtC;;QAGD,MAAM,gBAAgB,GAAyB,EAAE,CAAC;AAClD,QAAA,KAAK,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAClE,IAAI,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;gBAChD,SAAS;aACV;YACD,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;gBACjD,SAAS;aACV;AACD,YAAA,gBAAgB,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC;SAC9C;AAED,QAAA,OAAO,gBAAgB,CAAC;KACzB;AAEH;;;;AAIG;AACK,IAAA,0BAA0B,CAAC,kBAAoD,EAAA;QACrF,MAAM,MAAM,GAAyB,EAAE,CAAC;AACxC,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE;AAC7D,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;SAC3B;AACD,QAAA,OAAO,MAAM,CAAC;KACf;AACF;;AC9KD;;AAEG;MACU,yBAAyB,CAAA;AAKpC,IAAA,WAAA,CAAY,MAAgC,EAAU,cAAgD,EAAU,eAAoC,EAAU,oBAA0C,EAAA;QAAlJ,IAAc,CAAA,cAAA,GAAd,cAAc,CAAkC;QAAU,IAAe,CAAA,eAAA,GAAf,eAAe,CAAqB;QAAU,IAAoB,CAAA,oBAAA,GAApB,oBAAoB,CAAsB;QAFxM,IAAa,CAAA,aAAA,GAAmC,EAAE,CAAC;QAGjD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;KAC9B;AAEM,IAAA,gBAAgB,CAAC,cAAmB,EAAE,OAAY,EAAE,OAAqB,EAAA;AAC9E,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,QAAS,CAAC,CAAC,CAAC;KACjG;IAEM,aAAa,CAAC,MAAc,EAAE,SAAoB,EAAE,OAAY,EAAE,UAAiB,EAAE,OAAqB,EAAA;;AAG/G,QAAA,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAEjD,OAAO;AACL,YAAA,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;AAChC,YAAA,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;AAC1C,YAAA,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;AAC9B,YAAA,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB;SACrD,CAAC;KACH;AAEM,IAAA,WAAW,CAAC,MAAc,EAAE,SAAoB,EAAE,OAAY,EAAE,OAAqB,EAAA;QAC1F,IAAI,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;;AAG9C,QAAA,IAAI,YAAY,KAAK,SAAS,EAAE;YAC9B,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,eAAgB,CAAC,CAAC;AAC/D,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC;SAC3C;;AAGD,QAAA,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,YAAY,CAAC,MAAO,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAClG,QAAA,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,YAAY,CAAC,OAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAE3F,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,0BAA0B,CAAC,YAAY,CAAC,MAAO,CAAC;YAC7D,OAAO,EAAE,IAAI,CAAC,0BAA0B,CAAC,YAAY,CAAC,OAAQ,CAAC;SAChE,CAAC;KACH;;;AAKD;;;;AAIG;AACH,IAAA,wBAAwB,CAAC,aAAkB,EAAA;QACzC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;aACtD,GAAG,CAAC,CAAC,OAAY,KAAK,OAAO,CAAC,IAAI,CAAC;aACnC,MAAM,CAAC,CAAC,IAAY,KACnB,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC3C,aAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAC7C,CAAC;AAEJ,QAAA,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE;YAC/B,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;SAC3D;KACF;AAED;;;;AAIG;AACH,IAAA,cAAc,CAAC,OAAY,EAAA;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC;QACxI,MAAM,aAAa,GAAqC,EAAE,CAAC;AAC3D,QAAA,KAAK,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YACpE,aAAa,CAAC,WAAW,CAAC,GAAG,EAAC,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAC,CAAC;SAC1G;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC;QAC5I,MAAM,cAAc,GAAqC,EAAE,CAAC;AAC5D,QAAA,KAAK,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;YACvE,cAAc,CAAC,YAAY,CAAC,GAAG,EAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAC,CAAC;SAC7G;QAED,OAAO;AACL,YAAA,MAAM,EAAE,aAAa;AACrB,YAAA,OAAO,EAAE,cAAc;SACxB,CAAC;KACH;AAED;;;;;;;AAOG;AACH,IAAA,kBAAkB,CAAE,OAAY,EAAE,IAAwB,EAAE,SAAwB,EAAE,SAAwB,EAAA;QAC5G,MAAM,QAAQ,GAAyB,EAAE,CAAC;;QAG1C,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAClE,QAAA,KAAK,IAAI,QAAQ,IAAI,SAAS,EAAE;YAC9B,IACE,IAAI,KAAK,QAAQ,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC3E,gBAAA,IAAI,KAAK,SAAS,KAAK,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC1E;AACA,gBAAA,IAAI,OAAO,GAAQ,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;;gBAGxE,IAAI,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,EAAE,EAAE;oBAC7F,OAAO,GAAG,SAAS,CAAC;iBACrB;;gBAGD,IAAI,IAAI,KAAK,QAAQ,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE;AAC/E,oBAAA,OAAO,GAAG,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAG,CAAC;iBAC1B;;gBAGD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAEpD,gBAAA,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;aAC9B;SACF;;QAGD,MAAM,gBAAgB,GAAyB,EAAE,CAAC;AAClD,QAAA,KAAK,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAClE,IAAI,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;gBAChD,SAAS;aACV;YACD,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;gBACjD,SAAS;aACV;AACD,YAAA,gBAAgB,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC;SAC9C;AAED,QAAA,OAAO,gBAAgB,CAAC;KACzB;AAED;;;;AAIG;AACK,IAAA,0BAA0B,CAAC,kBAAoD,EAAA;QACrF,MAAM,MAAM,GAAyB,EAAE,CAAC;AACxC,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE;AAC7D,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;SAC3B;AACD,QAAA,OAAO,MAAM,CAAC;KACf;AACF;;ACjED;;AAEG;AACU,MAAA,gCAAgC,GAAqC;AAC9E,IAAA,SAAS,EAAE,SAAS;AACpB,IAAA,IAAI,EAAE,SAAS;AACf,IAAA,cAAc,EAAE,KAAK;AACrB,IAAA,QAAQ,EAAE,SAAS;AACnB,IAAA,cAAc,EAAE,SAAS;AACzB,IAAA,QAAQ,EAAE,SAAS;AACnB,IAAA,gBAAgB,EAAE,IAAI;AACtB,IAAA,SAAS,EAAE,IAAI;IACf,YAAY,EAAE,EAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAC;AAC1C,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,eAAe,EAAE,IAAI;AACrB,IAAA,eAAe,EAAE,SAAS;AAC1B,IAAA,eAAe,EAAE,SAAS;AAC1B,IAAA,gBAAgB,EAAE,SAAS;AAC3B,IAAA,gBAAgB,EAAE,SAAS;AAC3B,IAAA,sBAAsB,EAAE,IAAI;AAC5B,IAAA,yBAAyB,EAAE,IAAI;;;ACtHnC;;AAEG;MAIU,gCAAgC,CAAA;AAE3C,IAAA,WAAA,GAAA;KACC;AAED;;;;AAIG;AACH,IAAA,aAAa,CAAC,gBAA0C,EAAA;AACtD,QAAA,MAAM,YAAY,GAAqC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC,CAAC;;QAGpH,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE;AACtE,YAAA,MAAM,KAAK,CAAC,8IAA8I,CAAC,CAAC;SAC7J;AACD,QAAA,YAAY,CAAC,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC;;QAGpD,IAAI,gBAAgB,CAAC,SAAS,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE;YAC1D,MAAM,QAAQ,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,SAAyC,CAAE,CAAC;AACnG,YAAA,YAAY,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;;SAG3C;AAAM,aAAA,IAAI,gBAAgB,CAAC,SAAS,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,gBAAgB,CAAC,SAAS,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE;YAChI,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE;AAChD,gBAAA,MAAM,KAAK,CAAC,CAAkL,gLAAA,CAAA,CAAC,CAAC;aACjM;;SAEF;aAAM;AACL,YAAA,MAAM,KAAK,CAAC,gIAAgI,CAAC,CAAC;SAC/I;;AAGD,QAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;AAC3C,YAAA,IAAI,OAAO,gBAAgB,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAAE,MAAM,KAAK,CAAC,4FAA4F,GAAG,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;aAAE;AAC5L,YAAA,YAAY,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;SAC3C;;AAGD,QAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE;AAC/C,YAAA,IAAI,OAAO,gBAAgB,CAAC,QAAQ,KAAK,QAAQ,EAAE;gBAAE,MAAM,KAAK,CAAC,gGAAgG,GAAG,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAC;aAAE;AACxM,YAAA,YAAY,CAAC,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC;SACnD;;AAGD,QAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE;AACrD,YAAA,IAAI,OAAO,gBAAgB,CAAC,cAAc,KAAK,QAAQ,EAAE;gBAAE,MAAM,KAAK,CAAC,sGAAsG,GAAG,OAAO,gBAAgB,CAAC,cAAc,CAAC,CAAC;aAAE;AAC1N,YAAA,YAAY,CAAC,cAAc,GAAG,gBAAgB,CAAC,cAAc,CAAC;SAC/D;;AAGD,QAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE;AACrD,YAAA,IAAI,OAAO,gBAAgB,CAAC,cAAc,KAAK,SAAS,EAAE;gBAAE,MAAM,KAAK,CAAC,uGAAuG,GAAG,OAAO,gBAAgB,CAAC,cAAc,CAAC,CAAC;aAAE;AAC5N,YAAA,YAAY,CAAC,cAAc,GAAG,gBAAgB,CAAC,cAAc,CAAC;SAC/D;;AAGD,QAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAAE;AACvD,YAAA,IAAI,OAAO,gBAAgB,CAAC,gBAAgB,KAAK,SAAS,EAAE;gBAAE,MAAM,KAAK,CAAC,yGAAyG,GAAG,OAAO,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;aAAE;AAClO,YAAA,YAAY,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,gBAAgB,CAAC;SACnE;;AAGD,QAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE;AAChD,YAAA,IAAI,OAAO,gBAAgB,CAAC,SAAS,KAAK,SAAS,EAAE;gBAAE,MAAM,KAAK,CAAC,kGAAkG,GAAG,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;aAAE;AAC7M,YAAA,YAAY,CAAC,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC;SACrD;;AAGD,QAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE;YACnD,IAAI,OAAO,gBAAgB,CAAC,YAAY,KAAK,QAAQ,IAAI,OAAO,gBAAgB,CAAC,YAAY,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,gBAAgB,CAAC,YAAY,CAAC,OAAO,KAAK,QAAQ,EAAE;AAC/K,gBAAA,MAAM,KAAK,CAAC,6HAA6H,CAAC,CAAC;aAC5I;AACD,YAAA,YAAY,CAAC,YAAY,GAAG,gBAAgB,CAAC,YAAY,CAAC;SAC3D;;AAGD,QAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE;AAC/C,YAAA,YAAY,CAAC,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC;SACnD;;AAGD,QAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,qBAAqB,CAAC,EAAE;AAC1D,YAAA,YAAY,CAAC,mBAAmB,GAAG,gBAAgB,CAAC,mBAAmB,CAAC;SACzE;;AAGD,QAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE;AACtD,YAAA,IAAI,OAAO,gBAAgB,CAAC,eAAe,KAAK,SAAS,EAAE;gBAAE,MAAM,KAAK,CAAC,wGAAwG,GAAG,OAAO,gBAAgB,CAAC,eAAe,CAAC,CAAC;aAAE;AAC/N,YAAA,YAAY,CAAC,eAAe,GAAG,gBAAgB,CAAC,eAAe,CAAC;SACjE;;AAGD,QAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE;AAClD,YAAA,IAAI,OAAO,gBAAgB,CAAC,WAAW,KAAK,SAAS,EAAE;gBAAE,MAAM,KAAK,CAAC,oGAAoG,GAAG,OAAO,gBAAgB,CAAC,WAAW,CAAC,CAAC;aAAE;AACnN,YAAA,YAAY,CAAC,WAAW,GAAG,gBAAgB,CAAC,WAAW,CAAC;SACzD;;AAGD,QAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE;YACtD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,eAAe,CAAC,EAAE;AAAE,gBAAA,MAAM,KAAK,CAAC,uGAAuG,CAAC,CAAC;aAAE;AAC/K,YAAA,KAAK,MAAM,KAAK,IAAI,gBAAgB,CAAC,eAAe,EAAE;AACpD,gBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;oBAAE,MAAM,KAAK,CAAC,kHAAkH,GAAG,OAAO,KAAK,GAAG,SAAS,CAAC,CAAC;iBAAE;aAC/L;AACD,YAAA,YAAY,CAAC,eAAe,GAAG,gBAAgB,CAAC,eAAe,CAAC;SACjE;;AAGD,QAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE;YACtD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,eAAe,CAAC,EAAE;AAAE,gBAAA,MAAM,KAAK,CAAC,uGAAuG,CAAC,CAAC;aAAE;AAC/K,YAAA,KAAK,MAAM,KAAK,IAAI,gBAAgB,CAAC,eAAe,EAAE;AACpD,gBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;oBAAE,MAAM,KAAK,CAAC,kHAAkH,GAAG,OAAO,KAAK,GAAG,SAAS,CAAC,CAAC;iBAAE;aAC/L;AACD,YAAA,YAAY,CAAC,eAAe,GAAG,gBAAgB,CAAC,eAAe,CAAC;SACjE;;AAGD,QAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAAE;YACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,EAAE;AAAE,gBAAA,MAAM,KAAK,CAAC,wGAAwG,CAAC,CAAC;aAAE;AACjL,YAAA,KAAK,MAAM,KAAK,IAAI,gBAAgB,CAAC,gBAAgB,EAAE;AACrD,gBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;oBAAE,MAAM,KAAK,CAAC,mHAAmH,GAAG,OAAO,KAAK,GAAG,SAAS,CAAC,CAAC;iBAAE;aAChM;AACD,YAAA,YAAY,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,gBAAgB,CAAC;SACnE;;AAGD,QAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAAE;YACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,EAAE;AAAE,gBAAA,MAAM,KAAK,CAAC,wGAAwG,CAAC,CAAC;aAAE;AACjL,YAAA,KAAK,MAAM,KAAK,IAAI,gBAAgB,CAAC,gBAAgB,EAAE;AACrD,gBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;oBAAE,MAAM,KAAK,CAAC,mHAAmH,GAAG,OAAO,KAAK,GAAG,SAAS,CAAC,CAAC;iBAAE;aAChM;AACD,YAAA,YAAY,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,gBAAgB,CAAC;SACnE;;AAGD,QAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,wBAAwB,CAAC,EAAE;AAC7D,YAAA,IAAI,OAAO,gBAAgB,CAAC,sBAAsB,KAAK,SAAS,EAAE;gBAAE,MAAM,KAAK,CAAC,+GAA+G,GAAG,OAAO,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;aAAE;AACpP,YAAA,YAAY,CAAC,sBAAsB,GAAG,gBAAgB,CAAC,sBAAsB,CAAC;SAC/E;;AAGD,QAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,2BAA2B,CAAC,EAAE;AAChE,YAAA,IAAI,OAAO,gBAAgB,CAAC,yBAAyB,KAAK,SAAS,EAAE;gBAAE,MAAM,KAAK,CAAC,kHAAkH,GAAG,OAAO,gBAAgB,CAAC,yBAAyB,CAAC,CAAC;aAAE;AAC7P,YAAA,YAAY,CAAC,yBAAyB,GAAG,gBAAgB,CAAC,yBAAyB,CAAC;SACrF;AAED,QAAA,OAAO,YAAwC,CAAC;KACjD;+GArJU,gCAAgC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAhC,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gCAAgC,cAF/B,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAH5C,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MCJY,gBAAgB,GAAG,IAAI,cAAc,CAAkB,4EAA4E;;ACChJ;;AAEG;MAIU,sBAAsB,CAAA;AAGjC,IAAA,WAAA,CAAsC,QAAkB,EAAU,eAAiC,EAAU,SAAuB,EAAA;QAA9F,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAU;QAAU,IAAe,CAAA,eAAA,GAAf,eAAe,CAAkB;QAAU,IAAS,CAAA,SAAA,GAAT,SAAS,CAAc;AAClI,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KACjE;IAED,YAAY,GAAA;AACV,QAAA,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,WAAW,EAAE;AACxC,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;YACjF,MAAM,WAAW,GAAG,cAAc,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;YAC/D,IAAI,WAAW,EAAE;AACf,gBAAA,OAAO,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;aAClC;SACF;AAED,QAAA,OAAO,IAAI,CAAC;KACb;AAED,IAAA,QAAQ,CAAC,OAAe,EAAA;AACtB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;KACrE;AAED,IAAA,aAAa,CAAC,OAAe,EAAA;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;KAC7C;IAED,YAAY,CAAC,CAAU,EAAE,CAAU,EAAA;QACjC,IAAK,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC,CAAC;AAEvB,QAAA,IAAK,CAAC,CAAC,CAAC,uBAAuB,EAAE;;AAE/B,YAAA,OAAQ,CAAS,CAAC,WAAW,GAAI,CAAS,CAAC,WAAW,CAAC;SACxD;QAED,IAAK,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;;AAErC,YAAA,OAAO,CAAC,CAAC;SACV;QAED,OAAO,CAAC,CAAC,CAAC;KACX;AAED,IAAA,YAAY,CAAC,OAAgB,EAAA;AAC3B,QAAA,OAAO,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;KAChC;AAED,IAAA,UAAU,CAAC,OAAgB,EAAA;QACzB,OAAO,OAAO,CAAC,OAAO,CAAC;KACxB;AAED,IAAA,aAAa,CAAC,OAAY,EAAA;;AAExB,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAA;AAC5C,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;;AAG7C,QAAA,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,CAAC,KAAK,GAAG;AACjE,YAAA,WAAW;YACX,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAEzD,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;KACrD;AAED,IAAA,aAAa,CAAC,OAAY,EAAA;QACxB,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;KACvF;AAED,IAAA,iBAAiB,CAAC,OAAa,EAAA;AAC7B,QAAA,OAAO,OAAQ,OAAe,CAAC,iBAAiB,KAAK,UAAU,GAAI,OAAe,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC;KAC7G;IAED,YAAY,CAAC,OAAgB,EAAE,aAAqB,EAAA;AAClD,QAAA,OAAO,OAAQ,OAAe,CAAC,YAAY,KAAK,UAAU,GAAI,OAAe,CAAC,YAAY,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;KAClH;AAED,IAAA,YAAY,CAAC,OAAgB,EAAE,aAAqB,EAAE,KAAa,EAAA;QACjE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;KAC3D;IAED,eAAe,CAAC,OAAY,EAAE,aAAqB,EAAA;QACjD,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;KACvD;AAED,IAAA,aAAa,CAAC,OAAa,EAAA;AACzB,QAAA,IAAI;YACF,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;SAC1C;QAAC,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,IAAI,CAAC;SACb;KACF;IAED,gBAAgB,CAAC,aAA+B,EAAE,QAAgB,EAAA;QAChE,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;KAC7D;AAED,IAAA,aAAa,CAAC,IAAU,EAAA;AACtB,QAAA,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;KACpD;IAED,WAAW,CAAC,aAAmB,EAAE,YAAkB,EAAA;QACjD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;KACxD;AAED,IAAA,YAAY,CAAC,aAAmB,EAAE,YAAkB,EAAE,gBAAsB,EAAA;QAC1E,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAC;KAC3E;AAED,IAAA,eAAe,CAAC,OAAa,EAAA;QAC3B,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,OAAO,CAAC,UAAU,EAAE;gBACzB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;aAC/C;SACF;KACF;IAED,WAAW,CAAC,aAAmB,EAAE,YAAkB,EAAA;AACjD,QAAA,aAAa,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;KACzC;AAED,IAAA,eAAe,CAAC,OAAgB,EAAA;QAC9B,OAAO,OAAO,CAAC,SAAS,CAAC;KAC1B;IAED,eAAe,CAAC,OAAgB,EAAE,OAAe,EAAA;QAC/C,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC;SAC7B;KACF;AAED,IAAA,UAAU,CAAC,OAAa,EAAA;AACtB,QAAA,OAAO,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,CAAC;KAC5C;AAED,IAAA,cAAc,CAAC,OAAe,EAAA;AAC5B,QAAA,OAAO,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;KACzC;AAED,IAAA,cAAc,CAAC,OAAa,EAAA;QAC1B,OAAO,OAAO,CAAC,WAAW,CAAC;KAC5B;AAED,IAAA,aAAa,CAAC,OAAa,EAAE,IAAY,EAAE,OAAY,EAAA;AACrD,QAAA,OAAO,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;KAClF;AAhJU,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,kBAGb,QAAQ,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAHjB,IAAA,SAAA,IAAA,CAAA,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,CAAA,EAAA;;4FAEP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;0BAIc,MAAM;2BAAC,QAAQ,CAAA;;;ACV9B;;AAEG;MAIU,mBAAmB,CAAA;IAE9B,WAA0D,CAAA,mBAAoC,EAAU,sBAA8C,EAAA;QAA5F,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB,CAAiB;QAAU,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB,CAAwB;KACrJ;AAEO,IAAA,MAAM,CAAE,UAAkB,EAAA;AAChC,QAAA,IAAI,IAAI,CAAC,mBAAmB,IAAI,OAAQ,IAAI,CAAC,mBAA2B,CAAC,UAAU,CAAC,KAAK,UAAU,EAAE;YACnG,OAAO,IAAI,CAAC,mBAAmB,CAAA;SAChC;aAAM;YACL,OAAO,IAAI,CAAC,sBAAsB,CAAC;SACpC;KACF;IAED,YAAY,GAAA;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAa,EAAE,CAAC;KACpD;AAED,IAAA,QAAQ,CAAC,OAAe,EAAA;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,QAAS,CAAC,OAAO,CAAC,CAAC;KACnD;AAED,IAAA,aAAa,CAAC,OAAe,EAAA;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,aAAc,CAAC,OAAO,CAAC,CAAC;KAC7D;IAED,YAAY,CAAC,CAAM,EAAE,CAAM,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KACxD;AAED,IAAA,YAAY,CAAC,OAAY,EAAA;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAa,CAAC,OAAO,CAAC,CAAC;KAC3D;AAED,IAAA,UAAU,CAAC,OAAY,EAAA;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,UAAW,CAAC,OAAO,CAAC,CAAC;KACvD;AAED,IAAA,aAAa,CAAC,OAAY,EAAA;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,aAAc,CAAC,OAAO,CAAC,CAAC;KAC7D;AAED,IAAA,aAAa,CAAC,OAAY,EAAA;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,aAAc,CAAC,OAAO,CAAC,CAAC;KAC7D;AAED,IAAA,iBAAiB,CAAC,OAAY,EAAA;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,iBAAkB,CAAC,OAAO,CAAC,CAAC;KACrE;IAED,YAAY,CAAC,OAAY,EAAE,aAAqB,EAAA;AAC9C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAa,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;KAC1E;AAED,IAAA,YAAY,CAAC,OAAY,EAAE,aAAqB,EAAE,KAAa,EAAA;AAC7D,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAa,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;KACjF;IAED,eAAe,CAAC,OAAY,EAAE,aAAqB,EAAA;AACjD,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,eAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;KAChF;AAED,IAAA,aAAa,CAAC,OAAY,EAAA;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,aAAc,CAAC,OAAO,CAAC,CAAC;KAC7D;IAED,gBAAgB,CAAC,aAAkB,EAAE,QAAgB,EAAA;AACnD,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,gBAAiB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;KACnF;AAED,IAAA,aAAa,CAAC,IAAS,EAAA;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,aAAc,CAAC,IAAI,CAAC,CAAC;KAC1D;IAED,WAAW,CAAC,aAAkB,EAAE,YAAiB,EAAA;AAC/C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,WAAY,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;KAC7E;AAED,IAAA,YAAY,CAAC,aAAkB,EAAE,YAAiB,EAAE,gBAAqB,EAAA;AACvE,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAa,CAAC,aAAa,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAC;KACjG;AAED,IAAA,eAAe,CAAC,OAAY,EAAA;QAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,eAAgB,CAAC,OAAO,CAAC,CAAC;KACjE;IAED,WAAW,CAAC,aAAkB,EAAE,YAAiB,EAAA;AAC/C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,WAAY,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;KAC7E;AAED,IAAA,eAAe,CAAC,OAAY,EAAA;QAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,eAAgB,CAAC,OAAO,CAAC,CAAC;KACjE;IAED,eAAe,CAAC,OAAY,EAAE,OAAe,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,eAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;KAC1E;AAED,IAAA,UAAU,CAAC,OAAY,EAAA;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,UAAW,CAAC,OAAO,CAAC,CAAC;KACvD;AAED,IAAA,cAAc,CAAC,OAAe,EAAA;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,cAAe,CAAC,OAAO,CAAC,CAAC;KAC/D;AAED,IAAA,cAAc,CAAC,OAAY,EAAA;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,cAAe,CAAC,OAAO,CAAC,CAAC;KAC/D;AAED,IAAA,aAAa,CAAC,OAAY,EAAE,IAAY,EAAE,OAAY,EAAA;AACpD,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,aAAc,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;KAC5E;AA/GU,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,kBAEE,gBAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,sBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAFrC,IAAA,SAAA,IAAA,CAAA,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,CAAA,EAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;0BAGc,QAAQ;;0BAAI,MAAM;2BAAC,gBAAgB,CAAA;;;ACRlD;;AAEG;MAIU,MAAM,CAAA;AAEjB,IAAA,WAAA,CAAyC,UAAkB,EAAA;QAAlB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAQ;KAC1D;IAED,GAAG,CAAC,OAAc,EAAE,OAAqB,EAAA;QACvC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;KACzC;IAED,IAAI,CAAC,OAAc,EAAE,OAAqB,EAAA;QACxC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;KAC1C;IAED,KAAK,CAAC,OAAc,EAAE,OAAqB,EAAA;QACzC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;KAC3C;AAED;;;;;;AAMG;AACK,IAAA,SAAS,CAAC,OAAc,EAAE,OAAqB,EAAE,MAAc,EAAA;AACrE,QAAA,IACE,OAAO,CAAC,UAAU,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;AACjF,YAAA,OAAO,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;AACnF,YAAA,OAAO,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAC9D;AACC,YAAA,OAAe,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;SACtC;KACF;AAED;;AAEG;IACK,SAAS,GAAA;QACf,OAAO,SAAS,EAAE,CAAC;KACpB;AAvCU,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAM,kBAEG,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAFpB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAM,cAFL,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,MAAM,EAAA,UAAA,EAAA,CAAA;kBAHlB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;0BAGc,MAAM;2BAAC,WAAW,CAAA;;;ACNjC;;AAEG;MAIU,UAAU,CAAA;AAErB,IAAA,WAAA,CAAoB,MAAc,EAAA;QAAd,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;KAAI;AAEtC;;;;;;;;AAQG;IACH,IAAI,CAAC,OAAe,EAAE,eAAuB,EAAE,eAAwB,EAAE,aAAuB,EAAE,OAAwB,GAAA,sBAAsB,EAAE,EAAA;QAChJ,IAAI,CAAC,eAAe,EAAE;YACpB,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;SAC1D;aAAM;AACL,YAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,CAAC,CAAA;SAClG;KACF;AAED;;;;;AAKG;IACH,kBAAkB,CAAC,OAAe,EAAE,SAAiB,EAAA;QACnD,MAAM,MAAM,GAAmB,EAAE,CAAC;;QAGlC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAEvD,QAAA,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE;YACrC,MAAM,CAAC,IAAI,CAAC;gBACV,oBAAoB,EAAE,KAAK,CAAC,KAAK;gBACjC,kBAAkB,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;AACjD,gBAAA,oBAAoB,EAAE,IAAI;AAC1B,gBAAA,kBAAkB,EAAE,IAAI;AACzB,aAAA,CAAC,CAAC;SACJ;AAED,QAAA,OAAO,MAAM,CAAC;KACf;AAED;;;;;;;;;;;;;;;;;;;;;AAqBG;IACH,kBAAkB,CAAC,OAAe,EAAE,eAAuB,EAAE,eAAuB,EAAE,aAAuB,EAAE,OAAwB,GAAA,sBAAsB,EAAE,EAAA;QAC7J,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,MAAM,MAAM,GAAmB,EAAE,CAAC;;QAGlC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAC7D,QAAA,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE;YACrC,OAAO,CAAC,IAAI,CAAC;AACX,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBACf,UAAU,EAAE,KAAK,CAAC,KAAK;gBACvB,QAAQ,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;AACxC,aAAA,CAAC,CAAC;SACJ;;QAGD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAC7D,QAAA,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE;YACrC,OAAO,CAAC,IAAI,CAAC;AACX,gBAAA,SAAS,EAAE,KAAK;AAChB,gBAAA,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBACf,UAAU,EAAE,KAAK,CAAC,KAAK;gBACvB,QAAQ,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;AACxC,aAAA,CAAC,CAAC;SACJ;;AAGD,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;;QAGpD,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,QAAA,WAAW,EAAE,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE;;AAGzD,YAAA,IAAI,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;gBAC7D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,0BAA0B,GAAG,GAAG,CAAC,KAAK,GAAG,wBAAwB,GAAG,GAAG,CAAC,UAAU,GAAG,wBAAwB,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,sBAAsB,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC7O,SAAS;aACV;;AAGD,YAAA,IAAI,GAAG,CAAC,SAAS,EAAE;AACjB,gBAAA,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aACtB;iBAAM;;AAEL,gBAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3B,oBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,mEAAmE,GAAG,GAAG,CAAC,KAAK,GAAG,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC9H,SAAS;iBACV;;gBAGD,IAAI,aAAa,KAAK,KAAK,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;oBACpD,UAAU,CAAC,GAAG,EAAE,CAAC;oBACjB,SAAS;iBACV;;gBAGD,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACrD,MAAM,CAAC,IAAI,CAAC;oBACV,oBAAoB,EAAE,UAAU,CAAC,UAAU;oBAC3C,kBAAkB,EAAE,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM;oBACnE,oBAAoB,EAAE,GAAG,CAAC,UAAU;oBACpC,kBAAkB,EAAE,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM;AACtD,iBAAA,CAAC,CAAC;gBACH,UAAU,CAAC,GAAG,EAAE,CAAC;aAClB;SACF;AAED,QAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;YACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,uEAAuE,CAAC,EAAE,OAAO,CAAC,CAAC;SACtG;AAED,QAAA,OAAO,MAAM,CAAC;KACf;+GA3IU,UAAU,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAV,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cAFT,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,UAAU,EAAA,UAAA,EAAA,CAAA;kBAHtB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACHD;;AAEG;MAIU,aAAa,CAAA;AAExB,IAAA,WAAA,CAAoB,UAAsB,EAAA;QAAtB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;KACzC;AAED;;;;;;;AAOG;AACH,IAAA,cAAc,CAAC,OAAe,EAAE,QAAgB,EAAE,eAAmD,EAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAC,EAAE,OAAqB,EAAA;;QAEtJ,MAAM,eAAe,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AAE7E,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;KACtF;AAED;;;;;;;AAOG;AACH,IAAA,iBAAiB,CAAC,OAAe,EAAE,QAAgB,EAAE,eAAmD,EAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAC,EAAE,OAAqB,EAAA;;QAEzJ,MAAM,eAAe,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC7E,MAAM,eAAe,GAAI,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AAE9E,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;KACvF;AAED;;;;;;;AAOG;AACD,IAAA,mBAAmB,CAAC,OAAe,EAAE,QAAgB,EAAE,eAAmD,EAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAC,EAAE,OAAqB,EAAA;AAC3J,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;AAEvF,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;KAC1F;;;AAKH;;;;;AAKG;AACK,IAAA,uBAAuB,CAAC,QAAgB,EAAE,YAAA,GAAmD,EAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAC,EAAE,cAAuB,KAAK,EAAA;;;;QAI7J,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,CAAC,WAAW,GAAG,KAAK,GAAG,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACzF,MAAM,KAAK,GAAG,KAAK,CAAC;AAEpB,QAAA,MAAM,iBAAiB,GAAG,KAAK,GAAG,OAAO,CAAC,+BAA+B,GAAG,GAAG,GAAG,OAAO,CAAC,+BAA+B,GAAG,GAAG,CAAC;AAChI,QAAA,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,GAAG,iBAAiB,GAAG,IAAI,CAAC;QAEtG,MAAM,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,YAAY,GAAG,GAAG,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,GAAG,YAAY,GAAG,GAAG,CAAC;QAEzI,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAEjD,QAAA,OAAO,WAAW,CAAC;KACpB;AAED;;;;;AAKG;AACK,IAAA,uBAAuB,CAAC,QAAgB,EAAE,YAAA,GAAmD,EAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAC,EAAA;AAC/H,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;QACnE,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AAE5D,QAAA,MAAM,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;QAE7D,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAEjD,QAAA,OAAO,WAAW,CAAC;KACpB;AAED;;;;AAIG;AACH,IAAA,WAAW,CAAC,IAAY,EAAA;AACtB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,2BAA2B,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;KAC3E;+GAvGU,aAAa,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAb,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cAFZ,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,aAAa,EAAA,UAAA,EAAA,CAAA;kBAHzB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACLD;;;AAGG;MAIU,eAAe,CAAA;;;AAK1B;;;;AAIG;AACH,IAAA,gBAAgB,CAAC,IAAY,EAAA;;AAE3B,QAAA,MAAM,YAAY,GAAQ,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AACrH,QAAA,MAAM,YAAY,GAAQ,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AACrH,QAAA,MAAM,WAAW,GAAQ,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AACpH,QAAA,MAAM,SAAS,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,YAAY,EAAE,GAAG,WAAW,CAAC,CAAC;QACrE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;;QAGlD,MAAM,aAAa,GAAkB,EAAE,CAAC;QACxC,IAAI,oBAAoB,GAAG,IAAI,CAAC;AAChC,QAAA,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE;YAC7B,IAAI,CAAC,oBAAoB,EAAE;gBACzB,oBAAoB,GAAG,KAAK,CAAC;aAC9B;iBAAM;gBACL,IAAI,oBAAoB,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE;oBACxC,aAAa,CAAC,IAAI,CAAC;AACjB,wBAAA,UAAU,EAAE,oBAAoB,CAAC,KAAK,GAAG,CAAC;AAC1C,wBAAA,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC;AACzB,qBAAA,CAAC,CAAC;oBACH,oBAAoB,GAAG,IAAI,CAAC;iBAC7B;aACF;SACF;AAED,QAAA,IAAI,oBAAoB,KAAK,IAAI,EAAE;AACjC,YAAA,MAAM,KAAK,CAAC,uDAAuD,CAAC,CAAC;SACtE;;AAGD,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;AAExG,QAAA,OAAO,mBAAmB,CAAC;KAC5B;AAED;;;;AAIG;AACH,IAAA,wBAAwB,CAAC,IAAY,EAAA;QACnC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QAC/C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QAC/C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;QAC9C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACzC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QAC7C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACxC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACzC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAC9C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;QACrD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;QACtD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;QACtD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,0BAA0B,CAAC,CAAC;QACvD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;QACrD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;AACtD,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;;;AAIG;AACH,IAAA,wBAAwB,CAAC,IAAY,EAAA;QACnC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;QAC9C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACzC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;QAC7C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACvC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACzC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;QACpD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;QACrD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;QACrD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;QACtD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;QACpD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;AACrD,QAAA,OAAO,IAAI,CAAC;KACb;;;AAKD;;;;AAIG;AACH,IAAA,kBAAkB,CAAC,IAAY,EAAA;QAC7B,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,CAAC,GAAG,eAAe,EAAE,GAAG,eAAe,CAAC,CAAC;QAC7D,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;;QAGpD,MAAM,gBAAgB,GAAkB,EAAE,CAAC;QAC3C,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,QAAA,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE;AACjC,YAAA,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;AACtB,gBAAA,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAC9B;iBAAM;AACL,gBAAA,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;AAC/B,oBAAA,MAAM,KAAK,CAAC,sEAAsE,CAAC,CAAC;iBACrF;;AAED,gBAAA,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;oBAC/B,gBAAgB,CAAC,IAAI,CAAC;wBACpB,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;AACvC,wBAAA,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC;AAC3B,qBAAA,CAAC,CAAC;iBACJ;gBACD,cAAc,CAAC,GAAG,EAAE,CAAC;aACtB;SACF;AAED,QAAA,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;AAC/B,YAAA,MAAM,KAAK,CAAC,gEAAgE,CAAC,CAAC;SAC/E;;AAGD,QAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;AAE1G,QAAA,OAAO,oBAAoB,CAAC;KAC7B;AAED;;;;AAIG;AACH,IAAA,sBAAsB,CAAC,IAAY,EAAA;QACjC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;QAClD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;AACnD,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;;;AAIG;AACH,IAAA,sBAAsB,CAAC,IAAY,EAAA;QACjC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC;AACnD,QAAA,OAAO,IAAI,CAAC;KACb;;;AAKD;;;;AAIG;AACH,IAAA,yBAAyB,CAAC,IAAY,EAAA;;;AAIpC,QAAA,MAAM,sCAAsC,GAAG,yBAAyB,CAAC;QACzE,MAAM,uBAAuB,GAAG,0BAA0B,CAAC;AAE3D,QAAA,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC,CAAC;;;;QAKlF,MAAM,eAAe,GAAkB,EAAE,CAAC;AAC1C,QAAA,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE;AAC5C,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC/D,MAAM,wBAAwB,GAAG,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YACjE,MAAM,wBAAwB,GAAG,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YACjE,MAAM,oBAAoB,GAAG,CAAC,GAAG,wBAAwB,EAAE,GAAG,wBAAwB,CAAC,CAAC;YACxF,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAE7D,YAAA,IAAI,cAAc,GAAG,CAAC,CAAC;AACvB,YAAA,KAAK,MAAM,gBAAgB,IAAI,oBAAoB,EAAE;AACnD,gBAAA,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,cAAc,GAAG,CAAC,GAAG,cAAc,GAAG,CAAC,CAAC;AACvF,gBAAA,IAAI,cAAc,KAAK,CAAC,EAAE;oBACxB,eAAe,CAAC,IAAI,CAAC;AACnB,wBAAA,UAAU,EAAE,cAAc,CAAC,KAAK,GAAG,CAAC;wBACpC,QAAQ,EAAE,cAAc,CAAC,KAAK,GAAG,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC;AAC/D,qBAAA,CAAC,CAAC;oBACH,MAAM;iBACP;aACF;AAED,YAAA,IAAI,cAAc,KAAK,CAAC,EAAE;AACxB,gBAAA,MAAM,KAAK,CAAC,uDAAuD,CAAC,CAAC;aACtE;SACF;;QAGD,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,QAAA,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE;AAC5C,YAAA,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE;AACrC,gBAAA,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;aAC3C;iBAAM;AACL,gBAAA,IAAI,oBAAoB,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,cAAc,CAAC,UAAU,EAAE;AAC9F,oBAAA,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;iBAC3C;aACF;SACF;;AAGD,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;AAE7G,QAAA,OAAO,mBAAmB,CAAC;KAC5B;AAED;;;;AAIG;AACH,IAAA,sBAAsB,CAAC,IAAY,EAAA;QACjC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,8BAA8B,CAAC,CAAC;QAC3D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,8BAA8B,CAAC,CAAC;AAC3D,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;;;AAIG;AACH,IAAA,sBAAsB,CAAC,IAAY,EAAA;QACjC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,+BAA+B,EAAE,IAAI,CAAC,CAAC;QAC3D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,+BAA+B,EAAE,IAAI,CAAC,CAAC;AAC3D,QAAA,OAAO,IAAI,CAAC;KACb;;;AAKD;;;;;;AAMG;AACH,IAAA,mCAAmC,CAAC,UAAkB,EAAA;;QAEpD,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;;QAEjD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;QAC/D,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QACvD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,4BAA4B,CAAC,CAAC;QACrE,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;QACtE,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC;QACpE,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,4BAA4B,CAAC,CAAC;AACrE,QAAA,OAAO,UAAU,CAAC;KACnB;AAED;;;;AAIG;AACH,IAAA,kCAAkC,CAAC,UAAkB,EAAA;QACnD,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACjD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;QAC9D,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QACtD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QACpE,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACrE,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;QACnE,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;AACpE,QAAA,OAAO,UAAU,CAAC;KACnB;;;AAKD;;;;;;;AAOG;AACK,IAAA,kBAAkB,CAAC,IAAY,EAAE,mBAAkC,EAAE,gBAAqB,EAAA;;QAEhG,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,QAAA,KAAK,MAAM,kBAAkB,IAAI,mBAAmB,EAAE;;YAEpD,MAAM,mBAAmB,GAAW,eAAe,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC5H,eAAe,CAAC,IAAI,CAAC;AACnB,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,UAAU,EAAE,mBAAmB;gBAC/B,QAAQ,EAAE,kBAAkB,CAAC,UAAU;gBACvC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,UAAU,CAAC;AAC3E,aAAA,CAAC,CAAC;;YAGH,eAAe,CAAC,IAAI,CAAC;AACnB,gBAAA,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,kBAAkB,CAAC,UAAU;gBACzC,QAAQ,EAAE,kBAAkB,CAAC,QAAQ;AACrC,gBAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,UAAU,EAAE,kBAAkB,CAAC,QAAQ,CAAC;AACnF,aAAA,CAAC,CAAC;SACJ;;QAED,MAAM,mBAAmB,GAAG,eAAe,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;QACpH,eAAe,CAAC,IAAI,CAAC;AACnB,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,UAAU,EAAE,mBAAmB;AAC/B,YAAA,QAAQ,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC;AACzB,YAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC;AAC5C,SAAA,CAAC,CAAC;;AAGH,QAAA,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE;AACrC,YAAA,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE;gBAC9B,OAAO,CAAC,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;aACnD;SACF;;QAGD,IAAI,aAAa,GAAG,EAAE,CAAC;AACvB,QAAA,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE;AACrC,YAAA,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;SACjC;AAED,QAAA,OAAO,aAAa,CAAC;KACtB;AAED;;;;AAIG;AACH,IAAA,YAAY,CAAC,IAAY,EAAA;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;;KAErC;AAED;;;;AAIG;AACH,IAAA,kBAAkB,CAAC,IAAY,EAAA;AAC7B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACjE,QAAA,OAAO,MAAM,CAAC;KACf;+GArWU,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAf,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACLD;;AAEG;MAIU,cAAc,CAAA;IAEzB,WAAoB,CAAA,eAAgC,EAAU,MAAc,EAAA;QAAxD,IAAe,CAAA,eAAA,GAAf,eAAe,CAAiB;QAAU,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;KAC3E;AAED;;;;;;;;;;;;;;AAcG;AACH,IAAA,QAAQ,CAAC,cAAsB,EAAE,UAAe,EAAE,EAAE,KAAW,EAAE,eAAA,GAA2B,IAAI,EAAE,qBAAA,GAA6B,EAAE,EAAE,yBAAA,GAAqC,IAAI,EAAE,OAAA,GAAwB,sBAAsB,EAAE,EAAA;;;;AAK5N,QAAA,IAAI,cAAc,KAAK,MAAM,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC;SAAE;AAC/C,QAAA,IAAI,cAAc,KAAK,WAAW,EAAE;AAAE,YAAA,OAAO,SAAS,CAAC;SAAE;;AAEzD,QAAA,IAAI,cAAc,KAAK,MAAM,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC;SAAE;AAC/C,QAAA,IAAI,cAAc,KAAK,OAAO,EAAE;AAAE,YAAA,OAAO,KAAK,CAAC;SAAE;;AAEjD,QAAA,IAAI,CAAC,KAAK,CAAC,cAAqB,CAAC,EAAG;AAAE,YAAA,OAAO,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;SAAE;;AAE5E,QAAA,IACE,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC/D,aAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAChE,aAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAChE;;AAEA,YAAA,IAAI,aAAa,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3E,YAAA,aAAa,GAAG,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC;AACnG,YAAA,OAAO,aAAa,CAAC;SACtB;;;;;;;AAQD,QAAA,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;;AAG3D,QAAA,IACE,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC/D,aAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAChE;;YAEA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;;AAE/D,YAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,OAAO,CAAC,CAAC;SACjI;;AAGD,QAAA,IAAI,cAAc,KAAK,QAAQ,EAAE;AAC/B,YAAA,OAAO,KAAK,CAAC;SACd;;AAGD,QAAA,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,oBAAoB,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE;AAC5F,YAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,OAAO,CAAC,CAAC;SAC7I;QAED,MAAM,KAAK,CAAC,6EAA6E,GAAG,cAAc,GAAG,GAAG,CAAC,CAAC;KACnH;AAED;;;;AAIG;AACH,IAAA,oBAAoB,CAAC,cAAsB,EAAA;QACzC,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACvE,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;QACzE,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC;AAChF,QAAA,OAAO,cAAc,CAAC;KACvB;AAED;;;;AAIG;AACH,IAAA,oBAAoB,CAAC,cAAsB,EAAA;QACzC,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC;QAC/E,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;QAC7E,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;AAC7E,QAAA,cAAc,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;AACvC,QAAA,OAAO,cAAc,CAAC;KACvB;AAED;;;;;;AAMG;IACK,WAAW,CAAC,UAAkB,EAAE,eAAwB,EAAA;;QAG9D,MAAM,sBAAsB,GAAG,qBAAqB,CAAC;QACrD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,IAAG;AAC9D,YAAA,OAAO,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AACxC,SAAC,CAAC,CAAC;QACH,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;QACpD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,qBAAqB,EAAE,KAAK,IAAG;AAC7D,YAAA,OAAO,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AACxC,SAAC,CAAC,CAAC;;QAGH,MAAM,iBAAiB,GAAG,0BAA0B,CAAC;QACrD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;;AAG7D,QAAA,IAAI,UAAU,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE;AAC1C,YAAA,MAAM,KAAK,CAAC,yEAAyE,CAAC,CAAC;SACxF;AACD,QAAA,IAAI,UAAU,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE;AAC1C,YAAA,MAAM,KAAK,CAAC,yEAAyE,CAAC,CAAC;SACxF;AACD,QAAA,IAAI,UAAU,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE;AAC5C,YAAA,MAAM,KAAK,CAAC,2EAA2E,CAAC,CAAC;SAC1F;;AAGD,QAAA,UAAU,GAAG,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,IAAI,MAAM,CAAC,CAAC;;AAGtF,QAAA,UAAU,GAAG,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,OAAO,CAAC,oBAAoB,EAAE,CAAC,KAAK,KAAI;AAC9F,YAAA,OAAO,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,mCAAmC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AACrF,SAAC,CAAC,CAAC;;AAGH,QAAA,UAAU,GAAG,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,IAAI,aAAa,CAAC,CAAC;;QAG5F,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;;AAGpC,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AAE9C,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;;;;;;;;AASG;AACK,IAAA,yBAAyB,CAAC,UAAkB,EAAE,UAAkB,EAAE,UAAqC,EAAA;;QAE7G,MAAM,oBAAoB,GAAG,KAAK;AAChC,YAAA,YAAY,GAAG,UAAU,GAAG,cAAc,GAAG,GAAG;YAChD,iBAAiB,GAAG,UAAU,GAAG,gBAAgB;AACnD,YAAA,GAAG,CAAC;;QAGJ,MAAM,KAAK,GAAG,KAAK;AACjB,YAAA,UAAU,GAAG,UAAU,GAAG,eAAe,GAAG,GAAG;AAC/C,YAAA,eAAe,GAAG,UAAU,GAAG,iBAAiB;AAClD,YAAA,GAAG,CAAC;QAEJ,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAI;YAC1E,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAC3B,YAAA,OAAO,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;AACvC,SAAC,CAAC,CAAC;KACJ;AAED;;;;;AAKG;IACK,iBAAiB,CAAC,SAAc,EAAE,eAAwB,EAAA;AAChE,QAAA,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE;YAC5B,IAAI,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE;;AAEvC,gBAAA,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,YAAY,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,+BAA+B,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE;oBAC5I,SAAS;iBACV;;gBAED,IAAI,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,gBAAA,aAAa,GAAG,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC;AACnG,gBAAA,SAAS,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC;aACjC;iBAAM,IAAI,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE;gBAC9C,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,CAAC;aAC1D;SACF;KACF;;;AAKD;;;;;;;;;;AAUG;AACK,IAAA,iBAAiB,CAAC,aAAkB,EAAE,OAAY,EAAE,KAAU,EAAE,eAAwB,EAAE,qBAA0B,EAAE,yBAAkC,EAAE,OAAqB,EAAA;AACrL,QAAA,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE;;YAEhC,IAAI,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE;;AAE3C,gBAAA,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,WAAW,EAAE;AACvC,oBAAA,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;;iBAG7B;qBAAM,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,+BAA+B,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE;AACnH,oBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,kCAAkC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;oBACvG,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,OAAO,CAAC,CAAC;iBACxJ;aACF;iBAAM,IAAI,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE;gBAClD,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,OAAO,CAAC,CAAC;aACzI;SACF;AAED,QAAA,OAAO,aAAa,CAAC;KACtB;AAED;;;;;;;;;;;;AAYG;AACH,IAAA,mBAAmB,CAAC,UAAkB,EAAE,UAAe,EAAE,EAAE,KAAW,EAAE,eAAA,GAA2B,IAAI,EAAE,qBAAA,GAA6B,EAAE,EAAE,yBAAA,GAAqC,IAAI,EAAE,OAAA,GAAwB,sBAAsB,EAAE,EAAA;AACnO,QAAA,IAAI;YACF,MAAM,eAAe,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;;AAGhD,YAAA,IAAI,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AACjC,gBAAA,OAAO,OAAO,CAAC;aAChB;;;YAID,MAAM,IAAI,GAAG,EAAE,CAAC;AAChB,YAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,eAAe,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/F,YAAA,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE;;gBAG/B,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;oBAC5B,IAAI,CAAC,IAAI,CAAC;AACR,wBAAA,IAAI,EAAE,UAAU;wBAChB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC7B,qBAAA,CAAC,CAAC;iBACJ;;gBAGD,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;oBACtD,IAAI,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;;oBAG9D,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;AACvD,oBAAA,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,yBAAyB,CAAC,CAAC;oBAC9H,IAAI,CAAC,IAAI,CAAC;AACR,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,KAAK,EAAE,YAAY;AACpB,qBAAA,CAAC,CAAC;iBACJ;;gBAGD,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;;oBAEtD,IAAI,CAAC,yBAAyB,EAAE;AAC9B,wBAAA,MAAM,KAAK,CAAC,iGAAiG,CAAC,CAAC;qBAChH;oBAED,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;;oBAE9D,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,oBAAA,IAAI,UAAU,KAAK,EAAE,EAAE;wBACrB,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;4BACzC,IAAI,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACzC,4BAAA,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,yBAAyB,CAAC,CAAC;AACxG,4BAAA,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;yBACrB;qBACF;;oBAED,IAAI,CAAC,IAAI,CAAC;AACR,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,KAAK,EAAE,WAAW;AACnB,qBAAA,CAAC,CAAC;iBACJ;aACF;AAED,YAAA,IAAI;gBACF,MAAM,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACpE,qBAAqB,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,GAAG,kBAAkB,CAAC;AAClF,gBAAA,OAAO,kBAAkB,CAAC;aAC3B;YAAC,OAAO,CAAC,EAAE;AACV,gBAAA,MAAM,KAAK,CAAC,iCAAiC,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,GAAG,0EAA0E,CAAC,CAAC;aACrK;SACF;QAAC,OAAO,CAAC,EAAE;YACV,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC/B,qBAAqB,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC;AACzE,YAAA,OAAO,SAAS,CAAC;SAClB;KACF;AAED;;;;;;AAMG;IACK,oBAAoB,CAAC,YAAiB,EAAE,IAAW,EAAA;;QAEzD,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,KAAM,WAAW,EAAE;AAClC,YAAA,MAAM,KAAK,CAAC,6EAA6E,CAAC,CAAC;SAC5F;QACD,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,KAAM,WAAW,EAAE;AAClC,YAAA,MAAM,KAAK,CAAC,6EAA6E,CAAC,CAAC;SAC5F;QACD,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,KAAM,aAAa,EAAE;AACpC,YAAA,MAAM,KAAK,CAAC,+EAA+E,CAAC,CAAC;SAC9F;AAED,QAAA,IAAI,YAAY,KAAK,SAAS,EAAE;AAC9B,YAAA,MAAM,KAAK,CAAC,gEAAgE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,GAAG,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,iBAAiB,GAAG,qBAAqB,CAAC,CAAC,CAAC;SAC1L;;AAGD,QAAA,IAAI,MAAM,CAAC;QACX,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE;AAC/B,YAAA,IAAI,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;gBAC9C,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;;;;;AAKrC,gBAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;AAChC,oBAAA,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;iBACpC;;aAEF;AAAM,iBAAA,IAAI,YAAY,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAG;AAChE,gBAAA,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC/C,gBAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;AAChC,oBAAA,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;iBACpC;aACF;iBAAM;gBACL,MAAM,GAAG,SAAS,CAAC;aACpB;SACF;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE;YACtC,MAAM,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;SACzC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;;AAGb,QAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;SAClD;AACD,QAAA,OAAO,MAAM,CAAC;KACf;+GAjYU,cAAc,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAd,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACLD;;AAEG;MAIU,oBAAoB,CAAA;IAE/B,WAAoB,CAAA,cAA8B,EAAU,MAAc,EAAA;QAAtD,IAAc,CAAA,cAAA,GAAd,cAAc,CAAgB;QAAU,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;KACzE;;;AAKD;;;;;;;AAOG;AACH,IAAA,kBAAkB,CAAC,QAA0C,EAAE,OAAY,EAAE,YAAsC,EAAE,OAAqB,EAAA;AACxI,QAAA,KAAK,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;;AAEhE,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;AAC7B,gBAAA,YAAY,CAAC,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC;aAEvC;iBAAM;;AAEL,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AACxB,oBAAA,IAAI;AACF,wBAAA,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAC/C,YAAY,CAAC,GAAG,EAChB,YAAY,CAAC,sBAAsB,GAAG,OAAO,GAAG,EAAE,EAClD,SAAS,EACT,YAAY,CAAC,eAAe,EAC5B,YAAY,CAAC,qBAAqB,EAClC,YAAY,CAAC,yBAAyB,EACtC,OAAO,CACR,CAAC;AACF,wBAAA,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC;qBAC5B;oBAAC,OAAO,CAAM,EAAE;wBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA,oCAAA,CAAsC,GAAG,YAAY,CAAC,QAAQ,GAAI,CAAA,SAAA,CAAW,GAAG,SAAS,GAAG,CAAA,UAAA,CAAY,GAAG,YAAY,CAAC,KAAK,GAAG,CAAA,CAAA,CAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AAClK,wBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;;;AAGtC,wBAAA,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;qBAC5B;;iBAGF;qBAAM;oBACL,IAAI,CAAC,yBAAyB,CAAC,YAAY,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;iBACrE;aACF;SACF;KACF;AAED;;;;;;;;;;;;;;;AAeG;AACK,IAAA,yBAAyB,CAAC,OAAwB,EAAE,OAAY,EAAE,YAAsC,EAAA;AAE9G,QAAA,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;;YAEzD,IAAI,yBAAyB,GAAG,KAAK,CAAC;AACtC,YAAA,KAAK,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE;gBAC7F,MAAM,qBAAqB,GAAG,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;;gBAEvF,MAAM,kBAAkB,GAAG,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,eAAe,EAAE,EAAE,EAAE,YAAY,CAAC,yBAAyB,CAAC,CAAC;AACxL,gBAAA,IAAI,kBAAkB,KAAK,eAAe,EAAE;oBAC1C,yBAAyB,GAAG,IAAI,CAAC;oBACjC,MAAM;iBACP;aACF;;YAGD,IAAI,yBAAyB,EAAE;AAC7B,gBAAA,OAAO,CAAC,qBAAqB,GAAG,EAAE,CAAC;AACnC,gBAAA,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAC1C,OAAO,CAAC,GAAG,EACX,YAAY,CAAC,sBAAsB,GAAG,OAAO,GAAG,EAAE,EAClD,SAAS,EACT,YAAY,CAAC,eAAe,EAC5B,OAAO,CAAC,qBAAqB,EAC7B,YAAY,CAAC,yBAAyB,CACvC,CAAC;aACH;SACF;KACF;;;AAKD;;;;;;AAMG;AACH,IAAA,mBAAmB,CAAC,QAA0C,EAAE,YAAsC,EAAE,OAAqB,EAAA;AAC3H,QAAA,KAAK,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;;;AAGlE,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;gBACzB,aAAa,CAAC,KAAK,GAAG,CAAC,KAAU,EAAE,OAAY,KAAI;AACjD,oBAAA,IAAI;AACF,wBAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,CAC1B,aAAa,CAAC,GAAG,EACjB,YAAY,CAAC,sBAAsB,GAAG,OAAO,GAAG,EAAE,EAClD,KAAK,EACL,YAAY,CAAC,eAAe,EAC5B,aAAa,CAAC,qBAAqB,EACnC,YAAY,CAAC,yBAAyB,CACvC,CAAC;qBACH;oBAAC,OAAO,CAAM,EAAE;wBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA,qCAAA,CAAuC,GAAG,YAAY,CAAC,QAAQ,GAAI,CAAA,UAAA,CAAY,GAAG,UAAU,GAAG,CAAA,UAAA,CAAY,GAAG,aAAa,CAAC,KAAK,GAAG,CAAA,CAAA,CAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AACtK,wBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;qBACvC;AACH,iBAAC,CAAC;AACF,gBAAA,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC;aAC7B;SACF;KACF;+GAnIU,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAD,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAApB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACDD;;AAEG;MAIU,mBAAmB,CAAA;IAE9B,WACU,CAAA,QAAkB,EAClB,cAAgD,EAChD,eAAoC,EACpC,aAA4B,EAC5B,oBAA0C,EAC1C,MAAc,EAAA;QALd,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAU;QAClB,IAAc,CAAA,cAAA,GAAd,cAAc,CAAkC;QAChD,IAAe,CAAA,eAAA,GAAf,eAAe,CAAqB;QACpC,IAAa,CAAA,aAAA,GAAb,aAAa,CAAe;QAC5B,IAAoB,CAAA,oBAAA,GAApB,oBAAoB,CAAsB;QAC1C,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;KAEvB;AAED;;;;;;;;AAQG;IACH,OAAO,CAAC,aAAgC,EAAE,QAAkB,EAAE,SAAwB,EAAE,SAAwB,EAAE,OAAqB,EAAA;;QAGrI,MAAM,OAAO,GAAiB,EAAE,CAAC;AACjC,QAAA,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE;AAClC,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpE,IAAI,cAAc,EAAE;AAClB,gBAAA,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;aAC9B;SACF;;QAGD,MAAM,YAAY,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;;AAGpE,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;;AAG7C,QAAA,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,EAAE;AAC1B,YAAA,OAAO,YAAY,CAAC;SACvB;;QAGD,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;;QAGzE,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,QAAA,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;AACtC,YAAA,IAAI,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAC9E,IAAI,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;oBACrD,SAAS;iBACV;AACD,gBAAA,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;oBACtD,SAAS;iBACV;aACF;AACD,YAAA,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SACnC;AAED,QAAA,OAAO,eAAe,CAAC;KACxB;AAED;;;;;;;;;;;;;AAaG;AACH,IAAA,YAAY,CAAC,WAA4B,EAAE,QAAkB,EAAE,OAAqB,EAAA;;AAElF,QAAA,IAAI,WAAW,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE;;AAE3C,YAAA,MAAM,aAAa,GAAG,oBAAoB,CAAC,WAAkB,CAAC,CAAC;YAC/D,IAAI,aAAa,EAAE;gBACjB,OAAO,IAAI,CAAC,wBAAwB,CAAC,EAAC,SAAS,EAAE,WAAkB,EAAC,CAAC,CAAC;;aAEvE;iBAAM;;AAEL,gBAAA,IAAI;AACF,oBAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;;iBAElC;gBAAC,OAAO,CAAC,EAAE;oBACV,OAAO,IAAK,WAA0C,EAAE,CAAC;iBAC1D;aACF;SACF;;AAGI,aAAA,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;;YAExC,IAAI,WAAW,CAAC,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC7C,gBAAA,OAAO,WAAyB,CAAC;;aAElC;iBAAM;AACL,gBAAA,IAAI;AACF,oBAAA,OAAO,IAAI,CAAC,wBAAwB,CAAC,WAAuC,CAAC,CAAC;iBAC/E;gBAAC,OAAO,CAAM,EAAG;AAChB,oBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,0BAA0B,GAAG,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;AAClF,oBAAA,OAAO,IAAI,CAAC;iBACb;aACF;SACF;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,0BAA0B,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAA;AACrE,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;;;AAIG;AACK,IAAA,wBAAwB,CAAC,MAAgC,EAAA;QAC/D,IACE,CAAC,MAAM,CAAC,cAAc,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,cAAc;aAChE,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;AACzD,aAAC,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,EAC9D;AACA,YAAA,OAAO,IAAI,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;SAC/G;aAAM;AACL,YAAA,OAAO,IAAI,yBAAyB,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;SACpH;KACF;AAED;;;;;AAKG;IACH,uBAAuB,CAAC,OAAqB,EAAE,OAAqB,EAAA;QAClE,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,YAAA,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,UAAU,IAAI,OAAO,MAAM,CAAC,gBAAgB,KAAK,UAAU,EAAE;AAC3F,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,oIAAoI,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC3K,SAAS;aACV;AACD,YAAA,IAAI,OAAO,MAAM,CAAC,aAAa,KAAK,UAAU,EAAE;AAC9C,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,8FAA8F,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;gBACrI,SAAS;aACV;AACD,YAAA,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,UAAU,EAAE;AAC5C,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,4FAA4F,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;gBACnI,SAAS;aACV;AACD,YAAA,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC3B;AACD,QAAA,OAAO,YAAY,CAAC;KACrB;AAED;;;;;AAKG;IACH,gBAAgB,CAAC,OAAqB,EAAE,OAAqB,EAAA;QAC3D,MAAM,WAAW,GAAa,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,SAAS,CAAa,CAAC;QAChH,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,MAAM,kBAAkB,GAAa,EAAE,CAAC;AACxC,QAAA,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;AACpC,YAAA,IAAI,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AAClF,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe,GAAG,UAAU,GAAG,2EAA2E,CAAC,EAAE,OAAO,CAAC,CAAC;AACxI,gBAAA,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aACrC;AACD,YAAA,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SAChC;KACF;AAED;;;;;;;AAOG;AACH,IAAA,sBAAsB,CAAC,OAAqB,EAAE,SAAwB,EAAE,SAAwB,EAAE,OAAqB,EAAA;QACrH,MAAM,WAAW,GAAa,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,SAAS,CAAa,CAAC;QAChH,IAAI,SAAS,EAAE;AACb,YAAA,KAAK,MAAM,iBAAiB,IAAI,SAAS,EAAE;gBACzC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;AAC5C,oBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,2BAA2B,GAAG,iBAAiB,GAAG,gGAAgG,CAAC,EAAE,OAAO,CAAC,CAAC;iBACjL;aACF;SACF;QACD,IAAI,SAAS,EAAE;AACb,YAAA,KAAK,MAAM,iBAAiB,IAAI,SAAS,EAAE;gBACzC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;AAC5C,oBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,2BAA2B,GAAG,iBAAiB,GAAG,gGAAgG,CAAC,EAAE,OAAO,CAAC,CAAC;iBACjL;aACF;SACF;KACF;+GA1MU,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,EAAA,EAAA,KAAA,EAAAE,gCAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,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,CAAA,EAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACXD;;AAEG;MAIU,gBAAgB,CAAA;AAE3B,IAAA,WAAA,CACU,mBAAwC,EAAA;QAAxC,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB,CAAqB;KAEjD;AAED;;;;;;;;;;;;AAYG;IACI,OAAO,CACZ,QAAkB,EAClB,OAAY,EACZ,WAAwC,EACxC,gBAA6C,EAC7C,cAAyC,EACzC,YAAuC,GAAA,IAAI,EAC3C,YAAkC,GAAA,IAAI,EACtC,sBAAwC,GAAA,IAAI,EAC5C,sBAAA,GAAwC,IAAI,EAAA;QAK5C,IAAI,gBAAgB,GAAyB,EAAE,CAAC;AAChD,QAAA,WAAW,GAAG,WAAW,IAAI,EAAE,CAAC;AAChC,QAAA,gBAAgB,GAAG,gBAAgB,IAAI,EAAE,CAAC;AAC1C,QAAA,cAAc,GAAG,cAAc,IAAI,EAAE,CAAC;QACtC,MAAM,eAAe,GAAyB,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC;;AAGpF,QAAA,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,WAAW,KAAK,uBAAuB,CAAC,MAAM,EAAE;AAClH,YAAA,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC;gBACpC,eAAe;AACf,gBAAA,GAAG,gBAAgB;gBACnB,EAAC,OAAO,EAAE,YAAY,IAAI,SAAS,EAAE,OAAO,EAAE,YAAY,IAAI,SAAS,EAAC;AACzE,aAAA,CAAC,CAAC;SAEJ;aAAM,IAAI,cAAc,CAAC,WAAW,KAAK,uBAAuB,CAAC,GAAG,EAAE;;AAErE,YAAA,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC;gBACpC,eAAe;AACf,gBAAA,GAAG,WAAW;AACd,gBAAA,GAAG,gBAAgB;AACnB,gBAAA,EAAC,OAAO,EAAE,YAAY,IAAI,SAAS,EAAC;AACrC,aAAA,CAAC,CAAC;SAEJ;aAAM;AACL,YAAA,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC;gBACpC,eAAe;AACf,gBAAA,cAAc,IAAI,EAAE;AACpB,gBAAA,EAAC,OAAO,EAAE,YAAY,IAAI,SAAS,EAAC;AACrC,aAAA,CAAC,CAAA;SACH;AAED,QAAA,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAQ,CAAC;;AAG/C,QAAA,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC1C,YAAA,YAAY,CAAC,QAAQ,GAAG,KAAK,CAAC;SACjC;;QAGC,IAAI,YAAY,GAAiB,EAAE,CAAC;QACpC,IAAI,YAAY,EAAE;AAChB,YAAA,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;SACnG;AAAM,aAAA,IAAI,gBAAgB,CAAC,OAAO,EAAE;AACnC,YAAA,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,YAAY,CAAC,CAAC;SACnJ;QAED,OAAO;AACL,YAAA,OAAO,EAAE,YAAY;AACrB,YAAA,OAAO,EAAE,YAAY;SACtB,CAAC;KACH;AAED;;;;AAIG;AACK,IAAA,aAAa,CAAC,aAAqC,EAAA;QACzD,MAAM,cAAc,GAAyB,EAAE,CAAC;AAEhD,QAAA,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE;;AAEpC,YAAA,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE;AAClC,gBAAA,IAAI,cAAc,CAAC,OAAO,KAAK,SAAS,EAAE;AACxC,oBAAA,cAAc,CAAC,OAAO,GAAG,EAAE,CAAC;iBAC7B;AACD,gBAAA,KAAK,MAAM,WAAW,IAAI,QAAQ,CAAC,OAAO,EAAE;oBAC1C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;AACjD,wBAAA,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;qBAC1C;iBACF;aACF;;AAED,YAAA,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE;AAClC,gBAAA,IAAI,cAAc,CAAC,OAAO,KAAK,SAAS,EAAE;AACxC,oBAAA,cAAc,CAAC,OAAO,GAAG,EAAE,CAAC;iBAC7B;AAED,gBAAA,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;aACzF;SACF;AAED,QAAA,OAAO,cAAc,CAAC;KACvB;AAED;;;;;AAKG;IACK,eAAe,CAAE,CAAM,EAAE,CAAM,EAAA;AACrC,QAAA,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC,CAAC;AAC9B,QAAA,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,CAAC,GAAG,EAAE,CAAC;AAC5B,QAAA,KAAK,MAAM,GAAG,IAAI,CAAC,EAAE;AACjB,YAAA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;SACjD;AACD,QAAA,OAAO,CAAC,CAAC;KACV;+GApIU,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACHD,MAAM,6BAA6B,GAAG,qCAAqC,CAAC;AA+B5E;;AAEG;MAIU,cAAc,CAAA;IAEzB,WAAoB,CAAA,eAAoC,EAAU,MAAc,EAAA;QAA5D,IAAe,CAAA,eAAA,GAAf,eAAe,CAAqB;QAAU,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;KAC/E;AAED;;;;;;;;;AASG;IACH,aAAa,CAAC,OAAY,EAAE,OAAY,EAAE,OAAqB,EAAE,KAAa,EAAE,OAAqB,EAAE,SAAoB,EAAA;;AAEzH,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,YAAA,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,UAAU,EAAE;AAC1C,gBAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;gBACxE,MAAM;aACP;SACF;KACF;AAED;;;;;;;;;;AAUG;IACH,YAAY,CAAC,OAAY,EAAE,OAAY,EAAE,OAAqB,EAAE,KAAa,EAAE,OAAqB,EAAE,SAAoB,EAAE,cAAA,GAAiE,EAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAC,EAAA;QAClN,IAAI,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;;;QAI7D,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,MAAM,cAAc,GAAyB,EAAE,CAAC;AAChD,QAAA,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAClC,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;gBAC9C,aAAa,IAAI,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;aACjE;iBAAM;AACL,gBAAA,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC;AACxC,gBAAA,aAAa,IAAI,CAAG,EAAA,6BAA6B,CAAK,EAAA,EAAA,MAAM,IAAI,CAAC;AACjE,gBAAA,cAAc,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;aACpC;SACF;;QAGD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;AACpD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;;QAGrF,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,aAAa,EAAE;AACjD,YAAA,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9D,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;;AAGzD,YAAA,cAAc,CAAC,KAAK,GAAG,EAAC,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,cAAc,EAAC,CAAC;SACrE;;QAGD,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE;AAC5C,YAAA,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;gBAClC,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;oBAC9C,IAAI,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;oBAC1D,IAAI,IAAI,EAAE;AACR,wBAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,CAAA,EAAG,6BAA6B,CAAY,UAAA,CAAA,EAAE,GAAG,CAAC,CAAC,CAAC;;AAG9F,wBAAA,IAAI,OAAO,CAAC,MAAM,EAAE;4BAClB,MAAM,oBAAoB,GAAG,EAAE,CAAC;4BAChC,IAAI,UAAU,GAAG,CAAC,CAAC;;AAGnB,4BAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAC3B,gCAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gCAC3D,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gCAE3C,IAAI,UAAU,EAAE;AACd,oCAAA,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;iCAC5E;gCACD,IAAI,eAAe,IAAI,cAAc,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE;oCAC5D,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;AACjE,oCAAA,OAAO,cAAc,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;iCAC9C;gCAED,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;6BAC5C;4BACD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;4BACjD,IAAI,aAAa,EAAE;AACjB,gCAAA,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;6BAC/E;;4BAGD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;AAC7D,4BAAA,KAAK,MAAM,eAAe,IAAI,oBAAoB,EAAE;gCAClD,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;6BACvE;4BACD,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;;4BAGpD,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;yBACzD;qBACF;iBACF;aACF;SACF;;AAGD,QAAA,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAClC,IAAI,SAAS,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,EAAE;AACzC,gBAAA,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;aAC3F;SACF;KACF;AAED;;;;;;;;;AASG;IACH,IAAI,CAAC,OAAe,EAAE,OAAY,EAAE,OAAqB,EAAE,KAAa,EAAE,OAAqB,EAAE,SAAoB,EAAA;AACnH,QAAA,IAAI,OAAO,KAAK,EAAE,EAAE;YAClB,OAAO;AACL,gBAAA,OAAO,EAAE,OAAO;AAChB,gBAAA,SAAS,EAAE,SAAS;aACrB,CAAA;SACF;;AAGD,QAAA,IAAI,OAAO,CAAC,mBAAmB,EAAE;AAC/B,YAAA,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;SAC7C;;QAGD,IAAI,aAAa,GAA4B,EAAE,CAAC;AAChD,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,YAAA,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,UAAU,EAAE;AAC1C,gBAAA,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;oBACtE,aAAa,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,YAAY,EAAC,CAAC,CAAC;iBAC5C;aACF;SACF;QACD,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,oBAAoB,GAAG,CAAC,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC;;QAGxG,aAAa,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;;QAG5E,MAAM,2BAA2B,GAAyB,EAAE,CAAC;AAC7D,QAAA,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE;AAC9B,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;;AAGjD,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;;YAGpE,2BAA2B,CAAC,IAAI,CAAC;AAC/B,gBAAA,UAAU,EAAE,EAAE,CAAC,YAAY,CAAC,oBAAoB;AAChD,gBAAA,QAAQ,EAAE,EAAE,CAAC,YAAY,CAAC,kBAAkB;gBAC5C,WAAW,EAAE,CAAI,CAAA,EAAA,gBAAgB,CAAI,CAAA,EAAA,gBAAgB,CAAK,EAAA,EAAA,MAAM,CAAK,EAAA,EAAA,oBAAoB,CAAK,EAAA,EAAA,KAAK,CAAI,EAAA,CAAA;AACxG,aAAA,CAAC,CAAC;YACH,2BAA2B,CAAC,IAAI,CAAC;AAC/B,gBAAA,UAAU,EAAE,YAAY,CAAC,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,oBAAqB,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB;AAC/G,gBAAA,QAAQ,EAAE,YAAY,CAAC,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAmB,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB;gBAC3G,WAAW,EAAE,CAAK,EAAA,EAAA,gBAAgB,CAAG,CAAA,CAAA;AACtC,aAAA,CAAC,CAAC;;YAGH,SAAS,CAAC,MAAM,CAAC,GAAG;AAClB,gBAAA,EAAE,EAAE,MAAM;gBACV,MAAM,EAAE,EAAE,CAAC,MAAM;AACjB,gBAAA,KAAK,EAAE;oBACL,UAAU,EAAE,YAAY,CAAC,UAAU;oBACnC,UAAU,EAAE,YAAY,CAAC,UAAU;AACnC,oBAAA,OAAO,EAAE,IAAI;AACb,oBAAA,eAAe,EAAE,IAAI;AACtB,iBAAA;AACD,gBAAA,IAAI,EAAE,IAAI;AACV,gBAAA,MAAM,EAAE,KAAK;AACb,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,gBAAgB,EAAE,IAAI;AACtB,gBAAA,YAAY,EAAE,IAAI;gBAClB,WAAW,EAAE,IAAI,GAAG,EAAE;AACtB,gBAAA,mBAAmB,EAAE,EAAE;AACvB,gBAAA,sBAAsB,EAAE,EAAE;aAC3B,CAAC;;YAGF,IAAI,YAAY,CAAC,SAAS,IAAI,OAAO,CAAC,gBAAgB,EAAE;gBACtD,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,UAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAC7H,gBAAA,YAAY,CAAC,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC;AAChD,gBAAA,YAAY,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;gBAEjD,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAC5H,gBAAA,YAAY,CAAC,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC;AACjD,gBAAA,YAAY,CAAC,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC;gBAEjD,OAAO,GAAG,YAAY,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC;aAC1I;SACF;;;;QAKD,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;YACxC,IAAI,UAAU,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;YAC7C,IAAI,UAAU,KAAK,CAAC;gBAAE,UAAU,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;AAC3D,YAAA,OAAO,UAAU,CAAC;AACpB,SAAC,CAAC,CAAC;AAEH,QAAA,KAAK,MAAM,0BAA0B,IAAI,2BAA2B,EAAE;AACpE,YAAA,MAAM,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,0BAA0B,CAAC,UAAU,CAAC,CAAC;YACvF,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;YACjF,OAAO,GAAG,kBAAkB,GAAG,0BAA0B,CAAC,WAAW,GAAG,iBAAiB,CAAC;SAC3F;QAED,OAAO;AACL,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,SAAS,EAAE,SAAS;SACrB,CAAC;KACH;AAED;;;;;AAKG;IACK,eAAe,CAAC,YAA0B,EAAE,OAAe,EAAA;QACjE,MAAM,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,oBAAoB,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC7H,OAAO;AACL,YAAA,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,oBAAoB,CAAC;AACnE,YAAA,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,oBAAoB,EAAE,YAAY,CAAC,kBAAkB,CAAC;YACjG,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,kBAAkB,EAAE,YAAY,CAAC,oBAAqB,CAAC,GAAG,IAAI;YACrH,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,oBAAqB,EAAE,YAAY,CAAC,kBAAmB,CAAC,GAAG,IAAI;YACtH,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,kBAAmB,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,kBAAkB,CAAC;SAChI,CAAC;KACH;AAED;;;;;;AAMG;AACK,IAAA,qBAAqB,CAAC,aAAsC,EAAE,OAAe,EAAE,OAAqB,EAAA;QAC1G,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,QAAA,SAAS,EAAE,KAAK,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE;YACtE,MAAM,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,oBAAoB,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACvJ,YAAA,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC;;YAG1C,IAAI,OAAO,CAAC,oBAAoB,IAAI,OAAO,CAAC,kBAAkB,EAAE;AAC9D,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,4FAA4F,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;gBACnI,SAAS;aACV;YACD,IAAI,SAAS,IAAI,OAAO,CAAC,kBAAkB,GAAG,OAAO,CAAC,oBAAqB,EAAE;AAC3E,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,4FAA4F,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;gBACnI,SAAS;aACV;YACD,IAAI,SAAS,IAAI,OAAO,CAAC,oBAAqB,IAAI,OAAO,CAAC,kBAAmB,EAAE;AAC7E,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,4FAA4F,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;gBACnI,SAAS;aACV;;YAGD,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACpD,YAAA,SAAS,EAAE,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE;AACnD,gBAAA,MAAM,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC;gBAC9C,MAAM,eAAe,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC;;AAGjI,gBAAA,IACE,OAAO,CAAC,oBAAoB,KAAK,WAAW,CAAC,oBAAoB;AACjE,oBAAA,OAAO,CAAC,kBAAkB,KAAK,WAAW,CAAC,kBAAkB;AAC7D,qBAAC,CAAC,SAAS,IAAI,CAAC,eAAe,KAC7B,OAAO,CAAC,oBAAoB,KAAK,WAAW,CAAC,oBAAoB;wBACjE,OAAO,CAAC,kBAAkB,KAAK,WAAW,CAAC,kBAAkB,CAC9D,CAAC,EACA;AACF,oBAAA,IAAI,CAAC,sBAAsB,CAAC,0JAA0J,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAChO,oBAAA,SAAS,SAAS,CAAC;iBACpB;;gBAGD,IAAI,OAAO,CAAC,oBAAoB,GAAG,WAAW,CAAC,kBAAkB,EAAE;AACjE,oBAAA,IAAI,CAAC,sBAAsB,CAAC,2FAA2F,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACjK,oBAAA,SAAS,SAAS,CAAC;iBACpB;;;gBAKD,IAAI,eAAe,IAAI,EACrB,OAAO,CAAC,kBAAkB,IAAI,WAAW,CAAC,oBAAqB;oBAC/D,OAAO,CAAC,oBAAoB,IAAI,WAAW,CAAC,kBAAmB,CAChE,EAAE;AACD,oBAAA,IAAI,CAAC,sBAAsB,CAAC,4FAA4F,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAClK,oBAAA,SAAS,SAAS,CAAC;iBACpB;;AAGD,gBAAA,IAAI,eAAe,IAAI,SAAS,IAAI,EAClC,OAAO,CAAC,kBAAmB,IAAI,WAAW,CAAC,oBAAqB;oBAChE,OAAO,CAAC,oBAAqB,IAAI,WAAW,CAAC,kBAAmB,CACjE,EAAE;AACD,oBAAA,IAAI,CAAC,sBAAsB,CAAC,4FAA4F,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAClK,oBAAA,SAAS,SAAS,CAAC;iBACpB;;gBAGD,IAAI,SAAS,IAAI,eAAe;AAC9B,oBAAA,OAAO,CAAC,kBAAkB,IAAI,WAAW,CAAC,oBAAqB;AAC/D,oBAAA,OAAO,CAAC,oBAAqB,IAAI,WAAW,CAAC,kBAAmB,EAC9D;AACA,oBAAA,IAAI,CAAC,sBAAsB,CAAC,4GAA4G,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAClL,oBAAA,SAAS,SAAS,CAAC;iBACtB;aACF;;AAGD,YAAA,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SACzC;AAED,QAAA,OAAO,oBAAoB,CAAC;KAC7B;AAED;;;;;;;;AAQG;IACK,sBAAsB,CAAC,OAAe,EAAE,OAAqB,EAAE,WAAyB,EAAE,OAAe,EAAE,OAAqB,EAAA;QACtI,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAE5D,QAAA,MAAM,YAAY,GAAG;YACnB,UAAU,EAAE,gBAAgB,CAAC,UAAU;YACvC,oBAAoB,EAAE,WAAW,CAAC,oBAAoB;YACtD,kBAAkB,EAAE,WAAW,CAAC,kBAAkB;YAClD,UAAU,EAAE,gBAAgB,CAAC,UAAU;YACvC,oBAAoB,EAAE,WAAW,CAAC,oBAAoB;YACtD,kBAAkB,EAAE,WAAW,CAAC,kBAAkB;SACnD,CAAC;AACF,QAAA,MAAM,QAAQ,GAAG;YACf,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;YAClD,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;YAClD,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;SAC/C,CAAC;AAEF,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;KACnG;AAED;;;;;;;;;;;;;;;;;AAiBG;IACK,kBAAkB,CAAC,SAAiB,EAAE,aAAqB,EAAE,kBAA0B,EAAE,UAAkB,EAAE,cAAsB,EAAE,oBAA4B,EAAA;QACvK,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAC/B,IAAI,mBAAmB,GAAG,KAAK,CAAC;;QAGhC,MAAM,kBAAkB,GAAG,SAAS,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAChE,MAAM,yBAAyB,GAAG,SAAS,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;QAC5E,IACE,CAAC,kBAAkB,IAAI,CAAC,IAAI,yBAAyB,KAAK,CAAC,CAAC;AAC5D,aAAC,kBAAkB,GAAG,yBAAyB,CAAC,EAChD;YACA,kBAAkB,GAAG,IAAI,CAAC;SAC3B;;QAGD,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC/D,MAAM,2BAA2B,GAAG,UAAU,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAC7E,QAAA;;QAEE,CAAC,mBAAmB,IAAI,CAAC,IAAI,2BAA2B,KAAK,CAAC,CAAC;AAC/D,aAAC,mBAAmB,GAAG,2BAA2B,CAAC,EACnD;YACA,mBAAmB,GAAG,IAAI,CAAC;SAC5B;;AAGD,QAAA,IAAI,kBAAkB,IAAI,mBAAmB,EAAE;AAC7C,YAAA,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,kBAAkB,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,kBAAkB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AAC3J,YAAA,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,mBAAmB,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,mBAAmB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;SACnK;;QAGD,OAAO;AACL,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,UAAU,EAAE,UAAU;SACvB,CAAC;KACH;AAED;;;;AAIG;AACH,IAAA,mBAAmB,CAAC,IAAY,EAAA;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,UAAU,KAAI;;AAE5D,YAAA,IAAI,UAAU,MAAM,QAAQ,CAAC,EAAE;AAAE,gBAAA,OAAO,GAAG,CAAC;aAAE;YAC9C,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,GAAG,CAAE,CAAC;AACrD,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,MAAM,CAAC;KACf;+GA9bU,cAAc,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAAR,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAd,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;AC5BD;;AAEG;MAIU,iBAAiB,CAAA;IAE5B,WAAoB,CAAA,eAAoC,EAAU,MAAc,EAAA;QAA5D,IAAe,CAAA,eAAA,GAAf,eAAe,CAAqB;QAAU,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;KAC/E;AAED;;;;;;;;;AASG;IACH,IAAI,CAAC,cAAmB,EAAE,OAAY,EAAE,OAAqB,EAAE,KAAa,EAAE,OAAqB,EAAE,SAAoB,EAAA;;QAGvH,IAAI,aAAa,GAAmC,EAAE,CAAC;AACvD,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,YAAA,IAAI,OAAO,MAAM,CAAC,gBAAgB,KAAK,UAAU,EAAE;AACjD,gBAAA,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;oBACnF,aAAa,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,WAAW,EAAC,CAAC,CAAC;iBAC3C;aACF;SACF;QACD,aAAa,GAAG,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;;QAGtI,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,aAAa,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;;AAGlF,QAAA,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE;AAC9B,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;;YAGjD,SAAS,CAAC,MAAM,CAAC,GAAG;AAClB,gBAAA,EAAE,EAAE,MAAM;gBACV,MAAM,EAAE,EAAE,CAAC,MAAM;AACjB,gBAAA,KAAK,EAAE;oBACL,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC,WAAW,CAAC;oBAC9D,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC,WAAW,CAAC;oBAC9D,OAAO,EAAE,EAAE,CAAC,WAAW;oBACvB,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC,WAAW,CAAC;AACnE,iBAAA;AACD,gBAAA,IAAI,EAAE,IAAI;AACV,gBAAA,MAAM,EAAE,KAAK;AACb,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,gBAAgB,EAAE,IAAI;AACtB,gBAAA,YAAY,EAAE,IAAI;gBAClB,WAAW,EAAE,IAAI,GAAG,EAAE;AACtB,gBAAA,mBAAmB,EAAE,EAAE;AACvB,gBAAA,sBAAsB,EAAE,EAAE;aAC3B,CAAC;;AAGF,YAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC,WAAW,EAAE,gBAAgB,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvF,YAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC,WAAW,EAAE,oBAAoB,EAAE,KAAK,CAAC,CAAC;SAChF;AAED,QAAA,OAAO,SAAS,CAAC;KAClB;AAED;;;;;;AAMG;AACK,IAAA,oBAAoB,CAAC,aAA6C,EAAE,cAAmB,EAAE,OAAqB,EAAA;QACpH,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,QAAA,KAAK,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE;YAC3D,MAAM,4BAA4B,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC1E,MAAM,4BAA4B,GAAG,4BAA4B,CAAC,SAAS,CAAC,KAAK,IAAI,KAAK,CAAC,WAAW,KAAK,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;;AAG1I,YAAA,IACE,4BAA4B;AAC5B,gBAAA,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AAC3F,gBAAA,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAC/F;AACA,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,kKAAkK,EAAE,YAAY,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAA;gBACzN,SAAS;aACV;;AAGD,YAAA,IAAI,uBAAuB,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE;;gBAErD,SAAS;aACV;;AAGD,YAAA,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SACzC;AAED,QAAA,OAAO,oBAAoB,CAAC;KAC7B;+GAlGU,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAQ,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAAR,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;AChBD,MAAM,uBAAuB,GAAG,wCAAwC,CAAC;AACzE,MAAM,yBAAyB,GAAG,IAAI,MAAM,CAAC,CAAO,IAAA,EAAA,uBAAuB,CAAM,IAAA,CAAA,EAAE,GAAG,CAAC,CAAC;AAExF;;AAEG;MAIU,gBAAgB,CAAA;AAI3B,IAAA,WAAA,CAAoB,eAAoC,EAAA;QAApC,IAAe,CAAA,eAAA,GAAf,eAAe,CAAqB;AAFxD,QAAA,IAAA,CAAA,aAAa,GAAG,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;KAEpB;AAE5D;;;;;;AAMG;AACH,IAAA,QAAQ,CAAC,cAAmB,EAAE,SAAoB,EAAE,KAAa,EAAA;QAC/D,MAAM,mBAAmB,GAAyB,EAAE,CAAC;;;QAIrD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;YAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAA,CAAA,EAAI,gBAAgB,CAAA,EAAA,EAAK,IAAI,CAAC,EAAE,CAAM,GAAA,EAAA,oBAAoB,CAAK,EAAA,EAAA,KAAK,CAAI,EAAA,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3J,IAAI,aAAa,EAAE;AACjB,gBAAA,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC;gBAE7C,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;gBACxE,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;gBAErE,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC;AACvF,gBAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC5F,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,KAAK,CAAC,CAAC;gBACnF,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,aAAa,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;gBACpF,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAC/D,gBAAA,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE;oBAC7B,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;iBAC5D;aACF;SACF;;QAGD,IAAI,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACrE,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;;AAGzE,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;AACnC,QAAA,OAAO,CAAC,IAAI,GAAG,MAAK,GAAG,CAAC;QACxB,IAAI,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAClE,QAAA,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC;;AAG7B,QAAA,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;AAC9D,QAAA,cAAc,CAAC,SAAS,GAAG,kBAAkB,IAAI,EAAE,CAAC;;AAGpD,QAAA,KAAK,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE;YACzE,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAA,EAAG,uBAAuB,CAAI,CAAA,EAAA,gBAAgB,KAAK,MAAM,CAAA,EAAA,CAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACrJ,IAAI,kBAAkB,EAAE;gBACtB,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;gBAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;gBAC1E,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,aAAa,EAAE,aAAa,EAAE,kBAAkB,CAAC,CAAC;gBACpF,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;AACpE,gBAAA,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE;oBAC7B,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;iBACvD;;AAGD,gBAAA,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;aAC1C;SACF;AAED,QAAA,OAAO,cAAc,CAAC;KACvB;AAED;;;;AAIG;AACK,IAAA,oBAAoB,CAAC,OAAY,EAAA;;QAErC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;;AAGhE,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI;gBACF,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAE,CAAC,CAAC;aACxG;AAAC,YAAA,OAAO,CAAC,EAAE,GAAE;;AAEd,YAAA,IAAI;;gBAEF,IAAI,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,oBAAoB,EAAE;oBAC9D,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;iBACrD;aACF;AAAC,YAAA,OAAO,CAAC,EAAE,GAAE;SACf;;AAGD,QAAA,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC;;AAGrH,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAChG,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;AACnF,QAAA,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;AAC1C,YAAA,IAAI;gBACF,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,mBAAmB,EAAE,aAAa,CAAE,CAAC,CAAC;aACnI;AAAC,YAAA,OAAO,CAAC,EAAE,GAAE;SACf;AAED,QAAA,OAAO,OAAO,CAAC;KAClB;;;AAKD;;;;;AAKG;IACK,iBAAiB,CAAC,OAAe,EAAE,WAAmB,EAAA;QAC5D,IAAI,cAAc,GAAG,OAAO,CAAC;QAE7B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAC/C,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAE1C,QAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAC3B,YAAA,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;AAC/B,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAE/C,MAAM,kBAAkB,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AACnE,YAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;YAChG,MAAM,iBAAiB,GAAG,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC7D,YAAA,cAAc,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;SAC9E;AAED,QAAA,OAAO,cAAc,CAAC;KACvB;AAED;;;;AAIG;AACK,IAAA,eAAe,CAAC,OAAe,EAAA;QACrC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACjD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACjD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AACjD,QAAA,OAAO,OAAO,CAAC;KAChB;AAED;;;;AAIG;AACK,IAAA,eAAe,CAAC,OAAe,EAAA;QACrC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QACjD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QACjD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;AACjD,QAAA,OAAO,OAAO,CAAC;KAChB;+GAlKU,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAQ,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACAD;;AAEG;MAIU,YAAY,CAAA;;;AAKvB,IAAA,WAAA,CAAoB,MAAc,EAAA;QAAd,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;KACjC;AAED;;;;;;;AAOG;IACH,OAAO,CAAC,CAAM,EAAE,CAAM,EAAE,YAAqB,EAAE,OAAwB,GAAA,sBAAsB,EAAE,EAAA;QAC7F,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AAE7D,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,IAAI,IAAI,YAAY,CAAC,MAAM,KAAK,IAAI,EAAE;AAChE,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,6GAA6G;gBAC7G,UAAU,EAAE,CAAC,EAAE,CAAC;aACjB,EAAE,OAAO,CAAC,CAAC;AACZ,YAAA,OAAO,KAAK,CAAC;SACd;AAED,QAAA,OAAO,YAAY,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAAC;KACpD;AAED;;;;;;;;AAQG;IACH,iBAAiB,CAAC,GAAQ,EAAE,KAAc,EAAA;AACxC,QAAA,IAAI;;AAEF,YAAA,MAAM,YAAY,GAAG,EAAC,KAAK,EAAE,CAAC,EAAC,CAAC;AAChC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;AAE/D,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,KAAK,KAAI;;AAE7D,gBAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,oBAAA,OAAO,WAAW,CAAC;iBACpB;;AAED,gBAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;AAC/B,oBAAA,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;iBACzB;;AAED,gBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,oBAAA,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;iBACzB;AACD,gBAAA,OAAO,KAAK,CAAC;AACf,aAAC,CAAC,CAAC;YAEH,OAAO,EAAC,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,CAAC,KAAK,EAAC,CAAC;SACrE;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,EAAC,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAC,CAAC;SAC7C;KACF;AAED;;;;;;;AAOG;IACH,OAAO,CAAC,GAAQ,EAAE,KAAA,GAAe,EAAE,EAAE,KAAA,GAAgB,CAAC,EAAE,YAAgC,EAAA;AACtF,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE;YACxB,YAAY,CAAC,KAAK,EAAE,CAAC;AACrB,YAAA,OAAO,IAAI,CAAC;SACb;AAED,QAAA,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,YAAY,IAAI,EAAE;AACxD,YAAA,OAAO,GAAG,CAAC;SACd;;;;;;;;;;;;;;AAeD,QAAA,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE;YAC5B,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE;AAC3C,gBAAA,OAAO,IAAI,CAAC;aACb;SACF;QAED,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAE9B,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACtB,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,YAAA,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE;AACvB,gBAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;aAC5D;AACD,YAAA,OAAO,QAAQ,CAAC;SACjB;aAAM;YACL,MAAM,MAAM,GAAQ,EAAE,CAAC;YACvB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AAClC,gBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;aAC9D;AACD,YAAA,OAAO,MAAM,CAAC;SACf;KACF;AAED;;;;;AAKG;IACH,mBAAmB,CAAC,CAAM,EAAE,CAAM,EAAA;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE7B,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE;AACjC,YAAA,OAAO,KAAK,CAAC;SACd;AAED,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE;AACvB,gBAAA,OAAO,KAAK,CAAC;aACd;SACF;AAED,QAAA,OAAO,IAAI,CAAC;KACb;+GA/IU,YAAY,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAX,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAZ,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFX,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACXD;;AAEG;MAIU,gBAAgB,CAAA;IAE3B,WAAoB,CAAA,YAA0B,EAAU,MAAc,EAAA;QAAlD,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;QAAU,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;KACrE;AAED;;;;;;;AAOG;AACH,IAAA,OAAO,CAAC,SAAoB,EAAE,OAAY,EAAE,OAAqB,EAAE,uBAAgC,EAAA;;AAGjG,QAAA,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YACtD,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SAC7C;;QAGD,IAAI,uBAAuB,EAAE;YAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;AAC3C,gBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;oBACtB,OAAO;iBACR;AAED,gBAAA,IAAI,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,UAAU,EAAE;AACxE,oBAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,EAAC,OAAO,EAAC,CAAC,CAAC;iBAC3D;aACF;SACF;KACF;AAED;;;;;;AAMG;AACH,IAAA,cAAc,CAAC,IAAU,EAAE,OAAY,EAAE,OAAqB,EAAA;AAC5D,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,OAAO;SACR;;QAGD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/E,QAAA,IAAI,CAAC,4BAA4B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,6BAA6B,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;;QAG3D,IAAI,CAAC,gBAAgB,GAAG;AACtB,YAAA,MAAM,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,oBAAqB,EAAE,OAAO,CAAC,mBAAoB,CAAC;AAC9G,YAAA,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,qBAAsB,EAAE,OAAO,CAAC,mBAAoB,CAAC;SAClH,CAAC;KACH;AAED;;;;;;;AAOG;AACH,IAAA,oBAAoB,CAAC,IAAU,EAAE,IAAwB,EAAE,eAAwB,EAAE,cAAsB,EAAA;QACzG,MAAM,MAAM,GAAyC,EAAE,CAAC;QACxD,IAAI,IAAI,CAAC,QAAS,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE;AACvC,YAAA,KAAK,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAS,CAAC,IAAI,CAAQ,CAAC,EAAE;gBACrF,MAAM,CAAC,WAAW,CAAC,GAAG;AACpB,oBAAA,SAAS,EAAE,YAAY;oBACvB,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,YAAY,EAAE,cAAc,CAAC,GAAG,IAAI;iBACxG,CAAC;aACH;SACF;AACD,QAAA,OAAO,MAAM,CAAC;KACf;;;AAKD;;;;;AAKG;IACH,4BAA4B,CAAC,IAAU,EAAE,OAAqB,EAAA;AAC5D,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAa,CAAC,QAAQ,CAAC;;AAG9C,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;;QAGvE,MAAM,cAAc,GAId,EAAE,CAAC;QAET,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,YAAa,CAAC,aAAa,CAAE,CAAC;AAEzE,QAAA,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;;;AAGnE,YAAA,MAAM,OAAO,GAAG,OAAO,CAAC,kBAAkB,GAAG,UAAU,GAAG,cAAc,CAAC;AACzE,YAAA,MAAM,UAAU,GACd,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,SAAS,KAAK,WAAW,CAAC,OAAO,CAAC,CAAC;gBACvE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;gBACnG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,WAAW,CAAC,OAAO,CAAC,CAAC;AACzF,gBAAA,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;;YAGvH,IAAI,UAAU,EAAE;gBACd,cAAc,CAAC,IAAI,CAAC;oBAClB,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,YAAY,EAAE,UAAU,CAAC,YAAY;AACrC,oBAAA,KAAK,EAAE,UAAU;AAClB,iBAAA,CAAC,CAAC;;aAGJ;AAAM,iBAAA,IAAI,OAAO,CAAC,0BAA0B,EAAE;;AAE7C,gBAAA,IAAI,cAAc,GAChB,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,SAAS,KAAK,QAAQ,CAAC;oBAC9E,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;AAE7G,gBAAA,MAAM,cAAc,GAAG,cAAc,IAAI,SAAS,CAAC;;AAGnD,gBAAA,IAAI,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;oBACvE,cAAc,CAAC,IAAI,CAAC;AAClB,wBAAA,QAAQ,EAAE,cAAc;AACxB,wBAAA,YAAY,EAAE,IAAI;AAClB,wBAAA,KAAK,EAAE,UAAU;AAClB,qBAAA,CAAC,CAAC;iBACJ;qBAAM;oBACL,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,gFAAgF,GAAG,cAAc,GAAG,cAAc,GAAG,IAAI,CAAC,YAAa,CAAC,aAAa,CAAC,IAAI,GAAG,yBAAyB,CAAC,EAAE,OAAO,CAAC,CAAC;oBACrN,SAAS;iBACV;aACF;SACF;;QAGD,KAAK,MAAM,EAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAC,IAAI,cAAc,EAAE;YAC5D,IAAI,YAAY,EAAE;gBAChB,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;aAClD;iBAAM,IAAI,QAAQ,EAAE;gBACnB,IAAI,CAAC,YAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;aAC/C;SACF;;AAGD,QAAA,IAAI,cAAc,CAAC,MAAM,EAAE;AACzB,YAAA,IAAI,CAAC,YAAY,EAAE,iBAAiB,CAAC,aAAa,EAAE,CAAC;SACtD;KACF;AAED;;;;;;AAMG;AACH,IAAA,6BAA6B,CAAC,IAAU,EAAE,OAAY,EAAE,OAAqB,EAAA;AAC3E,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAa,CAAC,QAAQ,CAAC;;AAG9C,QAAA,MAAM,cAAc,GAA6C,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;;QAGnH,MAAM,eAAe,GAIf,EAAE,CAAC;QAET,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,YAAa,CAAC,aAAa,CAAE,CAAC;AAEzE,QAAA,KAAK,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;AACzE,YAAA,MAAM,OAAO,GAAG,OAAO,CAAC,mBAAmB,GAAG,UAAU,GAAG,cAAc,CAAC;AAC1E,YAAA,MAAM,WAAW,GACf,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,UAAU,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC;gBAC3E,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;gBACvG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC;AAC7F,gBAAA,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;YAE3H,IAAI,WAAW,EAAE;gBACf,eAAe,CAAC,IAAI,CAAC;oBACnB,QAAQ,EAAE,WAAW,CAAC,QAAQ;oBAC9B,YAAY,EAAE,WAAW,CAAC,YAAY;AACtC,oBAAA,KAAK,EAAE,cAAc;AACtB,iBAAA,CAAC,CAAC;aAEJ;AAAM,iBAAA,IAAI,OAAO,CAAC,6BAA6B,EAAE;;gBAEhD,IAAI,eAAe,GACjB,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,YAAY,UAAU,IAAI,UAAU,KAAK,QAAQ,CAAC;AAC5H,oBAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,YAAY,UAAU,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;gBAE3J,IAAI,eAAe,EAAE;oBACnB,eAAe,CAAC,IAAI,CAAC;AACnB,wBAAA,QAAQ,EAAE,eAAe;AACzB,wBAAA,YAAY,EAAE,IAAI;AAClB,wBAAA,KAAK,EAAE,cAAc;AACtB,qBAAA,CAAC,CAAC;iBACJ;aACF;SACF;;QAGD,KAAK,MAAM,EAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAC,IAAI,eAAe,EAAE;AAC7D,YAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE;gBAAE,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;aAAE;YAC7F,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,YAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,KAAU,KAAI;AAClG,gBAAA,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACxB,aAAC,CAAC,CAAC;SACJ;KACF;AAED;;;;;;AAMG;AACH,IAAA,kBAAkB,CAAC,IAAU,EAAE,IAAwB,EAAE,OAAqB,EAAA;QAC5E,MAAM,eAAe,GAAyB,EAAE,CAAC;QACjD,IAAI,IAAI,CAAC,QAAS,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE;AACvC,YAAA,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAS,CAAC,IAAI,CAAQ,CAAC,EAAE;;AAGxE,gBAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;AAC9E,oBAAA,eAAe,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;oBAC/B,SAAS;iBACV;;;AAID,gBAAA,IAAI,IAAI,KAAK,QAAQ,GAAG,CAAC,OAAO,CAAC,oBAAoB,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE;AACtF,oBAAA,IAAI,OAAO,KAAK,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE;AAC1D,wBAAA,eAAe,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;qBAChC;;iBAEF;qBAAM;AACL,oBAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;AACrG,oBAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,gCAAgC,CAAC,GAAG,EAAE,IAAI,CAAC,YAAa,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,WAAY,EAAE,kBAAkB,CAAC,CAAC;oBAE3L,IAAI,oBAAoB,EAAE;AACxB,wBAAA,IAAI,kBAAkB,CAAC,MAAM,KAAK,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,WAAY,CAAC,MAAM,EAAE;AACtF,4BAAA,eAAe,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;yBAChC;qBACF;yBAAM;AACL,wBAAA,IAAI,OAAO,KAAK,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE;AAC1D,4BAAA,eAAe,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;yBAChC;qBACF;iBACF;aACF;SACF;AAED,QAAA,OAAO,eAAe,CAAC;KACxB;AAED;;;;;;;;AAQG;IACH,gCAAgC,CAAC,WAAmB,EAAE,aAAqB,EAAE,OAAqB,EAAE,SAAkC,EAAE,SAAkC,EAAA;;AAExK,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,IAAI,IAAI,SAAS,CAAC,MAAM,KAAK,IAAI,EAAE;AAC1D,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,8DAA8D,GAAG,WAAW,GAAG,mBAAmB,GAAG,aAAa,GAAG,uEAAuE,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1N,YAAA,OAAO,KAAK,CAAC;SACd;AACD,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,IAAI,EAAE;AAC7B,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,kDAAkD,GAAG,WAAW,GAAG,mBAAmB,GAAG,aAAa,GAAG,uEAAuE,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9M,YAAA,OAAO,KAAK,CAAC;SACd;AACD,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,IAAI,EAAE;AAC7B,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,kDAAkD,GAAG,WAAW,GAAG,mBAAmB,GAAG,aAAa,GAAG,uEAAuE,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9M,YAAA,OAAO,KAAK,CAAC;SACd;;AAGD,QAAA,IAAI,SAAS,CAAC,iBAAiB,GAAG,CAAC,IAAI,SAAS,CAAC,iBAAiB,GAAG,CAAC,EAAE;AACtE,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,iCAAiC,GAAG,OAAO,CAAC,mBAAmB,GAAG,WAAW,GAAG,SAAS,CAAC,iBAAiB,GAAG,6BAA6B,GAAG,SAAS,CAAC,iBAAiB,GAAG,kDAAkD,GAAG,WAAW,GAAG,mBAAmB,GAAG,aAAa,GAAG,KAAK;gBAC1R,2JAA2J;aAC5J,EAAE,OAAO,CAAC,CAAC;SACb;AAAM,aAAA,IAAI,SAAS,CAAC,iBAAiB,GAAG,CAAC,EAAE;AAC1C,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AACf,gBAAA,iCAAiC,GAAG,OAAO,CAAC,mBAAmB,GAAG,WAAW,GAAG,SAAS,CAAC,iBAAiB,GAAG,kDAAkD,GAAG,WAAW,GAAG,mBAAmB,GAAG,aAAa,GAAG,KAAK;gBAC5N,2JAA2J;aAC5J,EAAE,OAAO,CAAC,CAAC;SACb;AAAM,aAAA,IAAI,SAAS,CAAC,iBAAiB,GAAG,CAAC,EAAE;AAC1C,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AACf,gBAAA,iCAAiC,GAAG,OAAO,CAAC,mBAAmB,GAAG,WAAW,GAAG,SAAS,CAAC,iBAAiB,GAAG,kDAAkD,GAAG,WAAW,GAAG,mBAAmB,GAAG,aAAa,GAAG,KAAK;gBAC5N,2JAA2J;aAC5J,EAAE,OAAO,CAAC,CAAC;SACb;AAED,QAAA,OAAO,IAAI,CAAC;KACb;+GArTU,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAY,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAT,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACAD;;AAEG;MAIU,gBAAgB,CAAA;IAE3B,WAC+B,CAAA,UAAkB,EACvC,MAAsB,EACtB,gBAAkC,EAClC,eAAoC,EACpC,MAAc,EAAA;QAJO,IAAU,CAAA,UAAA,GAAV,UAAU,CAAQ;QACvC,IAAM,CAAA,MAAA,GAAN,MAAM,CAAgB;QACtB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAe,CAAA,eAAA,GAAf,eAAe,CAAqB;QACpC,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;KAEvB;AAED;;;;;;;;;;AAUG;AACH,IAAA,IAAI,CAAC,cAAmB,EAAE,SAAoB,EAAE,KAAa,EAAE,OAAY,EAAE,OAAqB,EAAE,mBAAwC,EAAE,QAAkB,EAAA;AAC9J,QAAA,MAAM,mBAAmB,GAA2B,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,qBAAqB,GAAG,EAAE,CAAC;QACjC,MAAM,cAAc,GAAyB,EAAE,CAAC;;QAGhD,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;AACvC,YAAA,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,YAAA,OAAO,mBAAmB,CAAC;SAC5B;;;;AAKD,QAAA,KAAK,IAAI,aAAa,IAAI,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,gBAAgB,CAAA,EAAA,EAAK,oBAAoB,CAAG,CAAA,CAAA,CAAC,EAAE;AACjI,YAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,aAAa,EAAE,gBAAgB,CAAE,CAAC,CAAC;;YAG7F,IAAI,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAA,CAAA,EAAI,gBAAgB,CAAA,EAAA,EAAK,MAAM,CAAM,GAAA,EAAA,oBAAoB,CAAK,EAAA,EAAA,KAAK,CAAI,EAAA,CAAA,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;AAC/I,gBAAA,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;gBACzB,SAAS;aACV;AAED,YAAA,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;AAC/B,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC;YAChI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;;AAGtH,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;AACtD,gBAAA,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;gBACzB,SAAS;aACV;;YAGD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE;AACvH,gBAAA,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG,gBAAgB,CAAC;aAC7C;AAED;;;;;;;AAOE;AACF,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AAC5B,gBAAA,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACnF,gBAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,aAAa,CAAC;aACpC;;;;YAKD,IAAI,CAAC,yBAAyB,CAAC,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAE3D,YAAA,cAAc,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC;SACxC;;QAGD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACjF,QAAA,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YACtD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE;AAC5C,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,yKAAyK,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AAC7M,gBAAA,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;aAC1B;SACF;;AAGD,QAAA,KAAK,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;AACpE,YAAA,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;;AAG/B,YAAA,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;AAEhC,iBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AACnE,iBAAA,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,KAAI;;gBAEtB,MAAM,gBAAgB,GAAG,IAAI,CAAC,0BAA0B,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;;AAE/E,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;AAC1H,aAAC,CAAC,CAAC;;AAEF,iBAAA,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAI;AACrB,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AACtC,gBAAA,OAAO,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1B,gBAAA,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;aACjB,CAAC,CAAC,CAAC,CAAC;SACR;;AAGD,QAAA,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE;AACtC,YAAA,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,YAAA,OAAO,mBAAmB,CAAC;SAC5B;;AAGD,QAAA,aAAa,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC,MAAK;;YAGrE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;;gBAE3C,MAAM,eAAe,GAA0B,EAAE,CAAC;gBAClD,IAAI,OAAO,IAAI,CAAC,YAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,UAAU,IAAI,OAAO,IAAI,CAAC,YAAa,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,UAAU,EAAE;AAChJ,oBAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAa,CAAC,QAAQ,CAAC,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;iBACxG;;AAGD,gBAAA,IAAI,OAAO,IAAI,CAAC,YAAa,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,UAAU,EAAE;AACzE,oBAAA,IAAI,CAAC,YAAa,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,EAAC,eAAe,EAAC,CAAC,CAAC;iBACpE;;AAGD,gBAAA,IAAI,OAAO,IAAI,CAAC,YAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,UAAU,EAAE;AACvE,oBAAA,IAAI,CAAC,YAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,EAAC,OAAO,EAAE,eAAe,EAAC,CAAC,CAAC;iBAC3E;aACF;;YAGD,KAAK,MAAM,aAAa,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE;gBACzD,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;gBACtE,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;gBAC1E,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;aACnE;;AAGD,YAAA,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjC,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,mBAAmB,CAAC;KAC5B;;;AAKD;;;;;AAKG;IACH,oBAAoB,CAAC,aAAkB,EAAE,aAAqB,EAAA;QAC5D,MAAM,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;;QAG5E,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,aAAa,EAAE,gBAAgB,CAAE,CAAC,CAAC;QAC5I,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,aAAa,EAAE,oBAAoB,CAAE,CAAC,CAAC;QACpJ,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QACtE,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;;QAG1E,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;AACrE,QAAA,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE;YAC7B,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;SAC3D;;AAGD,QAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,aAAa,CAAE,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC;AACxH,QAAA,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,aAAa,CAAE,EAAE,aAAa,CAAC,CAAC;AAEpG,QAAA,OAAO,iBAAiB,CAAC;KAC1B;AAED;;;;;;;;;;AAUG;AACH,IAAA,yBAAyB,CAAC,WAAgB,EAAE,IAAU,EAAE,KAAa,EAAA;AACnE,QAAA,IAAI,OAAO,CAAC;;QAGZ,IAAI,IAAI,CAAC,IAAK,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAK,CAAC,OAAO,CAAC,EAAE;AAC7E,YAAA,OAAO,GAAG,IAAI,CAAC,IAAK,CAAC,OAAO,CAAC;;SAE9B;aAAM;YACL,OAAO,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;SAC7D;;AAGD,QAAA,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;;AAGlD,QAAA,KAAK,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE;YACpD,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,EAAE;gBACrD,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,+BAA+B,CAAC,CAAC;AAC/F,gBAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,kBAAkB,EAAE,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACrF,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,kBAAkB,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;AAC3E,gBAAA,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE;oBAC9B,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;iBAC5D;gBACD,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;aACnE;SACF;KACF;AAED;;;;;AAKG;IACH,0BAA0B,CAAC,oBAAyB,EAAE,KAAa,EAAA;;QAEjE,MAAM,gBAAgB,GAAY,EAAE,CAAC;QACrC,MAAM,mBAAmB,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,oBAAoB,CAAC;AACjF,aAAA,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,+BAA+B,IAAI,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,KAAK,CAAC,CAAC;AAEnK,QAAA,KAAK,MAAM,kBAAkB,IAAI,mBAAmB,EAAE;AACpD,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,kBAAkB,EAAE,WAAW,CAAE,CAAC;AACtF,YAAA,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;SAChG;;;AAID,QAAA,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC;AAE3D,QAAA,OAAO,gBAAgB,CAAC;KACzB;;;AAMD;;;;AAIG;AACH,IAAA,kBAAkB,CAAC,eAAgC,EAAA;AACjD,QAAA,MAAM,oBAAoB,GAA8C,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;;AAG7F,QAAA,IAAI,eAAe,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE;AAC/C,YAAA,oBAAoB,CAAC,IAAI,CAAC,eAA+C,CAAC,CAAC;;SAG5E;AAAM,aAAA,IAAI,OAAO,eAAe,KAAK,UAAU,EAAE;AAC/C,YAAA,eAAiE,EAAE,CAAC,IAAI,CAAC,SAAS,IAAG;AACpF,gBAAA,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACvC,aAAC,CAAC,CAAA;;SAGH;AAAM,aAAA,IAAI,eAAe,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE;;AAE1G,YAAA,IAAK,eAA2C,CAAC,aAAa,YAAY,OAAO,EAAE;AACjF,gBAAA,MAAM,KAAK,CAAC,CAAqJ,mJAAA,CAAA,CAAC,CAAC;aACpK;YAEA,eAA2C,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAI;AACtE,gBAAA,MAAM,UAAU,GAAI,eAA2C,CAAC,UAAU,CAAC;AAC3E,gBAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;AACrG,gBAAA,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACvC,aAAC,CAAC,CAAC;SAEJ;aAAM;AACL,YAAA,MAAM,KAAK,CAAC,mMAAmM,CAAC,CAAC;SAClN;AAED,QAAA,OAAO,oBAAoB,CAAC;KAC7B;AAED;;;;;;;;;;;AAWG;AACH,IAAA,eAAe,CAAC,IAAU,EAAE,OAAY,EAAE,oBAAyB,EAAE,gBAAyB,EAAE,OAAqB,EAAE,SAAqC,EAAE,mBAAwC,EAAE,QAAkB,EAAA;;;;AAKxN,QAAA,MAAM,mBAAmB,GAAG,eAAe,CAAC,SAAS,EAAE;AACrD,YAAA,WAAW,EAAE,oBAAoB;AACjC,YAAA,mBAAmB,EAAE,IAAI,CAAC,IAAK,CAAC,mBAAmB,IAAI,mBAAmB;AAC1E,YAAA,eAAe,EAAE,IAAI,CAAC,IAAK,CAAC,QAAQ,IAAI,QAAQ;AAChD,YAAA,gBAAgB,EAAE,gBAAgB;AACnC,SAAA,CAAC,CAAC;;AAGH,QAAA,IAAI,CAAC,YAAY,GAAG,mBAAmB,CAAC;;AAGxC,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;;QAG3C,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;;AAG7D,QAAA,IAAI,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,UAAU,IAAI,OAAO,KAAK,SAAS,EAAE;AACjG,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,EAAC,OAAO,EAAC,CAAC,CAAC;SAC3D;;QAGD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;;;;AAKrD,QAAA,mBAAmB,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC;KACvD;;;AAKD;;;;;AAKG;IACH,sBAAsB,CAAC,IAAU,EAAE,OAAqB,EAAA;QACtD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,YAAa,CAAC,aAAa,CAAE,CAAC;AAEzE,QAAA,KAAK,MAAM,YAAY,IAAI,QAAQ,CAAC,OAAO,EAAE;AAC3C,YAAA,MAAM,UAAU,GAAG,OAAO,CAAC,mBAAmB,GAAG,YAAY,CAAC,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC;;YAGnG,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,YAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,KAAU,KAAI;AACpH,gBAAA,IAAI,OAAO,CAAC,gBAAgB,EAAE;AAC5B,oBAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,aAAa,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;iBAClG;AACH,aAAC,CAAC,CAAC;SACJ;KACF;AAED;;;;;;;;AAQG;IACH,mBAAmB,CAAC,IAAS,EAAE,SAAA,GAAmC,EAAE,EAAE,SAAoB,EAAE,KAAa,EAAA;QACvG,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,UAAU,IAAI,SAAS,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;YACpD,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,GAAG,KAAI;gBACpC,IAAI,cAAc,GAAG,KAAK,CAAC;;AAE3B,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;gBAEtF,IACE,UAAU,KAAK,IAAI;AACnB,oBAAA,UAAU,KAAK,KAAK;oBACpB,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAC9D;AACA,oBAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,EAAE,gBAAgB,CAAE,EAAE,EAAE,CAAC,CAAC;AAC7F,oBAAA,IAAI,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;wBACpC,SAAS,CAAC,IAAI,CAAC;AACb,4BAAA,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,YAAa;AAC7C,4BAAA,eAAe,EAAE,EAAE;AACnB,4BAAA,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK;AACnC,yBAAA,CAAC,CAAC;wBACH,cAAc,GAAG,IAAI,CAAC;qBACvB;iBACF;;;;gBAKD,MAAM,kBAAkB,GAAG,cAAc,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,eAAe,GAAG,SAAS,CAAC;gBACxG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,kBAAkB,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AAC5E,aAAC,CAAC,CAAC;SACJ;KACF;AAjZU,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,kBAGjB,WAAW,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAU,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAP,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAAQ,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAHV,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;0BAII,MAAM;2BAAC,WAAW,CAAA;;;ACLvB;;AAEG;MAIU,mBAAmB,CAAA;IAE9B,WACwD,CAAA,WAAwC,EACpC,gBAA6C,EAC9C,cAAyC,EAC1F,gBAAkC,EAClC,cAA8B,EAC9B,iBAAoC,EACpC,gBAAkC,EAClC,gBAAkC,EAClC,eAAoC,EACpC,mBAAwC,EACxC,QAAkB,EAAA;QAV4B,IAAW,CAAA,WAAA,GAAX,WAAW,CAA6B;QACpC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAA6B;QAC9C,IAAc,CAAA,cAAA,GAAd,cAAc,CAA2B;QAC1F,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAc,CAAA,cAAA,GAAd,cAAc,CAAgB;QAC9B,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB,CAAmB;QACpC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAe,CAAA,eAAA,GAAf,eAAe,CAAqB;QACpC,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB,CAAqB;QACxC,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAU;KAE3B;AAED;;;;;;;;;;;;;AAaG;AACH,IAAA,KAAK,CACH,OAAA,GAAe,IAAI,EACnB,OAAkC,GAAA,IAAI,EACtC,OAAA,GAAe,IAAI,EACnB,OAA6B,GAAA,IAAI,EACjC,sBAAA,GAAwC,IAAI,EAC5C,sBAAwC,GAAA,IAAI,EAC5C,aAAA,GAAkC,IAAI,EACtC,eAA6B,GAAA,EAAE,EAC/B,mBAAA,GAAgD,IAAI,EACpD,WAA0B,IAAI,EAAA;AAE9B,QAAA,MAAM,uBAAuB,GAAG,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,CAAC;AAChF,QAAA,MAAM,YAAY,GAAG,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;;AAG/C,QAAA,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAClF,YAAY;QACZ,OAAO,EACP,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,cAAc,EACnB,OAAO,EACP,OAAO,EACP,sBAAsB,EACtB,sBAAsB,CACvB,CAAC;;QAGF,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,EAAE,CAAC;gBACR,OAAO,EAAE,aAAa,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC;AACnE,gBAAA,SAAS,EAAE,eAAe;AAC1B,gBAAA,OAAO,EAAE,OAAO;gBAChB,WAAW;gBACX,WAAW;gBACX,YAAY;gBACZ,uBAAuB;gBACvB,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;AAC7C,aAAA,CAAC,CAAC;SACJ;AAED,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1D,IAAI,cAAc,GAAG,OAAO,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;QACvG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,cAAc,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;;AAG3E,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;YAC5G,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;;SAGtE;aAAM;AACL,YAAA,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;SAC9G;;AAGD,QAAA,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;;AAGzH,QAAA,IAAI,WAAW,EAAE,QAAQ,EAAE;YACzB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;SACxE;;AAGD,QAAA,IAAI,aAAa,IAAI,aAAa,KAAK,cAAc,EAAE;YACrD,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YACzE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,aAAa,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;AAC1E,YAAA,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;AACpD,YAAA,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE;gBAC1E,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;aAC5D;YACD,cAAc,GAAG,aAAa,CAAA;SAC/B;;AAGD,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,YAAY,CAAC;aACrI,IAAI,CAAC,KAAK,EAAE,CAAC;AACb,aAAA,IAAI,CAAC,GAAG,CAAC,CAAC,mBAA4B,KAAI;;YAEzC,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YACzE,OAAO;AACL,gBAAA,OAAO,EAAE,cAAc;AACvB,gBAAA,SAAS,EAAE,eAAe;AAC1B,gBAAA,OAAO,EAAE,OAAO;gBAChB,WAAW;gBACX,WAAW;gBACX,YAAY;gBACZ,uBAAuB;gBACvB,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;aAC7C,CAAC;SACH,CAAC,CAAC,CAAC;KACL;AAED;;;;AAIG;AACH,IAAA,OAAO,CAAC,SAAoB,EAAA;QAC1B,IAAI,SAAS,EAAE;;YAEb,KAAK,MAAM,cAAc,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;AACrD,gBAAA,IAAI,cAAc,CAAC,YAAY,EAAE;AAC/B,oBAAA,cAAc,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;iBACvC;aACF;;YAGD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;AAC3C,gBAAA,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE;oBAC/D,IAAI,SAAS,EAAE;wBAAE,SAAS,CAAC,WAAW,EAAE,CAAC;qBAAE;iBAC5C;AACD,gBAAA,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE;oBACrE,IAAI,YAAY,EAAE;wBAAE,YAAY,CAAC,WAAW,EAAE,CAAC;qBAAE;iBAClD;aACF;SACF;KACF;AArJU,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,EAGR,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,wBAAwB,EACxB,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAA,6BAA6B,6BAC7B,2BAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AALtC,IAAA,SAAA,IAAA,CAAA,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,CAAA,EAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;0BAII,QAAQ;;0BAAI,MAAM;2BAAC,wBAAwB,CAAA;;0BAC3C,QAAQ;;0BAAI,MAAM;2BAAC,6BAA6B,CAAA;;0BAChD,QAAQ;;0BAAI,MAAM;2BAAC,2BAA2B,CAAA;;;ACrB5C,MAAM,WAAW,GAA2B,GAAG;AAEtD;;;;;AAKG;MACU,mBAAmB,GAA+G,CAAC,QAAQ,EAAE,eAAe,KAAI;IAC3K,MAAM,cAAc,GAAmC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAC,OAAO,EAAE,QAAQ,EAAC,GAAG,QAAQ,CAAC;AAEhH,IAAA,IAAI,cAAc,KAAK,SAAS,EAAE;AAChC,QAAA,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;KAClC;AAED,IAAA,MAAM,SAAS,GAAe;AAC5B,QAAA;AACE,YAAA,OAAO,EAAE,eAAe;AACxB,YAAA,UAAU,EAAE,MAAM,SAAQ;AAC1B,YAAA,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,CAAC,uBAAuB,CAAC;AAChC,SAAA;;AAGD,QAAA,EAAE,OAAO,EAAE,wBAAwB,EAAE,QAAQ,EAAE,WAAW,EAAE;;;;;;AAM5D,QAAA;AACE,YAAA,OAAO,EAAE,6BAA6B;AACtC,YAAA,UAAU,EAAE,CAAC,gBAAwC,KAAI;AACvD,gBAAA,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,GAAG,EAAE,CAAC;AAC3E,gBAAA,gBAAgB,GAAG,cAAc,KAAK,SAAS,GAAG,CAAC,GAAG,gBAAgB,EAAE,cAAc,CAAC,GAAG,gBAAgB,CAAC;AAC3G,gBAAA,OAAO,gBAAgB,CAAC;aACzB;AACD,YAAA,IAAI,EAAE,CAAC,CAAC,IAAI,QAAQ,EAAE,EAAE,IAAI,QAAQ,EAAE,EAAE,6BAA6B,CAAC,CAAC;AACxE,SAAA;AACD,QAAA,EAAE,OAAO,EAAE,2BAA2B,EAAE,QAAQ,EAAE,cAAc,EAAE;;;QAIlE,mBAAmB;KACpB,CAAA;IAED,IAAI,eAAe,EAAE;AACnB,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;KAC1E;AAED,IAAA,OAAO,SAAS,CAAC;AACnB,EAAC;AAED;;AAEG;AACH,MAGM,uBAAuB,CAAA;IAC3B,WAAW,GAAA;;;AAGT,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;KACxB;+GALG,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFf,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEd,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;AASM,MAAM,iBAAiB,GAAe,MAAK;AAChD,IAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;AACzB;;ACnEA;AACA;AAEA,IAAI,cAAc,GAA6B,IAAI,CAAC;AACpD,IAAI,MAAM,GAAqB,EAAE,CAAC;AAClC,IAAI,eAAe,GAAkB,EAAE,CAAC;AAExC,MAAM,cAAc,GAAG,OAAO,YAAiD,EAAE,EAAE,MAA4B,KAAI;;IAEjH,OAAO,MAAM,GAAG,yBAAyB,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,iBAAiB,CAAC,EAAC,SAAS,EAAC,CAAC,EAAE,QAAQ,CAAC;AACjH,CAAC,CAAA;AAED;;AAEG;AACI,MAAM,UAAU,GAAG,MAAK;;AAE7B,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,KAAK,CAAC,OAAO,EAAE,CAAC;KACjB;;AAGD,IAAA,KAAK,MAAM,WAAW,IAAI,eAAe,EAAE;QACzC,WAAW,CAAC,OAAO,EAAE,CAAC;KACvB;IAED,cAAc,GAAG,IAAI,CAAC;IACtB,MAAM,GAAG,EAAE,CAAC;IACZ,eAAe,GAAG,EAAE,CAAC;AACvB,EAAC;AAED;AACA;AAEA;;;;;AAKG;AACU,MAAA,eAAe,GAAG,CAAC,YAAiD,EAAE,EAAE,WAA4B,KAAoB;AACnI,IAAA,OAAO,IAAI,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AACpD,EAAC;AAED;;AAEG;MACU,cAAc,CAAA;AAEzB,IAAA,IAAW,QAAQ,GAAA;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;KACvB;;AAED,IAAA,IAAW,YAAY,GAAA;QACrB,OAAO,IAAI,CAAC,aAAa,CAAC;KAC3B;;AAED,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;KAC1B;;IAED,WAAoB,CAAA,SAAA,GAAiD,EAAE,EAAU,WAA4B,EAAA;QAAzF,IAAS,CAAA,SAAA,GAAT,SAAS,CAA0C;QAAU,IAAW,CAAA,WAAA,GAAX,WAAW,CAAiB;QAbrG,IAAS,CAAA,SAAA,GAA6B,IAAI,CAAC;QAI3C,IAAa,CAAA,aAAA,GAAkB,EAAE,CAAC;QAIlC,IAAY,CAAA,YAAA,GAAY,KAAK,CAAC;AAMpC,QAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACnB;AAED;;;;;;;;;;AAUE;IACK,MAAM,KAAK,CAChB,OAAY,EACZ,OAA0B,EAC1B,UAAe,IAAI,EACnB,UAA6B,IAAI,EACjC,gBAAkC,IAAI,EACtC,kBAA6B,EAAE,EAC/B,sBAAgD,IAAI,EAAA;QAEpD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,OAAO,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAG,aAAa,EAAE,eAAe,EAAE,mBAAmB,IAAI,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;aACrI,IAAI,CAAC,WAAW,IAAG;AAClB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACpC,YAAA,OAAO,WAAW,CAAC;AACrB,SAAC,CAAC,CAAC;KACJ;AAED;;AAEG;AACI,IAAA,MAAM,eAAe,GAAA;QAC1B,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAExB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,GAAG,SAAS,CAAC;AAC/F,YAAA,IAAI,CAAC,SAAS,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;SACvE;QAED,OAAO,IAAI,CAAC,QAAS,CAAC;KACvB;AAED;;AAEG;IACI,OAAO,GAAA;QACZ,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAExB,QAAA,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,YAAY,EAAE;YAC3C,WAAW,CAAC,OAAO,EAAE,CAAC;AACtB,YAAA,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,WAAW,CAAC,CAAC;SAC1E;AAED,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;SACzB;AAED,QAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC;AAChD,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;KAC1B;IAEO,gBAAgB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,MAAM,IAAI,KAAK,CAAC,qFAAqF,CAAC,CAAC;SACxG;KACF;AACF,CAAA;AAED;AACA;AAEA;;;;;;;;;;AAUG;AACU,MAAA,KAAK,GAAG,OACnB,OAAY,EACZ,OAA0B,EAC1B,OAAe,GAAA,IAAI,EACnB,OAA6B,GAAA,IAAI,EACjC,aAAA,GAAkC,IAAI,EACtC,eAA6B,GAAA,EAAE,EAC/B,mBAAA,GAAgD,IAAI,KAC5B;;IAGxB,IAAI,CAAC,mBAAmB,EAAE;QACxB,IAAI,CAAC,cAAc,EAAE;AACnB,YAAA,cAAc,GAAG,MAAM,cAAc,EAAE,CAAC;SACzC;QACD,mBAAmB,GAAG,cAAc,CAAC;KACtC;;IAGD,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,GAAG,EAAE,CAAA;KACb;IACD,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAAE;AAC/C,QAAA,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;KACjC;IAED,MAAM,eAAe,GAAG,mBAAmB,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;;IAGrE,OAAO,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAK;QAC9C,OAAO,cAAc,CAAC,eAAe;aAClC,KAAK,CACJ,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,IAAI,CACL,CACF,CAAC,IAAI,CAAC,WAAW,IAAG;AACnB,YAAA,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAClC,YAAA,OAAO,WAAW,CAAC;AACrB,SAAC,CAAC,CAAC;AACL,KAAC,CAAC,CAAC;AACL;;AC1MA;;;;;;AAMG;MACU,cAAc,GAAG,CAAC,OAAoB,EAAE,UAAgD,KAAsB;IACzH,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,CAAC,aAAa,EAAE,QAAQ,KAAI;;QAGhE,IAAI,QAAQ,GAAW,EAAE,CAAC;AAC1B,QAAA,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE;AACpC,YAAA,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YACnE,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,IAAI,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC;SAC9G;;QAGD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,IAChC,OAAO,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC;AAC3D,YAAA,OAAO,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,UAAW,CAAC;SACxE,CAAC;;AAGF,QAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,IAAG;AACnC,YAAA,MAAM,OAAO,GAAgB,OAAO,CAAC,QAAQ,KAAK,CAAC,GAAG,OAAsB,GAAG,OAAO,CAAC,aAAc,CAAC;YACtG,OAAO,OAAO,CAAC,OAAO,CAAC,CAAA,CAAA,EAAI,kBAAkB,CAAG,CAAA,CAAA,CAAC,KAAK,IAAI,CAAC;AAC7D,SAAC,CAAC,CAAC;AAEH,QAAA,IAAI,QAAQ,CAAC,MAAM,EAAE;;AAEnB,YAAA,MAAM,YAAY,GAAG,uBAAuB,CAAC,QAAQ,CAAE,CAAC;;YAGxD,UAAU,CAAC,YAAY,CAAC,CAAC;SAC1B;AACH,KAAC,CAAC,CAAC;AAEH,IAAA,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAE9D,IAAA,OAAO,QAAQ,CAAC;AAClB,EAAC;AAED;;;;AAIG;AACH,MAAM,uBAAuB,GAAG,CAAC,QAAgB,KAAsB;AACrE,IAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI,CAAC;AACvC,IAAA,IAAI,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;AAEzB,IAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC9B,QAAA,OAAO,MAAM,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AACtD,YAAA,MAAM,GAAG,MAAM,CAAC,aAAc,CAAC;SAChC;KACF;AAED,IAAA,OAAO,MAAqB,CAAC;AAC/B,CAAC;;ACrDD;;AAEG;MAOU,qBAAqB,CAAA;IAchC,WACU,CAAA,WAAuB,EACvB,mBAAwC,EACxC,gBAAkC,EAClC,eAAoC,EACpC,mBAAwC,EACxC,QAAkB,EAAA;QALlB,IAAW,CAAA,WAAA,GAAX,WAAW,CAAY;QACvB,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB,CAAqB;QACxC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAe,CAAA,eAAA,GAAf,eAAe,CAAqB;QACpC,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB,CAAqB;QACxC,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAU;QAnBnB,IAAO,CAAA,OAAA,GAAQ,IAAI,CAAC;QACpB,IAAO,CAAA,OAAA,GAAQ,IAAI,CAAC;QACpB,IAAsB,CAAA,sBAAA,GAAkB,IAAI,CAAC;QAC7C,IAAsB,CAAA,sBAAA,GAAkB,IAAI,CAAC;QAC7C,IAAO,CAAA,OAAA,GAA2B,IAAI,CAAC;QACvC,IAAO,CAAA,OAAA,GAAsB,IAAI,CAAC;AACjC,QAAA,IAAA,CAAA,gBAAgB,GAAoC,IAAI,YAAY,EAAE,CAAC;QACjF,IAAS,CAAA,SAAA,GAAc,EAAE,CAAC;QAC1B,IAAa,CAAA,aAAA,GAAiB,sBAAsB,EAAE,CAAC;QACvD,IAAa,CAAA,aAAA,GAAiB,EAAE,CAAC;AACjC,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,IAAW,CAAA,WAAA,GAAY,KAAK,CAAC;KAU5B;IAED,SAAS,GAAA;;AAEP,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE;AACxC,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SACrB;KACF;AAED,IAAA,WAAW,CAAC,OAAsB,EAAA;;AAEhC,QAAA,IACE,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC;AACjC,YAAA,OAAO,CAAC,cAAc,CAAC,wBAAwB,CAAC;AAChD,YAAA,OAAO,CAAC,cAAc,CAAC,wBAAwB,CAAC;AAChD,YAAA,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC;AACjC,YAAA,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,EACjC;YACA,IAAI,CAAC,KAAK,EAAE,CAAC;AACb,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;;SAG1B;AAAM,aAAA,IAAI,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE;AAC5C,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SACpB;KACF;IAED,eAAe,GAAA;KACd;IAED,kBAAkB,GAAA;KACjB;IAED,WAAW,GAAA;QACT,IAAI,CAAC,KAAK,EAAE,CAAC;KACd;;AAID;;AAEG;IACH,KAAK,GAAA;QACH,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;;AAGjD,QAAA,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AACzE,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,aAAa,GAAG,sBAAsB,EAAE,CAAC;AAC9C,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;KAC1B;AAED;;;;AAIG;AACH,IAAA,KAAK,CAAC,OAAY,EAAA;QAChB,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAC5B,OAAO,EACP,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,sBAAsB,EAC3B,IAAI,CAAC,sBAAsB,EAC3B,IAAI,CAAC,WAAW,CAAC,aAAa,EAC9B,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,QAAQ,CACd,CAAC,SAAS,CAAC,CAAC,WAAwB,KAAI;;AAEvC,YAAA,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,WAAW,CAAC;AAC7C,YAAA,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,WAAW,CAAC;AAC7C,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;AAGxB,YAAA,MAAM,gBAAgB,GAAsB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,IAAU,KAAI;gBAC3F,OAAO;oBACL,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,SAAS,EAAE,IAAI,CAAC,KAAK;oBACrB,UAAU,EAAE,IAAI,CAAC,MAAM;oBACvB,YAAY,EAAE,IAAI,CAAC,YAAa;iBACjC,CAAC;AACJ,aAAC,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC/C,SAAC,CAAC,CAAC;KACJ;AAED;;;;AAIG;AACH,IAAA,OAAO,CAAC,uBAAgC,EAAA;AACtC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC;SAC1G;KACF;+GAxHU,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,qVAJtB,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAID,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;+BACE,mBAAmB,EAAA,QAAA,EACnB,EAAE,EAAA,UAAA,EACA,IAAI,EAAA,CAAA;kOAIP,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACG,sBAAsB,EAAA,CAAA;sBAA9B,KAAK;gBACG,sBAAsB,EAAA,CAAA;sBAA9B,KAAK;gBACG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACI,gBAAgB,EAAA,CAAA;sBAAzB,MAAM;;;ACJT;;AAEG;MAOU,sBAAsB,CAAA;AASjC,IAAA,WAAA,CACU,WAAuB,EACvB,eAAoC,EACpC,mBAAwC,EACxC,gBAAkC,EAAA;QAHlC,IAAW,CAAA,WAAA,GAAX,WAAW,CAAY;QACvB,IAAe,CAAA,eAAA,GAAf,eAAe,CAAqB;QACpC,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB,CAAqB;QACxC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAZnC,IAAS,CAAA,SAAA,GAAsC,IAAI,CAAC;QACpD,IAAM,CAAA,MAAA,GAAwB,EAAE,CAAC;QACjC,IAAO,CAAA,OAAA,GAAwB,EAAE,CAAC;QAClC,IAAO,CAAA,OAAA,GAA8B,EAAE,CAAC;AACvC,QAAA,IAAA,CAAA,eAAe,GAAoC,IAAI,YAAY,EAAE,CAAC;QAChF,IAAW,CAAA,WAAA,GAAqB,IAAI,CAAC;QACrC,IAAY,CAAA,YAAA,GAAiB,EAAE,CAAC;KAQ/B;IAED,SAAS,GAAA;;AAEP,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE;YACvC,IAAI,CAAC,OAAO,EAAE,CAAC;SAChB;KACF;AAED,IAAA,WAAW,CAAC,OAAsB,EAAA;;AAEhC,QAAA,IACE,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,EACnC;YACA,IAAI,CAAC,KAAK,EAAE,CAAC;AACb,YAAA,IAAI,CAAC,YAAY,GAAG,EAAC,GAAG,sBAAsB,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAC,CAAC;YACnE,IAAI,CAAC,aAAa,EAAE,CAAC;;SAGtB;AAAM,aAAA,IACL,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC;AAChC,YAAA,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC;AACjC,YAAA,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,EACjC;AACA,YAAA,IAAI,CAAC,YAAY,GAAG,EAAC,GAAG,sBAAsB,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAC,CAAC;YACnE,IAAI,CAAC,OAAO,EAAE,CAAC;SAChB;KACF;IAED,eAAe,GAAA;KACd;IAED,kBAAkB,GAAA;KACjB;IAED,WAAW,GAAA;QACT,IAAI,CAAC,KAAK,EAAE,CAAC;KACd;;AAID;;AAEG;IACH,KAAK,GAAA;AACH,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;SAC9D;AAED,QAAA,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AACzE,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;KACxB;AAED;;AAEG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAEtD,IAAI,CAAC,QAAQ,EAAE;AACb,gBAAA,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;aACrF;;AAGD,YAAA,IAAI,QAAQ,CAAC;AACb,YAAA,IAAI,oBAAoB,CAAC;AACzB,YAAA,IAAI;AACF,gBAAA,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBAC7B,oBAAoB,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;aACrE;YAAC,OAAO,CAAC,EAAE;gBACV,QAAQ,GAAG,gBAAgB,CAAC;gBAC5B,oBAAoB,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;aAC7E;YACD,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;AACrE,YAAA,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;;YAGvF,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAEhD,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC;iBAC9F,SAAS,CAAC,WAAW,IAAG;AACvB,gBAAA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;AAC/B,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,YAAa,CAAC,CAAC;AACpE,aAAC,CAAC,CAAC;SACJ;KACF;AAED;;;;AAIG;AACH,IAAA,iBAAiB,CAAC,QAAgB,EAAA;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC;AAElB,QAAA,MAAM,0BAA0B,CAAA;YAE9B,gBAAgB,CAAC,cAAmB,EAAE,OAAY,EAAA;gBAChD,OAAO,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;aACxE;AAED,YAAA,aAAa,CAAC,MAAc,EAAE,SAAoB,EAAE,OAAY,EAAE,UAAiB,EAAA;gBACjF,OAAO;oBACL,SAAS,EAAE,IAAI,CAAC,SAAU;iBAC3B,CAAA;aACF;AAED,YAAA,WAAW,CAAC,MAAc,EAAE,SAAoB,EAAE,OAAY,EAAA;gBAC5D,OAAO;oBACL,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;iBACtB,CAAA;aACF;AACF,SAAA;AAED,QAAA,OAAO,0BAA0B,CAAC;KACnC;AAED;;AAEG;IACH,OAAO,GAAA;AACL,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;SACzF;KACF;+GA9IU,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAZ,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAAa,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,kPAJvB,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAID,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;+BACE,oBAAoB,EAAA,QAAA,EACpB,EAAE,EAAA,UAAA,EACA,IAAI,EAAA,CAAA;yKAIP,SAAS,EAAA,CAAA;sBAAjB,KAAK;gBACG,MAAM,EAAA,CAAA;sBAAd,KAAK;gBACG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACI,eAAe,EAAA,CAAA;sBAAxB,MAAM;;;ACnCT;;AAEG;AAEH;AAkCA;AACA;;ACvCA;;AAEG;;;;"}