@infordata-web/portal-common-component-lib
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.14.
152 lines • 29.1 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from "@angular/core";
import { FormGroup } from "@angular/forms";
import { combineLatest, merge, Observable, Subject } from "rxjs";
import { debounceTime, map, scan, shareReplay, startWith, tap, withLatestFrom } from "rxjs/operators";
import { Tuple } from "../../models/tuple";
import { TipiDocumento } from "../../constants/tipi-documenti";
import { Modals } from "../../utils/modals";
import { Azione, GenericModalData } from "../../common-component/generic-modal/generic-modal-data";
export class DocumentazioneComponent {
constructor(modals) {
this.modals = modals;
//TODO
this.allegatiMock = [{
chiaveCollegamento: "7afe2d6c-5757-4684-91fc-387c7c15dbf6",
dataCreazione: "2021-01-08",
dataInizioStaging: "2021-01-08",
dataStaging: "2021-01-08",
dataValidazione: null,
descrizione: "Test request10",
idCreatore: "1",
idDocumento: "ad397ac0-f017-48e1-98fb-3e4c514adbdb",
idIstanza: "2380b34a-4b2d-4a9b-896b-ba4a27cdbf7f",
jsonMetadati: "",
nome: "fileditest10.txt",
proprietario: { tipoProprietario: "PF", idProprietario: "1", idSottoProprietario: null },
statiDocumento: [{ idDocumento: "ad397ac0-f017-48e1-98fb-3e4c514adbdb", stato: "DOC_VALID", dataCambiamentoStato: "2021-01-08", nota: null, lastState: true }],
tipoDocumento: { id: "e617df75-0c3b-41a6-b7a0-c514ede2e9ee", codice: "CU", descrizione: "Certifcazione Unica" },
tipoServizio: { id: "f2c7415f-5a20-4f14-a379-d07d0d1cbd9a", codice: "CU", descrizione: "Certificazione Unica" },
url: "/v1/documento/ad397ac0-f017-48e1-98fb-3e4c514adbdb/download"
}];
this.nextStep = new EventEmitter();
this.salvaBozza = new EventEmitter();
this.previousStep = new EventEmitter();
this.direction = "both-ways";
this.isFinal = false;
this.avantiClicks$ = new Subject();
this.indietroClicks$ = new Subject();
}
ngOnInit() {
this.form = new FormGroup({});
if (!this.documenti) {
this.initDocumnetazione();
}
this.addFiles$ = new Subject();
this.removeFile$ = new Subject();
this.removeFile$.subscribe(console.log);
//------Si accumulano i documenti validi da inviare-------
const adds$ = this.addFiles$.pipe(map((file) => (acc) => {
if (file.file != null) {
if (!file.file.name.toLowerCase().endsWith(".pdf")) {
// this.modals.failure(["Si prega di inserire solamente file in formato pdf"]);
this.modals.openConfirm(this.buildErrore("Si prega di inserire solamente file in formato pdf"));
return acc;
}
if (file.file.size == 0) {
// this.modals.failure(["Si prega di non inserire file vuoti"]);
this.modals.openConfirm(this.buildErrore("zero-file-size"));
return acc;
}
const fileExists = acc.find(loaded => loaded.file.name === file.file.name) != null;
if (fileExists) {
// this.modals.failure(["Si prega di inserire un file diverso da quelli che sono stati inserti"]);
this.modals.openConfirm(this.buildErrore("Si prega di inserire un file diverso da quelli che sono stati inseriti"));
return acc;
}
this.caricaDocumenti.resetForm();
}
//console.log("[file]", [...acc, file]);
return [...acc, file];
}));
this.nomeColonne$ =
new Observable(ob => ob.next(["nr._Documento", "tipo_Documento", "data_Documento", "tipologia_emittente", "organo_emittente", "obbligatorio"]));
this.mappatura$ = this.addFiles$.pipe(map(file => Object.keys(file[0])));
const removals$ = this.removeFile$.pipe(map((index) => (acc) => {
return acc.filter((_, i) => index !== i);
}));
this.files$ = merge(adds$, removals$).pipe(scan((acc, op) => op(acc), []), startWith([]), tap(_ => console.log("[DocumentazioneComponent] - metadatiDocumenti", _)), shareReplay());
this.viewList$ = this.files$.pipe(map(files => files.length > 0));
const presentAndMissing$ = combineLatest([this.files$, this.tipologieDocumento$])
.pipe(map(([files, tipologieDocumento]) => {
const tipiDoc = tipologieDocumento
? tipologieDocumento.filter((t) => t.codice != TipiDocumento.ALTRO)
: [];
const missing = tipiDoc.filter((tipoDoc) => {
const typeFound = files.find((file) => file.tipoDocumento.codice == tipoDoc.codice);
return typeFound ? false : true;
});
return Tuple.of(files, missing);
}), shareReplay());
//scrivere l'errore
this.hasMissingFileTypes$ = presentAndMissing$.pipe(map((t) => t._2.length > 0), startWith(false));
// //scrivere l'errore
this.missingFileTypes$ = presentAndMissing$.pipe(map((t) => t._2));
//emettere lista dei file caricati
const present$ = presentAndMissing$.pipe(map((t) => t._1));
this.subscription = this.avantiClicks$
.pipe(debounceTime(250), withLatestFrom(present$),
// tap(([_, present]) => console.log("[present]", present)),
tap(([_, present]) => this.nextStep.emit(present)))
.subscribe();
this.tipologieDocumentoAll$ = this.tipologieDocumento$;
}
ngOnDestroy() {
if (this.subscription) {
this.subscription.unsubscribe();
}
}
forward($event) {
this.avantiClicks$.next($event);
}
backward(_) {
this.previousStep.emit([]);
}
complete(_) { }
onSalvaBozza(_) {
this.salvaBozza.emit([]);
}
initDocumnetazione() {
this.documenti = new Array();
}
buildErrore(msg) {
const data = new GenericModalData();
data.title = 'dialogTitleError';
data.paragrafi =
[msg
];
const noOp = new Azione('ko');
noOp.testo = 'KO';
data.azioni = [noOp];
return data;
}
}
DocumentazioneComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-documentazione',
template: "<div class=\"row\" class=\"mt-3 mb-5\">\r\n\t<mat-expansion-panel class=\"panel\" [expanded]=\"true\" [formGroup]=\"form\">\r\n <mat-expansion-panel-header\r\n [collapsedHeight]=\"'48px'\"\r\n [expandedHeight]=\"'48px'\"\r\n class=\"custom-header\"\r\n >\r\n <mat-panel-title>\r\n <h3 class=\"h5 mb-0\"><info-tip-label label=\"documentazione\"></info-tip-label></h3>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\t<div class=\"col-12\">\r\n\t\t<br>\r\n\t\t<div class=\"row\">\r\n\t\t\t<div class=\"col-12 mb-3\">\r\n\t\t\t\t<h3 class=\"h5 mb-0\"><info-tip-label label=\"documentazione-da-allegare\"></info-tip-label></h3>\r\n\t\t\t\t<div class=\"divider\"></div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<lib-carica-documenti\r\n\t\t\t[tipologieDocumento]=\"tipologieDocumentoAll$ | async\"\r\n\t\t\t[tipologieTipiEmittenti$]=\"tipologieTipiEmittenti$\"\r\n\t\t\t(onFileAdded)=\"addFiles$.next($event)\"\r\n\t\t\t#caricaDocumenti\r\n\t\t>\r\n\t\t</lib-carica-documenti>\r\n\t</div>\r\n\t<div class=\"col-12\" *ngIf=\"viewList$ | async\">\r\n\t\t<div class=\"d-flex border-bottom align-items-baseline mb-3\">\r\n\t\t\t<h3 class=\"h5 mb-0\">{{'documentazione-inserita' | traduzione}}</h3>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"col-12\" *ngIf=\"viewList$ | async\">\r\n\t\t<lib-tabella-documenti [files$]=\"files$\" (indiceSelezionato)=\"removeFile$.next($event)\">\r\n\t\t</lib-tabella-documenti>\r\n\t</div>\r\n\t<div class=\"col-md-12\">\r\n\t\t<mat-error *ngIf=\"hasMissingFileTypes$ | async\">\r\n\t\t\t<p class=\"h6 mt-4\">{{'documenti-mancanti' | traduzione}}</p>\r\n\t\t\t<p *ngFor=\"let missing of missingFileTypes$ | async\">\r\n\t\t\t\t{{ missing.descrizione }}\r\n\t\t\t</p>\r\n\t\t</mat-error>\r\n\t</div>\r\n\t</mat-expansion-panel>\r\n\t<div class=\"mt-4\"></div>\r\n\t<lib-stepper-navigator\r\n\t\t[form]=\"form\"\r\n\t\t[direction]=\"direction\"\r\n\t\t[isFinal]=\"isFinal\"\r\n\t\t(goForward)=\"forward($event)\"\r\n\t\t(goBackward)=\"backward($event)\"\r\n\t\t(goBackward)=\"complete($event)\"\r\n\t\t(salvaBozza)=\"onSalvaBozza($event)\"\r\n\t\t[isContainerValid]=\"!(hasMissingFileTypes$ | async)\"\r\n\t>\r\n\t</lib-stepper-navigator>\r\n</div>\r\n",
styles: [""]
},] }
];
DocumentazioneComponent.ctorParameters = () => [
{ type: Modals }
];
DocumentazioneComponent.propDecorators = {
documenti: [{ type: Input }],
tipologieDocumento$: [{ type: Input }],
tipologieTipiEmittenti$: [{ type: Input }],
nextStep: [{ type: Output }],
salvaBozza: [{ type: Output }],
previousStep: [{ type: Output }],
caricaDocumenti: [{ type: ViewChild, args: ['caricaDocumenti',] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnRhemlvbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IkM6L1Byb2dldHRpL0RBRy9zb3JnZW50aS9naXRsYWItc29mdHdhcmVmYWN0b3J5L2NvbW1vbi1jb21wb25lbnQtbGliL3Byb2plY3RzL3BvcnRhbC1jb21tb24tY29tcG9uZW50LWxpYi9zcmMvIiwic291cmNlcyI6WyJsaWIvZGVwb3NpdGkvY29tcG9uZW50cy9kb2N1bWVudGF6aW9uZS9kb2N1bWVudGF6aW9uZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR3pDLE9BQU8sRUFBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFFN0UsT0FBTyxFQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BHLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUN6QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0QsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRzFDLE9BQU8sRUFBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSx5REFBeUQsQ0FBQztBQVFqRyxNQUFNLE9BQU8sdUJBQXVCO0lBZ0VuQyxZQUFzQixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQTVEcEMsTUFBTTtRQUNOLGlCQUFZLEdBQUcsQ0FBQztnQkFDZixrQkFBa0IsRUFBRSxzQ0FBc0M7Z0JBQzFELGFBQWEsRUFB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U0FBUyxTQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0Zvcm1Hcm91cH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7RG9jdW1lbnRvRFRPfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2RvY3VtZW50by1kdG9cIjtcclxuaW1wb3J0IHtUaXBvRG9jdW1lbnRvfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3RpcG8tZG9jdW1lbnRvXCI7XHJcbmltcG9ydCB7Y29tYmluZUxhdGVzdCwgbWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtOZXdGaWxlfSBmcm9tIFwiLi9uZXctZmlsZVwiO1xyXG5pbXBvcnQge2RlYm91bmNlVGltZSwgbWFwLCBzY2FuLCBzaGFyZVJlcGxheSwgc3RhcnRXaXRoLCB0YXAsIHdpdGhMYXRlc3RGcm9tfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHtUdXBsZX0gZnJvbSBcIi4uLy4uL21vZGVscy90dXBsZVwiO1xyXG5pbXBvcnQge1RpcGlEb2N1bWVudG99IGZyb20gXCIuLi8uLi9jb25zdGFudHMvdGlwaS1kb2N1bWVudGlcIjtcclxuaW1wb3J0IHtNb2RhbHN9IGZyb20gXCIuLi8uLi91dGlscy9tb2RhbHNcIjtcclxuaW1wb3J0IHtUaXBvbG9naWNhRFRPfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3RpcG9sb2dpY2EtZC10LW9cIjtcclxuaW1wb3J0IHtUaXBvRG9jdW1lbnRvRFRPfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3RpcG8tZG9jdW1lbnRvLmR0b1wiO1xyXG5pbXBvcnQge0F6aW9uZSwgR2VuZXJpY01vZGFsRGF0YX0gZnJvbSBcIi4uLy4uL2NvbW1vbi1jb21wb25lbnQvZ2VuZXJpYy1tb2RhbC9nZW5lcmljLW1vZGFsLWRhdGFcIjtcclxuaW1wb3J0IHsgQ2FyaWNhRG9jdW1lbnRpQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9kb2N1bWVudGF6aW9uZS9jYXJpY2EtZG9jdW1lbnRpL2NhcmljYS1kb2N1bWVudGkuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnbGliLWRvY3VtZW50YXppb25lJyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vZG9jdW1lbnRhemlvbmUuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWycuL2RvY3VtZW50YXppb25lLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRG9jdW1lbnRhemlvbmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuXHRmb3JtOiBGb3JtR3JvdXA7XHJcblxyXG5cdC8vVE9ET1xyXG5cdGFsbGVnYXRpTW9jayA9IFt7XHJcblx0XHRjaGlhdmVDb2xsZWdhbWVudG86IFwiN2FmZTJkNmMtNTc1Ny00Njg0LTkxZmMtMzg3YzdjMTVkYmY2XCIsXHJcblx0XHRkYXRhQ3JlYXppb25lOiBcIjIwMjEtMDEtMDhcIixcclxuXHRcdGRhdGFJbml6aW9TdGFnaW5nOiBcIjIwMjEtMDEtMDhcIixcclxuXHRcdGRhdGFTdGFnaW5nOiBcIjIwMjEtMDEtMDhcIixcclxuXHRcdGRhdGFWYWxpZGF6aW9uZTogbnVsbCxcclxuXHRcdGRlc2NyaXppb25lOiBcIlRlc3QgcmVxdWVzdDEwXCIsXHJcblx0XHRpZENyZWF0b3JlOiBcIjFcIixcclxuXHRcdGlkRG9jdW1lbnRvOiBcImFkMzk3YWMwLWYwMTctNDhlMS05OGZiLTNlNGM1MTRhZGJkYlwiLFxyXG5cdFx0aWRJc3RhbnphOiBcIjIzODBiMzRhLTRiMmQtNGE5Yi04OTZiLWJhNGEyN2NkYmY3ZlwiLFxyXG5cdFx0anNvbk1ldGFkYXRpOiBcIlwiLFxyXG5cdFx0bm9tZTogXCJmaWxlZGl0ZXN0MTAudHh0XCIsXHJcblx0XHRwcm9wcmlldGFyaW86IHsgdGlwb1Byb3ByaWV0YXJpbzogXCJQRlwiLCBpZFByb3ByaWV0YXJpbzogXCIxXCIsIGlkU290dG9Qcm9wcmlldGFyaW86IG51bGwgfSxcclxuXHRcdHN0YXRpRG9jdW1lbnRvOiBbeyBpZERvY3VtZW50bzogXCJhZDM5N2FjMC1mMDE3LTQ4ZTEtOThmYi0zZTRjNTE0YWRiZGJcIiwgc3RhdG86IFwiRE9DX1ZBTElEXCIsIGRhdGFDYW1iaWFtZW50b1N0YXRvOiBcIjIwMjEtMDEtMDhcIiwgbm90YTogbnVsbCwgbGFzdFN0YXRlOiB0cnVlIH1dLFxyXG5cdFx0dGlwb0RvY3VtZW50bzogeyBpZDogXCJlNjE3ZGY3NS0wYzNiLTQxYTYtYjdhMC1jNTE0ZWRlMmU5ZWVcIiwgY29kaWNlOiBcIkNVXCIsIGRlc2NyaXppb25lOiBcIkNlcnRpZmNhemlvbmUgVW5pY2FcIiB9LFxyXG5cdFx0dGlwb1NlcnZpemlvOiB7IGlkOiBcImYyYzc0MTVmLTVhMjAtNGYxNC1hMzc5LWQwN2QwZDFjYmQ5YVwiLCBjb2RpY2U6IFwiQ1VcIiwgZGVzY3JpemlvbmU6IFwiQ2VydGlmaWNhemlvbmUgVW5pY2FcIiB9LFxyXG5cdFx0dXJsOiBcIi92MS9kb2N1bWVudG8vYWQzOTdhYzAtZjAxNy00OGUxLTk4ZmItM2U0YzUxNGFkYmRiL2Rvd25sb2FkXCJcclxuXHR9XVxyXG5cclxuXHQvL1RPRE9cclxuXHQvLyBASW5wdXQoKVxyXG5cdC8vIGRvY3VtZW50YXppb25lOiBBcnJheTxEb2N1bWVudG9EVE8+O1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdGRvY3VtZW50aTogQXJyYXk8RG9jdW1lbnRvRFRPPjtcclxuXHJcblx0QElucHV0KClcclxuXHR0aXBvbG9naWVEb2N1bWVudG8kOiBPYnNlcnZhYmxlPEFycmF5PFRpcG9Eb2N1bWVudG9EVE8+PjtcclxuXHJcblx0QElucHV0KClcclxuXHR0aXBvbG9naWVUaXBpRW1pdHRlbnRpJDogT2JzZXJ2YWJsZTxBcnJheTxUaXBvbG9naWNhRFRPPj47XHJcblxyXG5cdEBPdXRwdXQoKVxyXG5cdG5leHRTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxOZXdGaWxlPj4oKTtcclxuXHJcblx0QE91dHB1dCgpXHJcblx0c2FsdmFCb3p6YSA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8TmV3RmlsZT4+KCk7XHJcblxyXG5cdEBPdXRwdXQoKVxyXG5cdHByZXZpb3VzU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8TmV3RmlsZT4+KCk7XHJcblxyXG5cdEBWaWV3Q2hpbGQoJ2NhcmljYURvY3VtZW50aScpXHJcblx0Y2FyaWNhRG9jdW1lbnRpOiBDYXJpY2FEb2N1bWVudGlDb21wb25lbnQ7XHJcblxyXG5cdGFkZEZpbGVzJDogU3ViamVjdDxOZXdGaWxlPjtcclxuXHRyZW1vdmVGaWxlJDogU3ViamVjdDxudW1iZXI+O1xyXG5cdGZpbGVzJDogT2JzZXJ2YWJsZTxBcnJheTxOZXdGaWxlPj47XHJcblx0dmlld0xpc3QkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG5cdHRpcG9sb2dpZURvY3VtZW50b0FsbCQ6IE9ic2VydmFibGU8QXJyYXk8VGlwb0RvY3VtZW50b0RUTz4+O1xyXG5cdGhhc01pc3NpbmdGaWxlVHlwZXMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG5cdG1pc3NpbmdGaWxlVHlwZXMkOiBPYnNlcnZhYmxlPEFycmF5PFRpcG9Eb2N1bWVudG8+PjtcclxuXHRkaXJlY3Rpb24gPSBcImJvdGgtd2F5c1wiO1xyXG5cdGlzRmluYWwgPSBmYWxzZTtcclxuXHRhdmFudGlDbGlja3MkID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cdG5vbWVDb2xvbm5lJDogT2JzZXJ2YWJsZTxBcnJheTxzdHJpbmc+PjtcclxuXHRtYXBwYXR1cmEkOiBPYnNlcnZhYmxlPEFycmF5PHN0cmluZz4+O1xyXG5cdGluZGlldHJvQ2xpY2tzJCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuXHRzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcblx0Y29uc3RydWN0b3IocHJvdGVjdGVkIG1vZGFsczogTW9kYWxzKSB7IH1cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblxyXG5cdFx0dGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcblxyXG5cdFx0aWYgKCF0aGlzLmRvY3VtZW50aSkge1xyXG5cdFx0XHR0aGlzLmluaXREb2N1bW5ldGF6aW9uZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYWRkRmlsZXMkID0gbmV3IFN1YmplY3QoKTtcclxuXHRcdHRoaXMucmVtb3ZlRmlsZSQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuXHRcdHRoaXMucmVtb3ZlRmlsZSQuc3Vic2NyaWJlKGNvbnNvbGUubG9nKTtcclxuXHJcblx0XHQvLy0tLS0tLVNpIGFjY3VtdWxhbm8gaSBkb2N1bWVudGkgdmFsaWRpIGRhIGludmlhcmUtLS0tLS0tXHJcblx0XHRjb25zdCBhZGRzJCA9IHRoaXMuYWRkRmlsZXMkLnBpcGUoXHJcblx0XHRcdG1hcCgoZmlsZTogTmV3RmlsZSkgPT4gKGFjYzogQXJyYXk8TmV3RmlsZT4pID0+IHtcclxuXHRcdFx0XHRpZiAoZmlsZS5maWxlICE9IG51bGwpIHtcclxuXHRcdFx0XHRcdGlmICghZmlsZS5maWxlLm5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChcIi5wZGZcIikpIHtcclxuXHRcdFx0XHRcdFx0Ly8gdGhpcy5tb2RhbHMuZmFpbHVyZShbXCJTaSBwcmVnYSBkaSBpbnNlcmlyZSBzb2xhbWVudGUgZmlsZSBpbiBmb3JtYXRvIHBkZlwiXSk7XHJcblx0XHRcdFx0XHRcdHRoaXMubW9kYWxzLm9wZW5Db25maXJtKHRoaXMuYnVpbGRFcnJvcmUoXCJTaSBwcmVnYSBkaSBpbnNlcmlyZSBzb2xhbWVudGUgZmlsZSBpbiBmb3JtYXRvIHBkZlwiKSk7XHJcblx0XHRcdFx0XHRcdHJldHVybiBhY2M7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoZmlsZS5maWxlLnNpemUgPT0gMCkge1xyXG5cdFx0XHRcdFx0XHQvLyB0aGlzLm1vZGFscy5mYWlsdXJlKFtcIlNpIHByZWdhIGRpIG5vbiBpbnNlcmlyZSBmaWxlIHZ1b3RpXCJdKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5tb2RhbHMub3BlbkNvbmZpcm0odGhpcy5idWlsZEVycm9yZShcInplcm8tZmlsZS1zaXplXCIpKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGFjYztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGNvbnN0IGZpbGVFeGlzdHMgPSBhY2MuZmluZChsb2FkZWQgPT4gbG9hZGVkLmZpbGUubmFtZSA9PT0gZmlsZS5maWxlLm5hbWUpICE9IG51bGw7XHJcblx0XHRcdFx0XHRpZiAoZmlsZUV4aXN0cykge1xyXG5cdFx0XHRcdFx0XHQvLyB0aGlzLm1vZGFscy5mYWlsdXJlKFtcIlNpIHByZWdhIGRpIGluc2VyaXJlIHVuIGZpbGUgZGl2ZXJzbyBkYSBxdWVsbGkgY2hlIHNvbm8gc3RhdGkgaW5zZXJ0aVwiXSk7XHJcblx0XHRcdFx0XHRcdHRoaXMubW9kYWxzLm9wZW5Db25maXJtKHRoaXMuYnVpbGRFcnJvcmUoXCJTaSBwcmVnYSBkaSBpbnNlcmlyZSB1biBmaWxlIGRpdmVyc28gZGEgcXVlbGxpIGNoZSBzb25vIHN0YXRpIGluc2VyaXRpXCIpKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGFjYztcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR0aGlzLmNhcmljYURvY3VtZW50aS5yZXNldEZvcm0oKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly9jb25zb2xlLmxvZyhcIltmaWxlXVwiLCBbLi4uYWNjLCBmaWxlXSk7XHJcblx0XHRcdFx0cmV0dXJuIFsuLi5hY2MsIGZpbGVdO1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLm5vbWVDb2xvbm5lJCA9XHJcblx0XHRcdG5ldyBPYnNlcnZhYmxlKG9iID0+IG9iLm5leHQoW1wibnIuX0RvY3VtZW50b1wiLCBcInRpcG9fRG9jdW1lbnRvXCIsIFwiZGF0YV9Eb2N1bWVudG9cIiwgXCJ0aXBvbG9naWFfZW1pdHRlbnRlXCIsIFwib3JnYW5vX2VtaXR0ZW50ZVwiLCBcIm9iYmxpZ2F0b3Jpb1wiXSkpO1xyXG5cclxuXHRcdHRoaXMubWFwcGF0dXJhJCA9IHRoaXMuYWRkRmlsZXMkLnBpcGUobWFwKGZpbGUgPT4gT2JqZWN0LmtleXMoZmlsZVswXSkpKVxyXG5cclxuXHRcdGNvbnN0IHJlbW92YWxzJCA9IHRoaXMucmVtb3ZlRmlsZSQucGlwZShcclxuXHRcdFx0bWFwKChpbmRleDogbnVtYmVyKSA9PiAoYWNjOiBBcnJheTxOZXdGaWxlPikgPT4ge1xyXG5cdFx0XHRcdHJldHVybiBhY2MuZmlsdGVyKChfLCBpKSA9PiBpbmRleCAhPT0gaSk7XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuZmlsZXMkID0gbWVyZ2UoYWRkcyQsIHJlbW92YWxzJCkucGlwZShcclxuXHRcdFx0c2NhbigoYWNjLCBvcCkgPT4gb3AoYWNjKSwgW10pLFxyXG5cdFx0XHRzdGFydFdpdGgoW10pLFxyXG5cdFx0XHR0YXAoXyA9PiBjb25zb2xlLmxvZyhcIltEb2N1bWVudGF6aW9uZUNvbXBvbmVudF0gLSBtZXRhZGF0aURvY3VtZW50aVwiLCBfKSksXHJcblx0XHRcdHNoYXJlUmVwbGF5KClcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy52aWV3TGlzdCQgPSB0aGlzLmZpbGVzJC5waXBlKG1hcChmaWxlcyA9PiBmaWxlcy5sZW5ndGggPiAwKSk7XHJcblxyXG5cdFx0Y29uc3QgcHJlc2VudEFuZE1pc3NpbmckID0gY29tYmluZUxhdGVzdChcclxuXHRcdFx0W3RoaXMuZmlsZXMkLCB0aGlzLnRpcG9sb2dpZURvY3VtZW50byRdXHJcblx0XHQpXHJcblx0XHRcdC5waXBlKFxyXG5cdFx0XHRcdG1hcCgoW2ZpbGVzLCB0aXBvbG9naWVEb2N1bWVudG9dKSA9PiB7XHJcblx0XHRcdFx0XHRjb25zdCB0aXBpRG9jID0gdGlwb2xvZ2llRG9jdW1lbnRvXHJcblx0XHRcdFx0XHRcdD8gdGlwb2xvZ2llRG9jdW1lbnRvLmZpbHRlcihcclxuXHRcdFx0XHRcdFx0XHQodCkgPT4gdC5jb2RpY2UgIT0gVGlwaURvY3VtZW50by5BTFRST1xyXG5cdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdDogW107XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgbWlzc2luZyA9IHRpcGlEb2MuZmlsdGVyKCh0aXBvRG9jKSA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHR5cGVGb3VuZCA9IGZpbGVzLmZpbmQoXHJcblx0XHRcdFx0XHRcdFx0KGZpbGUpID0+IGZpbGUudGlwb0RvY3VtZW50by5jb2RpY2UgPT0gdGlwb0RvYy5jb2RpY2VcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHR5cGVGb3VuZCA/IGZhbHNlIDogdHJ1ZTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBUdXBsZS5vZihmaWxlcywgbWlzc2luZyk7XHJcblx0XHRcdFx0fSksXHJcblx0XHRcdFx0c2hhcmVSZXBsYXkoKVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdC8vc2NyaXZlcmUgbCdlcnJvcmVcclxuXHRcdHRoaXMuaGFzTWlzc2luZ0ZpbGVUeXBlcyQgPSBwcmVzZW50QW5kTWlzc2luZyQucGlwZShcclxuXHRcdFx0bWFwKCh0KSA9PiB0Ll8yLmxlbmd0aCA+IDApLFxyXG5cdFx0XHRzdGFydFdpdGgoZmFsc2UpXHJcblx0XHQpO1xyXG5cclxuXHRcdC8vIC8vc2NyaXZlcmUgbCdlcnJvcmVcclxuXHRcdHRoaXMubWlzc2luZ0ZpbGVUeXBlcyQgPSBwcmVzZW50QW5kTWlzc2luZyQucGlwZShtYXAoKHQpID0+IHQuXzIpKTtcclxuXHJcblx0XHQvL2VtZXR0ZXJlIGxpc3RhIGRlaSBmaWxlIGNhcmljYXRpXHJcblx0XHRjb25zdCBwcmVzZW50JCA9IHByZXNlbnRBbmRNaXNzaW5nJC5waXBlKG1hcCgodCkgPT4gdC5fMSkpO1xyXG5cclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5hdmFudGlDbGlja3MkXHJcblx0XHRcdC5waXBlKFxyXG5cdFx0XHRcdGRlYm91bmNlVGltZSgyNTApLFxyXG5cdFx0XHRcdHdpdGhMYXRlc3RGcm9tKHByZXNlbnQkKSxcclxuXHRcdFx0XHQvLyB0YXAoKFtfLCBwcmVzZW50XSkgPT4gY29uc29sZS5sb2coXCJbcHJlc2VudF1cIiwgcHJlc2VudCkpLFxyXG5cdFx0XHRcdHRhcCgoW18sIHByZXNlbnRdKSA9PiB0aGlzLm5leHRTdGVwLmVtaXQocHJlc2VudCkpXHJcblx0XHRcdClcclxuXHRcdFx0LnN1YnNjcmliZSgpO1xyXG5cclxuXHRcdHRoaXMudGlwb2xvZ2llRG9jdW1lbnRvQWxsJCA9IHRoaXMudGlwb2xvZ2llRG9jdW1lbnRvJDtcclxuXHR9XHJcblxyXG5cdG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcblx0XHRcdHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmb3J3YXJkKCRldmVudDogYW55KSB7XHJcblx0XHR0aGlzLmF2YW50aUNsaWNrcyQubmV4dCgkZXZlbnQpO1xyXG5cdH1cclxuXHJcblx0YmFja3dhcmQoXzogYW55KSB7XHJcblx0XHR0aGlzLnByZXZpb3VzU3RlcC5lbWl0KFtdKTtcclxuXHR9XHJcblxyXG5cdGNvbXBsZXRlKF86IGFueSkgeyB9XHJcblxyXG5cdG9uU2FsdmFCb3p6YShfOiBhbnkpIHtcclxuXHRcdHRoaXMuc2FsdmFCb3p6YS5lbWl0KFtdKTtcclxuXHR9XHJcblxyXG5cdGluaXREb2N1bW5ldGF6aW9uZSgpIHtcclxuXHRcdHRoaXMuZG9jdW1lbnRpID0gbmV3IEFycmF5PERvY3VtZW50b0RUTz4oKTtcclxuXHR9XHJcblxyXG5cdGJ1aWxkRXJyb3JlKG1zZzogc3RyaW5nKTogR2VuZXJpY01vZGFsRGF0YSB7XHJcblx0XHRjb25zdCBkYXRhID0gbmV3IEdlbmVyaWNNb2RhbERhdGEoKTtcclxuXHJcblx0XHRkYXRhLnRpdGxlID0gJ2RpYWxvZ1RpdGxlRXJyb3InO1xyXG5cdFx0ZGF0YS5wYXJhZ3JhZmkgPVxyXG5cdFx0XHRbIG1zZ1xyXG5cdFx0XHRdO1xyXG5cdFx0Y29uc3Qgbm9PcCA9IG5ldyBBemlvbmUoJ2tvJyk7XHJcblx0XHRub09wLnRlc3RvID0gJ0tPJztcclxuXHJcblx0XHRkYXRhLmF6aW9uaSA9IFtub09wXTtcclxuXHRcdHJldHVybiBkYXRhO1xyXG5cdH1cclxuXHJcbn1cclxuIl19