valtech-components 2.0.848 → 2.0.850
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/molecules/empty-state/empty-state.component.mjs +167 -0
- package/esm2022/lib/components/molecules/empty-state/factory.mjs +54 -0
- package/esm2022/lib/components/molecules/empty-state/types.mjs +2 -0
- package/esm2022/lib/components/organisms/mfa-modal/mfa-modal.component.mjs +19 -5
- package/esm2022/lib/components/organisms/wizard/wizard.component.mjs +9 -1
- package/esm2022/lib/services/i18n/default-content.mjs +3 -1
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +4 -1
- package/fesm2022/valtech-components.mjs +232 -6
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/molecules/empty-state/empty-state.component.d.ts +43 -0
- package/lib/components/molecules/empty-state/factory.d.ts +64 -0
- package/lib/components/molecules/empty-state/types.d.ts +58 -0
- package/lib/components/organisms/mfa-modal/mfa-modal.component.d.ts +4 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +3 -0
|
@@ -2,7 +2,7 @@ import { Component, computed, EventEmitter, inject, Input, Output, signal } from
|
|
|
2
2
|
import { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
3
3
|
import { IonButton, IonButtons, IonContent, IonHeader, IonIcon, IonInput, IonItem, IonLabel, IonModal, IonRadio, IonRadioGroup, IonSpinner, IonToolbar, } from '@ionic/angular/standalone';
|
|
4
4
|
import { addIcons } from 'ionicons';
|
|
5
|
-
import { informationCircleOutline } from 'ionicons/icons';
|
|
5
|
+
import { informationCircleOutline, copyOutline, checkmarkOutline } from 'ionicons/icons';
|
|
6
6
|
import { SolidDefaultBlock } from '../../atoms/button/factory';
|
|
7
7
|
import { DisplayComponent } from '../../atoms/display/display.component';
|
|
8
8
|
import { QrCodeComponent } from '../../atoms/qr-code/qr-code.component';
|
|
@@ -86,6 +86,8 @@ export class MfaModalComponent {
|
|
|
86
86
|
this.totpQr = signal(null);
|
|
87
87
|
/** Códigos de respaldo recién regenerados — se muestran una sola vez. */
|
|
88
88
|
this.regeneratedCodes = signal(null);
|
|
89
|
+
/** Marca momentánea cuando el secreto TOTP se acaba de copiar (feedback visual). */
|
|
90
|
+
this.copiedSecret = signal(false);
|
|
89
91
|
this.resendCooldown = signal(0);
|
|
90
92
|
this.pinControl = new FormControl('', [Validators.required, Validators.minLength(6), Validators.maxLength(6)]);
|
|
91
93
|
this.phoneControl = new FormControl('', [Validators.required, Validators.pattern(/^\+[1-9]\d{6,14}$/)]);
|
|
@@ -128,7 +130,7 @@ export class MfaModalComponent {
|
|
|
128
130
|
state: this.working() ? ComponentStates.WORKING : ComponentStates.ENABLED,
|
|
129
131
|
}));
|
|
130
132
|
this.resendTimer = null;
|
|
131
|
-
addIcons({ informationCircleOutline });
|
|
133
|
+
addIcons({ informationCircleOutline, copyOutline, checkmarkOutline });
|
|
132
134
|
}
|
|
133
135
|
ngOnDestroy() {
|
|
134
136
|
this.stopCooldown();
|
|
@@ -360,6 +362,18 @@ export class MfaModalComponent {
|
|
|
360
362
|
/* sin recurso de copia disponible */
|
|
361
363
|
}
|
|
362
364
|
}
|
|
365
|
+
/** Copia el secreto TOTP al portapapeles + feedback visual (check) durante 2s. */
|
|
366
|
+
async copySecret(secret) {
|
|
367
|
+
try {
|
|
368
|
+
await navigator.clipboard.writeText(secret);
|
|
369
|
+
this.copiedSecret.set(true);
|
|
370
|
+
this.showToast(this.t('mfaSecretCopied'));
|
|
371
|
+
setTimeout(() => this.copiedSecret.set(false), 2000);
|
|
372
|
+
}
|
|
373
|
+
catch {
|
|
374
|
+
/* sin recurso de copia disponible */
|
|
375
|
+
}
|
|
376
|
+
}
|
|
363
377
|
/** Etiqueta i18n legible para un método MFA. */
|
|
364
378
|
methodLabel(method) {
|
|
365
379
|
switch (method) {
|
|
@@ -432,7 +446,7 @@ export class MfaModalComponent {
|
|
|
432
446
|
this.toast.show({ message, duration: 3500 });
|
|
433
447
|
}
|
|
434
448
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MfaModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
435
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MfaModalComponent, isStandalone: true, selector: "val-mfa-modal", inputs: { isOpen: "isOpen", prefillCode: "prefillCode" }, outputs: { changed: "changed", dismissed: "dismissed" }, ngImport: i0, template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n\n <ion-content class=\"ion-padding\">\n <section class=\"mfa-modal\">\n <val-display [props]=\"{ content: t('mfaManageTitle'), size: 'small', color: 'dark' }\" />\n\n @switch (step()) { @case ('loading') {\n <div class=\"mfa-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @case ('status') { @if (mfaEnabled()) {\n <p class=\"mfa-status mfa-status--on\">{{ t('mfaEnabledLabel') }} \u00B7 {{ methodLabel(mfaMethod()) }}</p>\n\n @if (mfaMethod() === 'TOTP') {\n <div class=\"mfa-block\">\n <h3>{{ t('mfaBackupCodesTitle') }}</h3>\n <p class=\"mfa-text\">{{ t('mfaBackupCodesAvailable') }}: {{ backupCodesCount() }}</p>\n\n @if (regeneratedCodes(); as codes) {\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n </div>\n <div class=\"mfa-codes\">\n @for (code of codes; track code) {\n <code class=\"mfa-code\">{{ code }}</code>\n }\n </div>\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(codes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n } @else { @if (backupCodesCount() < 3) {\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesLow') }}</p>\n </div>\n }\n <ion-button\n expand=\"block\"\n color=\"dark\"\n fill=\"outline\"\n [disabled]=\"working()\"\n (click)=\"regenerateBackupCodes()\"\n >\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaRegenerateCodes') }} }\n </ion-button>\n }\n </div>\n }\n\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"goToDisable()\">\n {{ t('mfaDisableButton') }}\n </ion-button>\n } @else {\n <p class=\"mfa-status mfa-status--off\">{{ t('mfaDisabledLabel') }}</p>\n <p class=\"mfa-text\">{{ t('mfaDisabledHint') }}</p>\n <ion-button expand=\"block\" (click)=\"goToMethodSelect()\"> {{ t('mfaEnableButton') }} </ion-button>\n } } @case ('method-select') {\n <val-title [props]=\"{ content: t('mfaEnableTitle'), size: 'large', color: '', bold: false }\" />\n <p class=\"mfa-text\">{{ t('mfaMethodPrompt') }}</p>\n\n <ion-radio-group [value]=\"selectedMethod()\" (ionChange)=\"selectedMethod.set($event.detail.value)\">\n <ion-item>\n <ion-radio slot=\"start\" value=\"TOTP\"></ion-radio>\n <ion-label>\n <strong>{{ t('mfaMethodTotp') }}</strong>\n <p>{{ t('mfaMethodTotpHint') }}</p>\n </ion-label>\n </ion-item>\n <ion-item>\n <ion-radio slot=\"start\" value=\"EMAIL\"></ion-radio>\n <ion-label>\n <strong>{{ t('mfaMethodEmail') }}</strong>\n <p>{{ t('mfaMethodEmailHint') }}</p>\n </ion-label>\n </ion-item>\n <ion-item>\n <ion-radio slot=\"start\" value=\"SMS\"></ion-radio>\n <ion-label>\n <strong>{{ t('mfaMethodSms') }}</strong>\n <p>{{ t('mfaMethodSmsHint') }}</p>\n </ion-label>\n </ion-item>\n </ion-radio-group>\n\n @if (selectedMethod() === 'SMS' && !userPhone()) {\n <ion-input\n label=\"{{ t('mfaPhoneLabel') }}\"\n labelPlacement=\"floating\"\n fill=\"outline\"\n type=\"tel\"\n placeholder=\"+56912345678\"\n [formControl]=\"phoneControl\"\n ></ion-input>\n @if (phoneControl.invalid && phoneControl.touched) {\n <p class=\"mfa-error\">{{ t('mfaPhoneInvalid') }}</p>\n } } @if (selectedMethod() === 'SMS' && userPhone(); as phone) {\n <p class=\"mfa-text\">{{ t('mfaPhoneRegistered') }}: {{ phone }}</p>\n }\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"proceedWithMethod()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaContinue') }} }\n </ion-button>\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('totp-setup') {\n <val-title [props]=\"{ content: t('mfaTotpSetupTitle'), size: 'large', color: '', bold: false }\" />\n <p class=\"mfa-text\">{{ t('mfaTotpStep1') }}</p>\n\n @if (totpQr(); as qr) {\n <div class=\"mfa-qr\">\n <val-qr-code [props]=\"{ qr: qr }\" />\n </div>\n } @if (totpSetup(); as setup) {\n <p class=\"mfa-text\">{{ t('mfaTotpManualEntry') }}</p>\n <code class=\"mfa-secret\">{{ setup.secret }}</code>\n\n <p class=\"mfa-text\">{{ t('mfaTotpStep2') }}</p>\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"verifyTotp()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaTotpVerify') }} }\n </ion-button>\n\n <div class=\"mfa-backup\">\n <h3>{{ t('mfaBackupCodesTitle') }}</h3>\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n </div>\n <div class=\"mfa-codes\">\n @for (code of setup.backupCodes; track code) {\n <code class=\"mfa-code\">{{ code }}</code>\n }\n </div>\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(setup.backupCodes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n </div>\n }\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('code-confirm') {\n <val-title [props]=\"{ content: t('mfaConfirmTitle'), size: 'large', color: '', bold: false }\" />\n <p class=\"mfa-text\">\n {{ selectedMethod() === 'EMAIL' ? t('mfaConfirmPromptEmail') : t('mfaConfirmPromptSms') }}\n </p>\n\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"confirmCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaConfirmButton') }} }\n </ion-button>\n\n <p class=\"mfa-resend\">\n {{ t('mfaNoCode') }} @if (resendCooldown() > 0) {\n <span class=\"mfa-text\">{{ t('mfaResendIn') }} {{ resendCooldown() }}s</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('mfaResend') }}</a>\n }\n </p>\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('disable') {\n <val-form [props]=\"disableFormProps()\" (onSubmit)=\"onDisableSubmit($event)\" />\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".mfa-modal{display:flex;flex-direction:column;gap:14px;padding-top:4px}.mfa-loading{display:flex;justify-content:center;padding:40px 0}.mfa-status{font-weight:600;margin:0}.mfa-status--on{color:var(--ion-color-success-shade)}.mfa-status--off{color:var(--ion-color-dark)}.mfa-text{color:var(--ion-color-dark);font-size:14px;margin:0}.mfa-error{color:var(--ion-color-danger);font-size:13px;margin:4px 0 0}.mfa-block,.mfa-backup{display:flex;flex-direction:column;gap:12px}.mfa-block{padding:16px;border-radius:14px;background:var(--ion-color-light)}.mfa-block h3,.mfa-backup h3{font-size:15px;font-weight:600;margin:0;color:var(--ion-color-dark)}.mfa-alert{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border-radius:10px;background:var(--ion-color-light);border-left:3px solid var(--ion-color-primary)}.mfa-alert ion-icon{font-size:20px;color:var(--ion-color-primary);flex-shrink:0;margin-top:1px}.mfa-alert p{margin:0;font-size:13px;line-height:1.45;color:var(--ion-color-dark)}.mfa-qr{display:flex;justify-content:center;padding:8px 0}.mfa-secret{display:block;padding:10px 12px;border-radius:8px;background:var(--ion-color-light);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:15px;letter-spacing:.04em;word-break:break-all;text-align:center}.mfa-pin{display:flex;justify-content:center;padding:8px 0}.mfa-codes{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;padding:12px;border-radius:12px;background:var(--ion-color-light)}.mfa-code{padding:8px;border-radius:6px;background:var(--ion-background-color, #fff);color:var(--ion-color-dark);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;text-align:center}.mfa-resend{text-align:center;font-size:14px;color:var(--ion-color-dark);margin:4px 0}.mfa-resend a{color:var(--ion-color-primary);cursor:pointer;font-weight:600}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { 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: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "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: IonModal, selector: "ion-modal" }, { kind: "component", type: IonRadio, selector: "ion-radio", inputs: ["alignment", "color", "disabled", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonRadioGroup, selector: "ion-radio-group", inputs: ["allowEmptySelection", "compareWith", "errorText", "helperText", "name", "value"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: QrCodeComponent, selector: "val-qr-code", inputs: ["props"], outputs: ["actionComplete", "imageLoad", "imageError"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: PinInputComponent, selector: "val-pin-input", inputs: ["props"] }] }); }
|
|
449
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MfaModalComponent, isStandalone: true, selector: "val-mfa-modal", inputs: { isOpen: "isOpen", prefillCode: "prefillCode" }, outputs: { changed: "changed", dismissed: "dismissed" }, ngImport: i0, template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n\n <ion-content class=\"ion-padding\">\n <section class=\"mfa-modal\">\n <val-display [props]=\"{ content: t('mfaManageTitle'), size: 'small', color: 'dark' }\" />\n\n @switch (step()) { @case ('loading') {\n <div class=\"mfa-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @case ('status') { @if (mfaEnabled()) {\n <p class=\"mfa-status mfa-status--on\">{{ t('mfaEnabledLabel') }} \u00B7 {{ methodLabel(mfaMethod()) }}</p>\n\n @if (mfaMethod() === 'TOTP') {\n <div class=\"mfa-block\">\n <h3>{{ t('mfaBackupCodesTitle') }}</h3>\n <p class=\"mfa-text\">{{ t('mfaBackupCodesAvailable') }}: {{ backupCodesCount() }}</p>\n\n @if (regeneratedCodes(); as codes) {\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n </div>\n <div class=\"mfa-codes\">\n @for (code of codes; track code) {\n <code class=\"mfa-code\">{{ code }}</code>\n }\n </div>\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(codes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n } @else { @if (backupCodesCount() < 3) {\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesLow') }}</p>\n </div>\n }\n <ion-button\n expand=\"block\"\n color=\"dark\"\n fill=\"outline\"\n [disabled]=\"working()\"\n (click)=\"regenerateBackupCodes()\"\n >\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaRegenerateCodes') }} }\n </ion-button>\n }\n </div>\n }\n\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"goToDisable()\">\n {{ t('mfaDisableButton') }}\n </ion-button>\n } @else {\n <p class=\"mfa-status mfa-status--off\">{{ t('mfaDisabledLabel') }}</p>\n <p class=\"mfa-text\">{{ t('mfaDisabledHint') }}</p>\n <ion-button expand=\"block\" (click)=\"goToMethodSelect()\"> {{ t('mfaEnableButton') }} </ion-button>\n } } @case ('method-select') {\n <val-title [props]=\"{ content: t('mfaEnableTitle'), size: 'large', color: '', bold: false }\" />\n <p class=\"mfa-text\">{{ t('mfaMethodPrompt') }}</p>\n\n <ion-radio-group [value]=\"selectedMethod()\" (ionChange)=\"selectedMethod.set($event.detail.value)\">\n <ion-item>\n <ion-radio slot=\"start\" value=\"TOTP\"></ion-radio>\n <ion-label>\n <strong>{{ t('mfaMethodTotp') }}</strong>\n <p>{{ t('mfaMethodTotpHint') }}</p>\n </ion-label>\n </ion-item>\n <ion-item>\n <ion-radio slot=\"start\" value=\"EMAIL\"></ion-radio>\n <ion-label>\n <strong>{{ t('mfaMethodEmail') }}</strong>\n <p>{{ t('mfaMethodEmailHint') }}</p>\n </ion-label>\n </ion-item>\n <ion-item>\n <ion-radio slot=\"start\" value=\"SMS\"></ion-radio>\n <ion-label>\n <strong>{{ t('mfaMethodSms') }}</strong>\n <p>{{ t('mfaMethodSmsHint') }}</p>\n </ion-label>\n </ion-item>\n </ion-radio-group>\n\n @if (selectedMethod() === 'SMS' && !userPhone()) {\n <ion-input\n label=\"{{ t('mfaPhoneLabel') }}\"\n labelPlacement=\"floating\"\n fill=\"outline\"\n type=\"tel\"\n placeholder=\"+56912345678\"\n [formControl]=\"phoneControl\"\n ></ion-input>\n @if (phoneControl.invalid && phoneControl.touched) {\n <p class=\"mfa-error\">{{ t('mfaPhoneInvalid') }}</p>\n } } @if (selectedMethod() === 'SMS' && userPhone(); as phone) {\n <p class=\"mfa-text\">{{ t('mfaPhoneRegistered') }}: {{ phone }}</p>\n }\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"proceedWithMethod()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaContinue') }} }\n </ion-button>\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('totp-setup') {\n <val-title [props]=\"{ content: t('mfaTotpSetupTitle'), size: 'large', color: '', bold: false }\" />\n <p class=\"mfa-text\">{{ t('mfaTotpStep1') }}</p>\n\n @if (totpQr(); as qr) {\n <div class=\"mfa-qr\">\n <val-qr-code [props]=\"{ qr: qr }\" />\n </div>\n } @if (totpSetup(); as setup) {\n <p class=\"mfa-text\">{{ t('mfaTotpManualEntry') }}</p>\n <div class=\"mfa-secret-row\">\n <code class=\"mfa-secret\">{{ setup.secret }}</code>\n <ion-button fill=\"clear\" size=\"small\" (click)=\"copySecret(setup.secret)\" [attr.aria-label]=\"t('copy')\">\n @if (copiedSecret()) {\n <ion-icon name=\"checkmark-outline\"></ion-icon>\n } @else {\n <ion-icon name=\"copy-outline\"></ion-icon>\n }\n </ion-button>\n </div>\n\n <p class=\"mfa-text\">{{ t('mfaTotpStep2') }}</p>\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"verifyTotp()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaTotpVerify') }} }\n </ion-button>\n\n <div class=\"mfa-backup\">\n <h3>{{ t('mfaBackupCodesTitle') }}</h3>\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n </div>\n <div class=\"mfa-codes\">\n @for (code of setup.backupCodes; track code) {\n <code class=\"mfa-code\">{{ code }}</code>\n }\n </div>\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(setup.backupCodes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n </div>\n }\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('code-confirm') {\n <val-title [props]=\"{ content: t('mfaConfirmTitle'), size: 'large', color: '', bold: false }\" />\n <p class=\"mfa-text\">\n {{ selectedMethod() === 'EMAIL' ? t('mfaConfirmPromptEmail') : t('mfaConfirmPromptSms') }}\n </p>\n\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"confirmCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaConfirmButton') }} }\n </ion-button>\n\n <p class=\"mfa-resend\">\n {{ t('mfaNoCode') }} @if (resendCooldown() > 0) {\n <span class=\"mfa-text\">{{ t('mfaResendIn') }} {{ resendCooldown() }}s</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('mfaResend') }}</a>\n }\n </p>\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('disable') {\n <val-form [props]=\"disableFormProps()\" (onSubmit)=\"onDisableSubmit($event)\" />\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".mfa-modal{display:flex;flex-direction:column;gap:14px;padding-top:4px}.mfa-loading{display:flex;justify-content:center;padding:40px 0}.mfa-status{display:inline-flex;align-items:center;width:fit-content;padding:4px 10px;border-radius:999px;font-size:13px;font-weight:600;margin:0}.mfa-status--on{color:var(--ion-color-success-shade);background:rgba(var(--ion-color-success-rgb),.12)}.mfa-status--off{color:var(--ion-color-medium-shade);background:var(--ion-color-light)}.mfa-secret-row{display:flex;align-items:center;gap:8px}.mfa-secret-row .mfa-secret{flex:1;margin:0}.mfa-secret-row ion-button{flex-shrink:0;--color: var(--ion-color-dark);margin:0}.mfa-text{color:var(--ion-color-dark);font-size:14px;margin:0}.mfa-error{color:var(--ion-color-danger);font-size:13px;margin:4px 0 0}.mfa-block,.mfa-backup{display:flex;flex-direction:column;gap:12px}.mfa-block{padding:16px;border-radius:14px;background:var(--ion-color-light)}.mfa-block h3,.mfa-backup h3{font-size:15px;font-weight:600;margin:0;color:var(--ion-color-dark)}.mfa-alert{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border-radius:10px;background:var(--ion-color-light);border-left:3px solid var(--ion-color-primary)}.mfa-alert ion-icon{font-size:20px;color:var(--ion-color-primary);flex-shrink:0;margin-top:1px}.mfa-alert p{margin:0;font-size:13px;line-height:1.45;color:var(--ion-color-dark)}.mfa-qr{display:flex;justify-content:center;padding:8px 0}.mfa-secret{display:block;padding:10px 12px;border-radius:8px;background:var(--ion-color-light);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:15px;letter-spacing:.04em;word-break:break-all;text-align:center}.mfa-pin{display:flex;justify-content:center;padding:8px 0}.mfa-codes{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;padding:12px;border-radius:12px;background:var(--ion-color-light)}.mfa-code{padding:8px;border-radius:6px;background:var(--ion-background-color, #fff);color:var(--ion-color-dark);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;text-align:center}.mfa-resend{text-align:center;font-size:14px;color:var(--ion-color-dark);margin:4px 0}.mfa-resend a{color:var(--ion-color-primary);cursor:pointer;font-weight:600}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { 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: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "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: IonModal, selector: "ion-modal" }, { kind: "component", type: IonRadio, selector: "ion-radio", inputs: ["alignment", "color", "disabled", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonRadioGroup, selector: "ion-radio-group", inputs: ["allowEmptySelection", "compareWith", "errorText", "helperText", "name", "value"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: QrCodeComponent, selector: "val-qr-code", inputs: ["props"], outputs: ["actionComplete", "imageLoad", "imageError"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: PinInputComponent, selector: "val-pin-input", inputs: ["props"] }] }); }
|
|
436
450
|
}
|
|
437
451
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MfaModalComponent, decorators: [{
|
|
438
452
|
type: Component,
|
|
@@ -456,7 +470,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
456
470
|
QrCodeComponent,
|
|
457
471
|
TitleComponent,
|
|
458
472
|
PinInputComponent,
|
|
459
|
-
], template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n\n <ion-content class=\"ion-padding\">\n <section class=\"mfa-modal\">\n <val-display [props]=\"{ content: t('mfaManageTitle'), size: 'small', color: 'dark' }\" />\n\n @switch (step()) { @case ('loading') {\n <div class=\"mfa-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @case ('status') { @if (mfaEnabled()) {\n <p class=\"mfa-status mfa-status--on\">{{ t('mfaEnabledLabel') }} \u00B7 {{ methodLabel(mfaMethod()) }}</p>\n\n @if (mfaMethod() === 'TOTP') {\n <div class=\"mfa-block\">\n <h3>{{ t('mfaBackupCodesTitle') }}</h3>\n <p class=\"mfa-text\">{{ t('mfaBackupCodesAvailable') }}: {{ backupCodesCount() }}</p>\n\n @if (regeneratedCodes(); as codes) {\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n </div>\n <div class=\"mfa-codes\">\n @for (code of codes; track code) {\n <code class=\"mfa-code\">{{ code }}</code>\n }\n </div>\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(codes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n } @else { @if (backupCodesCount() < 3) {\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesLow') }}</p>\n </div>\n }\n <ion-button\n expand=\"block\"\n color=\"dark\"\n fill=\"outline\"\n [disabled]=\"working()\"\n (click)=\"regenerateBackupCodes()\"\n >\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaRegenerateCodes') }} }\n </ion-button>\n }\n </div>\n }\n\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"goToDisable()\">\n {{ t('mfaDisableButton') }}\n </ion-button>\n } @else {\n <p class=\"mfa-status mfa-status--off\">{{ t('mfaDisabledLabel') }}</p>\n <p class=\"mfa-text\">{{ t('mfaDisabledHint') }}</p>\n <ion-button expand=\"block\" (click)=\"goToMethodSelect()\"> {{ t('mfaEnableButton') }} </ion-button>\n } } @case ('method-select') {\n <val-title [props]=\"{ content: t('mfaEnableTitle'), size: 'large', color: '', bold: false }\" />\n <p class=\"mfa-text\">{{ t('mfaMethodPrompt') }}</p>\n\n <ion-radio-group [value]=\"selectedMethod()\" (ionChange)=\"selectedMethod.set($event.detail.value)\">\n <ion-item>\n <ion-radio slot=\"start\" value=\"TOTP\"></ion-radio>\n <ion-label>\n <strong>{{ t('mfaMethodTotp') }}</strong>\n <p>{{ t('mfaMethodTotpHint') }}</p>\n </ion-label>\n </ion-item>\n <ion-item>\n <ion-radio slot=\"start\" value=\"EMAIL\"></ion-radio>\n <ion-label>\n <strong>{{ t('mfaMethodEmail') }}</strong>\n <p>{{ t('mfaMethodEmailHint') }}</p>\n </ion-label>\n </ion-item>\n <ion-item>\n <ion-radio slot=\"start\" value=\"SMS\"></ion-radio>\n <ion-label>\n <strong>{{ t('mfaMethodSms') }}</strong>\n <p>{{ t('mfaMethodSmsHint') }}</p>\n </ion-label>\n </ion-item>\n </ion-radio-group>\n\n @if (selectedMethod() === 'SMS' && !userPhone()) {\n <ion-input\n label=\"{{ t('mfaPhoneLabel') }}\"\n labelPlacement=\"floating\"\n fill=\"outline\"\n type=\"tel\"\n placeholder=\"+56912345678\"\n [formControl]=\"phoneControl\"\n ></ion-input>\n @if (phoneControl.invalid && phoneControl.touched) {\n <p class=\"mfa-error\">{{ t('mfaPhoneInvalid') }}</p>\n } } @if (selectedMethod() === 'SMS' && userPhone(); as phone) {\n <p class=\"mfa-text\">{{ t('mfaPhoneRegistered') }}: {{ phone }}</p>\n }\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"proceedWithMethod()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaContinue') }} }\n </ion-button>\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('totp-setup') {\n <val-title [props]=\"{ content: t('mfaTotpSetupTitle'), size: 'large', color: '', bold: false }\" />\n <p class=\"mfa-text\">{{ t('mfaTotpStep1') }}</p>\n\n @if (totpQr(); as qr) {\n <div class=\"mfa-qr\">\n <val-qr-code [props]=\"{ qr: qr }\" />\n </div>\n } @if (totpSetup(); as setup) {\n <p class=\"mfa-text\">{{ t('mfaTotpManualEntry') }}</p>\n <code class=\"mfa-secret\">{{ setup.secret }}</code>\n\n <p class=\"mfa-text\">{{ t('mfaTotpStep2') }}</p>\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"verifyTotp()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaTotpVerify') }} }\n </ion-button>\n\n <div class=\"mfa-backup\">\n <h3>{{ t('mfaBackupCodesTitle') }}</h3>\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n </div>\n <div class=\"mfa-codes\">\n @for (code of setup.backupCodes; track code) {\n <code class=\"mfa-code\">{{ code }}</code>\n }\n </div>\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(setup.backupCodes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n </div>\n }\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('code-confirm') {\n <val-title [props]=\"{ content: t('mfaConfirmTitle'), size: 'large', color: '', bold: false }\" />\n <p class=\"mfa-text\">\n {{ selectedMethod() === 'EMAIL' ? t('mfaConfirmPromptEmail') : t('mfaConfirmPromptSms') }}\n </p>\n\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"confirmCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaConfirmButton') }} }\n </ion-button>\n\n <p class=\"mfa-resend\">\n {{ t('mfaNoCode') }} @if (resendCooldown() > 0) {\n <span class=\"mfa-text\">{{ t('mfaResendIn') }} {{ resendCooldown() }}s</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('mfaResend') }}</a>\n }\n </p>\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('disable') {\n <val-form [props]=\"disableFormProps()\" (onSubmit)=\"onDisableSubmit($event)\" />\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".mfa-modal{display:flex;flex-direction:column;gap:14px;padding-top:4px}.mfa-loading{display:flex;justify-content:center;padding:40px 0}.mfa-status{font-weight:600;margin:0}.mfa-status--on{color:var(--ion-color-success-shade)}.mfa-status--off{color:var(--ion-color-dark)}.mfa-text{color:var(--ion-color-dark);font-size:14px;margin:0}.mfa-error{color:var(--ion-color-danger);font-size:13px;margin:4px 0 0}.mfa-block,.mfa-backup{display:flex;flex-direction:column;gap:12px}.mfa-block{padding:16px;border-radius:14px;background:var(--ion-color-light)}.mfa-block h3,.mfa-backup h3{font-size:15px;font-weight:600;margin:0;color:var(--ion-color-dark)}.mfa-alert{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border-radius:10px;background:var(--ion-color-light);border-left:3px solid var(--ion-color-primary)}.mfa-alert ion-icon{font-size:20px;color:var(--ion-color-primary);flex-shrink:0;margin-top:1px}.mfa-alert p{margin:0;font-size:13px;line-height:1.45;color:var(--ion-color-dark)}.mfa-qr{display:flex;justify-content:center;padding:8px 0}.mfa-secret{display:block;padding:10px 12px;border-radius:8px;background:var(--ion-color-light);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:15px;letter-spacing:.04em;word-break:break-all;text-align:center}.mfa-pin{display:flex;justify-content:center;padding:8px 0}.mfa-codes{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;padding:12px;border-radius:12px;background:var(--ion-color-light)}.mfa-code{padding:8px;border-radius:6px;background:var(--ion-background-color, #fff);color:var(--ion-color-dark);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;text-align:center}.mfa-resend{text-align:center;font-size:14px;color:var(--ion-color-dark);margin:4px 0}.mfa-resend a{color:var(--ion-color-primary);cursor:pointer;font-weight:600}\n"] }]
|
|
473
|
+
], template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n\n <ion-content class=\"ion-padding\">\n <section class=\"mfa-modal\">\n <val-display [props]=\"{ content: t('mfaManageTitle'), size: 'small', color: 'dark' }\" />\n\n @switch (step()) { @case ('loading') {\n <div class=\"mfa-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @case ('status') { @if (mfaEnabled()) {\n <p class=\"mfa-status mfa-status--on\">{{ t('mfaEnabledLabel') }} \u00B7 {{ methodLabel(mfaMethod()) }}</p>\n\n @if (mfaMethod() === 'TOTP') {\n <div class=\"mfa-block\">\n <h3>{{ t('mfaBackupCodesTitle') }}</h3>\n <p class=\"mfa-text\">{{ t('mfaBackupCodesAvailable') }}: {{ backupCodesCount() }}</p>\n\n @if (regeneratedCodes(); as codes) {\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n </div>\n <div class=\"mfa-codes\">\n @for (code of codes; track code) {\n <code class=\"mfa-code\">{{ code }}</code>\n }\n </div>\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(codes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n } @else { @if (backupCodesCount() < 3) {\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesLow') }}</p>\n </div>\n }\n <ion-button\n expand=\"block\"\n color=\"dark\"\n fill=\"outline\"\n [disabled]=\"working()\"\n (click)=\"regenerateBackupCodes()\"\n >\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaRegenerateCodes') }} }\n </ion-button>\n }\n </div>\n }\n\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"goToDisable()\">\n {{ t('mfaDisableButton') }}\n </ion-button>\n } @else {\n <p class=\"mfa-status mfa-status--off\">{{ t('mfaDisabledLabel') }}</p>\n <p class=\"mfa-text\">{{ t('mfaDisabledHint') }}</p>\n <ion-button expand=\"block\" (click)=\"goToMethodSelect()\"> {{ t('mfaEnableButton') }} </ion-button>\n } } @case ('method-select') {\n <val-title [props]=\"{ content: t('mfaEnableTitle'), size: 'large', color: '', bold: false }\" />\n <p class=\"mfa-text\">{{ t('mfaMethodPrompt') }}</p>\n\n <ion-radio-group [value]=\"selectedMethod()\" (ionChange)=\"selectedMethod.set($event.detail.value)\">\n <ion-item>\n <ion-radio slot=\"start\" value=\"TOTP\"></ion-radio>\n <ion-label>\n <strong>{{ t('mfaMethodTotp') }}</strong>\n <p>{{ t('mfaMethodTotpHint') }}</p>\n </ion-label>\n </ion-item>\n <ion-item>\n <ion-radio slot=\"start\" value=\"EMAIL\"></ion-radio>\n <ion-label>\n <strong>{{ t('mfaMethodEmail') }}</strong>\n <p>{{ t('mfaMethodEmailHint') }}</p>\n </ion-label>\n </ion-item>\n <ion-item>\n <ion-radio slot=\"start\" value=\"SMS\"></ion-radio>\n <ion-label>\n <strong>{{ t('mfaMethodSms') }}</strong>\n <p>{{ t('mfaMethodSmsHint') }}</p>\n </ion-label>\n </ion-item>\n </ion-radio-group>\n\n @if (selectedMethod() === 'SMS' && !userPhone()) {\n <ion-input\n label=\"{{ t('mfaPhoneLabel') }}\"\n labelPlacement=\"floating\"\n fill=\"outline\"\n type=\"tel\"\n placeholder=\"+56912345678\"\n [formControl]=\"phoneControl\"\n ></ion-input>\n @if (phoneControl.invalid && phoneControl.touched) {\n <p class=\"mfa-error\">{{ t('mfaPhoneInvalid') }}</p>\n } } @if (selectedMethod() === 'SMS' && userPhone(); as phone) {\n <p class=\"mfa-text\">{{ t('mfaPhoneRegistered') }}: {{ phone }}</p>\n }\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"proceedWithMethod()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaContinue') }} }\n </ion-button>\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('totp-setup') {\n <val-title [props]=\"{ content: t('mfaTotpSetupTitle'), size: 'large', color: '', bold: false }\" />\n <p class=\"mfa-text\">{{ t('mfaTotpStep1') }}</p>\n\n @if (totpQr(); as qr) {\n <div class=\"mfa-qr\">\n <val-qr-code [props]=\"{ qr: qr }\" />\n </div>\n } @if (totpSetup(); as setup) {\n <p class=\"mfa-text\">{{ t('mfaTotpManualEntry') }}</p>\n <div class=\"mfa-secret-row\">\n <code class=\"mfa-secret\">{{ setup.secret }}</code>\n <ion-button fill=\"clear\" size=\"small\" (click)=\"copySecret(setup.secret)\" [attr.aria-label]=\"t('copy')\">\n @if (copiedSecret()) {\n <ion-icon name=\"checkmark-outline\"></ion-icon>\n } @else {\n <ion-icon name=\"copy-outline\"></ion-icon>\n }\n </ion-button>\n </div>\n\n <p class=\"mfa-text\">{{ t('mfaTotpStep2') }}</p>\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"verifyTotp()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaTotpVerify') }} }\n </ion-button>\n\n <div class=\"mfa-backup\">\n <h3>{{ t('mfaBackupCodesTitle') }}</h3>\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n </div>\n <div class=\"mfa-codes\">\n @for (code of setup.backupCodes; track code) {\n <code class=\"mfa-code\">{{ code }}</code>\n }\n </div>\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(setup.backupCodes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n </div>\n }\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('code-confirm') {\n <val-title [props]=\"{ content: t('mfaConfirmTitle'), size: 'large', color: '', bold: false }\" />\n <p class=\"mfa-text\">\n {{ selectedMethod() === 'EMAIL' ? t('mfaConfirmPromptEmail') : t('mfaConfirmPromptSms') }}\n </p>\n\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"confirmCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaConfirmButton') }} }\n </ion-button>\n\n <p class=\"mfa-resend\">\n {{ t('mfaNoCode') }} @if (resendCooldown() > 0) {\n <span class=\"mfa-text\">{{ t('mfaResendIn') }} {{ resendCooldown() }}s</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('mfaResend') }}</a>\n }\n </p>\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('disable') {\n <val-form [props]=\"disableFormProps()\" (onSubmit)=\"onDisableSubmit($event)\" />\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".mfa-modal{display:flex;flex-direction:column;gap:14px;padding-top:4px}.mfa-loading{display:flex;justify-content:center;padding:40px 0}.mfa-status{display:inline-flex;align-items:center;width:fit-content;padding:4px 10px;border-radius:999px;font-size:13px;font-weight:600;margin:0}.mfa-status--on{color:var(--ion-color-success-shade);background:rgba(var(--ion-color-success-rgb),.12)}.mfa-status--off{color:var(--ion-color-medium-shade);background:var(--ion-color-light)}.mfa-secret-row{display:flex;align-items:center;gap:8px}.mfa-secret-row .mfa-secret{flex:1;margin:0}.mfa-secret-row ion-button{flex-shrink:0;--color: var(--ion-color-dark);margin:0}.mfa-text{color:var(--ion-color-dark);font-size:14px;margin:0}.mfa-error{color:var(--ion-color-danger);font-size:13px;margin:4px 0 0}.mfa-block,.mfa-backup{display:flex;flex-direction:column;gap:12px}.mfa-block{padding:16px;border-radius:14px;background:var(--ion-color-light)}.mfa-block h3,.mfa-backup h3{font-size:15px;font-weight:600;margin:0;color:var(--ion-color-dark)}.mfa-alert{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border-radius:10px;background:var(--ion-color-light);border-left:3px solid var(--ion-color-primary)}.mfa-alert ion-icon{font-size:20px;color:var(--ion-color-primary);flex-shrink:0;margin-top:1px}.mfa-alert p{margin:0;font-size:13px;line-height:1.45;color:var(--ion-color-dark)}.mfa-qr{display:flex;justify-content:center;padding:8px 0}.mfa-secret{display:block;padding:10px 12px;border-radius:8px;background:var(--ion-color-light);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:15px;letter-spacing:.04em;word-break:break-all;text-align:center}.mfa-pin{display:flex;justify-content:center;padding:8px 0}.mfa-codes{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;padding:12px;border-radius:12px;background:var(--ion-color-light)}.mfa-code{padding:8px;border-radius:6px;background:var(--ion-background-color, #fff);color:var(--ion-color-dark);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;text-align:center}.mfa-resend{text-align:center;font-size:14px;color:var(--ion-color-dark);margin:4px 0}.mfa-resend a{color:var(--ion-color-primary);cursor:pointer;font-weight:600}\n"] }]
|
|
460
474
|
}], ctorParameters: () => [], propDecorators: { isOpen: [{
|
|
461
475
|
type: Input
|
|
462
476
|
}], prefillCode: [{
|
|
@@ -466,4 +480,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
466
480
|
}], dismissed: [{
|
|
467
481
|
type: Output
|
|
468
482
|
}] } });
|
|
469
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWZhLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvbWZhLW1vZGFsL21mYS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL21mYS1tb2RhbC9tZmEtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixTQUFTLEVBQ1QsT0FBTyxFQUNQLFFBQVEsRUFDUixPQUFPLEVBQ1AsUUFBUSxFQUNSLFFBQVEsRUFDUixRQUFRLEVBQ1IsYUFBYSxFQUNiLFVBQVUsRUFDVixVQUFVLEdBQ1gsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTFELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0NBQStDLENB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d0JBQ1QsVUFBVTt3QkFDVixVQUFVO3dCQUNWLFNBQVM7d0JBQ1QsT0FBTzt3QkFDUCxRQUFRO3dCQUNSLE9BQU87d0JBQ1AsUUFBUTt3QkFDUixRQUFRO3dCQUNSLFFBQVE7d0JBQ1IsYUFBYTt3QkFDYixVQUFVO3dCQUNWLFVBQVU7d0JBQ1YsZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsY0FBYzt3QkFDZCxpQkFBaUI7cUJBQ2xCO3dEQVNHLE1BQU07c0JBRFQsS0FBSztnQkFpQkcsV0FBVztzQkFBbkIsS0FBSztnQkFHSSxPQUFPO3NCQUFoQixNQUFNO2dCQUdHLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgSW9uQnV0dG9uLFxuICBJb25CdXR0b25zLFxuICBJb25Db250ZW50LFxuICBJb25IZWFkZXIsXG4gIElvbkljb24sXG4gIElvbklucHV0LFxuICBJb25JdGVtLFxuICBJb25MYWJlbCxcbiAgSW9uTW9kYWwsXG4gIElvblJhZGlvLFxuICBJb25SYWRpb0dyb3VwLFxuICBJb25TcGlubmVyLFxuICBJb25Ub29sYmFyLFxufSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuaW1wb3J0IHsgaW5mb3JtYXRpb25DaXJjbGVPdXRsaW5lIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuXG5pbXBvcnQgeyBTb2xpZERlZmF1bHRCbG9jayB9IGZyb20gJy4uLy4uL2F0b21zL2J1dHRvbi9mYWN0b3J5JztcbmltcG9ydCB7IERpc3BsYXlDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9kaXNwbGF5L2Rpc3BsYXkuY29tcG9uZW50JztcbmltcG9ydCB7IFFyQ29kZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL3FyLWNvZGUvcXItY29kZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGl0bGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90aXRsZS90aXRsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGluSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvcGluLWlucHV0L3Bpbi1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50U3RhdGVzLCBGb3JtTWV0YWRhdGEsIEZvcm1TdWJtaXQsIElucHV0VHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9mb3JtL2Zvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aCc7XG5pbXBvcnQgeyBNRkFNZXRob2QsIFRPVFBTZXR1cFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aC90eXBlcyc7XG5pbXBvcnQgeyBJMThuU2VydmljZSwgSW5wdXRJMThuSGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBRckdlbmVyYXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9xci1nZW5lcmF0b3IvcXItZ2VuZXJhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgUXJSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9xci1nZW5lcmF0b3IvdHlwZXMnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdG9hc3Quc2VydmljZSc7XG5cbi8qKiBQYXNvIGRlbCBmbHVqbyBkZWwgbW9kYWwuICovXG50eXBlIE1mYVN0ZXAgPSAnbG9hZGluZycgfCAnc3RhdHVzJyB8ICdtZXRob2Qtc2VsZWN0JyB8ICd0b3RwLXNldHVwJyB8ICdjb2RlLWNvbmZpcm0nIHwgJ2Rpc2FibGUnO1xuXG4vKiogU2VndW5kb3MgZGUgZXNwZXJhIGFudGVzIGRlIHBvZGVyIHJlZW52aWFyIGVsIGPDs2RpZ28gRU1BSUwvU01TLiAqL1xuY29uc3QgUkVTRU5EX0NPT0xET1dOX1NFQ09ORFMgPSAzMDtcblxuLyoqXG4gKiBgdmFsLW1mYS1tb2RhbGAg4oCUIG1vZGFsIGRlIGdlc3Rpw7NuIGRlIGF1dGVudGljYWNpw7NuIGRlIGRvcyBmYWN0b3JlcyAoTUZBKVxuICogcGFyYSB1biB1c3VhcmlvIGF1dGVudGljYWRvLiBNaXNtbyBwYXRyw7NuIHF1ZSBgdmFsLWNoYW5nZS1wYXNzd29yZC1tb2RhbGAuXG4gKlxuICogRmx1am8gKG3DoXF1aW5hIGRlIGVzdGFkb3MgaW50ZXJuYSk6XG4gKiAgLSBgbG9hZGluZ2Ag4oaSIGBnZXRQcm9maWxlKClgIHBhcmEgY29ub2NlciBlbCBlc3RhZG8gTUZBLlxuICogIC0gYHN0YXR1c2Ag4oaSIG11ZXN0cmEgTUZBIGhhYmlsaXRhZG8vZGVzaGFiaWxpdGFkby4gU2kgZXN0w6EgaGFiaWxpdGFkbzpcbiAqICAgIGdlc3Rpw7NuIGRlIGJhY2t1cCBjb2RlcyAoVE9UUCkgKyBkZXNoYWJpbGl0YXIuIFNpIG5vOiBib3TDs24gaGFiaWxpdGFyLlxuICogIC0gYG1ldGhvZC1zZWxlY3RgIOKGkiBlbGVnaXIgVE9UUCAvIEVNQUlMIC8gU01TLlxuICogIC0gYHRvdHAtc2V0dXBgIOKGkiBRUiArIHNlY3JldG8gbWFudWFsICsgYmFja3VwIGNvZGVzIOKGkiB2ZXJpZmljYXIgY8OzZGlnby5cbiAqICAtIGBjb2RlLWNvbmZpcm1gIOKGkiAoRU1BSUwvU01TKSBpbmdyZXNhciBjw7NkaWdvIHJlY2liaWRvLCBjb24gcmVlbnbDrW8uXG4gKiAgLSBgZGlzYWJsZWAg4oaSIGNvbnRyYXNlw7FhIHBhcmEgZGVzaGFiaWxpdGFyIE1GQS5cbiAqXG4gKiBFbCBRUiBzZSBnZW5lcmEgKipjbGllbnQtc2lkZSoqIChgUXJHZW5lcmF0b3JTZXJ2aWNlYCkg4oCUIGVsIHNlY3JldG8gVE9UUFxuICogbnVuY2Egc2FsZSBkZWwgbmF2ZWdhZG9yLlxuICpcbiAqIFNlbGYtY29udGFpbmVkOiBpbnllY3RhIGBBdXRoU2VydmljZWAgeSBsbGFtYSBsb3MgZW5kcG9pbnRzIGRpcmVjdG8uIExhIGFwcFxuICogY29udHJvbGEgYFtpc09wZW5dYCB5IHJlYWNjaW9uYSBhIGAoY2hhbmdlZClgIC8gYChkaXNtaXNzZWQpYC5cbiAqXG4gKiBpMThuOiBuYW1lc3BhY2UgY29tcGFydGlkbyBgX2F1dGhgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8dmFsLW1mYS1tb2RhbFxuICogICBbaXNPcGVuXT1cImlzTW9kYWxPcGVuKClcIlxuICogICAoZGlzbWlzc2VkKT1cImlzTW9kYWxPcGVuLnNldChmYWxzZSlcIlxuICogLz5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtbWZhLW1vZGFsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgSW9uQnV0dG9uLFxuICAgIElvbkJ1dHRvbnMsXG4gICAgSW9uQ29udGVudCxcbiAgICBJb25IZWFkZXIsXG4gICAgSW9uSWNvbixcbiAgICBJb25JbnB1dCxcbiAgICBJb25JdGVtLFxuICAgIElvbkxhYmVsLFxuICAgIElvbk1vZGFsLFxuICAgIElvblJhZGlvLFxuICAgIElvblJhZGlvR3JvdXAsXG4gICAgSW9uU3Bpbm5lcixcbiAgICBJb25Ub29sYmFyLFxuICAgIERpc3BsYXlDb21wb25lbnQsXG4gICAgRm9ybUNvbXBvbmVudCxcbiAgICBRckNvZGVDb21wb25lbnQsXG4gICAgVGl0bGVDb21wb25lbnQsXG4gICAgUGluSW5wdXRDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9tZmEtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tZmEtbW9kYWwuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTWZhTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcblxuICAvKiogQ29udHJvbGEgbGEgdmlzaWJpbGlkYWQuIENhZGEgYXBlcnR1cmEgcmUtcmVzdWVsdmUgZWwgZXN0YWRvIE1GQS4gKi9cbiAgQElucHV0KClcbiAgc2V0IGlzT3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IG9wZW5pbmcgPSB2YWx1ZSAmJiAhdGhpcy5faXNPcGVuO1xuICAgIHRoaXMuX2lzT3BlbiA9IHZhbHVlO1xuICAgIGlmIChvcGVuaW5nKSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNPcGVuO1xuICB9XG5cbiAgLyoqXG4gICAqIEPDs2RpZ28gTUZBIHByZS1jYXJnYWRvIChkZWVwLWxpbmsgZGVzZGUgZWwgZW1haWwgZGUgc2V0dXAgTUZBLWVtYWlsKS4gU2lcbiAgICogZXN0w6EgcHJlc2VudGUgYWwgYWJyaXIsIGVsIG1vZGFsIHNhbHRhIGRpcmVjdG8gYWwgcGFzbyBkZSBjb25maXJtYWNpw7NuXG4gICAqIGNvbiBlbCBjw7NkaWdvIHJlbGxlbmFkby5cbiAgICovXG4gIEBJbnB1dCgpIHByZWZpbGxDb2RlPzogc3RyaW5nO1xuXG4gIC8qKiBFbWl0ZSBjdWFuZG8gZWwgZXN0YWRvIE1GQSBjYW1iaWEgKGhhYmlsaXRhZG8gLyBkZXNoYWJpbGl0YWRvKS4gKi9cbiAgQE91dHB1dCgpIGNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXRlIGN1YW5kbyBlbCB1c2VyIGNpZXJyYSBlbCBtb2RhbCAoYm90w7NuIFggbyBiYWNrZHJvcCkuICovXG4gIEBPdXRwdXQoKSBkaXNtaXNzZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0b2FzdCA9IGluamVjdChUb2FzdFNlcnZpY2UpO1xuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIGkxOG5IZWxwZXIgPSBpbmplY3QoSW5wdXRJMThuSGVscGVyKTtcbiAgcHJpdmF0ZSBxckdlbiA9IGluamVjdChRckdlbmVyYXRvclNlcnZpY2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0ZXAgPSBzaWduYWw8TWZhU3RlcD4oJ2xvYWRpbmcnKTtcbiAgLyoqIFBhc28gYWN0dWFsIGRlbCBmbHVqby4gKi9cbiAgcmVhZG9ubHkgc3RlcCA9IHRoaXMuX3N0ZXAuYXNSZWFkb25seSgpO1xuXG4gIC8qKiBgdHJ1ZWAgbWllbnRyYXMgdW5hIGxsYW1hZGEgYWwgYmFja2VuZCBlc3TDoSBlbiBjdXJzby4gKi9cbiAgcmVhZG9ubHkgd29ya2luZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gRXN0YWRvIE1GQSBhY3R1YWwuXG4gIHJlYWRvbmx5IG1mYUVuYWJsZWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBtZmFNZXRob2QgPSBzaWduYWw8TUZBTWV0aG9kIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHVzZXJQaG9uZSA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgYmFja3VwQ29kZXNDb3VudCA9IHNpZ25hbCgwKTtcblxuICAvLyBFc3RhZG8gZGVsIGZsdWpvIGRlIGhhYmlsaXRhY2nDs24uXG4gIHJlYWRvbmx5IHNlbGVjdGVkTWV0aG9kID0gc2lnbmFsPE1GQU1ldGhvZD4oJ1RPVFAnKTtcbiAgcmVhZG9ubHkgdG90cFNldHVwID0gc2lnbmFsPFRPVFBTZXR1cFJlc3BvbnNlIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHRvdHBRciA9IHNpZ25hbDxRclJlc3VsdCB8IG51bGw+KG51bGwpO1xuICAvKiogQ8OzZGlnb3MgZGUgcmVzcGFsZG8gcmVjacOpbiByZWdlbmVyYWRvcyDigJQgc2UgbXVlc3RyYW4gdW5hIHNvbGEgdmV6LiAqL1xuICByZWFkb25seSByZWdlbmVyYXRlZENvZGVzID0gc2lnbmFsPHN0cmluZ1tdIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHJlc2VuZENvb2xkb3duID0gc2lnbmFsKDApO1xuXG4gIHJlYWRvbmx5IHBpbkNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCg2KSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNildKTtcbiAgcmVhZG9ubHkgcGhvbmVDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5wYXR0ZXJuKC9eXFwrWzEtOV1cXGR7NiwxNH0kLyldKTtcblxuICByZWFkb25seSBwaW5JbnB1dFByb3BzID0ge1xuICAgIGNvbnRyb2w6IHRoaXMucGluQ29udHJvbCxcbiAgICB0b2tlbjogJ21mYS1jb2RlJyxcbiAgICBsZW5ndGg6IDYsXG4gICAgYWxsb3dOdW1iZXJzT25seTogdHJ1ZSxcbiAgICBhdXRvRm9jdXM6IHRydWUsXG4gIH07XG5cbiAgLyoqIEZvcm0gZGUgZGVzaGFiaWxpdGFjacOzbiDigJQgYHZhbC1mb3JtYCBjb24gdW4gY2FtcG8gZGUgY29udHJhc2XDsWEuICovXG4gIHJlYWRvbmx5IGRpc2FibGVGb3JtUHJvcHMgPSBjb21wdXRlZDxGb3JtTWV0YWRhdGE+KCgpID0+XG4gICAgdGhpcy5pMThuSGVscGVyLnJlc29sdmVGb3JtKHtcbiAgICAgIG5hbWVLZXk6ICdtZmFEaXNhYmxlVGl0bGUnLFxuICAgICAgaTE4bk5hbWVzcGFjZTogJ19hdXRoJyxcbiAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiB0aGlzLnQoJ21mYURpc2FibGVQcm9tcHQnKSxcbiAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogSW5wdXRUeXBlLlBBU1NXT1JELFxuICAgICAgICAgICAgICBuYW1lOiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgICB0b2tlbjogJ21mYS1kaXNhYmxlLXBhc3N3b3JkJyxcbiAgICAgICAgICAgICAgbGFiZWxLZXk6ICdtZmFQYXNzd29yZExhYmVsJyxcbiAgICAgICAgICAgICAgaGludDogJycsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyS2V5OiAncGFzc3dvcmRQbGFjZWhvbGRlcicsXG4gICAgICAgICAgICAgIGVycm9yS2V5czogeyByZXF1aXJlZDogJ21mYVBhc3N3b3JkUmVxdWlyZWQnIH0sXG4gICAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgICAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBhY3Rpb25zOiB7XG4gICAgICAgIC4uLlNvbGlkRGVmYXVsdEJsb2NrKCcnLCAnc3VibWl0JyksXG4gICAgICAgIHRva2VuOiAnbWZhLWRpc2FibGUtc3VibWl0JyxcbiAgICAgICAgdGV4dEtleTogJ21mYURpc2FibGVCdXR0b24nLFxuICAgICAgfSxcbiAgICAgIHN0YXRlOiB0aGlzLndvcmtpbmcoKSA/IENvbXBvbmVudFN0YXRlcy5XT1JLSU5HIDogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgfSlcbiAgKTtcblxuICBwcml2YXRlIHJlc2VuZFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBhZGRJY29ucyh7IGluZm9ybWF0aW9uQ2lyY2xlT3V0bGluZSB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcENvb2xkb3duKCk7XG4gIH1cblxuICAvKiogVHJhZHVjZSB1bmEgY2xhdmUgZGVsIG5hbWVzcGFjZSBgX2F1dGhgLiAqL1xuICB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCAnX2F1dGgnKTtcbiAgfVxuXG4gIC8qKiBDaWVycmUgaW5pY2lhZG8gcG9yIGVsIHVzZXIgKFggLyBiYWNrZHJvcCkuICovXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzbWlzc2VkLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdW50byBkZSBlbnRyYWRhIGFsIGFicmlyIGVsIG1vZGFsLiBDb24gYHByZWZpbGxDb2RlYCAoZGVlcC1saW5rIGRlbCBlbWFpbFxuICAgKiBkZSBzZXR1cCBNRkEtZW1haWwpIHNhbHRhIGRpcmVjdG8gYSBsYSBjb25maXJtYWNpw7NuOyBzaSBubywgcmVzdWVsdmUgZWxcbiAgICogZXN0YWRvIE1GQSBhY3R1YWwuXG4gICAqL1xuICBwcml2YXRlIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlZmlsbENvZGUpIHtcbiAgICAgIHRoaXMucmVzZXRGbG93KCk7XG4gICAgICB0aGlzLnNlbGVjdGVkTWV0aG9kLnNldCgnRU1BSUwnKTtcbiAgICAgIHRoaXMucGluQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnByZWZpbGxDb2RlKTtcbiAgICAgIHRoaXMuX3N0ZXAuc2V0KCdjb2RlLWNvbmZpcm0nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXNvbHZlU3RhdHVzKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ2FyZ2EgZGUgZXN0YWRvXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDb25zdWx0YSBlbCBwZXJmaWwgcGFyYSBjb25vY2VyIGVsIGVzdGFkbyBNRkEgeSBwb3NpY2lvbmFyIGVsIGZsdWpvLiAqL1xuICBwcml2YXRlIHJlc29sdmVTdGF0dXMoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RlcC5zZXQoJ2xvYWRpbmcnKTtcbiAgICB0aGlzLnJlc2V0RmxvdygpO1xuICAgIHRoaXMuYXV0aC5nZXRQcm9maWxlKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHByb2ZpbGUgPT4ge1xuICAgICAgICB0aGlzLm1mYUVuYWJsZWQuc2V0KHByb2ZpbGUubWZhRW5hYmxlZCk7XG4gICAgICAgIHRoaXMubWZhTWV0aG9kLnNldChwcm9maWxlLm1mYU1ldGhvZCA/PyBudWxsKTtcbiAgICAgICAgdGhpcy51c2VyUGhvbmUuc2V0KHByb2ZpbGUucGhvbmUgPz8gbnVsbCk7XG4gICAgICAgIGlmIChwcm9maWxlLm1mYUVuYWJsZWQgJiYgcHJvZmlsZS5tZmFNZXRob2QgPT09ICdUT1RQJykge1xuICAgICAgICAgIHRoaXMubG9hZEJhY2t1cENvdW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RlcC5zZXQoJ3N0YXR1cycpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiB1c2FyIGVsIHNpZ25hbCBkZSB1c3VhcmlvIGVuIHNlc2nDs24uXG4gICAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLmF1dGgudXNlcigpO1xuICAgICAgICB0aGlzLm1mYUVuYWJsZWQuc2V0KHVzZXI/Lm1mYUVuYWJsZWQgPz8gZmFsc2UpO1xuICAgICAgICB0aGlzLm1mYU1ldGhvZC5zZXQodXNlcj8ubWZhTWV0aG9kID8/IG51bGwpO1xuICAgICAgICB0aGlzLl9zdGVwLnNldCgnc3RhdHVzJyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQmFja3VwQ291bnQoKTogdm9pZCB7XG4gICAgdGhpcy5hdXRoLmdldEJhY2t1cENvZGVzQ291bnQoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHRoaXMuYmFja3VwQ29kZXNDb3VudC5zZXQocmVzLmNvdW50KSxcbiAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmJhY2t1cENvZGVzQ291bnQuc2V0KDApLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5hdmVnYWNpw7NuIGVudHJlIHBhc29zXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGdvVG9NZXRob2RTZWxlY3QoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdlbmVyYXRlZENvZGVzLnNldChudWxsKTtcbiAgICB0aGlzLl9zdGVwLnNldCgnbWV0aG9kLXNlbGVjdCcpO1xuICB9XG5cbiAgZ29Ub0Rpc2FibGUoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RlcC5zZXQoJ2Rpc2FibGUnKTtcbiAgfVxuXG4gIGJhY2tUb1N0YXR1cygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BDb29sZG93bigpO1xuICAgIHRoaXMucmVzb2x2ZVN0YXR1cygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhhYmlsaXRhciBNRkFcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIENvbnRpbsO6YSBkZXNkZSBlbCBzZWxlY3RvciBkZSBtw6l0b2RvIGFsIHNldHVwIGNvcnJlc3BvbmRpZW50ZS4gKi9cbiAgcHJvY2VlZFdpdGhNZXRob2QoKTogdm9pZCB7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5zZWxlY3RlZE1ldGhvZCgpO1xuICAgIGlmIChtZXRob2QgPT09ICdUT1RQJykge1xuICAgICAgdGhpcy5zZXR1cFRvdHAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcGhvbmU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAobWV0aG9kID09PSAnU01TJyAmJiAhdGhpcy51c2VyUGhvbmUoKSkge1xuICAgICAgaWYgKHRoaXMucGhvbmVDb250cm9sLmludmFsaWQpIHtcbiAgICAgICAgdGhpcy5waG9uZUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYVBob25lSW52YWxpZCcpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcGhvbmUgPSB0aGlzLnBob25lQ29udHJvbC52YWx1ZSA/PyB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy53b3JraW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmF1dGguc2V0dXBNRkEobWV0aG9kLCBwaG9uZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICBpZiAocmVzLmNvZGVTZW50KSB7XG4gICAgICAgICAgdGhpcy5waW5Db250cm9sLnJlc2V0KCk7XG4gICAgICAgICAgdGhpcy5fc3RlcC5zZXQoJ2NvZGUtY29uZmlybScpO1xuICAgICAgICAgIHRoaXMuc3RhcnRDb29sZG93bigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwVG90cCgpOiB2b2lkIHtcbiAgICB0aGlzLndvcmtpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuYXV0aC5zZXR1cFRPVFAoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgdGhpcy50b3RwU2V0dXAuc2V0KHJlcyk7XG4gICAgICAgIHRoaXMucGluQ29udHJvbC5yZXNldCgpO1xuICAgICAgICB0aGlzLnFyR2VuXG4gICAgICAgICAgLmdlbmVyYXRlKHsgZGF0YTogcmVzLnFyQ29kZVVybCwgd2lkdGg6IDIyMCB9KVxuICAgICAgICAgIC50aGVuKHFyID0+IHRoaXMudG90cFFyLnNldChxcikpXG4gICAgICAgICAgLmNhdGNoKCgpID0+IHRoaXMudG90cFFyLnNldChudWxsKSk7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLl9zdGVwLnNldCgndG90cC1zZXR1cCcpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy5yZXNvbHZlRXJyb3IoZXJyKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFZlcmlmaWNhIGVsIGPDs2RpZ28gVE9UUCBkZSBsYSBhcHAgZGUgYXV0ZW50aWNhY2nDs24geSBhY3RpdmEgTUZBLiAqL1xuICB2ZXJpZnlUb3RwKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvZGUgPSB0aGlzLnBpbkNvbnRyb2wudmFsdWU7XG4gICAgaWYgKCFjb2RlIHx8IGNvZGUubGVuZ3RoICE9PSA2KSB7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYUNvZGVJbnZhbGlkJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLndvcmtpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuYXV0aC52ZXJpZnlUT1RQU2V0dXAoY29kZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICBpZiAocmVzLmVuYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYUVuYWJsZWRPaycpKTtcbiAgICAgICAgICB0aGlzLmNoYW5nZWQuZW1pdCgpO1xuICAgICAgICAgIHRoaXMucmVzb2x2ZVN0YXR1cygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQ29uZmlybWEgZWwgY8OzZGlnbyBFTUFJTC9TTVMgeSBhY3RpdmEgTUZBLiAqL1xuICBjb25maXJtQ29kZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb2RlID0gdGhpcy5waW5Db250cm9sLnZhbHVlO1xuICAgIGlmICghY29kZSB8fCBjb2RlLmxlbmd0aCAhPT0gNikge1xuICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFDb2RlSW52YWxpZCcpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy53b3JraW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmF1dGguY29uZmlybU1GQShjb2RlKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIGlmIChyZXMubWZhRW5hYmxlZCkge1xuICAgICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhRW5hYmxlZE9rJykpO1xuICAgICAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KCk7XG4gICAgICAgICAgdGhpcy5yZXNvbHZlU3RhdHVzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMucmVzb2x2ZUVycm9yKGVycikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWVudsOtYSBlbCBjw7NkaWdvIEVNQUlML1NNUyAocmUtZWplY3V0YSBlbCBzZXR1cCkuICovXG4gIHJlc2VuZENvZGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzZW5kQ29vbGRvd24oKSA+IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wcm9jZWVkV2l0aE1ldGhvZCgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEdlc3Rpw7NuIChNRkEgaGFiaWxpdGFkbylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFJlZ2VuZXJhIGxvcyBjw7NkaWdvcyBkZSByZXNwYWxkbyBUT1RQIHkgbG9zIG11ZXN0cmEgdW5hIHZlei4gKi9cbiAgcmVnZW5lcmF0ZUJhY2t1cENvZGVzKCk6IHZvaWQge1xuICAgIHRoaXMud29ya2luZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5hdXRoLnJlZ2VuZXJhdGVCYWNrdXBDb2RlcygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5iYWNrdXBDb2Rlc0NvdW50LnNldChyZXMuYmFja3VwQ29kZXMubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5yZWdlbmVyYXRlZENvZGVzLnNldChyZXMuYmFja3VwQ29kZXMpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy5yZXNvbHZlRXJyb3IoZXJyKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIERlc2hhYmlsaXRhIE1GQSDigJQgcmVxdWllcmUgbGEgY29udHJhc2XDsWEgZGUgbGEgY3VlbnRhLiAqL1xuICBvbkRpc2FibGVTdWJtaXQoZXZlbnQ6IEZvcm1TdWJtaXQpOiB2b2lkIHtcbiAgICBjb25zdCBwYXNzd29yZCA9IGV2ZW50LmZpZWxkc1sncGFzc3dvcmQnXTtcbiAgICBpZiAoIXBhc3N3b3JkKSB7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYVBhc3N3b3JkUmVxdWlyZWQnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMud29ya2luZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5hdXRoLmRpc2FibGVNRkEocGFzc3dvcmQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgaWYgKHJlcy5tZmFEaXNhYmxlZCkge1xuICAgICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhRGlzYWJsZWRPaycpKTtcbiAgICAgICAgICB0aGlzLmNoYW5nZWQuZW1pdCgpO1xuICAgICAgICAgIHRoaXMucmVzb2x2ZVN0YXR1cygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQ29waWEgdW5hIGxpc3RhIGRlIGPDs2RpZ29zIGRlIHJlc3BhbGRvIGFsIHBvcnRhcGFwZWxlcy4gKi9cbiAgYXN5bmMgY29weUNvZGVzKGNvZGVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChjb2Rlcy5qb2luKCdcXG4nKSk7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYUNvZGVzQ29waWVkJykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogc2luIHJlY3Vyc28gZGUgY29waWEgZGlzcG9uaWJsZSAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFdGlxdWV0YSBpMThuIGxlZ2libGUgcGFyYSB1biBtw6l0b2RvIE1GQS4gKi9cbiAgbWV0aG9kTGFiZWwobWV0aG9kOiBNRkFNZXRob2QgfCBudWxsKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnVE9UUCc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYU1ldGhvZFRvdHAnKTtcbiAgICAgIGNhc2UgJ0VNQUlMJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhTWV0aG9kRW1haWwnKTtcbiAgICAgIGNhc2UgJ1NNUyc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYU1ldGhvZFNtcycpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIZWxwZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgcmVzZXRGbG93KCk6IHZvaWQge1xuICAgIHRoaXMucGluQ29udHJvbC5yZXNldCgpO1xuICAgIHRoaXMucGhvbmVDb250cm9sLnJlc2V0KCk7XG4gICAgdGhpcy50b3RwU2V0dXAuc2V0KG51bGwpO1xuICAgIHRoaXMudG90cFFyLnNldChudWxsKTtcbiAgICB0aGlzLnJlZ2VuZXJhdGVkQ29kZXMuc2V0KG51bGwpO1xuICAgIHRoaXMuc2VsZWN0ZWRNZXRob2Quc2V0KCdUT1RQJyk7XG4gICAgdGhpcy5zdG9wQ29vbGRvd24oKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRDb29sZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BDb29sZG93bigpO1xuICAgIHRoaXMucmVzZW5kQ29vbGRvd24uc2V0KFJFU0VORF9DT09MRE9XTl9TRUNPTkRTKTtcbiAgICB0aGlzLnJlc2VuZFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5yZXNlbmRDb29sZG93bi51cGRhdGUodiA9PiB2IC0gMSk7XG4gICAgICBpZiAodGhpcy5yZXNlbmRDb29sZG93bigpIDw9IDApIHtcbiAgICAgICAgdGhpcy5zdG9wQ29vbGRvd24oKTtcbiAgICAgIH1cbiAgICB9LCAxMDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcENvb2xkb3duKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2VuZFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucmVzZW5kVGltZXIpO1xuICAgICAgdGhpcy5yZXNlbmRUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMucmVzZW5kQ29vbGRvd24uc2V0KDApO1xuICB9XG5cbiAgLyoqIE1hcGVhIGxvcyBjw7NkaWdvcyBkZSBlcnJvciBNRkEgZGVsIGJhY2tlbmQgYSBtZW5zYWplcyBkZWwgbmFtZXNwYWNlIGBfYXV0aGAuICovXG4gIHByaXZhdGUgcmVzb2x2ZUVycm9yKGVycjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgY29uc3QgY29kZSA9IChlcnIgYXMgeyBjb2RlPzogc3RyaW5nIH0pPy5jb2RlO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSAnQVVUSFYyX01GQV9JTlZBTElEX0NPREUnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdtZmFFcnJvckludmFsaWRDb2RlJyk7XG4gICAgICBjYXNlICdBVVRIVjJfRVhQSVJFRF9DT0RFJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhRXJyb3JFeHBpcmVkQ29kZScpO1xuICAgICAgY2FzZSAnQVVUSFYyX0NPREVfVVNFRCc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9yQ29kZVVzZWQnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9NRkFfQUxSRUFEWV9BQ1RJVkUnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdtZmFFcnJvckFscmVhZHlBY3RpdmUnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9NRkFfTk9UX0VOQUJMRUQnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdtZmFFcnJvck5vdEVuYWJsZWQnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9QSE9ORV9SRVFVSVJFRCc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9yUGhvbmVSZXF1aXJlZCcpO1xuICAgICAgY2FzZSAnQVVUSFYyX1BIT05FX0VYSVNUUyc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9yUGhvbmVFeGlzdHMnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9UT09fTUFOWV9BVFRFTVBUUyc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ2Vycm9yVG9vTWFueUF0dGVtcHRzJyk7XG4gICAgICBjYXNlICdBVVRIVjJfSU5WQUxJRF9DVVJSRU5UX1BBU1NXT1JEJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnZXJyb3JDdXJyZW50UGFzc3dvcmRXcm9uZycpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnZXJyb3JHZW5lcmljJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93VG9hc3QobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50b2FzdC5zaG93KHsgbWVzc2FnZSwgZHVyYXRpb246IDM1MDAgfSk7XG4gIH1cbn1cbiIsIjxpb24tbW9kYWwgW2lzT3Blbl09XCJpc09wZW5cIiAoZGlkRGlzbWlzcyk9XCJjbG9zZSgpXCI+XG4gIDxuZy10ZW1wbGF0ZT5cbiAgICA8aW9uLWhlYWRlcj5cbiAgICAgIDxpb24tdG9vbGJhcj5cbiAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxuICAgICAgICAgICAgPHN0cm9uZz57eyB0KCdjbG9zZScpIH19PC9zdHJvbmc+XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2lvbi1idXR0b25zPlxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICA8L2lvbi1oZWFkZXI+XG5cbiAgICA8aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJtZmEtbW9kYWxcIj5cbiAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ7IGNvbnRlbnQ6IHQoJ21mYU1hbmFnZVRpdGxlJyksIHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycgfVwiIC8+XG5cbiAgICAgICAgQHN3aXRjaCAoc3RlcCgpKSB7IEBjYXNlICgnbG9hZGluZycpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1sb2FkaW5nXCI+XG4gICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBjYXNlICgnc3RhdHVzJykgeyBAaWYgKG1mYUVuYWJsZWQoKSkge1xuICAgICAgICA8cCBjbGFzcz1cIm1mYS1zdGF0dXMgbWZhLXN0YXR1cy0tb25cIj57eyB0KCdtZmFFbmFibGVkTGFiZWwnKSB9fSDCtyB7eyBtZXRob2RMYWJlbChtZmFNZXRob2QoKSkgfX08L3A+XG5cbiAgICAgICAgQGlmIChtZmFNZXRob2QoKSA9PT0gJ1RPVFAnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtYmxvY2tcIj5cbiAgICAgICAgICA8aDM+e3sgdCgnbWZhQmFja3VwQ29kZXNUaXRsZScpIH19PC9oMz5cbiAgICAgICAgICA8cCBjbGFzcz1cIm1mYS10ZXh0XCI+e3sgdCgnbWZhQmFja3VwQ29kZXNBdmFpbGFibGUnKSB9fToge3sgYmFja3VwQ29kZXNDb3VudCgpIH19PC9wPlxuXG4gICAgICAgICAgQGlmIChyZWdlbmVyYXRlZENvZGVzKCk7IGFzIGNvZGVzKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1hbGVydFwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJpbmZvcm1hdGlvbi1jaXJjbGUtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8cD57eyB0KCdtZmFCYWNrdXBDb2Rlc1NhdmVXYXJuaW5nJykgfX0ge3sgdCgnbWZhQmFja3VwQ29kZXNFeHBsYWluJykgfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1jb2Rlc1wiPlxuICAgICAgICAgICAgQGZvciAoY29kZSBvZiBjb2RlczsgdHJhY2sgY29kZSkge1xuICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJtZmEtY29kZVwiPnt7IGNvZGUgfX08L2NvZGU+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cImRhcmtcIiBmaWxsPVwib3V0bGluZVwiIChjbGljayk9XCJjb3B5Q29kZXMoY29kZXMpXCI+XG4gICAgICAgICAgICB7eyB0KCdtZmFDb3B5Q29kZXMnKSB9fVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICB9IEBlbHNlIHsgQGlmIChiYWNrdXBDb2Rlc0NvdW50KCkgPCAzKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1hbGVydFwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJpbmZvcm1hdGlvbi1jaXJjbGUtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8cD57eyB0KCdtZmFCYWNrdXBDb2Rlc0xvdycpIH19PC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgZXhwYW5kPVwiYmxvY2tcIlxuICAgICAgICAgICAgY29sb3I9XCJkYXJrXCJcbiAgICAgICAgICAgIGZpbGw9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInJlZ2VuZXJhdGVCYWNrdXBDb2RlcygpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKHdvcmtpbmcoKSkge1xuICAgICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhUmVnZW5lcmF0ZUNvZGVzJykgfX0gfVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cImRhcmtcIiBmaWxsPVwib3V0bGluZVwiIChjbGljayk9XCJnb1RvRGlzYWJsZSgpXCI+XG4gICAgICAgICAge3sgdCgnbWZhRGlzYWJsZUJ1dHRvbicpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxwIGNsYXNzPVwibWZhLXN0YXR1cyBtZmEtc3RhdHVzLS1vZmZcIj57eyB0KCdtZmFEaXNhYmxlZExhYmVsJykgfX08L3A+XG4gICAgICAgIDxwIGNsYXNzPVwibWZhLXRleHRcIj57eyB0KCdtZmFEaXNhYmxlZEhpbnQnKSB9fTwvcD5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiAoY2xpY2spPVwiZ29Ub01ldGhvZFNlbGVjdCgpXCI+IHt7IHQoJ21mYUVuYWJsZUJ1dHRvbicpIH19IDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSB9IEBjYXNlICgnbWV0aG9kLXNlbGVjdCcpIHtcbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiB0KCdtZmFFbmFibGVUaXRsZScpLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuICAgICAgICA8cCBjbGFzcz1cIm1mYS10ZXh0XCI+e3sgdCgnbWZhTWV0aG9kUHJvbXB0JykgfX08L3A+XG5cbiAgICAgICAgPGlvbi1yYWRpby1ncm91cCBbdmFsdWVdPVwic2VsZWN0ZWRNZXRob2QoKVwiIChpb25DaGFuZ2UpPVwic2VsZWN0ZWRNZXRob2Quc2V0KCRldmVudC5kZXRhaWwudmFsdWUpXCI+XG4gICAgICAgICAgPGlvbi1pdGVtPlxuICAgICAgICAgICAgPGlvbi1yYWRpbyBzbG90PVwic3RhcnRcIiB2YWx1ZT1cIlRPVFBcIj48L2lvbi1yYWRpbz5cbiAgICAgICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnbWZhTWV0aG9kVG90cCcpIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDxwPnt7IHQoJ21mYU1ldGhvZFRvdHBIaW50JykgfX08L3A+XG4gICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICAgIDxpb24taXRlbT5cbiAgICAgICAgICAgIDxpb24tcmFkaW8gc2xvdD1cInN0YXJ0XCIgdmFsdWU9XCJFTUFJTFwiPjwvaW9uLXJhZGlvPlxuICAgICAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICAgICAgPHN0cm9uZz57eyB0KCdtZmFNZXRob2RFbWFpbCcpIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDxwPnt7IHQoJ21mYU1ldGhvZEVtYWlsSGludCcpIH19PC9wPlxuICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICA8aW9uLWl0ZW0+XG4gICAgICAgICAgICA8aW9uLXJhZGlvIHNsb3Q9XCJzdGFydFwiIHZhbHVlPVwiU01TXCI+PC9pb24tcmFkaW8+XG4gICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICA8c3Ryb25nPnt7IHQoJ21mYU1ldGhvZFNtcycpIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDxwPnt7IHQoJ21mYU1ldGhvZFNtc0hpbnQnKSB9fTwvcD5cbiAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgIDwvaW9uLXJhZGlvLWdyb3VwPlxuXG4gICAgICAgIEBpZiAoc2VsZWN0ZWRNZXRob2QoKSA9PT0gJ1NNUycgJiYgIXVzZXJQaG9uZSgpKSB7XG4gICAgICAgIDxpb24taW5wdXRcbiAgICAgICAgICBsYWJlbD1cInt7IHQoJ21mYVBob25lTGFiZWwnKSB9fVwiXG4gICAgICAgICAgbGFiZWxQbGFjZW1lbnQ9XCJmbG9hdGluZ1wiXG4gICAgICAgICAgZmlsbD1cIm91dGxpbmVcIlxuICAgICAgICAgIHR5cGU9XCJ0ZWxcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiKzU2OTEyMzQ1Njc4XCJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicGhvbmVDb250cm9sXCJcbiAgICAgICAgPjwvaW9uLWlucHV0PlxuICAgICAgICBAaWYgKHBob25lQ29udHJvbC5pbnZhbGlkICYmIHBob25lQ29udHJvbC50b3VjaGVkKSB7XG4gICAgICAgIDxwIGNsYXNzPVwibWZhLWVycm9yXCI+e3sgdCgnbWZhUGhvbmVJbnZhbGlkJykgfX08L3A+XG4gICAgICAgIH0gfSBAaWYgKHNlbGVjdGVkTWV0aG9kKCkgPT09ICdTTVMnICYmIHVzZXJQaG9uZSgpOyBhcyBwaG9uZSkge1xuICAgICAgICA8cCBjbGFzcz1cIm1mYS10ZXh0XCI+e3sgdCgnbWZhUGhvbmVSZWdpc3RlcmVkJykgfX06IHt7IHBob25lIH19PC9wPlxuICAgICAgICB9XG5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBbZGlzYWJsZWRdPVwid29ya2luZygpXCIgKGNsaWNrKT1cInByb2NlZWRXaXRoTWV0aG9kKClcIj5cbiAgICAgICAgICBAaWYgKHdvcmtpbmcoKSkge1xuICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgIH0gQGVsc2UgeyB7eyB0KCdtZmFDb250aW51ZScpIH19IH1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJiYWNrVG9TdGF0dXMoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYUNhbmNlbCcpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAY2FzZSAoJ3RvdHAtc2V0dXAnKSB7XG4gICAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgY29udGVudDogdCgnbWZhVG90cFNldHVwVGl0bGUnKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICcnLCBib2xkOiBmYWxzZSB9XCIgLz5cbiAgICAgICAgPHAgY2xhc3M9XCJtZmEtdGV4dFwiPnt7IHQoJ21mYVRvdHBTdGVwMScpIH19PC9wPlxuXG4gICAgICAgIEBpZiAodG90cFFyKCk7IGFzIHFyKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtcXJcIj5cbiAgICAgICAgICA8dmFsLXFyLWNvZGUgW3Byb3BzXT1cInsgcXI6IHFyIH1cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAaWYgKHRvdHBTZXR1cCgpOyBhcyBzZXR1cCkge1xuICAgICAgICA8cCBjbGFzcz1cIm1mYS10ZXh0XCI+e3sgdCgnbWZhVG90cE1hbnVhbEVudHJ5JykgfX08L3A+XG4gICAgICAgIDxjb2RlIGNsYXNzPVwibWZhLXNlY3JldFwiPnt7IHNldHVwLnNlY3JldCB9fTwvY29kZT5cblxuICAgICAgICA8cCBjbGFzcz1cIm1mYS10ZXh0XCI+e3sgdCgnbWZhVG90cFN0ZXAyJykgfX08L3A+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtcGluXCI+XG4gICAgICAgICAgPHZhbC1waW4taW5wdXQgW3Byb3BzXT1cInBpbklucHV0UHJvcHNcIiAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIiAoY2xpY2spPVwidmVyaWZ5VG90cCgpXCI+XG4gICAgICAgICAgQGlmICh3b3JraW5nKCkpIHtcbiAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhVG90cFZlcmlmeScpIH19IH1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtYmFja3VwXCI+XG4gICAgICAgICAgPGgzPnt7IHQoJ21mYUJhY2t1cENvZGVzVGl0bGUnKSB9fTwvaDM+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1hbGVydFwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJpbmZvcm1hdGlvbi1jaXJjbGUtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8cD57eyB0KCdtZmFCYWNrdXBDb2Rlc1NhdmVXYXJuaW5nJykgfX0ge3sgdCgnbWZhQmFja3VwQ29kZXNFeHBsYWluJykgfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1jb2Rlc1wiPlxuICAgICAgICAgICAgQGZvciAoY29kZSBvZiBzZXR1cC5iYWNrdXBDb2RlczsgdHJhY2sgY29kZSkge1xuICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJtZmEtY29kZVwiPnt7IGNvZGUgfX08L2NvZGU+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cImRhcmtcIiBmaWxsPVwib3V0bGluZVwiIChjbGljayk9XCJjb3B5Q29kZXMoc2V0dXAuYmFja3VwQ29kZXMpXCI+XG4gICAgICAgICAgICB7eyB0KCdtZmFDb3B5Q29kZXMnKSB9fVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJiYWNrVG9TdGF0dXMoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYUNhbmNlbCcpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAY2FzZSAoJ2NvZGUtY29uZmlybScpIHtcbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiB0KCdtZmFDb25maXJtVGl0bGUnKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICcnLCBib2xkOiBmYWxzZSB9XCIgLz5cbiAgICAgICAgPHAgY2xhc3M9XCJtZmEtdGV4dFwiPlxuICAgICAgICAgIHt7IHNlbGVjdGVkTWV0aG9kKCkgPT09ICdFTUFJTCcgPyB0KCdtZmFDb25maXJtUHJvbXB0RW1haWwnKSA6IHQoJ21mYUNvbmZpcm1Qcm9tcHRTbXMnKSB9fVxuICAgICAgICA8L3A+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1waW5cIj5cbiAgICAgICAgICA8dmFsLXBpbi1pbnB1dCBbcHJvcHNdPVwicGluSW5wdXRQcm9wc1wiIC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgW2Rpc2FibGVkXT1cIndvcmtpbmcoKVwiIChjbGljayk9XCJjb25maXJtQ29kZSgpXCI+XG4gICAgICAgICAgQGlmICh3b3JraW5nKCkpIHtcbiAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhQ29uZmlybUJ1dHRvbicpIH19IH1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICAgIDxwIGNsYXNzPVwibWZhLXJlc2VuZFwiPlxuICAgICAgICAgIHt7IHQoJ21mYU5vQ29kZScpIH19IEBpZiAocmVzZW5kQ29vbGRvd24oKSA+IDApIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1mYS10ZXh0XCI+e3sgdCgnbWZhUmVzZW5kSW4nKSB9fSB7eyByZXNlbmRDb29sZG93bigpIH19czwvc3Bhbj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8YSAoY2xpY2spPVwicmVzZW5kQ29kZSgpXCI+e3sgdCgnbWZhUmVzZW5kJykgfX08L2E+XG4gICAgICAgICAgfVxuICAgICAgICA8L3A+XG5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiYmFja1RvU3RhdHVzKClcIj5cbiAgICAgICAgICB7eyB0KCdtZmFDYW5jZWwnKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIH0gQGNhc2UgKCdkaXNhYmxlJykge1xuICAgICAgICA8dmFsLWZvcm0gW3Byb3BzXT1cImRpc2FibGVGb3JtUHJvcHMoKVwiIChvblN1Ym1pdCk9XCJvbkRpc2FibGVTdWJtaXQoJGV2ZW50KVwiIC8+XG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImJhY2tUb1N0YXR1cygpXCI+XG4gICAgICAgICAge3sgdCgnbWZhQ2FuY2VsJykgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICB9IH1cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2lvbi1jb250ZW50PlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tbW9kYWw+XG4iXX0=
|
|
483
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWZhLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvbWZhLW1vZGFsL21mYS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL21mYS1tb2RhbC9tZmEtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixTQUFTLEVBQ1QsT0FBTyxFQUNQLFFBQVEsRUFDUixPQUFPLEVBQ1AsUUFBUSxFQUNSLFFBQVEsRUFDUixRQUFRLEVBQ1IsYUFBYSxFQUNiLFVBQVUsRUFDVixVQUFVLEdBQ1gsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFB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QUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLFNBQVMsQ0FBQyxPQUFlO1FBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7K0dBamNVLGlCQUFpQjttR0FBakIsaUJBQWlCLDRMQ2hHOUIsbzVRQWlOQSxzdUVEeElJLG1CQUFtQiwwVEFDbkIsU0FBUyxvUEFDVCxVQUFVLDhFQUNWLFVBQVUsd0tBQ1YsU0FBUyxvR0FDVCxPQUFPLDJKQUNQLFFBQVEsOGVBQ1IsT0FBTywwTkFDUCxRQUFRLDZGQUNSLFFBQVEsc0RBQ1IsUUFBUSx3SkFDUixhQUFhLHdKQUNiLFVBQVUseUdBQ1YsVUFBVSxtRkFDVixnQkFBZ0IsMkVBQ2hCLGFBQWEsOEhBQ2IsZUFBZSxtSUFDZixjQUFjLHlFQUNkLGlCQUFpQjs7NEZBS1IsaUJBQWlCO2tCQTNCN0IsU0FBUzsrQkFDRSxlQUFlLGNBQ2IsSUFBSSxXQUNQO3dCQUNQLG1CQUFtQjt3QkFDbkIsU0FBUzt3QkFDVCxVQUFVO3dCQUNWLFVBQVU7d0JBQ1YsU0FBUzt3QkFDVCxPQUFPO3dCQUNQLFFBQVE7d0JBQ1IsT0FBTzt3QkFDUCxRQUFRO3dCQUNSLFFBQVE7d0JBQ1IsUUFBUTt3QkFDUixhQUFhO3dCQUNiLFVBQVU7d0JBQ1YsVUFBVTt3QkFDVixnQkFBZ0I7d0JBQ2hCLGFBQWE7d0JBQ2IsZUFBZTt3QkFDZixjQUFjO3dCQUNkLGlCQUFpQjtxQkFDbEI7d0RBU0csTUFBTTtzQkFEVCxLQUFLO2dCQWlCRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdJLE9BQU87c0JBQWhCLE1BQU07Z0JBR0csU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIEV2ZW50RW1pdHRlciwgaW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBJb25CdXR0b24sXG4gIElvbkJ1dHRvbnMsXG4gIElvbkNvbnRlbnQsXG4gIElvbkhlYWRlcixcbiAgSW9uSWNvbixcbiAgSW9uSW5wdXQsXG4gIElvbkl0ZW0sXG4gIElvbkxhYmVsLFxuICBJb25Nb2RhbCxcbiAgSW9uUmFkaW8sXG4gIElvblJhZGlvR3JvdXAsXG4gIElvblNwaW5uZXIsXG4gIElvblRvb2xiYXIsXG59IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5pbXBvcnQgeyBpbmZvcm1hdGlvbkNpcmNsZU91dGxpbmUsIGNvcHlPdXRsaW5lLCBjaGVja21hcmtPdXRsaW5lIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuXG5pbXBvcnQgeyBTb2xpZERlZmF1bHRCbG9jayB9IGZyb20gJy4uLy4uL2F0b21zL2J1dHRvbi9mYWN0b3J5JztcbmltcG9ydCB7IERpc3BsYXlDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9kaXNwbGF5L2Rpc3BsYXkuY29tcG9uZW50JztcbmltcG9ydCB7IFFyQ29kZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL3FyLWNvZGUvcXItY29kZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGl0bGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90aXRsZS90aXRsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGluSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvcGluLWlucHV0L3Bpbi1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50U3RhdGVzLCBGb3JtTWV0YWRhdGEsIEZvcm1TdWJtaXQsIElucHV0VHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9mb3JtL2Zvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aCc7XG5pbXBvcnQgeyBNRkFNZXRob2QsIFRPVFBTZXR1cFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aC90eXBlcyc7XG5pbXBvcnQgeyBJMThuU2VydmljZSwgSW5wdXRJMThuSGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBRckdlbmVyYXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9xci1nZW5lcmF0b3IvcXItZ2VuZXJhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgUXJSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9xci1nZW5lcmF0b3IvdHlwZXMnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdG9hc3Quc2VydmljZSc7XG5cbi8qKiBQYXNvIGRlbCBmbHVqbyBkZWwgbW9kYWwuICovXG50eXBlIE1mYVN0ZXAgPSAnbG9hZGluZycgfCAnc3RhdHVzJyB8ICdtZXRob2Qtc2VsZWN0JyB8ICd0b3RwLXNldHVwJyB8ICdjb2RlLWNvbmZpcm0nIHwgJ2Rpc2FibGUnO1xuXG4vKiogU2VndW5kb3MgZGUgZXNwZXJhIGFudGVzIGRlIHBvZGVyIHJlZW52aWFyIGVsIGPDs2RpZ28gRU1BSUwvU01TLiAqL1xuY29uc3QgUkVTRU5EX0NPT0xET1dOX1NFQ09ORFMgPSAzMDtcblxuLyoqXG4gKiBgdmFsLW1mYS1tb2RhbGAg4oCUIG1vZGFsIGRlIGdlc3Rpw7NuIGRlIGF1dGVudGljYWNpw7NuIGRlIGRvcyBmYWN0b3JlcyAoTUZBKVxuICogcGFyYSB1biB1c3VhcmlvIGF1dGVudGljYWRvLiBNaXNtbyBwYXRyw7NuIHF1ZSBgdmFsLWNoYW5nZS1wYXNzd29yZC1tb2RhbGAuXG4gKlxuICogRmx1am8gKG3DoXF1aW5hIGRlIGVzdGFkb3MgaW50ZXJuYSk6XG4gKiAgLSBgbG9hZGluZ2Ag4oaSIGBnZXRQcm9maWxlKClgIHBhcmEgY29ub2NlciBlbCBlc3RhZG8gTUZBLlxuICogIC0gYHN0YXR1c2Ag4oaSIG11ZXN0cmEgTUZBIGhhYmlsaXRhZG8vZGVzaGFiaWxpdGFkby4gU2kgZXN0w6EgaGFiaWxpdGFkbzpcbiAqICAgIGdlc3Rpw7NuIGRlIGJhY2t1cCBjb2RlcyAoVE9UUCkgKyBkZXNoYWJpbGl0YXIuIFNpIG5vOiBib3TDs24gaGFiaWxpdGFyLlxuICogIC0gYG1ldGhvZC1zZWxlY3RgIOKGkiBlbGVnaXIgVE9UUCAvIEVNQUlMIC8gU01TLlxuICogIC0gYHRvdHAtc2V0dXBgIOKGkiBRUiArIHNlY3JldG8gbWFudWFsICsgYmFja3VwIGNvZGVzIOKGkiB2ZXJpZmljYXIgY8OzZGlnby5cbiAqICAtIGBjb2RlLWNvbmZpcm1gIOKGkiAoRU1BSUwvU01TKSBpbmdyZXNhciBjw7NkaWdvIHJlY2liaWRvLCBjb24gcmVlbnbDrW8uXG4gKiAgLSBgZGlzYWJsZWAg4oaSIGNvbnRyYXNlw7FhIHBhcmEgZGVzaGFiaWxpdGFyIE1GQS5cbiAqXG4gKiBFbCBRUiBzZSBnZW5lcmEgKipjbGllbnQtc2lkZSoqIChgUXJHZW5lcmF0b3JTZXJ2aWNlYCkg4oCUIGVsIHNlY3JldG8gVE9UUFxuICogbnVuY2Egc2FsZSBkZWwgbmF2ZWdhZG9yLlxuICpcbiAqIFNlbGYtY29udGFpbmVkOiBpbnllY3RhIGBBdXRoU2VydmljZWAgeSBsbGFtYSBsb3MgZW5kcG9pbnRzIGRpcmVjdG8uIExhIGFwcFxuICogY29udHJvbGEgYFtpc09wZW5dYCB5IHJlYWNjaW9uYSBhIGAoY2hhbmdlZClgIC8gYChkaXNtaXNzZWQpYC5cbiAqXG4gKiBpMThuOiBuYW1lc3BhY2UgY29tcGFydGlkbyBgX2F1dGhgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8dmFsLW1mYS1tb2RhbFxuICogICBbaXNPcGVuXT1cImlzTW9kYWxPcGVuKClcIlxuICogICAoZGlzbWlzc2VkKT1cImlzTW9kYWxPcGVuLnNldChmYWxzZSlcIlxuICogLz5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtbWZhLW1vZGFsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgSW9uQnV0dG9uLFxuICAgIElvbkJ1dHRvbnMsXG4gICAgSW9uQ29udGVudCxcbiAgICBJb25IZWFkZXIsXG4gICAgSW9uSWNvbixcbiAgICBJb25JbnB1dCxcbiAgICBJb25JdGVtLFxuICAgIElvbkxhYmVsLFxuICAgIElvbk1vZGFsLFxuICAgIElvblJhZGlvLFxuICAgIElvblJhZGlvR3JvdXAsXG4gICAgSW9uU3Bpbm5lcixcbiAgICBJb25Ub29sYmFyLFxuICAgIERpc3BsYXlDb21wb25lbnQsXG4gICAgRm9ybUNvbXBvbmVudCxcbiAgICBRckNvZGVDb21wb25lbnQsXG4gICAgVGl0bGVDb21wb25lbnQsXG4gICAgUGluSW5wdXRDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9tZmEtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tZmEtbW9kYWwuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTWZhTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcblxuICAvKiogQ29udHJvbGEgbGEgdmlzaWJpbGlkYWQuIENhZGEgYXBlcnR1cmEgcmUtcmVzdWVsdmUgZWwgZXN0YWRvIE1GQS4gKi9cbiAgQElucHV0KClcbiAgc2V0IGlzT3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IG9wZW5pbmcgPSB2YWx1ZSAmJiAhdGhpcy5faXNPcGVuO1xuICAgIHRoaXMuX2lzT3BlbiA9IHZhbHVlO1xuICAgIGlmIChvcGVuaW5nKSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNPcGVuO1xuICB9XG5cbiAgLyoqXG4gICAqIEPDs2RpZ28gTUZBIHByZS1jYXJnYWRvIChkZWVwLWxpbmsgZGVzZGUgZWwgZW1haWwgZGUgc2V0dXAgTUZBLWVtYWlsKS4gU2lcbiAgICogZXN0w6EgcHJlc2VudGUgYWwgYWJyaXIsIGVsIG1vZGFsIHNhbHRhIGRpcmVjdG8gYWwgcGFzbyBkZSBjb25maXJtYWNpw7NuXG4gICAqIGNvbiBlbCBjw7NkaWdvIHJlbGxlbmFkby5cbiAgICovXG4gIEBJbnB1dCgpIHByZWZpbGxDb2RlPzogc3RyaW5nO1xuXG4gIC8qKiBFbWl0ZSBjdWFuZG8gZWwgZXN0YWRvIE1GQSBjYW1iaWEgKGhhYmlsaXRhZG8gLyBkZXNoYWJpbGl0YWRvKS4gKi9cbiAgQE91dHB1dCgpIGNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXRlIGN1YW5kbyBlbCB1c2VyIGNpZXJyYSBlbCBtb2RhbCAoYm90w7NuIFggbyBiYWNrZHJvcCkuICovXG4gIEBPdXRwdXQoKSBkaXNtaXNzZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0b2FzdCA9IGluamVjdChUb2FzdFNlcnZpY2UpO1xuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIGkxOG5IZWxwZXIgPSBpbmplY3QoSW5wdXRJMThuSGVscGVyKTtcbiAgcHJpdmF0ZSBxckdlbiA9IGluamVjdChRckdlbmVyYXRvclNlcnZpY2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0ZXAgPSBzaWduYWw8TWZhU3RlcD4oJ2xvYWRpbmcnKTtcbiAgLyoqIFBhc28gYWN0dWFsIGRlbCBmbHVqby4gKi9cbiAgcmVhZG9ubHkgc3RlcCA9IHRoaXMuX3N0ZXAuYXNSZWFkb25seSgpO1xuXG4gIC8qKiBgdHJ1ZWAgbWllbnRyYXMgdW5hIGxsYW1hZGEgYWwgYmFja2VuZCBlc3TDoSBlbiBjdXJzby4gKi9cbiAgcmVhZG9ubHkgd29ya2luZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gRXN0YWRvIE1GQSBhY3R1YWwuXG4gIHJlYWRvbmx5IG1mYUVuYWJsZWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBtZmFNZXRob2QgPSBzaWduYWw8TUZBTWV0aG9kIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHVzZXJQaG9uZSA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgYmFja3VwQ29kZXNDb3VudCA9IHNpZ25hbCgwKTtcblxuICAvLyBFc3RhZG8gZGVsIGZsdWpvIGRlIGhhYmlsaXRhY2nDs24uXG4gIHJlYWRvbmx5IHNlbGVjdGVkTWV0aG9kID0gc2lnbmFsPE1GQU1ldGhvZD4oJ1RPVFAnKTtcbiAgcmVhZG9ubHkgdG90cFNldHVwID0gc2lnbmFsPFRPVFBTZXR1cFJlc3BvbnNlIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHRvdHBRciA9IHNpZ25hbDxRclJlc3VsdCB8IG51bGw+KG51bGwpO1xuICAvKiogQ8OzZGlnb3MgZGUgcmVzcGFsZG8gcmVjacOpbiByZWdlbmVyYWRvcyDigJQgc2UgbXVlc3RyYW4gdW5hIHNvbGEgdmV6LiAqL1xuICByZWFkb25seSByZWdlbmVyYXRlZENvZGVzID0gc2lnbmFsPHN0cmluZ1tdIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBNYXJjYSBtb21lbnTDoW5lYSBjdWFuZG8gZWwgc2VjcmV0byBUT1RQIHNlIGFjYWJhIGRlIGNvcGlhciAoZmVlZGJhY2sgdmlzdWFsKS4gKi9cbiAgcmVhZG9ubHkgY29waWVkU2VjcmV0ID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgcmVzZW5kQ29vbGRvd24gPSBzaWduYWwoMCk7XG5cbiAgcmVhZG9ubHkgcGluQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDYpLCBWYWxpZGF0b3JzLm1heExlbmd0aCg2KV0pO1xuICByZWFkb25seSBwaG9uZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLnBhdHRlcm4oL15cXCtbMS05XVxcZHs2LDE0fSQvKV0pO1xuXG4gIHJlYWRvbmx5IHBpbklucHV0UHJvcHMgPSB7XG4gICAgY29udHJvbDogdGhpcy5waW5Db250cm9sLFxuICAgIHRva2VuOiAnbWZhLWNvZGUnLFxuICAgIGxlbmd0aDogNixcbiAgICBhbGxvd051bWJlcnNPbmx5OiB0cnVlLFxuICAgIGF1dG9Gb2N1czogdHJ1ZSxcbiAgfTtcblxuICAvKiogRm9ybSBkZSBkZXNoYWJpbGl0YWNpw7NuIOKAlCBgdmFsLWZvcm1gIGNvbiB1biBjYW1wbyBkZSBjb250cmFzZcOxYS4gKi9cbiAgcmVhZG9ubHkgZGlzYWJsZUZvcm1Qcm9wcyA9IGNvbXB1dGVkPEZvcm1NZXRhZGF0YT4oKCkgPT5cbiAgICB0aGlzLmkxOG5IZWxwZXIucmVzb2x2ZUZvcm0oe1xuICAgICAgbmFtZUtleTogJ21mYURpc2FibGVUaXRsZScsXG4gICAgICBpMThuTmFtZXNwYWNlOiAnX2F1dGgnLFxuICAgICAgc2VjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IHRoaXMudCgnbWZhRGlzYWJsZVByb21wdCcpLFxuICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBJbnB1dFR5cGUuUEFTU1dPUkQsXG4gICAgICAgICAgICAgIG5hbWU6ICdwYXNzd29yZCcsXG4gICAgICAgICAgICAgIHRva2VuOiAnbWZhLWRpc2FibGUtcGFzc3dvcmQnLFxuICAgICAgICAgICAgICBsYWJlbEtleTogJ21mYVBhc3N3b3JkTGFiZWwnLFxuICAgICAgICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJLZXk6ICdwYXNzd29yZFBsYWNlaG9sZGVyJyxcbiAgICAgICAgICAgICAgZXJyb3JLZXlzOiB7IHJlcXVpcmVkOiAnbWZhUGFzc3dvcmRSZXF1aXJlZCcgfSxcbiAgICAgICAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGFjdGlvbnM6IHtcbiAgICAgICAgLi4uU29saWREZWZhdWx0QmxvY2soJycsICdzdWJtaXQnKSxcbiAgICAgICAgdG9rZW46ICdtZmEtZGlzYWJsZS1zdWJtaXQnLFxuICAgICAgICB0ZXh0S2V5OiAnbWZhRGlzYWJsZUJ1dHRvbicsXG4gICAgICB9LFxuICAgICAgc3RhdGU6IHRoaXMud29ya2luZygpID8gQ29tcG9uZW50U3RhdGVzLldPUktJTkcgOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICB9KVxuICApO1xuXG4gIHByaXZhdGUgcmVzZW5kVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGFkZEljb25zKHsgaW5mb3JtYXRpb25DaXJjbGVPdXRsaW5lLCBjb3B5T3V0bGluZSwgY2hlY2ttYXJrT3V0bGluZSB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcENvb2xkb3duKCk7XG4gIH1cblxuICAvKiogVHJhZHVjZSB1bmEgY2xhdmUgZGVsIG5hbWVzcGFjZSBgX2F1dGhgLiAqL1xuICB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCAnX2F1dGgnKTtcbiAgfVxuXG4gIC8qKiBDaWVycmUgaW5pY2lhZG8gcG9yIGVsIHVzZXIgKFggLyBiYWNrZHJvcCkuICovXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzbWlzc2VkLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdW50byBkZSBlbnRyYWRhIGFsIGFicmlyIGVsIG1vZGFsLiBDb24gYHByZWZpbGxDb2RlYCAoZGVlcC1saW5rIGRlbCBlbWFpbFxuICAgKiBkZSBzZXR1cCBNRkEtZW1haWwpIHNhbHRhIGRpcmVjdG8gYSBsYSBjb25maXJtYWNpw7NuOyBzaSBubywgcmVzdWVsdmUgZWxcbiAgICogZXN0YWRvIE1GQSBhY3R1YWwuXG4gICAqL1xuICBwcml2YXRlIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlZmlsbENvZGUpIHtcbiAgICAgIHRoaXMucmVzZXRGbG93KCk7XG4gICAgICB0aGlzLnNlbGVjdGVkTWV0aG9kLnNldCgnRU1BSUwnKTtcbiAgICAgIHRoaXMucGluQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnByZWZpbGxDb2RlKTtcbiAgICAgIHRoaXMuX3N0ZXAuc2V0KCdjb2RlLWNvbmZpcm0nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXNvbHZlU3RhdHVzKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ2FyZ2EgZGUgZXN0YWRvXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDb25zdWx0YSBlbCBwZXJmaWwgcGFyYSBjb25vY2VyIGVsIGVzdGFkbyBNRkEgeSBwb3NpY2lvbmFyIGVsIGZsdWpvLiAqL1xuICBwcml2YXRlIHJlc29sdmVTdGF0dXMoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RlcC5zZXQoJ2xvYWRpbmcnKTtcbiAgICB0aGlzLnJlc2V0RmxvdygpO1xuICAgIHRoaXMuYXV0aC5nZXRQcm9maWxlKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHByb2ZpbGUgPT4ge1xuICAgICAgICB0aGlzLm1mYUVuYWJsZWQuc2V0KHByb2ZpbGUubWZhRW5hYmxlZCk7XG4gICAgICAgIHRoaXMubWZhTWV0aG9kLnNldChwcm9maWxlLm1mYU1ldGhvZCA/PyBudWxsKTtcbiAgICAgICAgdGhpcy51c2VyUGhvbmUuc2V0KHByb2ZpbGUucGhvbmUgPz8gbnVsbCk7XG4gICAgICAgIGlmIChwcm9maWxlLm1mYUVuYWJsZWQgJiYgcHJvZmlsZS5tZmFNZXRob2QgPT09ICdUT1RQJykge1xuICAgICAgICAgIHRoaXMubG9hZEJhY2t1cENvdW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RlcC5zZXQoJ3N0YXR1cycpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiB1c2FyIGVsIHNpZ25hbCBkZSB1c3VhcmlvIGVuIHNlc2nDs24uXG4gICAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLmF1dGgudXNlcigpO1xuICAgICAgICB0aGlzLm1mYUVuYWJsZWQuc2V0KHVzZXI/Lm1mYUVuYWJsZWQgPz8gZmFsc2UpO1xuICAgICAgICB0aGlzLm1mYU1ldGhvZC5zZXQodXNlcj8ubWZhTWV0aG9kID8/IG51bGwpO1xuICAgICAgICB0aGlzLl9zdGVwLnNldCgnc3RhdHVzJyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQmFja3VwQ291bnQoKTogdm9pZCB7XG4gICAgdGhpcy5hdXRoLmdldEJhY2t1cENvZGVzQ291bnQoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHRoaXMuYmFja3VwQ29kZXNDb3VudC5zZXQocmVzLmNvdW50KSxcbiAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmJhY2t1cENvZGVzQ291bnQuc2V0KDApLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5hdmVnYWNpw7NuIGVudHJlIHBhc29zXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGdvVG9NZXRob2RTZWxlY3QoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdlbmVyYXRlZENvZGVzLnNldChudWxsKTtcbiAgICB0aGlzLl9zdGVwLnNldCgnbWV0aG9kLXNlbGVjdCcpO1xuICB9XG5cbiAgZ29Ub0Rpc2FibGUoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RlcC5zZXQoJ2Rpc2FibGUnKTtcbiAgfVxuXG4gIGJhY2tUb1N0YXR1cygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BDb29sZG93bigpO1xuICAgIHRoaXMucmVzb2x2ZVN0YXR1cygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhhYmlsaXRhciBNRkFcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIENvbnRpbsO6YSBkZXNkZSBlbCBzZWxlY3RvciBkZSBtw6l0b2RvIGFsIHNldHVwIGNvcnJlc3BvbmRpZW50ZS4gKi9cbiAgcHJvY2VlZFdpdGhNZXRob2QoKTogdm9pZCB7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5zZWxlY3RlZE1ldGhvZCgpO1xuICAgIGlmIChtZXRob2QgPT09ICdUT1RQJykge1xuICAgICAgdGhpcy5zZXR1cFRvdHAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcGhvbmU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAobWV0aG9kID09PSAnU01TJyAmJiAhdGhpcy51c2VyUGhvbmUoKSkge1xuICAgICAgaWYgKHRoaXMucGhvbmVDb250cm9sLmludmFsaWQpIHtcbiAgICAgICAgdGhpcy5waG9uZUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYVBob25lSW52YWxpZCcpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcGhvbmUgPSB0aGlzLnBob25lQ29udHJvbC52YWx1ZSA/PyB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy53b3JraW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmF1dGguc2V0dXBNRkEobWV0aG9kLCBwaG9uZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICBpZiAocmVzLmNvZGVTZW50KSB7XG4gICAgICAgICAgdGhpcy5waW5Db250cm9sLnJlc2V0KCk7XG4gICAgICAgICAgdGhpcy5fc3RlcC5zZXQoJ2NvZGUtY29uZmlybScpO1xuICAgICAgICAgIHRoaXMuc3RhcnRDb29sZG93bigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwVG90cCgpOiB2b2lkIHtcbiAgICB0aGlzLndvcmtpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuYXV0aC5zZXR1cFRPVFAoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgdGhpcy50b3RwU2V0dXAuc2V0KHJlcyk7XG4gICAgICAgIHRoaXMucGluQ29udHJvbC5yZXNldCgpO1xuICAgICAgICB0aGlzLnFyR2VuXG4gICAgICAgICAgLmdlbmVyYXRlKHsgZGF0YTogcmVzLnFyQ29kZVVybCwgd2lkdGg6IDIyMCB9KVxuICAgICAgICAgIC50aGVuKHFyID0+IHRoaXMudG90cFFyLnNldChxcikpXG4gICAgICAgICAgLmNhdGNoKCgpID0+IHRoaXMudG90cFFyLnNldChudWxsKSk7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLl9zdGVwLnNldCgndG90cC1zZXR1cCcpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy5yZXNvbHZlRXJyb3IoZXJyKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFZlcmlmaWNhIGVsIGPDs2RpZ28gVE9UUCBkZSBsYSBhcHAgZGUgYXV0ZW50aWNhY2nDs24geSBhY3RpdmEgTUZBLiAqL1xuICB2ZXJpZnlUb3RwKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvZGUgPSB0aGlzLnBpbkNvbnRyb2wudmFsdWU7XG4gICAgaWYgKCFjb2RlIHx8IGNvZGUubGVuZ3RoICE9PSA2KSB7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYUNvZGVJbnZhbGlkJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLndvcmtpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuYXV0aC52ZXJpZnlUT1RQU2V0dXAoY29kZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICBpZiAocmVzLmVuYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYUVuYWJsZWRPaycpKTtcbiAgICAgICAgICB0aGlzLmNoYW5nZWQuZW1pdCgpO1xuICAgICAgICAgIHRoaXMucmVzb2x2ZVN0YXR1cygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQ29uZmlybWEgZWwgY8OzZGlnbyBFTUFJTC9TTVMgeSBhY3RpdmEgTUZBLiAqL1xuICBjb25maXJtQ29kZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb2RlID0gdGhpcy5waW5Db250cm9sLnZhbHVlO1xuICAgIGlmICghY29kZSB8fCBjb2RlLmxlbmd0aCAhPT0gNikge1xuICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFDb2RlSW52YWxpZCcpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy53b3JraW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmF1dGguY29uZmlybU1GQShjb2RlKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIGlmIChyZXMubWZhRW5hYmxlZCkge1xuICAgICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhRW5hYmxlZE9rJykpO1xuICAgICAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KCk7XG4gICAgICAgICAgdGhpcy5yZXNvbHZlU3RhdHVzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMucmVzb2x2ZUVycm9yKGVycikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWVudsOtYSBlbCBjw7NkaWdvIEVNQUlML1NNUyAocmUtZWplY3V0YSBlbCBzZXR1cCkuICovXG4gIHJlc2VuZENvZGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzZW5kQ29vbGRvd24oKSA+IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wcm9jZWVkV2l0aE1ldGhvZCgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEdlc3Rpw7NuIChNRkEgaGFiaWxpdGFkbylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFJlZ2VuZXJhIGxvcyBjw7NkaWdvcyBkZSByZXNwYWxkbyBUT1RQIHkgbG9zIG11ZXN0cmEgdW5hIHZlei4gKi9cbiAgcmVnZW5lcmF0ZUJhY2t1cENvZGVzKCk6IHZvaWQge1xuICAgIHRoaXMud29ya2luZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5hdXRoLnJlZ2VuZXJhdGVCYWNrdXBDb2RlcygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5iYWNrdXBDb2Rlc0NvdW50LnNldChyZXMuYmFja3VwQ29kZXMubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5yZWdlbmVyYXRlZENvZGVzLnNldChyZXMuYmFja3VwQ29kZXMpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy5yZXNvbHZlRXJyb3IoZXJyKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIERlc2hhYmlsaXRhIE1GQSDigJQgcmVxdWllcmUgbGEgY29udHJhc2XDsWEgZGUgbGEgY3VlbnRhLiAqL1xuICBvbkRpc2FibGVTdWJtaXQoZXZlbnQ6IEZvcm1TdWJtaXQpOiB2b2lkIHtcbiAgICBjb25zdCBwYXNzd29yZCA9IGV2ZW50LmZpZWxkc1sncGFzc3dvcmQnXTtcbiAgICBpZiAoIXBhc3N3b3JkKSB7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYVBhc3N3b3JkUmVxdWlyZWQnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMud29ya2luZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5hdXRoLmRpc2FibGVNRkEocGFzc3dvcmQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgaWYgKHJlcy5tZmFEaXNhYmxlZCkge1xuICAgICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhRGlzYWJsZWRPaycpKTtcbiAgICAgICAgICB0aGlzLmNoYW5nZWQuZW1pdCgpO1xuICAgICAgICAgIHRoaXMucmVzb2x2ZVN0YXR1cygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQ29waWEgdW5hIGxpc3RhIGRlIGPDs2RpZ29zIGRlIHJlc3BhbGRvIGFsIHBvcnRhcGFwZWxlcy4gKi9cbiAgYXN5bmMgY29weUNvZGVzKGNvZGVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChjb2Rlcy5qb2luKCdcXG4nKSk7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYUNvZGVzQ29waWVkJykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogc2luIHJlY3Vyc28gZGUgY29waWEgZGlzcG9uaWJsZSAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDb3BpYSBlbCBzZWNyZXRvIFRPVFAgYWwgcG9ydGFwYXBlbGVzICsgZmVlZGJhY2sgdmlzdWFsIChjaGVjaykgZHVyYW50ZSAycy4gKi9cbiAgYXN5bmMgY29weVNlY3JldChzZWNyZXQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzZWNyZXQpO1xuICAgICAgdGhpcy5jb3BpZWRTZWNyZXQuc2V0KHRydWUpO1xuICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFTZWNyZXRDb3BpZWQnKSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29waWVkU2VjcmV0LnNldChmYWxzZSksIDIwMDApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogc2luIHJlY3Vyc28gZGUgY29waWEgZGlzcG9uaWJsZSAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFdGlxdWV0YSBpMThuIGxlZ2libGUgcGFyYSB1biBtw6l0b2RvIE1GQS4gKi9cbiAgbWV0aG9kTGFiZWwobWV0aG9kOiBNRkFNZXRob2QgfCBudWxsKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnVE9UUCc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYU1ldGhvZFRvdHAnKTtcbiAgICAgIGNhc2UgJ0VNQUlMJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhTWV0aG9kRW1haWwnKTtcbiAgICAgIGNhc2UgJ1NNUyc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYU1ldGhvZFNtcycpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIZWxwZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgcmVzZXRGbG93KCk6IHZvaWQge1xuICAgIHRoaXMucGluQ29udHJvbC5yZXNldCgpO1xuICAgIHRoaXMucGhvbmVDb250cm9sLnJlc2V0KCk7XG4gICAgdGhpcy50b3RwU2V0dXAuc2V0KG51bGwpO1xuICAgIHRoaXMudG90cFFyLnNldChudWxsKTtcbiAgICB0aGlzLnJlZ2VuZXJhdGVkQ29kZXMuc2V0KG51bGwpO1xuICAgIHRoaXMuc2VsZWN0ZWRNZXRob2Quc2V0KCdUT1RQJyk7XG4gICAgdGhpcy5zdG9wQ29vbGRvd24oKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRDb29sZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BDb29sZG93bigpO1xuICAgIHRoaXMucmVzZW5kQ29vbGRvd24uc2V0KFJFU0VORF9DT09MRE9XTl9TRUNPTkRTKTtcbiAgICB0aGlzLnJlc2VuZFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5yZXNlbmRDb29sZG93bi51cGRhdGUodiA9PiB2IC0gMSk7XG4gICAgICBpZiAodGhpcy5yZXNlbmRDb29sZG93bigpIDw9IDApIHtcbiAgICAgICAgdGhpcy5zdG9wQ29vbGRvd24oKTtcbiAgICAgIH1cbiAgICB9LCAxMDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcENvb2xkb3duKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2VuZFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucmVzZW5kVGltZXIpO1xuICAgICAgdGhpcy5yZXNlbmRUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMucmVzZW5kQ29vbGRvd24uc2V0KDApO1xuICB9XG5cbiAgLyoqIE1hcGVhIGxvcyBjw7NkaWdvcyBkZSBlcnJvciBNRkEgZGVsIGJhY2tlbmQgYSBtZW5zYWplcyBkZWwgbmFtZXNwYWNlIGBfYXV0aGAuICovXG4gIHByaXZhdGUgcmVzb2x2ZUVycm9yKGVycjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgY29uc3QgY29kZSA9IChlcnIgYXMgeyBjb2RlPzogc3RyaW5nIH0pPy5jb2RlO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSAnQVVUSFYyX01GQV9JTlZBTElEX0NPREUnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdtZmFFcnJvckludmFsaWRDb2RlJyk7XG4gICAgICBjYXNlICdBVVRIVjJfRVhQSVJFRF9DT0RFJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhRXJyb3JFeHBpcmVkQ29kZScpO1xuICAgICAgY2FzZSAnQVVUSFYyX0NPREVfVVNFRCc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9yQ29kZVVzZWQnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9NRkFfQUxSRUFEWV9BQ1RJVkUnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdtZmFFcnJvckFscmVhZHlBY3RpdmUnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9NRkFfTk9UX0VOQUJMRUQnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdtZmFFcnJvck5vdEVuYWJsZWQnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9QSE9ORV9SRVFVSVJFRCc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9yUGhvbmVSZXF1aXJlZCcpO1xuICAgICAgY2FzZSAnQVVUSFYyX1BIT05FX0VYSVNUUyc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9yUGhvbmVFeGlzdHMnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9UT09fTUFOWV9BVFRFTVBUUyc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ2Vycm9yVG9vTWFueUF0dGVtcHRzJyk7XG4gICAgICBjYXNlICdBVVRIVjJfSU5WQUxJRF9DVVJSRU5UX1BBU1NXT1JEJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnZXJyb3JDdXJyZW50UGFzc3dvcmRXcm9uZycpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnZXJyb3JHZW5lcmljJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93VG9hc3QobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50b2FzdC5zaG93KHsgbWVzc2FnZSwgZHVyYXRpb246IDM1MDAgfSk7XG4gIH1cbn1cbiIsIjxpb24tbW9kYWwgW2lzT3Blbl09XCJpc09wZW5cIiAoZGlkRGlzbWlzcyk9XCJjbG9zZSgpXCI+XG4gIDxuZy10ZW1wbGF0ZT5cbiAgICA8aW9uLWhlYWRlcj5cbiAgICAgIDxpb24tdG9vbGJhcj5cbiAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxuICAgICAgICAgICAgPHN0cm9uZz57eyB0KCdjbG9zZScpIH19PC9zdHJvbmc+XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2lvbi1idXR0b25zPlxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICA8L2lvbi1oZWFkZXI+XG5cbiAgICA8aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJtZmEtbW9kYWxcIj5cbiAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ7IGNvbnRlbnQ6IHQoJ21mYU1hbmFnZVRpdGxlJyksIHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycgfVwiIC8+XG5cbiAgICAgICAgQHN3aXRjaCAoc3RlcCgpKSB7IEBjYXNlICgnbG9hZGluZycpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1sb2FkaW5nXCI+XG4gICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBjYXNlICgnc3RhdHVzJykgeyBAaWYgKG1mYUVuYWJsZWQoKSkge1xuICAgICAgICA8cCBjbGFzcz1cIm1mYS1zdGF0dXMgbWZhLXN0YXR1cy0tb25cIj57eyB0KCdtZmFFbmFibGVkTGFiZWwnKSB9fSDCtyB7eyBtZXRob2RMYWJlbChtZmFNZXRob2QoKSkgfX08L3A+XG5cbiAgICAgICAgQGlmIChtZmFNZXRob2QoKSA9PT0gJ1RPVFAnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtYmxvY2tcIj5cbiAgICAgICAgICA8aDM+e3sgdCgnbWZhQmFja3VwQ29kZXNUaXRsZScpIH19PC9oMz5cbiAgICAgICAgICA8cCBjbGFzcz1cIm1mYS10ZXh0XCI+e3sgdCgnbWZhQmFja3VwQ29kZXNBdmFpbGFibGUnKSB9fToge3sgYmFja3VwQ29kZXNDb3VudCgpIH19PC9wPlxuXG4gICAgICAgICAgQGlmIChyZWdlbmVyYXRlZENvZGVzKCk7IGFzIGNvZGVzKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1hbGVydFwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJpbmZvcm1hdGlvbi1jaXJjbGUtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8cD57eyB0KCdtZmFCYWNrdXBDb2Rlc1NhdmVXYXJuaW5nJykgfX0ge3sgdCgnbWZhQmFja3VwQ29kZXNFeHBsYWluJykgfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1jb2Rlc1wiPlxuICAgICAgICAgICAgQGZvciAoY29kZSBvZiBjb2RlczsgdHJhY2sgY29kZSkge1xuICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJtZmEtY29kZVwiPnt7IGNvZGUgfX08L2NvZGU+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cImRhcmtcIiBmaWxsPVwib3V0bGluZVwiIChjbGljayk9XCJjb3B5Q29kZXMoY29kZXMpXCI+XG4gICAgICAgICAgICB7eyB0KCdtZmFDb3B5Q29kZXMnKSB9fVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICB9IEBlbHNlIHsgQGlmIChiYWNrdXBDb2Rlc0NvdW50KCkgPCAzKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1hbGVydFwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJpbmZvcm1hdGlvbi1jaXJjbGUtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8cD57eyB0KCdtZmFCYWNrdXBDb2Rlc0xvdycpIH19PC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgZXhwYW5kPVwiYmxvY2tcIlxuICAgICAgICAgICAgY29sb3I9XCJkYXJrXCJcbiAgICAgICAgICAgIGZpbGw9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInJlZ2VuZXJhdGVCYWNrdXBDb2RlcygpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKHdvcmtpbmcoKSkge1xuICAgICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhUmVnZW5lcmF0ZUNvZGVzJykgfX0gfVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cImRhcmtcIiBmaWxsPVwib3V0bGluZVwiIChjbGljayk9XCJnb1RvRGlzYWJsZSgpXCI+XG4gICAgICAgICAge3sgdCgnbWZhRGlzYWJsZUJ1dHRvbicpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxwIGNsYXNzPVwibWZhLXN0YXR1cyBtZmEtc3RhdHVzLS1vZmZcIj57eyB0KCdtZmFEaXNhYmxlZExhYmVsJykgfX08L3A+XG4gICAgICAgIDxwIGNsYXNzPVwibWZhLXRleHRcIj57eyB0KCdtZmFEaXNhYmxlZEhpbnQnKSB9fTwvcD5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiAoY2xpY2spPVwiZ29Ub01ldGhvZFNlbGVjdCgpXCI+IHt7IHQoJ21mYUVuYWJsZUJ1dHRvbicpIH19IDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSB9IEBjYXNlICgnbWV0aG9kLXNlbGVjdCcpIHtcbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiB0KCdtZmFFbmFibGVUaXRsZScpLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuICAgICAgICA8cCBjbGFzcz1cIm1mYS10ZXh0XCI+e3sgdCgnbWZhTWV0aG9kUHJvbXB0JykgfX08L3A+XG5cbiAgICAgICAgPGlvbi1yYWRpby1ncm91cCBbdmFsdWVdPVwic2VsZWN0ZWRNZXRob2QoKVwiIChpb25DaGFuZ2UpPVwic2VsZWN0ZWRNZXRob2Quc2V0KCRldmVudC5kZXRhaWwudmFsdWUpXCI+XG4gICAgICAgICAgPGlvbi1pdGVtPlxuICAgICAgICAgICAgPGlvbi1yYWRpbyBzbG90PVwic3RhcnRcIiB2YWx1ZT1cIlRPVFBcIj48L2lvbi1yYWRpbz5cbiAgICAgICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnbWZhTWV0aG9kVG90cCcpIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDxwPnt7IHQoJ21mYU1ldGhvZFRvdHBIaW50JykgfX08L3A+XG4gICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICAgIDxpb24taXRlbT5cbiAgICAgICAgICAgIDxpb24tcmFkaW8gc2xvdD1cInN0YXJ0XCIgdmFsdWU9XCJFTUFJTFwiPjwvaW9uLXJhZGlvPlxuICAgICAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICAgICAgPHN0cm9uZz57eyB0KCdtZmFNZXRob2RFbWFpbCcpIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDxwPnt7IHQoJ21mYU1ldGhvZEVtYWlsSGludCcpIH19PC9wPlxuICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICA8aW9uLWl0ZW0+XG4gICAgICAgICAgICA8aW9uLXJhZGlvIHNsb3Q9XCJzdGFydFwiIHZhbHVlPVwiU01TXCI+PC9pb24tcmFkaW8+XG4gICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICA8c3Ryb25nPnt7IHQoJ21mYU1ldGhvZFNtcycpIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDxwPnt7IHQoJ21mYU1ldGhvZFNtc0hpbnQnKSB9fTwvcD5cbiAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgIDwvaW9uLXJhZGlvLWdyb3VwPlxuXG4gICAgICAgIEBpZiAoc2VsZWN0ZWRNZXRob2QoKSA9PT0gJ1NNUycgJiYgIXVzZXJQaG9uZSgpKSB7XG4gICAgICAgIDxpb24taW5wdXRcbiAgICAgICAgICBsYWJlbD1cInt7IHQoJ21mYVBob25lTGFiZWwnKSB9fVwiXG4gICAgICAgICAgbGFiZWxQbGFjZW1lbnQ9XCJmbG9hdGluZ1wiXG4gICAgICAgICAgZmlsbD1cIm91dGxpbmVcIlxuICAgICAgICAgIHR5cGU9XCJ0ZWxcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiKzU2OTEyMzQ1Njc4XCJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicGhvbmVDb250cm9sXCJcbiAgICAgICAgPjwvaW9uLWlucHV0PlxuICAgICAgICBAaWYgKHBob25lQ29udHJvbC5pbnZhbGlkICYmIHBob25lQ29udHJvbC50b3VjaGVkKSB7XG4gICAgICAgIDxwIGNsYXNzPVwibWZhLWVycm9yXCI+e3sgdCgnbWZhUGhvbmVJbnZhbGlkJykgfX08L3A+XG4gICAgICAgIH0gfSBAaWYgKHNlbGVjdGVkTWV0aG9kKCkgPT09ICdTTVMnICYmIHVzZXJQaG9uZSgpOyBhcyBwaG9uZSkge1xuICAgICAgICA8cCBjbGFzcz1cIm1mYS10ZXh0XCI+e3sgdCgnbWZhUGhvbmVSZWdpc3RlcmVkJykgfX06IHt7IHBob25lIH19PC9wPlxuICAgICAgICB9XG5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBbZGlzYWJsZWRdPVwid29ya2luZygpXCIgKGNsaWNrKT1cInByb2NlZWRXaXRoTWV0aG9kKClcIj5cbiAgICAgICAgICBAaWYgKHdvcmtpbmcoKSkge1xuICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgIH0gQGVsc2UgeyB7eyB0KCdtZmFDb250aW51ZScpIH19IH1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJiYWNrVG9TdGF0dXMoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYUNhbmNlbCcpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAY2FzZSAoJ3RvdHAtc2V0dXAnKSB7XG4gICAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgY29udGVudDogdCgnbWZhVG90cFNldHVwVGl0bGUnKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICcnLCBib2xkOiBmYWxzZSB9XCIgLz5cbiAgICAgICAgPHAgY2xhc3M9XCJtZmEtdGV4dFwiPnt7IHQoJ21mYVRvdHBTdGVwMScpIH19PC9wPlxuXG4gICAgICAgIEBpZiAodG90cFFyKCk7IGFzIHFyKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtcXJcIj5cbiAgICAgICAgICA8dmFsLXFyLWNvZGUgW3Byb3BzXT1cInsgcXI6IHFyIH1cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAaWYgKHRvdHBTZXR1cCgpOyBhcyBzZXR1cCkge1xuICAgICAgICA8cCBjbGFzcz1cIm1mYS10ZXh0XCI+e3sgdCgnbWZhVG90cE1hbnVhbEVudHJ5JykgfX08L3A+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtc2VjcmV0LXJvd1wiPlxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwibWZhLXNlY3JldFwiPnt7IHNldHVwLnNlY3JldCB9fTwvY29kZT5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBzaXplPVwic21hbGxcIiAoY2xpY2spPVwiY29weVNlY3JldChzZXR1cC5zZWNyZXQpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCdjb3B5JylcIj5cbiAgICAgICAgICAgIEBpZiAoY29waWVkU2VjcmV0KCkpIHtcbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hlY2ttYXJrLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNvcHktb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8cCBjbGFzcz1cIm1mYS10ZXh0XCI+e3sgdCgnbWZhVG90cFN0ZXAyJykgfX08L3A+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtcGluXCI+XG4gICAgICAgICAgPHZhbC1waW4taW5wdXQgW3Byb3BzXT1cInBpbklucHV0UHJvcHNcIiAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIiAoY2xpY2spPVwidmVyaWZ5VG90cCgpXCI+XG4gICAgICAgICAgQGlmICh3b3JraW5nKCkpIHtcbiAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhVG90cFZlcmlmeScpIH19IH1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtYmFja3VwXCI+XG4gICAgICAgICAgPGgzPnt7IHQoJ21mYUJhY2t1cENvZGVzVGl0bGUnKSB9fTwvaDM+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1hbGVydFwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJpbmZvcm1hdGlvbi1jaXJjbGUtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8cD57eyB0KCdtZmFCYWNrdXBDb2Rlc1NhdmVXYXJuaW5nJykgfX0ge3sgdCgnbWZhQmFja3VwQ29kZXNFeHBsYWluJykgfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1jb2Rlc1wiPlxuICAgICAgICAgICAgQGZvciAoY29kZSBvZiBzZXR1cC5iYWNrdXBDb2RlczsgdHJhY2sgY29kZSkge1xuICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJtZmEtY29kZVwiPnt7IGNvZGUgfX08L2NvZGU+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cImRhcmtcIiBmaWxsPVwib3V0bGluZVwiIChjbGljayk9XCJjb3B5Q29kZXMoc2V0dXAuYmFja3VwQ29kZXMpXCI+XG4gICAgICAgICAgICB7eyB0KCdtZmFDb3B5Q29kZXMnKSB9fVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJiYWNrVG9TdGF0dXMoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYUNhbmNlbCcpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAY2FzZSAoJ2NvZGUtY29uZmlybScpIHtcbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiB0KCdtZmFDb25maXJtVGl0bGUnKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICcnLCBib2xkOiBmYWxzZSB9XCIgLz5cbiAgICAgICAgPHAgY2xhc3M9XCJtZmEtdGV4dFwiPlxuICAgICAgICAgIHt7IHNlbGVjdGVkTWV0aG9kKCkgPT09ICdFTUFJTCcgPyB0KCdtZmFDb25maXJtUHJvbXB0RW1haWwnKSA6IHQoJ21mYUNvbmZpcm1Qcm9tcHRTbXMnKSB9fVxuICAgICAgICA8L3A+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1waW5cIj5cbiAgICAgICAgICA8dmFsLXBpbi1pbnB1dCBbcHJvcHNdPVwicGluSW5wdXRQcm9wc1wiIC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgW2Rpc2FibGVkXT1cIndvcmtpbmcoKVwiIChjbGljayk9XCJjb25maXJtQ29kZSgpXCI+XG4gICAgICAgICAgQGlmICh3b3JraW5nKCkpIHtcbiAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhQ29uZmlybUJ1dHRvbicpIH19IH1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICAgIDxwIGNsYXNzPVwibWZhLXJlc2VuZFwiPlxuICAgICAgICAgIHt7IHQoJ21mYU5vQ29kZScpIH19IEBpZiAocmVzZW5kQ29vbGRvd24oKSA+IDApIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1mYS10ZXh0XCI+e3sgdCgnbWZhUmVzZW5kSW4nKSB9fSB7eyByZXNlbmRDb29sZG93bigpIH19czwvc3Bhbj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8YSAoY2xpY2spPVwicmVzZW5kQ29kZSgpXCI+e3sgdCgnbWZhUmVzZW5kJykgfX08L2E+XG4gICAgICAgICAgfVxuICAgICAgICA8L3A+XG5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiYmFja1RvU3RhdHVzKClcIj5cbiAgICAgICAgICB7eyB0KCdtZmFDYW5jZWwnKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIH0gQGNhc2UgKCdkaXNhYmxlJykge1xuICAgICAgICA8dmFsLWZvcm0gW3Byb3BzXT1cImRpc2FibGVGb3JtUHJvcHMoKVwiIChvblN1Ym1pdCk9XCJvbkRpc2FibGVTdWJtaXQoJGV2ZW50KVwiIC8+XG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImJhY2tUb1N0YXR1cygpXCI+XG4gICAgICAgICAge3sgdCgnbWZhQ2FuY2VsJykgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICB9IH1cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2lvbi1jb250ZW50PlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tbW9kYWw+XG4iXX0=
|
|
@@ -3,6 +3,14 @@ import { ChangeDetectorRef, Component, EventEmitter, inject, Input, Output, } fr
|
|
|
3
3
|
import { goToTop } from '../../../shared/utils/dom';
|
|
4
4
|
import { ContentLoaderComponent } from '../../molecules/content-loader/content-loader.component';
|
|
5
5
|
import { ComponentStates } from '../../types';
|
|
6
|
+
// TODO(empty-state): migrar a `<val-empty-state>` (molecule en
|
|
7
|
+
// `components/molecules/empty-state/`). El `val-no-content` viejo usa @Input
|
|
8
|
+
// clásico + hack de setTimeout(detectChanges), está fuera de las convenciones
|
|
9
|
+
// signal/OnPush actuales y solo lo consume este wizard. El nuevo
|
|
10
|
+
// `<val-empty-state>` cubre los dos casos del template (header step + error
|
|
11
|
+
// state) con `EmptyStateMetadata` + variantes `empty`/`error` + el helper
|
|
12
|
+
// `createErrorStateProps()` para wiring desde un error capturado.
|
|
13
|
+
// Una vez migrado: deprecar y borrar `val-no-content` + su organism dir.
|
|
6
14
|
import { NoContentComponent } from '../no-content/no-content.component';
|
|
7
15
|
import { MOTION } from './types';
|
|
8
16
|
import * as i0 from "@angular/core";
|
|
@@ -158,4 +166,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
158
166
|
}], onClick: [{
|
|
159
167
|
type: Output
|
|
160
168
|
}] } });
|
|
161
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvd2l6YXJkL3dpemFyZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDakcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsTUFBTSxFQUF3QixNQUFNLFNBQVMsQ0FBQzs7O0FBK0J2RCxNQUFNLE9BQU8sZUFBZTtJQTdCNUI7UUFrQ0UsWUFBTyxHQUFHLElBQUksWUFBWSxFQUF1QyxDQUFDO1FBRWxFLGNBQVMsR0FBRyxnQkFBZ0IsQ0FBQztRQUM3QixnQkFBVyxHQUFnQixJQUFJLENBQUM7UUFDaEMsc0JBQWlCLEdBQVEsSUFBSSxDQUFDO1FBQzlCLGdCQUFXLEdBQUcscUJBQXFCLENBQUM7UUFFNUIsUUFBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0tBeUd6QztJQXZHQyxRQUFRO1FBQ04sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxD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QUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLENBQUM7K0dBcEhVLGVBQWU7bUdBQWYsZUFBZSx3SkF6QmhCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JULHU2RkF2QlMsWUFBWSxtSUFBRSxrQkFBa0Isb0dBQUUsc0JBQXNCOzs0RkEwQnZELGVBQWU7a0JBN0IzQixTQUFTOytCQUNFLFlBQVksY0FDVixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLENBQUMsWUFDekQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQlQ7OEJBS0QsS0FBSztzQkFESixLQUFLO2dCQUlOLE9BQU87c0JBRE4sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ29Ub1RvcCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC91dGlscy9kb20nO1xuaW1wb3J0IHsgQ29udGVudExvYWRlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9jb250ZW50LWxvYWRlci9jb250ZW50LWxvYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50U3RhdGVzIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgTm9Db250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vbm8tY29udGVudC9uby1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNT1RJT04sIFN0ZXAsIFdpemFyZE1ldGFkYXRhIH0gZnJvbSAnLi90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC13aXphcmQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBOb0NvbnRlbnRDb21wb25lbnQsIENvbnRlbnRMb2FkZXJDb21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgW2lkXT1cIndyYXBwZXJJZFwiIGNsYXNzPVwid3JhcHBlclwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BzLnN0YXRlICE9PSAnRVJST1InXCI+XG4gICAgICAgIDx2YWwtbm8tY29udGVudCBbcHJvcHNdPVwiY3VycmVudFN0ZXBUaXRsZXNcIiBbYXR0ci5kYXRhLXN0ZXBdPVwicHJvcHMuY3VycmVudFwiPjwvdmFsLW5vLWNvbnRlbnQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdGVwXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInByb3BzLnN0YXRlID09PSAnV09SS0lORydcIj5cbiAgICAgICAgICAgIDx2YWwtY29udGVudC1sb2FkZXJcbiAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICBuYW1lOiAnY2lyY3VsYXInLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAncHJpbWFyeScsXG4gICAgICAgICAgICAgICAgc2l6ZTogJ2xhcmdlJyxcbiAgICAgICAgICAgICAgICB0ZXh0OiBsb2FkaW5nVGV4dCxcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltzdGVwXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcm9wcy5zdGF0ZSA9PT0gJ0VSUk9SJ1wiPlxuICAgICAgICA8dmFsLW5vLWNvbnRlbnQgW3Byb3BzXT1cInByb3BzLmVycm9yLnRpdGxlc1wiIChvbkNsaWNrKT1cImNsaWNrSGFuZGxlcigkZXZlbnQpXCI+PC92YWwtbm8tY29udGVudD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi93aXphcmQuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgV2l6YXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKVxuICBwcm9wczogV2l6YXJkTWV0YWRhdGE7XG5cbiAgQE91dHB1dCgpXG4gIG9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHsgY3VycmVudDogbnVtYmVyOyBtb3Rpb246IE1PVElPTiB9PigpO1xuXG4gIHdyYXBwZXJJZCA9ICd3aXphcmQtd3JhcHBlcic7XG4gIGN1cnJlbnRTdGVwOiBTdGVwIHwgbnVsbCA9IG51bGw7XG4gIGN1cnJlbnRTdGVwVGl0bGVzOiBhbnkgPSBudWxsO1xuICBsb2FkaW5nVGV4dCA9ICdQb3IgZmF2b3IgZXNwZXJlLi4uJztcblxuICBwcml2YXRlIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGRhdGVDdXJyZW50U3RlcCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydwcm9wcyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTdGVwKCk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDdXJyZW50U3RlcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcm9wcz8uc3RlcHMgJiYgdGhpcy5wcm9wcz8uY3VycmVudCkge1xuICAgICAgdGhpcy5jdXJyZW50U3RlcCA9IHRoaXMucHJvcHMuc3RlcHNbdGhpcy5wcm9wcy5jdXJyZW50XTtcbiAgICAgIC8vIEZvcnphciBudWV2YSByZWZlcmVuY2lhIGRlIG9iamV0byBwYXJhIGFzZWd1cmFyIGRldGVjY2nDs24gZGUgY2FtYmlvc1xuICAgICAgLy8gQWdyZWdhciB0aW1lc3RhbXAgcGFyYSBnYXJhbnRpemFyIHF1ZSBlcyB1biBvYmpldG8gY29tcGxldGFtZW50ZSBudWV2b1xuICAgICAgdGhpcy5jdXJyZW50U3RlcFRpdGxlcyA9IHRoaXMuY3VycmVudFN0ZXA/LnRpdGxlc1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jdXJyZW50U3RlcC50aXRsZXMpKSxcbiAgICAgICAgICAgIF90aW1lc3RhbXA6IERhdGUubm93KCksIC8vIEZvcnphciBudWV2YSByZWZlcmVuY2lhXG4gICAgICAgICAgICBfc3RlcDogdGhpcy5wcm9wcy5jdXJyZW50LCAvLyBBZ3JlZ2FyIGlkZW50aWZpY2Fkb3IgZGVsIHBhc29cbiAgICAgICAgICB9XG4gICAgICAgIDogbnVsbDtcblxuICAgICAgLy8gRm9yemFyIGRldGVjY2nDs24gZGUgY2FtYmlvcyBpbm1lZGlhdGFtZW50ZVxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtpbmcoKSB7XG4gICAgdGhpcy5wcm9wcy5zdGF0ZSA9IENvbXBvbmVudFN0YXRlcy5XT1JLSU5HO1xuICAgIGlmICh0aGlzLkN1cnJlbnQ/LmJ1dHRvbnMpIHtcbiAgICAgIHRoaXMuQ3VycmVudC5idXR0b25zLmZvckVhY2goYnV0dG9uID0+IHtcbiAgICAgICAgYnV0dG9uLnN0YXRlID0gQ29tcG9uZW50U3RhdGVzLkRJU0FCTEVEO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZG9uZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5zdGF0ZSA9PT0gQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByb3BzLnN0YXRlID0gQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQ7XG4gICAgaWYgKHRoaXMuQ3VycmVudD8uYnV0dG9ucykge1xuICAgICAgdGhpcy5DdXJyZW50LmJ1dHRvbnMuZm9yRWFjaChidXR0b24gPT4ge1xuICAgICAgICBidXR0b24uc3RhdGUgPSBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCBDdXJyZW50KCk6IFN0ZXAge1xuICAgIGlmICh0aGlzLnByb3BzPy5zdGVwcyAmJiB0aGlzLnByb3BzPy5jdXJyZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5zdGVwc1t0aGlzLnByb3BzLmN1cnJlbnRdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RlcCB8fCB7IHRpdGxlczogbnVsbCwgYnV0dG9uczogW10gfTtcbiAgfVxuXG4gIHNldEN1cnJlbnQobmV3U3RlcDogbnVtYmVyKSB7XG4gICAgaWYgKG5ld1N0ZXAgPT09IHRoaXMucHJvcHMuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJvcHMuY3VycmVudCA9IG5ld1N0ZXA7XG4gICAgdGhpcy51cGRhdGVDdXJyZW50U3RlcCgpO1xuXG4gICAgLy8gRm9yemFyIG3Dumx0aXBsZXMgY2ljbG9zIGRlIGRldGVjY2nDs24gZGUgY2FtYmlvc1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9LCAwKTtcblxuICAgIGdvVG9Ub3AodGhpcy53cmFwcGVySWQpO1xuICB9XG5cbiAgc2V0RXJyb3IoZXJyb3I6IHN0cmluZykge1xuICAgIGlmICh0aGlzLnByb3BzLnN0YXRlID09PSBDb21wb25lbnRTdGF0ZXMuRVJST1IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByb3BzLmVycm9yLnRpdGxlcy5ib3R0b21Db250ZW50LmNvbnRlbnQuYmVsbG93VGl0bGUuY29udGVudCA9IGVycm9yO1xuICAgIHRoaXMucHJvcHMuc3RhdGUgPSBDb21wb25lbnRTdGF0ZXMuRVJST1I7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgZ29Ub1RvcCh0aGlzLndyYXBwZXJJZCk7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLnByb3BzLmVycm9yLnRpdGxlcy5ib3R0b21Db250ZW50LmNvbnRlbnQuYmVsbG93VGl0bGUuY29udGVudCA9ICcnO1xuICAgIHRoaXMuZG9uZSgpO1xuICB9XG5cbiAgY2xpY2tIYW5kbGVyKHRva2VuPzogc3RyaW5nKSB7XG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodG9rZW4uaW5jbHVkZXMoJ3JldHJ5JykpIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICB0aGlzLm9uQ2xpY2suZW1pdCh7IGN1cnJlbnQ6IHRoaXMucHJvcHMuY3VycmVudCwgbW90aW9uOiBNT1RJT04uUkVUUlkgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvd2l6YXJkL3dpemFyZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDakcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM5QywrREFBK0Q7QUFDL0QsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSxpRUFBaUU7QUFDakUsNEVBQTRFO0FBQzVFLDBFQUEwRTtBQUMxRSxrRUFBa0U7QUFDbEUseUVBQXlFO0FBQ3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxNQUFNLEVBQXdCLE1BQU0sU0FBUyxDQUFDOzs7QUErQnZELE1BQU0sT0FBTyxlQUFlO0lBN0I1QjtRQWtDRSxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQXVDLENBQUM7UUFFbEUsY0FBUyxHQUFHLGdCQUFnQixDQUFDO1FBQzdCLGdCQUFXLEdBQWdCLElBQUksQ0FBQztRQUNoQyxzQkFBaUIsR0FBUSxJQUFJLENBQUM7UUFDOUIsZ0JBQVcsR0FBRyxxQkFBcUIsQ0FBQztRQUU1QixRQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7S0F5R3pDO0lBdkdDLFFBQVE7UUFDTixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FB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QUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDM0UsQ0FBQzsrR0FwSFUsZUFBZTttR0FBZixlQUFlLHdKQXpCaEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQlQsdTZGQXZCUyxZQUFZLG1JQUFFLGtCQUFrQixvR0FBRSxzQkFBc0I7OzRGQTBCdkQsZUFBZTtrQkE3QjNCLFNBQVM7K0JBQ0UsWUFBWSxjQUNWLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsQ0FBQyxZQUN6RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCVDs4QkFLRCxLQUFLO3NCQURKLEtBQUs7Z0JBSU4sT0FBTztzQkFETixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBnb1RvVG9wIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3V0aWxzL2RvbSc7XG5pbXBvcnQgeyBDb250ZW50TG9hZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL2NvbnRlbnQtbG9hZGVyL2NvbnRlbnQtbG9hZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRTdGF0ZXMgfSBmcm9tICcuLi8uLi90eXBlcyc7XG4vLyBUT0RPKGVtcHR5LXN0YXRlKTogbWlncmFyIGEgYDx2YWwtZW1wdHktc3RhdGU+YCAobW9sZWN1bGUgZW5cbi8vIGBjb21wb25lbnRzL21vbGVjdWxlcy9lbXB0eS1zdGF0ZS9gKS4gRWwgYHZhbC1uby1jb250ZW50YCB2aWVqbyB1c2EgQElucHV0XG4vLyBjbMOhc2ljbyArIGhhY2sgZGUgc2V0VGltZW91dChkZXRlY3RDaGFuZ2VzKSwgZXN0w6EgZnVlcmEgZGUgbGFzIGNvbnZlbmNpb25lc1xuLy8gc2lnbmFsL09uUHVzaCBhY3R1YWxlcyB5IHNvbG8gbG8gY29uc3VtZSBlc3RlIHdpemFyZC4gRWwgbnVldm9cbi8vIGA8dmFsLWVtcHR5LXN0YXRlPmAgY3VicmUgbG9zIGRvcyBjYXNvcyBkZWwgdGVtcGxhdGUgKGhlYWRlciBzdGVwICsgZXJyb3Jcbi8vIHN0YXRlKSBjb24gYEVtcHR5U3RhdGVNZXRhZGF0YWAgKyB2YXJpYW50ZXMgYGVtcHR5YC9gZXJyb3JgICsgZWwgaGVscGVyXG4vLyBgY3JlYXRlRXJyb3JTdGF0ZVByb3BzKClgIHBhcmEgd2lyaW5nIGRlc2RlIHVuIGVycm9yIGNhcHR1cmFkby5cbi8vIFVuYSB2ZXogbWlncmFkbzogZGVwcmVjYXIgeSBib3JyYXIgYHZhbC1uby1jb250ZW50YCArIHN1IG9yZ2FuaXNtIGRpci5cbmltcG9ydCB7IE5vQ29udGVudENvbXBvbmVudCB9IGZyb20gJy4uL25vLWNvbnRlbnQvbm8tY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTU9USU9OLCBTdGVwLCBXaXphcmRNZXRhZGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtd2l6YXJkJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTm9Db250ZW50Q29tcG9uZW50LCBDb250ZW50TG9hZGVyQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtpZF09XCJ3cmFwcGVySWRcIiBjbGFzcz1cIndyYXBwZXJcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcm9wcy5zdGF0ZSAhPT0gJ0VSUk9SJ1wiPlxuICAgICAgICA8dmFsLW5vLWNvbnRlbnQgW3Byb3BzXT1cImN1cnJlbnRTdGVwVGl0bGVzXCIgW2F0dHIuZGF0YS1zdGVwXT1cInByb3BzLmN1cnJlbnRcIj48L3ZhbC1uby1jb250ZW50PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RlcFwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wcy5zdGF0ZSA9PT0gJ1dPUktJTkcnXCI+XG4gICAgICAgICAgICA8dmFsLWNvbnRlbnQtbG9hZGVyXG4gICAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2NpcmN1bGFyJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxuICAgICAgICAgICAgICAgIHNpemU6ICdsYXJnZScsXG4gICAgICAgICAgICAgICAgdGV4dDogbG9hZGluZ1RleHQsXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbc3RlcF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJvcHMuc3RhdGUgPT09ICdFUlJPUidcIj5cbiAgICAgICAgPHZhbC1uby1jb250ZW50IFtwcm9wc109XCJwcm9wcy5lcnJvci50aXRsZXNcIiAob25DbGljayk9XCJjbGlja0hhbmRsZXIoJGV2ZW50KVwiPjwvdmFsLW5vLWNvbnRlbnQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vd2l6YXJkLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFdpemFyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KClcbiAgcHJvcHM6IFdpemFyZE1ldGFkYXRhO1xuXG4gIEBPdXRwdXQoKVxuICBvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7IGN1cnJlbnQ6IG51bWJlcjsgbW90aW9uOiBNT1RJT04gfT4oKTtcblxuICB3cmFwcGVySWQgPSAnd2l6YXJkLXdyYXBwZXInO1xuICBjdXJyZW50U3RlcDogU3RlcCB8IG51bGwgPSBudWxsO1xuICBjdXJyZW50U3RlcFRpdGxlczogYW55ID0gbnVsbDtcbiAgbG9hZGluZ1RleHQgPSAnUG9yIGZhdm9yIGVzcGVyZS4uLic7XG5cbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMudXBkYXRlQ3VycmVudFN0ZXAoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sncHJvcHMnXSkge1xuICAgICAgdGhpcy51cGRhdGVDdXJyZW50U3RlcCgpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ3VycmVudFN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJvcHM/LnN0ZXBzICYmIHRoaXMucHJvcHM/LmN1cnJlbnQpIHtcbiAgICAgIHRoaXMuY3VycmVudFN0ZXAgPSB0aGlzLnByb3BzLnN0ZXBzW3RoaXMucHJvcHMuY3VycmVudF07XG4gICAgICAvLyBGb3J6YXIgbnVldmEgcmVmZXJlbmNpYSBkZSBvYmpldG8gcGFyYSBhc2VndXJhciBkZXRlY2Npw7NuIGRlIGNhbWJpb3NcbiAgICAgIC8vIEFncmVnYXIgdGltZXN0YW1wIHBhcmEgZ2FyYW50aXphciBxdWUgZXMgdW4gb2JqZXRvIGNvbXBsZXRhbWVudGUgbnVldm9cbiAgICAgIHRoaXMuY3VycmVudFN0ZXBUaXRsZXMgPSB0aGlzLmN1cnJlbnRTdGVwPy50aXRsZXNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY3VycmVudFN0ZXAudGl0bGVzKSksXG4gICAgICAgICAgICBfdGltZXN0YW1wOiBEYXRlLm5vdygpLCAvLyBGb3J6YXIgbnVldmEgcmVmZXJlbmNpYVxuICAgICAgICAgICAgX3N0ZXA6IHRoaXMucHJvcHMuY3VycmVudCwgLy8gQWdyZWdhciBpZGVudGlmaWNhZG9yIGRlbCBwYXNvXG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGw7XG5cbiAgICAgIC8vIEZvcnphciBkZXRlY2Npw7NuIGRlIGNhbWJpb3MgaW5tZWRpYXRhbWVudGVcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICB3b3JraW5nKCkge1xuICAgIHRoaXMucHJvcHMuc3RhdGUgPSBDb21wb25lbnRTdGF0ZXMuV09SS0lORztcbiAgICBpZiAodGhpcy5DdXJyZW50Py5idXR0b25zKSB7XG4gICAgICB0aGlzLkN1cnJlbnQuYnV0dG9ucy5mb3JFYWNoKGJ1dHRvbiA9PiB7XG4gICAgICAgIGJ1dHRvbi5zdGF0ZSA9IENvbXBvbmVudFN0YXRlcy5ESVNBQkxFRDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGRvbmUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc3RhdGUgPT09IENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wcm9wcy5zdGF0ZSA9IENvbXBvbmVudFN0YXRlcy5FTkFCTEVEO1xuICAgIGlmICh0aGlzLkN1cnJlbnQ/LmJ1dHRvbnMpIHtcbiAgICAgIHRoaXMuQ3VycmVudC5idXR0b25zLmZvckVhY2goYnV0dG9uID0+IHtcbiAgICAgICAgYnV0dG9uLnN0YXRlID0gQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgQ3VycmVudCgpOiBTdGVwIHtcbiAgICBpZiAodGhpcy5wcm9wcz8uc3RlcHMgJiYgdGhpcy5wcm9wcz8uY3VycmVudCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuc3RlcHNbdGhpcy5wcm9wcy5jdXJyZW50XTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0ZXAgfHwgeyB0aXRsZXM6IG51bGwsIGJ1dHRvbnM6IFtdIH07XG4gIH1cblxuICBzZXRDdXJyZW50KG5ld1N0ZXA6IG51bWJlcikge1xuICAgIGlmIChuZXdTdGVwID09PSB0aGlzLnByb3BzLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByb3BzLmN1cnJlbnQgPSBuZXdTdGVwO1xuICAgIHRoaXMudXBkYXRlQ3VycmVudFN0ZXAoKTtcblxuICAgIC8vIEZvcnphciBtw7psdGlwbGVzIGNpY2xvcyBkZSBkZXRlY2Npw7NuIGRlIGNhbWJpb3NcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSwgMCk7XG5cbiAgICBnb1RvVG9wKHRoaXMud3JhcHBlcklkKTtcbiAgfVxuXG4gIHNldEVycm9yKGVycm9yOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5zdGF0ZSA9PT0gQ29tcG9uZW50U3RhdGVzLkVSUk9SKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wcm9wcy5lcnJvci50aXRsZXMuYm90dG9tQ29udGVudC5jb250ZW50LmJlbGxvd1RpdGxlLmNvbnRlbnQgPSBlcnJvcjtcbiAgICB0aGlzLnByb3BzLnN0YXRlID0gQ29tcG9uZW50U3RhdGVzLkVSUk9SO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIGdvVG9Ub3AodGhpcy53cmFwcGVySWQpO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5wcm9wcy5lcnJvci50aXRsZXMuYm90dG9tQ29udGVudC5jb250ZW50LmJlbGxvd1RpdGxlLmNvbnRlbnQgPSAnJztcbiAgICB0aGlzLmRvbmUoKTtcbiAgfVxuXG4gIGNsaWNrSGFuZGxlcih0b2tlbj86IHN0cmluZykge1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRva2VuLmluY2x1ZGVzKCdyZXRyeScpKSB7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5vbkNsaWNrLmVtaXQoeyBjdXJyZW50OiB0aGlzLnByb3BzLmN1cnJlbnQsIG1vdGlvbjogTU9USU9OLlJFVFJZIH0pO1xuICB9XG59XG4iXX0=
|