valtech-components 4.0.236 → 4.0.238

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.
@@ -1,657 +1,49 @@
1
- import { CommonModule } from '@angular/common';
2
- import { Component, computed, effect, inject, Input, signal, viewChild } from '@angular/core';
3
- import { ReactiveFormsModule, Validators } from '@angular/forms';
1
+ import { Component, Input, computed, inject } from '@angular/core';
4
2
  import { ActivatedRoute } from '@angular/router';
5
- import { firstValueFrom } from 'rxjs';
6
- import { AvatarUploadComponent } from '../avatar-upload/avatar-upload.component';
7
- import { FormComponent } from '../form/form.component';
8
- import { ShareProfileModalComponent } from '../share-profile-modal/share-profile-modal.component';
9
- import { CtaCardComponent } from '../../molecules/cta-card/cta-card.component';
10
- import { SkeletonLayoutComponent } from '../skeleton-layout/skeleton-layout.component';
11
- import { DisplayComponent } from '../../atoms/display/display.component';
12
- import { TextComponent } from '../../atoms/text/text.component';
13
- import { TitleComponent } from '../../atoms/title/title.component';
14
- import { EmptyStateComponent } from '../../molecules/empty-state/empty-state.component';
15
- import { createErrorStateProps } from '../../molecules/empty-state/factory';
16
- import { ComponentStates, InputType } from '../../types';
17
- import { AuthService } from '../../../services/auth/auth.service';
18
- import { FirebaseService } from '../../../services/firebase/firebase.service';
19
- import { FirestoreCollectionFactory } from '../../../services/firebase/firestore-collection';
20
3
  import { I18nService } from '../../../services/i18n';
21
4
  import { NavigationService } from '../../../services/navigation/navigation.service';
22
- import { connectPageRefresh } from '../../../services/page-refresh/page-refresh.service';
23
- import { ToastService } from '../../../services/toast.service';
24
- import { ValtechErrorService } from '../../../services/errors/valtech-error.service';
25
- import { interpretError } from '../../../services/errors/interpret-error';
5
+ import { ProfileContentComponent } from './profile-content.component';
26
6
  import { PROFILE_VIEW_I18N } from './profile-view.i18n';
27
7
  import * as i0 from "@angular/core";
28
- /** Patrón sincronizado con backend handleRegex: lowercase alfanum + underscore. */
29
- const HANDLE_PATTERN = /^[a-z_][a-z0-9_]*$/;
30
- const HANDLE_MIN = 3;
31
- const HANDLE_MAX = 20;
32
8
  const DEFAULT_NAMESPACE = 'Settings.Profile';
33
9
  /**
34
- * `val-profile-view` — vista Perfil full-feature autocontenida (organism).
10
+ * `val-profile-view` — vista Perfil ruteada (organism). Wrapper delgado:
11
+ * configura el header del shell (`NavigationService.setBackHeader`) y delega TODO
12
+ * el contenido/lógica a `val-profile-content`.
35
13
  *
36
- * Edita los campos públicos del usuario en UN solo formulario con UN solo botón
37
- * "Guardar". Wireup:
38
- * - Avatar — val-avatar-upload (Firebase Storage + backend sync). Separado del
39
- * form porque es upload sync independiente.
40
- * - Handle (@usuario) — InputType.HANDLE (val-username-input con check de
41
- * disponibilidad async resuelto vía AuthService inyectado).
42
- * - Nombre — InputType.TEXT.
43
- * - Teléfono — InputType.PHONE.
14
+ * El contenido vive en `val-profile-content` (sin cromática de página) para poder
15
+ * reutilizarse también desde `val-profile-modal` sin contaminar el header.
44
16
  *
45
- * Submit handler dispatcha:
46
- * 1. Si handle cambió updateHandle PRIMERO (uniqueness).
47
- * 2. Si name o phone cambió → updateProfile con ambos.
48
- *
49
- * Lectura del perfil: suscribe al doc Firestore /users/{uid} (mirror que mantiene
50
- * el backend). Reactivo cross-tab + auto-refresca tras save. Fallback REST
51
- * (auth.getProfile) si el doc no existe o el listener falla.
52
- *
53
- * NO renderiza ion-content — vive dentro de val-page-wrapper.
54
- *
55
- * Auto-registra sus defaults i18n (es/en) en el constructor si el consumer no
56
- * proveyó el namespace configurado (default `Settings.Profile`).
17
+ * Consumo: igual que antes (ruta vía `provideValtechProfileRoutes` o embebida con
18
+ * `[config]`). La config se pasa tal cual al contenido.
57
19
  */
58
20
  export class ProfileViewComponent {
59
- /** Namespace i18n resuelto (capturado una vez para llamadas no-reactivas). */
60
- get ns() {
61
- return this.resolvedConfig().i18nNamespace;
62
- }
63
21
  constructor() {
64
22
  this.nav = inject(NavigationService);
65
- this.auth = inject(AuthService);
66
23
  this.i18n = inject(I18nService);
67
- this.toast = inject(ToastService);
68
- this.errors = inject(ValtechErrorService);
69
- this.firebase = inject(FirebaseService);
70
- this.collections = inject(FirestoreCollectionFactory);
71
24
  this.route = inject(ActivatedRoute, { optional: true });
72
- /** Config mergeada con defaults. @Input gana sobre route data. */
73
- this.resolvedConfig = computed(() => {
25
+ this.ns = computed(() => {
74
26
  const fromRoute = (this.route?.snapshot.data['profileConfig'] ?? {});
75
- const merged = { ...fromRoute, ...(this.config ?? {}) };
76
- return {
77
- showAvatar: merged.showAvatar ?? true,
78
- showHandle: merged.showHandle ?? true,
79
- showPhone: merged.showPhone ?? true,
80
- showShareCta: merged.showShareCta ?? true,
81
- profileBaseUrl: merged.profileBaseUrl ?? '',
82
- i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE,
83
- onSaved: merged.onSaved,
84
- onAvatarUploaded: merged.onAvatarUploaded,
85
- };
86
- });
87
- /**
88
- * Colección global /users/{uid} (skipAppPrefix: true — el doc vive fuera de
89
- * apps/{appId}/... porque es cross-app, ver firestore.rules).
90
- */
91
- this.usersCol = this.collections.create('users', {
92
- skipAppPrefix: true,
93
- });
94
- this.formCmp = viewChild('form');
95
- this.profile = signal(null);
96
- this.loading = signal(true);
97
- this.saving = signal(false);
98
- this.loadError = signal(null);
99
- this.shareOpen = signal(false);
100
- this.shareCta = computed(() => {
101
- this.i18n.lang();
102
- return {
103
- title: this.t('shareCtaTitle'),
104
- description: this.t('shareCtaDesc'),
105
- bordered: true,
106
- actions: {
107
- position: 'left',
108
- columned: false,
109
- buttons: [
110
- {
111
- text: this.t('shareCtaBtn'),
112
- color: 'dark',
113
- shape: 'round',
114
- type: 'button',
115
- state: 'ENABLED',
116
- token: 'share',
117
- },
118
- ],
119
- },
120
- };
27
+ return this.config?.i18nNamespace ?? fromRoute.i18nNamespace ?? DEFAULT_NAMESPACE;
121
28
  });
122
- this.shareModal = computed(() => {
123
- const p = this.profile();
124
- const handle = p?.handle ?? 'me';
125
- const base = this.resolvedConfig().profileBaseUrl;
126
- return {
127
- name: p?.name ?? '',
128
- handle: p?.handle,
129
- avatarUrl: p?.avatarUrl,
130
- email: p?.email,
131
- url: base ? `${base}/u/${handle}` : `/u/${handle}`,
132
- };
133
- });
134
- this._userId = computed(() => this.auth.user()?.userId ?? null);
135
- this.errorState = computed(() => {
136
- this.i18n.lang();
137
- const err = this.loadError();
138
- if (!err)
139
- return null;
140
- return createErrorStateProps(err, {
141
- title: {
142
- offline: this.t('offlineTitle'),
143
- error: this.t('errorTitle'),
144
- },
145
- description: {
146
- offline: this.t('offlineHint'),
147
- error: interpretError(err).message,
148
- },
149
- retryLabel: this.t('retry'),
150
- onRetry: () => this.loadFromApi(),
151
- retrying: this.loading(),
152
- });
153
- });
154
- this.avatarProps = computed(() => {
155
- this.i18n.lang();
156
- const p = this.profile();
157
- return {
158
- currentUrl: p?.avatarUrl,
159
- initials: this.initialsFromName(p?.name),
160
- size: 96,
161
- editable: true,
162
- showViewButton: true,
163
- i18nNamespace: this.ns,
164
- };
165
- });
166
- this.formMeta = this.buildFormMeta();
167
- // Auto-registro i18n — respeta override del consumer. El namespace puede
168
- // venir de @Input.config o del route data; lo resolvemos acá.
169
- const ns = this.ns;
29
+ const ns = this.ns();
30
+ // El header usa la key 'pageTitle' del namespace; el contenido registra los
31
+ // defaults i18n, pero lo aseguramos también acá por si el header resuelve antes.
170
32
  this.i18n.registerDefaults(ns, PROFILE_VIEW_I18N);
171
33
  this.nav.setBackHeader('pageTitle', ns, { withMenu: true });
172
- connectPageRefresh(() => this.loadFromApi());
173
- // Cargar perfil inmediatamente si el usuario ya está autenticado.
174
- // Sin esto, si auth.user() ya estaba populado al montar el componente
175
- // (sesión restaurada), el effect no dispara y la página queda vacía
176
- // hasta que el usuario hace pull-to-refresh (Regla: no esperar a que
177
- // una signal cambie si ya tiene valor inicial).
178
- void this.firebase.whenFirebaseAuthReady().then(() => {
179
- const uid = this._userId();
180
- if (uid) {
181
- void this.loadFromApi();
182
- }
183
- });
184
- effect(onCleanup => {
185
- const uid = this._userId();
186
- if (!uid) {
187
- this.profile.set(null);
188
- this.loading.set(false);
189
- return;
190
- }
191
- this.loading.set(true);
192
- let sub = null;
193
- let cancelled = false;
194
- let apiFallbackUsed = false;
195
- void this.firebase.whenFirebaseAuthReady().then(() => {
196
- if (cancelled)
197
- return;
198
- sub = this.usersCol.watch(uid).subscribe({
199
- next: doc => {
200
- if (doc) {
201
- this.profile.set(this.mapMirrorToProfile(doc));
202
- this.loadError.set(null);
203
- this.loading.set(false);
204
- }
205
- else if (!apiFallbackUsed) {
206
- apiFallbackUsed = true;
207
- void this.loadFromApi();
208
- }
209
- },
210
- error: () => {
211
- if (!apiFallbackUsed) {
212
- apiFallbackUsed = true;
213
- void this.loadFromApi();
214
- }
215
- },
216
- });
217
- });
218
- onCleanup(() => {
219
- cancelled = true;
220
- sub?.unsubscribe();
221
- });
222
- }, { allowSignalWrites: true });
223
- // saving → mutar state (val-form.ngDoCheck lo detecta).
224
- effect(() => {
225
- const isSaving = this.saving();
226
- const state = isSaving ? ComponentStates.WORKING : ComponentStates.ENABLED;
227
- this.formMeta.state = state;
228
- this.formMeta.actions.state = state;
229
- this.formMeta.actions.text = isSaving ? this.t('saving') : this.t('save');
230
- });
231
- // profile loaded + form mounted → patchValue al FormGroup.
232
- effect(() => {
233
- const p = this.profile();
234
- const form = this.formCmp()?.Form;
235
- if (!p || !form)
236
- return;
237
- form.patchValue({
238
- handle: p.handle || '',
239
- name: p.name || '',
240
- phone: p.phone || '',
241
- }, { emitEvent: false });
242
- });
243
- // i18n.lang change → mutar labels (rare, no afecta typing).
244
- effect(() => {
245
- this.i18n.lang();
246
- this.applyI18nLabels();
247
- });
248
- }
249
- /** Construcción inicial — UNA vez. Gatea handle/phone según config. */
250
- buildFormMeta() {
251
- const cfg = this.resolvedConfig();
252
- const handleField = {
253
- token: 'profile-handle',
254
- name: 'handle',
255
- label: this.t('handle'),
256
- hint: this.t('handleHint'),
257
- placeholder: this.t('handlePlaceholder'),
258
- type: InputType.HANDLE,
259
- order: 1,
260
- validators: [
261
- Validators.required,
262
- Validators.minLength(HANDLE_MIN),
263
- Validators.maxLength(HANDLE_MAX),
264
- Validators.pattern(HANDLE_PATTERN),
265
- ],
266
- errors: {
267
- required: this.t('usernameInvalid'),
268
- minlength: this.t('usernameInvalid'),
269
- maxlength: this.t('usernameInvalid'),
270
- pattern: this.t('usernameInvalid'),
271
- },
272
- value: '',
273
- range: { min: HANDLE_MIN, max: HANDLE_MAX },
274
- state: ComponentStates.ENABLED,
275
- };
276
- const nameField = {
277
- token: 'profile-name',
278
- name: 'name',
279
- label: this.t('name'),
280
- hint: this.t('nameHint'),
281
- placeholder: this.t('namePlaceholder'),
282
- type: InputType.TEXT,
283
- order: 2,
284
- validators: [Validators.required, Validators.minLength(2), Validators.maxLength(100)],
285
- errors: {},
286
- value: '',
287
- state: ComponentStates.ENABLED,
288
- };
289
- const phoneField = {
290
- token: 'profile-phone',
291
- name: 'phone',
292
- label: this.t('phone'),
293
- hint: this.t('phoneHint'),
294
- placeholder: this.t('phonePlaceholder'),
295
- type: InputType.PHONE,
296
- order: 3,
297
- validators: [],
298
- errors: {},
299
- value: '',
300
- state: ComponentStates.ENABLED,
301
- };
302
- // Filtrado por config: el name siempre va; handle/phone son opt-out.
303
- const fields = [];
304
- if (cfg.showHandle)
305
- fields.push(handleField);
306
- fields.push(nameField);
307
- if (cfg.showPhone)
308
- fields.push(phoneField);
309
- const submitButton = {
310
- text: this.t('save'),
311
- color: 'dark',
312
- type: 'submit',
313
- fill: 'solid',
314
- size: 'default',
315
- shape: 'round',
316
- expand: 'block',
317
- state: ComponentStates.ENABLED,
318
- token: 'profile-save',
319
- };
320
- return {
321
- name: '',
322
- state: ComponentStates.ENABLED,
323
- sections: [
324
- {
325
- name: '',
326
- order: 1,
327
- fields,
328
- },
329
- ],
330
- actions: submitButton,
331
- };
332
- }
333
- /** Re-aplica labels/hints/placeholders en cambio de idioma. */
334
- applyI18nLabels() {
335
- const section = this.formMeta.sections[0];
336
- for (const field of section.fields) {
337
- switch (field.name) {
338
- case 'handle':
339
- field.label = this.t('handle');
340
- field.hint = this.t('handleHint');
341
- field.placeholder = this.t('handlePlaceholder');
342
- field.errors = {
343
- required: this.t('usernameInvalid'),
344
- minlength: this.t('usernameInvalid'),
345
- maxlength: this.t('usernameInvalid'),
346
- pattern: this.t('usernameInvalid'),
347
- };
348
- break;
349
- case 'name':
350
- field.label = this.t('name');
351
- field.hint = this.t('nameHint');
352
- field.placeholder = this.t('namePlaceholder');
353
- break;
354
- case 'phone':
355
- field.label = this.t('phone');
356
- field.hint = this.t('phoneHint');
357
- field.placeholder = this.t('phonePlaceholder');
358
- break;
359
- }
360
- }
361
- const button = this.formMeta.actions;
362
- button.text = this.saving() ? this.t('saving') : this.t('save');
363
- }
364
- /**
365
- * Fallback REST. Capa 4 (UI declarativa): NO toasteamos acá — el
366
- * val-empty-state ES la UI del error.
367
- */
368
- async loadFromApi() {
369
- this.loading.set(true);
370
- try {
371
- const p = await firstValueFrom(this.auth.getProfile());
372
- this.profile.set(p);
373
- this.loadError.set(null);
374
- }
375
- catch (err) {
376
- this.loadError.set(err);
377
- }
378
- finally {
379
- this.loading.set(false);
380
- }
381
- }
382
- mapMirrorToProfile(doc) {
383
- return {
384
- operationId: '',
385
- userId: doc.userId,
386
- email: doc.email,
387
- name: doc.name ?? '',
388
- handle: doc.handle,
389
- phone: doc.phone,
390
- avatarUrl: doc.avatarUrl,
391
- emailVerified: false,
392
- phoneVerified: false,
393
- mfaEnabled: false,
394
- createdAt: '',
395
- updatedAt: '',
396
- };
397
- }
398
- async onSubmit(event) {
399
- if (this.saving())
400
- return;
401
- const current = this.profile();
402
- if (!current)
403
- return;
404
- const cfg = this.resolvedConfig();
405
- const fields = event.fields || {};
406
- const nextHandle = String(fields['handle'] || '')
407
- .trim()
408
- .toLowerCase();
409
- const nextName = String(fields['name'] || '').trim();
410
- const nextPhone = String(fields['phone'] || '').trim();
411
- const handleChanged = cfg.showHandle && !!nextHandle && nextHandle !== (current.handle || '').toLowerCase();
412
- const nameChanged = !!nextName && nextName !== (current.name || '');
413
- const phoneChanged = cfg.showPhone && nextPhone !== (current.phone || '');
414
- if (!handleChanged && !nameChanged && !phoneChanged) {
415
- this.toast.show({
416
- message: this.t('saveSuccess'),
417
- duration: 2000,
418
- color: 'dark',
419
- position: 'top',
420
- });
421
- return;
422
- }
423
- this.saving.set(true);
424
- try {
425
- if (handleChanged) {
426
- try {
427
- await firstValueFrom(this.auth.updateHandle(nextHandle));
428
- }
429
- catch (err) {
430
- this.errors.handle(err, {
431
- context: 'profile.updateHandle',
432
- i18nMap: { AUTH_USERNAME_EXISTS: 'handleInUse' },
433
- fallbackKey: 'handleError',
434
- i18nNamespace: this.ns,
435
- });
436
- await this.loadFromApi();
437
- return;
438
- }
439
- }
440
- if (nameChanged || phoneChanged) {
441
- const payload = {};
442
- if (nameChanged)
443
- payload.name = nextName;
444
- if (phoneChanged)
445
- payload.phone = nextPhone;
446
- try {
447
- await firstValueFrom(this.auth.updateProfile(payload));
448
- }
449
- catch (err) {
450
- this.errors.handle(err, {
451
- context: 'profile.updateProfile',
452
- i18nMap: {
453
- AUTHV2_PHONE_EXISTS: 'phoneInUse',
454
- AUTHV2_INVALID_PHONE: 'phoneInvalid',
455
- },
456
- fallbackKey: 'saveError',
457
- i18nNamespace: this.ns,
458
- });
459
- await this.loadFromApi();
460
- return;
461
- }
462
- }
463
- this.toast.show({
464
- message: this.t('saveSuccess'),
465
- duration: 2500,
466
- color: 'dark',
467
- position: 'top',
468
- });
469
- cfg.onSaved?.(this.profile() ?? current);
470
- }
471
- finally {
472
- this.saving.set(false);
473
- }
474
- }
475
- onAvatarUploaded(result) {
476
- this.toast.show({
477
- message: this.t('avatarSuccess'),
478
- duration: 2500,
479
- color: 'dark',
480
- position: 'top',
481
- });
482
- this.resolvedConfig().onAvatarUploaded?.(result);
483
- }
484
- onAvatarError(_err) {
485
- this.toast.show({
486
- message: this.t('avatarError'),
487
- duration: 3000,
488
- color: 'dark',
489
- position: 'top',
490
- });
491
- }
492
- /** Lee del namespace configurado. */
493
- t(key) {
494
- return this.i18n.t(key, this.ns);
495
- }
496
- initialsFromName(name) {
497
- if (!name)
498
- return '?';
499
- const parts = name.trim().split(/\s+/).filter(Boolean);
500
- if (parts.length === 0)
501
- return '?';
502
- const first = parts[0]?.[0] ?? '';
503
- const last = parts.length > 1 ? (parts[parts.length - 1]?.[0] ?? '') : '';
504
- return (first + last).toUpperCase() || '?';
505
34
  }
506
35
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProfileViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
507
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ProfileViewComponent, isStandalone: true, selector: "val-profile-view", inputs: { config: "config" }, viewQueries: [{ propertyName: "formCmp", first: true, predicate: ["form"], descendants: true, isSignal: true }], ngImport: i0, template: `
508
- <div class="page">
509
- <header class="page-header">
510
- <val-display [props]="{ size: 'small', color: 'dark', content: t('pageTitle') }" />
511
- <val-title
512
- [props]="{
513
- size: 'large',
514
- color: 'dark',
515
- bold: false,
516
- content: t('pageDescription'),
517
- }"
518
- />
519
- </header>
520
-
521
- @if (loading()) {
522
- <val-skeleton-layout [props]="{ preset: 'form', rows: 3, showAvatar: true }" />
523
- } @else if (errorState()) {
524
- <val-empty-state [props]="errorState()!" />
525
- } @else {
526
- @if (profile(); as p) {
527
- @if (resolvedConfig().showAvatar) {
528
- <section class="settings-section avatar-section">
529
- <val-avatar-upload
530
- [props]="avatarProps()"
531
- (uploaded)="onAvatarUploaded($event)"
532
- (error)="onAvatarError($event)"
533
- />
534
- <div class="avatar-meta">
535
- <val-title
536
- [props]="{
537
- size: 'medium',
538
- color: 'dark',
539
- bold: true,
540
- content: p.name || '—',
541
- }"
542
- />
543
- <val-text
544
- [props]="{
545
- size: 'small',
546
- color: 'dark',
547
- bold: false,
548
- content: p.email,
549
- }"
550
- />
551
- @if (p.handle) {
552
- <val-text
553
- [props]="{
554
- size: 'small',
555
- color: 'dark',
556
- bold: true,
557
- content: '@' + p.handle,
558
- }"
559
- />
560
- }
561
- </div>
562
- </section>
563
- }
564
-
565
- <val-form #form [props]="formMeta" (onSubmit)="onSubmit($event)" />
566
-
567
- <!-- Card de compartir + modal QR removidos temporalmente (se retoman luego).
568
- Wiring intacto: shareCta(), shareModal(), shareOpen, showShareCta. -->
569
- }
570
- }
571
- </div>
572
- `, isInline: true, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.page-header{margin-bottom:16px}.page-header h1{font-size:22px;font-weight:700;margin:0 0 4px}.hint{font-size:13px;opacity:.7;margin:0 0 12px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.avatar-section{display:flex;align-items:center;gap:16px}.avatar-meta{display:flex;flex-direction:column;gap:2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: AvatarUploadComponent, selector: "val-avatar-upload", inputs: ["props", "customPath", "customThumbPath", "skipBackendSync"], outputs: ["uploaded", "error", "uploadStart"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: SkeletonLayoutComponent, selector: "val-skeleton-layout", inputs: ["props"] }] }); }
36
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ProfileViewComponent, isStandalone: true, selector: "val-profile-view", inputs: { config: "config" }, ngImport: i0, template: ` <val-profile-content [config]="config" /> `, isInline: true, dependencies: [{ kind: "component", type: ProfileContentComponent, selector: "val-profile-content", inputs: ["config"] }] }); }
573
37
  }
574
38
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProfileViewComponent, decorators: [{
575
39
  type: Component,
576
- args: [{ selector: 'val-profile-view', standalone: true, imports: [
577
- CommonModule,
578
- ReactiveFormsModule,
579
- AvatarUploadComponent,
580
- EmptyStateComponent,
581
- FormComponent,
582
- DisplayComponent,
583
- TextComponent,
584
- TitleComponent,
585
- SkeletonLayoutComponent,
586
- CtaCardComponent,
587
- ShareProfileModalComponent,
588
- ], template: `
589
- <div class="page">
590
- <header class="page-header">
591
- <val-display [props]="{ size: 'small', color: 'dark', content: t('pageTitle') }" />
592
- <val-title
593
- [props]="{
594
- size: 'large',
595
- color: 'dark',
596
- bold: false,
597
- content: t('pageDescription'),
598
- }"
599
- />
600
- </header>
601
-
602
- @if (loading()) {
603
- <val-skeleton-layout [props]="{ preset: 'form', rows: 3, showAvatar: true }" />
604
- } @else if (errorState()) {
605
- <val-empty-state [props]="errorState()!" />
606
- } @else {
607
- @if (profile(); as p) {
608
- @if (resolvedConfig().showAvatar) {
609
- <section class="settings-section avatar-section">
610
- <val-avatar-upload
611
- [props]="avatarProps()"
612
- (uploaded)="onAvatarUploaded($event)"
613
- (error)="onAvatarError($event)"
614
- />
615
- <div class="avatar-meta">
616
- <val-title
617
- [props]="{
618
- size: 'medium',
619
- color: 'dark',
620
- bold: true,
621
- content: p.name || '—',
622
- }"
623
- />
624
- <val-text
625
- [props]="{
626
- size: 'small',
627
- color: 'dark',
628
- bold: false,
629
- content: p.email,
630
- }"
631
- />
632
- @if (p.handle) {
633
- <val-text
634
- [props]="{
635
- size: 'small',
636
- color: 'dark',
637
- bold: true,
638
- content: '@' + p.handle,
639
- }"
640
- />
641
- }
642
- </div>
643
- </section>
644
- }
645
-
646
- <val-form #form [props]="formMeta" (onSubmit)="onSubmit($event)" />
647
-
648
- <!-- Card de compartir + modal QR removidos temporalmente (se retoman luego).
649
- Wiring intacto: shareCta(), shareModal(), shareOpen, showShareCta. -->
650
- }
651
- }
652
- </div>
653
- `, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.page-header{margin-bottom:16px}.page-header h1{font-size:22px;font-weight:700;margin:0 0 4px}.hint{font-size:13px;opacity:.7;margin:0 0 12px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.avatar-section{display:flex;align-items:center;gap:16px}.avatar-meta{display:flex;flex-direction:column;gap:2px}\n"] }]
40
+ args: [{
41
+ selector: 'val-profile-view',
42
+ standalone: true,
43
+ imports: [ProfileContentComponent],
44
+ template: ` <val-profile-content [config]="config" /> `,
45
+ }]
654
46
  }], ctorParameters: () => [], propDecorators: { config: [{
655
47
  type: Input
656
48
  }] } });
657
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZmlsZS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvcHJvZmlsZS12aWV3L3Byb2ZpbGUtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUVwRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUVqRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFFbEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFFL0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDekUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUV4RixPQUFPLEVBQUUscUJBQXFCLEVBQUUs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QkFBMEI7cUJBQzNCLFlBQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUVUO3dEQXVEUSxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIElucHV0LCBzaWduYWwsIHZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQXZhdGFyVXBsb2FkQ29tcG9uZW50IH0gZnJvbSAnLi4vYXZhdGFyLXVwbG9hZC9hdmF0YXItdXBsb2FkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBdmF0YXJVcGxvYWRFcnJvciwgQXZhdGFyVXBsb2FkTWV0YWRhdGEsIEF2YXRhclVwbG9hZFJlc3VsdCB9IGZyb20gJy4uL2F2YXRhci11cGxvYWQvdHlwZXMnO1xuaW1wb3J0IHsgRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0vZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2hhcmVQcm9maWxlTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9zaGFyZS1wcm9maWxlLW1vZGFsL3NoYXJlLXByb2ZpbGUtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IFNoYXJlUHJvZmlsZU1vZGFsTWV0YWRhdGEgfSBmcm9tICcuLi9zaGFyZS1wcm9maWxlLW1vZGFsL3R5cGVzJztcbmltcG9ydCB7IEN0YUNhcmRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvY3RhLWNhcmQvY3RhLWNhcmQuY29tcG9uZW50JztcbmltcG9ydCB7IEN0YUNhcmRNZXRhZGF0YSB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9jdGEtY2FyZC90eXBlcyc7XG5pbXBvcnQgeyBTa2VsZXRvbkxheW91dENvbXBvbmVudCB9IGZyb20gJy4uL3NrZWxldG9uLWxheW91dC9za2VsZXRvbi1sYXlvdXQuY29tcG9uZW50JztcbmltcG9ydCB7IERpc3BsYXlDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9kaXNwbGF5L2Rpc3BsYXkuY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90ZXh0L3RleHQuY29tcG9uZW50JztcbmltcG9ydCB7IFRpdGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvdGl0bGUvdGl0bGUuY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvZW1wdHktc3RhdGUvZW1wdHktc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVNZXRhZGF0YSB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9lbXB0eS1zdGF0ZS90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVFcnJvclN0YXRlUHJvcHMgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvZW1wdHktc3RhdGUvZmFjdG9yeSc7XG5pbXBvcnQgeyBCdXR0b25NZXRhZGF0YSwgQ29tcG9uZW50U3RhdGVzLCBGb3JtTWV0YWRhdGEsIEZvcm1TdWJtaXQsIElucHV0TWV0YWRhdGEsIElucHV0VHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBHZXRQcm9maWxlUmVzcG9uc2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoL3R5cGVzJztcbmltcG9ydCB7IEZpcmViYXNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2ZpcmViYXNlL2ZpcmViYXNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlyZXN0b3JlQ29sbGVjdGlvbkZhY3RvcnksIFR5cGVkQ29sbGVjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2ZpcmViYXNlL2ZpcmVzdG9yZS1jb2xsZWN0aW9uJztcbmltcG9ydCB7IEZpcmVzdG9yZURvY3VtZW50IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmlyZWJhc2UvdHlwZXMnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgY29ubmVjdFBhZ2VSZWZyZXNoIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGFnZS1yZWZyZXNoL3BhZ2UtcmVmcmVzaC5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVmFsdGVjaEVycm9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Vycm9ycy92YWx0ZWNoLWVycm9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgaW50ZXJwcmV0RXJyb3IgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lcnJvcnMvaW50ZXJwcmV0LWVycm9yJztcblxuaW1wb3J0IHsgUHJvZmlsZVZpZXdDb25maWcgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFBST0ZJTEVfVklFV19JMThOIH0gZnJvbSAnLi9wcm9maWxlLXZpZXcuaTE4bic7XG5cbi8qKlxuICogRm9ybWEgZGVsIGRvYyBGaXJlc3RvcmUgL3VzZXJzL3t1aWR9IHF1ZSBsYSB2aXN0YSBjb25zdW1lLiBTdWJzZXQgZGVsIHNjaGVtYVxuICogZXNjcml0byBwb3IgZWwgYmFja2VuZCAoU3luY1Byb2ZpbGVUb0ZpcmVzdG9yZSkg4oCUIHNvbG8gbG9zIGNhbXBvcyBxdWUgZXN0YVxuICogdmlzdGEgbmVjZXNpdGE7IGxvcyBkZW3DoXMgKHN0YXR1cywgbWZhRW5hYmxlZCwgcm9sZXMsIGV0Yy4pIHNlIGlnbm9yYW4uXG4gKi9cbmludGVyZmFjZSBVc2VyTWlycm9yRG9jIGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQge1xuICB1c2VySWQ6IHN0cmluZztcbiAgZW1haWw6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgaGFuZGxlPzogc3RyaW5nO1xuICBwaG9uZT86IHN0cmluZztcbiAgYXZhdGFyVXJsPzogc3RyaW5nO1xuICBhdmF0YXJUaHVtYm5haWw/OiBzdHJpbmc7XG59XG5cbi8qKiBQYXRyw7NuIHNpbmNyb25pemFkbyBjb24gYmFja2VuZCBoYW5kbGVSZWdleDogbG93ZXJjYXNlIGFsZmFudW0gKyB1bmRlcnNjb3JlLiAqL1xuY29uc3QgSEFORExFX1BBVFRFUk4gPSAvXlthLXpfXVthLXowLTlfXSokLztcbmNvbnN0IEhBTkRMRV9NSU4gPSAzO1xuY29uc3QgSEFORExFX01BWCA9IDIwO1xuXG5jb25zdCBERUZBVUxUX05BTUVTUEFDRSA9ICdTZXR0aW5ncy5Qcm9maWxlJztcblxuLyoqXG4gKiBgdmFsLXByb2ZpbGUtdmlld2Ag4oCUIHZpc3RhIFBlcmZpbCBmdWxsLWZlYXR1cmUgYXV0b2NvbnRlbmlkYSAob3JnYW5pc20pLlxuICpcbiAqIEVkaXRhIGxvcyBjYW1wb3MgcMO6YmxpY29zIGRlbCB1c3VhcmlvIGVuIFVOIHNvbG8gZm9ybXVsYXJpbyBjb24gVU4gc29sbyBib3TDs25cbiAqIFwiR3VhcmRhclwiLiBXaXJldXA6XG4gKiAgLSBBdmF0YXIg4oCUIHZhbC1hdmF0YXItdXBsb2FkIChGaXJlYmFzZSBTdG9yYWdlICsgYmFja2VuZCBzeW5jKS4gU2VwYXJhZG8gZGVsXG4gKiAgICBmb3JtIHBvcnF1ZSBlcyB1cGxvYWQgc3luYyBpbmRlcGVuZGllbnRlLlxuICogIC0gSGFuZGxlIChAdXN1YXJpbykg4oCUIElucHV0VHlwZS5IQU5ETEUgKHZhbC11c2VybmFtZS1pbnB1dCBjb24gY2hlY2sgZGVcbiAqICAgIGRpc3BvbmliaWxpZGFkIGFzeW5jIHJlc3VlbHRvIHbDrWEgQXV0aFNlcnZpY2UgaW55ZWN0YWRvKS5cbiAqICAtIE5vbWJyZSDigJQgSW5wdXRUeXBlLlRFWFQuXG4gKiAgLSBUZWzDqWZvbm8g4oCUIElucHV0VHlwZS5QSE9ORS5cbiAqXG4gKiBTdWJtaXQgaGFuZGxlciBkaXNwYXRjaGE6XG4gKiAgMS4gU2kgaGFuZGxlIGNhbWJpw7Mg4oaSIHVwZGF0ZUhhbmRsZSBQUklNRVJPICh1bmlxdWVuZXNzKS5cbiAqICAyLiBTaSBuYW1lIG8gcGhvbmUgY2FtYmnDsyDihpIgdXBkYXRlUHJvZmlsZSBjb24gYW1ib3MuXG4gKlxuICogTGVjdHVyYSBkZWwgcGVyZmlsOiBzdXNjcmliZSBhbCBkb2MgRmlyZXN0b3JlIC91c2Vycy97dWlkfSAobWlycm9yIHF1ZSBtYW50aWVuZVxuICogZWwgYmFja2VuZCkuIFJlYWN0aXZvIGNyb3NzLXRhYiArIGF1dG8tcmVmcmVzY2EgdHJhcyBzYXZlLiBGYWxsYmFjayBSRVNUXG4gKiAoYXV0aC5nZXRQcm9maWxlKSBzaSBlbCBkb2Mgbm8gZXhpc3RlIG8gZWwgbGlzdGVuZXIgZmFsbGEuXG4gKlxuICogTk8gcmVuZGVyaXphIGlvbi1jb250ZW50IOKAlCB2aXZlIGRlbnRybyBkZSB2YWwtcGFnZS13cmFwcGVyLlxuICpcbiAqIEF1dG8tcmVnaXN0cmEgc3VzIGRlZmF1bHRzIGkxOG4gKGVzL2VuKSBlbiBlbCBjb25zdHJ1Y3RvciBzaSBlbCBjb25zdW1lciBub1xuICogcHJvdmV5w7MgZWwgbmFtZXNwYWNlIGNvbmZpZ3VyYWRvIChkZWZhdWx0IGBTZXR0aW5ncy5Qcm9maWxlYCkuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1wcm9maWxlLXZpZXcnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgQXZhdGFyVXBsb2FkQ29tcG9uZW50LFxuICAgIEVtcHR5U3RhdGVDb21wb25lbnQsXG4gICAgRm9ybUNvbXBvbmVudCxcbiAgICBEaXNwbGF5Q29tcG9uZW50LFxuICAgIFRleHRDb21wb25lbnQsXG4gICAgVGl0bGVDb21wb25lbnQsXG4gICAgU2tlbGV0b25MYXlvdXRDb21wb25lbnQsXG4gICAgQ3RhQ2FyZENvbXBvbmVudCxcbiAgICBTaGFyZVByb2ZpbGVNb2RhbENvbXBvbmVudCxcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicGFnZVwiPlxuICAgICAgPGhlYWRlciBjbGFzcz1cInBhZ2UtaGVhZGVyXCI+XG4gICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwieyBzaXplOiAnc21hbGwnLCBjb2xvcjogJ2RhcmsnLCBjb250ZW50OiB0KCdwYWdlVGl0bGUnKSB9XCIgLz5cbiAgICAgICAgPHZhbC10aXRsZVxuICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICBzaXplOiAnbGFyZ2UnLFxuICAgICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICAgIGJvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgY29udGVudDogdCgncGFnZURlc2NyaXB0aW9uJyksXG4gICAgICAgICAgfVwiXG4gICAgICAgIC8+XG4gICAgICA8L2hlYWRlcj5cblxuICAgICAgQGlmIChsb2FkaW5nKCkpIHtcbiAgICAgICAgPHZhbC1za2VsZXRvbi1sYXlvdXQgW3Byb3BzXT1cInsgcHJlc2V0OiAnZm9ybScsIHJvd3M6IDMsIHNob3dBdmF0YXI6IHRydWUgfVwiIC8+XG4gICAgICB9IEBlbHNlIGlmIChlcnJvclN0YXRlKCkpIHtcbiAgICAgICAgPHZhbC1lbXB0eS1zdGF0ZSBbcHJvcHNdPVwiZXJyb3JTdGF0ZSgpIVwiIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgQGlmIChwcm9maWxlKCk7IGFzIHApIHtcbiAgICAgICAgICBAaWYgKHJlc29sdmVkQ29uZmlnKCkuc2hvd0F2YXRhcikge1xuICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJzZXR0aW5ncy1zZWN0aW9uIGF2YXRhci1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgIDx2YWwtYXZhdGFyLXVwbG9hZFxuICAgICAgICAgICAgICAgIFtwcm9wc109XCJhdmF0YXJQcm9wcygpXCJcbiAgICAgICAgICAgICAgICAodXBsb2FkZWQpPVwib25BdmF0YXJVcGxvYWRlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoZXJyb3IpPVwib25BdmF0YXJFcnJvcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhci1tZXRhXCI+XG4gICAgICAgICAgICAgICAgPHZhbC10aXRsZVxuICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogJ21lZGl1bScsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgICAgICAgICAgIGJvbGQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHAubmFtZSB8fCAn4oCUJyxcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogcC5lbWFpbCxcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgQGlmIChwLmhhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgc2l6ZTogJ3NtYWxsJyxcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICAgICAgICAgIGJvbGQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgY29udGVudDogJ0AnICsgcC5oYW5kbGUsXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDx2YWwtZm9ybSAjZm9ybSBbcHJvcHNdPVwiZm9ybU1ldGFcIiAob25TdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiIC8+XG5cbiAgICAgICAgICA8IS0tIENhcmQgZGUgY29tcGFydGlyICsgbW9kYWwgUVIgcmVtb3ZpZG9zIHRlbXBvcmFsbWVudGUgKHNlIHJldG9tYW4gbHVlZ28pLlxuICAgICAgICAgICAgICAgV2lyaW5nIGludGFjdG86IHNoYXJlQ3RhKCksIHNoYXJlTW9kYWwoKSwgc2hhcmVPcGVuLCBzaG93U2hhcmVDdGEuIC0tPlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5wYWdlIHtcbiAgICAgICAgcGFkZGluZzogMTZweCAwO1xuICAgICAgICBtYXgtd2lkdGg6IDcyMHB4O1xuICAgICAgICBtYXJnaW46IDAgYXV0bztcbiAgICAgIH1cbiAgICAgIC5wYWdlLWhlYWRlciB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gICAgICB9XG4gICAgICAucGFnZS1oZWFkZXIgaDEge1xuICAgICAgICBmb250LXNpemU6IDIycHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICAgIG1hcmdpbjogMCAwIDRweDtcbiAgICAgIH1cbiAgICAgIC5oaW50IHtcbiAgICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgICBvcGFjaXR5OiAwLjc7XG4gICAgICAgIG1hcmdpbjogMCAwIDEycHg7XG4gICAgICB9XG4gICAgICAuc2V0dGluZ3Mtc2VjdGlvbiB7XG4gICAgICAgIHBhZGRpbmc6IDE2cHggMDtcbiAgICAgIH1cbiAgICAgIC5zZXR0aW5ncy1zZWN0aW9uICsgLnNldHRpbmdzLXNlY3Rpb24ge1xuICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tdmFsLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7XG4gICAgICB9XG4gICAgICAuYXZhdGFyLXNlY3Rpb24ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDE2cHg7XG4gICAgICB9XG4gICAgICAuYXZhdGFyLW1ldGEge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDJweDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9maWxlVmlld0NvbXBvbmVudCB7XG4gIHByaXZhdGUgbmF2ID0gaW5qZWN0KE5hdmlnYXRpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0b2FzdCA9IGluamVjdChUb2FzdFNlcnZpY2UpO1xuICBwcml2YXRlIGVycm9ycyA9IGluamVjdChWYWx0ZWNoRXJyb3JTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBmaXJlYmFzZSA9IGluamVjdChGaXJlYmFzZVNlcnZpY2UpO1xuICBwcml2YXRlIGNvbGxlY3Rpb25zID0gaW5qZWN0KEZpcmVzdG9yZUNvbGxlY3Rpb25GYWN0b3J5KTtcbiAgcHJpdmF0ZSByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAvKipcbiAgICogQ29uZmlnIHbDrWEgQElucHV0IChvYmplY3QtZmlyc3QpLiBTaSBubyBzZSBwYXNhLCBzZSBjYWUgYWwgcm91dGUgZGF0YVxuICAgKiBgcHJvZmlsZUNvbmZpZ2AgKHBvYmxhZG8gcG9yIGBwcm92aWRlVmFsdGVjaFByb2ZpbGVSb3V0ZXNgKS4gYHJlc29sdmVkQ29uZmlnYFxuICAgKiBtZXJnZWEgY29uIGxvcyBkZWZhdWx0cy5cbiAgICovXG4gIEBJbnB1dCgpIGNvbmZpZz86IFByb2ZpbGVWaWV3Q29uZmlnO1xuXG4gIC8qKiBDb25maWcgbWVyZ2VhZGEgY29uIGRlZmF1bHRzLiBASW5wdXQgZ2FuYSBzb2JyZSByb3V0ZSBkYXRhLiAqL1xuICByZWFkb25seSByZXNvbHZlZENvbmZpZyA9IGNvbXB1dGVkPFxuICAgIFJlcXVpcmVkPE9taXQ8UHJvZmlsZVZpZXdDb25maWcsICdvblNhdmVkJyB8ICdvbkF2YXRhclVwbG9hZGVkJyB8ICdwcm9maWxlQmFzZVVybCc+PiAmXG4gICAgICBQaWNrPFByb2ZpbGVWaWV3Q29uZmlnLCAnb25TYXZlZCcgfCAnb25BdmF0YXJVcGxvYWRlZCcgfCAncHJvZmlsZUJhc2VVcmwnPlxuICA+KCgpID0+IHtcbiAgICBjb25zdCBmcm9tUm91dGUgPSAodGhpcy5yb3V0ZT8uc25hcHNob3QuZGF0YVsncHJvZmlsZUNvbmZpZyddID8/IHt9KSBhcyBQcm9maWxlVmlld0NvbmZpZztcbiAgICBjb25zdCBtZXJnZWQ6IFByb2ZpbGVWaWV3Q29uZmlnID0geyAuLi5mcm9tUm91dGUsIC4uLih0aGlzLmNvbmZpZyA/PyB7fSkgfTtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd0F2YXRhcjogbWVyZ2VkLnNob3dBdmF0YXIgPz8gdHJ1ZSxcbiAgICAgIHNob3dIYW5kbGU6IG1lcmdlZC5zaG93SGFuZGxlID8/IHRydWUsXG4gICAgICBzaG93UGhvbmU6IG1lcmdlZC5zaG93UGhvbmUgPz8gdHJ1ZSxcbiAgICAgIHNob3dTaGFyZUN0YTogbWVyZ2VkLnNob3dTaGFyZUN0YSA/PyB0cnVlLFxuICAgICAgcHJvZmlsZUJhc2VVcmw6IG1lcmdlZC5wcm9maWxlQmFzZVVybCA/PyAnJyxcbiAgICAgIGkxOG5OYW1lc3BhY2U6IG1lcmdlZC5pMThuTmFtZXNwYWNlID8/IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICAgb25TYXZlZDogbWVyZ2VkLm9uU2F2ZWQsXG4gICAgICBvbkF2YXRhclVwbG9hZGVkOiBtZXJnZWQub25BdmF0YXJVcGxvYWRlZCxcbiAgICB9O1xuICB9KTtcblxuICAvKiogTmFtZXNwYWNlIGkxOG4gcmVzdWVsdG8gKGNhcHR1cmFkbyB1bmEgdmV6IHBhcmEgbGxhbWFkYXMgbm8tcmVhY3RpdmFzKS4gKi9cbiAgcHJpdmF0ZSBnZXQgbnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZygpLmkxOG5OYW1lc3BhY2U7XG4gIH1cblxuICAvKipcbiAgICogQ29sZWNjacOzbiBnbG9iYWwgL3VzZXJzL3t1aWR9IChza2lwQXBwUHJlZml4OiB0cnVlIOKAlCBlbCBkb2Mgdml2ZSBmdWVyYSBkZVxuICAgKiBhcHBzL3thcHBJZH0vLi4uIHBvcnF1ZSBlcyBjcm9zcy1hcHAsIHZlciBmaXJlc3RvcmUucnVsZXMpLlxuICAgKi9cbiAgcHJpdmF0ZSB1c2Vyc0NvbDogVHlwZWRDb2xsZWN0aW9uPFVzZXJNaXJyb3JEb2M+ID0gdGhpcy5jb2xsZWN0aW9ucy5jcmVhdGU8VXNlck1pcnJvckRvYz4oJ3VzZXJzJywge1xuICAgIHNraXBBcHBQcmVmaXg6IHRydWUsXG4gIH0pO1xuXG4gIHByaXZhdGUgZm9ybUNtcCA9IHZpZXdDaGlsZDxGb3JtQ29tcG9uZW50PignZm9ybScpO1xuXG4gIHJlYWRvbmx5IHByb2ZpbGUgPSBzaWduYWw8R2V0UHJvZmlsZVJlc3BvbnNlIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGxvYWRpbmcgPSBzaWduYWwodHJ1ZSk7XG4gIHJlYWRvbmx5IHNhdmluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGxvYWRFcnJvciA9IHNpZ25hbDx1bmtub3duIHwgbnVsbD4obnVsbCk7XG5cbiAgcmVhZG9ubHkgc2hhcmVPcGVuID0gc2lnbmFsKGZhbHNlKTtcblxuICByZWFkb25seSBzaGFyZUN0YSA9IGNvbXB1dGVkPEN0YUNhcmRNZXRhZGF0YT4oKCkgPT4ge1xuICAgIHRoaXMuaTE4bi5sYW5nKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpdGxlOiB0aGlzLnQoJ3NoYXJlQ3RhVGl0bGUnKSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnQoJ3NoYXJlQ3RhRGVzYycpLFxuICAgICAgYm9yZGVyZWQ6IHRydWUsXG4gICAgICBhY3Rpb25zOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnbGVmdCcsXG4gICAgICAgIGNvbHVtbmVkOiBmYWxzZSxcbiAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRoaXMudCgnc2hhcmVDdGFCdG4nKSxcbiAgICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgICAgICAgc3RhdGU6ICdFTkFCTEVEJyxcbiAgICAgICAgICAgIHRva2VuOiAnc2hhcmUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH07XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHNoYXJlTW9kYWwgPSBjb21wdXRlZDxTaGFyZVByb2ZpbGVNb2RhbE1ldGFkYXRhPigoKSA9PiB7XG4gICAgY29uc3QgcCA9IHRoaXMucHJvZmlsZSgpO1xuICAgIGNvbnN0IGhhbmRsZSA9IHA/LmhhbmRsZSA/PyAnbWUnO1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLnJlc29sdmVkQ29uZmlnKCkucHJvZmlsZUJhc2VVcmw7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHA/Lm5hbWUgPz8gJycsXG4gICAgICBoYW5kbGU6IHA/LmhhbmRsZSxcbiAgICAgIGF2YXRhclVybDogcD8uYXZhdGFyVXJsLFxuICAgICAgZW1haWw6IHA/LmVtYWlsLFxuICAgICAgdXJsOiBiYXNlID8gYCR7YmFzZX0vdS8ke2hhbmRsZX1gIDogYC91LyR7aGFuZGxlfWAsXG4gICAgfTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfdXNlcklkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5hdXRoLnVzZXIoKT8udXNlcklkID8/IG51bGwpO1xuXG4gIHJlYWRvbmx5IGVycm9yU3RhdGUgPSBjb21wdXRlZDxFbXB0eVN0YXRlTWV0YWRhdGEgfCBudWxsPigoKSA9PiB7XG4gICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICBjb25zdCBlcnIgPSB0aGlzLmxvYWRFcnJvcigpO1xuICAgIGlmICghZXJyKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gY3JlYXRlRXJyb3JTdGF0ZVByb3BzKGVyciwge1xuICAgICAgdGl0bGU6IHtcbiAgICAgICAgb2ZmbGluZTogdGhpcy50KCdvZmZsaW5lVGl0bGUnKSxcbiAgICAgICAgZXJyb3I6IHRoaXMudCgnZXJyb3JUaXRsZScpLFxuICAgICAgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7XG4gICAgICAgIG9mZmxpbmU6IHRoaXMudCgnb2ZmbGluZUhpbnQnKSxcbiAgICAgICAgZXJyb3I6IGludGVycHJldEVycm9yKGVycikubWVzc2FnZSxcbiAgICAgIH0sXG4gICAgICByZXRyeUxhYmVsOiB0aGlzLnQoJ3JldHJ5JyksXG4gICAgICBvblJldHJ5OiAoKSA9PiB0aGlzLmxvYWRGcm9tQXBpKCksXG4gICAgICByZXRyeWluZzogdGhpcy5sb2FkaW5nKCksXG4gICAgfSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGF2YXRhclByb3BzID0gY29tcHV0ZWQ8QXZhdGFyVXBsb2FkTWV0YWRhdGE+KCgpID0+IHtcbiAgICB0aGlzLmkxOG4ubGFuZygpO1xuICAgIGNvbnN0IHAgPSB0aGlzLnByb2ZpbGUoKTtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFVybDogcD8uYXZhdGFyVXJsLFxuICAgICAgaW5pdGlhbHM6IHRoaXMuaW5pdGlhbHNGcm9tTmFtZShwPy5uYW1lKSxcbiAgICAgIHNpemU6IDk2LFxuICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICBzaG93Vmlld0J1dHRvbjogdHJ1ZSxcbiAgICAgIGkxOG5OYW1lc3BhY2U6IHRoaXMubnMsXG4gICAgfTtcbiAgfSk7XG5cbiAgZm9ybU1ldGE6IEZvcm1NZXRhZGF0YSA9IHRoaXMuYnVpbGRGb3JtTWV0YSgpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEF1dG8tcmVnaXN0cm8gaTE4biDigJQgcmVzcGV0YSBvdmVycmlkZSBkZWwgY29uc3VtZXIuIEVsIG5hbWVzcGFjZSBwdWVkZVxuICAgIC8vIHZlbmlyIGRlIEBJbnB1dC5jb25maWcgbyBkZWwgcm91dGUgZGF0YTsgbG8gcmVzb2x2ZW1vcyBhY8OhLlxuICAgIGNvbnN0IG5zID0gdGhpcy5ucztcbiAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cyhucywgUFJPRklMRV9WSUVXX0kxOE4pO1xuXG4gICAgdGhpcy5uYXYuc2V0QmFja0hlYWRlcigncGFnZVRpdGxlJywgbnMsIHsgd2l0aE1lbnU6IHRydWUgfSk7XG5cbiAgICBjb25uZWN0UGFnZVJlZnJlc2goKCkgPT4gdGhpcy5sb2FkRnJvbUFwaSgpKTtcblxuICAgIC8vIENhcmdhciBwZXJmaWwgaW5tZWRpYXRhbWVudGUgc2kgZWwgdXN1YXJpbyB5YSBlc3TDoSBhdXRlbnRpY2Fkby5cbiAgICAvLyBTaW4gZXN0bywgc2kgYXV0aC51c2VyKCkgeWEgZXN0YWJhIHBvcHVsYWRvIGFsIG1vbnRhciBlbCBjb21wb25lbnRlXG4gICAgLy8gKHNlc2nDs24gcmVzdGF1cmFkYSksIGVsIGVmZmVjdCBubyBkaXNwYXJhIHkgbGEgcMOhZ2luYSBxdWVkYSB2YWPDrWFcbiAgICAvLyBoYXN0YSBxdWUgZWwgdXN1YXJpbyBoYWNlIHB1bGwtdG8tcmVmcmVzaCAoUmVnbGE6IG5vIGVzcGVyYXIgYSBxdWVcbiAgICAvLyB1bmEgc2lnbmFsIGNhbWJpZSBzaSB5YSB0aWVuZSB2YWxvciBpbmljaWFsKS5cbiAgICB2b2lkIHRoaXMuZmlyZWJhc2Uud2hlbkZpcmViYXNlQXV0aFJlYWR5KCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCB1aWQgPSB0aGlzLl91c2VySWQoKTtcbiAgICAgIGlmICh1aWQpIHtcbiAgICAgICAgdm9pZCB0aGlzLmxvYWRGcm9tQXBpKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoXG4gICAgICBvbkNsZWFudXAgPT4ge1xuICAgICAgICBjb25zdCB1aWQgPSB0aGlzLl91c2VySWQoKTtcbiAgICAgICAgaWYgKCF1aWQpIHtcbiAgICAgICAgICB0aGlzLnByb2ZpbGUuc2V0KG51bGwpO1xuICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuXG4gICAgICAgIGxldCBzdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICAgIGxldCBhcGlGYWxsYmFja1VzZWQgPSBmYWxzZTtcblxuICAgICAgICB2b2lkIHRoaXMuZmlyZWJhc2Uud2hlbkZpcmViYXNlQXV0aFJlYWR5KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIHN1YiA9IHRoaXMudXNlcnNDb2wud2F0Y2godWlkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogZG9jID0+IHtcbiAgICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvZmlsZS5zZXQodGhpcy5tYXBNaXJyb3JUb1Byb2ZpbGUoZG9jKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkRXJyb3Iuc2V0KG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFhcGlGYWxsYmFja1VzZWQpIHtcbiAgICAgICAgICAgICAgICBhcGlGYWxsYmFja1VzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5sb2FkRnJvbUFwaSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFhcGlGYWxsYmFja1VzZWQpIHtcbiAgICAgICAgICAgICAgICBhcGlGYWxsYmFja1VzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5sb2FkRnJvbUFwaSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBvbkNsZWFudXAoKCkgPT4ge1xuICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgc3ViPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuXG4gICAgLy8gc2F2aW5nIOKGkiBtdXRhciBzdGF0ZSAodmFsLWZvcm0ubmdEb0NoZWNrIGxvIGRldGVjdGEpLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBpc1NhdmluZyA9IHRoaXMuc2F2aW5nKCk7XG4gICAgICBjb25zdCBzdGF0ZSA9IGlzU2F2aW5nID8gQ29tcG9uZW50U3RhdGVzLldPUktJTkcgOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRDtcbiAgICAgIHRoaXMuZm9ybU1ldGEuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICh0aGlzLmZvcm1NZXRhLmFjdGlvbnMgYXMgQnV0dG9uTWV0YWRhdGEpLnN0YXRlID0gc3RhdGU7XG4gICAgICAodGhpcy5mb3JtTWV0YS5hY3Rpb25zIGFzIEJ1dHRvbk1ldGFkYXRhKS50ZXh0ID0gaXNTYXZpbmcgPyB0aGlzLnQoJ3NhdmluZycpIDogdGhpcy50KCdzYXZlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBwcm9maWxlIGxvYWRlZCArIGZvcm0gbW91bnRlZCDihpIgcGF0Y2hWYWx1ZSBhbCBGb3JtR3JvdXAuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHAgPSB0aGlzLnByb2ZpbGUoKTtcbiAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm1DbXAoKT8uRm9ybTtcbiAgICAgIGlmICghcCB8fCAhZm9ybSkgcmV0dXJuO1xuICAgICAgZm9ybS5wYXRjaFZhbHVlKFxuICAgICAgICB7XG4gICAgICAgICAgaGFuZGxlOiBwLmhhbmRsZSB8fCAnJyxcbiAgICAgICAgICBuYW1lOiBwLm5hbWUgfHwgJycsXG4gICAgICAgICAgcGhvbmU6IHAucGhvbmUgfHwgJycsXG4gICAgICAgIH0sXG4gICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gaTE4bi5sYW5nIGNoYW5nZSDihpIgbXV0YXIgbGFiZWxzIChyYXJlLCBubyBhZmVjdGEgdHlwaW5nKS5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICAgIHRoaXMuYXBwbHlJMThuTGFiZWxzKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQ29uc3RydWNjacOzbiBpbmljaWFsIOKAlCBVTkEgdmV6LiBHYXRlYSBoYW5kbGUvcGhvbmUgc2Vnw7puIGNvbmZpZy4gKi9cbiAgcHJpdmF0ZSBidWlsZEZvcm1NZXRhKCk6IEZvcm1NZXRhZGF0YSB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5yZXNvbHZlZENvbmZpZygpO1xuXG4gICAgY29uc3QgaGFuZGxlRmllbGQ6IElucHV0TWV0YWRhdGEgPSB7XG4gICAgICB0b2tlbjogJ3Byb2ZpbGUtaGFuZGxlJyxcbiAgICAgIG5hbWU6ICdoYW5kbGUnLFxuICAgICAgbGFiZWw6IHRoaXMudCgnaGFuZGxlJyksXG4gICAgICBoaW50OiB0aGlzLnQoJ2hhbmRsZUhpbnQnKSxcbiAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnQoJ2hhbmRsZVBsYWNlaG9sZGVyJyksXG4gICAgICB0eXBlOiBJbnB1dFR5cGUuSEFORExFLFxuICAgICAgb3JkZXI6IDEsXG4gICAgICB2YWxpZGF0b3JzOiBbXG4gICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgIFZhbGlkYXRvcnMubWluTGVuZ3RoKEhBTkRMRV9NSU4pLFxuICAgICAgICBWYWxpZGF0b3JzLm1heExlbmd0aChIQU5ETEVfTUFYKSxcbiAgICAgICAgVmFsaWRhdG9ycy5wYXR0ZXJuKEhBTkRMRV9QQVRURVJOKSxcbiAgICAgIF0sXG4gICAgICBlcnJvcnM6IHtcbiAgICAgICAgcmVxdWlyZWQ6IHRoaXMudCgndXNlcm5hbWVJbnZhbGlkJyksXG4gICAgICAgIG1pbmxlbmd0aDogdGhpcy50KCd1c2VybmFtZUludmFsaWQnKSxcbiAgICAgICAgbWF4bGVuZ3RoOiB0aGlzLnQoJ3VzZXJuYW1lSW52YWxpZCcpLFxuICAgICAgICBwYXR0ZXJuOiB0aGlzLnQoJ3VzZXJuYW1lSW52YWxpZCcpLFxuICAgICAgfSxcbiAgICAgIHZhbHVlOiAnJyxcbiAgICAgIHJhbmdlOiB7IG1pbjogSEFORExFX01JTiwgbWF4OiBIQU5ETEVfTUFYIH0sXG4gICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgfTtcblxuICAgIGNvbnN0IG5hbWVGaWVsZDogSW5wdXRNZXRhZGF0YSA9IHtcbiAgICAgIHRva2VuOiAncHJvZmlsZS1uYW1lJyxcbiAgICAgIG5hbWU6ICduYW1lJyxcbiAgICAgIGxhYmVsOiB0aGlzLnQoJ25hbWUnKSxcbiAgICAgIGhpbnQ6IHRoaXMudCgnbmFtZUhpbnQnKSxcbiAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnQoJ25hbWVQbGFjZWhvbGRlcicpLFxuICAgICAgdHlwZTogSW5wdXRUeXBlLlRFWFQsXG4gICAgICBvcmRlcjogMixcbiAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgyKSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwKV0sXG4gICAgICBlcnJvcnM6IHt9LFxuICAgICAgdmFsdWU6ICcnLFxuICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgIH07XG5cbiAgICBjb25zdCBwaG9uZUZpZWxkOiBJbnB1dE1ldGFkYXRhID0ge1xuICAgICAgdG9rZW46ICdwcm9maWxlLXBob25lJyxcbiAgICAgIG5hbWU6ICdwaG9uZScsXG4gICAgICBsYWJlbDogdGhpcy50KCdwaG9uZScpLFxuICAgICAgaGludDogdGhpcy50KCdwaG9uZUhpbnQnKSxcbiAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnQoJ3Bob25lUGxhY2Vob2xkZXInKSxcbiAgICAgIHR5cGU6IElucHV0VHlwZS5QSE9ORSxcbiAgICAgIG9yZGVyOiAzLFxuICAgICAgdmFsaWRhdG9yczogW10sXG4gICAgICBlcnJvcnM6IHt9LFxuICAgICAgdmFsdWU6ICcnLFxuICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgIH07XG5cbiAgICAvLyBGaWx0cmFkbyBwb3IgY29uZmlnOiBlbCBuYW1lIHNpZW1wcmUgdmE7IGhhbmRsZS9waG9uZSBzb24gb3B0LW91dC5cbiAgICBjb25zdCBmaWVsZHM6IElucHV0TWV0YWRhdGFbXSA9IFtdO1xuICAgIGlmIChjZmcuc2hvd0hhbmRsZSkgZmllbGRzLnB1c2goaGFuZGxlRmllbGQpO1xuICAgIGZpZWxkcy5wdXNoKG5hbWVGaWVsZCk7XG4gICAgaWYgKGNmZy5zaG93UGhvbmUpIGZpZWxkcy5wdXNoKHBob25lRmllbGQpO1xuXG4gICAgY29uc3Qgc3VibWl0QnV0dG9uOiBCdXR0b25NZXRhZGF0YSA9IHtcbiAgICAgIHRleHQ6IHRoaXMudCgnc2F2ZScpLFxuICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgIHR5cGU6ICdzdWJtaXQnLFxuICAgICAgZmlsbDogJ3NvbGlkJyxcbiAgICAgIHNpemU6ICdkZWZhdWx0JyxcbiAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgZXhwYW5kOiAnYmxvY2snLFxuICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgdG9rZW46ICdwcm9maWxlLXNhdmUnLFxuICAgIH0gYXMgQnV0dG9uTWV0YWRhdGE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJycsXG4gICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgb3JkZXI6IDEsXG4gICAgICAgICAgZmllbGRzLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGFjdGlvbnM6IHN1Ym1pdEJ1dHRvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqIFJlLWFwbGljYSBsYWJlbHMvaGludHMvcGxhY2Vob2xkZXJzIGVuIGNhbWJpbyBkZSBpZGlvbWEuICovXG4gIHByaXZhdGUgYXBwbHlJMThuTGFiZWxzKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlY3Rpb24gPSB0aGlzLmZvcm1NZXRhLnNlY3Rpb25zWzBdO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2Ygc2VjdGlvbi5maWVsZHMpIHtcbiAgICAgIHN3aXRjaCAoZmllbGQubmFtZSkge1xuICAgICAgICBjYXNlICdoYW5kbGUnOlxuICAgICAgICAgIGZpZWxkLmxhYmVsID0gdGhpcy50KCdoYW5kbGUnKTtcbiAgICAgICAgICBmaWVsZC5oaW50ID0gdGhpcy50KCdoYW5kbGVIaW50Jyk7XG4gICAgICAgICAgZmllbGQucGxhY2Vob2xkZXIgPSB0aGlzLnQoJ2hhbmRsZVBsYWNlaG9sZGVyJyk7XG4gICAgICAgICAgZmllbGQuZXJyb3JzID0ge1xuICAgICAgICAgICAgcmVxdWlyZWQ6IHRoaXMudCgndXNlcm5hbWVJbnZhbGlkJyksXG4gICAgICAgICAgICBtaW5sZW5ndGg6IHRoaXMudCgndXNlcm5hbWVJbnZhbGlkJyksXG4gICAgICAgICAgICBtYXhsZW5ndGg6IHRoaXMudCgndXNlcm5hbWVJbnZhbGlkJyksXG4gICAgICAgICAgICBwYXR0ZXJuOiB0aGlzLnQoJ3VzZXJuYW1lSW52YWxpZCcpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ25hbWUnOlxuICAgICAgICAgIGZpZWxkLmxhYmVsID0gdGhpcy50KCduYW1lJyk7XG4gICAgICAgICAgZmllbGQuaGludCA9IHRoaXMudCgnbmFtZUhpbnQnKTtcbiAgICAgICAgICBmaWVsZC5wbGFjZWhvbGRlciA9IHRoaXMudCgnbmFtZVBsYWNlaG9sZGVyJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3Bob25lJzpcbiAgICAgICAgICBmaWVsZC5sYWJlbCA9IHRoaXMudCgncGhvbmUnKTtcbiAgICAgICAgICBmaWVsZC5oaW50ID0gdGhpcy50KCdwaG9uZUhpbnQnKTtcbiAgICAgICAgICBmaWVsZC5wbGFjZWhvbGRlciA9IHRoaXMudCgncGhvbmVQbGFjZWhvbGRlcicpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBidXR0b24gPSB0aGlzLmZvcm1NZXRhLmFjdGlvbnMgYXMgQnV0dG9uTWV0YWRhdGE7XG4gICAgYnV0dG9uLnRleHQgPSB0aGlzLnNhdmluZygpID8gdGhpcy50KCdzYXZpbmcnKSA6IHRoaXMudCgnc2F2ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhbGxiYWNrIFJFU1QuIENhcGEgNCAoVUkgZGVjbGFyYXRpdmEpOiBOTyB0b2FzdGVhbW9zIGFjw6Eg4oCUIGVsXG4gICAqIHZhbC1lbXB0eS1zdGF0ZSBFUyBsYSBVSSBkZWwgZXJyb3IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRGcm9tQXBpKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHAgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmF1dGguZ2V0UHJvZmlsZSgpKTtcbiAgICAgIHRoaXMucHJvZmlsZS5zZXQocCk7XG4gICAgICB0aGlzLmxvYWRFcnJvci5zZXQobnVsbCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvYWRFcnJvci5zZXQoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtYXBNaXJyb3JUb1Byb2ZpbGUoZG9jOiBVc2VyTWlycm9yRG9jKTogR2V0UHJvZmlsZVJlc3BvbnNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3BlcmF0aW9uSWQ6ICcnLFxuICAgICAgdXNlcklkOiBkb2MudXNlcklkLFxuICAgICAgZW1haWw6IGRvYy5lbWFpbCxcbiAgICAgIG5hbWU6IGRvYy5uYW1lID8/ICcnLFxuICAgICAgaGFuZGxlOiBkb2MuaGFuZGxlLFxuICAgICAgcGhvbmU6IGRvYy5waG9uZSxcbiAgICAgIGF2YXRhclVybDogZG9jLmF2YXRhclVybCxcbiAgICAgIGVtYWlsVmVyaWZpZWQ6IGZhbHNlLFxuICAgICAgcGhvbmVWZXJpZmllZDogZmFsc2UsXG4gICAgICBtZmFFbmFibGVkOiBmYWxzZSxcbiAgICAgIGNyZWF0ZWRBdDogJycsXG4gICAgICB1cGRhdGVkQXQ6ICcnLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBvblN1Ym1pdChldmVudDogRm9ybVN1Ym1pdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnNhdmluZygpKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5wcm9maWxlKCk7XG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm47XG5cbiAgICBjb25zdCBjZmcgPSB0aGlzLnJlc29sdmVkQ29uZmlnKCk7XG4gICAgY29uc3QgZmllbGRzID0gZXZlbnQuZmllbGRzIHx8IHt9O1xuICAgIGNvbnN0IG5leHRIYW5kbGUgPSBTdHJpbmcoZmllbGRzWydoYW5kbGUnXSB8fCAnJylcbiAgICAgIC50cmltKClcbiAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG5leHROYW1lID0gU3RyaW5nKGZpZWxkc1snbmFtZSddIHx8ICcnKS50cmltKCk7XG4gICAgY29uc3QgbmV4dFBob25lID0gU3RyaW5nKGZpZWxkc1sncGhvbmUnXSB8fCAnJykudHJpbSgpO1xuXG4gICAgY29uc3QgaGFuZGxlQ2hhbmdlZCA9IGNmZy5zaG93SGFuZGxlICYmICEhbmV4dEhhbmRsZSAmJiBuZXh0SGFuZGxlICE9PSAoY3VycmVudC5oYW5kbGUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgbmFtZUNoYW5nZWQgPSAhIW5leHROYW1lICYmIG5leHROYW1lICE9PSAoY3VycmVudC5uYW1lIHx8ICcnKTtcbiAgICBjb25zdCBwaG9uZUNoYW5nZWQgPSBjZmcuc2hvd1Bob25lICYmIG5leHRQaG9uZSAhPT0gKGN1cnJlbnQucGhvbmUgfHwgJycpO1xuXG4gICAgaWYgKCFoYW5kbGVDaGFuZ2VkICYmICFuYW1lQ2hhbmdlZCAmJiAhcGhvbmVDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnRvYXN0LnNob3coe1xuICAgICAgICBtZXNzYWdlOiB0aGlzLnQoJ3NhdmVTdWNjZXNzJyksXG4gICAgICAgIGR1cmF0aW9uOiAyMDAwLFxuICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICBwb3NpdGlvbjogJ3RvcCcsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNhdmluZy5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChoYW5kbGVDaGFuZ2VkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hdXRoLnVwZGF0ZUhhbmRsZShuZXh0SGFuZGxlKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRoaXMuZXJyb3JzLmhhbmRsZShlcnIsIHtcbiAgICAgICAgICAgIGNvbnRleHQ6ICdwcm9maWxlLnVwZGF0ZUhhbmRsZScsXG4gICAgICAgICAgICBpMThuTWFwOiB7IEFVVEhfVVNFUk5BTUVfRVhJU1RTOiAnaGFuZGxlSW5Vc2UnIH0sXG4gICAgICAgICAgICBmYWxsYmFja0tleTogJ2hhbmRsZUVycm9yJyxcbiAgICAgICAgICAgIGkxOG5OYW1lc3BhY2U6IHRoaXMubnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRnJvbUFwaSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmFtZUNoYW5nZWQgfHwgcGhvbmVDaGFuZ2VkKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IHsgbmFtZT86IHN0cmluZzsgcGhvbmU/OiBzdHJpbmcgfSA9IHt9O1xuICAgICAgICBpZiAobmFtZUNoYW5nZWQpIHBheWxvYWQubmFtZSA9IG5leHROYW1lO1xuICAgICAgICBpZiAocGhvbmVDaGFuZ2VkKSBwYXlsb2FkLnBob25lID0gbmV4dFBob25lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuYXV0aC51cGRhdGVQcm9maWxlKHBheWxvYWQpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5lcnJvcnMuaGFuZGxlKGVyciwge1xuICAgICAgICAgICAgY29udGV4dDogJ3Byb2ZpbGUudXBkYXRlUHJvZmlsZScsXG4gICAgICAgICAgICBpMThuTWFwOiB7XG4gICAgICAgICAgICAgIEFVVEhWMl9QSE9ORV9FWElTVFM6ICdwaG9uZUluVXNlJyxcbiAgICAgICAgICAgICAgQVVUSFYyX0lOVkFMSURfUEhPTkU6ICdwaG9uZUludmFsaWQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhbGxiYWNrS2V5OiAnc2F2ZUVycm9yJyxcbiAgICAgICAgICAgIGkxOG5OYW1lc3BhY2U6IHRoaXMubnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRnJvbUFwaSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnRvYXN0LnNob3coe1xuICAgICAgICBtZXNzYWdlOiB0aGlzLnQoJ3NhdmVTdWNjZXNzJyksXG4gICAgICAgIGR1cmF0aW9uOiAyNTAwLFxuICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICBwb3NpdGlvbjogJ3RvcCcsXG4gICAgICB9KTtcbiAgICAgIGNmZy5vblNhdmVkPy4odGhpcy5wcm9maWxlKCkgPz8gY3VycmVudCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc2F2aW5nLnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgb25BdmF0YXJVcGxvYWRlZChyZXN1bHQ6IEF2YXRhclVwbG9hZFJlc3VsdCk6IHZvaWQge1xuICAgIHRoaXMudG9hc3Quc2hvdyh7XG4gICAgICBtZXNzYWdlOiB0aGlzLnQoJ2F2YXRhclN1Y2Nlc3MnKSxcbiAgICAgIGR1cmF0aW9uOiAyNTAwLFxuICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICB9KTtcbiAgICB0aGlzLnJlc29sdmVkQ29uZmlnKCkub25BdmF0YXJVcGxvYWRlZD8uKHJlc3VsdCk7XG4gIH1cblxuICBvbkF2YXRhckVycm9yKF9lcnI6IEF2YXRhclVwbG9hZEVycm9yKTogdm9pZCB7XG4gICAgdGhpcy50b2FzdC5zaG93KHtcbiAgICAgIG1lc3NhZ2U6IHRoaXMudCgnYXZhdGFyRXJyb3InKSxcbiAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBMZWUgZGVsIG5hbWVzcGFjZSBjb25maWd1cmFkby4gKi9cbiAgcHJvdGVjdGVkIHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksIHRoaXMubnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsc0Zyb21OYW1lKG5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSkgcmV0dXJuICc/JztcbiAgICBjb25zdCBwYXJ0cyA9IG5hbWUudHJpbSgpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHJldHVybiAnPyc7XG4gICAgY29uc3QgZmlyc3QgPSBwYXJ0c1swXT8uWzBdID8/ICcnO1xuICAgIGNvbnN0IGxhc3QgPSBwYXJ0cy5sZW5ndGggPiAxID8gKHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdPy5bMF0gPz8gJycpIDogJyc7XG4gICAgcmV0dXJuIChmaXJzdCArIGxhc3QpLnRvVXBwZXJDYXNlKCkgfHwgJz8nO1xuICB9XG59XG4iXX0=
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZmlsZS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvcHJvZmlsZS12aWV3L3Byb2ZpbGUtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRXBGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUV4RCxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDO0FBRTdDOzs7Ozs7Ozs7O0dBVUc7QUFPSCxNQUFNLE9BQU8sb0JBQW9CO0lBWS9CO1FBWFEsUUFBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hDLFNBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0IsVUFBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUkxQyxPQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNsQyxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQXNCLENBQUM7WUFDMUYsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLGFBQWEsSUFBSSxTQUFTLENBQUMsYUFBYSxJQUFJLGlCQUFpQixDQUFDO1FBQ3BGLENBQUMsQ0FBQyxDQUFDO1FBR0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3JCLDRFQUE0RTtRQUM1RSxpRkFBaUY7UUFDakYsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQzsrR0FsQlUsb0JBQW9CO21HQUFwQixvQkFBb0IsMEdBRnJCLDZDQUE2Qyw0REFEN0MsdUJBQXVCOzs0RkFHdEIsb0JBQW9CO2tCQU5oQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztvQkFDbEMsUUFBUSxFQUFFLDZDQUE2QztpQkFDeEQ7d0RBTVUsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgY29tcHV0ZWQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9uYXZpZ2F0aW9uL25hdmlnYXRpb24uc2VydmljZSc7XG5cbmltcG9ydCB7IFByb2ZpbGVDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi9wcm9maWxlLWNvbnRlbnQuY29tcG9uZW50JztcbmltcG9ydCB7IFByb2ZpbGVWaWV3Q29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBQUk9GSUxFX1ZJRVdfSTE4TiB9IGZyb20gJy4vcHJvZmlsZS12aWV3LmkxOG4nO1xuXG5jb25zdCBERUZBVUxUX05BTUVTUEFDRSA9ICdTZXR0aW5ncy5Qcm9maWxlJztcblxuLyoqXG4gKiBgdmFsLXByb2ZpbGUtdmlld2Ag4oCUIHZpc3RhIFBlcmZpbCBydXRlYWRhIChvcmdhbmlzbSkuIFdyYXBwZXIgZGVsZ2FkbzpcbiAqIGNvbmZpZ3VyYSBlbCBoZWFkZXIgZGVsIHNoZWxsIChgTmF2aWdhdGlvblNlcnZpY2Uuc2V0QmFja0hlYWRlcmApIHkgZGVsZWdhIFRPRE9cbiAqIGVsIGNvbnRlbmlkby9sw7NnaWNhIGEgYHZhbC1wcm9maWxlLWNvbnRlbnRgLlxuICpcbiAqIEVsIGNvbnRlbmlkbyB2aXZlIGVuIGB2YWwtcHJvZmlsZS1jb250ZW50YCAoc2luIGNyb23DoXRpY2EgZGUgcMOhZ2luYSkgcGFyYSBwb2RlclxuICogcmV1dGlsaXphcnNlIHRhbWJpw6luIGRlc2RlIGB2YWwtcHJvZmlsZS1tb2RhbGAgc2luIGNvbnRhbWluYXIgZWwgaGVhZGVyLlxuICpcbiAqIENvbnN1bW86IGlndWFsIHF1ZSBhbnRlcyAocnV0YSB2w61hIGBwcm92aWRlVmFsdGVjaFByb2ZpbGVSb3V0ZXNgIG8gZW1iZWJpZGEgY29uXG4gKiBgW2NvbmZpZ11gKS4gTGEgY29uZmlnIHNlIHBhc2EgdGFsIGN1YWwgYWwgY29udGVuaWRvLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtcHJvZmlsZS12aWV3JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1Byb2ZpbGVDb250ZW50Q29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGAgPHZhbC1wcm9maWxlLWNvbnRlbnQgW2NvbmZpZ109XCJjb25maWdcIiAvPiBgLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9maWxlVmlld0NvbXBvbmVudCB7XG4gIHByaXZhdGUgbmF2ID0gaW5qZWN0KE5hdmlnYXRpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICBASW5wdXQoKSBjb25maWc/OiBQcm9maWxlVmlld0NvbmZpZztcblxuICBwcml2YXRlIHJlYWRvbmx5IG5zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGZyb21Sb3V0ZSA9ICh0aGlzLnJvdXRlPy5zbmFwc2hvdC5kYXRhWydwcm9maWxlQ29uZmlnJ10gPz8ge30pIGFzIFByb2ZpbGVWaWV3Q29uZmlnO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZz8uaTE4bk5hbWVzcGFjZSA/PyBmcm9tUm91dGUuaTE4bk5hbWVzcGFjZSA/PyBERUZBVUxUX05BTUVTUEFDRTtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3QgbnMgPSB0aGlzLm5zKCk7XG4gICAgLy8gRWwgaGVhZGVyIHVzYSBsYSBrZXkgJ3BhZ2VUaXRsZScgZGVsIG5hbWVzcGFjZTsgZWwgY29udGVuaWRvIHJlZ2lzdHJhIGxvc1xuICAgIC8vIGRlZmF1bHRzIGkxOG4sIHBlcm8gbG8gYXNlZ3VyYW1vcyB0YW1iacOpbiBhY8OhIHBvciBzaSBlbCBoZWFkZXIgcmVzdWVsdmUgYW50ZXMuXG4gICAgdGhpcy5pMThuLnJlZ2lzdGVyRGVmYXVsdHMobnMsIFBST0ZJTEVfVklFV19JMThOKTtcbiAgICB0aGlzLm5hdi5zZXRCYWNrSGVhZGVyKCdwYWdlVGl0bGUnLCBucywgeyB3aXRoTWVudTogdHJ1ZSB9KTtcbiAgfVxufVxuIl19