valtech-components 2.0.292 → 2.0.293

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.
Files changed (65) hide show
  1. package/esm2022/lib/components/atoms/avatar/avatar.component.mjs +3 -3
  2. package/esm2022/lib/components/atoms/box/box.component.mjs +3 -3
  3. package/esm2022/lib/components/atoms/button/button.component.mjs +45 -12
  4. package/esm2022/lib/components/atoms/display/display.component.mjs +47 -11
  5. package/esm2022/lib/components/atoms/display/types.mjs +1 -1
  6. package/esm2022/lib/components/atoms/divider/divider.component.mjs +3 -3
  7. package/esm2022/lib/components/atoms/href/href.component.mjs +3 -3
  8. package/esm2022/lib/components/atoms/icon/icon.component.mjs +3 -3
  9. package/esm2022/lib/components/atoms/image/image.component.mjs +3 -3
  10. package/esm2022/lib/components/atoms/progress-bar/progress-bar.component.mjs +3 -3
  11. package/esm2022/lib/components/atoms/text/text.component.mjs +3 -3
  12. package/esm2022/lib/components/atoms/title/title.component.mjs +77 -23
  13. package/esm2022/lib/components/atoms/title/types.mjs +30 -2
  14. package/esm2022/lib/components/molecules/alert-box/alert-box.component.mjs +57 -10
  15. package/esm2022/lib/components/molecules/alert-box/types.mjs +1 -1
  16. package/esm2022/lib/components/molecules/button-group/button-group.component.mjs +3 -3
  17. package/esm2022/lib/components/molecules/card/card.component.mjs +3 -3
  18. package/esm2022/lib/components/molecules/content-loader/content-loader.component.mjs +3 -3
  19. package/esm2022/lib/components/molecules/date-input/date-input.component.mjs +3 -3
  20. package/esm2022/lib/components/molecules/file-input/file-input.component.mjs +3 -3
  21. package/esm2022/lib/components/molecules/hint/hint.component.mjs +3 -3
  22. package/esm2022/lib/components/molecules/layered-card/layered-card.component.mjs +3 -3
  23. package/esm2022/lib/components/molecules/link/link.component.mjs +3 -3
  24. package/esm2022/lib/components/molecules/links-cake/links-cake.component.mjs +3 -3
  25. package/esm2022/lib/components/molecules/notes-box/notes-box.component.mjs +3 -3
  26. package/esm2022/lib/components/molecules/password-input/password-input.component.mjs +3 -3
  27. package/esm2022/lib/components/molecules/pin-input/pin-input.component.mjs +3 -3
  28. package/esm2022/lib/components/molecules/progress-status/progress-status.component.mjs +3 -3
  29. package/esm2022/lib/components/molecules/prompter/prompter.component.mjs +3 -3
  30. package/esm2022/lib/components/molecules/searchbar/searchbar.component.mjs +3 -3
  31. package/esm2022/lib/components/molecules/text-input/text-input.component.mjs +3 -3
  32. package/esm2022/lib/components/molecules/title-block/title-block.component.mjs +3 -3
  33. package/esm2022/lib/components/organisms/banner/banner.component.mjs +3 -3
  34. package/esm2022/lib/components/organisms/form/form.component.mjs +3 -3
  35. package/esm2022/lib/components/organisms/header/header.component.mjs +3 -3
  36. package/esm2022/lib/components/organisms/item-list/item-list.component.mjs +3 -3
  37. package/esm2022/lib/components/organisms/item-list/types.mjs +1 -1
  38. package/esm2022/lib/components/organisms/no-content/no-content.component.mjs +3 -3
  39. package/esm2022/lib/components/organisms/toolbar/toolbar.component.mjs +3 -3
  40. package/esm2022/lib/components/organisms/wizard/wizard.component.mjs +3 -3
  41. package/esm2022/lib/components/templates/layout/layout.component.mjs +2 -2
  42. package/esm2022/lib/components/types.mjs +1 -1
  43. package/esm2022/lib/examples/display-demo.component.mjs +518 -0
  44. package/esm2022/lib/examples/display-simple-example.component.mjs +202 -0
  45. package/esm2022/lib/services/lang-provider/content.mjs +2 -1
  46. package/esm2022/lib/shared/utils/reactive-content.mjs +117 -0
  47. package/esm2022/public-api.mjs +4 -1
  48. package/fesm2022/valtech-components.mjs +2718 -1702
  49. package/fesm2022/valtech-components.mjs.map +1 -1
  50. package/lib/components/atoms/button/button.component.d.ts +10 -3
  51. package/lib/components/atoms/display/display.component.d.ts +12 -4
  52. package/lib/components/atoms/display/types.d.ts +13 -3
  53. package/lib/components/atoms/title/title.component.d.ts +6 -1
  54. package/lib/components/atoms/title/types.d.ts +29 -3
  55. package/lib/components/molecules/alert-box/alert-box.component.d.ts +17 -9
  56. package/lib/components/molecules/alert-box/types.d.ts +29 -0
  57. package/lib/components/organisms/item-list/types.d.ts +54 -9
  58. package/lib/components/types.d.ts +12 -3
  59. package/lib/examples/display-demo.component.d.ts +59 -0
  60. package/lib/examples/display-simple-example.component.d.ts +23 -0
  61. package/lib/shared/utils/reactive-content.d.ts +109 -0
  62. package/package.json +4 -2
  63. package/public-api.d.ts +3 -0
  64. package/src/lib/components/styles/overrides.scss +583 -0
  65. package/src/lib/components/styles/variables.scss +7 -3
@@ -0,0 +1,518 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component } from '@angular/core';
3
+ import { IonButton, IonCard, IonCardContent, IonCardHeader, IonCardTitle, IonItem, IonLabel, IonSelect, IonSelectOption, } from '@ionic/angular/standalone';
4
+ import { map } from 'rxjs/operators';
5
+ import { DisplayComponent } from '../components/atoms/display/display.component';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../services/content.service";
8
+ import * as i2 from "../services/lang-provider/lang-provider.service";
9
+ import * as i3 from "@angular/common";
10
+ /**
11
+ * Componente de demostración para val-display con contenido reactivo.
12
+ * Muestra diferentes patrones de uso y casos de ejemplo.
13
+ */
14
+ export class DisplayDemoComponent {
15
+ constructor(contentService, langService) {
16
+ this.contentService = contentService;
17
+ this.langService = langService;
18
+ // Contador para ejemplos dinámicos
19
+ this.counter = 0;
20
+ // Configuraciones de ejemplo - ESTÁTICAS
21
+ this.smallStaticDisplay = {
22
+ content: 'Texto pequeño estático',
23
+ color: 'dark',
24
+ size: 'small',
25
+ };
26
+ this.mediumStaticDisplay = {
27
+ content: 'Texto mediano estático',
28
+ color: 'dark',
29
+ size: 'medium',
30
+ };
31
+ this.largeStaticDisplay = {
32
+ content: 'Texto grande estático',
33
+ color: 'dark',
34
+ size: 'large',
35
+ };
36
+ this.xlargeStaticDisplay = {
37
+ content: 'Texto extra grande estático',
38
+ color: 'dark',
39
+ size: 'xlarge',
40
+ };
41
+ // Ejemplos de colores estáticos
42
+ this.primaryDisplay = {
43
+ content: 'Texto primario',
44
+ color: 'primary',
45
+ size: 'medium',
46
+ };
47
+ this.secondaryDisplay = {
48
+ content: 'Texto secundario',
49
+ color: 'secondary',
50
+ size: 'medium',
51
+ };
52
+ this.successDisplay = {
53
+ content: 'Texto de éxito',
54
+ color: 'success',
55
+ size: 'medium',
56
+ };
57
+ this.warningDisplay = {
58
+ content: 'Texto de advertencia',
59
+ color: 'warning',
60
+ size: 'medium',
61
+ };
62
+ this.dangerDisplay = {
63
+ content: 'Texto de peligro',
64
+ color: 'danger',
65
+ size: 'medium',
66
+ };
67
+ // Configuraciones de ejemplo - REACTIVAS
68
+ this.welcomeDisplay = {
69
+ contentConfig: {
70
+ className: 'displayDemo',
71
+ key: 'welcome.title',
72
+ fallback: 'Bienvenido a la aplicación',
73
+ },
74
+ color: 'primary',
75
+ size: 'xlarge',
76
+ };
77
+ this.descriptionDisplay = {
78
+ contentConfig: {
79
+ className: 'displayDemo',
80
+ key: 'welcome.description',
81
+ fallback: 'Esta es una descripción de ejemplo',
82
+ },
83
+ color: 'medium',
84
+ size: 'medium',
85
+ };
86
+ this.statusDisplay = {
87
+ contentConfig: {
88
+ className: 'displayDemo',
89
+ key: 'status.online',
90
+ fallback: 'En línea',
91
+ },
92
+ color: 'success',
93
+ size: 'small',
94
+ };
95
+ // Ejemplos con interpolación
96
+ this.userWelcomeDisplay = {
97
+ contentConfig: {
98
+ className: 'displayDemo',
99
+ key: 'welcome.user',
100
+ fallback: 'Hola, {{userName}}!',
101
+ interpolation: {
102
+ userName: 'Juan Pérez',
103
+ },
104
+ },
105
+ color: 'tertiary',
106
+ size: 'large',
107
+ };
108
+ this.counterDisplay = {
109
+ contentConfig: {
110
+ className: 'displayDemo',
111
+ key: 'counter.current',
112
+ fallback: 'Contador: {{count}}',
113
+ interpolation: {
114
+ count: this.counter,
115
+ },
116
+ },
117
+ color: 'secondary',
118
+ size: 'medium',
119
+ };
120
+ // Ejemplos con claves faltantes para demostrar fallbacks
121
+ this.missingKeyDisplay = {
122
+ contentConfig: {
123
+ className: 'displayDemo',
124
+ key: 'this.key.does.not.exist',
125
+ fallback: 'Esta clave no existe, pero tengo fallback',
126
+ },
127
+ color: 'warning',
128
+ size: 'medium',
129
+ };
130
+ this.noFallbackDisplay = {
131
+ contentConfig: {
132
+ className: 'displayDemo',
133
+ key: 'another.missing.key',
134
+ // Sin fallback - usará la clave como fallback
135
+ },
136
+ color: 'danger',
137
+ size: 'small',
138
+ };
139
+ // Ejemplos mixtos
140
+ this.staticMixedDisplay = {
141
+ content: 'Este es contenido estático (no cambia con el idioma)',
142
+ color: 'dark',
143
+ size: 'medium',
144
+ };
145
+ this.reactiveMixedDisplay = {
146
+ contentConfig: {
147
+ className: 'displayDemo',
148
+ key: 'mixed.reactive',
149
+ fallback: 'Este contenido sí cambia con el idioma',
150
+ },
151
+ color: 'primary',
152
+ size: 'medium',
153
+ };
154
+ // Ejemplo dinámico que se actualiza
155
+ this.dynamicCounterDisplay = {
156
+ contentConfig: {
157
+ className: 'displayDemo',
158
+ key: 'dynamic.counter',
159
+ fallback: 'Clics: {{count}}',
160
+ interpolation: {
161
+ count: this.counter,
162
+ },
163
+ },
164
+ color: 'tertiary',
165
+ size: 'large',
166
+ };
167
+ }
168
+ ngOnInit() {
169
+ this.initializeContent();
170
+ this.initializeLanguageState();
171
+ }
172
+ initializeContent() {
173
+ // Contenido de la página
174
+ this.demoTitle$ = this.contentService.fromContent({
175
+ className: 'displayDemo',
176
+ key: 'page.title',
177
+ fallback: 'Demostración del Componente Display',
178
+ });
179
+ this.languageLabel$ = this.contentService.fromContent({
180
+ className: '_global',
181
+ key: 'language',
182
+ fallback: 'Idioma',
183
+ });
184
+ this.staticSectionTitle$ = this.contentService.fromContent({
185
+ className: 'displayDemo',
186
+ key: 'sections.static',
187
+ fallback: 'Ejemplos Estáticos',
188
+ });
189
+ this.reactiveSectionTitle$ = this.contentService.fromContent({
190
+ className: 'displayDemo',
191
+ key: 'sections.reactive',
192
+ fallback: 'Ejemplos Reactivos',
193
+ });
194
+ this.mixedSectionTitle$ = this.contentService.fromContent({
195
+ className: 'displayDemo',
196
+ key: 'sections.mixed',
197
+ fallback: 'Ejemplos Mixtos',
198
+ });
199
+ this.dynamicSectionTitle$ = this.contentService.fromContent({
200
+ className: 'displayDemo',
201
+ key: 'sections.dynamic',
202
+ fallback: 'Ejemplos Dinámicos',
203
+ });
204
+ this.analysisTitle$ = this.contentService.fromContent({
205
+ className: 'displayDemo',
206
+ key: 'sections.analysis',
207
+ fallback: 'Análisis de Idioma',
208
+ });
209
+ this.reactiveContentTitle$ = this.contentService.fromContent({
210
+ className: 'displayDemo',
211
+ key: 'subsections.reactiveContent',
212
+ fallback: 'Contenido reactivo básico:',
213
+ });
214
+ this.interpolationTitle$ = this.contentService.fromContent({
215
+ className: 'displayDemo',
216
+ key: 'subsections.interpolation',
217
+ fallback: 'Contenido con interpolación:',
218
+ });
219
+ this.fallbackTitle$ = this.contentService.fromContent({
220
+ className: 'displayDemo',
221
+ key: 'subsections.fallback',
222
+ fallback: 'Demostración de fallbacks:',
223
+ });
224
+ this.mixedContentTitle$ = this.contentService.fromContent({
225
+ className: 'displayDemo',
226
+ key: 'subsections.mixedContent',
227
+ fallback: 'Contenido estático vs reactivo:',
228
+ });
229
+ this.dynamicContentTitle$ = this.contentService.fromContent({
230
+ className: 'displayDemo',
231
+ key: 'subsections.dynamicContent',
232
+ fallback: 'Contenido que se actualiza dinámicamente:',
233
+ });
234
+ this.updateButtonText$ = this.contentService.fromContent({
235
+ className: 'displayDemo',
236
+ key: 'buttons.updateCounter',
237
+ fallback: 'Actualizar Contador',
238
+ });
239
+ this.currentLangLabel$ = this.contentService.fromContent({
240
+ className: 'displayDemo',
241
+ key: 'analysis.currentLanguage',
242
+ fallback: 'Idioma actual',
243
+ });
244
+ this.availableLangsLabel$ = this.contentService.fromContent({
245
+ className: 'displayDemo',
246
+ key: 'analysis.availableLanguages',
247
+ fallback: 'Idiomas disponibles',
248
+ });
249
+ }
250
+ initializeLanguageState() {
251
+ this.currentLanguage$ = this.langService.currentLang$;
252
+ this.availableLanguages$ = this.langService.currentLang$.pipe(map(() => this.langService.availableLangs));
253
+ }
254
+ changeLanguage(language) {
255
+ this.langService.setLang(language);
256
+ }
257
+ updateCounter() {
258
+ this.counter++;
259
+ // Actualizar los displays que usan el contador
260
+ this.counterDisplay = {
261
+ ...this.counterDisplay,
262
+ contentConfig: {
263
+ ...this.counterDisplay.contentConfig,
264
+ interpolation: {
265
+ count: this.counter,
266
+ },
267
+ },
268
+ };
269
+ this.dynamicCounterDisplay = {
270
+ ...this.dynamicCounterDisplay,
271
+ contentConfig: {
272
+ ...this.dynamicCounterDisplay.contentConfig,
273
+ interpolation: {
274
+ count: this.counter,
275
+ },
276
+ },
277
+ };
278
+ }
279
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DisplayDemoComponent, deps: [{ token: i1.ContentService }, { token: i2.LangService }], target: i0.ɵɵFactoryTarget.Component }); }
280
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DisplayDemoComponent, isStandalone: true, selector: "val-display-demo", ngImport: i0, template: `
281
+ <div class="display-demo">
282
+ <ion-card>
283
+ <ion-card-header>
284
+ <ion-card-title>{{ demoTitle$ | async }}</ion-card-title>
285
+ </ion-card-header>
286
+
287
+ <ion-card-content>
288
+ <!-- Selector de idioma -->
289
+ <ion-item>
290
+ <ion-label>{{ languageLabel$ | async }}</ion-label>
291
+ <ion-select
292
+ interface="popover"
293
+ [value]="currentLanguage$ | async"
294
+ (ionChange)="changeLanguage($event.detail.value)"
295
+ >
296
+ <ion-select-option *ngFor="let lang of availableLanguages$ | async" [value]="lang">
297
+ {{ lang | uppercase }}
298
+ </ion-select-option>
299
+ </ion-select>
300
+ </ion-item>
301
+
302
+ <!-- Ejemplos estáticos -->
303
+ <div class="section">
304
+ <h3>{{ staticSectionTitle$ | async }}</h3>
305
+
306
+ <div class="example-group">
307
+ <h4>Diferentes tamaños:</h4>
308
+ <val-display [props]="smallStaticDisplay"></val-display>
309
+ <val-display [props]="mediumStaticDisplay"></val-display>
310
+ <val-display [props]="largeStaticDisplay"></val-display>
311
+ <val-display [props]="xlargeStaticDisplay"></val-display>
312
+ </div>
313
+
314
+ <div class="example-group">
315
+ <h4>Diferentes colores:</h4>
316
+ <val-display [props]="primaryDisplay"></val-display>
317
+ <val-display [props]="secondaryDisplay"></val-display>
318
+ <val-display [props]="successDisplay"></val-display>
319
+ <val-display [props]="warningDisplay"></val-display>
320
+ <val-display [props]="dangerDisplay"></val-display>
321
+ </div>
322
+ </div>
323
+
324
+ <!-- Ejemplos reactivos -->
325
+ <div class="section">
326
+ <h3>{{ reactiveSectionTitle$ | async }}</h3>
327
+
328
+ <div class="example-group">
329
+ <h4>{{ reactiveContentTitle$ | async }}</h4>
330
+ <val-display [props]="welcomeDisplay"></val-display>
331
+ <val-display [props]="descriptionDisplay"></val-display>
332
+ <val-display [props]="statusDisplay"></val-display>
333
+ </div>
334
+
335
+ <div class="example-group">
336
+ <h4>{{ interpolationTitle$ | async }}</h4>
337
+ <val-display [props]="userWelcomeDisplay"></val-display>
338
+ <val-display [props]="counterDisplay"></val-display>
339
+ </div>
340
+
341
+ <div class="example-group">
342
+ <h4>{{ fallbackTitle$ | async }}</h4>
343
+ <val-display [props]="missingKeyDisplay"></val-display>
344
+ <val-display [props]="noFallbackDisplay"></val-display>
345
+ </div>
346
+ </div>
347
+
348
+ <!-- Ejemplos mixtos -->
349
+ <div class="section">
350
+ <h3>{{ mixedSectionTitle$ | async }}</h3>
351
+
352
+ <div class="example-group">
353
+ <h4>{{ mixedContentTitle$ | async }}</h4>
354
+ <div class="mixed-examples">
355
+ <val-display [props]="staticMixedDisplay"></val-display>
356
+ <val-display [props]="reactiveMixedDisplay"></val-display>
357
+ </div>
358
+ </div>
359
+ </div>
360
+
361
+ <!-- Ejemplos dinámicos -->
362
+ <div class="section">
363
+ <h3>{{ dynamicSectionTitle$ | async }}</h3>
364
+
365
+ <div class="example-group">
366
+ <h4>{{ dynamicContentTitle$ | async }}</h4>
367
+ <ion-button (click)="updateCounter()" color="primary">
368
+ {{ updateButtonText$ | async }}
369
+ </ion-button>
370
+ <val-display [props]="dynamicCounterDisplay"></val-display>
371
+ </div>
372
+ </div>
373
+
374
+ <!-- Análisis de contenido -->
375
+ <div class="section">
376
+ <h3>{{ analysisTitle$ | async }}</h3>
377
+ <div class="analysis-info">
378
+ <p>
379
+ <strong>{{ currentLangLabel$ | async }}:</strong> {{ currentLanguage$ | async | uppercase }}
380
+ </p>
381
+ <p>
382
+ <strong>{{ availableLangsLabel$ | async }}:</strong>
383
+ {{ (availableLanguages$ | async)?.join(', ') | uppercase }}
384
+ </p>
385
+ </div>
386
+ </div>
387
+ </ion-card-content>
388
+ </ion-card>
389
+ </div>
390
+ `, isInline: true, styles: [".display-demo{padding:16px}.section{margin:24px 0;border-bottom:1px solid var(--ion-color-light);padding-bottom:16px}.example-group{margin:16px 0;padding:12px;background:var(--ion-color-light);border-radius:8px}.example-group h4{margin:0 0 12px;color:var(--ion-color-medium)}.mixed-examples{display:flex;flex-direction:column;gap:8px}.analysis-info{background:var(--ion-color-step-50);padding:16px;border-radius:8px;margin-top:16px}val-display{display:block;margin:8px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.UpperCasePipe, name: "uppercase" }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "expandedIcon", "fill", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }] }); }
391
+ }
392
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DisplayDemoComponent, decorators: [{
393
+ type: Component,
394
+ args: [{ selector: 'val-display-demo', standalone: true, imports: [
395
+ CommonModule,
396
+ IonCard,
397
+ IonCardContent,
398
+ IonCardHeader,
399
+ IonCardTitle,
400
+ IonSelect,
401
+ IonSelectOption,
402
+ IonItem,
403
+ IonLabel,
404
+ IonButton,
405
+ DisplayComponent,
406
+ ], template: `
407
+ <div class="display-demo">
408
+ <ion-card>
409
+ <ion-card-header>
410
+ <ion-card-title>{{ demoTitle$ | async }}</ion-card-title>
411
+ </ion-card-header>
412
+
413
+ <ion-card-content>
414
+ <!-- Selector de idioma -->
415
+ <ion-item>
416
+ <ion-label>{{ languageLabel$ | async }}</ion-label>
417
+ <ion-select
418
+ interface="popover"
419
+ [value]="currentLanguage$ | async"
420
+ (ionChange)="changeLanguage($event.detail.value)"
421
+ >
422
+ <ion-select-option *ngFor="let lang of availableLanguages$ | async" [value]="lang">
423
+ {{ lang | uppercase }}
424
+ </ion-select-option>
425
+ </ion-select>
426
+ </ion-item>
427
+
428
+ <!-- Ejemplos estáticos -->
429
+ <div class="section">
430
+ <h3>{{ staticSectionTitle$ | async }}</h3>
431
+
432
+ <div class="example-group">
433
+ <h4>Diferentes tamaños:</h4>
434
+ <val-display [props]="smallStaticDisplay"></val-display>
435
+ <val-display [props]="mediumStaticDisplay"></val-display>
436
+ <val-display [props]="largeStaticDisplay"></val-display>
437
+ <val-display [props]="xlargeStaticDisplay"></val-display>
438
+ </div>
439
+
440
+ <div class="example-group">
441
+ <h4>Diferentes colores:</h4>
442
+ <val-display [props]="primaryDisplay"></val-display>
443
+ <val-display [props]="secondaryDisplay"></val-display>
444
+ <val-display [props]="successDisplay"></val-display>
445
+ <val-display [props]="warningDisplay"></val-display>
446
+ <val-display [props]="dangerDisplay"></val-display>
447
+ </div>
448
+ </div>
449
+
450
+ <!-- Ejemplos reactivos -->
451
+ <div class="section">
452
+ <h3>{{ reactiveSectionTitle$ | async }}</h3>
453
+
454
+ <div class="example-group">
455
+ <h4>{{ reactiveContentTitle$ | async }}</h4>
456
+ <val-display [props]="welcomeDisplay"></val-display>
457
+ <val-display [props]="descriptionDisplay"></val-display>
458
+ <val-display [props]="statusDisplay"></val-display>
459
+ </div>
460
+
461
+ <div class="example-group">
462
+ <h4>{{ interpolationTitle$ | async }}</h4>
463
+ <val-display [props]="userWelcomeDisplay"></val-display>
464
+ <val-display [props]="counterDisplay"></val-display>
465
+ </div>
466
+
467
+ <div class="example-group">
468
+ <h4>{{ fallbackTitle$ | async }}</h4>
469
+ <val-display [props]="missingKeyDisplay"></val-display>
470
+ <val-display [props]="noFallbackDisplay"></val-display>
471
+ </div>
472
+ </div>
473
+
474
+ <!-- Ejemplos mixtos -->
475
+ <div class="section">
476
+ <h3>{{ mixedSectionTitle$ | async }}</h3>
477
+
478
+ <div class="example-group">
479
+ <h4>{{ mixedContentTitle$ | async }}</h4>
480
+ <div class="mixed-examples">
481
+ <val-display [props]="staticMixedDisplay"></val-display>
482
+ <val-display [props]="reactiveMixedDisplay"></val-display>
483
+ </div>
484
+ </div>
485
+ </div>
486
+
487
+ <!-- Ejemplos dinámicos -->
488
+ <div class="section">
489
+ <h3>{{ dynamicSectionTitle$ | async }}</h3>
490
+
491
+ <div class="example-group">
492
+ <h4>{{ dynamicContentTitle$ | async }}</h4>
493
+ <ion-button (click)="updateCounter()" color="primary">
494
+ {{ updateButtonText$ | async }}
495
+ </ion-button>
496
+ <val-display [props]="dynamicCounterDisplay"></val-display>
497
+ </div>
498
+ </div>
499
+
500
+ <!-- Análisis de contenido -->
501
+ <div class="section">
502
+ <h3>{{ analysisTitle$ | async }}</h3>
503
+ <div class="analysis-info">
504
+ <p>
505
+ <strong>{{ currentLangLabel$ | async }}:</strong> {{ currentLanguage$ | async | uppercase }}
506
+ </p>
507
+ <p>
508
+ <strong>{{ availableLangsLabel$ | async }}:</strong>
509
+ {{ (availableLanguages$ | async)?.join(', ') | uppercase }}
510
+ </p>
511
+ </div>
512
+ </div>
513
+ </ion-card-content>
514
+ </ion-card>
515
+ </div>
516
+ `, styles: [".display-demo{padding:16px}.section{margin:24px 0;border-bottom:1px solid var(--ion-color-light);padding-bottom:16px}.example-group{margin:16px 0;padding:12px;background:var(--ion-color-light);border-radius:8px}.example-group h4{margin:0 0 12px;color:var(--ion-color-medium)}.mixed-examples{display:flex;flex-direction:column;gap:8px}.analysis-info{background:var(--ion-color-step-50);padding:16px;border-radius:8px;margin-top:16px}val-display{display:block;margin:8px 0}\n"] }]
517
+ }], ctorParameters: () => [{ type: i1.ContentService }, { type: i2.LangService }] });
518
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS1kZW1vLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRlY2gtY29tcG9uZW50cy9zcmMvbGliL2V4YW1wbGVzL2Rpc3BsYXktZGVtby5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUNMLFNBQVMsRUFDVCxPQUFPLEVBQ1AsY0FBYyxFQUNkLGFBQWEsRUFDYixZQUFZLEVBQ1osT0FBTyxFQUNQLFFBQVEsRUFDUixTQUFTLEVBQ1QsZUFBZSxHQUNoQixNQUFNLDJCQUEyQixDQUFDO0FBRW5DLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQzs7Ozs7QUFLakY7OztHQUdHO0FBc0tILE1BQU0sT0FBTyxvQkFBb0I7SUErTC9CLFlBQ1UsY0FBOEIsRUFDOUIsV0FBd0I7UUFEeEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBM0tsQyxtQ0FBbUM7UUFDM0IsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUVwQix5Q0FBeUM7UUFDekMsdUJBQWtCLEdBQW9CO1lBQ3BDLE9BQU8sRUFBRSx3QkFBd0I7WUFDakMsS0FBSyxFQUFFLE1BQU07WUFDYixJQUFJLEVBQUUsT0FBTztTQUNkLENBQUM7UUFFRix3QkFBbUIsR0FBb0I7WUFDckMsT0FBTyxFQUFFLHdCQUF3QjtZQUNqQyxLQUFLLEVBQUUsTUFBTTtZQUNiLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztRQUVGLHVCQUFrQixHQUFvQjtZQUNwQyxPQUFPLEVBQUUsdUJBQXVCO1lBQ2hDLEtBQUssRUFBRSxNQUFNO1lBQ2IsSUFBSSxFQUFFLE9BQU87U0FDZCxDQUFDO1FBRUYsd0JBQW1CLEdBQW9CO1lBQ3JDLE9BQU8sRUFBRSw2QkFBNkI7WUFDdEMsS0FBSyxFQUFFLE1BQU07WUFDYixJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUM7UUFFRixnQ0FBZ0M7UUFDaEMsbUJBQWMsR0FBb0I7WUFDaEMsT0FBTyxFQUFFLGdCQUFnQjtZQUN6QixLQUFLLEVBQUUsU0FBUztZQUNoQixJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUM7UUFFRixxQkFBZ0IsR0FBb0I7WUFDbEMsT0FBTyxFQUFFLGtCQUFrQjtZQUMzQixLQUFLLEVBQUUsV0FBVztZQUNsQixJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUM7UUFFRixtQkFBYyxHQUFvQjtZQUNoQyxPQUFPLEVBQUUsZ0JBQWdCO1lBQ3pCLEtBQUssRUFBRSxTQUFTO1lBQ2hCLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztRQUVGLG1CQUFjLEdBQW9CO1lBQ2hDLE9BQU8sRUFBRSxzQkFBc0I7WUFDL0IsS0FBSyxFQUFFLFNBQVM7WUFDaEIsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO1FBRUYsa0JBQWEsR0FBb0I7WUFDL0IsT0FBTyxFQUFFLGtCQUFrQjtZQUMzQixLQUFLLEVBQUUsUUFBUTtZQUNmLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztRQUVGLHlDQUF5QztRQUN6QyxtQkFBYyxHQUFvQjtZQUNoQyxhQUFhLEVBQUU7Z0JBQ2IsU0FBUyxFQUFFLGFBQWE7Z0JBQ3hCLEdBQUcsRUFBRSxlQUFlO2dCQUNwQixRQUFRLEVBQUUsNEJBQTRCO2FBQ3ZDO1lBQ0QsS0FBSyxFQUFFLFNBQVM7WUFDaEIsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO1FBRUYsdUJBQWtCLEdBQW9CO1lBQ3BDLGFBQWEsRUFBRTtnQkFDYixTQUFTLEVBQUUsYUFBYTtnQkFDeEIsR0FBRyxFQUFFLHFCQUFxQjtnQkFDMUIsUUFBUSxFQUFFLG9DQUFvQzthQUMvQztZQUNELEtBQUssRUFBRSxRQUFRO1lBQ2YsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO1FBRUYsa0JBQWEsR0FBb0I7WUFDL0IsYUFBYSxFQUFFO2dCQUNiLFNBQVMsRUFBRSxhQUFhO2dCQUN4QixHQUFHLEVBQUUsZUFBZTtnQkFDcEIsUUFBUSxFQUFFLFVBQVU7YUFDckI7WUFDRCxLQUFLLEVBQUUsU0FBUztZQUNoQixJQUFJLEVBQUUsT0FBTztTQUNkLENBQUM7UUFFRiw2QkFBNkI7UUFDN0IsdUJBQWtCLEdBQW9CO1lBQ3BDLGFBQWEsRUFBRTtnQkFDYixTQUFTLEVBQUUsYUFBYTtnQkFDeEIsR0FBRyxFQUFFLGNBQWM7Z0JBQ25CLFFBQVEsRUFBRSxxQkFBcUI7Z0JBQy9CLGFBQWEsRUFBRTtvQkFDYixRQUFRLEVBQUUsWUFBWTtpQkFDdkI7YUFDRjtZQUNELEtBQUssRUFBRSxVQUFVO1lBQ2pCLElBQUksRUFBRSxPQUFPO1NBQ2QsQ0FBQztRQUVGLG1CQUFjLEdBQW9CO1lBQ2hDLGFBQWEsRUFBRTtnQkFDYixTQUFTLEVBQUUsYUFBYTtnQkFDeEIsR0FBRyxFQUFFLGlCQUFpQjtnQkFDdEIsUUFBUSxFQUFFLHFCQUFxQjtnQkFDL0IsYUFBYSxFQUFFO29CQUNiLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTztpQkFDcEI7YUFDRjtZQUNELEtBQUssRUFBRSxXQUFXO1lBQ2xCLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztRQUVGLHlEQUF5RDtRQUN6RCxzQkFBaUIsR0FBb0I7WUFDbkMsYUFBYSxFQUFFO2dCQUNiLFNBQVMsRUFBRSxhQUFhO2dCQUN4QixHQUFHLEVBQUUseUJBQXlCO2dCQUM5QixRQUFRLEVBQUUsMkNBQTJDO2FBQ3REO1lBQ0QsS0FBSyxFQUFFLFNBQVM7WUFDaEIsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO1FBRUYsc0JBQWlCLEdBQW9CO1lBQ25DLGFBQWEsRUFBRTtnQkFDYixTQUFTLEVBQUUsYUFBYTtnQkFDeEIsR0FBRyxFQUFFLHFCQUFxQjtnQkFDMUIsOENBQThDO2FBQy9DO1lBQ0QsS0FBSyxFQUFFLFFBQVE7WUFDZixJQUFJLEVBQUUsT0FBTztTQUNkLENBQUM7UUFFRixrQkFBa0I7UUFDbEIsdUJBQWtCLEdBQW9CO1lBQ3BDLE9BQU8sRUFBRSxzREFBc0Q7WUFDL0QsS0FBSyxFQUFFLE1BQU07WUFDYixJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUM7UUFFRix5QkFBb0IsR0FBb0I7WUFDdEMsYUFBYSxFQUFFO2dCQUNiLFNBQVMsRUFBRSxhQUFhO2dCQUN4QixHQUFHLEVBQUUsZ0JBQWdCO2dCQUNyQixRQUFRLEVBQUUsd0NBQXdDO2FBQ25EO1lBQ0QsS0FBSyxFQUFFLFNBQVM7WUFDaEIsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO1FBRUYsb0NBQW9DO1FBQ3BDLDBCQUFxQixHQUFvQjtZQUN2QyxhQUFhLEVBQUU7Z0JBQ2IsU0FBUyxFQUFFLGFBQWE7Z0JBQ3hCLEdBQUcsRUFBRSxpQkFBaUI7Z0JBQ3RCLFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLGFBQWEsRUFBRTtvQkFDYixLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU87aUJBQ3BCO2FBQ0Y7WUFDRCxLQUFLLEVBQUUsVUFBVTtZQUNqQixJQUFJLEVBQUUsT0FBTztTQUNkLENBQUM7SUFLQyxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7WUFDaEQsU0FBUyxFQUFFLGFBQWE7WUFDeEIsR0FBRyxFQUFFLFlBQVk7WUFDakIsUUFBUSxFQUFFLHFDQUFxQztTQUNoRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQ3BELFNBQVMsRUFBRSxTQUFTO1lBQ3BCLEdBQUcsRUFBRSxVQUFVO1lBQ2YsUUFBUSxFQUFFLFFBQVE7U0FDbkIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQ3pELFNBQVMsRUFBRSxhQUFhO1lBQ3hCLEdBQUcsRUFBRSxpQkFBaUI7WUFDdEIsUUFBUSxFQUFFLG9CQUFvQjtTQUMvQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7WUFDM0QsU0FBUyxFQUFFLGFBQWE7WUFDeEIsR0FBRyxFQUFFLG1CQUFtQjtZQUN4QixRQUFRLEVBQUUsb0JBQW9CO1NBQy9CLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztZQUN4RCxTQUFTLEVBQUUsYUFBYTtZQUN4QixHQUFHLEVBQUUsZ0JBQWdCO1lBQ3JCLFFBQVEsRUFBRSxpQkFBaUI7U0FDNUIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQzFELFNBQVMsRUFBRSxhQUFhO1lBQ3hCLEdBQUcsRUFBRSxrQkFBa0I7WUFDdkIsUUFBUSxFQUFFLG9CQUFvQjtTQUMvQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQ3BELFNBQVMsRUFBRSxhQUFhO1lBQ3hCLEdBQUcsRUFBRSxtQkFBbUI7WUFDeEIsUUFBUSxFQUFFLG9CQUFvQjtTQUMvQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7WUFDM0QsU0FBUyxFQUFFLGFBQWE7WUFDeEIsR0FBRyxFQUFFLDZCQUE2QjtZQUNsQyxRQUFRLEVBQUUsNEJBQTRCO1NBQ3ZDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztZQUN6RCxTQUFTLEVBQUUsYUFBYTtZQUN4QixHQUFHLEVBQUUsMkJBQTJCO1lBQ2hDLFFBQVEsRUFBRSw4QkFBOEI7U0FDekMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztZQUNwRCxTQUFTLEVBQUUsYUFBYTtZQUN4QixHQUFHLEVBQUUsc0JBQXNCO1lBQzNCLFFBQVEsRUFBRSw0QkFBNEI7U0FDdkMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQ3hELFNBQVMsRUFBRSxhQUFhO1lBQ3hCLEdBQUcsRUFBRSwwQkFBMEI7WUFDL0IsUUFBUSxFQUFFLGlDQUFpQztTQUM1QyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7WUFDMUQsU0FBUyxFQUFFLGFBQWE7WUFDeEIsR0FBRyxFQUFFLDRCQUE0QjtZQUNqQyxRQUFRLEVBQUUsMkNBQTJDO1NBQ3RELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztZQUN2RCxTQUFTLEVBQUUsYUFBYTtZQUN4QixHQUFHLEVBQUUsdUJBQXVCO1lBQzVCLFFBQVEsRUFBRSxxQkFBcUI7U0FDaEMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQ3ZELFNBQVMsRUFBRSxhQUFhO1lBQ3hCLEdBQUcsRUFBRSwwQkFBMEI7WUFDL0IsUUFBUSxFQUFFLGVBQWU7U0FDMUIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQzFELFNBQVMsRUFBRSxhQUFhO1lBQ3hCLEdBQUcsRUFBRSw2QkFBNkI7WUFDbEMsUUFBUSxFQUFFLHFCQUFxQjtTQUNoQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sdUJBQXVCO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztRQUN0RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVELGNBQWMsQ0FBQyxRQUFnQjtRQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUVmLCtDQUErQztRQUMvQyxJQUFJLENBQUMsY0FBYyxHQUFHO1lBQ3BCLEdBQUcsSUFBSSxDQUFDLGNBQWM7WUFDdEIsYUFBYSxFQUFFO2dCQUNiLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFjO2dCQUNyQyxhQUFhLEVBQUU7b0JBQ2IsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPO2lCQUNwQjthQUNGO1NBQ0YsQ0FBQztRQUVGLElBQUksQ0FBQyxxQkFBcUIsR0FBRztZQUMzQixHQUFHLElBQUksQ0FBQyxxQkFBcUI7WUFDN0IsYUFBYSxFQUFFO2dCQUNiLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWM7Z0JBQzVDLGFBQWEsRUFBRTtvQkFDYixLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU87aUJBQ3BCO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQzsrR0F0VVUsb0JBQW9CO21HQUFwQixvQkFBb0IsNEVBckpyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4R1Qsa2lCQTFIQyxZQUFZLDhRQUNaLE9BQU8seUxBQ1AsY0FBYywrRUFDZCxhQUFhLHNHQUNiLFlBQVksc0ZBQ1osU0FBUyx1VEFDVCxlQUFlLDZGQUNmLE9BQU8sME5BQ1AsUUFBUSw2RkFDUixTQUFTLG9QQUNULGdCQUFnQjs7NEZBdUpQLG9CQUFvQjtrQkFyS2hDLFNBQVM7K0JBQ0Usa0JBQWtCLGNBQ2hCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLE9BQU87d0JBQ1AsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLFlBQVk7d0JBQ1osU0FBUzt3QkFDVCxlQUFlO3dCQUNmLE9BQU87d0JBQ1AsUUFBUTt3QkFDUixTQUFTO3dCQUNULGdCQUFnQjtxQkFDakIsWUFDUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4R1QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIElvbkJ1dHRvbixcbiAgSW9uQ2FyZCxcbiAgSW9uQ2FyZENvbnRlbnQsXG4gIElvbkNhcmRIZWFkZXIsXG4gIElvbkNhcmRUaXRsZSxcbiAgSW9uSXRlbSxcbiAgSW9uTGFiZWwsXG4gIElvblNlbGVjdCxcbiAgSW9uU2VsZWN0T3B0aW9uLFxufSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERpc3BsYXlDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2F0b21zL2Rpc3BsYXkvZGlzcGxheS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGlzcGxheU1ldGFkYXRhIH0gZnJvbSAnLi4vY29tcG9uZW50cy9hdG9tcy9kaXNwbGF5L3R5cGVzJztcbmltcG9ydCB7IENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IExhbmdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbGFuZy1wcm92aWRlci9sYW5nLXByb3ZpZGVyLnNlcnZpY2UnO1xuXG4vKipcbiAqIENvbXBvbmVudGUgZGUgZGVtb3N0cmFjacOzbiBwYXJhIHZhbC1kaXNwbGF5IGNvbiBjb250ZW5pZG8gcmVhY3Rpdm8uXG4gKiBNdWVzdHJhIGRpZmVyZW50ZXMgcGF0cm9uZXMgZGUgdXNvIHkgY2Fzb3MgZGUgZWplbXBsby5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLWRpc3BsYXktZGVtbycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgSW9uQ2FyZCxcbiAgICBJb25DYXJkQ29udGVudCxcbiAgICBJb25DYXJkSGVhZGVyLFxuICAgIElvbkNhcmRUaXRsZSxcbiAgICBJb25TZWxlY3QsXG4gICAgSW9uU2VsZWN0T3B0aW9uLFxuICAgIElvbkl0ZW0sXG4gICAgSW9uTGFiZWwsXG4gICAgSW9uQnV0dG9uLFxuICAgIERpc3BsYXlDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImRpc3BsYXktZGVtb1wiPlxuICAgICAgPGlvbi1jYXJkPlxuICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgIDxpb24tY2FyZC10aXRsZT57eyBkZW1vVGl0bGUkIHwgYXN5bmMgfX08L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cblxuICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICA8IS0tIFNlbGVjdG9yIGRlIGlkaW9tYSAtLT5cbiAgICAgICAgICA8aW9uLWl0ZW0+XG4gICAgICAgICAgICA8aW9uLWxhYmVsPnt7IGxhbmd1YWdlTGFiZWwkIHwgYXN5bmMgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgICAgIDxpb24tc2VsZWN0XG4gICAgICAgICAgICAgIGludGVyZmFjZT1cInBvcG92ZXJcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudExhbmd1YWdlJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgKGlvbkNoYW5nZSk9XCJjaGFuZ2VMYW5ndWFnZSgkZXZlbnQuZGV0YWlsLnZhbHVlKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpb24tc2VsZWN0LW9wdGlvbiAqbmdGb3I9XCJsZXQgbGFuZyBvZiBhdmFpbGFibGVMYW5ndWFnZXMkIHwgYXN5bmNcIiBbdmFsdWVdPVwibGFuZ1wiPlxuICAgICAgICAgICAgICAgIHt7IGxhbmcgfCB1cHBlcmNhc2UgfX1cbiAgICAgICAgICAgICAgPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvaW9uLXNlbGVjdD5cbiAgICAgICAgICA8L2lvbi1pdGVtPlxuXG4gICAgICAgICAgPCEtLSBFamVtcGxvcyBlc3TDoXRpY29zIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uXCI+XG4gICAgICAgICAgICA8aDM+e3sgc3RhdGljU2VjdGlvblRpdGxlJCB8IGFzeW5jIH19PC9oMz5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGg0PkRpZmVyZW50ZXMgdGFtYcOxb3M6PC9oND5cbiAgICAgICAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJzbWFsbFN0YXRpY0Rpc3BsYXlcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cIm1lZGl1bVN0YXRpY0Rpc3BsYXlcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cImxhcmdlU3RhdGljRGlzcGxheVwiPjwvdmFsLWRpc3BsYXk+XG4gICAgICAgICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwieGxhcmdlU3RhdGljRGlzcGxheVwiPjwvdmFsLWRpc3BsYXk+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGg0PkRpZmVyZW50ZXMgY29sb3Jlczo8L2g0PlxuICAgICAgICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cInByaW1hcnlEaXNwbGF5XCI+PC92YWwtZGlzcGxheT5cbiAgICAgICAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJzZWNvbmRhcnlEaXNwbGF5XCI+PC92YWwtZGlzcGxheT5cbiAgICAgICAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJzdWNjZXNzRGlzcGxheVwiPjwvdmFsLWRpc3BsYXk+XG4gICAgICAgICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwid2FybmluZ0Rpc3BsYXlcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cImRhbmdlckRpc3BsYXlcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIEVqZW1wbG9zIHJlYWN0aXZvcyAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICAgICAgPGgzPnt7IHJlYWN0aXZlU2VjdGlvblRpdGxlJCB8IGFzeW5jIH19PC9oMz5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGg0Pnt7IHJlYWN0aXZlQ29udGVudFRpdGxlJCB8IGFzeW5jIH19PC9oND5cbiAgICAgICAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ3ZWxjb21lRGlzcGxheVwiPjwvdmFsLWRpc3BsYXk+XG4gICAgICAgICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwiZGVzY3JpcHRpb25EaXNwbGF5XCI+PC92YWwtZGlzcGxheT5cbiAgICAgICAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJzdGF0dXNEaXNwbGF5XCI+PC92YWwtZGlzcGxheT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1ncm91cFwiPlxuICAgICAgICAgICAgICA8aDQ+e3sgaW50ZXJwb2xhdGlvblRpdGxlJCB8IGFzeW5jIH19PC9oND5cbiAgICAgICAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ1c2VyV2VsY29tZURpc3BsYXlcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cImNvdW50ZXJEaXNwbGF5XCI+PC92YWwtZGlzcGxheT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1ncm91cFwiPlxuICAgICAgICAgICAgICA8aDQ+e3sgZmFsbGJhY2tUaXRsZSQgfCBhc3luYyB9fTwvaDQ+XG4gICAgICAgICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwibWlzc2luZ0tleURpc3BsYXlcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cIm5vRmFsbGJhY2tEaXNwbGF5XCI+PC92YWwtZGlzcGxheT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBFamVtcGxvcyBtaXh0b3MgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxoMz57eyBtaXhlZFNlY3Rpb25UaXRsZSQgfCBhc3luYyB9fTwvaDM+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleGFtcGxlLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxoND57eyBtaXhlZENvbnRlbnRUaXRsZSQgfCBhc3luYyB9fTwvaDQ+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaXhlZC1leGFtcGxlc1wiPlxuICAgICAgICAgICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwic3RhdGljTWl4ZWREaXNwbGF5XCI+PC92YWwtZGlzcGxheT5cbiAgICAgICAgICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cInJlYWN0aXZlTWl4ZWREaXNwbGF5XCI+PC92YWwtZGlzcGxheT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gRWplbXBsb3MgZGluw6FtaWNvcyAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICAgICAgPGgzPnt7IGR5bmFtaWNTZWN0aW9uVGl0bGUkIHwgYXN5bmMgfX08L2gzPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1ncm91cFwiPlxuICAgICAgICAgICAgICA8aDQ+e3sgZHluYW1pY0NvbnRlbnRUaXRsZSQgfCBhc3luYyB9fTwvaDQ+XG4gICAgICAgICAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJ1cGRhdGVDb3VudGVyKClcIiBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICB7eyB1cGRhdGVCdXR0b25UZXh0JCB8IGFzeW5jIH19XG4gICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJkeW5hbWljQ291bnRlckRpc3BsYXlcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIEFuw6FsaXNpcyBkZSBjb250ZW5pZG8gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxoMz57eyBhbmFseXNpc1RpdGxlJCB8IGFzeW5jIH19PC9oMz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbmFseXNpcy1pbmZvXCI+XG4gICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sgY3VycmVudExhbmdMYWJlbCQgfCBhc3luYyB9fTo8L3N0cm9uZz4ge3sgY3VycmVudExhbmd1YWdlJCB8IGFzeW5jIHwgdXBwZXJjYXNlIH19XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgPHN0cm9uZz57eyBhdmFpbGFibGVMYW5nc0xhYmVsJCB8IGFzeW5jIH19Ojwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIHt7IChhdmFpbGFibGVMYW5ndWFnZXMkIHwgYXN5bmMpPy5qb2luKCcsICcpIHwgdXBwZXJjYXNlIH19XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICA8L2lvbi1jYXJkPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAuZGlzcGxheS1kZW1vIHtcbiAgICAgICAgcGFkZGluZzogMTZweDtcbiAgICAgIH1cbiAgICAgIC5zZWN0aW9uIHtcbiAgICAgICAgbWFyZ2luOiAyNHB4IDA7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1pb24tY29sb3ItbGlnaHQpO1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTZweDtcbiAgICAgIH1cbiAgICAgIC5leGFtcGxlLWdyb3VwIHtcbiAgICAgICAgbWFyZ2luOiAxNnB4IDA7XG4gICAgICAgIHBhZGRpbmc6IDEycHg7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jb2xvci1saWdodCk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgIH1cbiAgICAgIC5leGFtcGxlLWdyb3VwIGg0IHtcbiAgICAgICAgbWFyZ2luOiAwIDAgMTJweCAwO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gICAgICB9XG4gICAgICAubWl4ZWQtZXhhbXBsZXMge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgIH1cbiAgICAgIC5hbmFseXNpcy1pbmZvIHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXN0ZXAtNTApO1xuICAgICAgICBwYWRkaW5nOiAxNnB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIG1hcmdpbi10b3A6IDE2cHg7XG4gICAgICB9XG4gICAgICB2YWwtZGlzcGxheSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBtYXJnaW46IDhweCAwO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIERpc3BsYXlEZW1vQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy8gT2JzZXJ2YWJsZXMgcGFyYSBjb250ZW5pZG8gcmVhY3Rpdm8gZGUgbGEgcMOhZ2luYVxuICBkZW1vVGl0bGUkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIGxhbmd1YWdlTGFiZWwkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIHN0YXRpY1NlY3Rpb25UaXRsZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgcmVhY3RpdmVTZWN0aW9uVGl0bGUkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIG1peGVkU2VjdGlvblRpdGxlJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBkeW5hbWljU2VjdGlvblRpdGxlJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBhbmFseXNpc1RpdGxlJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICByZWFjdGl2ZUNvbnRlbnRUaXRsZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgaW50ZXJwb2xhdGlvblRpdGxlJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBmYWxsYmFja1RpdGxlJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBtaXhlZENvbnRlbnRUaXRsZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgZHluYW1pY0NvbnRlbnRUaXRsZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgdXBkYXRlQnV0dG9uVGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgY3VycmVudExhbmdMYWJlbCQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgYXZhaWxhYmxlTGFuZ3NMYWJlbCQ6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICAvLyBFc3RhZG8gZGVsIGlkaW9tYVxuICBjdXJyZW50TGFuZ3VhZ2UkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIGF2YWlsYWJsZUxhbmd1YWdlcyQ6IE9ic2VydmFibGU8c3RyaW5nW10+O1xuXG4gIC8vIENvbnRhZG9yIHBhcmEgZWplbXBsb3MgZGluw6FtaWNvc1xuICBwcml2YXRlIGNvdW50ZXIgPSAwO1xuXG4gIC8vIENvbmZpZ3VyYWNpb25lcyBkZSBlamVtcGxvIC0gRVNUw4FUSUNBU1xuICBzbWFsbFN0YXRpY0Rpc3BsYXk6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnVGV4dG8gcGVxdWXDsW8gZXN0w6F0aWNvJyxcbiAgICBjb2xvcjogJ2RhcmsnLFxuICAgIHNpemU6ICdzbWFsbCcsXG4gIH07XG5cbiAgbWVkaXVtU3RhdGljRGlzcGxheTogRGlzcGxheU1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnQ6ICdUZXh0byBtZWRpYW5vIGVzdMOhdGljbycsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgfTtcblxuICBsYXJnZVN0YXRpY0Rpc3BsYXk6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnVGV4dG8gZ3JhbmRlIGVzdMOhdGljbycsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBzaXplOiAnbGFyZ2UnLFxuICB9O1xuXG4gIHhsYXJnZVN0YXRpY0Rpc3BsYXk6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnVGV4dG8gZXh0cmEgZ3JhbmRlIGVzdMOhdGljbycsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBzaXplOiAneGxhcmdlJyxcbiAgfTtcblxuICAvLyBFamVtcGxvcyBkZSBjb2xvcmVzIGVzdMOhdGljb3NcbiAgcHJpbWFyeURpc3BsYXk6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnVGV4dG8gcHJpbWFyaW8nLFxuICAgIGNvbG9yOiAncHJpbWFyeScsXG4gICAgc2l6ZTogJ21lZGl1bScsXG4gIH07XG5cbiAgc2Vjb25kYXJ5RGlzcGxheTogRGlzcGxheU1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnQ6ICdUZXh0byBzZWN1bmRhcmlvJyxcbiAgICBjb2xvcjogJ3NlY29uZGFyeScsXG4gICAgc2l6ZTogJ21lZGl1bScsXG4gIH07XG5cbiAgc3VjY2Vzc0Rpc3BsYXk6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnVGV4dG8gZGUgw6l4aXRvJyxcbiAgICBjb2xvcjogJ3N1Y2Nlc3MnLFxuICAgIHNpemU6ICdtZWRpdW0nLFxuICB9O1xuXG4gIHdhcm5pbmdEaXNwbGF5OiBEaXNwbGF5TWV0YWRhdGEgPSB7XG4gICAgY29udGVudDogJ1RleHRvIGRlIGFkdmVydGVuY2lhJyxcbiAgICBjb2xvcjogJ3dhcm5pbmcnLFxuICAgIHNpemU6ICdtZWRpdW0nLFxuICB9O1xuXG4gIGRhbmdlckRpc3BsYXk6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnVGV4dG8gZGUgcGVsaWdybycsXG4gICAgY29sb3I6ICdkYW5nZXInLFxuICAgIHNpemU6ICdtZWRpdW0nLFxuICB9O1xuXG4gIC8vIENvbmZpZ3VyYWNpb25lcyBkZSBlamVtcGxvIC0gUkVBQ1RJVkFTXG4gIHdlbGNvbWVEaXNwbGF5OiBEaXNwbGF5TWV0YWRhdGEgPSB7XG4gICAgY29udGVudENvbmZpZzoge1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAnd2VsY29tZS50aXRsZScsXG4gICAgICBmYWxsYmFjazogJ0JpZW52ZW5pZG8gYSBsYSBhcGxpY2FjacOzbicsXG4gICAgfSxcbiAgICBjb2xvcjogJ3ByaW1hcnknLFxuICAgIHNpemU6ICd4bGFyZ2UnLFxuICB9O1xuXG4gIGRlc2NyaXB0aW9uRGlzcGxheTogRGlzcGxheU1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnRDb25maWc6IHtcbiAgICAgIGNsYXNzTmFtZTogJ2Rpc3BsYXlEZW1vJyxcbiAgICAgIGtleTogJ3dlbGNvbWUuZGVzY3JpcHRpb24nLFxuICAgICAgZmFsbGJhY2s6ICdFc3RhIGVzIHVuYSBkZXNjcmlwY2nDs24gZGUgZWplbXBsbycsXG4gICAgfSxcbiAgICBjb2xvcjogJ21lZGl1bScsXG4gICAgc2l6ZTogJ21lZGl1bScsXG4gIH07XG5cbiAgc3RhdHVzRGlzcGxheTogRGlzcGxheU1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnRDb25maWc6IHtcbiAgICAgIGNsYXNzTmFtZTogJ2Rpc3BsYXlEZW1vJyxcbiAgICAgIGtleTogJ3N0YXR1cy5vbmxpbmUnLFxuICAgICAgZmFsbGJhY2s6ICdFbiBsw61uZWEnLFxuICAgIH0sXG4gICAgY29sb3I6ICdzdWNjZXNzJyxcbiAgICBzaXplOiAnc21hbGwnLFxuICB9O1xuXG4gIC8vIEVqZW1wbG9zIGNvbiBpbnRlcnBvbGFjacOzblxuICB1c2VyV2VsY29tZURpc3BsYXk6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50Q29uZmlnOiB7XG4gICAgICBjbGFzc05hbWU6ICdkaXNwbGF5RGVtbycsXG4gICAgICBrZXk6ICd3ZWxjb21lLnVzZXInLFxuICAgICAgZmFsbGJhY2s6ICdIb2xhLCB7e3VzZXJOYW1lfX0hJyxcbiAgICAgIGludGVycG9sYXRpb246IHtcbiAgICAgICAgdXNlck5hbWU6ICdKdWFuIFDDqXJleicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29sb3I6ICd0ZXJ0aWFyeScsXG4gICAgc2l6ZTogJ2xhcmdlJyxcbiAgfTtcblxuICBjb3VudGVyRGlzcGxheTogRGlzcGxheU1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnRDb25maWc6IHtcbiAgICAgIGNsYXNzTmFtZTogJ2Rpc3BsYXlEZW1vJyxcbiAgICAgIGtleTogJ2NvdW50ZXIuY3VycmVudCcsXG4gICAgICBmYWxsYmFjazogJ0NvbnRhZG9yOiB7e2NvdW50fX0nLFxuICAgICAgaW50ZXJwb2xhdGlvbjoge1xuICAgICAgICBjb3VudDogdGhpcy5jb3VudGVyLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbG9yOiAnc2Vjb25kYXJ5JyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgfTtcblxuICAvLyBFamVtcGxvcyBjb24gY2xhdmVzIGZhbHRhbnRlcyBwYXJhIGRlbW9zdHJhciBmYWxsYmFja3NcbiAgbWlzc2luZ0tleURpc3BsYXk6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50Q29uZmlnOiB7XG4gICAgICBjbGFzc05hbWU6ICdkaXNwbGF5RGVtbycsXG4gICAgICBrZXk6ICd0aGlzLmtleS5kb2VzLm5vdC5leGlzdCcsXG4gICAgICBmYWxsYmFjazogJ0VzdGEgY2xhdmUgbm8gZXhpc3RlLCBwZXJvIHRlbmdvIGZhbGxiYWNrJyxcbiAgICB9LFxuICAgIGNvbG9yOiAnd2FybmluZycsXG4gICAgc2l6ZTogJ21lZGl1bScsXG4gIH07XG5cbiAgbm9GYWxsYmFja0Rpc3BsYXk6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50Q29uZmlnOiB7XG4gICAgICBjbGFzc05hbWU6ICdkaXNwbGF5RGVtbycsXG4gICAgICBrZXk6ICdhbm90aGVyLm1pc3Npbmcua2V5JyxcbiAgICAgIC8vIFNpbiBmYWxsYmFjayAtIHVzYXLDoSBsYSBjbGF2ZSBjb21vIGZhbGxiYWNrXG4gICAgfSxcbiAgICBjb2xvcjogJ2RhbmdlcicsXG4gICAgc2l6ZTogJ3NtYWxsJyxcbiAgfTtcblxuICAvLyBFamVtcGxvcyBtaXh0b3NcbiAgc3RhdGljTWl4ZWREaXNwbGF5OiBEaXNwbGF5TWV0YWRhdGEgPSB7XG4gICAgY29udGVudDogJ0VzdGUgZXMgY29udGVuaWRvIGVzdMOhdGljbyAobm8gY2FtYmlhIGNvbiBlbCBpZGlvbWEpJyxcbiAgICBjb2xvcjogJ2RhcmsnLFxuICAgIHNpemU6ICdtZWRpdW0nLFxuICB9O1xuXG4gIHJlYWN0aXZlTWl4ZWREaXNwbGF5OiBEaXNwbGF5TWV0YWRhdGEgPSB7XG4gICAgY29udGVudENvbmZpZzoge1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAnbWl4ZWQucmVhY3RpdmUnLFxuICAgICAgZmFsbGJhY2s6ICdFc3RlIGNvbnRlbmlkbyBzw60gY2FtYmlhIGNvbiBlbCBpZGlvbWEnLFxuICAgIH0sXG4gICAgY29sb3I6ICdwcmltYXJ5JyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgfTtcblxuICAvLyBFamVtcGxvIGRpbsOhbWljbyBxdWUgc2UgYWN0dWFsaXphXG4gIGR5bmFtaWNDb3VudGVyRGlzcGxheTogRGlzcGxheU1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnRDb25maWc6IHtcbiAgICAgIGNsYXNzTmFtZTogJ2Rpc3BsYXlEZW1vJyxcbiAgICAgIGtleTogJ2R5bmFtaWMuY291bnRlcicsXG4gICAgICBmYWxsYmFjazogJ0NsaWNzOiB7e2NvdW50fX0nLFxuICAgICAgaW50ZXJwb2xhdGlvbjoge1xuICAgICAgICBjb3VudDogdGhpcy5jb3VudGVyLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbG9yOiAndGVydGlhcnknLFxuICAgIHNpemU6ICdsYXJnZScsXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb250ZW50U2VydmljZTogQ29udGVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYW5nU2VydmljZTogTGFuZ1NlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbnRlbnQoKTtcbiAgICB0aGlzLmluaXRpYWxpemVMYW5ndWFnZVN0YXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVDb250ZW50KCkge1xuICAgIC8vIENvbnRlbmlkbyBkZSBsYSBww6FnaW5hXG4gICAgdGhpcy5kZW1vVGl0bGUkID0gdGhpcy5jb250ZW50U2VydmljZS5mcm9tQ29udGVudCh7XG4gICAgICBjbGFzc05hbWU6ICdkaXNwbGF5RGVtbycsXG4gICAgICBrZXk6ICdwYWdlLnRpdGxlJyxcbiAgICAgIGZhbGxiYWNrOiAnRGVtb3N0cmFjacOzbiBkZWwgQ29tcG9uZW50ZSBEaXNwbGF5JyxcbiAgICB9KTtcblxuICAgIHRoaXMubGFuZ3VhZ2VMYWJlbCQgPSB0aGlzLmNvbnRlbnRTZXJ2aWNlLmZyb21Db250ZW50KHtcbiAgICAgIGNsYXNzTmFtZTogJ19nbG9iYWwnLFxuICAgICAga2V5OiAnbGFuZ3VhZ2UnLFxuICAgICAgZmFsbGJhY2s6ICdJZGlvbWEnLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zdGF0aWNTZWN0aW9uVGl0bGUkID0gdGhpcy5jb250ZW50U2VydmljZS5mcm9tQ29udGVudCh7XG4gICAgICBjbGFzc05hbWU6ICdkaXNwbGF5RGVtbycsXG4gICAgICBrZXk6ICdzZWN0aW9ucy5zdGF0aWMnLFxuICAgICAgZmFsbGJhY2s6ICdFamVtcGxvcyBFc3TDoXRpY29zJyxcbiAgICB9KTtcblxuICAgIHRoaXMucmVhY3RpdmVTZWN0aW9uVGl0bGUkID0gdGhpcy5jb250ZW50U2VydmljZS5mcm9tQ29udGVudCh7XG4gICAgICBjbGFzc05hbWU6ICdkaXNwbGF5RGVtbycsXG4gICAgICBrZXk6ICdzZWN0aW9ucy5yZWFjdGl2ZScsXG4gICAgICBmYWxsYmFjazogJ0VqZW1wbG9zIFJlYWN0aXZvcycsXG4gICAgfSk7XG5cbiAgICB0aGlzLm1peGVkU2VjdGlvblRpdGxlJCA9IHRoaXMuY29udGVudFNlcnZpY2UuZnJvbUNvbnRlbnQoe1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAnc2VjdGlvbnMubWl4ZWQnLFxuICAgICAgZmFsbGJhY2s6ICdFamVtcGxvcyBNaXh0b3MnLFxuICAgIH0pO1xuXG4gICAgdGhpcy5keW5hbWljU2VjdGlvblRpdGxlJCA9IHRoaXMuY29udGVudFNlcnZpY2UuZnJvbUNvbnRlbnQoe1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAnc2VjdGlvbnMuZHluYW1pYycsXG4gICAgICBmYWxsYmFjazogJ0VqZW1wbG9zIERpbsOhbWljb3MnLFxuICAgIH0pO1xuXG4gICAgdGhpcy5hbmFseXNpc1RpdGxlJCA9IHRoaXMuY29udGVudFNlcnZpY2UuZnJvbUNvbnRlbnQoe1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAnc2VjdGlvbnMuYW5hbHlzaXMnLFxuICAgICAgZmFsbGJhY2s6ICdBbsOhbGlzaXMgZGUgSWRpb21hJyxcbiAgICB9KTtcblxuICAgIHRoaXMucmVhY3RpdmVDb250ZW50VGl0bGUkID0gdGhpcy5jb250ZW50U2VydmljZS5mcm9tQ29udGVudCh7XG4gICAgICBjbGFzc05hbWU6ICdkaXNwbGF5RGVtbycsXG4gICAgICBrZXk6ICdzdWJzZWN0aW9ucy5yZWFjdGl2ZUNvbnRlbnQnLFxuICAgICAgZmFsbGJhY2s6ICdDb250ZW5pZG8gcmVhY3Rpdm8gYsOhc2ljbzonLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pbnRlcnBvbGF0aW9uVGl0bGUkID0gdGhpcy5jb250ZW50U2VydmljZS5mcm9tQ29udGVudCh7XG4gICAgICBjbGFzc05hbWU6ICdkaXNwbGF5RGVtbycsXG4gICAgICBrZXk6ICdzdWJzZWN0aW9ucy5pbnRlcnBvbGF0aW9uJyxcbiAgICAgIGZhbGxiYWNrOiAnQ29udGVuaWRvIGNvbiBpbnRlcnBvbGFjacOzbjonLFxuICAgIH0pO1xuXG4gICAgdGhpcy5mYWxsYmFja1RpdGxlJCA9IHRoaXMuY29udGVudFNlcnZpY2UuZnJvbUNvbnRlbnQoe1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAnc3Vic2VjdGlvbnMuZmFsbGJhY2snLFxuICAgICAgZmFsbGJhY2s6ICdEZW1vc3RyYWNpw7NuIGRlIGZhbGxiYWNrczonLFxuICAgIH0pO1xuXG4gICAgdGhpcy5taXhlZENvbnRlbnRUaXRsZSQgPSB0aGlzLmNvbnRlbnRTZXJ2aWNlLmZyb21Db250ZW50KHtcbiAgICAgIGNsYXNzTmFtZTogJ2Rpc3BsYXlEZW1vJyxcbiAgICAgIGtleTogJ3N1YnNlY3Rpb25zLm1peGVkQ29udGVudCcsXG4gICAgICBmYWxsYmFjazogJ0NvbnRlbmlkbyBlc3TDoXRpY28gdnMgcmVhY3Rpdm86JyxcbiAgICB9KTtcblxuICAgIHRoaXMuZHluYW1pY0NvbnRlbnRUaXRsZSQgPSB0aGlzLmNvbnRlbnRTZXJ2aWNlLmZyb21Db250ZW50KHtcbiAgICAgIGNsYXNzTmFtZTogJ2Rpc3BsYXlEZW1vJyxcbiAgICAgIGtleTogJ3N1YnNlY3Rpb25zLmR5bmFtaWNDb250ZW50JyxcbiAgICAgIGZhbGxiYWNrOiAnQ29udGVuaWRvIHF1ZSBzZSBhY3R1YWxpemEgZGluw6FtaWNhbWVudGU6JyxcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlQnV0dG9uVGV4dCQgPSB0aGlzLmNvbnRlbnRTZXJ2aWNlLmZyb21Db250ZW50KHtcbiAgICAgIGNsYXNzTmFtZTogJ2Rpc3BsYXlEZW1vJyxcbiAgICAgIGtleTogJ2J1dHRvbnMudXBkYXRlQ291bnRlcicsXG4gICAgICBmYWxsYmFjazogJ0FjdHVhbGl6YXIgQ29udGFkb3InLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jdXJyZW50TGFuZ0xhYmVsJCA9IHRoaXMuY29udGVudFNlcnZpY2UuZnJvbUNvbnRlbnQoe1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAnYW5hbHlzaXMuY3VycmVudExhbmd1YWdlJyxcbiAgICAgIGZhbGxiYWNrOiAnSWRpb21hIGFjdHVhbCcsXG4gICAgfSk7XG5cbiAgICB0aGlzLmF2YWlsYWJsZUxhbmdzTGFiZWwkID0gdGhpcy5jb250ZW50U2VydmljZS5mcm9tQ29udGVudCh7XG4gICAgICBjbGFzc05hbWU6ICdkaXNwbGF5RGVtbycsXG4gICAgICBrZXk6ICdhbmFseXNpcy5hdmFpbGFibGVMYW5ndWFnZXMnLFxuICAgICAgZmFsbGJhY2s6ICdJZGlvbWFzIGRpc3BvbmlibGVzJyxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUxhbmd1YWdlU3RhdGUoKSB7XG4gICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2UkID0gdGhpcy5sYW5nU2VydmljZS5jdXJyZW50TGFuZyQ7XG4gICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMkID0gdGhpcy5sYW5nU2VydmljZS5jdXJyZW50TGFuZyQucGlwZShtYXAoKCkgPT4gdGhpcy5sYW5nU2VydmljZS5hdmFpbGFibGVMYW5ncykpO1xuICB9XG5cbiAgY2hhbmdlTGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZykge1xuICAgIHRoaXMubGFuZ1NlcnZpY2Uuc2V0TGFuZyhsYW5ndWFnZSk7XG4gIH1cblxuICB1cGRhdGVDb3VudGVyKCkge1xuICAgIHRoaXMuY291bnRlcisrO1xuXG4gICAgLy8gQWN0dWFsaXphciBsb3MgZGlzcGxheXMgcXVlIHVzYW4gZWwgY29udGFkb3JcbiAgICB0aGlzLmNvdW50ZXJEaXNwbGF5ID0ge1xuICAgICAgLi4udGhpcy5jb3VudGVyRGlzcGxheSxcbiAgICAgIGNvbnRlbnRDb25maWc6IHtcbiAgICAgICAgLi4udGhpcy5jb3VudGVyRGlzcGxheS5jb250ZW50Q29uZmlnISxcbiAgICAgICAgaW50ZXJwb2xhdGlvbjoge1xuICAgICAgICAgIGNvdW50OiB0aGlzLmNvdW50ZXIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICB0aGlzLmR5bmFtaWNDb3VudGVyRGlzcGxheSA9IHtcbiAgICAgIC4uLnRoaXMuZHluYW1pY0NvdW50ZXJEaXNwbGF5LFxuICAgICAgY29udGVudENvbmZpZzoge1xuICAgICAgICAuLi50aGlzLmR5bmFtaWNDb3VudGVyRGlzcGxheS5jb250ZW50Q29uZmlnISxcbiAgICAgICAgaW50ZXJwb2xhdGlvbjoge1xuICAgICAgICAgIGNvdW50OiB0aGlzLmNvdW50ZXIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiJdfQ==