UNPKG

@infordata-web/portal-common-component-lib

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.14.

153 lines 37.9 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; import { iif, of, Subscription } from 'rxjs'; import { debounceTime, distinctUntilChanged, filter, switchMap, take } from 'rxjs/operators'; import { getDateErrorMessage, getErrorMessage } from '../../utils/validators-messages.utils'; import { ValidateCodiceFiscalePIVA, ValidateName } from "../../utils/validators.utils"; import { ModalitaPagamentoService } from '../../services/modalita-pagamento.service'; export class EstremiPersonaFisicaComponent { constructor(modalitaPagamentoService) { this.modalitaPagamentoService = modalitaPagamentoService; this.viewSessoPF = false; this.validatePersonaFisicaEmitter = new EventEmitter(); this.personaFisicaEmitter = new EventEmitter(); this.maxDataNascita = new Date(); this.subscription = new Subscription(); this.getErrorMessage = getErrorMessage; this.getDateErrorMessage = getDateErrorMessage; // this.initPersonaFisicaForm(); // this.setCodiceFiscaleValidators(); } set _disableForm(val) { this.disableForm = val; if (this.disableForm) { this.estremiPersonaFisicaForm.disable(); this.validatePersonaFisicaEmitter.emit(); } else { this.estremiPersonaFisicaForm.enable(); } } ngOnInit() { this.initPersonaFisicaForm(); this.setFormControlsValue(); this.setCodiceFiscaleValidators(); // Set/Unset form controls validation on isNatoEstero Value Change this.subscription.add(this.estremiPersonaFisicaForm.controls['isNatoEstero'].valueChanges.subscribe(isNatoEstero => { if (isNatoEstero) { this.estremiPersonaFisicaForm.controls['provinciaNascita'].setValidators([]); this.estremiPersonaFisicaForm.controls['provinciaNascita'].patchValue(null); this.estremiPersonaFisicaForm.controls['provinciaNascita'].updateValueAndValidity(); this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].setValidators([]); this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].patchValue(null); this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].updateValueAndValidity(); this.estremiPersonaFisicaForm.controls['nazioneNascita'].setValidators([Validators.required]); this.estremiPersonaFisicaForm.controls['nazioneNascita'].updateValueAndValidity(); } else { this.estremiPersonaFisicaForm.controls['provinciaNascita'].setValidators([Validators.required]); this.estremiPersonaFisicaForm.controls['provinciaNascita'].updateValueAndValidity(); this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].setValidators([Validators.required]); this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].updateValueAndValidity(); this.estremiPersonaFisicaForm.controls['nazioneNascita'].setValidators([]); this.estremiPersonaFisicaForm.controls['nazioneNascita'].patchValue(null); this.estremiPersonaFisicaForm.controls['nazioneNascita'].updateValueAndValidity(); } })); this.getComuniOnProvinciaChange(); this.validatePersonaFisica(); this.personaFisicaEmit(); } getComuniOnProvinciaChange() { this.subscription.add(this.estremiPersonaFisicaForm.controls['provinciaNascita'].valueChanges.pipe(distinctUntilChanged(), switchMap(siglaProvinciaNascita => iif(() => !!siglaProvinciaNascita, this.modalitaPagamentoService.getComuni$(siglaProvinciaNascita).pipe(take(1)), of([])))).subscribe(comuni => { this.comuni = comuni; })); } validatePersonaFisica() { this.subscription.add(this.estremiPersonaFisicaForm.valueChanges.pipe(debounceTime(500), filter(() => this.estremiPersonaFisicaForm.valid)).subscribe((_) => { this.validatePersonaFisicaEmitter.emit(); })); } personaFisicaEmit() { this.subscription.add(this.estremiPersonaFisicaForm.valueChanges.pipe(debounceTime(500)).subscribe((_) => { const personaFisica = { infoAnagrafiche: { codFiscale: this.estremiPersonaFisicaForm.controls['codiceFiscale'].value, cognome: this.estremiPersonaFisicaForm.controls['cognome'].value, nome: this.estremiPersonaFisicaForm.controls['nome'].value }, infoNascita: { comuneNascita: this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].value, provinciaNascita: this.estremiPersonaFisicaForm.controls['provinciaNascita'].value, dataNascita: this.estremiPersonaFisicaForm.controls['dataNascita'].value } }; const isValid = this.estremiPersonaFisicaForm.valid; this.personaFisicaEmitter.emit({ persona: personaFisica ? personaFisica : null, isValid }); })); } initPersonaFisicaForm() { this.estremiPersonaFisicaForm = new FormGroup({ codiceFiscale: new FormControl(null), nome: new FormControl(null, [Validators.required, ValidateName]), cognome: new FormControl(null, [Validators.required, ValidateName]), isNatoEstero: new FormControl(false), provinciaNascita: new FormControl(null), codiceComuneNascita: new FormControl(null), nazioneNascita: new FormControl(null), dataNascita: new FormControl(null, [Validators.required]), sesso: new FormControl(null, this.viewSessoPF ? [Validators.required] : []) }); } setCodiceFiscaleValidators() { this.estremiPersonaFisicaForm.controls['codiceFiscale'].setValidators([ Validators.required, ValidateCodiceFiscalePIVA ]); } ngOnDestroy() { this.subscription.unsubscribe(); } convertToUppercase(event) { this.estremiPersonaFisicaForm.get('codiceFiscale').setValue(event.target.value.toUpperCase()); } onProvinciaChange() { this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].patchValue(null); this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].markAsTouched(); } setFormControlsValue() { var _a; this.estremiPersonaFisicaForm.controls['codiceFiscale'].setValue(this.personaFisica ? this.personaFisica.infoAnagrafiche.codFiscale : null); this.estremiPersonaFisicaForm.controls['nome'].setValue(this.personaFisica ? this.personaFisica.infoAnagrafiche.nome : null); this.estremiPersonaFisicaForm.controls['cognome'].setValue(this.personaFisica ? this.personaFisica.infoAnagrafiche.cognome : null); this.estremiPersonaFisicaForm.controls['isNatoEstero'].setValue(this.personaFisica && this.personaFisica.infoNascita.comuneNascita.startsWith("Z") ? true : false); this.estremiPersonaFisicaForm.controls['provinciaNascita'].setValue(this.personaFisica && !this.personaFisica.infoNascita.comuneNascita.startsWith("Z") ? this.personaFisica.infoNascita.provinciaNascita : null); this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].setValue(this.personaFisica && !this.personaFisica.infoNascita.comuneNascita.startsWith("Z") ? this.personaFisica.infoNascita.comuneNascita : null); this.estremiPersonaFisicaForm.controls['dataNascita'].setValue(this.personaFisica ? this.personaFisica.infoNascita.dataNascita : null); // TODO this.estremiPersonaFisicaForm.controls['sesso'].setValue(this.viewSessoPF ? 'M' : null); this.estremiPersonaFisicaForm.controls['nazioneNascita'].setValue(this.personaFisica && this.personaFisica.infoNascita.comuneNascita.startsWith("Z") ? (_a = this.personaFisica.infoNascita) === null || _a === void 0 ? void 0 : _a.comuneNascita : null); } } EstremiPersonaFisicaComponent.decorators = [ { type: Component, args: [{ selector: 'lib-estremi-persona-fisica', template: "<form [formGroup]=\"estremiPersonaFisicaForm\" [ngxsForm]=\"ngxsFormPath\">\r\n\t<div class=\"row\">\r\n\t\t<div class=\"col-12 col-lg-4 mt-2 mt-lg-0\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<input formControlName=\"codiceFiscale\"\r\n\t\t\t\t\t\tmatInput\r\n\t\t\t\t\t\t[maxlength]=\"16\"\r\n\t\t\t\t\t\tplaceholder=\"{{ 'required' | traduzione }} {{ 'codice-fiscale' | traduzione }}\"\r\n\t\t\t\t\t\t(input)=\"convertToUppercase($event)\" />\r\n\t\t\t\t<mat-error *ngIf=\"estremiPersonaFisicaForm.controls['codiceFiscale'].invalid\">\r\n\t\t\t\t\t{{ getErrorMessage(estremiPersonaFisicaForm.controls['codiceFiscale']) | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t\t<div class=\"col-12 col-lg-4 mt-2 mt-lg-0\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<input formControlName=\"nome\"\r\n\t\t\t\t\t\tmatInput\r\n\t\t\t\t\t\t[maxlength]=\"100\"\r\n\t\t\t\t\t\tplaceholder=\"{{ 'required' | traduzione }} {{ 'nome' | traduzione }}\"/>\r\n\t\t\t\t<mat-error *ngIf=\"estremiPersonaFisicaForm?.controls['nome'].invalid\">\r\n\t\t\t\t\t{{ getErrorMessage(estremiPersonaFisicaForm.controls['nome']) | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t\t<div class=\"col-12 col-lg-4 mt-2 mt-lg-0\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<input formControlName=\"cognome\"\r\n\t\t\t\t\t\tmatInput\r\n\t\t\t\t\t\t[maxlength]=\"100\"\r\n\t\t\t\t\t\tplaceholder=\"{{ 'required' | traduzione }} {{ 'cognome' | traduzione }}\"/>\r\n\t\t\t\t<mat-error *ngIf=\"estremiPersonaFisicaForm?.controls['cognome'].invalid\">\r\n\t\t\t\t\t{{ getErrorMessage(estremiPersonaFisicaForm.controls['cognome']) | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"row\">\r\n\t\t<div class=\"col-12 pt-3 pb-2 pt-lg-2 pb-lg-2\">\r\n\t\t\t<mat-checkbox formControlName=\"isNatoEstero\"\r\n\t\t\t\t\t\t color=\"primary\">\r\n\t\t\t\t<info-tip-label label=\"localita-nascita-estera\"></info-tip-label>\r\n\t\t\t</mat-checkbox>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"row\">\r\n\t\t<ng-container *ngIf=\"!estremiPersonaFisicaForm?.controls['isNatoEstero']?.value else nascitaEstera\">\r\n\t\t\t<div class=\"col-12 col-lg-4 mt-2 mt-lg-0\">\r\n\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t<mat-label>{{ 'required' | traduzione }}{{ 'provincia-nascita' | traduzione }}</mat-label>\r\n\t\t\t\t\t<mat-select [placeholder]=\"'seleziona' | traduzione\" formControlName=\"provinciaNascita\" (valueChange)=\"onProvinciaChange()\">\r\n\t\t\t\t\t\t<mat-option *ngFor=\"let provincia of province\" [value]=\"provincia.sigla\">\r\n\t\t\t\t\t\t\t{{ provincia.denominazione }}\r\n\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t</mat-select>\r\n\t\t\t\t\t<mat-error *ngIf=\"estremiPersonaFisicaForm.controls['provinciaNascita'].invalid\">\r\n\t\t\t\t\t\t{{ 'obbligatorio' | traduzione }}\r\n\t\t\t\t\t</mat-error>\r\n\t\t\t\t</mat-form-field>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"col-12 col-lg-4 mt-2 mt-lg-0\">\r\n\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t<mat-label>{{ 'required' | traduzione }}{{ 'comune-nascita' | traduzione }}</mat-label>\r\n\t\t\t\t\t<mat-select placeholder=\"{{ 'seleziona' | traduzione }}\" formControlName=\"codiceComuneNascita\">\r\n\t\t\t\t\t\t<mat-option *ngFor=\"let comune of comuni\" [value]=\"comune.codiceCatastale\">\r\n\t\t\t\t\t\t\t{{ comune.denominazione }}\r\n\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t</mat-select>\r\n\t\t\t\t\t<mat-error *ngIf=\"estremiPersonaFisicaForm.controls['codiceComuneNascita'].invalid\">\r\n\t\t\t\t\t\t{{ 'obbligatorio' | traduzione }}\r\n\t\t\t\t\t</mat-error>\r\n\t\t\t\t</mat-form-field>\r\n\t\t\t</div>\r\n\t\t</ng-container>\r\n\t\t<ng-template #nascitaEstera>\r\n\t\t\t<div class=\"col-12 col-lg-4 mt-2 mt-lg-0\">\r\n\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t<mat-label>{{ 'required' | traduzione }}{{ 'nazione-nascita' | traduzione }}</mat-label>\r\n\t\t\t\t\t<mat-select [placeholder]=\"'seleziona' | traduzione\" formControlName=\"nazioneNascita\">\r\n\t\t\t\t\t\t<mat-option *ngFor=\"let nazione of nazioni\" [value]=\"nazione.codiceCatastale\">\r\n\t\t\t\t\t\t\t{{ nazione.denominazione }}\r\n\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t</mat-select>\r\n\t\t\t\t\t<mat-error *ngIf=\"estremiPersonaFisicaForm.controls['nazioneNascita'].invalid\">\r\n\t\t\t\t\t\t{{ 'obbligatorio' | traduzione }}\r\n\t\t\t\t\t</mat-error>\r\n\t\t\t\t</mat-form-field>\r\n\t\t\t</div>\r\n\t\t</ng-template>\r\n\t\t<div class=\"col-12\" [ngClass]=\"viewSessoPF ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\testremiPersonaFisicaForm?.controls['isNatoEstero']?.value ? ' col-lg-4 mt-2 mt-lg-0'\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ' col-lg-2 mt-2 mt-lg-0'\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ' col-lg-4 mt-2 mt-lg-0'\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<input formControlName=\"dataNascita\"\r\n\t\t\t\t\t\t[max]=\"maxDataNascita\"\r\n\t\t\t\t\t\tmatInput\r\n\t\t\t\t\t\t[matDatepicker]=\"dataNascita\"\r\n\t\t\t\t\t\t[placeholder]=\"('required' | traduzione) + ('data-nascita' | traduzione)\">\r\n\t\t\t\t<mat-datepicker-toggle matSuffix [for]=\"dataNascita\"></mat-datepicker-toggle>\r\n\t\t\t\t<mat-datepicker #dataNascita></mat-datepicker>\r\n\t\t\t\t<mat-error *ngIf=\"estremiPersonaFisicaForm.controls['dataNascita'].invalid\">\r\n\t\t\t\t\t{{ getDateErrorMessage(estremiPersonaFisicaForm.controls['dataNascita']) | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t\t<mat-hint *infoTip=\"'formato-data'\"></mat-hint>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"viewSessoPF\" class=\"col-12 col-lg-2 mt-2 mt-lg-0\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>{{ 'required' | traduzione }}{{ 'sesso' | traduzione }}</mat-label>\r\n\t\t\t\t<mat-select [placeholder]=\"'seleziona' | traduzione\" formControlName=\"sesso\">\r\n\t\t\t\t\t<mat-option [value]=\"null\"> {{ \"seleziona\" | traduzione }} </mat-option>\r\n\t\t\t\t\t<mat-option value=\"M\">{{ \"maschio\" | traduzione }}</mat-option>\r\n\t\t\t\t\t<mat-option value=\"F\">{{ \"femmina\" | traduzione }}</mat-option>\r\n\t\t\t\t</mat-select>\r\n\t\t\t\t<mat-error *ngIf=\"estremiPersonaFisicaForm.controls['sesso'].invalid\">\r\n\t\t\t\t\t{{ 'obbligatorio' | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"row\">\r\n\t\t<div class=\"col-12 mt-2 mt-lg-0\">\r\n\t\t\t<mat-error *ngIf=\"!isPersonaFisicaValid && (estremiPersonaFisicaForm.dirty)\">\r\n\t\t\t\t{{'invalid-dati-anagrafici' | traduzione }}\r\n\t\t\t</mat-error>\r\n\t\t</div>\r\n\t</div>\r\n</form>\r\n\r\n", styles: [""] },] } ]; EstremiPersonaFisicaComponent.ctorParameters = () => [ { type: ModalitaPagamentoService } ]; EstremiPersonaFisicaComponent.propDecorators = { ngxsFormPath: [{ type: Input }], province: [{ type: Input }], nazioni: [{ type: Input }], isPersonaFisicaValid: [{ type: Input }], personaFisica: [{ type: Input }], viewSessoPF: [{ type: Input }], validatePersonaFisicaEmitter: [{ type: Output }], personaFisicaEmitter: [{ type: Output }], _disableForm: [{ type: Input, args: ['disableForm',] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXN0cmVtaS1wZXJzb25hLWZpc2ljYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiQzovUHJvZ2V0dGkvREFHL3NvcmdlbnRpL2dpdGxhYi1zb2Z0d2FyZWZhY3RvcnkvY29tbW9uLWNvbXBvbmVudC1saWIvcHJvamVjdHMvcG9ydGFsLWNvbW1vbi1jb21wb25lbnQtbGliL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9tb2RhbGl0YS1wYWdhbWVudG8vY29tcG9uZW50cy9lc3RyZW1pLXBlcnNvbmEtZmlzaWNhL2VzdHJlbWktcGVyc29uYS1maXNpY2EuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUMsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0YsT0FBTyxFQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBQzNGLE9BQU8sRUFBQyx5QkFBeUIsRUFBRSxZQUFZLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUNyRixPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQU1uRixNQUFNLE9BQU8sNkJBQTZCO0lBaUR6QyxZQUFvQix3QkFBa0Q7UUFBbEQsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQS9CdEUsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFHN0IsaUNBQTRCLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUd4RCx5QkFB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QkFBd0IsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsMENBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5TSxDQUFDOzs7WUF4TEQsU0FBUyxTQUFDO2dCQUNWLFFBQVEsRUFBRSw0QkFBNEI7Z0JBQ3RDLDY0TUFBc0Q7O2FBRXREOzs7WUFMTyx3QkFBd0I7OzsyQkFROUIsS0FBSzt1QkFHTCxLQUFLO3NCQUdMLEtBQUs7bUNBR0wsS0FBSzs0QkFHTCxLQUFLOzBCQUdMLEtBQUs7MkNBR0wsTUFBTTttQ0FHTixNQUFNOzJCQUdOLEtBQUssU0FBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0Zvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtpaWYsIG9mLCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge2RlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgc3dpdGNoTWFwLCB0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7Q29tdW5lTW9kZWwsIERhdGlBbmFnUGVyc29uYUZpc2ljYU1vZGVsLCBMb2NhbGl0YU1vZGVsLCBOYXppb25lTW9kZWx9IGZyb20gJy4uLy4uL21vZGVscy9lc3RyZW1pLXBlcnNvbmEtZmlzaWNhLm1vZGVsJztcclxuaW1wb3J0IHtnZXREYXRlRXJyb3JNZXNzYWdlLCBnZXRFcnJvck1lc3NhZ2V9IGZyb20gJy4uLy4uL3V0aWxzL3ZhbGlkYXRvcnMtbWVzc2FnZXMudXRpbHMnO1xyXG5pbXBvcnQge1ZhbGlkYXRlQ29kaWNlRmlzY2FsZVBJVkEsIFZhbGlkYXRlTmFtZX0gZnJvbSBcIi4uLy4uL3V0aWxzL3ZhbGlkYXRvcnMudXRpbHNcIjtcclxuaW1wb3J0IHtNb2RhbGl0YVBhZ2FtZW50b1NlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vZGFsaXRhLXBhZ2FtZW50by5zZXJ2aWNlJztcclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdsaWItZXN0cmVtaS1wZXJzb25hLWZpc2ljYScsXHJcblx0dGVtcGxhdGVVcmw6ICcuL2VzdHJlbWktcGVyc29uYS1maXNpY2EuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWycuL2VzdHJlbWktcGVyc29uYS1maXNpY2EuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRXN0cmVtaVBlcnNvbmFGaXNpY2FDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0bmd4c0Zvcm1QYXRoOiBzdHJpbmc7XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0cHJvdmluY2U6IExvY2FsaXRhTW9kZWxbXTtcclxuXHJcblx0QElucHV0KClcclxuXHRuYXppb25pOiBOYXppb25lTW9kZWxbXTtcclxuXHJcblx0QElucHV0KClcclxuXHRpc1BlcnNvbmFGaXNpY2FWYWxpZDogYm9vbGVhbjtcclxuXHJcblx0QElucHV0KClcclxuXHRwZXJzb25hRmlzaWNhOiBEYXRpQW5hZ1BlcnNvbmFGaXNpY2FNb2RlbDtcclxuXHJcblx0QElucHV0KClcclxuXHR2aWV3U2Vzc29QRjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHRAT3V0cHV0KClcclxuXHR2YWxpZGF0ZVBlcnNvbmFGaXNpY2FFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuXHRAT3V0cHV0KClcclxuXHRwZXJzb25hRmlzaWNhRW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8eyBwZXJzb25hOiBEYXRpQW5hZ1BlcnNvbmFGaXNpY2FNb2RlbCwgaXNWYWxpZDogYm9vbGVhbiB9PigpO1xyXG5cclxuXHRASW5wdXQoJ2Rpc2FibGVGb3JtJylcclxuXHRzZXQgX2Rpc2FibGVGb3JtKHZhbDogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5kaXNhYmxlRm9ybSA9IHZhbDtcclxuXHRcdGlmICh0aGlzLmRpc2FibGVGb3JtKSB7XHJcblx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmRpc2FibGUoKTtcclxuXHRcdFx0dGhpcy52YWxpZGF0ZVBlcnNvbmFGaXNpY2FFbWl0dGVyLmVtaXQoKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmVuYWJsZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZGlzYWJsZUZvcm06IGJvb2xlYW47XHJcblxyXG5cdGNvbXVuaTogQ29tdW5lTW9kZWxbXTtcclxuXHJcblx0ZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtOiBGb3JtR3JvdXA7XHJcblx0bWF4RGF0YU5hc2NpdGEgPSBuZXcgRGF0ZSgpO1xyXG5cclxuXHRwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuXHRnZXRFcnJvck1lc3NhZ2UgPSBnZXRFcnJvck1lc3NhZ2U7XHJcblx0Z2V0RGF0ZUVycm9yTWVzc2FnZSA9IGdldERhdGVFcnJvck1lc3NhZ2U7XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kYWxpdGFQYWdhbWVudG9TZXJ2aWNlOiBNb2RhbGl0YVBhZ2FtZW50b1NlcnZpY2UpIHtcclxuXHRcdC8vIHRoaXMuaW5pdFBlcnNvbmFGaXNpY2FGb3JtKCk7XHJcblx0XHQvLyB0aGlzLnNldENvZGljZUZpc2NhbGVWYWxpZGF0b3JzKCk7XHJcblx0fVxyXG5cclxuXHRuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuaW5pdFBlcnNvbmFGaXNpY2FGb3JtKCk7XHJcblx0XHR0aGlzLnNldEZvcm1Db250cm9sc1ZhbHVlKCk7XHJcblx0XHR0aGlzLnNldENvZGljZUZpc2NhbGVWYWxpZGF0b3JzKCk7XHJcblxyXG5cdFx0Ly8gU2V0L1Vuc2V0IGZvcm0gY29udHJvbHMgdmFsaWRhdGlvbiBvbiBpc05hdG9Fc3Rlcm8gVmFsdWUgQ2hhbmdlXHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbi5hZGQodGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ2lzTmF0b0VzdGVybyddLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoaXNOYXRvRXN0ZXJvID0+IHtcclxuXHRcdFx0aWYgKGlzTmF0b0VzdGVybykge1xyXG5cdFx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydwcm92aW5jaWFOYXNjaXRhJ10uc2V0VmFsaWRhdG9ycyhbXSlcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1sncHJvdmluY2lhTmFzY2l0YSddLnBhdGNoVmFsdWUobnVsbClcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1sncHJvdmluY2lhTmFzY2l0YSddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxyXG5cdFx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2RpY2VDb211bmVOYXNjaXRhJ10uc2V0VmFsaWRhdG9ycyhbXSlcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snY29kaWNlQ29tdW5lTmFzY2l0YSddLnBhdGNoVmFsdWUobnVsbClcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snY29kaWNlQ29tdW5lTmFzY2l0YSddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snbmF6aW9uZU5hc2NpdGEnXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSlcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snbmF6aW9uZU5hc2NpdGEnXS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ3Byb3ZpbmNpYU5hc2NpdGEnXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSlcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1sncHJvdmluY2lhTmFzY2l0YSddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxyXG5cdFx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2RpY2VDb211bmVOYXNjaXRhJ10uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXHJcblx0XHRcdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ2NvZGljZUNvbXVuZU5hc2NpdGEnXS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblx0XHRcdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ25hemlvbmVOYXNjaXRhJ10uc2V0VmFsaWRhdG9ycyhbXSlcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snbmF6aW9uZU5hc2NpdGEnXS5wYXRjaFZhbHVlKG51bGwpXHJcblx0XHRcdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ25hemlvbmVOYXNjaXRhJ10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KSk7XHJcblxyXG5cdFx0dGhpcy5nZXRDb211bmlPblByb3ZpbmNpYUNoYW5nZSgpO1xyXG5cdFx0dGhpcy52YWxpZGF0ZVBlcnNvbmFGaXNpY2EoKTtcclxuXHRcdHRoaXMucGVyc29uYUZpc2ljYUVtaXQoKTtcclxufVxyXG5cclxuXHRnZXRDb211bmlPblByb3ZpbmNpYUNoYW5nZSgpOiB2b2lkIHtcclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1sncHJvdmluY2lhTmFzY2l0YSddLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG5cdFx0XHRcdGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcblx0XHRcdFx0c3dpdGNoTWFwKHNpZ2xhUHJvdmluY2lhTmFzY2l0YSA9PlxyXG5cdFx0XHRcdFx0aWlmKCgpID0+ICEhc2lnbGFQcm92aW5jaWFOYXNjaXRhLFxyXG5cdFx0XHRcdFx0XHR0aGlzLm1vZGFsaXRhUGFnYW1lbnRvU2VydmljZS5nZXRDb211bmkkKHNpZ2xhUHJvdmluY2lhTmFzY2l0YSkucGlwZSh0YWtlKDEpKSxcclxuXHRcdFx0XHRcdFx0b2YoW10pXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdFx0KSkuc3Vic2NyaWJlKGNvbXVuaSA9PiB7XHJcblx0XHRcdFx0dGhpcy5jb211bmkgPSBjb211bmk7XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0dmFsaWRhdGVQZXJzb25hRmlzaWNhKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG5cdFx0XHRcdGRlYm91bmNlVGltZSg1MDApLFxyXG5cdFx0XHRcdGZpbHRlcigoKSA9PiB0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS52YWxpZCksXHJcblx0XHRcdCkuc3Vic2NyaWJlKChfKSA9PiB7XHJcblx0XHRcdFx0dGhpcy52YWxpZGF0ZVBlcnNvbmFGaXNpY2FFbWl0dGVyLmVtaXQoKTtcclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRwZXJzb25hRmlzaWNhRW1pdCgpOiB2b2lkIHtcclxuXHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbi5hZGQodGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0udmFsdWVDaGFuZ2VzLnBpcGUoXHJcblx0XHRcdFx0ZGVib3VuY2VUaW1lKDUwMCksXHJcblx0XHRcdFx0Ly8gZmlsdGVyKCgpID0+IHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLnZhbGlkKSxcclxuXHRcdFx0KS5zdWJzY3JpYmUoKF8pID0+IHtcclxuXHRcdFx0XHRjb25zdCBwZXJzb25hRmlzaWNhOiBEYXRpQW5hZ1BlcnNvbmFGaXNpY2FNb2RlbCA9IHtcclxuXHRcdFx0XHRcdGluZm9BbmFncmFmaWNoZToge1xyXG5cdFx0XHRcdFx0XHRjb2RGaXNjYWxlOiB0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snY29kaWNlRmlzY2FsZSddLnZhbHVlLFxyXG5cdFx0XHRcdFx0XHRjb2dub21lOiB0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snY29nbm9tZSddLnZhbHVlLFxyXG5cdFx0XHRcdFx0XHRub21lOiB0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snbm9tZSddLnZhbHVlXHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0aW5mb05hc2NpdGE6IHtcclxuXHRcdFx0XHRcdFx0Y29tdW5lTmFzY2l0YSA6IHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2RpY2VDb211bmVOYXNjaXRhJ10udmFsdWUsXHJcblx0XHRcdFx0XHRcdHByb3ZpbmNpYU5hc2NpdGEgOiBcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydwcm92aW5jaWFOYXNjaXRhJ10udmFsdWUsXHJcblx0XHRcdFx0XHRcdGRhdGFOYXNjaXRhIDogdGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ2RhdGFOYXNjaXRhJ10udmFsdWVcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdGNvbnN0IGlzVmFsaWQgPSB0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS52YWxpZDtcclxuXHRcdFx0XHR0aGlzLnBlcnNvbmFGaXNpY2FFbWl0dGVyLmVtaXQoeyBwZXJzb25hOiBwZXJzb25hRmlzaWNhID8gcGVyc29uYUZpc2ljYSA6IG51bGwsIGlzVmFsaWQgfSk7XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0aW5pdFBlcnNvbmFGaXNpY2FGb3JtKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcclxuXHRcdFx0Y29kaWNlRmlzY2FsZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG5cdFx0XHRub21lOiBuZXcgRm9ybUNvbnRyb2wobnVsbCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRlTmFtZV0pLFxyXG5cdFx0XHRjb2dub21lOiBuZXcgRm9ybUNvbnRyb2wobnVsbCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRlTmFtZV0pLFxyXG5cdFx0XHRpc05hdG9Fc3Rlcm86IG5ldyBGb3JtQ29udHJvbChmYWxzZSksXHJcblx0XHRcdHByb3ZpbmNpYU5hc2NpdGE6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuXHRcdFx0Y29kaWNlQ29tdW5lTmFzY2l0YTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG5cdFx0XHRuYXppb25lTmFzY2l0YTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG5cdFx0XHRkYXRhTmFzY2l0YTogbmV3IEZvcm1Db250cm9sKG51bGwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcblx0XHRcdHNlc3NvOiBuZXcgRm9ybUNvbnRyb2wobnVsbCwgdGhpcy52aWV3U2Vzc29QRiA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSA6ICBbXSlcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0c2V0Q29kaWNlRmlzY2FsZVZhbGlkYXRvcnMoKSB7XHJcblx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snY29kaWNlRmlzY2FsZSddLnNldFZhbGlkYXRvcnMoW1xyXG5cdFx0XHRWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG5cdFx0XHRWYWxpZGF0ZUNvZGljZUZpc2NhbGVQSVZBXHJcblx0XHRdKTtcclxuXHR9XHJcblxyXG5cdG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuXHR9XHJcblxyXG5cdGNvbnZlcnRUb1VwcGVyY2FzZShldmVudDogRXZlbnQpIHtcclxuXHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmdldCgnY29kaWNlRmlzY2FsZScpLnNldFZhbHVlKChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUudG9VcHBlckNhc2UoKSk7XHJcblx0fVxyXG5cclxuXHRvblByb3ZpbmNpYUNoYW5nZSgpOiB2b2lkIHtcclxuXHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2RpY2VDb211bmVOYXNjaXRhJ10ucGF0Y2hWYWx1ZShudWxsKTtcclxuXHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2RpY2VDb211bmVOYXNjaXRhJ10ubWFya0FzVG91Y2hlZCgpO1xyXG5cdH1cclxuXHJcblx0c2V0Rm9ybUNvbnRyb2xzVmFsdWUoKTogdm9pZHtcclxuXHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2RpY2VGaXNjYWxlJ10uc2V0VmFsdWUodGhpcy5wZXJzb25hRmlzaWNhID8gdGhpcy5wZXJzb25hRmlzaWNhLmluZm9BbmFncmFmaWNoZS5jb2RGaXNjYWxlIDogbnVsbCk7XHJcblx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snbm9tZSddLnNldFZhbHVlKHRoaXMucGVyc29uYUZpc2ljYSA/IHRoaXMucGVyc29uYUZpc2ljYS5pbmZvQW5hZ3JhZmljaGUubm9tZSA6IG51bGwpO1xyXG5cdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ2NvZ25vbWUnXS5zZXRWYWx1ZSh0aGlzLnBlcnNvbmFGaXNpY2EgPyB0aGlzLnBlcnNvbmFGaXNpY2EuaW5mb0FuYWdyYWZpY2hlLmNvZ25vbWUgOiBudWxsKTtcclxuXHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydpc05hdG9Fc3Rlcm8nXS5zZXRWYWx1ZSh0aGlzLnBlcnNvbmFGaXNpY2EgJiYgdGhpcy5wZXJzb25hRmlzaWNhLmluZm9OYXNjaXRhLmNvbXVuZU5hc2NpdGEuc3RhcnRzV2l0aChcIlpcIikgPyB0cnVlIDogZmFsc2UpO1xyXG5cdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ3Byb3ZpbmNpYU5hc2NpdGEnXS5zZXRWYWx1ZSh0aGlzLnBlcnNvbmFGaXNpY2EgICYmICF0aGlzLnBlcnNvbmFGaXNpY2EuaW5mb05hc2NpdGEuY29tdW5lTmFzY2l0YS5zdGFydHNXaXRoKFwiWlwiKSA/IHRoaXMucGVyc29uYUZpc2ljYS5pbmZvTmFzY2l0YS5wcm92aW5jaWFOYXNjaXRhIDogbnVsbCk7XHJcblx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snY29kaWNlQ29tdW5lTmFzY2l0YSddLnNldFZhbHVlKHRoaXMucGVyc29uYUZpc2ljYSAmJiAhdGhpcy5wZXJzb25hRmlzaWNhLmluZm9OYXNjaXRhLmNvbXVuZU5hc2NpdGEuc3RhcnRzV2l0aChcIlpcIikgPyB0aGlzLnBlcnNvbmFGaXNpY2EuaW5mb05hc2NpdGEuY29tdW5lTmFzY2l0YSA6IG51bGwpO1xyXG5cdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ2RhdGFOYXNjaXRhJ10uc2V0VmFsdWUodGhpcy5wZXJzb25hRmlzaWNhID8gdGhpcy5wZXJzb25hRmlzaWNhLmluZm9OYXNjaXRhLmRhdGFOYXNjaXRhIDogbnVsbCk7XHJcblx0XHQvLyBUT0RPXHJcblx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snc2Vzc28nXS5zZXRWYWx1ZSh0aGlzLnZpZXdTZXNzb1BGID8gJ00nOiBudWxsKTtcclxuXHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWyduYXppb25lTmFzY2l0YSddLnNldFZhbHVlKHRoaXMucGVyc29uYUZpc2ljYSAmJiB0aGlzLnBlcnNvbmFGaXNpY2EuaW5mb05hc2NpdGEuY29tdW5lTmFzY2l0YS5zdGFydHNXaXRoKFwiWlwiKSA/IHRoaXMucGVyc29uYUZpc2ljYS5pbmZvTmFzY2l0YT8uY29tdW5lTmFzY2l0YSA6IG51bGwpO1xyXG5cdH1cclxufVxyXG4iXX0=