structra-ui 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,75 +1,35 @@
1
1
  # structra-ui
2
2
 
3
- Biblioteca **Angular** da stack **Structra**: botões, campos, formulários, menus, diálogos, *shell* e mais componentes **standalone** para reutilizar entre produtos.
3
+ Biblioteca **Angular** da stack **Structra** para interfaces consistentes: componentes, layout de formulários e padrões de UI reutilizáveis entre produtos.
4
4
 
5
- - **Site com demos:** [StructraLab](https://structralab.com/)
6
- - **Nome do pacote npm:** `structra-ui`
5
+ **Documentação e exemplos:** [StructraLab](https://structralab.com/)
7
6
 
8
- ## Requisitos (peer dependencies)
7
+ **Peer dependencies:** `@angular/common`, `@angular/core`, `@angular/forms`, `@angular/cdk`, `@angular/material`, `@angular/router`, `@angular/animations` em **`>=17.0.0 <22.0.0`**
9
8
 
10
- Na tua aplicação, instala versões compatíveis de:
9
+ ## Build do pacote
11
10
 
12
- `@angular/animations`, `@angular/cdk`, `@angular/common`, `@angular/compiler`, `@angular/core`, `@angular/forms`, `@angular/material`, `@angular/platform-browser`, `@angular/router` intervalo suportado pelo pacote: **`>=17.0.0 <22.0.0`** (ver `package.json` do pacote publicado).
13
-
14
- ## Instalação (npm)
15
-
16
- Em projectos reais, instala a partir do **registo npm** (não uses `file:../...` em produção):
17
-
18
- ```bash
19
- npm install structra-ui
20
- ```
21
-
22
- Actualiza versões como qualquer outra dependência:
11
+ A entrada publicada é **`src/structra-public-api.ts`** na raiz do monorepo (ver `ng-package.json`). O comando:
23
12
 
24
13
  ```bash
25
- npm update structra-ui
26
- ```
27
-
28
- ### Desenvolvimento monorepo (opcional)
29
-
30
- Só para quem desenvolve **neste** repositório ou precisa de um *build* local antes de publicar: gera `dist/structra-ui` com `npm run lib:build` na raiz do monorepo e aponta temporariamente no `package.json` da app consumidora, por exemplo:
31
-
32
- ```json
33
- "structra-ui": "file:../web-components/dist/structra-ui"
14
+ npm run lib:build
15
+ # ou: npx ng build structra-ui
34
16
  ```
35
17
 
36
- Volta a `npm install structra-ui` com versão fixada quando consumires uma release publicada.
18
+ gera `dist/structra-ui/`, pronto para `npm pack` / `npm publish`.
37
19
 
38
- ## Build e publicação do pacote
39
-
40
- A entrada do pacote é **`src/structra-public-api.ts`** na raiz do monorepo (configurado em `ng-package.json`).
41
-
42
- Na **raiz** do repositório `web-components`:
20
+ ## Instalação (aplicação consumidora)
43
21
 
44
22
  ```bash
45
- npm run lib:build
46
- # ou: npx ng build structra-ui
23
+ npm install structra-ui
47
24
  ```
48
25
 
49
- Gera `dist/structra-ui/`, pronto para `npm pack` / `npm publish` (ver scripts `lib:pack` e `lib:publish` no `package.json` da raiz).
50
-
51
- ## Uso na aplicação Angular
52
-
53
- Importa os símbolos necessários a partir de **`structra-ui`**:
26
+ ## Uso
54
27
 
55
28
  ```ts
56
29
  import { STRUCTRA_UI, BaseButtonComponent } from 'structra-ui';
57
30
  ```
58
31
 
59
- `STRUCTRA_UI` é um marcador de versão/pacote; o essencial são os componentes e serviços exportados (cada um documentado no StructraLab).
60
-
61
- Regista `provideAnimations()` (e outros *providers* que os componentes exijam, como CDK Dialog, conforme a demo) na configuração da app.
62
-
63
- ## Estilos globais (tema StructraLab)
64
-
65
- O pacote npm publica sobretudo **código TypeScript / bundles**. O **tema completo** (tokens SCSS, tema Material, ag-Grid, *overlays* de diálogo, *shell*, etc.) corresponde ao `styles.scss` da aplicação StructraLab no mesmo repositório.
66
-
67
- Para ficares alinhado ao look oficial:
68
-
69
- 1. Segue a documentação / exemplos do [StructraLab](https://structralab.com/) para a cadeia de `@import` / `@use` necessária.
70
- 2. Ou replica os estilos globais a partir do ficheiro `src/styles.scss` deste monorepo (e dependências SCSS referenciadas aí).
71
-
72
- Sem esses estilos globais, os componentes montam-se mas cores, *backdrop* de modais e *layout* podem não coincidir com o showcase.
32
+ Os estilos globais (tokens, Material, ag-Grid, CDK) seguem os do StructraLab; nas apps consumidoras importe o `styles.scss` principal do produto ou replique os `@use` de tema conforme a documentação interna.
73
33
 
74
34
  ## Licença
75
35
 
@@ -9,12 +9,17 @@ export declare class AppDialogComponent implements OnChanges, OnDestroy {
9
9
  private readonly hostEl;
10
10
  open: boolean;
11
11
  readonly openChange: EventEmitter<boolean>;
12
- title: string;
12
+ /**
13
+ * Título do cabeçalho (`<app-dialog title="…">`).
14
+ * O nome da propriedade **não** pode ser `title`: no host DOM isso colide com
15
+ * `HTMLElement.title` e o browser desenha o tooltip nativo por cima do overlay.
16
+ */
17
+ dialogHeading: string;
13
18
  /** Texto de apoio abaixo do título (opcional); liga `aria-describedby` no painel. */
14
19
  description: string;
15
20
  /**
16
- * Rótulo acessível quando não há `title` (evita diálogo sem nome).
17
- * Ignorado se `title` tiver texto.
21
+ * Rótulo acessível quando não há título (evita diálogo sem nome).
22
+ * Ignorado se `dialogHeading` tiver texto.
18
23
  */
19
24
  ariaLabel: string;
20
25
  size: LibDialogSize;
@@ -45,7 +50,7 @@ export declare class AppDialogComponent implements OnChanges, OnDestroy {
45
50
  requestClose(): void;
46
51
  private restoreFocus;
47
52
  static ɵfac: i0.ɵɵFactoryDeclaration<AppDialogComponent, never>;
48
- static ɵcmp: i0.ɵɵComponentDeclaration<AppDialogComponent, "app-dialog", never, { "open": { "alias": "open"; "required": false; }; "title": { "alias": "title"; "required": false; }; "description": { "alias": "description"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "size": { "alias": "size"; "required": false; }; "allowOverlayDismiss": { "alias": "allowOverlayDismiss"; "required": false; }; "showCloseButton": { "alias": "showCloseButton"; "required": false; }; }, { "openChange": "openChange"; }, never, ["*", "[appDialogFooter]"], true, never>;
53
+ static ɵcmp: i0.ɵɵComponentDeclaration<AppDialogComponent, "app-dialog", never, { "open": { "alias": "open"; "required": false; }; "dialogHeading": { "alias": "title"; "required": false; }; "description": { "alias": "description"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "size": { "alias": "size"; "required": false; }; "allowOverlayDismiss": { "alias": "allowOverlayDismiss"; "required": false; }; "showCloseButton": { "alias": "showCloseButton"; "required": false; }; }, { "openChange": "openChange"; }, never, ["*", "[appDialogFooter]"], true, never>;
49
54
  static ngAcceptInputType_open: unknown;
50
55
  static ngAcceptInputType_allowOverlayDismiss: unknown;
51
56
  static ngAcceptInputType_showCloseButton: unknown;
@@ -1,7 +1,7 @@
1
- import { EventEmitter, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
1
+ import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
2
2
  import type { ValidationSummaryItem, ValidationSummaryVariant } from '../_models/validation-summary.model';
3
3
  import * as i0 from "@angular/core";
4
- export declare class ValidationSummaryComponent implements OnChanges, OnDestroy {
4
+ export declare class ValidationSummaryComponent implements OnChanges {
5
5
  private static nextTitleUid;
6
6
  private static nextListRegionUid;
7
7
  /** Troca de aba (`beforeItemActivate`) + `queueMicrotask` no `app-form-tabs` — o alvo pode ficar em `[hidden]` até o próximo CD. */
@@ -10,14 +10,6 @@ export declare class ValidationSummaryComponent implements OnChanges, OnDestroy
10
10
  private readonly cdr;
11
11
  private readonly injector;
12
12
  private readonly hostRef;
13
- private readonly document;
14
- /**
15
- * Com `pinned`, o host passa para `document.body` para o `z-index` competir com a shell (ex.: drawer
16
- * da doc no iPhone). Antes de mover, guardamos o `form` mais próximo — `closest('form')` no body falharia.
17
- */
18
- private nearestForm;
19
- private pinnedPortalOriginalParent;
20
- private pinnedPortalOriginalNext;
21
13
  /** `id` único para `aria-labelledby` quando há vários resumos na página. */
22
14
  readonly titleElementId: string;
23
15
  /** `id` da região da lista (acessibilidade do botão recolher / expandir). */
@@ -26,7 +18,12 @@ export declare class ValidationSummaryComponent implements OnChanges, OnDestroy
26
18
  messages: string[] | null;
27
19
  /** Lista rica com `fieldId` opcional para navegação até o controle. */
28
20
  items: ValidationSummaryItem[] | null;
29
- title: string;
21
+ /**
22
+ * Título do cabeçalho (`title="…"` no template).
23
+ * Não usar a propriedade `title` na classe: colide com `HTMLElement.title` no host e o
24
+ * browser pode desenhar tooltip nativo / comportamentos estranhos.
25
+ */
26
+ summaryHeading: string;
30
27
  visible: boolean;
31
28
  /**
32
29
  * `false` (padrão): fluxo em documento (ex.: no topo do formulário) — o consumidor pode fazer scroll até o painel.
@@ -66,7 +63,6 @@ export declare class ValidationSummaryComponent implements OnChanges, OnDestroy
66
63
  private wasShown;
67
64
  get hostClass(): string;
68
65
  ngOnChanges(_changes: SimpleChanges): void;
69
- ngOnDestroy(): void;
70
66
  get hostHidden(): true | null;
71
67
  get resolvedItems(): ValidationSummaryItem[];
72
68
  get isShown(): boolean;
@@ -99,10 +95,8 @@ export declare class ValidationSummaryComponent implements OnChanges, OnDestroy
99
95
  private expandCollapsedFormGroupAncestors;
100
96
  private resolveFocusable;
101
97
  private isFocusableElement;
102
- private syncPinnedHostToBody;
103
- private detachPinnedHostFromBody;
104
98
  static ɵfac: i0.ɵɵFactoryDeclaration<ValidationSummaryComponent, never>;
105
- static ɵcmp: i0.ɵɵComponentDeclaration<ValidationSummaryComponent, "app-validation-summary", never, { "messages": { "alias": "messages"; "required": false; }; "items": { "alias": "items"; "required": false; }; "title": { "alias": "title"; "required": false; }; "visible": { "alias": "visible"; "required": false; }; "pinned": { "alias": "pinned"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "compact": { "alias": "compact"; "required": false; }; "panelMaxHeight": { "alias": "panelMaxHeight"; "required": false; }; "scrollBehavior": { "alias": "scrollBehavior"; "required": false; }; "beforeItemActivate": { "alias": "beforeItemActivate"; "required": false; }; "showCloseButton": { "alias": "showCloseButton"; "required": false; }; "showListCollapseToggle": { "alias": "showListCollapseToggle"; "required": false; }; "closeButtonLabel": { "alias": "closeButtonLabel"; "required": false; }; "fieldNavigateHint": { "alias": "fieldNavigateHint"; "required": false; }; }, { "panelClose": "panelClose"; }, never, never, true, never>;
99
+ static ɵcmp: i0.ɵɵComponentDeclaration<ValidationSummaryComponent, "app-validation-summary", never, { "messages": { "alias": "messages"; "required": false; }; "items": { "alias": "items"; "required": false; }; "summaryHeading": { "alias": "title"; "required": false; }; "visible": { "alias": "visible"; "required": false; }; "pinned": { "alias": "pinned"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "compact": { "alias": "compact"; "required": false; }; "panelMaxHeight": { "alias": "panelMaxHeight"; "required": false; }; "scrollBehavior": { "alias": "scrollBehavior"; "required": false; }; "beforeItemActivate": { "alias": "beforeItemActivate"; "required": false; }; "showCloseButton": { "alias": "showCloseButton"; "required": false; }; "showListCollapseToggle": { "alias": "showListCollapseToggle"; "required": false; }; "closeButtonLabel": { "alias": "closeButtonLabel"; "required": false; }; "fieldNavigateHint": { "alias": "fieldNavigateHint"; "required": false; }; }, { "panelClose": "panelClose"; }, never, never, true, never>;
106
100
  static ngAcceptInputType_visible: unknown;
107
101
  static ngAcceptInputType_pinned: unknown;
108
102
  static ngAcceptInputType_compact: unknown;
@@ -9,7 +9,8 @@ export declare class DrawerComponent implements OnChanges, OnDestroy {
9
9
  open: boolean;
10
10
  side: DrawerSide;
11
11
  size: DrawerSize;
12
- title: string;
12
+ /** `title="…"` no template — evita colisão com `HTMLElement.title` no host. */
13
+ drawerHeading: string;
13
14
  showCloseButton: boolean;
14
15
  readonly openChange: EventEmitter<boolean>;
15
16
  private panelRef?;
@@ -31,7 +32,7 @@ export declare class DrawerComponent implements OnChanges, OnDestroy {
31
32
  requestClose(): void;
32
33
  private restoreFocus;
33
34
  static ɵfac: i0.ɵɵFactoryDeclaration<DrawerComponent, never>;
34
- static ɵcmp: i0.ɵɵComponentDeclaration<DrawerComponent, "app-drawer", never, { "open": { "alias": "open"; "required": false; }; "side": { "alias": "side"; "required": false; }; "size": { "alias": "size"; "required": false; }; "title": { "alias": "title"; "required": false; }; "showCloseButton": { "alias": "showCloseButton"; "required": false; }; }, { "openChange": "openChange"; }, never, ["*", "[appDrawerFooter]"], true, never>;
35
+ static ɵcmp: i0.ɵɵComponentDeclaration<DrawerComponent, "app-drawer", never, { "open": { "alias": "open"; "required": false; }; "side": { "alias": "side"; "required": false; }; "size": { "alias": "size"; "required": false; }; "drawerHeading": { "alias": "title"; "required": false; }; "showCloseButton": { "alias": "showCloseButton"; "required": false; }; }, { "openChange": "openChange"; }, never, ["*", "[appDrawerFooter]"], true, never>;
35
36
  static ngAcceptInputType_open: unknown;
36
37
  static ngAcceptInputType_showCloseButton: unknown;
37
38
  }
@@ -13,12 +13,17 @@ export class AppDialogComponent {
13
13
  this.hostEl = inject((ElementRef));
14
14
  this.open = false;
15
15
  this.openChange = new EventEmitter();
16
- this.title = '';
16
+ /**
17
+ * Título do cabeçalho (`<app-dialog title="…">`).
18
+ * O nome da propriedade **não** pode ser `title`: no host DOM isso colide com
19
+ * `HTMLElement.title` e o browser desenha o tooltip nativo por cima do overlay.
20
+ */
21
+ this.dialogHeading = '';
17
22
  /** Texto de apoio abaixo do título (opcional); liga `aria-describedby` no painel. */
18
23
  this.description = '';
19
24
  /**
20
- * Rótulo acessível quando não há `title` (evita diálogo sem nome).
21
- * Ignorado se `title` tiver texto.
25
+ * Rótulo acessível quando não há título (evita diálogo sem nome).
26
+ * Ignorado se `dialogHeading` tiver texto.
22
27
  */
23
28
  this.ariaLabel = 'Diálogo';
24
29
  this.size = LibDialogSize.Md;
@@ -133,18 +138,19 @@ export class AppDialogComponent {
133
138
  this.previousActive = null;
134
139
  }
135
140
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
136
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AppDialogComponent, isStandalone: true, selector: "app-dialog", inputs: { open: ["open", "open", booleanAttribute], title: "title", description: "description", ariaLabel: "ariaLabel", size: "size", allowOverlayDismiss: ["allowOverlayDismiss", "allowOverlayDismiss", booleanAttribute], showCloseButton: ["showCloseButton", "showCloseButton", booleanAttribute] }, outputs: { openChange: "openChange" }, host: { listeners: { "document:keydown": "onDocumentKeydown($event)" } }, usesOnChanges: true, ngImport: i0, template: "@if (open) {\r\n <div\r\n class=\"app-dialog-backdrop\"\r\n role=\"presentation\"\r\n tabindex=\"-1\"\r\n (click)=\"onBackdropClick()\"\r\n ></div>\r\n <div class=\"app-dialog-stage\" aria-hidden=\"false\">\r\n <div\r\n class=\"app-dialog-panel\"\r\n [class.app-dialog-panel--sm]=\"size === LibDialogSize.Sm\"\r\n [class.app-dialog-panel--md]=\"size === LibDialogSize.Md\"\r\n [class.app-dialog-panel--lg]=\"size === LibDialogSize.Lg\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-labelledby]=\"\r\n title.trim() ? titleId : description.trim() ? descriptionId : null\r\n \"\r\n [attr.aria-label]=\"!title.trim() && !description.trim() ? ariaLabel : null\"\r\n [attr.aria-describedby]=\"\r\n title.trim() && description.trim() ? descriptionId : null\r\n \"\r\n cdkTrapFocus\r\n [cdkTrapFocusAutoCapture]=\"true\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n @if (title.trim()) {\r\n <header class=\"app-dialog-header\">\r\n <h2 class=\"app-dialog-title\" [id]=\"titleId\">{{ title }}</h2>\r\n @if (showCloseButton) {\r\n <button\r\n type=\"button\"\r\n class=\"app-dialog-close\"\r\n aria-label=\"Fechar di\u00E1logo\"\r\n (click)=\"requestClose()\"\r\n >\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n }\r\n </header>\r\n }\r\n @if (description.trim()) {\r\n <p class=\"app-dialog-description\" [id]=\"descriptionId\">{{ description }}</p>\r\n }\r\n <div class=\"app-dialog-body\">\r\n <ng-content />\r\n </div>\r\n <footer class=\"app-dialog-footer\">\r\n <ng-content select=\"[appDialogFooter]\" />\r\n </footer>\r\n </div>\r\n </div>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:block}.app-dialog-backdrop{position:fixed;inset:0;z-index:var(--app-z-dialog, 1200);background:#1a2f456b;backdrop-filter:blur(10px) saturate(1.05);-webkit-backdrop-filter:blur(10px) saturate(1.05);pointer-events:auto;animation:app-lib-dialog-backdrop-enter .24s ease-out both}.app-dialog-stage{position:fixed;inset:0;z-index:calc(var(--app-z-dialog, 1200) + 1);display:flex;align-items:center;justify-content:center;padding:min(1.5rem,4vw);box-sizing:border-box;pointer-events:none;background:transparent}.app-dialog-panel{position:relative;z-index:0;display:flex;flex-direction:column;max-height:min(88vh,40rem);width:100%;pointer-events:auto;overflow:hidden;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;box-sizing:border-box;border-radius:10px;border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .12));background:var(--app-color-surface, #fff);box-shadow:0 4px 6px -1px #00000014,0 12px 28px -8px #1a2f452e;outline:none;animation:app-lib-dialog-panel-in .28s cubic-bezier(.22,1,.36,1) both}.app-dialog-panel--sm{max-width:min(28rem,94vw)}.app-dialog-panel--md{max-width:min(40rem,94vw)}.app-dialog-panel--lg{max-width:min(56rem,96vw)}@media (prefers-reduced-motion: reduce){.app-dialog-backdrop,.app-dialog-panel{animation:none}}.app-dialog-header{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;padding:1rem 1rem .65rem;border-bottom:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .09));flex:0 0 auto}.app-dialog-title{margin:0;font-size:1.05rem;font-weight:600;line-height:1.3;color:var(--app-color-text-primary, #1a2f45)}.app-dialog-description{margin:0;padding:.65rem 1rem;font-size:.88rem;line-height:1.45;color:var(--app-color-text-secondary, #5a7fa3);flex:0 0 auto}.app-dialog-close{flex:0 0 auto;width:2rem;height:2rem;margin:0;padding:0;border:1px solid var(--app-color-border, #d4d4d4);border-radius:6px;background:var(--app-color-surface-alt, #fff);color:var(--app-color-text-secondary, #5a7fa3);font-size:1.35rem;line-height:1;cursor:pointer}.app-dialog-close:hover{background:var(--app-color-hover-bg, rgba(43, 127, 217, .08))}.app-dialog-close:focus-visible{outline:2px solid var(--app-color-focus-ring-strong, rgba(43, 127, 217, .45));outline-offset:2px}.app-dialog-body{padding:1rem;flex:1 1 auto;min-height:0;overflow-x:hidden;overflow-y:auto;font-size:.9rem;line-height:1.5;color:var(--app-color-text-primary, #1a2f45)}.app-dialog-footer{flex:0 0 auto;padding:.65rem 1rem 1rem;border-top:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .09));display:flex;flex-wrap:wrap;gap:.5rem;justify-content:flex-end}.app-dialog-footer:empty{display:none;padding:0;border:none}\n"], dependencies: [{ kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
141
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AppDialogComponent, isStandalone: true, selector: "app-dialog", inputs: { open: ["open", "open", booleanAttribute], dialogHeading: ["title", "dialogHeading"], description: "description", ariaLabel: "ariaLabel", size: "size", allowOverlayDismiss: ["allowOverlayDismiss", "allowOverlayDismiss", booleanAttribute], showCloseButton: ["showCloseButton", "showCloseButton", booleanAttribute] }, outputs: { openChange: "openChange" }, host: { listeners: { "document:keydown": "onDocumentKeydown($event)" } }, usesOnChanges: true, ngImport: i0, template: "@if (open) {\r\n <div\r\n class=\"app-dialog-backdrop\"\r\n role=\"presentation\"\r\n tabindex=\"-1\"\r\n (click)=\"onBackdropClick()\"\r\n ></div>\r\n <div class=\"app-dialog-stage\" aria-hidden=\"false\">\r\n <div\r\n class=\"app-dialog-panel\"\r\n [class.app-dialog-panel--sm]=\"size === LibDialogSize.Sm\"\r\n [class.app-dialog-panel--md]=\"size === LibDialogSize.Md\"\r\n [class.app-dialog-panel--lg]=\"size === LibDialogSize.Lg\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-labelledby]=\"\r\n dialogHeading.trim() ? titleId : description.trim() ? descriptionId : null\r\n \"\r\n [attr.aria-label]=\"!dialogHeading.trim() && !description.trim() ? ariaLabel : null\"\r\n [attr.aria-describedby]=\"\r\n dialogHeading.trim() && description.trim() ? descriptionId : null\r\n \"\r\n cdkTrapFocus\r\n [cdkTrapFocusAutoCapture]=\"true\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n @if (dialogHeading.trim()) {\r\n <header class=\"app-dialog-header\">\r\n <h2 class=\"app-dialog-title\" [id]=\"titleId\">{{ dialogHeading }}</h2>\r\n @if (showCloseButton) {\r\n <button\r\n type=\"button\"\r\n class=\"app-dialog-close\"\r\n aria-label=\"Fechar di\u00E1logo\"\r\n (click)=\"requestClose()\"\r\n >\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n }\r\n </header>\r\n }\r\n @if (description.trim()) {\r\n <p class=\"app-dialog-description\" [id]=\"descriptionId\">{{ description }}</p>\r\n }\r\n <div class=\"app-dialog-body\">\r\n <ng-content />\r\n </div>\r\n <footer class=\"app-dialog-footer\">\r\n <ng-content select=\"[appDialogFooter]\" />\r\n </footer>\r\n </div>\r\n </div>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:block}.app-dialog-backdrop{position:fixed;inset:0;z-index:var(--app-z-dialog, 1200);background:#1a2f456b;backdrop-filter:blur(10px) saturate(1.05);-webkit-backdrop-filter:blur(10px) saturate(1.05);pointer-events:auto;animation:app-lib-dialog-backdrop-enter .24s ease-out both}.app-dialog-stage{position:fixed;inset:0;z-index:calc(var(--app-z-dialog, 1200) + 1);display:flex;align-items:center;justify-content:center;padding:min(1.5rem,4vw);box-sizing:border-box;pointer-events:none;background:transparent}.app-dialog-panel{position:relative;z-index:0;display:flex;flex-direction:column;max-height:min(88vh,40rem);width:100%;pointer-events:auto;overflow:hidden;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;box-sizing:border-box;border-radius:10px;border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .12));background:var(--app-color-surface, #fff);box-shadow:0 4px 6px -1px #00000014,0 12px 28px -8px #1a2f452e;outline:none;animation:app-lib-dialog-panel-in .28s cubic-bezier(.22,1,.36,1) both}.app-dialog-panel--sm{max-width:min(28rem,94vw)}.app-dialog-panel--md{max-width:min(40rem,94vw)}.app-dialog-panel--lg{max-width:min(56rem,96vw)}@media (prefers-reduced-motion: reduce){.app-dialog-backdrop,.app-dialog-panel{animation:none}}.app-dialog-header{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;padding:1rem 1rem .65rem;border-bottom:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .09));flex:0 0 auto}.app-dialog-title{margin:0;font-size:1.05rem;font-weight:600;line-height:1.3;color:var(--app-color-text-primary, #1a2f45)}.app-dialog-description{margin:0;padding:.65rem 1rem;font-size:.88rem;line-height:1.45;color:var(--app-color-text-secondary, #5a7fa3);flex:0 0 auto}.app-dialog-close{flex:0 0 auto;width:2rem;height:2rem;margin:0;padding:0;border:1px solid var(--app-color-border, #d4d4d4);border-radius:6px;background:var(--app-color-surface-alt, #fff);color:var(--app-color-text-secondary, #5a7fa3);font-size:1.35rem;line-height:1;cursor:pointer}.app-dialog-close:hover{background:var(--app-color-hover-bg, rgba(43, 127, 217, .08))}.app-dialog-close:focus-visible{outline:2px solid var(--app-color-focus-ring-strong, rgba(43, 127, 217, .45));outline-offset:2px}.app-dialog-body{padding:1rem;flex:1 1 auto;min-height:0;overflow-x:hidden;overflow-y:auto;font-size:.9rem;line-height:1.5;color:var(--app-color-text-primary, #1a2f45)}.app-dialog-footer{flex:0 0 auto;padding:.65rem 1rem 1rem;border-top:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .09));display:flex;flex-wrap:wrap;gap:.5rem;justify-content:flex-end}.app-dialog-footer:empty{display:none;padding:0;border:none}\n"], dependencies: [{ kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
137
142
  }
138
143
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppDialogComponent, decorators: [{
139
144
  type: Component,
140
- args: [{ selector: 'app-dialog', standalone: true, imports: [CdkTrapFocus], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (open) {\r\n <div\r\n class=\"app-dialog-backdrop\"\r\n role=\"presentation\"\r\n tabindex=\"-1\"\r\n (click)=\"onBackdropClick()\"\r\n ></div>\r\n <div class=\"app-dialog-stage\" aria-hidden=\"false\">\r\n <div\r\n class=\"app-dialog-panel\"\r\n [class.app-dialog-panel--sm]=\"size === LibDialogSize.Sm\"\r\n [class.app-dialog-panel--md]=\"size === LibDialogSize.Md\"\r\n [class.app-dialog-panel--lg]=\"size === LibDialogSize.Lg\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-labelledby]=\"\r\n title.trim() ? titleId : description.trim() ? descriptionId : null\r\n \"\r\n [attr.aria-label]=\"!title.trim() && !description.trim() ? ariaLabel : null\"\r\n [attr.aria-describedby]=\"\r\n title.trim() && description.trim() ? descriptionId : null\r\n \"\r\n cdkTrapFocus\r\n [cdkTrapFocusAutoCapture]=\"true\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n @if (title.trim()) {\r\n <header class=\"app-dialog-header\">\r\n <h2 class=\"app-dialog-title\" [id]=\"titleId\">{{ title }}</h2>\r\n @if (showCloseButton) {\r\n <button\r\n type=\"button\"\r\n class=\"app-dialog-close\"\r\n aria-label=\"Fechar di\u00E1logo\"\r\n (click)=\"requestClose()\"\r\n >\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n }\r\n </header>\r\n }\r\n @if (description.trim()) {\r\n <p class=\"app-dialog-description\" [id]=\"descriptionId\">{{ description }}</p>\r\n }\r\n <div class=\"app-dialog-body\">\r\n <ng-content />\r\n </div>\r\n <footer class=\"app-dialog-footer\">\r\n <ng-content select=\"[appDialogFooter]\" />\r\n </footer>\r\n </div>\r\n </div>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:block}.app-dialog-backdrop{position:fixed;inset:0;z-index:var(--app-z-dialog, 1200);background:#1a2f456b;backdrop-filter:blur(10px) saturate(1.05);-webkit-backdrop-filter:blur(10px) saturate(1.05);pointer-events:auto;animation:app-lib-dialog-backdrop-enter .24s ease-out both}.app-dialog-stage{position:fixed;inset:0;z-index:calc(var(--app-z-dialog, 1200) + 1);display:flex;align-items:center;justify-content:center;padding:min(1.5rem,4vw);box-sizing:border-box;pointer-events:none;background:transparent}.app-dialog-panel{position:relative;z-index:0;display:flex;flex-direction:column;max-height:min(88vh,40rem);width:100%;pointer-events:auto;overflow:hidden;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;box-sizing:border-box;border-radius:10px;border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .12));background:var(--app-color-surface, #fff);box-shadow:0 4px 6px -1px #00000014,0 12px 28px -8px #1a2f452e;outline:none;animation:app-lib-dialog-panel-in .28s cubic-bezier(.22,1,.36,1) both}.app-dialog-panel--sm{max-width:min(28rem,94vw)}.app-dialog-panel--md{max-width:min(40rem,94vw)}.app-dialog-panel--lg{max-width:min(56rem,96vw)}@media (prefers-reduced-motion: reduce){.app-dialog-backdrop,.app-dialog-panel{animation:none}}.app-dialog-header{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;padding:1rem 1rem .65rem;border-bottom:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .09));flex:0 0 auto}.app-dialog-title{margin:0;font-size:1.05rem;font-weight:600;line-height:1.3;color:var(--app-color-text-primary, #1a2f45)}.app-dialog-description{margin:0;padding:.65rem 1rem;font-size:.88rem;line-height:1.45;color:var(--app-color-text-secondary, #5a7fa3);flex:0 0 auto}.app-dialog-close{flex:0 0 auto;width:2rem;height:2rem;margin:0;padding:0;border:1px solid var(--app-color-border, #d4d4d4);border-radius:6px;background:var(--app-color-surface-alt, #fff);color:var(--app-color-text-secondary, #5a7fa3);font-size:1.35rem;line-height:1;cursor:pointer}.app-dialog-close:hover{background:var(--app-color-hover-bg, rgba(43, 127, 217, .08))}.app-dialog-close:focus-visible{outline:2px solid var(--app-color-focus-ring-strong, rgba(43, 127, 217, .45));outline-offset:2px}.app-dialog-body{padding:1rem;flex:1 1 auto;min-height:0;overflow-x:hidden;overflow-y:auto;font-size:.9rem;line-height:1.5;color:var(--app-color-text-primary, #1a2f45)}.app-dialog-footer{flex:0 0 auto;padding:.65rem 1rem 1rem;border-top:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .09));display:flex;flex-wrap:wrap;gap:.5rem;justify-content:flex-end}.app-dialog-footer:empty{display:none;padding:0;border:none}\n"] }]
145
+ args: [{ selector: 'app-dialog', standalone: true, imports: [CdkTrapFocus], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (open) {\r\n <div\r\n class=\"app-dialog-backdrop\"\r\n role=\"presentation\"\r\n tabindex=\"-1\"\r\n (click)=\"onBackdropClick()\"\r\n ></div>\r\n <div class=\"app-dialog-stage\" aria-hidden=\"false\">\r\n <div\r\n class=\"app-dialog-panel\"\r\n [class.app-dialog-panel--sm]=\"size === LibDialogSize.Sm\"\r\n [class.app-dialog-panel--md]=\"size === LibDialogSize.Md\"\r\n [class.app-dialog-panel--lg]=\"size === LibDialogSize.Lg\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-labelledby]=\"\r\n dialogHeading.trim() ? titleId : description.trim() ? descriptionId : null\r\n \"\r\n [attr.aria-label]=\"!dialogHeading.trim() && !description.trim() ? ariaLabel : null\"\r\n [attr.aria-describedby]=\"\r\n dialogHeading.trim() && description.trim() ? descriptionId : null\r\n \"\r\n cdkTrapFocus\r\n [cdkTrapFocusAutoCapture]=\"true\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n @if (dialogHeading.trim()) {\r\n <header class=\"app-dialog-header\">\r\n <h2 class=\"app-dialog-title\" [id]=\"titleId\">{{ dialogHeading }}</h2>\r\n @if (showCloseButton) {\r\n <button\r\n type=\"button\"\r\n class=\"app-dialog-close\"\r\n aria-label=\"Fechar di\u00E1logo\"\r\n (click)=\"requestClose()\"\r\n >\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n }\r\n </header>\r\n }\r\n @if (description.trim()) {\r\n <p class=\"app-dialog-description\" [id]=\"descriptionId\">{{ description }}</p>\r\n }\r\n <div class=\"app-dialog-body\">\r\n <ng-content />\r\n </div>\r\n <footer class=\"app-dialog-footer\">\r\n <ng-content select=\"[appDialogFooter]\" />\r\n </footer>\r\n </div>\r\n </div>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:block}.app-dialog-backdrop{position:fixed;inset:0;z-index:var(--app-z-dialog, 1200);background:#1a2f456b;backdrop-filter:blur(10px) saturate(1.05);-webkit-backdrop-filter:blur(10px) saturate(1.05);pointer-events:auto;animation:app-lib-dialog-backdrop-enter .24s ease-out both}.app-dialog-stage{position:fixed;inset:0;z-index:calc(var(--app-z-dialog, 1200) + 1);display:flex;align-items:center;justify-content:center;padding:min(1.5rem,4vw);box-sizing:border-box;pointer-events:none;background:transparent}.app-dialog-panel{position:relative;z-index:0;display:flex;flex-direction:column;max-height:min(88vh,40rem);width:100%;pointer-events:auto;overflow:hidden;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;box-sizing:border-box;border-radius:10px;border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .12));background:var(--app-color-surface, #fff);box-shadow:0 4px 6px -1px #00000014,0 12px 28px -8px #1a2f452e;outline:none;animation:app-lib-dialog-panel-in .28s cubic-bezier(.22,1,.36,1) both}.app-dialog-panel--sm{max-width:min(28rem,94vw)}.app-dialog-panel--md{max-width:min(40rem,94vw)}.app-dialog-panel--lg{max-width:min(56rem,96vw)}@media (prefers-reduced-motion: reduce){.app-dialog-backdrop,.app-dialog-panel{animation:none}}.app-dialog-header{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;padding:1rem 1rem .65rem;border-bottom:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .09));flex:0 0 auto}.app-dialog-title{margin:0;font-size:1.05rem;font-weight:600;line-height:1.3;color:var(--app-color-text-primary, #1a2f45)}.app-dialog-description{margin:0;padding:.65rem 1rem;font-size:.88rem;line-height:1.45;color:var(--app-color-text-secondary, #5a7fa3);flex:0 0 auto}.app-dialog-close{flex:0 0 auto;width:2rem;height:2rem;margin:0;padding:0;border:1px solid var(--app-color-border, #d4d4d4);border-radius:6px;background:var(--app-color-surface-alt, #fff);color:var(--app-color-text-secondary, #5a7fa3);font-size:1.35rem;line-height:1;cursor:pointer}.app-dialog-close:hover{background:var(--app-color-hover-bg, rgba(43, 127, 217, .08))}.app-dialog-close:focus-visible{outline:2px solid var(--app-color-focus-ring-strong, rgba(43, 127, 217, .45));outline-offset:2px}.app-dialog-body{padding:1rem;flex:1 1 auto;min-height:0;overflow-x:hidden;overflow-y:auto;font-size:.9rem;line-height:1.5;color:var(--app-color-text-primary, #1a2f45)}.app-dialog-footer{flex:0 0 auto;padding:.65rem 1rem 1rem;border-top:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .09));display:flex;flex-wrap:wrap;gap:.5rem;justify-content:flex-end}.app-dialog-footer:empty{display:none;padding:0;border:none}\n"] }]
141
146
  }], propDecorators: { open: [{
142
147
  type: Input,
143
148
  args: [{ transform: booleanAttribute }]
144
149
  }], openChange: [{
145
150
  type: Output
146
- }], title: [{
147
- type: Input
151
+ }], dialogHeading: [{
152
+ type: Input,
153
+ args: ['title']
148
154
  }], description: [{
149
155
  type: Input
150
156
  }], ariaLabel: [{
@@ -161,4 +167,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
161
167
  type: HostListener,
162
168
  args: ['document:keydown', ['$event']]
163
169
  }] } });
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RpYWxvZ3MvYXBwLWRpYWxvZy9hcHAtZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZGlhbG9ncy9hcHAtZGlhbG9nL2FwcC1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBRU4sZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHdCQUF3QixHQUV6QixNQUFNLDJDQUEyQyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7QUFFakUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBRXJCOzs7R0FHRztBQVNILE1BQU0sT0FBTyxrQkFBa0I7SUFSL0I7UUFTbUIsV0FBTSxHQUFHLE1BQU0sQ0FBQyxDQUFBLFVBQXVCLENBQUEsQ0FBQyxDQUFDO1FBRWxCLFNBQUksR0FBRyxLQUFLLENBQUM7UUFDbEMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFbkQsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVwQixxRkFBcUY7UUFDNUUsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFFMUI7OztXQUdHO1FBQ00sY0FBUyxHQUFHLFNBQVMsQ0FBQztRQUV0QixTQUFJLEdBQWtCLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFFaEQ7Ozs7V0FJRztRQUNxQyx3QkFBbUIsR0FBRyxJQUFJLENBQUM7UUFFM0Isb0JBQWUsR0FBRyxJ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USxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQzdCLENBQUM7K0dBNUlVLGtCQUFrQjttR0FBbEIsa0JBQWtCLCtFQUdULGdCQUFnQix5SkFxQmhCLGdCQUFnQiwyREFFaEIsZ0JBQWdCLG1LQzlEdEMscTJEQXFEQSx1c0ZEdEJZLFlBQVk7OzRGQUtYLGtCQUFrQjtrQkFSOUIsU0FBUzsrQkFDRSxZQUFZLGNBQ1YsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLG1CQUdOLHVCQUF1QixDQUFDLE1BQU07OEJBS1AsSUFBSTtzQkFBM0MsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDbkIsVUFBVTtzQkFBNUIsTUFBTTtnQkFFRSxLQUFLO3NCQUFiLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFNRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFPa0MsbUJBQW1CO3NCQUExRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUVFLGVBQWU7c0JBQXRELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBb0Z0QyxpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDZGtUcmFwRm9jdXMgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQge1xuICBsb2NrUGFnZVNjcm9sbENka1N0eWxlLFxuICB1bmxvY2tQYWdlU2Nyb2xsQ2RrU3R5bGUsXG4gIHR5cGUgU2Nyb2xsTG9ja1NuYXBzaG90LFxufSBmcm9tICcuLi8uLi9fdXRpbHMvc2Nyb2xsL2JvZHktc2Nyb2xsLWxvY2sudXRpbCc7XG5pbXBvcnQgeyBMaWJEaWFsb2dTaXplIH0gZnJvbSAnLi4vX21vZGVscy9saWItZGlhbG9nLXNpemUubW9kZWwnO1xuXG5sZXQgYXBwRGlhbG9nU2VxID0gMDtcblxuLyoqXG4gKiBEacOhbG9nbyBtb2RhbCBkZWNsYXJhdGl2byBjb20gYFsob3BlbildYCwgcHJvamXDp8OjbyBkZSBjb3JwbyBlIHJvZGFww6kgb3BjaW9uYWwgKGBbYXBwRGlhbG9nRm9vdGVyXWApLlxuICogQmxvcXVlaW8gZGUgc2Nyb2xsIGFsaW5oYWRvIGFvIENESyAoYGNkay1nbG9iYWwtc2Nyb2xsYmxvY2tgKSwgY29tbyBubyBgQ29uZmlybURpYWxvZ1NlcnZpY2VgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZGlhbG9nJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0Nka1RyYXBGb2N1c10sXG4gIHRlbXBsYXRlVXJsOiAnLi9hcHAtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2FwcC1kaWFsb2cuY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQXBwRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGhvc3RFbCA9IGluamVjdChFbGVtZW50UmVmPEhUTUxFbGVtZW50Pik7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG9wZW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgQElucHV0KCkgdGl0bGUgPSAnJztcblxuICAvKiogVGV4dG8gZGUgYXBvaW8gYWJhaXhvIGRvIHTDrXR1bG8gKG9wY2lvbmFsKTsgbGlnYSBgYXJpYS1kZXNjcmliZWRieWAgbm8gcGFpbmVsLiAqL1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbiA9ICcnO1xuXG4gIC8qKlxuICAgKiBSw7N0dWxvIGFjZXNzw612ZWwgcXVhbmRvIG7Do28gaMOhIGB0aXRsZWAgKGV2aXRhIGRpw6Fsb2dvIHNlbSBub21lKS5cbiAgICogSWdub3JhZG8gc2UgYHRpdGxlYCB0aXZlciB0ZXh0by5cbiAgICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbCA9ICdEacOhbG9nbyc7XG5cbiAgQElucHV0KCkgc2l6ZTogTGliRGlhbG9nU2l6ZSA9IExpYkRpYWxvZ1NpemUuTWQ7XG5cbiAgLyoqXG4gICAqIFF1YW5kbyBgZmFsc2VgLCBhIHRlY2xhIEVzY2FwZSBlIG8gY2xpcXVlIG5vIGJhY2tkcm9wIG7Do28gZmVjaGFtIG8gZGnDoWxvZ29cbiAgICogKGJvdMOjbyDinJUsIGBbKG9wZW4pXWAgZSBgcmVxdWVzdENsb3NlKClgIGNvbnRpbnVhbSBkaXNwb27DrXZlaXMpLlxuICAgKiBPbWlzc286IGB0cnVlYC5cbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBhbGxvd092ZXJsYXlEaXNtaXNzID0gdHJ1ZTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0Nsb3NlQnV0dG9uID0gdHJ1ZTtcblxuICByZWFkb25seSBMaWJEaWFsb2dTaXplID0gTGliRGlhbG9nU2l6ZTtcblxuICByZWFkb25seSB0aXRsZUlkID0gYGFwcC1kaWFsb2ctdGl0bGUtJHsrK2FwcERpYWxvZ1NlcX1gO1xuICByZWFkb25seSBkZXNjcmlwdGlvbklkID0gYGFwcC1kaWFsb2ctZGVzYy0ke2FwcERpYWxvZ1NlcX1gO1xuXG4gIC8qKlxuICAgKiBPIG1vZGFsIGZpY2Egbm8gZmltIGRlIGBkb2N1bWVudC5ib2R5YCBlbnF1YW50byBhYmVydG8sIHBhcmEgbyBgYmFja2Ryb3AtZmlsdGVyYFxuICAgKiBuw6NvIGZpY2FyIMKrcHJlc2/CuyBhIGFuY2VzdHJhaXMgY29tIGBvdmVyZmxvdzogYXV0b2AgKGV4LjogYGFwcC1zaGVsbF9fY29udGVudGApLlxuICAgKi9cbiAgcHJpdmF0ZSBib2R5UmVzdG9yZVBhcmVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBib2R5UmVzdG9yZU5leHQ6IENoaWxkTm9kZSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcHJldmlvdXNBY3RpdmU6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2Nyb2xsTG9jazogU2Nyb2xsTG9ja1NuYXBzaG90ID0ge1xuICAgIGh0bWxMZWZ0OiAnJyxcbiAgICBodG1sVG9wOiAnJyxcbiAgICBzY3JvbGxYOiAwLFxuICAgIHNjcm9sbFk6IDAsXG4gICAgYm9keU92ZXJmbG93OiAnJyxcbiAgICBib2R5VG91Y2hBY3Rpb246ICcnLFxuICB9O1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snb3BlbiddKSB7XG4gICAgICBpZiAodGhpcy5vcGVuKSB7XG4gICAgICAgIHRoaXMuYXR0YWNoSG9zdFRvQm9keSgpO1xuICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBhICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgICAgdGhpcy5wcmV2aW91c0FjdGl2ZSA9IGE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY3JvbGxMb2NrID0gbG9ja1BhZ2VTY3JvbGxDZGtTdHlsZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5sb2NrUGFnZVNjcm9sbENka1N0eWxlKHRoaXMuc2Nyb2xsTG9jayk7XG4gICAgICAgIHRoaXMuZGV0YWNoSG9zdEZyb21Cb2R5KCk7XG4gICAgICAgIHRoaXMucmVzdG9yZUZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3Blbikge1xuICAgICAgdW5sb2NrUGFnZVNjcm9sbENka1N0eWxlKHRoaXMuc2Nyb2xsTG9jayk7XG4gICAgfVxuICAgIHRoaXMuZGV0YWNoSG9zdEZyb21Cb2R5KCk7XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaEhvc3RUb0JvZHkoKTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSB0aGlzLmhvc3RFbC5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChlbC5wYXJlbnRFbGVtZW50ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYm9keVJlc3RvcmVQYXJlbnQgPSBlbC5wYXJlbnRFbGVtZW50O1xuICAgIHRoaXMuYm9keVJlc3RvcmVOZXh0ID0gZWwubmV4dFNpYmxpbmc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbCk7XG4gIH1cblxuICBwcml2YXRlIGRldGFjaEhvc3RGcm9tQm9keSgpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGVsLnBhcmVudEVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgIHRoaXMuYm9keVJlc3RvcmVQYXJlbnQgPSBudWxsO1xuICAgICAgdGhpcy5ib2R5UmVzdG9yZU5leHQgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmJvZHlSZXN0b3JlUGFyZW50O1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmJvZHlSZXN0b3JlTmV4dDtcbiAgICB0aGlzLmJvZHlSZXN0b3JlUGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLmJvZHlSZXN0b3JlTmV4dCA9IG51bGw7XG4gICAgaWYgKHBhcmVudCAmJiBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHBhcmVudCkpIHtcbiAgICAgIGlmIChuZXh0ICYmIG5leHQucGFyZW50Tm9kZSA9PT0gcGFyZW50KSB7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZWwsIG5leHQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhcHBSb290ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYXBwLXJvb3QnKTtcbiAgICBpZiAoYXBwUm9vdCkge1xuICAgICAgYXBwUm9vdC5hcHBlbmRDaGlsZChlbCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRLZXlkb3duKGV2OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9wZW4gfHwgZXYua2V5ICE9PSAnRXNjYXBlJyB8fCAhdGhpcy5hbGxvd092ZXJsYXlEaXNtaXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5yZXF1ZXN0Q2xvc2UoKTtcbiAgfVxuXG4gIG9uQmFja2Ryb3BDbGljaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWxsb3dPdmVybGF5RGlzbWlzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlcXVlc3RDbG9zZSgpO1xuICB9XG5cbiAgcmVxdWVzdENsb3NlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5vcGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICB1bmxvY2tQYWdlU2Nyb2xsQ2RrU3R5bGUodGhpcy5zY3JvbGxMb2NrKTtcbiAgICB0aGlzLnJlc3RvcmVGb2N1cygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlRm9jdXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJldmlvdXNBY3RpdmUgJiYgZG9jdW1lbnQuY29udGFpbnModGhpcy5wcmV2aW91c0FjdGl2ZSkpIHtcbiAgICAgIHRoaXMucHJldmlvdXNBY3RpdmUuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgIH1cbiAgICB0aGlzLnByZXZpb3VzQWN0aXZlID0gbnVsbDtcbiAgfVxufVxuIiwiQGlmIChvcGVuKSB7XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJhcHAtZGlhbG9nLWJhY2tkcm9wXCJcclxuICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxyXG4gICAgdGFiaW5kZXg9XCItMVwiXHJcbiAgICAoY2xpY2spPVwib25CYWNrZHJvcENsaWNrKClcIlxyXG4gID48L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiYXBwLWRpYWxvZy1zdGFnZVwiIGFyaWEtaGlkZGVuPVwiZmFsc2VcIj5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJhcHAtZGlhbG9nLXBhbmVsXCJcclxuICAgICAgW2NsYXNzLmFwcC1kaWFsb2ctcGFuZWwtLXNtXT1cInNpemUgPT09IExpYkRpYWxvZ1NpemUuU21cIlxyXG4gICAgICBbY2xhc3MuYXBwLWRpYWxvZy1wYW5lbC0tbWRdPVwic2l6ZSA9PT0gTGliRGlhbG9nU2l6ZS5NZFwiXHJcbiAgICAgIFtjbGFzcy5hcHAtZGlhbG9nLXBhbmVsLS1sZ109XCJzaXplID09PSBMaWJEaWFsb2dTaXplLkxnXCJcclxuICAgICAgcm9sZT1cImRpYWxvZ1wiXHJcbiAgICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIlxyXG4gICAgICAgIHRpdGxlLnRyaW0oKSA/IHRpdGxlSWQgOiBkZXNjcmlwdGlvbi50cmltKCkgPyBkZXNjcmlwdGlvbklkIDogbnVsbFxyXG4gICAgICBcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIiF0aXRsZS50cmltKCkgJiYgIWRlc2NyaXB0aW9uLnRyaW0oKSA/IGFyaWFMYWJlbCA6IG51bGxcIlxyXG4gICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIlxyXG4gICAgICAgIHRpdGxlLnRyaW0oKSAmJiBkZXNjcmlwdGlvbi50cmltKCkgPyBkZXNjcmlwdGlvbklkIDogbnVsbFxyXG4gICAgICBcIlxyXG4gICAgICBjZGtUcmFwRm9jdXNcclxuICAgICAgW2Nka1RyYXBGb2N1c0F1dG9DYXB0dXJlXT1cInRydWVcIlxyXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgID5cclxuICAgICAgQGlmICh0aXRsZS50cmltKCkpIHtcclxuICAgICAgICA8aGVhZGVyIGNsYXNzPVwiYXBwLWRpYWxvZy1oZWFkZXJcIj5cclxuICAgICAgICAgIDxoMiBjbGFzcz1cImFwcC1kaWFsb2ctdGl0bGVcIiBbaWRdPVwidGl0bGVJZFwiPnt7IHRpdGxlIH19PC9oMj5cclxuICAgICAgICAgIEBpZiAoc2hvd0Nsb3NlQnV0dG9uKSB7XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImFwcC1kaWFsb2ctY2xvc2VcIlxyXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGZWNoYXIgZGnDoWxvZ29cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZXF1ZXN0Q2xvc2UoKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgfVxyXG4gICAgICBAaWYgKGRlc2NyaXB0aW9uLnRyaW0oKSkge1xyXG4gICAgICAgIDxwIGNsYXNzPVwiYXBwLWRpYWxvZy1kZXNjcmlwdGlvblwiIFtpZF09XCJkZXNjcmlwdGlvbklkXCI+e3sgZGVzY3JpcHRpb24gfX08L3A+XHJcbiAgICAgIH1cclxuICAgICAgPGRpdiBjbGFzcz1cImFwcC1kaWFsb2ctYm9keVwiPlxyXG4gICAgICAgIDxuZy1jb250ZW50IC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8Zm9vdGVyIGNsYXNzPVwiYXBwLWRpYWxvZy1mb290ZXJcIj5cclxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYXBwRGlhbG9nRm9vdGVyXVwiIC8+XHJcbiAgICAgIDwvZm9vdGVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbn1cclxuIl19
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RpYWxvZ3MvYXBwLWRpYWxvZy9hcHAtZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZGlhbG9ncy9hcHAtZGlhbG9nL2FwcC1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBRU4sZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHdCQUF3QixHQUV6QixNQUFNLDJDQUEyQyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7QUFFakUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBRXJCOzs7R0FHRztBQVNILE1BQU0sT0FBTyxrQkFBa0I7SUFSL0I7UUFTbUIsV0FBTSxHQUFHLE1BQU0sQ0FBQyxDQUFBLFVBQXVCLENBQUEsQ0FBQyxDQUFDO1FBRWxCLFNBQUksR0FBRyxLQUFLLENBQUM7UUFDbEMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFNUQ7Ozs7V0FJRztRQUNhLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBRW5DLHFGQUFxRjtRQUM1RSxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUUxQjs7O1dBR0c7UUFDTSxjQUFTLEdBQUcsU0FBUyxDQUFDO1FBRXRCLFNBQUksR0FBa0IsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUVoRDs7OztXQUlHO1FBQ3FDLHdCQUFtQixHQUFHLElBQUksQ0FBQztRQUUz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LFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDbEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDN0IsQ0FBQzsrR0FqSlUsa0JBQWtCO21HQUFsQixrQkFBa0IsK0VBR1QsZ0JBQWdCLG9MQTBCaEIsZ0JBQWdCLDJEQUVoQixnQkFBZ0IsbUtDbkV0Qyw2NERBcURBLHVzRkR0QlksWUFBWTs7NEZBS1gsa0JBQWtCO2tCQVI5QixTQUFTOytCQUNFLFlBQVksY0FDVixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUMsbUJBR04sdUJBQXVCLENBQUMsTUFBTTs4QkFLUCxJQUFJO3NCQUEzQyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNuQixVQUFVO3NCQUE1QixNQUFNO2dCQU9TLGFBQWE7c0JBQTVCLEtBQUs7dUJBQUMsT0FBTztnQkFHTCxXQUFXO3NCQUFuQixLQUFLO2dCQU1HLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQU9rQyxtQkFBbUI7c0JBQTFELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBRUUsZUFBZTtzQkFBdEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFvRnRDLGlCQUFpQjtzQkFEaEIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBib29sZWFuQXR0cmlidXRlLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENka1RyYXBGb2N1cyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7XG4gIGxvY2tQYWdlU2Nyb2xsQ2RrU3R5bGUsXG4gIHVubG9ja1BhZ2VTY3JvbGxDZGtTdHlsZSxcbiAgdHlwZSBTY3JvbGxMb2NrU25hcHNob3QsXG59IGZyb20gJy4uLy4uL191dGlscy9zY3JvbGwvYm9keS1zY3JvbGwtbG9jay51dGlsJztcbmltcG9ydCB7IExpYkRpYWxvZ1NpemUgfSBmcm9tICcuLi9fbW9kZWxzL2xpYi1kaWFsb2ctc2l6ZS5tb2RlbCc7XG5cbmxldCBhcHBEaWFsb2dTZXEgPSAwO1xuXG4vKipcbiAqIERpw6Fsb2dvIG1vZGFsIGRlY2xhcmF0aXZvIGNvbSBgWyhvcGVuKV1gLCBwcm9qZcOnw6NvIGRlIGNvcnBvIGUgcm9kYXDDqSBvcGNpb25hbCAoYFthcHBEaWFsb2dGb290ZXJdYCkuXG4gKiBCbG9xdWVpbyBkZSBzY3JvbGwgYWxpbmhhZG8gYW8gQ0RLIChgY2RrLWdsb2JhbC1zY3JvbGxibG9ja2ApLCBjb21vIG5vIGBDb25maXJtRGlhbG9nU2VydmljZWAuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1kaWFsb2cnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ2RrVHJhcEZvY3VzXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2FwcC1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vYXBwLWRpYWxvZy5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBEaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaG9zdEVsID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgb3BlbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgb3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogVMOtdHVsbyBkbyBjYWJlw6dhbGhvIChgPGFwcC1kaWFsb2cgdGl0bGU9XCLigKZcIj5gKS5cbiAgICogTyBub21lIGRhIHByb3ByaWVkYWRlICoqbsOjbyoqIHBvZGUgc2VyIGB0aXRsZWA6IG5vIGhvc3QgRE9NIGlzc28gY29saWRlIGNvbVxuICAgKiBgSFRNTEVsZW1lbnQudGl0bGVgIGUgbyBicm93c2VyIGRlc2VuaGEgbyB0b29sdGlwIG5hdGl2byBwb3IgY2ltYSBkbyBvdmVybGF5LlxuICAgKi9cbiAgQElucHV0KCd0aXRsZScpIGRpYWxvZ0hlYWRpbmcgPSAnJztcblxuICAvKiogVGV4dG8gZGUgYXBvaW8gYWJhaXhvIGRvIHTDrXR1bG8gKG9wY2lvbmFsKTsgbGlnYSBgYXJpYS1kZXNjcmliZWRieWAgbm8gcGFpbmVsLiAqL1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbiA9ICcnO1xuXG4gIC8qKlxuICAgKiBSw7N0dWxvIGFjZXNzw612ZWwgcXVhbmRvIG7Do28gaMOhIHTDrXR1bG8gKGV2aXRhIGRpw6Fsb2dvIHNlbSBub21lKS5cbiAgICogSWdub3JhZG8gc2UgYGRpYWxvZ0hlYWRpbmdgIHRpdmVyIHRleHRvLlxuICAgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsID0gJ0Rpw6Fsb2dvJztcblxuICBASW5wdXQoKSBzaXplOiBMaWJEaWFsb2dTaXplID0gTGliRGlhbG9nU2l6ZS5NZDtcblxuICAvKipcbiAgICogUXVhbmRvIGBmYWxzZWAsIGEgdGVjbGEgRXNjYXBlIGUgbyBjbGlxdWUgbm8gYmFja2Ryb3AgbsOjbyBmZWNoYW0gbyBkacOhbG9nb1xuICAgKiAoYm90w6NvIOKclSwgYFsob3BlbildYCBlIGByZXF1ZXN0Q2xvc2UoKWAgY29udGludWFtIGRpc3BvbsOtdmVpcykuXG4gICAqIE9taXNzbzogYHRydWVgLlxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGFsbG93T3ZlcmxheURpc21pc3MgPSB0cnVlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93Q2xvc2VCdXR0b24gPSB0cnVlO1xuXG4gIHJlYWRvbmx5IExpYkRpYWxvZ1NpemUgPSBMaWJEaWFsb2dTaXplO1xuXG4gIHJlYWRvbmx5IHRpdGxlSWQgPSBgYXBwLWRpYWxvZy10aXRsZS0keysrYXBwRGlhbG9nU2VxfWA7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uSWQgPSBgYXBwLWRpYWxvZy1kZXNjLSR7YXBwRGlhbG9nU2VxfWA7XG5cbiAgLyoqXG4gICAqIE8gbW9kYWwgZmljYSBubyBmaW0gZGUgYGRvY3VtZW50LmJvZHlgIGVucXVhbnRvIGFiZXJ0bywgcGFyYSBvIGBiYWNrZHJvcC1maWx0ZXJgXG4gICAqIG7Do28gZmljYXIgwqtwcmVzb8K7IGEgYW5jZXN0cmFpcyBjb20gYG92ZXJmbG93OiBhdXRvYCAoZXguOiBgYXBwLXNoZWxsX19jb250ZW50YCkuXG4gICAqL1xuICBwcml2YXRlIGJvZHlSZXN0b3JlUGFyZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGJvZHlSZXN0b3JlTmV4dDogQ2hpbGROb2RlIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBwcmV2aW91c0FjdGl2ZTogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzY3JvbGxMb2NrOiBTY3JvbGxMb2NrU25hcHNob3QgPSB7XG4gICAgaHRtbExlZnQ6ICcnLFxuICAgIGh0bWxUb3A6ICcnLFxuICAgIHNjcm9sbFg6IDAsXG4gICAgc2Nyb2xsWTogMCxcbiAgICBib2R5T3ZlcmZsb3c6ICcnLFxuICAgIGJvZHlUb3VjaEFjdGlvbjogJycsXG4gIH07XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydvcGVuJ10pIHtcbiAgICAgIGlmICh0aGlzLm9wZW4pIHtcbiAgICAgICAgdGhpcy5hdHRhY2hIb3N0VG9Cb2R5KCk7XG4gICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICBpZiAoYSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGEgIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgICB0aGlzLnByZXZpb3VzQWN0aXZlID0gYTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjcm9sbExvY2sgPSBsb2NrUGFnZVNjcm9sbENka1N0eWxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bmxvY2tQYWdlU2Nyb2xsQ2RrU3R5bGUodGhpcy5zY3JvbGxMb2NrKTtcbiAgICAgICAgdGhpcy5kZXRhY2hIb3N0RnJvbUJvZHkoKTtcbiAgICAgICAgdGhpcy5yZXN0b3JlRm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcGVuKSB7XG4gICAgICB1bmxvY2tQYWdlU2Nyb2xsQ2RrU3R5bGUodGhpcy5zY3JvbGxMb2NrKTtcbiAgICB9XG4gICAgdGhpcy5kZXRhY2hIb3N0RnJvbUJvZHkoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoSG9zdFRvQm9keSgpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGVsLnBhcmVudEVsZW1lbnQgPT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ib2R5UmVzdG9yZVBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQ7XG4gICAgdGhpcy5ib2R5UmVzdG9yZU5leHQgPSBlbC5uZXh0U2libGluZztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsKTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0YWNoSG9zdEZyb21Cb2R5KCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gdGhpcy5ob3N0RWwubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoZWwucGFyZW50RWxlbWVudCAhPT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgdGhpcy5ib2R5UmVzdG9yZVBhcmVudCA9IG51bGw7XG4gICAgICB0aGlzLmJvZHlSZXN0b3JlTmV4dCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuYm9keVJlc3RvcmVQYXJlbnQ7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuYm9keVJlc3RvcmVOZXh0O1xuICAgIHRoaXMuYm9keVJlc3RvcmVQYXJlbnQgPSBudWxsO1xuICAgIHRoaXMuYm9keVJlc3RvcmVOZXh0ID0gbnVsbDtcbiAgICBpZiAocGFyZW50ICYmIGRvY3VtZW50LmJvZHkuY29udGFpbnMocGFyZW50KSkge1xuICAgICAgaWYgKG5leHQgJiYgbmV4dC5wYXJlbnROb2RlID09PSBwYXJlbnQpIHtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShlbCwgbmV4dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChlbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFwcFJvb3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdhcHAtcm9vdCcpO1xuICAgIGlmIChhcHBSb290KSB7XG4gICAgICBhcHBSb290LmFwcGVuZENoaWxkKGVsKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudEtleWRvd24oZXY6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub3BlbiB8fCBldi5rZXkgIT09ICdFc2NhcGUnIHx8ICF0aGlzLmFsbG93T3ZlcmxheURpc21pc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnJlcXVlc3RDbG9zZSgpO1xuICB9XG5cbiAgb25CYWNrZHJvcENsaWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hbGxvd092ZXJsYXlEaXNtaXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVxdWVzdENsb3NlKCk7XG4gIH1cblxuICByZXF1ZXN0Q2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9wZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIHVubG9ja1BhZ2VTY3JvbGxDZGtTdHlsZSh0aGlzLnNjcm9sbExvY2spO1xuICAgIHRoaXMucmVzdG9yZUZvY3VzKCk7XG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVGb2N1cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcmV2aW91c0FjdGl2ZSAmJiBkb2N1bWVudC5jb250YWlucyh0aGlzLnByZXZpb3VzQWN0aXZlKSkge1xuICAgICAgdGhpcy5wcmV2aW91c0FjdGl2ZS5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgfVxuICAgIHRoaXMucHJldmlvdXNBY3RpdmUgPSBudWxsO1xuICB9XG59XG4iLCJAaWYgKG9wZW4pIHtcclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cImFwcC1kaWFsb2ctYmFja2Ryb3BcIlxyXG4gICAgcm9sZT1cInByZXNlbnRhdGlvblwiXHJcbiAgICB0YWJpbmRleD1cIi0xXCJcclxuICAgIChjbGljayk9XCJvbkJhY2tkcm9wQ2xpY2soKVwiXHJcbiAgPjwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJhcHAtZGlhbG9nLXN0YWdlXCIgYXJpYS1oaWRkZW49XCJmYWxzZVwiPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImFwcC1kaWFsb2ctcGFuZWxcIlxyXG4gICAgICBbY2xhc3MuYXBwLWRpYWxvZy1wYW5lbC0tc21dPVwic2l6ZSA9PT0gTGliRGlhbG9nU2l6ZS5TbVwiXHJcbiAgICAgIFtjbGFzcy5hcHAtZGlhbG9nLXBhbmVsLS1tZF09XCJzaXplID09PSBMaWJEaWFsb2dTaXplLk1kXCJcclxuICAgICAgW2NsYXNzLmFwcC1kaWFsb2ctcGFuZWwtLWxnXT1cInNpemUgPT09IExpYkRpYWxvZ1NpemUuTGdcIlxyXG4gICAgICByb2xlPVwiZGlhbG9nXCJcclxuICAgICAgYXJpYS1tb2RhbD1cInRydWVcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiXHJcbiAgICAgICAgZGlhbG9nSGVhZGluZy50cmltKCkgPyB0aXRsZUlkIDogZGVzY3JpcHRpb24udHJpbSgpID8gZGVzY3JpcHRpb25JZCA6IG51bGxcclxuICAgICAgXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIhZGlhbG9nSGVhZGluZy50cmltKCkgJiYgIWRlc2NyaXB0aW9uLnRyaW0oKSA/IGFyaWFMYWJlbCA6IG51bGxcIlxyXG4gICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIlxyXG4gICAgICAgIGRpYWxvZ0hlYWRpbmcudHJpbSgpICYmIGRlc2NyaXB0aW9uLnRyaW0oKSA/IGRlc2NyaXB0aW9uSWQgOiBudWxsXHJcbiAgICAgIFwiXHJcbiAgICAgIGNka1RyYXBGb2N1c1xyXG4gICAgICBbY2RrVHJhcEZvY3VzQXV0b0NhcHR1cmVdPVwidHJ1ZVwiXHJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgPlxyXG4gICAgICBAaWYgKGRpYWxvZ0hlYWRpbmcudHJpbSgpKSB7XHJcbiAgICAgICAgPGhlYWRlciBjbGFzcz1cImFwcC1kaWFsb2ctaGVhZGVyXCI+XHJcbiAgICAgICAgICA8aDIgY2xhc3M9XCJhcHAtZGlhbG9nLXRpdGxlXCIgW2lkXT1cInRpdGxlSWRcIj57eyBkaWFsb2dIZWFkaW5nIH19PC9oMj5cclxuICAgICAgICAgIEBpZiAoc2hvd0Nsb3NlQnV0dG9uKSB7XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImFwcC1kaWFsb2ctY2xvc2VcIlxyXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGZWNoYXIgZGnDoWxvZ29cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZXF1ZXN0Q2xvc2UoKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgfVxyXG4gICAgICBAaWYgKGRlc2NyaXB0aW9uLnRyaW0oKSkge1xyXG4gICAgICAgIDxwIGNsYXNzPVwiYXBwLWRpYWxvZy1kZXNjcmlwdGlvblwiIFtpZF09XCJkZXNjcmlwdGlvbklkXCI+e3sgZGVzY3JpcHRpb24gfX08L3A+XHJcbiAgICAgIH1cclxuICAgICAgPGRpdiBjbGFzcz1cImFwcC1kaWFsb2ctYm9keVwiPlxyXG4gICAgICAgIDxuZy1jb250ZW50IC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8Zm9vdGVyIGNsYXNzPVwiYXBwLWRpYWxvZy1mb290ZXJcIj5cclxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYXBwRGlhbG9nRm9vdGVyXVwiIC8+XHJcbiAgICAgIDwvZm9vdGVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbn1cclxuIl19