valtech-components 4.0.57 → 4.0.59
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.
|
@@ -9,6 +9,7 @@ import { QrCodeComponent } from '../../atoms/qr-code/qr-code.component';
|
|
|
9
9
|
import { TextComponent } from '../../atoms/text/text.component';
|
|
10
10
|
import { TitleComponent } from '../../atoms/title/title.component';
|
|
11
11
|
import { PinInputComponent } from '../../molecules/pin-input/pin-input.component';
|
|
12
|
+
import { PhoneInputComponent } from '../../molecules/phone-input/phone-input.component';
|
|
12
13
|
import { ComponentStates, InputType } from '../../types';
|
|
13
14
|
import { FormComponent } from '../form/form.component';
|
|
14
15
|
import { AuthService } from '../../../services/auth';
|
|
@@ -16,7 +17,6 @@ import { I18nService, InputI18nHelper } from '../../../services/i18n';
|
|
|
16
17
|
import { QrGeneratorService } from '../../../services/qr-generator/qr-generator.service';
|
|
17
18
|
import { ToastService } from '../../../services/toast.service';
|
|
18
19
|
import * as i0 from "@angular/core";
|
|
19
|
-
import * as i1 from "@angular/forms";
|
|
20
20
|
/** Segundos de espera antes de poder reenviar el código EMAIL/SMS. */
|
|
21
21
|
const RESEND_COOLDOWN_SECONDS = 30;
|
|
22
22
|
/**
|
|
@@ -498,7 +498,7 @@ export class MfaModalComponent {
|
|
|
498
498
|
this.toast.show({ message, duration: 3500 });
|
|
499
499
|
}
|
|
500
500
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MfaModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
501
|
-
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", enabledViaDeeplink: "enabledViaDeeplink", dismissed: "dismissed" }, ngImport: i0, template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\" cssClass=\"val-modal-adaptive\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" shape=\"round\" (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 <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaBackupCodesAvailable') + ': ' + backupCodesCount() }\"\n />\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\" shape=\"round\" (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 shape=\"round\"\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\" shape=\"round\" (click)=\"goToDisable()\">\n {{ t('mfaDisableButton') }}\n </ion-button>\n } @else {\n <p class=\"mfa-status mfa-status--off\">{{ t('mfaDisabledLabel') }}</p>\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisabledHint') }\" />\n <ion-button expand=\"block\" shape=\"round\" (click)=\"goToMethodSelect()\"> {{ t('mfaEnableButton') }} </ion-button>\n } } @case ('method-select') {\n <val-title [props]=\"{ content: t('mfaEnableTitle'), size: 'large', color: 'dark', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaMethodPrompt') }\" />\n\n <div class=\"mfa-method-list\" role=\"radiogroup\">\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'TOTP'\"\n (click)=\"selectedMethod.set('TOTP')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'TOTP'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodTotp') }}</strong>\n <span>{{ t('mfaMethodTotpHint') }}</span>\n </span>\n </button>\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'EMAIL'\"\n (click)=\"selectedMethod.set('EMAIL')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'EMAIL'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodEmail') }}</strong>\n <span>{{ t('mfaMethodEmailHint') }}</span>\n </span>\n </button>\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'SMS'\"\n (click)=\"selectedMethod.set('SMS')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'SMS'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodSms') }}</strong>\n <span>{{ t('mfaMethodSmsHint') }}</span>\n </span>\n </button>\n </div>\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 <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaPhoneRegistered') + ': ' + phone }\"\n />\n }\n\n <ion-button expand=\"block\" shape=\"round\" [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\" shape=\"round\" (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 <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep1') }\" />\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 <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpManualEntry') }\" />\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 <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep2') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" shape=\"round\" [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 <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\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\" shape=\"round\" (click)=\"copyCodes(setup.backupCodes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n </div>\n }\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" shape=\"round\" (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 <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: selectedMethod() === 'EMAIL' ? t('mfaConfirmPromptEmail') : t('mfaConfirmPromptSms') }\"\n />\n\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" shape=\"round\" [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>{{ 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\" shape=\"round\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('disable') { @if (hasPassword()) {\n <val-form [props]=\"disableFormProps()\" (onSubmit)=\"onDisableSubmit($event)\" />\n } @else if (mfaMethod() === 'TOTP') {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableTotpPrompt') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableButton') }} }\n </ion-button>\n } @else if (mfaMethod() === 'EMAIL' || mfaMethod() === 'SMS') {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n @if (!disableCodeSent()) {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"working()\" (click)=\"sendDisableCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableSendCode') }} }\n </ion-button>\n } @else {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableButton') }} }\n </ion-button>\n <ion-button expand=\"block\" fill=\"clear\" color=\"medium\" shape=\"round\" [disabled]=\"working()\" (click)=\"sendDisableCode()\">\n {{ t('mfaDisableResendCode') }}\n </ion-button>\n } } @else {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableNeedsPassword') }\" />\n }\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" shape=\"round\" (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:.8125rem;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-error{color:var(--ion-color-danger);font-size:.8125rem;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-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:1.25rem;color:var(--ion-color-primary);flex-shrink:0;margin-top:1px}.mfa-alert p{margin:0;font-size:.8125rem;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:.9375rem;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:.8125rem;text-align:center}.mfa-method-list{display:flex;flex-direction:column;gap:8px}.mfa-method-card{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:12px;border:1.5px solid var(--ion-border-color, rgba(var(--ion-color-dark-rgb), .14));background:transparent;cursor:pointer;text-align:left;width:100%;transition:border-color .15s ease,background .15s ease}.mfa-method-card--active{border-color:var(--ion-color-primary);background:rgba(var(--ion-color-primary-rgb),.07)}.mfa-method-card__dot{flex-shrink:0;width:18px;height:18px;border-radius:50%;border:2px solid var(--ion-color-medium);margin-top:2px;transition:border-color .15s,box-shadow .15s}.mfa-method-card--active .mfa-method-card__dot{border-color:var(--ion-color-primary);box-shadow:inset 0 0 0 4px var(--ion-color-primary)}.mfa-method-card__body{display:flex;flex-direction:column;gap:3px}.mfa-method-card__body strong{font-size:.9375rem;font-weight:600;color:var(--ion-color-dark)}.mfa-method-card__body span{font-size:.8125rem;color:var(--ion-color-medium);line-height:1.4}.mfa-resend{text-align:center;font-size:.875rem;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: IonModal, selector: "ion-modal" }, { 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: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: PinInputComponent, selector: "val-pin-input", inputs: ["props"] }] }); }
|
|
501
|
+
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", enabledViaDeeplink: "enabledViaDeeplink", dismissed: "dismissed" }, ngImport: i0, template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\" cssClass=\"val-modal-adaptive\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" shape=\"round\" (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 <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaBackupCodesAvailable') + ': ' + backupCodesCount() }\"\n />\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\" shape=\"round\" (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 shape=\"round\"\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\" shape=\"round\" (click)=\"goToDisable()\">\n {{ t('mfaDisableButton') }}\n </ion-button>\n } @else {\n <p class=\"mfa-status mfa-status--off\">{{ t('mfaDisabledLabel') }}</p>\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisabledHint') }\" />\n <ion-button expand=\"block\" shape=\"round\" (click)=\"goToMethodSelect()\"> {{ t('mfaEnableButton') }} </ion-button>\n } } @case ('method-select') {\n <val-title [props]=\"{ content: t('mfaEnableTitle'), size: 'large', color: 'dark', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaMethodPrompt') }\" />\n\n <div class=\"mfa-method-list\" role=\"radiogroup\">\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'TOTP'\"\n (click)=\"selectedMethod.set('TOTP')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'TOTP'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodTotp') }}</strong>\n <span>{{ t('mfaMethodTotpHint') }}</span>\n </span>\n </button>\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'EMAIL'\"\n (click)=\"selectedMethod.set('EMAIL')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'EMAIL'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodEmail') }}</strong>\n <span>{{ t('mfaMethodEmailHint') }}</span>\n </span>\n </button>\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'SMS'\"\n (click)=\"selectedMethod.set('SMS')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'SMS'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodSms') }}</strong>\n <span>{{ t('mfaMethodSmsHint') }}</span>\n </span>\n </button>\n </div>\n\n @if (selectedMethod() === 'SMS' && !userPhone()) {\n <val-phone-input\n [props]=\"{ control: phoneControl, label: t('mfaPhoneLabel'), placeholder: '912345678', defaultCountry: 'CL' }\"\n />\n @if (phoneControl.invalid && phoneControl.touched) {\n <p class=\"mfa-error\">{{ t('mfaPhoneInvalid') }}</p>\n } } @if (selectedMethod() === 'SMS' && userPhone(); as phone) {\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaPhoneRegistered') + ': ' + phone }\"\n />\n }\n\n <ion-button expand=\"block\" shape=\"round\" [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=\"outline\" color=\"dark\" shape=\"round\" (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 <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep1') }\" />\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 <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpManualEntry') }\" />\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 <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep2') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" shape=\"round\" [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 <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\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\" shape=\"round\" (click)=\"copyCodes(setup.backupCodes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n </div>\n }\n\n <ion-button expand=\"block\" fill=\"outline\" color=\"dark\" shape=\"round\" (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 <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: selectedMethod() === 'EMAIL' ? t('mfaConfirmPromptEmail') : t('mfaConfirmPromptSms') }\"\n />\n\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" shape=\"round\" [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>{{ t('mfaResendIn') }} {{ resendCooldown() }}s</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('mfaResend') }}</a>\n }\n </p>\n\n <ion-button expand=\"block\" fill=\"outline\" color=\"dark\" shape=\"round\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('disable') { @if (hasPassword()) {\n <val-form [props]=\"disableFormProps()\" (onSubmit)=\"onDisableSubmit($event)\" />\n } @else if (mfaMethod() === 'TOTP') {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableTotpPrompt') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableButton') }} }\n </ion-button>\n } @else if (mfaMethod() === 'EMAIL' || mfaMethod() === 'SMS') {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n @if (!disableCodeSent()) {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"working()\" (click)=\"sendDisableCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableSendCode') }} }\n </ion-button>\n } @else {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableButton') }} }\n </ion-button>\n <ion-button\n expand=\"block\"\n fill=\"clear\"\n color=\"medium\"\n shape=\"round\"\n [disabled]=\"working()\"\n (click)=\"sendDisableCode()\"\n >\n {{ t('mfaDisableResendCode') }}\n </ion-button>\n } } @else {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableNeedsPassword') }\" />\n }\n <ion-button expand=\"block\" fill=\"outline\" color=\"dark\" shape=\"round\" (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:.8125rem;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-error{color:var(--ion-color-danger);font-size:.8125rem;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-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:1.25rem;color:var(--ion-color-primary);flex-shrink:0;margin-top:1px}.mfa-alert p{margin:0;font-size:.8125rem;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:.9375rem;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:.8125rem;text-align:center}.mfa-method-list{display:flex;flex-direction:column;gap:8px}.mfa-method-card{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:12px;border:1.5px solid var(--ion-border-color, rgba(var(--ion-color-dark-rgb), .14));background:transparent;cursor:pointer;text-align:left;width:100%;transition:border-color .15s ease,background .15s ease}.mfa-method-card--active{border-color:var(--ion-color-primary);background:rgba(var(--ion-color-primary-rgb),.07)}.mfa-method-card__dot{flex-shrink:0;width:18px;height:18px;border-radius:50%;border:2px solid var(--ion-color-medium);margin-top:2px;transition:border-color .15s,box-shadow .15s}.mfa-method-card--active .mfa-method-card__dot{border-color:var(--ion-color-primary);box-shadow:inset 0 0 0 4px var(--ion-color-primary)}.mfa-method-card__body{display:flex;flex-direction:column;gap:3px}.mfa-method-card__body strong{font-size:.9375rem;font-weight:600;color:var(--ion-color-dark)}.mfa-method-card__body span{font-size:.8125rem;color:var(--ion-color-medium);line-height:1.4}.mfa-resend{text-align:center;font-size:.875rem;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: "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: IonModal, selector: "ion-modal" }, { 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: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: PinInputComponent, selector: "val-pin-input", inputs: ["props"] }, { kind: "component", type: PhoneInputComponent, selector: "val-phone-input", inputs: ["preset", "props"], outputs: ["phoneChange"] }] }); }
|
|
502
502
|
}
|
|
503
503
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MfaModalComponent, decorators: [{
|
|
504
504
|
type: Component,
|
|
@@ -523,7 +523,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
523
523
|
TextComponent,
|
|
524
524
|
TitleComponent,
|
|
525
525
|
PinInputComponent,
|
|
526
|
-
], template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\" cssClass=\"val-modal-adaptive\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" shape=\"round\" (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 <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaBackupCodesAvailable') + ': ' + backupCodesCount() }\"\n />\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\" shape=\"round\" (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 shape=\"round\"\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\" shape=\"round\" (click)=\"goToDisable()\">\n {{ t('mfaDisableButton') }}\n </ion-button>\n } @else {\n <p class=\"mfa-status mfa-status--off\">{{ t('mfaDisabledLabel') }}</p>\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisabledHint') }\" />\n <ion-button expand=\"block\" shape=\"round\" (click)=\"goToMethodSelect()\"> {{ t('mfaEnableButton') }} </ion-button>\n } } @case ('method-select') {\n <val-title [props]=\"{ content: t('mfaEnableTitle'), size: 'large', color: 'dark', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaMethodPrompt') }\" />\n\n <div class=\"mfa-method-list\" role=\"radiogroup\">\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'TOTP'\"\n (click)=\"selectedMethod.set('TOTP')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'TOTP'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodTotp') }}</strong>\n <span>{{ t('mfaMethodTotpHint') }}</span>\n </span>\n </button>\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'EMAIL'\"\n (click)=\"selectedMethod.set('EMAIL')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'EMAIL'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodEmail') }}</strong>\n <span>{{ t('mfaMethodEmailHint') }}</span>\n </span>\n </button>\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'SMS'\"\n (click)=\"selectedMethod.set('SMS')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'SMS'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodSms') }}</strong>\n <span>{{ t('mfaMethodSmsHint') }}</span>\n </span>\n </button>\n </div>\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 <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaPhoneRegistered') + ': ' + phone }\"\n />\n }\n\n <ion-button expand=\"block\" shape=\"round\" [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\" shape=\"round\" (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 <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep1') }\" />\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 <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpManualEntry') }\" />\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 <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep2') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" shape=\"round\" [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 <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\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\" shape=\"round\" (click)=\"copyCodes(setup.backupCodes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n </div>\n }\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" shape=\"round\" (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 <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: selectedMethod() === 'EMAIL' ? t('mfaConfirmPromptEmail') : t('mfaConfirmPromptSms') }\"\n />\n\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" shape=\"round\" [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>{{ 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\" shape=\"round\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('disable') { @if (hasPassword()) {\n <val-form [props]=\"disableFormProps()\" (onSubmit)=\"onDisableSubmit($event)\" />\n } @else if (mfaMethod() === 'TOTP') {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableTotpPrompt') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableButton') }} }\n </ion-button>\n } @else if (mfaMethod() === 'EMAIL' || mfaMethod() === 'SMS') {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n @if (!disableCodeSent()) {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"working()\" (click)=\"sendDisableCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableSendCode') }} }\n </ion-button>\n } @else {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableButton') }} }\n </ion-button>\n <ion-button expand=\"block\" fill=\"clear\" color=\"medium\" shape=\"round\" [disabled]=\"working()\" (click)=\"sendDisableCode()\">\n {{ t('mfaDisableResendCode') }}\n </ion-button>\n } } @else {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableNeedsPassword') }\" />\n }\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" shape=\"round\" (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:.8125rem;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-error{color:var(--ion-color-danger);font-size:.8125rem;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-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:1.25rem;color:var(--ion-color-primary);flex-shrink:0;margin-top:1px}.mfa-alert p{margin:0;font-size:.8125rem;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:.9375rem;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:.8125rem;text-align:center}.mfa-method-list{display:flex;flex-direction:column;gap:8px}.mfa-method-card{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:12px;border:1.5px solid var(--ion-border-color, rgba(var(--ion-color-dark-rgb), .14));background:transparent;cursor:pointer;text-align:left;width:100%;transition:border-color .15s ease,background .15s ease}.mfa-method-card--active{border-color:var(--ion-color-primary);background:rgba(var(--ion-color-primary-rgb),.07)}.mfa-method-card__dot{flex-shrink:0;width:18px;height:18px;border-radius:50%;border:2px solid var(--ion-color-medium);margin-top:2px;transition:border-color .15s,box-shadow .15s}.mfa-method-card--active .mfa-method-card__dot{border-color:var(--ion-color-primary);box-shadow:inset 0 0 0 4px var(--ion-color-primary)}.mfa-method-card__body{display:flex;flex-direction:column;gap:3px}.mfa-method-card__body strong{font-size:.9375rem;font-weight:600;color:var(--ion-color-dark)}.mfa-method-card__body span{font-size:.8125rem;color:var(--ion-color-medium);line-height:1.4}.mfa-resend{text-align:center;font-size:.875rem;color:var(--ion-color-dark);margin:4px 0}.mfa-resend a{color:var(--ion-color-primary);cursor:pointer;font-weight:600}\n"] }]
|
|
526
|
+
PhoneInputComponent,
|
|
527
|
+
], template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\" cssClass=\"val-modal-adaptive\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" shape=\"round\" (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 <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaBackupCodesAvailable') + ': ' + backupCodesCount() }\"\n />\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\" shape=\"round\" (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 shape=\"round\"\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\" shape=\"round\" (click)=\"goToDisable()\">\n {{ t('mfaDisableButton') }}\n </ion-button>\n } @else {\n <p class=\"mfa-status mfa-status--off\">{{ t('mfaDisabledLabel') }}</p>\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisabledHint') }\" />\n <ion-button expand=\"block\" shape=\"round\" (click)=\"goToMethodSelect()\"> {{ t('mfaEnableButton') }} </ion-button>\n } } @case ('method-select') {\n <val-title [props]=\"{ content: t('mfaEnableTitle'), size: 'large', color: 'dark', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaMethodPrompt') }\" />\n\n <div class=\"mfa-method-list\" role=\"radiogroup\">\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'TOTP'\"\n (click)=\"selectedMethod.set('TOTP')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'TOTP'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodTotp') }}</strong>\n <span>{{ t('mfaMethodTotpHint') }}</span>\n </span>\n </button>\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'EMAIL'\"\n (click)=\"selectedMethod.set('EMAIL')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'EMAIL'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodEmail') }}</strong>\n <span>{{ t('mfaMethodEmailHint') }}</span>\n </span>\n </button>\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'SMS'\"\n (click)=\"selectedMethod.set('SMS')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'SMS'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodSms') }}</strong>\n <span>{{ t('mfaMethodSmsHint') }}</span>\n </span>\n </button>\n </div>\n\n @if (selectedMethod() === 'SMS' && !userPhone()) {\n <val-phone-input\n [props]=\"{ control: phoneControl, label: t('mfaPhoneLabel'), placeholder: '912345678', defaultCountry: 'CL' }\"\n />\n @if (phoneControl.invalid && phoneControl.touched) {\n <p class=\"mfa-error\">{{ t('mfaPhoneInvalid') }}</p>\n } } @if (selectedMethod() === 'SMS' && userPhone(); as phone) {\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaPhoneRegistered') + ': ' + phone }\"\n />\n }\n\n <ion-button expand=\"block\" shape=\"round\" [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=\"outline\" color=\"dark\" shape=\"round\" (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 <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep1') }\" />\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 <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpManualEntry') }\" />\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 <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep2') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" shape=\"round\" [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 <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\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\" shape=\"round\" (click)=\"copyCodes(setup.backupCodes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n </div>\n }\n\n <ion-button expand=\"block\" fill=\"outline\" color=\"dark\" shape=\"round\" (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 <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: selectedMethod() === 'EMAIL' ? t('mfaConfirmPromptEmail') : t('mfaConfirmPromptSms') }\"\n />\n\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" shape=\"round\" [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>{{ t('mfaResendIn') }} {{ resendCooldown() }}s</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('mfaResend') }}</a>\n }\n </p>\n\n <ion-button expand=\"block\" fill=\"outline\" color=\"dark\" shape=\"round\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('disable') { @if (hasPassword()) {\n <val-form [props]=\"disableFormProps()\" (onSubmit)=\"onDisableSubmit($event)\" />\n } @else if (mfaMethod() === 'TOTP') {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableTotpPrompt') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableButton') }} }\n </ion-button>\n } @else if (mfaMethod() === 'EMAIL' || mfaMethod() === 'SMS') {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n @if (!disableCodeSent()) {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"working()\" (click)=\"sendDisableCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableSendCode') }} }\n </ion-button>\n } @else {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableButton') }} }\n </ion-button>\n <ion-button\n expand=\"block\"\n fill=\"clear\"\n color=\"medium\"\n shape=\"round\"\n [disabled]=\"working()\"\n (click)=\"sendDisableCode()\"\n >\n {{ t('mfaDisableResendCode') }}\n </ion-button>\n } } @else {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableNeedsPassword') }\" />\n }\n <ion-button expand=\"block\" fill=\"outline\" color=\"dark\" shape=\"round\" (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:.8125rem;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-error{color:var(--ion-color-danger);font-size:.8125rem;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-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:1.25rem;color:var(--ion-color-primary);flex-shrink:0;margin-top:1px}.mfa-alert p{margin:0;font-size:.8125rem;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:.9375rem;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:.8125rem;text-align:center}.mfa-method-list{display:flex;flex-direction:column;gap:8px}.mfa-method-card{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:12px;border:1.5px solid var(--ion-border-color, rgba(var(--ion-color-dark-rgb), .14));background:transparent;cursor:pointer;text-align:left;width:100%;transition:border-color .15s ease,background .15s ease}.mfa-method-card--active{border-color:var(--ion-color-primary);background:rgba(var(--ion-color-primary-rgb),.07)}.mfa-method-card__dot{flex-shrink:0;width:18px;height:18px;border-radius:50%;border:2px solid var(--ion-color-medium);margin-top:2px;transition:border-color .15s,box-shadow .15s}.mfa-method-card--active .mfa-method-card__dot{border-color:var(--ion-color-primary);box-shadow:inset 0 0 0 4px var(--ion-color-primary)}.mfa-method-card__body{display:flex;flex-direction:column;gap:3px}.mfa-method-card__body strong{font-size:.9375rem;font-weight:600;color:var(--ion-color-dark)}.mfa-method-card__body span{font-size:.8125rem;color:var(--ion-color-medium);line-height:1.4}.mfa-resend{text-align:center;font-size:.875rem;color:var(--ion-color-dark);margin:4px 0}.mfa-resend a{color:var(--ion-color-primary);cursor:pointer;font-weight:600}\n"] }]
|
|
527
528
|
}], ctorParameters: () => [], propDecorators: { isOpen: [{
|
|
528
529
|
type: Input
|
|
529
530
|
}], prefillCode: [{
|
|
@@ -535,4 +536,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
535
536
|
}], dismissed: [{
|
|
536
537
|
type: Output
|
|
537
538
|
}] } });
|
|
538
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWZhLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvbWZhLW1vZGFsL21mYS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL21mYS1tb2RhbC9tZmEtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixTQUFTLEVBQ1QsT0FBTyxFQUNQLFFBQVEsRUFDUixPQUFPLEVBQ1AsUUFBUSxFQUNSLFFBQVEsRUFDUixRQUFRLEVBQ1IsYUFBYSxFQUNiLFVBQVUsRUFDVixVQUFVLEdBQ1gsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxF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QVMsb1BBQ1QsVUFBVSw4RUFDVixVQUFVLHdLQUNWLFNBQVMsb0dBQ1QsT0FBTywySkFDUCxRQUFRLDhlQUdSLFFBQVEsc0RBR1IsVUFBVSx5R0FDVixVQUFVLG1GQUNWLGdCQUFnQiwyRUFDaEIsYUFBYSw4SEFDYixlQUFlLG1JQUNmLGFBQWEsd0VBQ2IsY0FBYyx5RUFDZCxpQkFBaUI7OzRGQUtSLGlCQUFpQjtrQkE1QjdCLFNBQVM7K0JBQ0UsZUFBZSxjQUNiLElBQUksV0FDUDt3QkFDUCxtQkFBbUI7d0JBQ25CLFNBQVM7d0JBQ1QsVUFBVTt3QkFDVixVQUFVO3dCQUNWLFNBQVM7d0JBQ1QsT0FBTzt3QkFDUCxRQUFRO3dCQUNSLE9BQU87d0JBQ1AsUUFBUTt3QkFDUixRQUFRO3dCQUNSLFFBQVE7d0JBQ1IsYUFBYTt3QkFDYixVQUFVO3dCQUNWLFVBQVU7d0JBQ1YsZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixjQUFjO3dCQUNkLGlCQUFpQjtxQkFDbEI7d0RBU0csTUFBTTtzQkFEVCxLQUFLO2dCQXFCRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdJLE9BQU87c0JBQWhCLE1BQU07Z0JBT0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUdHLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgSW9uQnV0dG9uLFxuICBJb25CdXR0b25zLFxuICBJb25Db250ZW50LFxuICBJb25IZWFkZXIsXG4gIElvbkljb24sXG4gIElvbklucHV0LFxuICBJb25JdGVtLFxuICBJb25MYWJlbCxcbiAgSW9uTW9kYWwsXG4gIElvblJhZGlvLFxuICBJb25SYWRpb0dyb3VwLFxuICBJb25TcGlubmVyLFxuICBJb25Ub29sYmFyLFxufSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuaW1wb3J0IHsgaW5mb3JtYXRpb25DaXJjbGVPdXRsaW5lLCBjb3B5T3V0bGluZSwgY2hlY2ttYXJrT3V0bGluZSB9IGZyb20gJ2lvbmljb25zL2ljb25zJztcblxuaW1wb3J0IHsgYnV0dG9uIH0gZnJvbSAnLi4vLi4vYXRvbXMvYnV0dG9uL2ZhY3RvcnknO1xuaW1wb3J0IHsgRGlzcGxheUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL2Rpc3BsYXkvZGlzcGxheS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUXJDb2RlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvcXItY29kZS9xci1jb2RlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvdGV4dC90ZXh0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUaXRsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL3RpdGxlL3RpdGxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQaW5JbnB1dENvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9waW4taW5wdXQvcGluLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRTdGF0ZXMsIEZvcm1NZXRhZGF0YSwgRm9ybVN1Ym1pdCwgSW5wdXRUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0vZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoJztcbmltcG9ydCB7IE1GQU1ldGhvZCwgVE9UUFNldHVwUmVzcG9uc2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoL3R5cGVzJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlLCBJbnB1dEkxOG5IZWxwZXIgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IFFyR2VuZXJhdG9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3FyLWdlbmVyYXRvci9xci1nZW5lcmF0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBRclJlc3VsdCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3FyLWdlbmVyYXRvci90eXBlcyc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy90b2FzdC5zZXJ2aWNlJztcblxuLyoqIFBhc28gZGVsIGZsdWpvIGRlbCBtb2RhbC4gKi9cbnR5cGUgTWZhU3RlcCA9ICdsb2FkaW5nJyB8ICdzdGF0dXMnIHwgJ21ldGhvZC1zZWxlY3QnIHwgJ3RvdHAtc2V0dXAnIHwgJ2NvZGUtY29uZmlybScgfCAnZGlzYWJsZSc7XG5cbi8qKiBTZWd1bmRvcyBkZSBlc3BlcmEgYW50ZXMgZGUgcG9kZXIgcmVlbnZpYXIgZWwgY8OzZGlnbyBFTUFJTC9TTVMuICovXG5jb25zdCBSRVNFTkRfQ09PTERPV05fU0VDT05EUyA9IDMwO1xuXG4vKipcbiAqIGB2YWwtbWZhLW1vZGFsYCDigJQgbW9kYWwgZGUgZ2VzdGnDs24gZGUgYXV0ZW50aWNhY2nDs24gZGUgZG9zIGZhY3RvcmVzIChNRkEpXG4gKiBwYXJhIHVuIHVzdWFyaW8gYXV0ZW50aWNhZG8uIE1pc21vIHBhdHLDs24gcXVlIGB2YWwtY2hhbmdlLXBhc3N3b3JkLW1vZGFsYC5cbiAqXG4gKiBGbHVqbyAobcOhcXVpbmEgZGUgZXN0YWRvcyBpbnRlcm5hKTpcbiAqICAtIGBsb2FkaW5nYCDihpIgYGdldFByb2ZpbGUoKWAgcGFyYSBjb25vY2VyIGVsIGVzdGFkbyBNRkEuXG4gKiAgLSBgc3RhdHVzYCDihpIgbXVlc3RyYSBNRkEgaGFiaWxpdGFkby9kZXNoYWJpbGl0YWRvLiBTaSBlc3TDoSBoYWJpbGl0YWRvOlxuICogICAgZ2VzdGnDs24gZGUgYmFja3VwIGNvZGVzIChUT1RQKSArIGRlc2hhYmlsaXRhci4gU2kgbm86IGJvdMOzbiBoYWJpbGl0YXIuXG4gKiAgLSBgbWV0aG9kLXNlbGVjdGAg4oaSIGVsZWdpciBUT1RQIC8gRU1BSUwgLyBTTVMuXG4gKiAgLSBgdG90cC1zZXR1cGAg4oaSIFFSICsgc2VjcmV0byBtYW51YWwgKyBiYWNrdXAgY29kZXMg4oaSIHZlcmlmaWNhciBjw7NkaWdvLlxuICogIC0gYGNvZGUtY29uZmlybWAg4oaSIChFTUFJTC9TTVMpIGluZ3Jlc2FyIGPDs2RpZ28gcmVjaWJpZG8sIGNvbiByZWVudsOtby5cbiAqICAtIGBkaXNhYmxlYCDihpIgY29udHJhc2XDsWEgcGFyYSBkZXNoYWJpbGl0YXIgTUZBLlxuICpcbiAqIEVsIFFSIHNlIGdlbmVyYSAqKmNsaWVudC1zaWRlKiogKGBRckdlbmVyYXRvclNlcnZpY2VgKSDigJQgZWwgc2VjcmV0byBUT1RQXG4gKiBudW5jYSBzYWxlIGRlbCBuYXZlZ2Fkb3IuXG4gKlxuICogU2VsZi1jb250YWluZWQ6IGlueWVjdGEgYEF1dGhTZXJ2aWNlYCB5IGxsYW1hIGxvcyBlbmRwb2ludHMgZGlyZWN0by4gTGEgYXBwXG4gKiBjb250cm9sYSBgW2lzT3Blbl1gIHkgcmVhY2Npb25hIGEgYChjaGFuZ2VkKWAgLyBgKGRpc21pc3NlZClgLlxuICpcbiAqIGkxOG46IG5hbWVzcGFjZSBjb21wYXJ0aWRvIGBfYXV0aGAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDx2YWwtbWZhLW1vZGFsXG4gKiAgIFtpc09wZW5dPVwiaXNNb2RhbE9wZW4oKVwiXG4gKiAgIChkaXNtaXNzZWQpPVwiaXNNb2RhbE9wZW4uc2V0KGZhbHNlKVwiXG4gKiAvPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1tZmEtbW9kYWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBJb25CdXR0b24sXG4gICAgSW9uQnV0dG9ucyxcbiAgICBJb25Db250ZW50LFxuICAgIElvbkhlYWRlcixcbiAgICBJb25JY29uLFxuICAgIElvbklucHV0LFxuICAgIElvbkl0ZW0sXG4gICAgSW9uTGFiZWwsXG4gICAgSW9uTW9kYWwsXG4gICAgSW9uUmFkaW8sXG4gICAgSW9uUmFkaW9Hcm91cCxcbiAgICBJb25TcGlubmVyLFxuICAgIElvblRvb2xiYXIsXG4gICAgRGlzcGxheUNvbXBvbmVudCxcbiAgICBGb3JtQ29tcG9uZW50LFxuICAgIFFyQ29kZUNvbXBvbmVudCxcbiAgICBUZXh0Q29tcG9uZW50LFxuICAgIFRpdGxlQ29tcG9uZW50LFxuICAgIFBpbklucHV0Q29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vbWZhLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWZhLW1vZGFsLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIE1mYU1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfaXNPcGVuID0gZmFsc2U7XG5cbiAgLyoqIENvbnRyb2xhIGxhIHZpc2liaWxpZGFkLiBDYWRhIGFwZXJ0dXJhIHJlLXJlc3VlbHZlIGVsIGVzdGFkbyBNRkEuICovXG4gIEBJbnB1dCgpXG4gIHNldCBpc09wZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBvcGVuaW5nID0gdmFsdWUgJiYgIXRoaXMuX2lzT3BlbjtcbiAgICB0aGlzLl9pc09wZW4gPSB2YWx1ZTtcbiAgICBpZiAob3BlbmluZykge1xuICAgICAgLy8gRGlmZXJpbW9zIGFsIHByw7N4aW1vIG1pY3JvdGFzayBwYXJhIHF1ZSBlbCByZXN0byBkZSBASW5wdXRcbiAgICAgIC8vIChgcHJlZmlsbENvZGVgKSB5YSBlc3TDqW4gYXNpZ25hZG9zIOKAlCBBbmd1bGFyIHByb2Nlc2EgbG9zIGlucHV0cyBlblxuICAgICAgLy8gb3JkZW4gZGUgZGVjbGFyYWNpw7NuLCB5IHNpbiBlc3RvIGBvcGVuKClgIGxlZSBgcHJlZmlsbENvZGVgIHVuZGVmaW5lZFxuICAgICAgLy8gY3VhbmRvIGVsIHBhZHJlIHNldGVhIGFtYm9zIGVuIGVsIG1pc21vIHRpY2sgKGRlZXAtbGluayBNRkEtZW1haWwpLlxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5vcGVuKCkpO1xuICAgIH1cbiAgfVxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc09wZW47XG4gIH1cblxuICAvKipcbiAgICogQ8OzZGlnbyBNRkEgcHJlLWNhcmdhZG8gKGRlZXAtbGluayBkZXNkZSBlbCBlbWFpbCBkZSBzZXR1cCBNRkEtZW1haWwpLiBTaVxuICAgKiBlc3TDoSBwcmVzZW50ZSBhbCBhYnJpciwgZWwgbW9kYWwgc2FsdGEgZGlyZWN0byBhbCBwYXNvIGRlIGNvbmZpcm1hY2nDs25cbiAgICogY29uIGVsIGPDs2RpZ28gcmVsbGVuYWRvLlxuICAgKi9cbiAgQElucHV0KCkgcHJlZmlsbENvZGU/OiBzdHJpbmc7XG5cbiAgLyoqIEVtaXRlIGN1YW5kbyBlbCBlc3RhZG8gTUZBIGNhbWJpYSAoaGFiaWxpdGFkbyAvIGRlc2hhYmlsaXRhZG8pLiAqL1xuICBAT3V0cHV0KCkgY2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKipcbiAgICogRW1pdGlkbyBjdWFuZG8gdW4gc2V0dXAgTUZBIHNlIGNvbmZpcm1hIGV4aXRvc2FtZW50ZSB5IGVsIG1vZGFsIGZ1ZSBhYmllcnRvXG4gICAqIHbDrWEgZGVlcC1saW5rIChjb24gYHByZWZpbGxDb2RlYCkuIEVsIGhvc3QgcHVlZGUgdXNhcmxvIHBhcmEgY2VycmFyIGVsXG4gICAqIG1vZGFsIHkgbmF2ZWdhciAoZWouIGEgaG9tZSkgZW4gbHVnYXIgZGUgcXVlZGFyc2UgZW4gbGEgcMOhZ2luYSBkZSBTZWN1cml0eS5cbiAgICovXG4gIEBPdXRwdXQoKSBlbmFibGVkVmlhRGVlcGxpbmsgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXRlIGN1YW5kbyBlbCB1c2VyIGNpZXJyYSBlbCBtb2RhbCAoYm90w7NuIFggbyBiYWNrZHJvcCkuICovXG4gIEBPdXRwdXQoKSBkaXNtaXNzZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0b2FzdCA9IGluamVjdChUb2FzdFNlcnZpY2UpO1xuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIGkxOG5IZWxwZXIgPSBpbmplY3QoSW5wdXRJMThuSGVscGVyKTtcbiAgcHJpdmF0ZSBxckdlbiA9IGluamVjdChRckdlbmVyYXRvclNlcnZpY2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0ZXAgPSBzaWduYWw8TWZhU3RlcD4oJ2xvYWRpbmcnKTtcbiAgLyoqIFBhc28gYWN0dWFsIGRlbCBmbHVqby4gKi9cbiAgcmVhZG9ubHkgc3RlcCA9IHRoaXMuX3N0ZXAuYXNSZWFkb25seSgpO1xuXG4gIC8qKiBgdHJ1ZWAgbWllbnRyYXMgdW5hIGxsYW1hZGEgYWwgYmFja2VuZCBlc3TDoSBlbiBjdXJzby4gKi9cbiAgcmVhZG9ubHkgd29ya2luZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gRXN0YWRvIE1GQSBhY3R1YWwuXG4gIHJlYWRvbmx5IG1mYUVuYWJsZWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBtZmFNZXRob2QgPSBzaWduYWw8TUZBTWV0aG9kIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHVzZXJQaG9uZSA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgYmFja3VwQ29kZXNDb3VudCA9IHNpZ25hbCgwKTtcbiAgLyoqIERlZmF1bHQgdHJ1ZSBwYXJhIG5vIHJvbXBlciBlbCBmbG93IHZpZWpvIHNpIGVsIGJhY2tlbmQgbm8gZGV2dWVsdmUgZWwgY2FtcG8uICovXG4gIHJlYWRvbmx5IGhhc1Bhc3N3b3JkID0gc2lnbmFsKHRydWUpO1xuXG4gIC8vIEVzdGFkbyBkZWwgZmx1am8gZGUgaGFiaWxpdGFjacOzbi5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRNZXRob2QgPSBzaWduYWw8TUZBTWV0aG9kPignVE9UUCcpO1xuICByZWFkb25seSB0b3RwU2V0dXAgPSBzaWduYWw8VE9UUFNldHVwUmVzcG9uc2UgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgdG90cFFyID0gc2lnbmFsPFFyUmVzdWx0IHwgbnVsbD4obnVsbCk7XG4gIC8qKiBDw7NkaWdvcyBkZSByZXNwYWxkbyByZWNpw6luIHJlZ2VuZXJhZG9zIOKAlCBzZSBtdWVzdHJhbiB1bmEgc29sYSB2ZXouICovXG4gIHJlYWRvbmx5IHJlZ2VuZXJhdGVkQ29kZXMgPSBzaWduYWw8c3RyaW5nW10gfCBudWxsPihudWxsKTtcbiAgLyoqIE1hcmNhIG1vbWVudMOhbmVhIGN1YW5kbyBlbCBzZWNyZXRvIFRPVFAgc2UgYWNhYmEgZGUgY29waWFyIChmZWVkYmFjayB2aXN1YWwpLiAqL1xuICByZWFkb25seSBjb3BpZWRTZWNyZXQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSByZXNlbmRDb29sZG93biA9IHNpZ25hbCgwKTtcbiAgcmVhZG9ubHkgZGlzYWJsZUNvZGVTZW50ID0gc2lnbmFsKGZhbHNlKTtcblxuICByZWFkb25seSBwaW5Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoNiksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDYpXSk7XG4gIHJlYWRvbmx5IHBob25lQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMucGF0dGVybigvXlxcK1sxLTldXFxkezYsMTR9JC8pXSk7XG5cbiAgcmVhZG9ubHkgcGluSW5wdXRQcm9wcyA9IHtcbiAgICBjb250cm9sOiB0aGlzLnBpbkNvbnRyb2wsXG4gICAgdG9rZW46ICdtZmEtY29kZScsXG4gICAgbGVuZ3RoOiA2LFxuICAgIGFsbG93TnVtYmVyc09ubHk6IHRydWUsXG4gICAgYXV0b0ZvY3VzOiB0cnVlLFxuICB9O1xuXG4gIC8qKiBGb3JtIGRlIGRlc2hhYmlsaXRhY2nDs24g4oCUIGB2YWwtZm9ybWAgY29uIHVuIGNhbXBvIGRlIGNvbnRyYXNlw7FhLiAqL1xuICByZWFkb25seSBkaXNhYmxlRm9ybVByb3BzID0gY29tcHV0ZWQ8Rm9ybU1ldGFkYXRhPigoKSA9PlxuICAgIHRoaXMuaTE4bkhlbHBlci5yZXNvbHZlRm9ybSh7XG4gICAgICBuYW1lS2V5OiAnbWZhRGlzYWJsZVRpdGxlJyxcbiAgICAgIGkxOG5OYW1lc3BhY2U6ICdfYXV0aCcsXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogdGhpcy50KCdtZmFEaXNhYmxlUHJvbXB0JyksXG4gICAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IElucHV0VHlwZS5QQVNTV09SRCxcbiAgICAgICAgICAgICAgbmFtZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgICAgdG9rZW46ICdtZmEtZGlzYWJsZS1wYXNzd29yZCcsXG4gICAgICAgICAgICAgIGxhYmVsS2V5OiAnbWZhUGFzc3dvcmRMYWJlbCcsXG4gICAgICAgICAgICAgIGhpbnQ6ICcnLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcktleTogJ3Bhc3N3b3JkUGxhY2Vob2xkZXInLFxuICAgICAgICAgICAgICBlcnJvcktleXM6IHsgcmVxdWlyZWQ6ICdtZmFQYXNzd29yZFJlcXVpcmVkJyB9LFxuICAgICAgICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYWN0aW9uczoge1xuICAgICAgICAuLi5idXR0b24oeyB0ZXh0OiAnJywgdHlwZTogJ3N1Ym1pdCcsIGZpbGw6ICdzb2xpZCcsIGV4cGFuZDogJ2Jsb2NrJyB9KSxcbiAgICAgICAgdG9rZW46ICdtZmEtZGlzYWJsZS1zdWJtaXQnLFxuICAgICAgICB0ZXh0S2V5OiAnbWZhRGlzYWJsZUJ1dHRvbicsXG4gICAgICB9LFxuICAgICAgc3RhdGU6IHRoaXMud29ya2luZygpID8gQ29tcG9uZW50U3RhdGVzLldPUktJTkcgOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICB9KVxuICApO1xuXG4gIHByaXZhdGUgcmVzZW5kVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGFkZEljb25zKHsgaW5mb3JtYXRpb25DaXJjbGVPdXRsaW5lLCBjb3B5T3V0bGluZSwgY2hlY2ttYXJrT3V0bGluZSB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcENvb2xkb3duKCk7XG4gIH1cblxuICAvKiogVHJhZHVjZSB1bmEgY2xhdmUgZGVsIG5hbWVzcGFjZSBgX2F1dGhgLiAqL1xuICB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCAnX2F1dGgnKTtcbiAgfVxuXG4gIC8qKiBDaWVycmUgaW5pY2lhZG8gcG9yIGVsIHVzZXIgKFggLyBiYWNrZHJvcCkuICovXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzbWlzc2VkLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdW50byBkZSBlbnRyYWRhIGFsIGFicmlyIGVsIG1vZGFsLiBDb24gYHByZWZpbGxDb2RlYCAoZGVlcC1saW5rIGRlbCBlbWFpbFxuICAgKiBkZSBzZXR1cCBNRkEtZW1haWwpIHNhbHRhIGRpcmVjdG8gYSBsYSBjb25maXJtYWNpw7NuOyBzaSBubywgcmVzdWVsdmUgZWxcbiAgICogZXN0YWRvIE1GQSBhY3R1YWwuXG4gICAqL1xuICBwcml2YXRlIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlZmlsbENvZGUpIHtcbiAgICAgIHRoaXMucmVzZXRGbG93KCk7XG4gICAgICB0aGlzLnNlbGVjdGVkTWV0aG9kLnNldCgnRU1BSUwnKTtcbiAgICAgIHRoaXMucGluQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnByZWZpbGxDb2RlKTtcbiAgICAgIHRoaXMuX3N0ZXAuc2V0KCdjb2RlLWNvbmZpcm0nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXNvbHZlU3RhdHVzKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ2FyZ2EgZGUgZXN0YWRvXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDb25zdWx0YSBlbCBwZXJmaWwgcGFyYSBjb25vY2VyIGVsIGVzdGFkbyBNRkEgeSBwb3NpY2lvbmFyIGVsIGZsdWpvLiAqL1xuICBwcml2YXRlIHJlc29sdmVTdGF0dXMoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RlcC5zZXQoJ2xvYWRpbmcnKTtcbiAgICB0aGlzLnJlc2V0RmxvdygpO1xuICAgIHRoaXMuYXV0aC5nZXRQcm9maWxlKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHByb2ZpbGUgPT4ge1xuICAgICAgICB0aGlzLm1mYUVuYWJsZWQuc2V0KHByb2ZpbGUubWZhRW5hYmxlZCk7XG4gICAgICAgIHRoaXMubWZhTWV0aG9kLnNldChwcm9maWxlLm1mYU1ldGhvZCA/PyBudWxsKTtcbiAgICAgICAgdGhpcy51c2VyUGhvbmUuc2V0KHByb2ZpbGUucGhvbmUgPz8gbnVsbCk7XG4gICAgICAgIHRoaXMuaGFzUGFzc3dvcmQuc2V0KHByb2ZpbGUuaGFzUGFzc3dvcmQgPz8gdHJ1ZSk7XG4gICAgICAgIGlmIChwcm9maWxlLm1mYUVuYWJsZWQgJiYgcHJvZmlsZS5tZmFNZXRob2QgPT09ICdUT1RQJykge1xuICAgICAgICAgIHRoaXMubG9hZEJhY2t1cENvdW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RlcC5zZXQoJ3N0YXR1cycpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiB1c2FyIGVsIHNpZ25hbCBkZSB1c3VhcmlvIGVuIHNlc2nDs24uXG4gICAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLmF1dGgudXNlcigpO1xuICAgICAgICB0aGlzLm1mYUVuYWJsZWQuc2V0KHVzZXI/Lm1mYUVuYWJsZWQgPz8gZmFsc2UpO1xuICAgICAgICB0aGlzLm1mYU1ldGhvZC5zZXQodXNlcj8ubWZhTWV0aG9kID8/IG51bGwpO1xuICAgICAgICB0aGlzLl9zdGVwLnNldCgnc3RhdHVzJyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQmFja3VwQ291bnQoKTogdm9pZCB7XG4gICAgdGhpcy5hdXRoLmdldEJhY2t1cENvZGVzQ291bnQoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHRoaXMuYmFja3VwQ29kZXNDb3VudC5zZXQocmVzLmNvdW50KSxcbiAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmJhY2t1cENvZGVzQ291bnQuc2V0KDApLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5hdmVnYWNpw7NuIGVudHJlIHBhc29zXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGdvVG9NZXRob2RTZWxlY3QoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdlbmVyYXRlZENvZGVzLnNldChudWxsKTtcbiAgICB0aGlzLl9zdGVwLnNldCgnbWV0aG9kLXNlbGVjdCcpO1xuICB9XG5cbiAgZ29Ub0Rpc2FibGUoKTogdm9pZCB7XG4gICAgdGhpcy5waW5Db250cm9sLnJlc2V0KCk7XG4gICAgdGhpcy5fc3RlcC5zZXQoJ2Rpc2FibGUnKTtcbiAgfVxuXG4gIGJhY2tUb1N0YXR1cygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BDb29sZG93bigpO1xuICAgIHRoaXMuZGlzYWJsZUNvZGVTZW50LnNldChmYWxzZSk7XG4gICAgdGhpcy5yZXNvbHZlU3RhdHVzKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGFiaWxpdGFyIE1GQVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQ29udGluw7phIGRlc2RlIGVsIHNlbGVjdG9yIGRlIG3DqXRvZG8gYWwgc2V0dXAgY29ycmVzcG9uZGllbnRlLiAqL1xuICBwcm9jZWVkV2l0aE1ldGhvZCgpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLnNlbGVjdGVkTWV0aG9kKCk7XG4gICAgaWYgKG1ldGhvZCA9PT0gJ1RPVFAnKSB7XG4gICAgICB0aGlzLnNldHVwVG90cCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwaG9uZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChtZXRob2QgPT09ICdTTVMnICYmICF0aGlzLnVzZXJQaG9uZSgpKSB7XG4gICAgICBpZiAodGhpcy5waG9uZUNvbnRyb2wuaW52YWxpZCkge1xuICAgICAgICB0aGlzLnBob25lQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhUGhvbmVJbnZhbGlkJykpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwaG9uZSA9IHRoaXMucGhvbmVDb250cm9sLnZhbHVlID8/IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLndvcmtpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuYXV0aC5zZXR1cE1GQShtZXRob2QsIHBob25lKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIGlmIChyZXMuY29kZVNlbnQpIHtcbiAgICAgICAgICB0aGlzLnBpbkNvbnRyb2wucmVzZXQoKTtcbiAgICAgICAgICB0aGlzLl9zdGVwLnNldCgnY29kZS1jb25maXJtJyk7XG4gICAgICAgICAgdGhpcy5zdGFydENvb2xkb3duKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMucmVzb2x2ZUVycm9yKGVycikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBUb3RwKCk6IHZvaWQge1xuICAgIHRoaXMud29ya2luZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5hdXRoLnNldHVwVE9UUCgpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICB0aGlzLnRvdHBTZXR1cC5zZXQocmVzKTtcbiAgICAgICAgdGhpcy5waW5Db250cm9sLnJlc2V0KCk7XG4gICAgICAgIHRoaXMucXJHZW5cbiAgICAgICAgICAuZ2VuZXJhdGUoeyBkYXRhOiByZXMucXJDb2RlVXJsLCB3aWR0aDogMjIwIH0pXG4gICAgICAgICAgLnRoZW4ocXIgPT4gdGhpcy50b3RwUXIuc2V0KHFyKSlcbiAgICAgICAgICAuY2F0Y2goKCkgPT4gdGhpcy50b3RwUXIuc2V0KG51bGwpKTtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuX3N0ZXAuc2V0KCd0b3RwLXNldHVwJyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogVmVyaWZpY2EgZWwgY8OzZGlnbyBUT1RQIGRlIGxhIGFwcCBkZSBhdXRlbnRpY2FjacOzbiB5IGFjdGl2YSBNRkEuICovXG4gIHZlcmlmeVRvdHAoKTogdm9pZCB7XG4gICAgY29uc3QgY29kZSA9IHRoaXMucGluQ29udHJvbC52YWx1ZTtcbiAgICBpZiAoIWNvZGUgfHwgY29kZS5sZW5ndGggIT09IDYpIHtcbiAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhQ29kZUludmFsaWQnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMud29ya2luZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5hdXRoLnZlcmlmeVRPVFBTZXR1cChjb2RlKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIGlmIChyZXMuZW5hYmxlZCkge1xuICAgICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhRW5hYmxlZE9rJykpO1xuICAgICAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KCk7XG4gICAgICAgICAgdGhpcy5yZXNvbHZlU3RhdHVzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMucmVzb2x2ZUVycm9yKGVycikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDb25maXJtYSBlbCBjw7NkaWdvIEVNQUlML1NNUyB5IGFjdGl2YSBNRkEuICovXG4gIGNvbmZpcm1Db2RlKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvZGUgPSB0aGlzLnBpbkNvbnRyb2wudmFsdWU7XG4gICAgaWYgKCFjb2RlIHx8IGNvZGUubGVuZ3RoICE9PSA2KSB7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYUNvZGVJbnZhbGlkJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLndvcmtpbmcuc2V0KHRydWUpO1xuICAgIGNvbnN0IGNhbWVGcm9tRGVlcGxpbmsgPSAhIXRoaXMucHJlZmlsbENvZGU7XG4gICAgdGhpcy5hdXRoLmNvbmZpcm1NRkEoY29kZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICBpZiAocmVzLm1mYUVuYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYUVuYWJsZWRPaycpKTtcbiAgICAgICAgICB0aGlzLmNoYW5nZWQuZW1pdCgpO1xuICAgICAgICAgIGlmIChjYW1lRnJvbURlZXBsaW5rKSB7XG4gICAgICAgICAgICAvLyBFbCB1c2VyIGxsZWfDsyB2w61hIGxpbmsgZGVsIGVtYWlsIOKGkiBlbCBob3N0IHNlIGVuY2FyZ2EgZGUgY2VycmFyXG4gICAgICAgICAgICAvLyBlbCBtb2RhbCB5IG5hdmVnYXIgKGVqLiBhIGhvbWUpLiBObyByZXNvbHZlbW9zIHN0YXR1cyBhY8OhIHBvcnF1ZVxuICAgICAgICAgICAgLy8gaW1wbGljYXLDrWEgZGVqYXIgZWwgbW9kYWwgYWJpZXJ0byBtb3N0cmFuZG8gZWwgZXN0YWRvIG51ZXZvLlxuICAgICAgICAgICAgdGhpcy5lbmFibGVkVmlhRGVlcGxpbmsuZW1pdCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVTdGF0dXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMucmVzb2x2ZUVycm9yKGVycikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWVudsOtYSBlbCBjw7NkaWdvIEVNQUlML1NNUyAocmUtZWplY3V0YSBlbCBzZXR1cCkuICovXG4gIHJlc2VuZENvZGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzZW5kQ29vbGRvd24oKSA+IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wcm9jZWVkV2l0aE1ldGhvZCgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEdlc3Rpw7NuIChNRkEgaGFiaWxpdGFkbylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFJlZ2VuZXJhIGxvcyBjw7NkaWdvcyBkZSByZXNwYWxkbyBUT1RQIHkgbG9zIG11ZXN0cmEgdW5hIHZlei4gKi9cbiAgcmVnZW5lcmF0ZUJhY2t1cENvZGVzKCk6IHZvaWQge1xuICAgIHRoaXMud29ya2luZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5hdXRoLnJlZ2VuZXJhdGVCYWNrdXBDb2RlcygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5iYWNrdXBDb2Rlc0NvdW50LnNldChyZXMuYmFja3VwQ29kZXMubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5yZWdlbmVyYXRlZENvZGVzLnNldChyZXMuYmFja3VwQ29kZXMpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy5yZXNvbHZlRXJyb3IoZXJyKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIERlc2hhYmlsaXRhIE1GQSB1c2FuZG8gbGEgY29udHJhc2XDsWEgZGUgbGEgY3VlbnRhLiAqL1xuICBvbkRpc2FibGVTdWJtaXQoZXZlbnQ6IEZvcm1TdWJtaXQpOiB2b2lkIHtcbiAgICBjb25zdCBwYXNzd29yZCA9IGV2ZW50LmZpZWxkc1sncGFzc3dvcmQnXTtcbiAgICBpZiAoIXBhc3N3b3JkKSB7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYVBhc3N3b3JkUmVxdWlyZWQnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGlzYWJsZSh7IHBhc3N3b3JkIH0pO1xuICB9XG5cbiAgLyoqIERlc2hhYmlsaXRhIE1GQSB1c2FuZG8gdW4gY8OzZGlnbyBUT1RQIOKAlCBwYXJhIGN1ZW50YXMgT0F1dGgtb25seSBzaW4gY29udHJhc2XDsWEuICovXG4gIGRpc2FibGVXaXRoTWZhQ29kZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb2RlID0gdGhpcy5waW5Db250cm9sLnZhbHVlO1xuICAgIGlmICghY29kZSB8fCBjb2RlLmxlbmd0aCAhPT0gNikge1xuICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFDb2RlSW52YWxpZCcpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kaXNhYmxlKHsgbWZhQ29kZTogY29kZSB9KTtcbiAgfVxuXG4gIHNlbmREaXNhYmxlQ29kZSgpOiB2b2lkIHtcbiAgICB0aGlzLndvcmtpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuYXV0aC5zZW5kTUZBRGlzYWJsZUNvZGUoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlQ29kZVNlbnQuc2V0KHRydWUpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYURpc2FibGVDb2RlU2VudCcpKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMucmVzb2x2ZUVycm9yKGVycikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZShpbnB1dDogeyBwYXNzd29yZD86IHN0cmluZzsgbWZhQ29kZT86IHN0cmluZyB9KTogdm9pZCB7XG4gICAgdGhpcy53b3JraW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmF1dGguZGlzYWJsZU1GQShpbnB1dCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICBpZiAocmVzLm1mYURpc2FibGVkKSB7XG4gICAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFEaXNhYmxlZE9rJykpO1xuICAgICAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KCk7XG4gICAgICAgICAgdGhpcy5yZXNvbHZlU3RhdHVzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMucmVzb2x2ZUVycm9yKGVycikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDb3BpYSB1bmEgbGlzdGEgZGUgY8OzZGlnb3MgZGUgcmVzcGFsZG8gYWwgcG9ydGFwYXBlbGVzLiAqL1xuICBhc3luYyBjb3B5Q29kZXMoY29kZXM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvZGVzLmpvaW4oJ1xcbicpKTtcbiAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhQ29kZXNDb3BpZWQnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBzaW4gcmVjdXJzbyBkZSBjb3BpYSBkaXNwb25pYmxlICovXG4gICAgfVxuICB9XG5cbiAgLyoqIENvcGlhIGVsIHNlY3JldG8gVE9UUCBhbCBwb3J0YXBhcGVsZXMgKyBmZWVkYmFjayB2aXN1YWwgKGNoZWNrKSBkdXJhbnRlIDJzLiAqL1xuICBhc3luYyBjb3B5U2VjcmV0KHNlY3JldDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHNlY3JldCk7XG4gICAgICB0aGlzLmNvcGllZFNlY3JldC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYVNlY3JldENvcGllZCcpKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jb3BpZWRTZWNyZXQuc2V0KGZhbHNlKSwgMjAwMCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBzaW4gcmVjdXJzbyBkZSBjb3BpYSBkaXNwb25pYmxlICovXG4gICAgfVxuICB9XG5cbiAgLyoqIEV0aXF1ZXRhIGkxOG4gbGVnaWJsZSBwYXJhIHVuIG3DqXRvZG8gTUZBLiAqL1xuICBtZXRob2RMYWJlbChtZXRob2Q6IE1GQU1ldGhvZCB8IG51bGwpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdUT1RQJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhTWV0aG9kVG90cCcpO1xuICAgICAgY2FzZSAnRU1BSUwnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdtZmFNZXRob2RFbWFpbCcpO1xuICAgICAgY2FzZSAnU01TJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhTWV0aG9kU21zJyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhlbHBlcnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSByZXNldEZsb3coKTogdm9pZCB7XG4gICAgdGhpcy5waW5Db250cm9sLnJlc2V0KCk7XG4gICAgdGhpcy5waG9uZUNvbnRyb2wucmVzZXQoKTtcbiAgICB0aGlzLnRvdHBTZXR1cC5zZXQobnVsbCk7XG4gICAgdGhpcy50b3RwUXIuc2V0KG51bGwpO1xuICAgIHRoaXMucmVnZW5lcmF0ZWRDb2Rlcy5zZXQobnVsbCk7XG4gICAgdGhpcy5zZWxlY3RlZE1ldGhvZC5zZXQoJ1RPVFAnKTtcbiAgICB0aGlzLnN0b3BDb29sZG93bigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydENvb2xkb3duKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcENvb2xkb3duKCk7XG4gICAgdGhpcy5yZXNlbmRDb29sZG93bi5zZXQoUkVTRU5EX0NPT0xET1dOX1NFQ09ORFMpO1xuICAgIHRoaXMucmVzZW5kVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLnJlc2VuZENvb2xkb3duLnVwZGF0ZSh2ID0+IHYgLSAxKTtcbiAgICAgIGlmICh0aGlzLnJlc2VuZENvb2xkb3duKCkgPD0gMCkge1xuICAgICAgICB0aGlzLnN0b3BDb29sZG93bigpO1xuICAgICAgfVxuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wQ29vbGRvd24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzZW5kVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yZXNlbmRUaW1lcik7XG4gICAgICB0aGlzLnJlc2VuZFRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5yZXNlbmRDb29sZG93bi5zZXQoMCk7XG4gIH1cblxuICAvKiogTWFwZWEgbG9zIGPDs2RpZ29zIGRlIGVycm9yIE1GQSBkZWwgYmFja2VuZCBhIG1lbnNhamVzIGRlbCBuYW1lc3BhY2UgYF9hdXRoYC4gKi9cbiAgcHJpdmF0ZSByZXNvbHZlRXJyb3IoZXJyOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2RlID0gKGVyciBhcyB7IGNvZGU/OiBzdHJpbmcgfSk/LmNvZGU7XG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICBjYXNlICdBVVRIVjJfTUZBX0lOVkFMSURfQ09ERSc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9ySW52YWxpZENvZGUnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9FWFBJUkVEX0NPREUnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdtZmFFcnJvckV4cGlyZWRDb2RlJyk7XG4gICAgICBjYXNlICdBVVRIVjJfQ09ERV9VU0VEJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhRXJyb3JDb2RlVXNlZCcpO1xuICAgICAgY2FzZSAnQVVUSFYyX01GQV9BTFJFQURZX0FDVElWRSc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9yQWxyZWFkeUFjdGl2ZScpO1xuICAgICAgY2FzZSAnQVVUSFYyX01GQV9OT1RfRU5BQkxFRCc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9yTm90RW5hYmxlZCcpO1xuICAgICAgY2FzZSAnQVVUSFYyX1BIT05FX1JFUVVJUkVEJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhRXJyb3JQaG9uZVJlcXVpcmVkJyk7XG4gICAgICBjYXNlICdBVVRIVjJfUEhPTkVfRVhJU1RTJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhRXJyb3JQaG9uZUV4aXN0cycpO1xuICAgICAgY2FzZSAnQVVUSFYyX1RPT19NQU5ZX0FUVEVNUFRTJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnZXJyb3JUb29NYW55QXR0ZW1wdHMnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9JTlZBTElEX0NVUlJFTlRfUEFTU1dPUkQnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdlcnJvckN1cnJlbnRQYXNzd29yZFdyb25nJyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy50KCdlcnJvckdlbmVyaWMnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3dUb2FzdChtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRvYXN0LnNob3coeyBtZXNzYWdlLCBkdXJhdGlvbjogMzUwMCB9KTtcbiAgfVxufVxuIiwiPGlvbi1tb2RhbCBbaXNPcGVuXT1cImlzT3BlblwiIChkaWREaXNtaXNzKT1cImNsb3NlKClcIiBjc3NDbGFzcz1cInZhbC1tb2RhbC1hZGFwdGl2ZVwiPlxuICA8bmctdGVtcGxhdGU+XG4gICAgPGlvbi1oZWFkZXI+XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgc2hhcGU9XCJyb3VuZFwiIChjbGljayk9XCJjbG9zZSgpXCI+XG4gICAgICAgICAgICA8c3Ryb25nPnt7IHQoJ2Nsb3NlJykgfX08L3N0cm9uZz5cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvaW9uLWJ1dHRvbnM+XG4gICAgICA8L2lvbi10b29sYmFyPlxuICAgIDwvaW9uLWhlYWRlcj5cblxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cIm1mYS1tb2RhbFwiPlxuICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cInsgY29udGVudDogdCgnbWZhTWFuYWdlVGl0bGUnKSwgc2l6ZTogJ3NtYWxsJywgY29sb3I6ICdkYXJrJyB9XCIgLz5cblxuICAgICAgICBAc3dpdGNoIChzdGVwKCkpIHsgQGNhc2UgKCdsb2FkaW5nJykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibWZhLWxvYWRpbmdcIj5cbiAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGNhc2UgKCdzdGF0dXMnKSB7IEBpZiAobWZhRW5hYmxlZCgpKSB7XG4gICAgICAgIDxwIGNsYXNzPVwibWZhLXN0YXR1cyBtZmEtc3RhdHVzLS1vblwiPnt7IHQoJ21mYUVuYWJsZWRMYWJlbCcpIH19IMK3IHt7IG1ldGhvZExhYmVsKG1mYU1ldGhvZCgpKSB9fTwvcD5cblxuICAgICAgICBAaWYgKG1mYU1ldGhvZCgpID09PSAnVE9UUCcpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1ibG9ja1wiPlxuICAgICAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgc2l6ZTogJ3NtYWxsJywgY29sb3I6ICdkYXJrJywgYm9sZDogdHJ1ZSwgY29udGVudDogdCgnbWZhQmFja3VwQ29kZXNUaXRsZScpIH1cIiAvPlxuICAgICAgICAgIDx2YWwtdGV4dFxuICAgICAgICAgICAgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiB0KCdtZmFCYWNrdXBDb2Rlc0F2YWlsYWJsZScpICsgJzogJyArIGJhY2t1cENvZGVzQ291bnQoKSB9XCJcbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgQGlmIChyZWdlbmVyYXRlZENvZGVzKCk7IGFzIGNvZGVzKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1hbGVydFwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJpbmZvcm1hdGlvbi1jaXJjbGUtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8cD57eyB0KCdtZmFCYWNrdXBDb2Rlc1NhdmVXYXJuaW5nJykgfX0ge3sgdCgnbWZhQmFja3VwQ29kZXNFeHBsYWluJykgfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1jb2Rlc1wiPlxuICAgICAgICAgICAgQGZvciAoY29kZSBvZiBjb2RlczsgdHJhY2sgY29kZSkge1xuICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJtZmEtY29kZVwiPnt7IGNvZGUgfX08L2NvZGU+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cImRhcmtcIiBmaWxsPVwib3V0bGluZVwiIHNoYXBlPVwicm91bmRcIiAoY2xpY2spPVwiY29weUNvZGVzKGNvZGVzKVwiPlxuICAgICAgICAgICAge3sgdCgnbWZhQ29weUNvZGVzJykgfX1cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgfSBAZWxzZSB7IEBpZiAoYmFja3VwQ29kZXNDb3VudCgpIDwgMykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtYWxlcnRcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiaW5mb3JtYXRpb24tY2lyY2xlLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPHA+e3sgdCgnbWZhQmFja3VwQ29kZXNMb3cnKSB9fTwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgIGV4cGFuZD1cImJsb2NrXCJcbiAgICAgICAgICAgIGNvbG9yPVwiZGFya1wiXG4gICAgICAgICAgICBmaWxsPVwib3V0bGluZVwiXG4gICAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInJlZ2VuZXJhdGVCYWNrdXBDb2RlcygpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKHdvcmtpbmcoKSkge1xuICAgICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhUmVnZW5lcmF0ZUNvZGVzJykgfX0gfVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cImRhcmtcIiBmaWxsPVwib3V0bGluZVwiIHNoYXBlPVwicm91bmRcIiAoY2xpY2spPVwiZ29Ub0Rpc2FibGUoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYURpc2FibGVCdXR0b24nKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8cCBjbGFzcz1cIm1mYS1zdGF0dXMgbWZhLXN0YXR1cy0tb2ZmXCI+e3sgdCgnbWZhRGlzYWJsZWRMYWJlbCcpIH19PC9wPlxuICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiB0KCdtZmFEaXNhYmxlZEhpbnQnKSB9XCIgLz5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBzaGFwZT1cInJvdW5kXCIgKGNsaWNrKT1cImdvVG9NZXRob2RTZWxlY3QoKVwiPiB7eyB0KCdtZmFFbmFibGVCdXR0b24nKSB9fSA8L2lvbi1idXR0b24+XG4gICAgICAgIH0gfSBAY2FzZSAoJ21ldGhvZC1zZWxlY3QnKSB7XG4gICAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgY29udGVudDogdCgnbWZhRW5hYmxlVGl0bGUnKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UgfVwiIC8+XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwieyBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIGNvbnRlbnQ6IHQoJ21mYU1ldGhvZFByb21wdCcpIH1cIiAvPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtbWV0aG9kLWxpc3RcIiByb2xlPVwicmFkaW9ncm91cFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJtZmEtbWV0aG9kLWNhcmRcIlxuICAgICAgICAgICAgW2NsYXNzLm1mYS1tZXRob2QtY2FyZC0tYWN0aXZlXT1cInNlbGVjdGVkTWV0aG9kKCkgPT09ICdUT1RQJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRNZXRob2Quc2V0KCdUT1RQJylcIlxuICAgICAgICAgICAgcm9sZT1cInJhZGlvXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJzZWxlY3RlZE1ldGhvZCgpID09PSAnVE9UUCdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWZhLW1ldGhvZC1jYXJkX19kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1mYS1tZXRob2QtY2FyZF9fYm9keVwiPlxuICAgICAgICAgICAgICA8c3Ryb25nPnt7IHQoJ21mYU1ldGhvZFRvdHAnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICA8c3Bhbj57eyB0KCdtZmFNZXRob2RUb3RwSGludCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJtZmEtbWV0aG9kLWNhcmRcIlxuICAgICAgICAgICAgW2NsYXNzLm1mYS1tZXRob2QtY2FyZC0tYWN0aXZlXT1cInNlbGVjdGVkTWV0aG9kKCkgPT09ICdFTUFJTCdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkTWV0aG9kLnNldCgnRU1BSUwnKVwiXG4gICAgICAgICAgICByb2xlPVwicmFkaW9cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cInNlbGVjdGVkTWV0aG9kKCkgPT09ICdFTUFJTCdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWZhLW1ldGhvZC1jYXJkX19kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1mYS1tZXRob2QtY2FyZF9fYm9keVwiPlxuICAgICAgICAgICAgICA8c3Ryb25nPnt7IHQoJ21mYU1ldGhvZEVtYWlsJykgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgdCgnbWZhTWV0aG9kRW1haWxIaW50JykgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm1mYS1tZXRob2QtY2FyZFwiXG4gICAgICAgICAgICBbY2xhc3MubWZhLW1ldGhvZC1jYXJkLS1hY3RpdmVdPVwic2VsZWN0ZWRNZXRob2QoKSA9PT0gJ1NNUydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkTWV0aG9kLnNldCgnU01TJylcIlxuICAgICAgICAgICAgcm9sZT1cInJhZGlvXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJzZWxlY3RlZE1ldGhvZCgpID09PSAnU01TJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZmEtbWV0aG9kLWNhcmRfX2RvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWZhLW1ldGhvZC1jYXJkX19ib2R5XCI+XG4gICAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnbWZhTWV0aG9kU21zJykgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgdCgnbWZhTWV0aG9kU21zSGludCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKHNlbGVjdGVkTWV0aG9kKCkgPT09ICdTTVMnICYmICF1c2VyUGhvbmUoKSkge1xuICAgICAgICA8aW9uLWlucHV0XG4gICAgICAgICAgbGFiZWw9XCJ7eyB0KCdtZmFQaG9uZUxhYmVsJykgfX1cIlxuICAgICAgICAgIGxhYmVsUGxhY2VtZW50PVwiZmxvYXRpbmdcIlxuICAgICAgICAgIGZpbGw9XCJvdXRsaW5lXCJcbiAgICAgICAgICB0eXBlPVwidGVsXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIis1NjkxMjM0NTY3OFwiXG4gICAgICAgICAgW2Zvcm1Db250cm9sXT1cInBob25lQ29udHJvbFwiXG4gICAgICAgID48L2lvbi1pbnB1dD5cbiAgICAgICAgQGlmIChwaG9uZUNvbnRyb2wuaW52YWxpZCAmJiBwaG9uZUNvbnRyb2wudG91Y2hlZCkge1xuICAgICAgICA8cCBjbGFzcz1cIm1mYS1lcnJvclwiPnt7IHQoJ21mYVBob25lSW52YWxpZCcpIH19PC9wPlxuICAgICAgICB9IH0gQGlmIChzZWxlY3RlZE1ldGhvZCgpID09PSAnU01TJyAmJiB1c2VyUGhvbmUoKTsgYXMgcGhvbmUpIHtcbiAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiB0KCdtZmFQaG9uZVJlZ2lzdGVyZWQnKSArICc6ICcgKyBwaG9uZSB9XCJcbiAgICAgICAgLz5cbiAgICAgICAgfVxuXG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgc2hhcGU9XCJyb3VuZFwiIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIiAoY2xpY2spPVwicHJvY2VlZFdpdGhNZXRob2QoKVwiPlxuICAgICAgICAgIEBpZiAod29ya2luZygpKSB7XG4gICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgICAgfSBAZWxzZSB7IHt7IHQoJ21mYUNvbnRpbnVlJykgfX0gfVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgc2hhcGU9XCJyb3VuZFwiIChjbGljayk9XCJiYWNrVG9TdGF0dXMoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYUNhbmNlbCcpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAY2FzZSAoJ3RvdHAtc2V0dXAnKSB7XG4gICAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgY29udGVudDogdCgnbWZhVG90cFNldHVwVGl0bGUnKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICcnLCBib2xkOiBmYWxzZSB9XCIgLz5cbiAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJ7IHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSwgY29udGVudDogdCgnbWZhVG90cFN0ZXAxJykgfVwiIC8+XG5cbiAgICAgICAgQGlmICh0b3RwUXIoKTsgYXMgcXIpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1xclwiPlxuICAgICAgICAgIDx2YWwtcXItY29kZSBbcHJvcHNdPVwieyBxcjogcXIgfVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBpZiAodG90cFNldHVwKCk7IGFzIHNldHVwKSB7XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwieyBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIGNvbnRlbnQ6IHQoJ21mYVRvdHBNYW51YWxFbnRyeScpIH1cIiAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWZhLXNlY3JldC1yb3dcIj5cbiAgICAgICAgICA8Y29kZSBjbGFzcz1cIm1mYS1zZWNyZXRcIj57eyBzZXR1cC5zZWNyZXQgfX08L2NvZGU+XG4gICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgc2l6ZT1cInNtYWxsXCIgKGNsaWNrKT1cImNvcHlTZWNyZXQoc2V0dXAuc2VjcmV0KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwidCgnY29weScpXCI+XG4gICAgICAgICAgICBAaWYgKGNvcGllZFNlY3JldCgpKSB7XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNoZWNrbWFyay1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjb3B5LW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJ7IHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSwgY29udGVudDogdCgnbWZhVG90cFN0ZXAyJykgfVwiIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtcGluXCI+XG4gICAgICAgICAgPHZhbC1waW4taW5wdXQgW3Byb3BzXT1cInBpbklucHV0UHJvcHNcIiAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIHNoYXBlPVwicm91bmRcIiBbZGlzYWJsZWRdPVwid29ya2luZygpXCIgKGNsaWNrKT1cInZlcmlmeVRvdHAoKVwiPlxuICAgICAgICAgIEBpZiAod29ya2luZygpKSB7XG4gICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgICAgfSBAZWxzZSB7IHt7IHQoJ21mYVRvdHBWZXJpZnknKSB9fSB9XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWZhLWJhY2t1cFwiPlxuICAgICAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgc2l6ZTogJ3NtYWxsJywgY29sb3I6ICdkYXJrJywgYm9sZDogdHJ1ZSwgY29udGVudDogdCgnbWZhQmFja3VwQ29kZXNUaXRsZScpIH1cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtYWxlcnRcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiaW5mb3JtYXRpb24tY2lyY2xlLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPHA+e3sgdCgnbWZhQmFja3VwQ29kZXNTYXZlV2FybmluZycpIH19IHt7IHQoJ21mYUJhY2t1cENvZGVzRXhwbGFpbicpIH19PC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtY29kZXNcIj5cbiAgICAgICAgICAgIEBmb3IgKGNvZGUgb2Ygc2V0dXAuYmFja3VwQ29kZXM7IHRyYWNrIGNvZGUpIHtcbiAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwibWZhLWNvZGVcIj57eyBjb2RlIH19PC9jb2RlPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgY29sb3I9XCJkYXJrXCIgZmlsbD1cIm91dGxpbmVcIiBzaGFwZT1cInJvdW5kXCIgKGNsaWNrKT1cImNvcHlDb2RlcyhzZXR1cC5iYWNrdXBDb2RlcylcIj5cbiAgICAgICAgICAgIHt7IHQoJ21mYUNvcHlDb2RlcycpIH19XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgc2hhcGU9XCJyb3VuZFwiIChjbGljayk9XCJiYWNrVG9TdGF0dXMoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYUNhbmNlbCcpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAY2FzZSAoJ2NvZGUtY29uZmlybScpIHtcbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiB0KCdtZmFDb25maXJtVGl0bGUnKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICcnLCBib2xkOiBmYWxzZSB9XCIgLz5cbiAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiBzZWxlY3RlZE1ldGhvZCgpID09PSAnRU1BSUwnID8gdCgnbWZhQ29uZmlybVByb21wdEVtYWlsJykgOiB0KCdtZmFDb25maXJtUHJvbXB0U21zJykgfVwiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1waW5cIj5cbiAgICAgICAgICA8dmFsLXBpbi1pbnB1dCBbcHJvcHNdPVwicGluSW5wdXRQcm9wc1wiIC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgc2hhcGU9XCJyb3VuZFwiIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIiAoY2xpY2spPVwiY29uZmlybUNvZGUoKVwiPlxuICAgICAgICAgIEBpZiAod29ya2luZygpKSB7XG4gICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgICAgfSBAZWxzZSB7IHt7IHQoJ21mYUNvbmZpcm1CdXR0b24nKSB9fSB9XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICA8cCBjbGFzcz1cIm1mYS1yZXNlbmRcIj5cbiAgICAgICAgICB7eyB0KCdtZmFOb0NvZGUnKSB9fSBAaWYgKHJlc2VuZENvb2xkb3duKCkgPiAwKSB7XG4gICAgICAgICAgPHNwYW4+e3sgdCgnbWZhUmVzZW5kSW4nKSB9fSB7eyByZXNlbmRDb29sZG93bigpIH19czwvc3Bhbj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8YSAoY2xpY2spPVwicmVzZW5kQ29kZSgpXCI+e3sgdCgnbWZhUmVzZW5kJykgfX08L2E+XG4gICAgICAgICAgfVxuICAgICAgICA8L3A+XG5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiBzaGFwZT1cInJvdW5kXCIgKGNsaWNrKT1cImJhY2tUb1N0YXR1cygpXCI+XG4gICAgICAgICAge3sgdCgnbWZhQ2FuY2VsJykgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICB9IEBjYXNlICgnZGlzYWJsZScpIHsgQGlmIChoYXNQYXNzd29yZCgpKSB7XG4gICAgICAgIDx2YWwtZm9ybSBbcHJvcHNdPVwiZGlzYWJsZUZvcm1Qcm9wcygpXCIgKG9uU3VibWl0KT1cIm9uRGlzYWJsZVN1Ym1pdCgkZXZlbnQpXCIgLz5cbiAgICAgICAgfSBAZWxzZSBpZiAobWZhTWV0aG9kKCkgPT09ICdUT1RQJykge1xuICAgICAgICA8dmFsLXRpdGxlIFtwcm9wc109XCJ7IGNvbnRlbnQ6IHQoJ21mYURpc2FibGVUaXRsZScpLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiB0KCdtZmFEaXNhYmxlVG90cFByb21wdCcpIH1cIiAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWZhLXBpblwiPlxuICAgICAgICAgIDx2YWwtcGluLWlucHV0IFtwcm9wc109XCJwaW5JbnB1dFByb3BzXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgc2hhcGU9XCJyb3VuZFwiIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIiAoY2xpY2spPVwiZGlzYWJsZVdpdGhNZmFDb2RlKClcIj5cbiAgICAgICAgICBAaWYgKHdvcmtpbmcoKSkge1xuICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgIH0gQGVsc2UgeyB7eyB0KCdtZmFEaXNhYmxlQnV0dG9uJykgfX0gfVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIH0gQGVsc2UgaWYgKG1mYU1ldGhvZCgpID09PSAnRU1BSUwnIHx8IG1mYU1ldGhvZCgpID09PSAnU01TJykge1xuICAgICAgICA8dmFsLXRpdGxlIFtwcm9wc109XCJ7IGNvbnRlbnQ6IHQoJ21mYURpc2FibGVUaXRsZScpLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuICAgICAgICBAaWYgKCFkaXNhYmxlQ29kZVNlbnQoKSkge1xuICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiB0KCdtZmFEaXNhYmxlQ29kZVByb21wdCcpIH1cIiAvPlxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIHNoYXBlPVwicm91bmRcIiBbZGlzYWJsZWRdPVwid29ya2luZygpXCIgKGNsaWNrKT1cInNlbmREaXNhYmxlQ29kZSgpXCI+XG4gICAgICAgICAgQGlmICh3b3JraW5nKCkpIHtcbiAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhRGlzYWJsZVNlbmRDb2RlJykgfX0gfVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiB0KCdtZmFEaXNhYmxlQ29kZVByb21wdCcpIH1cIiAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWZhLXBpblwiPlxuICAgICAgICAgIDx2YWwtcGluLWlucHV0IFtwcm9wc109XCJwaW5JbnB1dFByb3BzXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgc2hhcGU9XCJyb3VuZFwiIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIiAoY2xpY2spPVwiZGlzYWJsZVdpdGhNZmFDb2RlKClcIj5cbiAgICAgICAgICBAaWYgKHdvcmtpbmcoKSkge1xuICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgIH0gQGVsc2UgeyB7eyB0KCdtZmFEaXNhYmxlQnV0dG9uJykgfX0gfVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgZmlsbD1cImNsZWFyXCIgY29sb3I9XCJtZWRpdW1cIiBzaGFwZT1cInJvdW5kXCIgW2Rpc2FibGVkXT1cIndvcmtpbmcoKVwiIChjbGljayk9XCJzZW5kRGlzYWJsZUNvZGUoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYURpc2FibGVSZXNlbmRDb2RlJykgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICB9IH0gQGVsc2Uge1xuICAgICAgICA8dmFsLXRpdGxlIFtwcm9wc109XCJ7IGNvbnRlbnQ6IHQoJ21mYURpc2FibGVUaXRsZScpLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiB0KCdtZmFEaXNhYmxlTmVlZHNQYXNzd29yZCcpIH1cIiAvPlxuICAgICAgICB9XG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgc2hhcGU9XCJyb3VuZFwiIChjbGljayk9XCJiYWNrVG9TdGF0dXMoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYUNhbmNlbCcpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSB9XG4gICAgICA8L3NlY3Rpb24+XG4gICAgPC9pb24tY29udGVudD5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvaW9uLW1vZGFsPlxuIl19
|
|
539
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWZhLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvbWZhLW1vZGFsL21mYS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL21mYS1tb2RhbC9tZmEtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixTQUFTLEVBQ1QsT0FBTyxFQUNQLFFBQVEsRUFDUixPQUFPLEVBQ1AsUUFBUSxFQUNSLFFBQVEsRUFDUixRQUFRLEVBQ1IsYUFBYSxFQUNiLFVBQVUsRUFDVixVQUFVLEdBQ1gsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDbEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDeEYsT0FBTyxFQUFFLGVBQWUsRUFBNEIsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25GLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUV6RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7O0FBSy9ELHNFQUFzRTtBQUN0RSxNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztBQUVuQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQThCSCxNQUFNLE9BQU8saUJBQWlCO0lBRzVCLHdFQUF3RTtJQUN4RSxJQUNJLE1BQU0sQ0FBQyxLQUFjO1FBQ3ZCLE1BQU0sT0FBTyxHQUFHLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLDZEQUE2RDtZQUM3RCxxRUFBcUU7WUFDckUsd0VBQXdFO1lBQ3hFLHNFQUFzRTtZQUN0RSxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQXFHRDtRQXRIUSxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBMEJ4QixzRUFBc0U7UUFDNUQsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFN0M7Ozs7V0FJRztRQUNPLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFeEQsaUVBQWlFO1FBQ3ZELGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXZDLFNBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0IsVUFBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QixTQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNCLGVBQVUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDckMsVUFBSyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRTFCLFVBQUssR0FBRyxNQUFNLENBQVUsU0FBUyxDQUFDLENBQUM7UUFDcEQsNkJBQTZCO1FBQ3BCLFNBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRXhDLDREQUE0RDtRQUNuRCxZQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWpDLHFCQUFxQjtRQUNaLGVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsY0FBUyxHQUFHLE1BQU0sQ0FBbUIsSUFBSSxDQUFDLENBQUM7UUFDM0MsY0FBUyxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7UUFDeEMscUJBQWdCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLG9GQUFvRjtRQUMzRSxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVwQyxvQ0FBb0M7UUFDM0IsbUJBQWMsR0FBRyxNQUFNLENBQVksTUFBTSxDQUFDLENBQUM7UUFDM0MsY0FBUyxHQUFHLE1BQU0sQ0FBMkIsSUFBSSxDQUFDLENBQUM7UUFDbkQsV0FBTSxHQUFHLE1BQU0sQ0FBa0IsSUFBSSxDQUFDLENBQUM7UUFDaEQseUVBQXlFO1FBQ2hFLHFCQUFnQixHQUFHLE1BQU0sQ0FBa0IsSUFBSSxDQUFDLENBQUM7UUFDMUQsb0ZBQW9GO1FBQzNFLGlCQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLG1CQUFjLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLG9CQUFlLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWhDLGVBQVUsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUcsaUJBQVksR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkcsa0JBQWEsR0FBRztZQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDeEIsS0FBSyxFQUFFLFVBQVU7WUFDakIsTUFBTSxFQUFFLENBQUM7WUFDVCxnQkFBZ0IsRUFBRSxJQUFJO1lBQ3RCLFNBQVMsRUFBRSxJQUFJO1NBQ2hCLENBQUM7UUFFRix1RUFBdUU7UUFDOUQscUJBQWdCLEdBQUcsUUFBUSxDQUFlLEdBQUcsRUFBRSxDQUN0RCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztZQUMxQixPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLGFBQWEsRUFBRSxPQUFPO1lBQ3RCLFFBQVEsRUFBRTtnQkFDUjtvQkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztvQkFDaEMsS0FBSyxFQUFFLENBQUM7b0JBQ1IsTUFBTSxFQUFFO3dCQUNOOzRCQUNFLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUTs0QkFDeEIsSUFBSSxFQUFFLFVBQVU7NEJBQ2hCLEtBQUssRUFBRSxzQkFBc0I7NEJBQzdCLFFBQVEsRUFBRSxrQkFBa0I7NEJBQzVCLElBQUksRUFBRSxFQUFFOzRCQUNSLGNBQWMsRUFBRSxxQkFBcUI7NEJBQ3JDLFNBQVMsRUFBRSxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBRTs0QkFDOUMsVUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQzs0QkFDakMsS0FBSyxFQUFFLENBQUM7NEJBQ1IsS0FBSyxFQUFFLGVBQWUsQ0FBQyxPQUFPO3lCQUMvQjtxQkFDRjtpQkFDRjthQUNGO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLEdBQUcsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUN2RSxLQUFLLEVBQUUsb0JBQW9CO2dCQUMzQixPQUFPLEVBQUUsa0JBQWtCO2FBQzVCO1lBQ0QsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU87U0FDMUUsQ0FBQyxDQUNILENBQUM7UUFFTSxnQkFBVyxHQUEwQyxJQUFJLENBQUM7UUFHaEUsUUFBUSxDQUFDLEVBQUUsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsK0NBQStDO0lBQy9DLENBQUMsQ0FBQyxHQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELGtEQUFrRDtJQUNsRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLElBQUk7UUFDVixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQy9CLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsa0JBQWtCO0lBQ2xCLDhFQUE4RTtJQUU5RSwyRUFBMkU7SUFDbkUsYUFBYTtRQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDL0IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUFFO2dCQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxTQUFTLEtBQUssTUFBTSxFQUFFLENBQUM7b0JBQ3ZELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDekIsQ0FBQztnQkFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQixDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDVixpREFBaUQ7Z0JBQ2pELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxVQUFVLElBQUksS0FBSyxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxTQUFTLElBQUksSUFBSSxDQUFDLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3hDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUNqRCxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDMUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSx5QkFBeUI7SUFDekIsOEVBQThFO0lBRTlFLGdCQUFnQjtRQUNkLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsOEVBQThFO0lBQzlFLGdCQUFnQjtJQUNoQiw4RUFBOEU7SUFFOUUscUVBQXFFO0lBQ3JFLGlCQUFpQjtRQUNmLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNyQyxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLEtBQXlCLENBQUM7UUFDOUIsSUFBSSxNQUFNLEtBQUssS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDMUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2dCQUMxQyxPQUFPO1lBQ1QsQ0FBQztZQUNELEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUM7UUFDL0MsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QixJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQy9CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDdkIsQ0FBQztZQUNILENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sU0FBUztRQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQzlCLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDVixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLEtBQUs7cUJBQ1AsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDO3FCQUM3QyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztxQkFDL0IsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMvQixDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNYLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN6QyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSxVQUFVO1FBQ1IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDbkMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDekMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDeEMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QixJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDdkIsQ0FBQztZQUNILENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsaURBQWlEO0lBQ2pELFdBQVc7UUFDVCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUN6QyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ25DLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDVixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO29CQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNwQixJQUFJLGdCQUFnQixFQUFFLENBQUM7d0JBQ3JCLGtFQUFrRTt3QkFDbEUsbUVBQW1FO3dCQUNuRSwrREFBK0Q7d0JBQy9ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDakMsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDdkIsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDekMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx5REFBeUQ7SUFDekQsVUFBVTtRQUNSLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSwyQkFBMkI7SUFDM0IsOEVBQThFO0lBRTlFLG1FQUFtRTtJQUNuRSxxQkFBcUI7UUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUMxQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0MsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDekMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx5REFBeUQ7SUFDekQsZUFBZSxDQUFDLEtBQWlCO1FBQy9CLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQztZQUM5QyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxzRkFBc0Y7SUFDdEYsa0JBQWtCO1FBQ2hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ25DLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN2QyxJQUFJLEVBQUUsR0FBRyxFQUFFO2dCQUNULElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNYLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN6QyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLE9BQU8sQ0FBQyxLQUE4QztRQUM1RCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDcEMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QixJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7b0JBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDdkIsQ0FBQztZQUNILENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsOERBQThEO0lBQzlELEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBZTtRQUM3QixJQUFJLENBQUM7WUFDSCxNQUFNLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxxQ0FBcUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFRCxrRkFBa0Y7SUFDbEYsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFjO1FBQzdCLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUMxQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLHFDQUFxQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVELGdEQUFnRDtJQUNoRCxXQUFXLENBQUMsTUFBd0I7UUFDbEMsUUFBUSxNQUFNLEVBQUUsQ0FBQztZQUNmLEtBQUssTUFBTTtnQkFDVCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDakMsS0FBSyxPQUFPO2dCQUNWLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2xDLEtBQUssS0FBSztnQkFDUixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDaEM7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxVQUFVO0lBQ1YsOEVBQThFO0lBRXRFLFNBQVM7UUFDZixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxtRkFBbUY7SUFDM0UsWUFBWSxDQUFDLEdBQVk7UUFDL0IsTUFBTSxJQUFJLEdBQUksR0FBeUIsRUFBRSxJQUFJLENBQUM7UUFDOUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUsseUJBQXlCO2dCQUM1QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUN2QyxLQUFLLHFCQUFxQjtnQkFDeEIsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDdkMsS0FBSyxrQkFBa0I7Z0JBQ3JCLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3BDLEtBQUssMkJBQTJCO2dCQUM5QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUN6QyxLQUFLLHdCQUF3QjtnQkFDM0IsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDdEMsS0FBSyx1QkFBdUI7Z0JBQzFCLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQ3pDLEtBQUsscUJBQXFCO2dCQUN4QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUN2QyxLQUFLLDBCQUEwQjtnQkFDN0IsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDeEMsS0FBSyxpQ0FBaUM7Z0JBQ3BDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQzdDO2dCQUNFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLFNBQVMsQ0FBQyxPQUFlO1FBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7K0dBdmZVLGlCQUFpQjttR0FBakIsaUJBQWlCLHNPQ3BHOUIsOHZZQWtSQSxpbkdEdk1JLG1CQUFtQiwrQkFDbkIsU0FBUyxvUEFDVCxVQUFVLDhFQUNWLFVBQVUsd0tBQ1YsU0FBUyxvR0FDVCxPQUFPLDJKQUlQLFFBQVEsc0RBR1IsVUFBVSx5R0FDVixVQUFVLG1GQUNWLGdCQUFnQiwyRUFDaEIsYUFBYSw4SEFDYixlQUFlLG1JQUNmLGFBQWEsd0VBQ2IsY0FBYyx5RUFDZCxpQkFBaUIsNkVBQ2pCLG1CQUFtQjs7NEZBS1YsaUJBQWlCO2tCQTdCN0IsU0FBUzsrQkFDRSxlQUFlLGNBQ2IsSUFBSSxXQUNQO3dCQUNQLG1CQUFtQjt3QkFDbkIsU0FBUzt3QkFDVCxVQUFVO3dCQUNWLFVBQVU7d0JBQ1YsU0FBUzt3QkFDVCxPQUFPO3dCQUNQLFFBQVE7d0JBQ1IsT0FBTzt3QkFDUCxRQUFRO3dCQUNSLFFBQVE7d0JBQ1IsUUFBUTt3QkFDUixhQUFhO3dCQUNiLFVBQVU7d0JBQ1YsVUFBVTt3QkFDVixnQkFBZ0I7d0JBQ2hCLGFBQWE7d0JBQ2IsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGNBQWM7d0JBQ2QsaUJBQWlCO3dCQUNqQixtQkFBbUI7cUJBQ3BCO3dEQVNHLE1BQU07c0JBRFQsS0FBSztnQkFxQkcsV0FBVztzQkFBbkIsS0FBSztnQkFHSSxPQUFPO3NCQUFoQixNQUFNO2dCQU9HLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFHRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIElvbkJ1dHRvbixcbiAgSW9uQnV0dG9ucyxcbiAgSW9uQ29udGVudCxcbiAgSW9uSGVhZGVyLFxuICBJb25JY29uLFxuICBJb25JbnB1dCxcbiAgSW9uSXRlbSxcbiAgSW9uTGFiZWwsXG4gIElvbk1vZGFsLFxuICBJb25SYWRpbyxcbiAgSW9uUmFkaW9Hcm91cCxcbiAgSW9uU3Bpbm5lcixcbiAgSW9uVG9vbGJhcixcbn0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IGluZm9ybWF0aW9uQ2lyY2xlT3V0bGluZSwgY29weU91dGxpbmUsIGNoZWNrbWFya091dGxpbmUgfSBmcm9tICdpb25pY29ucy9pY29ucyc7XG5cbmltcG9ydCB7IGJ1dHRvbiB9IGZyb20gJy4uLy4uL2F0b21zL2J1dHRvbi9mYWN0b3J5JztcbmltcG9ydCB7IERpc3BsYXlDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9kaXNwbGF5L2Rpc3BsYXkuY29tcG9uZW50JztcbmltcG9ydCB7IFFyQ29kZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL3FyLWNvZGUvcXItY29kZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGV4dENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL3RleHQvdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGl0bGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90aXRsZS90aXRsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGluSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvcGluLWlucHV0L3Bpbi1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGhvbmVJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9waG9uZS1pbnB1dC9waG9uZS1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50U3RhdGVzLCBGb3JtTWV0YWRhdGEsIEZvcm1TdWJtaXQsIElucHV0VHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9mb3JtL2Zvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aCc7XG5pbXBvcnQgeyBNRkFNZXRob2QsIFRPVFBTZXR1cFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aC90eXBlcyc7XG5pbXBvcnQgeyBJMThuU2VydmljZSwgSW5wdXRJMThuSGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBRckdlbmVyYXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9xci1nZW5lcmF0b3IvcXItZ2VuZXJhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgUXJSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9xci1nZW5lcmF0b3IvdHlwZXMnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdG9hc3Quc2VydmljZSc7XG5cbi8qKiBQYXNvIGRlbCBmbHVqbyBkZWwgbW9kYWwuICovXG50eXBlIE1mYVN0ZXAgPSAnbG9hZGluZycgfCAnc3RhdHVzJyB8ICdtZXRob2Qtc2VsZWN0JyB8ICd0b3RwLXNldHVwJyB8ICdjb2RlLWNvbmZpcm0nIHwgJ2Rpc2FibGUnO1xuXG4vKiogU2VndW5kb3MgZGUgZXNwZXJhIGFudGVzIGRlIHBvZGVyIHJlZW52aWFyIGVsIGPDs2RpZ28gRU1BSUwvU01TLiAqL1xuY29uc3QgUkVTRU5EX0NPT0xET1dOX1NFQ09ORFMgPSAzMDtcblxuLyoqXG4gKiBgdmFsLW1mYS1tb2RhbGAg4oCUIG1vZGFsIGRlIGdlc3Rpw7NuIGRlIGF1dGVudGljYWNpw7NuIGRlIGRvcyBmYWN0b3JlcyAoTUZBKVxuICogcGFyYSB1biB1c3VhcmlvIGF1dGVudGljYWRvLiBNaXNtbyBwYXRyw7NuIHF1ZSBgdmFsLWNoYW5nZS1wYXNzd29yZC1tb2RhbGAuXG4gKlxuICogRmx1am8gKG3DoXF1aW5hIGRlIGVzdGFkb3MgaW50ZXJuYSk6XG4gKiAgLSBgbG9hZGluZ2Ag4oaSIGBnZXRQcm9maWxlKClgIHBhcmEgY29ub2NlciBlbCBlc3RhZG8gTUZBLlxuICogIC0gYHN0YXR1c2Ag4oaSIG11ZXN0cmEgTUZBIGhhYmlsaXRhZG8vZGVzaGFiaWxpdGFkby4gU2kgZXN0w6EgaGFiaWxpdGFkbzpcbiAqICAgIGdlc3Rpw7NuIGRlIGJhY2t1cCBjb2RlcyAoVE9UUCkgKyBkZXNoYWJpbGl0YXIuIFNpIG5vOiBib3TDs24gaGFiaWxpdGFyLlxuICogIC0gYG1ldGhvZC1zZWxlY3RgIOKGkiBlbGVnaXIgVE9UUCAvIEVNQUlMIC8gU01TLlxuICogIC0gYHRvdHAtc2V0dXBgIOKGkiBRUiArIHNlY3JldG8gbWFudWFsICsgYmFja3VwIGNvZGVzIOKGkiB2ZXJpZmljYXIgY8OzZGlnby5cbiAqICAtIGBjb2RlLWNvbmZpcm1gIOKGkiAoRU1BSUwvU01TKSBpbmdyZXNhciBjw7NkaWdvIHJlY2liaWRvLCBjb24gcmVlbnbDrW8uXG4gKiAgLSBgZGlzYWJsZWAg4oaSIGNvbnRyYXNlw7FhIHBhcmEgZGVzaGFiaWxpdGFyIE1GQS5cbiAqXG4gKiBFbCBRUiBzZSBnZW5lcmEgKipjbGllbnQtc2lkZSoqIChgUXJHZW5lcmF0b3JTZXJ2aWNlYCkg4oCUIGVsIHNlY3JldG8gVE9UUFxuICogbnVuY2Egc2FsZSBkZWwgbmF2ZWdhZG9yLlxuICpcbiAqIFNlbGYtY29udGFpbmVkOiBpbnllY3RhIGBBdXRoU2VydmljZWAgeSBsbGFtYSBsb3MgZW5kcG9pbnRzIGRpcmVjdG8uIExhIGFwcFxuICogY29udHJvbGEgYFtpc09wZW5dYCB5IHJlYWNjaW9uYSBhIGAoY2hhbmdlZClgIC8gYChkaXNtaXNzZWQpYC5cbiAqXG4gKiBpMThuOiBuYW1lc3BhY2UgY29tcGFydGlkbyBgX2F1dGhgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8dmFsLW1mYS1tb2RhbFxuICogICBbaXNPcGVuXT1cImlzTW9kYWxPcGVuKClcIlxuICogICAoZGlzbWlzc2VkKT1cImlzTW9kYWxPcGVuLnNldChmYWxzZSlcIlxuICogLz5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtbWZhLW1vZGFsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgSW9uQnV0dG9uLFxuICAgIElvbkJ1dHRvbnMsXG4gICAgSW9uQ29udGVudCxcbiAgICBJb25IZWFkZXIsXG4gICAgSW9uSWNvbixcbiAgICBJb25JbnB1dCxcbiAgICBJb25JdGVtLFxuICAgIElvbkxhYmVsLFxuICAgIElvbk1vZGFsLFxuICAgIElvblJhZGlvLFxuICAgIElvblJhZGlvR3JvdXAsXG4gICAgSW9uU3Bpbm5lcixcbiAgICBJb25Ub29sYmFyLFxuICAgIERpc3BsYXlDb21wb25lbnQsXG4gICAgRm9ybUNvbXBvbmVudCxcbiAgICBRckNvZGVDb21wb25lbnQsXG4gICAgVGV4dENvbXBvbmVudCxcbiAgICBUaXRsZUNvbXBvbmVudCxcbiAgICBQaW5JbnB1dENvbXBvbmVudCxcbiAgICBQaG9uZUlucHV0Q29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vbWZhLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWZhLW1vZGFsLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIE1mYU1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfaXNPcGVuID0gZmFsc2U7XG5cbiAgLyoqIENvbnRyb2xhIGxhIHZpc2liaWxpZGFkLiBDYWRhIGFwZXJ0dXJhIHJlLXJlc3VlbHZlIGVsIGVzdGFkbyBNRkEuICovXG4gIEBJbnB1dCgpXG4gIHNldCBpc09wZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBvcGVuaW5nID0gdmFsdWUgJiYgIXRoaXMuX2lzT3BlbjtcbiAgICB0aGlzLl9pc09wZW4gPSB2YWx1ZTtcbiAgICBpZiAob3BlbmluZykge1xuICAgICAgLy8gRGlmZXJpbW9zIGFsIHByw7N4aW1vIG1pY3JvdGFzayBwYXJhIHF1ZSBlbCByZXN0byBkZSBASW5wdXRcbiAgICAgIC8vIChgcHJlZmlsbENvZGVgKSB5YSBlc3TDqW4gYXNpZ25hZG9zIOKAlCBBbmd1bGFyIHByb2Nlc2EgbG9zIGlucHV0cyBlblxuICAgICAgLy8gb3JkZW4gZGUgZGVjbGFyYWNpw7NuLCB5IHNpbiBlc3RvIGBvcGVuKClgIGxlZSBgcHJlZmlsbENvZGVgIHVuZGVmaW5lZFxuICAgICAgLy8gY3VhbmRvIGVsIHBhZHJlIHNldGVhIGFtYm9zIGVuIGVsIG1pc21vIHRpY2sgKGRlZXAtbGluayBNRkEtZW1haWwpLlxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5vcGVuKCkpO1xuICAgIH1cbiAgfVxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc09wZW47XG4gIH1cblxuICAvKipcbiAgICogQ8OzZGlnbyBNRkEgcHJlLWNhcmdhZG8gKGRlZXAtbGluayBkZXNkZSBlbCBlbWFpbCBkZSBzZXR1cCBNRkEtZW1haWwpLiBTaVxuICAgKiBlc3TDoSBwcmVzZW50ZSBhbCBhYnJpciwgZWwgbW9kYWwgc2FsdGEgZGlyZWN0byBhbCBwYXNvIGRlIGNvbmZpcm1hY2nDs25cbiAgICogY29uIGVsIGPDs2RpZ28gcmVsbGVuYWRvLlxuICAgKi9cbiAgQElucHV0KCkgcHJlZmlsbENvZGU/OiBzdHJpbmc7XG5cbiAgLyoqIEVtaXRlIGN1YW5kbyBlbCBlc3RhZG8gTUZBIGNhbWJpYSAoaGFiaWxpdGFkbyAvIGRlc2hhYmlsaXRhZG8pLiAqL1xuICBAT3V0cHV0KCkgY2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKipcbiAgICogRW1pdGlkbyBjdWFuZG8gdW4gc2V0dXAgTUZBIHNlIGNvbmZpcm1hIGV4aXRvc2FtZW50ZSB5IGVsIG1vZGFsIGZ1ZSBhYmllcnRvXG4gICAqIHbDrWEgZGVlcC1saW5rIChjb24gYHByZWZpbGxDb2RlYCkuIEVsIGhvc3QgcHVlZGUgdXNhcmxvIHBhcmEgY2VycmFyIGVsXG4gICAqIG1vZGFsIHkgbmF2ZWdhciAoZWouIGEgaG9tZSkgZW4gbHVnYXIgZGUgcXVlZGFyc2UgZW4gbGEgcMOhZ2luYSBkZSBTZWN1cml0eS5cbiAgICovXG4gIEBPdXRwdXQoKSBlbmFibGVkVmlhRGVlcGxpbmsgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXRlIGN1YW5kbyBlbCB1c2VyIGNpZXJyYSBlbCBtb2RhbCAoYm90w7NuIFggbyBiYWNrZHJvcCkuICovXG4gIEBPdXRwdXQoKSBkaXNtaXNzZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0b2FzdCA9IGluamVjdChUb2FzdFNlcnZpY2UpO1xuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIGkxOG5IZWxwZXIgPSBpbmplY3QoSW5wdXRJMThuSGVscGVyKTtcbiAgcHJpdmF0ZSBxckdlbiA9IGluamVjdChRckdlbmVyYXRvclNlcnZpY2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0ZXAgPSBzaWduYWw8TWZhU3RlcD4oJ2xvYWRpbmcnKTtcbiAgLyoqIFBhc28gYWN0dWFsIGRlbCBmbHVqby4gKi9cbiAgcmVhZG9ubHkgc3RlcCA9IHRoaXMuX3N0ZXAuYXNSZWFkb25seSgpO1xuXG4gIC8qKiBgdHJ1ZWAgbWllbnRyYXMgdW5hIGxsYW1hZGEgYWwgYmFja2VuZCBlc3TDoSBlbiBjdXJzby4gKi9cbiAgcmVhZG9ubHkgd29ya2luZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gRXN0YWRvIE1GQSBhY3R1YWwuXG4gIHJlYWRvbmx5IG1mYUVuYWJsZWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBtZmFNZXRob2QgPSBzaWduYWw8TUZBTWV0aG9kIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHVzZXJQaG9uZSA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgYmFja3VwQ29kZXNDb3VudCA9IHNpZ25hbCgwKTtcbiAgLyoqIERlZmF1bHQgdHJ1ZSBwYXJhIG5vIHJvbXBlciBlbCBmbG93IHZpZWpvIHNpIGVsIGJhY2tlbmQgbm8gZGV2dWVsdmUgZWwgY2FtcG8uICovXG4gIHJlYWRvbmx5IGhhc1Bhc3N3b3JkID0gc2lnbmFsKHRydWUpO1xuXG4gIC8vIEVzdGFkbyBkZWwgZmx1am8gZGUgaGFiaWxpdGFjacOzbi5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRNZXRob2QgPSBzaWduYWw8TUZBTWV0aG9kPignVE9UUCcpO1xuICByZWFkb25seSB0b3RwU2V0dXAgPSBzaWduYWw8VE9UUFNldHVwUmVzcG9uc2UgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgdG90cFFyID0gc2lnbmFsPFFyUmVzdWx0IHwgbnVsbD4obnVsbCk7XG4gIC8qKiBDw7NkaWdvcyBkZSByZXNwYWxkbyByZWNpw6luIHJlZ2VuZXJhZG9zIOKAlCBzZSBtdWVzdHJhbiB1bmEgc29sYSB2ZXouICovXG4gIHJlYWRvbmx5IHJlZ2VuZXJhdGVkQ29kZXMgPSBzaWduYWw8c3RyaW5nW10gfCBudWxsPihudWxsKTtcbiAgLyoqIE1hcmNhIG1vbWVudMOhbmVhIGN1YW5kbyBlbCBzZWNyZXRvIFRPVFAgc2UgYWNhYmEgZGUgY29waWFyIChmZWVkYmFjayB2aXN1YWwpLiAqL1xuICByZWFkb25seSBjb3BpZWRTZWNyZXQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSByZXNlbmRDb29sZG93biA9IHNpZ25hbCgwKTtcbiAgcmVhZG9ubHkgZGlzYWJsZUNvZGVTZW50ID0gc2lnbmFsKGZhbHNlKTtcblxuICByZWFkb25seSBwaW5Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoNiksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDYpXSk7XG4gIHJlYWRvbmx5IHBob25lQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMucGF0dGVybigvXlxcK1sxLTldXFxkezYsMTR9JC8pXSk7XG5cbiAgcmVhZG9ubHkgcGluSW5wdXRQcm9wcyA9IHtcbiAgICBjb250cm9sOiB0aGlzLnBpbkNvbnRyb2wsXG4gICAgdG9rZW46ICdtZmEtY29kZScsXG4gICAgbGVuZ3RoOiA2LFxuICAgIGFsbG93TnVtYmVyc09ubHk6IHRydWUsXG4gICAgYXV0b0ZvY3VzOiB0cnVlLFxuICB9O1xuXG4gIC8qKiBGb3JtIGRlIGRlc2hhYmlsaXRhY2nDs24g4oCUIGB2YWwtZm9ybWAgY29uIHVuIGNhbXBvIGRlIGNvbnRyYXNlw7FhLiAqL1xuICByZWFkb25seSBkaXNhYmxlRm9ybVByb3BzID0gY29tcHV0ZWQ8Rm9ybU1ldGFkYXRhPigoKSA9PlxuICAgIHRoaXMuaTE4bkhlbHBlci5yZXNvbHZlRm9ybSh7XG4gICAgICBuYW1lS2V5OiAnbWZhRGlzYWJsZVRpdGxlJyxcbiAgICAgIGkxOG5OYW1lc3BhY2U6ICdfYXV0aCcsXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogdGhpcy50KCdtZmFEaXNhYmxlUHJvbXB0JyksXG4gICAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IElucHV0VHlwZS5QQVNTV09SRCxcbiAgICAgICAgICAgICAgbmFtZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgICAgdG9rZW46ICdtZmEtZGlzYWJsZS1wYXNzd29yZCcsXG4gICAgICAgICAgICAgIGxhYmVsS2V5OiAnbWZhUGFzc3dvcmRMYWJlbCcsXG4gICAgICAgICAgICAgIGhpbnQ6ICcnLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcktleTogJ3Bhc3N3b3JkUGxhY2Vob2xkZXInLFxuICAgICAgICAgICAgICBlcnJvcktleXM6IHsgcmVxdWlyZWQ6ICdtZmFQYXNzd29yZFJlcXVpcmVkJyB9LFxuICAgICAgICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYWN0aW9uczoge1xuICAgICAgICAuLi5idXR0b24oeyB0ZXh0OiAnJywgdHlwZTogJ3N1Ym1pdCcsIGZpbGw6ICdzb2xpZCcsIGV4cGFuZDogJ2Jsb2NrJyB9KSxcbiAgICAgICAgdG9rZW46ICdtZmEtZGlzYWJsZS1zdWJtaXQnLFxuICAgICAgICB0ZXh0S2V5OiAnbWZhRGlzYWJsZUJ1dHRvbicsXG4gICAgICB9LFxuICAgICAgc3RhdGU6IHRoaXMud29ya2luZygpID8gQ29tcG9uZW50U3RhdGVzLldPUktJTkcgOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICB9KVxuICApO1xuXG4gIHByaXZhdGUgcmVzZW5kVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGFkZEljb25zKHsgaW5mb3JtYXRpb25DaXJjbGVPdXRsaW5lLCBjb3B5T3V0bGluZSwgY2hlY2ttYXJrT3V0bGluZSB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcENvb2xkb3duKCk7XG4gIH1cblxuICAvKiogVHJhZHVjZSB1bmEgY2xhdmUgZGVsIG5hbWVzcGFjZSBgX2F1dGhgLiAqL1xuICB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCAnX2F1dGgnKTtcbiAgfVxuXG4gIC8qKiBDaWVycmUgaW5pY2lhZG8gcG9yIGVsIHVzZXIgKFggLyBiYWNrZHJvcCkuICovXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzbWlzc2VkLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdW50byBkZSBlbnRyYWRhIGFsIGFicmlyIGVsIG1vZGFsLiBDb24gYHByZWZpbGxDb2RlYCAoZGVlcC1saW5rIGRlbCBlbWFpbFxuICAgKiBkZSBzZXR1cCBNRkEtZW1haWwpIHNhbHRhIGRpcmVjdG8gYSBsYSBjb25maXJtYWNpw7NuOyBzaSBubywgcmVzdWVsdmUgZWxcbiAgICogZXN0YWRvIE1GQSBhY3R1YWwuXG4gICAqL1xuICBwcml2YXRlIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlZmlsbENvZGUpIHtcbiAgICAgIHRoaXMucmVzZXRGbG93KCk7XG4gICAgICB0aGlzLnNlbGVjdGVkTWV0aG9kLnNldCgnRU1BSUwnKTtcbiAgICAgIHRoaXMucGluQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnByZWZpbGxDb2RlKTtcbiAgICAgIHRoaXMuX3N0ZXAuc2V0KCdjb2RlLWNvbmZpcm0nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXNvbHZlU3RhdHVzKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ2FyZ2EgZGUgZXN0YWRvXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDb25zdWx0YSBlbCBwZXJmaWwgcGFyYSBjb25vY2VyIGVsIGVzdGFkbyBNRkEgeSBwb3NpY2lvbmFyIGVsIGZsdWpvLiAqL1xuICBwcml2YXRlIHJlc29sdmVTdGF0dXMoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RlcC5zZXQoJ2xvYWRpbmcnKTtcbiAgICB0aGlzLnJlc2V0RmxvdygpO1xuICAgIHRoaXMuYXV0aC5nZXRQcm9maWxlKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHByb2ZpbGUgPT4ge1xuICAgICAgICB0aGlzLm1mYUVuYWJsZWQuc2V0KHByb2ZpbGUubWZhRW5hYmxlZCk7XG4gICAgICAgIHRoaXMubWZhTWV0aG9kLnNldChwcm9maWxlLm1mYU1ldGhvZCA/PyBudWxsKTtcbiAgICAgICAgdGhpcy51c2VyUGhvbmUuc2V0KHByb2ZpbGUucGhvbmUgPz8gbnVsbCk7XG4gICAgICAgIHRoaXMuaGFzUGFzc3dvcmQuc2V0KHByb2ZpbGUuaGFzUGFzc3dvcmQgPz8gdHJ1ZSk7XG4gICAgICAgIGlmIChwcm9maWxlLm1mYUVuYWJsZWQgJiYgcHJvZmlsZS5tZmFNZXRob2QgPT09ICdUT1RQJykge1xuICAgICAgICAgIHRoaXMubG9hZEJhY2t1cENvdW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RlcC5zZXQoJ3N0YXR1cycpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiB1c2FyIGVsIHNpZ25hbCBkZSB1c3VhcmlvIGVuIHNlc2nDs24uXG4gICAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLmF1dGgudXNlcigpO1xuICAgICAgICB0aGlzLm1mYUVuYWJsZWQuc2V0KHVzZXI/Lm1mYUVuYWJsZWQgPz8gZmFsc2UpO1xuICAgICAgICB0aGlzLm1mYU1ldGhvZC5zZXQodXNlcj8ubWZhTWV0aG9kID8/IG51bGwpO1xuICAgICAgICB0aGlzLl9zdGVwLnNldCgnc3RhdHVzJyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQmFja3VwQ291bnQoKTogdm9pZCB7XG4gICAgdGhpcy5hdXRoLmdldEJhY2t1cENvZGVzQ291bnQoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHRoaXMuYmFja3VwQ29kZXNDb3VudC5zZXQocmVzLmNvdW50KSxcbiAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmJhY2t1cENvZGVzQ291bnQuc2V0KDApLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5hdmVnYWNpw7NuIGVudHJlIHBhc29zXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGdvVG9NZXRob2RTZWxlY3QoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdlbmVyYXRlZENvZGVzLnNldChudWxsKTtcbiAgICB0aGlzLl9zdGVwLnNldCgnbWV0aG9kLXNlbGVjdCcpO1xuICB9XG5cbiAgZ29Ub0Rpc2FibGUoKTogdm9pZCB7XG4gICAgdGhpcy5waW5Db250cm9sLnJlc2V0KCk7XG4gICAgdGhpcy5fc3RlcC5zZXQoJ2Rpc2FibGUnKTtcbiAgfVxuXG4gIGJhY2tUb1N0YXR1cygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BDb29sZG93bigpO1xuICAgIHRoaXMuZGlzYWJsZUNvZGVTZW50LnNldChmYWxzZSk7XG4gICAgdGhpcy5yZXNvbHZlU3RhdHVzKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGFiaWxpdGFyIE1GQVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQ29udGluw7phIGRlc2RlIGVsIHNlbGVjdG9yIGRlIG3DqXRvZG8gYWwgc2V0dXAgY29ycmVzcG9uZGllbnRlLiAqL1xuICBwcm9jZWVkV2l0aE1ldGhvZCgpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLnNlbGVjdGVkTWV0aG9kKCk7XG4gICAgaWYgKG1ldGhvZCA9PT0gJ1RPVFAnKSB7XG4gICAgICB0aGlzLnNldHVwVG90cCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwaG9uZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChtZXRob2QgPT09ICdTTVMnICYmICF0aGlzLnVzZXJQaG9uZSgpKSB7XG4gICAgICBpZiAodGhpcy5waG9uZUNvbnRyb2wuaW52YWxpZCkge1xuICAgICAgICB0aGlzLnBob25lQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhUGhvbmVJbnZhbGlkJykpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwaG9uZSA9IHRoaXMucGhvbmVDb250cm9sLnZhbHVlID8/IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLndvcmtpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuYXV0aC5zZXR1cE1GQShtZXRob2QsIHBob25lKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIGlmIChyZXMuY29kZVNlbnQpIHtcbiAgICAgICAgICB0aGlzLnBpbkNvbnRyb2wucmVzZXQoKTtcbiAgICAgICAgICB0aGlzLl9zdGVwLnNldCgnY29kZS1jb25maXJtJyk7XG4gICAgICAgICAgdGhpcy5zdGFydENvb2xkb3duKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMucmVzb2x2ZUVycm9yKGVycikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBUb3RwKCk6IHZvaWQge1xuICAgIHRoaXMud29ya2luZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5hdXRoLnNldHVwVE9UUCgpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICB0aGlzLnRvdHBTZXR1cC5zZXQocmVzKTtcbiAgICAgICAgdGhpcy5waW5Db250cm9sLnJlc2V0KCk7XG4gICAgICAgIHRoaXMucXJHZW5cbiAgICAgICAgICAuZ2VuZXJhdGUoeyBkYXRhOiByZXMucXJDb2RlVXJsLCB3aWR0aDogMjIwIH0pXG4gICAgICAgICAgLnRoZW4ocXIgPT4gdGhpcy50b3RwUXIuc2V0KHFyKSlcbiAgICAgICAgICAuY2F0Y2goKCkgPT4gdGhpcy50b3RwUXIuc2V0KG51bGwpKTtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuX3N0ZXAuc2V0KCd0b3RwLXNldHVwJyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogVmVyaWZpY2EgZWwgY8OzZGlnbyBUT1RQIGRlIGxhIGFwcCBkZSBhdXRlbnRpY2FjacOzbiB5IGFjdGl2YSBNRkEuICovXG4gIHZlcmlmeVRvdHAoKTogdm9pZCB7XG4gICAgY29uc3QgY29kZSA9IHRoaXMucGluQ29udHJvbC52YWx1ZTtcbiAgICBpZiAoIWNvZGUgfHwgY29kZS5sZW5ndGggIT09IDYpIHtcbiAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhQ29kZUludmFsaWQnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMud29ya2luZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5hdXRoLnZlcmlmeVRPVFBTZXR1cChjb2RlKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIGlmIChyZXMuZW5hYmxlZCkge1xuICAgICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhRW5hYmxlZE9rJykpO1xuICAgICAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KCk7XG4gICAgICAgICAgdGhpcy5yZXNvbHZlU3RhdHVzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMucmVzb2x2ZUVycm9yKGVycikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDb25maXJtYSBlbCBjw7NkaWdvIEVNQUlML1NNUyB5IGFjdGl2YSBNRkEuICovXG4gIGNvbmZpcm1Db2RlKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvZGUgPSB0aGlzLnBpbkNvbnRyb2wudmFsdWU7XG4gICAgaWYgKCFjb2RlIHx8IGNvZGUubGVuZ3RoICE9PSA2KSB7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYUNvZGVJbnZhbGlkJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLndvcmtpbmcuc2V0KHRydWUpO1xuICAgIGNvbnN0IGNhbWVGcm9tRGVlcGxpbmsgPSAhIXRoaXMucHJlZmlsbENvZGU7XG4gICAgdGhpcy5hdXRoLmNvbmZpcm1NRkEoY29kZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICBpZiAocmVzLm1mYUVuYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYUVuYWJsZWRPaycpKTtcbiAgICAgICAgICB0aGlzLmNoYW5nZWQuZW1pdCgpO1xuICAgICAgICAgIGlmIChjYW1lRnJvbURlZXBsaW5rKSB7XG4gICAgICAgICAgICAvLyBFbCB1c2VyIGxsZWfDsyB2w61hIGxpbmsgZGVsIGVtYWlsIOKGkiBlbCBob3N0IHNlIGVuY2FyZ2EgZGUgY2VycmFyXG4gICAgICAgICAgICAvLyBlbCBtb2RhbCB5IG5hdmVnYXIgKGVqLiBhIGhvbWUpLiBObyByZXNvbHZlbW9zIHN0YXR1cyBhY8OhIHBvcnF1ZVxuICAgICAgICAgICAgLy8gaW1wbGljYXLDrWEgZGVqYXIgZWwgbW9kYWwgYWJpZXJ0byBtb3N0cmFuZG8gZWwgZXN0YWRvIG51ZXZvLlxuICAgICAgICAgICAgdGhpcy5lbmFibGVkVmlhRGVlcGxpbmsuZW1pdCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVTdGF0dXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMucmVzb2x2ZUVycm9yKGVycikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWVudsOtYSBlbCBjw7NkaWdvIEVNQUlML1NNUyAocmUtZWplY3V0YSBlbCBzZXR1cCkuICovXG4gIHJlc2VuZENvZGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzZW5kQ29vbGRvd24oKSA+IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wcm9jZWVkV2l0aE1ldGhvZCgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEdlc3Rpw7NuIChNRkEgaGFiaWxpdGFkbylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFJlZ2VuZXJhIGxvcyBjw7NkaWdvcyBkZSByZXNwYWxkbyBUT1RQIHkgbG9zIG11ZXN0cmEgdW5hIHZlei4gKi9cbiAgcmVnZW5lcmF0ZUJhY2t1cENvZGVzKCk6IHZvaWQge1xuICAgIHRoaXMud29ya2luZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5hdXRoLnJlZ2VuZXJhdGVCYWNrdXBDb2RlcygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5iYWNrdXBDb2Rlc0NvdW50LnNldChyZXMuYmFja3VwQ29kZXMubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5yZWdlbmVyYXRlZENvZGVzLnNldChyZXMuYmFja3VwQ29kZXMpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy5yZXNvbHZlRXJyb3IoZXJyKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIERlc2hhYmlsaXRhIE1GQSB1c2FuZG8gbGEgY29udHJhc2XDsWEgZGUgbGEgY3VlbnRhLiAqL1xuICBvbkRpc2FibGVTdWJtaXQoZXZlbnQ6IEZvcm1TdWJtaXQpOiB2b2lkIHtcbiAgICBjb25zdCBwYXNzd29yZCA9IGV2ZW50LmZpZWxkc1sncGFzc3dvcmQnXTtcbiAgICBpZiAoIXBhc3N3b3JkKSB7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYVBhc3N3b3JkUmVxdWlyZWQnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGlzYWJsZSh7IHBhc3N3b3JkIH0pO1xuICB9XG5cbiAgLyoqIERlc2hhYmlsaXRhIE1GQSB1c2FuZG8gdW4gY8OzZGlnbyBUT1RQIOKAlCBwYXJhIGN1ZW50YXMgT0F1dGgtb25seSBzaW4gY29udHJhc2XDsWEuICovXG4gIGRpc2FibGVXaXRoTWZhQ29kZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb2RlID0gdGhpcy5waW5Db250cm9sLnZhbHVlO1xuICAgIGlmICghY29kZSB8fCBjb2RlLmxlbmd0aCAhPT0gNikge1xuICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFDb2RlSW52YWxpZCcpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kaXNhYmxlKHsgbWZhQ29kZTogY29kZSB9KTtcbiAgfVxuXG4gIHNlbmREaXNhYmxlQ29kZSgpOiB2b2lkIHtcbiAgICB0aGlzLndvcmtpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuYXV0aC5zZW5kTUZBRGlzYWJsZUNvZGUoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlQ29kZVNlbnQuc2V0KHRydWUpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYURpc2FibGVDb2RlU2VudCcpKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMucmVzb2x2ZUVycm9yKGVycikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZShpbnB1dDogeyBwYXNzd29yZD86IHN0cmluZzsgbWZhQ29kZT86IHN0cmluZyB9KTogdm9pZCB7XG4gICAgdGhpcy53b3JraW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmF1dGguZGlzYWJsZU1GQShpbnB1dCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICBpZiAocmVzLm1mYURpc2FibGVkKSB7XG4gICAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFEaXNhYmxlZE9rJykpO1xuICAgICAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KCk7XG4gICAgICAgICAgdGhpcy5yZXNvbHZlU3RhdHVzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMucmVzb2x2ZUVycm9yKGVycikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDb3BpYSB1bmEgbGlzdGEgZGUgY8OzZGlnb3MgZGUgcmVzcGFsZG8gYWwgcG9ydGFwYXBlbGVzLiAqL1xuICBhc3luYyBjb3B5Q29kZXMoY29kZXM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvZGVzLmpvaW4oJ1xcbicpKTtcbiAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhQ29kZXNDb3BpZWQnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBzaW4gcmVjdXJzbyBkZSBjb3BpYSBkaXNwb25pYmxlICovXG4gICAgfVxuICB9XG5cbiAgLyoqIENvcGlhIGVsIHNlY3JldG8gVE9UUCBhbCBwb3J0YXBhcGVsZXMgKyBmZWVkYmFjayB2aXN1YWwgKGNoZWNrKSBkdXJhbnRlIDJzLiAqL1xuICBhc3luYyBjb3B5U2VjcmV0KHNlY3JldDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHNlY3JldCk7XG4gICAgICB0aGlzLmNvcGllZFNlY3JldC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYVNlY3JldENvcGllZCcpKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jb3BpZWRTZWNyZXQuc2V0KGZhbHNlKSwgMjAwMCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBzaW4gcmVjdXJzbyBkZSBjb3BpYSBkaXNwb25pYmxlICovXG4gICAgfVxuICB9XG5cbiAgLyoqIEV0aXF1ZXRhIGkxOG4gbGVnaWJsZSBwYXJhIHVuIG3DqXRvZG8gTUZBLiAqL1xuICBtZXRob2RMYWJlbChtZXRob2Q6IE1GQU1ldGhvZCB8IG51bGwpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdUT1RQJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhTWV0aG9kVG90cCcpO1xuICAgICAgY2FzZSAnRU1BSUwnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdtZmFNZXRob2RFbWFpbCcpO1xuICAgICAgY2FzZSAnU01TJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhTWV0aG9kU21zJyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhlbHBlcnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSByZXNldEZsb3coKTogdm9pZCB7XG4gICAgdGhpcy5waW5Db250cm9sLnJlc2V0KCk7XG4gICAgdGhpcy5waG9uZUNvbnRyb2wucmVzZXQoKTtcbiAgICB0aGlzLnRvdHBTZXR1cC5zZXQobnVsbCk7XG4gICAgdGhpcy50b3RwUXIuc2V0KG51bGwpO1xuICAgIHRoaXMucmVnZW5lcmF0ZWRDb2Rlcy5zZXQobnVsbCk7XG4gICAgdGhpcy5zZWxlY3RlZE1ldGhvZC5zZXQoJ1RPVFAnKTtcbiAgICB0aGlzLnN0b3BDb29sZG93bigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydENvb2xkb3duKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcENvb2xkb3duKCk7XG4gICAgdGhpcy5yZXNlbmRDb29sZG93bi5zZXQoUkVTRU5EX0NPT0xET1dOX1NFQ09ORFMpO1xuICAgIHRoaXMucmVzZW5kVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLnJlc2VuZENvb2xkb3duLnVwZGF0ZSh2ID0+IHYgLSAxKTtcbiAgICAgIGlmICh0aGlzLnJlc2VuZENvb2xkb3duKCkgPD0gMCkge1xuICAgICAgICB0aGlzLnN0b3BDb29sZG93bigpO1xuICAgICAgfVxuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wQ29vbGRvd24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzZW5kVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yZXNlbmRUaW1lcik7XG4gICAgICB0aGlzLnJlc2VuZFRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5yZXNlbmRDb29sZG93bi5zZXQoMCk7XG4gIH1cblxuICAvKiogTWFwZWEgbG9zIGPDs2RpZ29zIGRlIGVycm9yIE1GQSBkZWwgYmFja2VuZCBhIG1lbnNhamVzIGRlbCBuYW1lc3BhY2UgYF9hdXRoYC4gKi9cbiAgcHJpdmF0ZSByZXNvbHZlRXJyb3IoZXJyOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2RlID0gKGVyciBhcyB7IGNvZGU/OiBzdHJpbmcgfSk/LmNvZGU7XG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICBjYXNlICdBVVRIVjJfTUZBX0lOVkFMSURfQ09ERSc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9ySW52YWxpZENvZGUnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9FWFBJUkVEX0NPREUnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdtZmFFcnJvckV4cGlyZWRDb2RlJyk7XG4gICAgICBjYXNlICdBVVRIVjJfQ09ERV9VU0VEJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhRXJyb3JDb2RlVXNlZCcpO1xuICAgICAgY2FzZSAnQVVUSFYyX01GQV9BTFJFQURZX0FDVElWRSc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9yQWxyZWFkeUFjdGl2ZScpO1xuICAgICAgY2FzZSAnQVVUSFYyX01GQV9OT1RfRU5BQkxFRCc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9yTm90RW5hYmxlZCcpO1xuICAgICAgY2FzZSAnQVVUSFYyX1BIT05FX1JFUVVJUkVEJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhRXJyb3JQaG9uZVJlcXVpcmVkJyk7XG4gICAgICBjYXNlICdBVVRIVjJfUEhPTkVfRVhJU1RTJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhRXJyb3JQaG9uZUV4aXN0cycpO1xuICAgICAgY2FzZSAnQVVUSFYyX1RPT19NQU5ZX0FUVEVNUFRTJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnZXJyb3JUb29NYW55QXR0ZW1wdHMnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9JTlZBTElEX0NVUlJFTlRfUEFTU1dPUkQnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdlcnJvckN1cnJlbnRQYXNzd29yZFdyb25nJyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy50KCdlcnJvckdlbmVyaWMnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3dUb2FzdChtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRvYXN0LnNob3coeyBtZXNzYWdlLCBkdXJhdGlvbjogMzUwMCB9KTtcbiAgfVxufVxuIiwiPGlvbi1tb2RhbCBbaXNPcGVuXT1cImlzT3BlblwiIChkaWREaXNtaXNzKT1cImNsb3NlKClcIiBjc3NDbGFzcz1cInZhbC1tb2RhbC1hZGFwdGl2ZVwiPlxuICA8bmctdGVtcGxhdGU+XG4gICAgPGlvbi1oZWFkZXI+XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgc2hhcGU9XCJyb3VuZFwiIChjbGljayk9XCJjbG9zZSgpXCI+XG4gICAgICAgICAgICA8c3Ryb25nPnt7IHQoJ2Nsb3NlJykgfX08L3N0cm9uZz5cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvaW9uLWJ1dHRvbnM+XG4gICAgICA8L2lvbi10b29sYmFyPlxuICAgIDwvaW9uLWhlYWRlcj5cblxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cIm1mYS1tb2RhbFwiPlxuICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cInsgY29udGVudDogdCgnbWZhTWFuYWdlVGl0bGUnKSwgc2l6ZTogJ3NtYWxsJywgY29sb3I6ICdkYXJrJyB9XCIgLz5cblxuICAgICAgICBAc3dpdGNoIChzdGVwKCkpIHsgQGNhc2UgKCdsb2FkaW5nJykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibWZhLWxvYWRpbmdcIj5cbiAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGNhc2UgKCdzdGF0dXMnKSB7IEBpZiAobWZhRW5hYmxlZCgpKSB7XG4gICAgICAgIDxwIGNsYXNzPVwibWZhLXN0YXR1cyBtZmEtc3RhdHVzLS1vblwiPnt7IHQoJ21mYUVuYWJsZWRMYWJlbCcpIH19IMK3IHt7IG1ldGhvZExhYmVsKG1mYU1ldGhvZCgpKSB9fTwvcD5cblxuICAgICAgICBAaWYgKG1mYU1ldGhvZCgpID09PSAnVE9UUCcpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1ibG9ja1wiPlxuICAgICAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgc2l6ZTogJ3NtYWxsJywgY29sb3I6ICdkYXJrJywgYm9sZDogdHJ1ZSwgY29udGVudDogdCgnbWZhQmFja3VwQ29kZXNUaXRsZScpIH1cIiAvPlxuICAgICAgICAgIDx2YWwtdGV4dFxuICAgICAgICAgICAgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiB0KCdtZmFCYWNrdXBDb2Rlc0F2YWlsYWJsZScpICsgJzogJyArIGJhY2t1cENvZGVzQ291bnQoKSB9XCJcbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgQGlmIChyZWdlbmVyYXRlZENvZGVzKCk7IGFzIGNvZGVzKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1hbGVydFwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJpbmZvcm1hdGlvbi1jaXJjbGUtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8cD57eyB0KCdtZmFCYWNrdXBDb2Rlc1NhdmVXYXJuaW5nJykgfX0ge3sgdCgnbWZhQmFja3VwQ29kZXNFeHBsYWluJykgfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1jb2Rlc1wiPlxuICAgICAgICAgICAgQGZvciAoY29kZSBvZiBjb2RlczsgdHJhY2sgY29kZSkge1xuICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJtZmEtY29kZVwiPnt7IGNvZGUgfX08L2NvZGU+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cImRhcmtcIiBmaWxsPVwib3V0bGluZVwiIHNoYXBlPVwicm91bmRcIiAoY2xpY2spPVwiY29weUNvZGVzKGNvZGVzKVwiPlxuICAgICAgICAgICAge3sgdCgnbWZhQ29weUNvZGVzJykgfX1cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgfSBAZWxzZSB7IEBpZiAoYmFja3VwQ29kZXNDb3VudCgpIDwgMykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtYWxlcnRcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiaW5mb3JtYXRpb24tY2lyY2xlLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPHA+e3sgdCgnbWZhQmFja3VwQ29kZXNMb3cnKSB9fTwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgIGV4cGFuZD1cImJsb2NrXCJcbiAgICAgICAgICAgIGNvbG9yPVwiZGFya1wiXG4gICAgICAgICAgICBmaWxsPVwib3V0bGluZVwiXG4gICAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInJlZ2VuZXJhdGVCYWNrdXBDb2RlcygpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKHdvcmtpbmcoKSkge1xuICAgICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhUmVnZW5lcmF0ZUNvZGVzJykgfX0gfVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cImRhcmtcIiBmaWxsPVwib3V0bGluZVwiIHNoYXBlPVwicm91bmRcIiAoY2xpY2spPVwiZ29Ub0Rpc2FibGUoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYURpc2FibGVCdXR0b24nKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8cCBjbGFzcz1cIm1mYS1zdGF0dXMgbWZhLXN0YXR1cy0tb2ZmXCI+e3sgdCgnbWZhRGlzYWJsZWRMYWJlbCcpIH19PC9wPlxuICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiB0KCdtZmFEaXNhYmxlZEhpbnQnKSB9XCIgLz5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBzaGFwZT1cInJvdW5kXCIgKGNsaWNrKT1cImdvVG9NZXRob2RTZWxlY3QoKVwiPiB7eyB0KCdtZmFFbmFibGVCdXR0b24nKSB9fSA8L2lvbi1idXR0b24+XG4gICAgICAgIH0gfSBAY2FzZSAoJ21ldGhvZC1zZWxlY3QnKSB7XG4gICAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgY29udGVudDogdCgnbWZhRW5hYmxlVGl0bGUnKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UgfVwiIC8+XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwieyBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIGNvbnRlbnQ6IHQoJ21mYU1ldGhvZFByb21wdCcpIH1cIiAvPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtbWV0aG9kLWxpc3RcIiByb2xlPVwicmFkaW9ncm91cFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJtZmEtbWV0aG9kLWNhcmRcIlxuICAgICAgICAgICAgW2NsYXNzLm1mYS1tZXRob2QtY2FyZC0tYWN0aXZlXT1cInNlbGVjdGVkTWV0aG9kKCkgPT09ICdUT1RQJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRNZXRob2Quc2V0KCdUT1RQJylcIlxuICAgICAgICAgICAgcm9sZT1cInJhZGlvXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJzZWxlY3RlZE1ldGhvZCgpID09PSAnVE9UUCdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWZhLW1ldGhvZC1jYXJkX19kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1mYS1tZXRob2QtY2FyZF9fYm9keVwiPlxuICAgICAgICAgICAgICA8c3Ryb25nPnt7IHQoJ21mYU1ldGhvZFRvdHAnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICA8c3Bhbj57eyB0KCdtZmFNZXRob2RUb3RwSGludCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJtZmEtbWV0aG9kLWNhcmRcIlxuICAgICAgICAgICAgW2NsYXNzLm1mYS1tZXRob2QtY2FyZC0tYWN0aXZlXT1cInNlbGVjdGVkTWV0aG9kKCkgPT09ICdFTUFJTCdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkTWV0aG9kLnNldCgnRU1BSUwnKVwiXG4gICAgICAgICAgICByb2xlPVwicmFkaW9cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cInNlbGVjdGVkTWV0aG9kKCkgPT09ICdFTUFJTCdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWZhLW1ldGhvZC1jYXJkX19kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1mYS1tZXRob2QtY2FyZF9fYm9keVwiPlxuICAgICAgICAgICAgICA8c3Ryb25nPnt7IHQoJ21mYU1ldGhvZEVtYWlsJykgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgdCgnbWZhTWV0aG9kRW1haWxIaW50JykgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm1mYS1tZXRob2QtY2FyZFwiXG4gICAgICAgICAgICBbY2xhc3MubWZhLW1ldGhvZC1jYXJkLS1hY3RpdmVdPVwic2VsZWN0ZWRNZXRob2QoKSA9PT0gJ1NNUydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkTWV0aG9kLnNldCgnU01TJylcIlxuICAgICAgICAgICAgcm9sZT1cInJhZGlvXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJzZWxlY3RlZE1ldGhvZCgpID09PSAnU01TJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZmEtbWV0aG9kLWNhcmRfX2RvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWZhLW1ldGhvZC1jYXJkX19ib2R5XCI+XG4gICAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnbWZhTWV0aG9kU21zJykgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgdCgnbWZhTWV0aG9kU21zSGludCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKHNlbGVjdGVkTWV0aG9kKCkgPT09ICdTTVMnICYmICF1c2VyUGhvbmUoKSkge1xuICAgICAgICA8dmFsLXBob25lLWlucHV0XG4gICAgICAgICAgW3Byb3BzXT1cInsgY29udHJvbDogcGhvbmVDb250cm9sLCBsYWJlbDogdCgnbWZhUGhvbmVMYWJlbCcpLCBwbGFjZWhvbGRlcjogJzkxMjM0NTY3OCcsIGRlZmF1bHRDb3VudHJ5OiAnQ0wnIH1cIlxuICAgICAgICAvPlxuICAgICAgICBAaWYgKHBob25lQ29udHJvbC5pbnZhbGlkICYmIHBob25lQ29udHJvbC50b3VjaGVkKSB7XG4gICAgICAgIDxwIGNsYXNzPVwibWZhLWVycm9yXCI+e3sgdCgnbWZhUGhvbmVJbnZhbGlkJykgfX08L3A+XG4gICAgICAgIH0gfSBAaWYgKHNlbGVjdGVkTWV0aG9kKCkgPT09ICdTTVMnICYmIHVzZXJQaG9uZSgpOyBhcyBwaG9uZSkge1xuICAgICAgICA8dmFsLXRleHRcbiAgICAgICAgICBbcHJvcHNdPVwieyBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIGNvbnRlbnQ6IHQoJ21mYVBob25lUmVnaXN0ZXJlZCcpICsgJzogJyArIHBob25lIH1cIlxuICAgICAgICAvPlxuICAgICAgICB9XG5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBzaGFwZT1cInJvdW5kXCIgW2Rpc2FibGVkXT1cIndvcmtpbmcoKVwiIChjbGljayk9XCJwcm9jZWVkV2l0aE1ldGhvZCgpXCI+XG4gICAgICAgICAgQGlmICh3b3JraW5nKCkpIHtcbiAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhQ29udGludWUnKSB9fSB9XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBmaWxsPVwib3V0bGluZVwiIGNvbG9yPVwiZGFya1wiIHNoYXBlPVwicm91bmRcIiAoY2xpY2spPVwiYmFja1RvU3RhdHVzKClcIj5cbiAgICAgICAgICB7eyB0KCdtZmFDYW5jZWwnKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIH0gQGNhc2UgKCd0b3RwLXNldHVwJykge1xuICAgICAgICA8dmFsLXRpdGxlIFtwcm9wc109XCJ7IGNvbnRlbnQ6IHQoJ21mYVRvdHBTZXR1cFRpdGxlJyksIHNpemU6ICdsYXJnZScsIGNvbG9yOiAnJywgYm9sZDogZmFsc2UgfVwiIC8+XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwieyBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIGNvbnRlbnQ6IHQoJ21mYVRvdHBTdGVwMScpIH1cIiAvPlxuXG4gICAgICAgIEBpZiAodG90cFFyKCk7IGFzIHFyKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtcXJcIj5cbiAgICAgICAgICA8dmFsLXFyLWNvZGUgW3Byb3BzXT1cInsgcXI6IHFyIH1cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAaWYgKHRvdHBTZXR1cCgpOyBhcyBzZXR1cCkge1xuICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiB0KCdtZmFUb3RwTWFudWFsRW50cnknKSB9XCIgLz5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1zZWNyZXQtcm93XCI+XG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJtZmEtc2VjcmV0XCI+e3sgc2V0dXAuc2VjcmV0IH19PC9jb2RlPlxuICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIHNpemU9XCJzbWFsbFwiIChjbGljayk9XCJjb3B5U2VjcmV0KHNldHVwLnNlY3JldClcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ2NvcHknKVwiPlxuICAgICAgICAgICAgQGlmIChjb3BpZWRTZWNyZXQoKSkge1xuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjaGVja21hcmstb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY29weS1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwieyBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIGNvbnRlbnQ6IHQoJ21mYVRvdHBTdGVwMicpIH1cIiAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWZhLXBpblwiPlxuICAgICAgICAgIDx2YWwtcGluLWlucHV0IFtwcm9wc109XCJwaW5JbnB1dFByb3BzXCIgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBzaGFwZT1cInJvdW5kXCIgW2Rpc2FibGVkXT1cIndvcmtpbmcoKVwiIChjbGljayk9XCJ2ZXJpZnlUb3RwKClcIj5cbiAgICAgICAgICBAaWYgKHdvcmtpbmcoKSkge1xuICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgIH0gQGVsc2UgeyB7eyB0KCdtZmFUb3RwVmVyaWZ5JykgfX0gfVxuICAgICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1iYWNrdXBcIj5cbiAgICAgICAgICA8dmFsLXRpdGxlIFtwcm9wc109XCJ7IHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IHRydWUsIGNvbnRlbnQ6IHQoJ21mYUJhY2t1cENvZGVzVGl0bGUnKSB9XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWZhLWFsZXJ0XCI+XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImluZm9ybWF0aW9uLWNpcmNsZS1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgIDxwPnt7IHQoJ21mYUJhY2t1cENvZGVzU2F2ZVdhcm5pbmcnKSB9fSB7eyB0KCdtZmFCYWNrdXBDb2Rlc0V4cGxhaW4nKSB9fTwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWZhLWNvZGVzXCI+XG4gICAgICAgICAgICBAZm9yIChjb2RlIG9mIHNldHVwLmJhY2t1cENvZGVzOyB0cmFjayBjb2RlKSB7XG4gICAgICAgICAgICA8Y29kZSBjbGFzcz1cIm1mYS1jb2RlXCI+e3sgY29kZSB9fTwvY29kZT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGNvbG9yPVwiZGFya1wiIGZpbGw9XCJvdXRsaW5lXCIgc2hhcGU9XCJyb3VuZFwiIChjbGljayk9XCJjb3B5Q29kZXMoc2V0dXAuYmFja3VwQ29kZXMpXCI+XG4gICAgICAgICAgICB7eyB0KCdtZmFDb3B5Q29kZXMnKSB9fVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGZpbGw9XCJvdXRsaW5lXCIgY29sb3I9XCJkYXJrXCIgc2hhcGU9XCJyb3VuZFwiIChjbGljayk9XCJiYWNrVG9TdGF0dXMoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYUNhbmNlbCcpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAY2FzZSAoJ2NvZGUtY29uZmlybScpIHtcbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiB0KCdtZmFDb25maXJtVGl0bGUnKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICcnLCBib2xkOiBmYWxzZSB9XCIgLz5cbiAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiBzZWxlY3RlZE1ldGhvZCgpID09PSAnRU1BSUwnID8gdCgnbWZhQ29uZmlybVByb21wdEVtYWlsJykgOiB0KCdtZmFDb25maXJtUHJvbXB0U21zJykgfVwiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1waW5cIj5cbiAgICAgICAgICA8dmFsLXBpbi1pbnB1dCBbcHJvcHNdPVwicGluSW5wdXRQcm9wc1wiIC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgc2hhcGU9XCJyb3VuZFwiIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIiAoY2xpY2spPVwiY29uZmlybUNvZGUoKVwiPlxuICAgICAgICAgIEBpZiAod29ya2luZygpKSB7XG4gICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgICAgfSBAZWxzZSB7IHt7IHQoJ21mYUNvbmZpcm1CdXR0b24nKSB9fSB9XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICA8cCBjbGFzcz1cIm1mYS1yZXNlbmRcIj5cbiAgICAgICAgICB7eyB0KCdtZmFOb0NvZGUnKSB9fSBAaWYgKHJlc2VuZENvb2xkb3duKCkgPiAwKSB7XG4gICAgICAgICAgPHNwYW4+e3sgdCgnbWZhUmVzZW5kSW4nKSB9fSB7eyByZXNlbmRDb29sZG93bigpIH19czwvc3Bhbj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8YSAoY2xpY2spPVwicmVzZW5kQ29kZSgpXCI+e3sgdCgnbWZhUmVzZW5kJykgfX08L2E+XG4gICAgICAgICAgfVxuICAgICAgICA8L3A+XG5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBmaWxsPVwib3V0bGluZVwiIGNvbG9yPVwiZGFya1wiIHNoYXBlPVwicm91bmRcIiAoY2xpY2spPVwiYmFja1RvU3RhdHVzKClcIj5cbiAgICAgICAgICB7eyB0KCdtZmFDYW5jZWwnKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIH0gQGNhc2UgKCdkaXNhYmxlJykgeyBAaWYgKGhhc1Bhc3N3b3JkKCkpIHtcbiAgICAgICAgPHZhbC1mb3JtIFtwcm9wc109XCJkaXNhYmxlRm9ybVByb3BzKClcIiAob25TdWJtaXQpPVwib25EaXNhYmxlU3VibWl0KCRldmVudClcIiAvPlxuICAgICAgICB9IEBlbHNlIGlmIChtZmFNZXRob2QoKSA9PT0gJ1RPVFAnKSB7XG4gICAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgY29udGVudDogdCgnbWZhRGlzYWJsZVRpdGxlJyksIHNpemU6ICdsYXJnZScsIGNvbG9yOiAnJywgYm9sZDogZmFsc2UgfVwiIC8+XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwieyBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIGNvbnRlbnQ6IHQoJ21mYURpc2FibGVUb3RwUHJvbXB0JykgfVwiIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtcGluXCI+XG4gICAgICAgICAgPHZhbC1waW4taW5wdXQgW3Byb3BzXT1cInBpbklucHV0UHJvcHNcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBzaGFwZT1cInJvdW5kXCIgW2Rpc2FibGVkXT1cIndvcmtpbmcoKVwiIChjbGljayk9XCJkaXNhYmxlV2l0aE1mYUNvZGUoKVwiPlxuICAgICAgICAgIEBpZiAod29ya2luZygpKSB7XG4gICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgICAgfSBAZWxzZSB7IHt7IHQoJ21mYURpc2FibGVCdXR0b24nKSB9fSB9XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAZWxzZSBpZiAobWZhTWV0aG9kKCkgPT09ICdFTUFJTCcgfHwgbWZhTWV0aG9kKCkgPT09ICdTTVMnKSB7XG4gICAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgY29udGVudDogdCgnbWZhRGlzYWJsZVRpdGxlJyksIHNpemU6ICdsYXJnZScsIGNvbG9yOiAnJywgYm9sZDogZmFsc2UgfVwiIC8+XG4gICAgICAgIEBpZiAoIWRpc2FibGVDb2RlU2VudCgpKSB7XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwieyBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIGNvbnRlbnQ6IHQoJ21mYURpc2FibGVDb2RlUHJvbXB0JykgfVwiIC8+XG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgc2hhcGU9XCJyb3VuZFwiIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIiAoY2xpY2spPVwic2VuZERpc2FibGVDb2RlKClcIj5cbiAgICAgICAgICBAaWYgKHdvcmtpbmcoKSkge1xuICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgIH0gQGVsc2UgeyB7eyB0KCdtZmFEaXNhYmxlU2VuZENvZGUnKSB9fSB9XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwieyBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIGNvbnRlbnQ6IHQoJ21mYURpc2FibGVDb2RlUHJvbXB0JykgfVwiIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtcGluXCI+XG4gICAgICAgICAgPHZhbC1waW4taW5wdXQgW3Byb3BzXT1cInBpbklucHV0UHJvcHNcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBzaGFwZT1cInJvdW5kXCIgW2Rpc2FibGVkXT1cIndvcmtpbmcoKVwiIChjbGljayk9XCJkaXNhYmxlV2l0aE1mYUNvZGUoKVwiPlxuICAgICAgICAgIEBpZiAod29ya2luZygpKSB7XG4gICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgICAgfSBAZWxzZSB7IHt7IHQoJ21mYURpc2FibGVCdXR0b24nKSB9fSB9XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBleHBhbmQ9XCJibG9ja1wiXG4gICAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgICBjb2xvcj1cIm1lZGl1bVwiXG4gICAgICAgICAgc2hhcGU9XCJyb3VuZFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIndvcmtpbmcoKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNlbmREaXNhYmxlQ29kZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHQoJ21mYURpc2FibGVSZXNlbmRDb2RlJykgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICB9IH0gQGVsc2Uge1xuICAgICAgICA8dmFsLXRpdGxlIFtwcm9wc109XCJ7IGNvbnRlbnQ6IHQoJ21mYURpc2FibGVUaXRsZScpLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiB0KCdtZmFEaXNhYmxlTmVlZHNQYXNzd29yZCcpIH1cIiAvPlxuICAgICAgICB9XG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgZmlsbD1cIm91dGxpbmVcIiBjb2xvcj1cImRhcmtcIiBzaGFwZT1cInJvdW5kXCIgKGNsaWNrKT1cImJhY2tUb1N0YXR1cygpXCI+XG4gICAgICAgICAge3sgdCgnbWZhQ2FuY2VsJykgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICB9IH1cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2lvbi1jb250ZW50PlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tbW9kYWw+XG4iXX0=
|
package/esm2022/lib/version.mjs
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Current version of valtech-components.
|
|
3
3
|
* This is automatically updated during the publish process.
|
|
4
4
|
*/
|
|
5
|
-
export const VERSION = '4.0.
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
export const VERSION = '4.0.59';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC41OSc7XG4iXX0=
|