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.

172 lines 31.9 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; import { Subject } from 'rxjs'; import { map, shareReplay, startWith, switchMap, tap } from 'rxjs/operators'; import { CodiceTipoPagamento } from '../../constants/tipo-pagamemto'; import { fromIdAndTipo } from '../../models/modalita-pagamento-dto'; import { PagamentoDTO } from '../../models/pagamento-dto'; import { ComponentOutputStatus } from '../../normalizzazione/component-output-status'; import { MessageService } from '../../services/message.service'; import { ComponentReducer } from '../../utils/component-reducer'; import { toBonificoExtraSepa, toBonificoSepa, toTesoreria, toVagliaBdi } from './modalita-pagamento-mapper'; export class PagamentoComponent { constructor(msg) { this.msg = msg; this.nextStep = new EventEmitter(); this.salvaBozza = new EventEmitter(); this.previousStep = new EventEmitter(); this.direction = 'both-ways'; this.isFinal = false; this.changesVagliaBdi$ = new Subject(); this.changesAttoPignoramento$ = new Subject(); } ngOnInit() { this.form = new FormGroup({}); let valid = true; if (!this.pagamento) { this.initPagamento(); valid = false; } // console.log('[PagamentoComponent] onInit', this.pagamento); this.tipoModalitaPagamento = new FormControl({ value: this.pagamento.tipoPagamento, disabled: false }, [Validators.required]); this.form.addControl('tipoModalitaPagamento', this.tipoModalitaPagamento); const initalModalitaPagamento = fromIdAndTipo(this.pagamento.idModalitaPagamento, this.pagamento.tipoPagamento); this.modalitaPagamento = new FormControl({ value: initalModalitaPagamento, disabled: false }, [Validators.required]); this.form.addControl('modalitaPagamento', this.modalitaPagamento); const changesTipoModalitaPagamento$ = this.tipoModalitaPagamento.valueChanges .pipe(shareReplay()); this.modalitaPagamentoPerTipoSelezionato$ = changesTipoModalitaPagamento$ .pipe(tap(_ => this.modalitaPagamento.setValue(null)), tap(_ => this.resetPagamenti()), startWith(this.pagamento.tipoPagamento), switchMap(tipoModalitaPagamento => this.modalitaPagamento$.pipe(map(modalitaPagamentoPF => { const modalitaPagamentoPerTipo = modalitaPagamentoPF.filter(mod => tipoModalitaPagamento == mod.tipologiaPagamento.codice); return modalitaPagamentoPerTipo; })))); const changesTipoRimborso$ = changesTipoModalitaPagamento$.pipe(map(tipoRimborso => { return ComponentOutputStatus.of(tipoRimborso != null, (pagamento) => pagamento.tipoPagamento = tipoRimborso); })); const changesModalitaRimborso$ = this.modalitaPagamento.valueChanges.pipe(map(rimborso => { return ComponentOutputStatus.of(true, _ => { // console.log('[PagamentoComponent] rimborso', rimborso); if (rimborso != undefined && rimborso != '') { this.setRimborso(rimborso); } }); })); const pagamentoChanges$ = ComponentReducer.reducer4(changesTipoRimborso$, changesModalitaRimborso$, this.changesVagliaBdi$, //TODO this.changesAttoPignoramento$, this.pagamentoValid(), ComponentOutputStatus.of(valid, this.pagamento)) .pipe(shareReplay()); this.isFormValid$ = pagamentoChanges$.pipe(map(_ => _.status), startWith(valid)); pagamentoChanges$.subscribe((pagStatus) => { console.log("[PagamentoComponent] status", pagStatus); }); } pagamentoValid() { return pagamento => { let pagamentoValid; if (pagamento.tipoPagamento) { switch (pagamento.tipoPagamento) { case (CodiceTipoPagamento.CODICE_BONIFICO_SEPA): pagamentoValid = pagamento.bonifico != null; break; case (CodiceTipoPagamento.CODICE_BONIFICO_EXTRA_SEPA): pagamentoValid = pagamento.bonificoExtraSepa != null; break; case (CodiceTipoPagamento.CODICE_TESORERIA): pagamentoValid = pagamento.tesoreria != null; break; case (CodiceTipoPagamento.CODICE_VAGLIA): pagamentoValid = pagamento.vagliaBDI != null; break; default: pagamentoValid = false; } } else { pagamentoValid = false; } return pagamentoValid; }; } modalitaComparator(m1, m2) { return (m1 || {}).idModalitaPagamento == (m2 || {}).idModalitaPagamento; } resetPagamenti() { this.changesVagliaBdi$.next(ComponentOutputStatus.of(true, (p) => p.vagliaBDI = null)); } setRimborso(rimborso) { // console.log('[setRimborso]', rimborso); this.resetModalitaPagamento(); this.pagamento.idModalitaPagamento = rimborso.idModalitaPagamento; switch (rimborso.tipologiaPagamento.codice) { case (CodiceTipoPagamento.CODICE_BONIFICO_SEPA): this.pagamento.bonifico = toBonificoSepa(rimborso); break; case (CodiceTipoPagamento.CODICE_BONIFICO_EXTRA_SEPA): this.pagamento.bonificoExtraSepa = toBonificoExtraSepa(rimborso); break; case (CodiceTipoPagamento.CODICE_TESORERIA): this.pagamento.tesoreria = toTesoreria(rimborso); break; case (CodiceTipoPagamento.CODICE_VAGLIA): this.pagamento.vagliaBDI = toVagliaBdi(rimborso); break; default: } } resetModalitaPagamento() { this.pagamento.idModalitaPagamento = null; this.pagamento.vagliaBDI = null; this.pagamento.tesoreria = null; this.pagamento.bonificoExtraSepa = null; this.pagamento.bonifico = null; } hasSelectedModalitaDiPagamentoAnd(v) { return this.hasSelectedModalitaDiPagamento() && v; } hasSelectedModalitaDiPagamento() { return this.modalitaPagamento.value; } //TODO isAutoritaGiudiziaria() { return this.hasSelectedModalitaDiPagamentoAnd(CodiceTipoPagamento.CODICE_BONIFICO_SEPA == this.tipoModalitaPagamento.value); } forward(_) { this.nextStep.emit(this.pagamento); } onSalvaBozza(_) { this.salvaBozza.emit(this.pagamento); } backward(_) { this.previousStep.emit(this.pagamento); } complete(_) { } initPagamento() { this.pagamento = new PagamentoDTO(); } //TODO attoPignoramentoReady(attoPignoramnetoStatus) { // console.log('[attoPignoramentoReady]', attoPignoramnetoStatus); this.changesAttoPignoramento$.next(attoPignoramnetoStatus.mapValue((pign) => (at) => at.tribunale = pign)); } } PagamentoComponent.decorators = [ { type: Component, args: [{ selector: 'lib-pagamento', template: "<mat-expansion-panel class=\"panel\" [expanded]=\"true\">\r\n\t<mat-expansion-panel-header [collapsedHeight]=\"'48px'\" [expandedHeight]=\"'48px'\" class=\"custom-header\">\r\n\t\t<mat-panel-title>\r\n\t\t\t<h3>{{'modalita-pagamento' | traduzione}}</h3>\r\n\t\t</mat-panel-title>\r\n\t</mat-expansion-panel-header>\r\n\t<form [formGroup]=\"form\">\r\n\t\t<div class=\"collapse-body mt-2\">\r\n\t\t\t<div class=\"row\">\r\n\t\t\t\t<div class=\"col-md-6\">\r\n\t\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t\t<mat-label>{{'required'| traduzione}}{{'tipologia-pagamento' | traduzione }}</mat-label>\r\n\t\t\t\t\t\t<mat-select formControlName=\"tipoModalitaPagamento\">\r\n\t\t\t\t\t\t\t<mat-option *ngFor=\"let pagamento of tipologiePagamento$ | async\"\r\n\t\t\t\t\t\t\t\t[value]=\"pagamento.codice\">\r\n\t\t\t\t\t\t\t\t{{pagamento.descrizione}}\r\n\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t</mat-select>\r\n\t\t\t\t\t\t<mat-error *ngIf=\"form.controls['tipoModalitaPagamento'].invalid\">\r\n\t\t\t\t\t\t\t{{msg.produceMessage('obbligatorio', form.controls['tipoModalitaPagamento']) | traduzione}}\r\n\t\t\t\t\t\t</mat-error>\r\n\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"col-md-6\">\r\n\t\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t\t<mat-label>{{'required'| traduzione}}{{'modalita-pagamento' | traduzione }}</mat-label>\r\n\t\t\t\t\t\t<mat-select formControlName=\"modalitaPagamento\" [compareWith]=\"modalitaComparator\">\r\n\t\t\t\t\t\t\t<mat-option *ngFor=\"let modalita of modalitaPagamentoPerTipoSelezionato$ | async\"\r\n\t\t\t\t\t\t\t\t[value]=\"modalita\">\r\n\t\t\t\t\t\t\t\t{{modalita.conto || modalita.tipologiaPagamento.descrizione}}\r\n\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t</mat-select>\r\n\t\t\t\t\t\t<mat-error *ngIf=\"form.controls['modalitaPagamento'].invalid\">\r\n\t\t\t\t\t\t\t{{msg.produceMessage('obbligatorio', form.controls['modalitaPagamento']) | traduzione}}\r\n\t\t\t\t\t\t</mat-error>\r\n\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<lib-dati-tribunale *ngIf=\"isAutoritaGiudiziaria()\"\r\n\t\t\t\t(attoPignoramentoReady)=\"attoPignoramentoReady($event)\"\r\n\t\t\t\t[attoPignoramento]=\"attoPignoramento\"\r\n\t\t\t\t[province]=\"province\"\r\n\t\t\t>\r\n\t\t\t</lib-dati-tribunale>\r\n\t\t</div>\r\n\t</form>\r\n</mat-expansion-panel>\r\n<!-- TODO -->\r\n<!-- <div class=\"mt-4\"></div>\r\n<lp-stepper-navigator-rx\r\n\t\t[form]=\"form\"\r\n\t\t[direction]=\"direction\"\r\n\t\t[isFinal]=\"isFinal\"\r\n\t\t[isContainerValid]=\"isFormValid$\"\r\n\t\t(goForward)=\"forward($event)\"\r\n\t\t(goBackward)=\"backward($event)\"\r\n\t\t(complete)=\"complete($event)\"\r\n\t\t(salvaBozza)=\"onSalvaBozza($event)\"\r\n>\r\n</lp-stepper-navigator-rx> -->\r\n", styles: [".mat-card{border-radius:0!important;border-top:5px solid #0a2644}.divider{background-color:#737373;height:1px;width:100%}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:#fff!important}.mat-select-value{max-width:100%;width:100%!important}"] },] } ]; PagamentoComponent.ctorParameters = () => [ { type: MessageService } ]; PagamentoComponent.propDecorators = { pagamento: [{ type: Input }], tipologiePagamento$: [{ type: Input }], modalitaPagamento$: [{ type: Input }], province: [{ type: Input }], attoPignoramento: [{ type: Input }], nextStep: [{ type: Output }], salvaBozza: [{ type: Output }], previousStep: [{ type: Output }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnYW1lbnRvLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJDOi9Qcm9nZXR0aS9EQUcvc29yZ2VudGkvZ2l0bGFiLXNvZnR3YXJlZmFjdG9yeS9jb21tb24tY29tcG9uZW50LWxpYi9wcm9qZWN0cy9wb3J0YWwtY29tbW9uLWNvbXBvbmVudC1saWIvc3JjLyIsInNvdXJjZXMiOlsibGliL2RlcG9zaXRpL2NvbXBvbmVudHMvcGFnYW1lbnRvL3BhZ2FtZW50by5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFckUsT0FBTyxFQUFFLGFBQWEsRUFBd0IsTUFBTSxxQ0FBcUMsQ0FBQztBQUMxRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHMUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDdEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBTzVHLE1BQU0sT0FBTyxrQkFBa0I7SUE0QzlCLFlBQW9CLEdB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LG9yRkFBeUM7O2FBRXpDOzs7WUFSUSxjQUFjOzs7d0JBYXJCLEtBQUs7a0NBR0wsS0FBSztpQ0FHTCxLQUFLO3VCQUdMLEtBQUs7K0JBR0wsS0FBSzt1QkFHTCxNQUFNO3lCQUdOLE1BQU07MkJBR04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBDb2RpY2VUaXBvUGFnYW1lbnRvIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3RpcG8tcGFnYW1lbXRvJztcclxuaW1wb3J0IHsgQXR0b1BpZ25vcmFtbmV0b0RUTyB9IGZyb20gJy4uLy4uL21vZGVscy9hdHRvLXBpZ25vcmFtZW50by1kdG8nO1xyXG5pbXBvcnQgeyBmcm9tSWRBbmRUaXBvLCBNb2RhbGl0YVBhZ2FtZW50b0RUTyB9IGZyb20gJy4uLy4uL21vZGVscy9tb2RhbGl0YS1wYWdhbWVudG8tZHRvJztcclxuaW1wb3J0IHsgUGFnYW1lbnRvRFRPIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3BhZ2FtZW50by1kdG8nO1xyXG5pbXBvcnQgeyBMb2NhbGl0YSB9IGZyb20gJy4uLy4uL21vZGVscy9wb3J0YWxlL2xvY2FsaXRhJztcclxuaW1wb3J0IHsgVGlwb2xvZ2ljYURUTyB9IGZyb20gJy4uLy4uL21vZGVscy90aXBvbG9naWNhLWQtdC1vJztcclxuaW1wb3J0IHsgQ29tcG9uZW50T3V0cHV0U3RhdHVzIH0gZnJvbSAnLi4vLi4vbm9ybWFsaXp6YXppb25lL2NvbXBvbmVudC1vdXRwdXQtc3RhdHVzJztcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tZXNzYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRSZWR1Y2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29tcG9uZW50LXJlZHVjZXInO1xyXG5pbXBvcnQgeyB0b0JvbmlmaWNvRXh0cmFTZXBhLCB0b0JvbmlmaWNvU2VwYSwgdG9UZXNvcmVyaWEsIHRvVmFnbGlhQmRpIH0gZnJvbSAnLi9tb2RhbGl0YS1wYWdhbWVudG8tbWFwcGVyJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnbGliLXBhZ2FtZW50bycsXHJcblx0dGVtcGxhdGVVcmw6ICcuL3BhZ2FtZW50by5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vcGFnYW1lbnRvLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGFnYW1lbnRvQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcblx0Zm9ybTogRm9ybUdyb3VwO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHBhZ2FtZW50bzogUGFnYW1lbnRvRFRPO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHRpcG9sb2dpZVBhZ2FtZW50byQ6IE9ic2VydmFibGU8QXJyYXk8VGlwb2xvZ2ljYURUTz4+O1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdG1vZGFsaXRhUGFnYW1lbnRvJDogT2JzZXJ2YWJsZTxBcnJheTxNb2RhbGl0YVBhZ2FtZW50b0RUTz4+O1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHByb3ZpbmNlOiBPYnNlcnZhYmxlPEFycmF5PExvY2FsaXRhPj47XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0YXR0b1BpZ25vcmFtZW50bzogQXR0b1BpZ25vcmFtbmV0b0RUTztcclxuXHJcblx0QE91dHB1dCgpXHJcblx0bmV4dFN0ZXA6IEV2ZW50RW1pdHRlcjxQYWdhbWVudG9EVE8+ID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdhbWVudG9EVE8+KCk7XHJcblxyXG5cdEBPdXRwdXQoKVxyXG5cdHNhbHZhQm96emE6IEV2ZW50RW1pdHRlcjxQYWdhbWVudG9EVE8+ID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdhbWVudG9EVE8+KCk7XHJcblxyXG5cdEBPdXRwdXQoKVxyXG5cdHByZXZpb3VzU3RlcDogRXZlbnRFbWl0dGVyPFBhZ2FtZW50b0RUTz4gPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2FtZW50b0RUTz4oKTtcclxuXHJcblx0dGlwb01vZGFsaXRhUGFnYW1lbnRvOiBGb3JtQ29udHJvbDtcclxuXHRtb2RhbGl0YVBhZ2FtZW50bzogRm9ybUNvbnRyb2w7XHJcblx0cGF0aWVudENhdGVnb3J5OiBGb3JtQ29udHJvbDtcclxuXHRkaXJlY3Rpb246IHN0cmluZyA9ICdib3RoLXdheXMnO1xyXG5cdGlzRmluYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0Y2hhbmdlc1ZhZ2xpYUJkaSQgPSBuZXcgU3ViamVjdDxDb21wb25lbnRPdXRwdXRTdGF0dXM8KHZhbHVlOiBQYWdhbWVudG9EVE8pID0+IHZvaWQ+PigpO1xyXG5cclxuXHRpc0Zvcm1WYWxpZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcblxyXG5cdGRlZmF1bHRWYWx1ZU1vZGFsaXRhUmltYm9yc286IE1vZGFsaXRhUGFnYW1lbnRvRFRPO1xyXG5cclxuXHRtb2RhbGl0YVBhZ2FtZW50b1BlclRpcG9TZWxlemlvbmF0byQ6IE9ic2VydmFibGU8QXJyYXk8TW9kYWxpdGFQYWdhbWVudG9EVE8+PjtcclxuXHJcblx0Y2hhbmdlc0F0dG9QaWdub3JhbWVudG8kID0gbmV3IFN1YmplY3Q8Q29tcG9uZW50T3V0cHV0U3RhdHVzPCh2YWx1ZTogUGFnYW1lbnRvRFRPKSA9PiB2b2lkPj4oKTtcclxuXHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBtc2c6IE1lc3NhZ2VTZXJ2aWNlKSB7IH1cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblx0XHR0aGlzLmZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuXHRcdGxldCB2YWxpZCA9IHRydWU7XHJcblxyXG5cdFx0aWYgKCF0aGlzLnBhZ2FtZW50bykge1xyXG5cdFx0XHR0aGlzLmluaXRQYWdhbWVudG8oKTtcclxuXHRcdFx0dmFsaWQgPSBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBjb25zb2xlLmxvZygnW1BhZ2FtZW50b0NvbXBvbmVudF0gb25Jbml0JywgdGhpcy5wYWdhbWVudG8pO1xyXG5cclxuXHRcdHRoaXMudGlwb01vZGFsaXRhUGFnYW1lbnRvID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IHRoaXMucGFnYW1lbnRvLnRpcG9QYWdhbWVudG8sIGRpc2FibGVkOiBmYWxzZSB9LFxyXG5cdFx0XHRbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xyXG5cdFx0dGhpcy5mb3JtLmFkZENvbnRyb2woJ3RpcG9Nb2RhbGl0YVBhZ2FtZW50bycsIHRoaXMudGlwb01vZGFsaXRhUGFnYW1lbnRvKTtcclxuXHJcblx0XHRjb25zdCBpbml0YWxNb2RhbGl0YVBhZ2FtZW50byA9IGZyb21JZEFuZFRpcG8odGhpcy5wYWdhbWVudG8uaWRNb2RhbGl0YVBhZ2FtZW50bywgdGhpcy5wYWdhbWVudG8udGlwb1BhZ2FtZW50byk7XHJcblxyXG5cdFx0dGhpcy5tb2RhbGl0YVBhZ2FtZW50byA9IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiBpbml0YWxNb2RhbGl0YVBhZ2FtZW50bywgZGlzYWJsZWQ6IGZhbHNlIH0sXHJcblx0XHRcdFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XHJcblx0XHR0aGlzLmZvcm0uYWRkQ29udHJvbCgnbW9kYWxpdGFQYWdhbWVudG8nLCB0aGlzLm1vZGFsaXRhUGFnYW1lbnRvKTtcclxuXHJcblx0XHRjb25zdCBjaGFuZ2VzVGlwb01vZGFsaXRhUGFnYW1lbnRvJCA9IHRoaXMudGlwb01vZGFsaXRhUGFnYW1lbnRvLnZhbHVlQ2hhbmdlc1xyXG5cdFx0XHQucGlwZShcclxuXHRcdFx0XHRzaGFyZVJlcGxheSgpXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0dGhpcy5tb2RhbGl0YVBhZ2FtZW50b1BlclRpcG9TZWxlemlvbmF0byQgPSBjaGFuZ2VzVGlwb01vZGFsaXRhUGFnYW1lbnRvJFxyXG5cdFx0XHQucGlwZShcclxuXHRcdFx0XHR0YXAoXyA9PiB0aGlzLm1vZGFsaXRhUGFnYW1lbnRvLnNldFZhbHVlKG51bGwpKSxcclxuXHRcdFx0XHR0YXAoXyA9PiB0aGlzLnJlc2V0UGFnYW1lbnRpKCkpLFxyXG5cdFx0XHRcdHN0YXJ0V2l0aCh0aGlzLnBhZ2FtZW50by50aXBvUGFnYW1lbnRvKSxcclxuXHRcdFx0XHRzd2l0Y2hNYXAodGlwb01vZGFsaXRhUGFnYW1lbnRvID0+XHJcblx0XHRcdFx0XHR0aGlzLm1vZGFsaXRhUGFnYW1lbnRvJC5waXBlKFxyXG5cdFx0XHRcdFx0XHRtYXAobW9kYWxpdGFQYWdhbWVudG9QRiA9PiB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbW9kYWxpdGFQYWdhbWVudG9QZXJUaXBvID0gbW9kYWxpdGFQYWdhbWVudG9QRi5maWx0ZXIoXHJcblx0XHRcdFx0XHRcdFx0XHRtb2QgPT4gdGlwb01vZGFsaXRhUGFnYW1lbnRvID09IG1vZC50aXBvbG9naWFQYWdhbWVudG8uY29kaWNlXHJcblx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbW9kYWxpdGFQYWdhbWVudG9QZXJUaXBvO1xyXG5cdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0KVxyXG5cclxuXHRcdGNvbnN0IGNoYW5nZXNUaXBvUmltYm9yc28kID0gY2hhbmdlc1RpcG9Nb2RhbGl0YVBhZ2FtZW50byQucGlwZShcclxuXHRcdFx0bWFwKHRpcG9SaW1ib3JzbyA9PiB7XHJcblx0XHRcdFx0cmV0dXJuIENvbXBvbmVudE91dHB1dFN0YXR1cy5vZihcclxuXHRcdFx0XHRcdHRpcG9SaW1ib3JzbyAhPSBudWxsLFxyXG5cdFx0XHRcdFx0KHBhZ2FtZW50bzogUGFnYW1lbnRvRFRPKSA9PiBwYWdhbWVudG8udGlwb1BhZ2FtZW50byA9IHRpcG9SaW1ib3JzbylcclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblxyXG5cdFx0Y29uc3QgY2hhbmdlc01vZGFsaXRhUmltYm9yc28kID1cclxuXHRcdFx0dGhpcy5tb2RhbGl0YVBhZ2FtZW50by52YWx1ZUNoYW5nZXMucGlwZShcclxuXHRcdFx0XHRtYXAocmltYm9yc28gPT4ge1xyXG5cdFx0XHRcdFx0cmV0dXJuIENvbXBvbmVudE91dHB1dFN0YXR1cy5vZihcclxuXHRcdFx0XHRcdFx0dHJ1ZSxcclxuXHRcdFx0XHRcdFx0XyA9PiB7XHJcblx0XHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coJ1tQYWdhbWVudG9Db21wb25lbnRdIHJpbWJvcnNvJywgcmltYm9yc28pO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChyaW1ib3JzbyAhPSB1bmRlZmluZWQgJiYgcmltYm9yc28gIT0gJycpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc2V0UmltYm9yc28ocmltYm9yc28pO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdGNvbnN0IHBhZ2FtZW50b0NoYW5nZXMkOiBPYnNlcnZhYmxlPENvbXBvbmVudE91dHB1dFN0YXR1czxQYWdhbWVudG9EVE8+PiA9XHJcblx0XHRcdENvbXBvbmVudFJlZHVjZXIucmVkdWNlcjQoXHJcblx0XHRcdFx0Y2hhbmdlc1RpcG9SaW1ib3JzbyQsXHJcblx0XHRcdFx0Y2hhbmdlc01vZGFsaXRhUmltYm9yc28kLFxyXG5cdFx0XHRcdHRoaXMuY2hhbmdlc1ZhZ2xpYUJkaSQsXHJcblx0XHRcdFx0Ly9UT0RPXHJcblx0XHRcdFx0dGhpcy5jaGFuZ2VzQXR0b1BpZ25vcmFtZW50byQsXHJcblx0XHRcdFx0dGhpcy5wYWdhbWVudG9WYWxpZCgpLFxyXG5cdFx0XHRcdENvbXBvbmVudE91dHB1dFN0YXR1cy5vZih2YWxpZCwgdGhpcy5wYWdhbWVudG8pXHJcblx0XHRcdClcclxuXHRcdFx0XHQucGlwZShzaGFyZVJlcGxheSgpKTtcclxuXHJcblx0XHR0aGlzLmlzRm9ybVZhbGlkJCA9IHBhZ2FtZW50b0NoYW5nZXMkLnBpcGUobWFwKF8gPT4gXy5zdGF0dXMpLCBzdGFydFdpdGgodmFsaWQpKTtcclxuXHJcblx0XHRwYWdhbWVudG9DaGFuZ2VzJC5zdWJzY3JpYmUoKHBhZ1N0YXR1cykgPT4ge1xyXG5cdFx0XHRjb25zb2xlLmxvZyhcIltQYWdhbWVudG9Db21wb25lbnRdIHN0YXR1c1wiLCBwYWdTdGF0dXMpXHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgcGFnYW1lbnRvVmFsaWQoKTogKHZhbHVlOiBhbnkpID0+IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHBhZ2FtZW50byA9PiB7XHJcblx0XHRcdGxldCBwYWdhbWVudG9WYWxpZDogYm9vbGVhbjtcclxuXHRcdFx0aWYgKHBhZ2FtZW50by50aXBvUGFnYW1lbnRvKSB7XHJcblxyXG5cdFx0XHRcdHN3aXRjaCAocGFnYW1lbnRvLnRpcG9QYWdhbWVudG8pIHtcclxuXHRcdFx0XHRcdGNhc2UgKENvZGljZVRpcG9QYWdhbWVudG8uQ09ESUNFX0JPTklGSUNPX1NFUEEpOlxyXG5cdFx0XHRcdFx0XHRwYWdhbWVudG9WYWxpZCA9IHBhZ2FtZW50by5ib25pZmljbyAhPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgKENvZGljZVRpcG9QYWdhbWVudG8uQ09ESUNFX0JPTklGSUNPX0VYVFJBX1NFUEEpOlxyXG5cdFx0XHRcdFx0XHRwYWdhbWVudG9WYWxpZCA9IHBhZ2FtZW50by5ib25pZmljb0V4dHJhU2VwYSAhPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgKENvZGljZVRpcG9QYWdhbWVudG8uQ09ESUNFX1RFU09SRVJJQSk6XHJcblx0XHRcdFx0XHRcdHBhZ2FtZW50b1ZhbGlkID0gcGFnYW1lbnRvLnRlc29yZXJpYSAhPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgKENvZGljZVRpcG9QYWdhbWVudG8uQ09ESUNFX1ZBR0xJQSk6XHJcblx0XHRcdFx0XHRcdHBhZ2FtZW50b1ZhbGlkID0gcGFnYW1lbnRvLnZhZ2xpYUJESSAhPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdHBhZ2FtZW50b1ZhbGlkID0gZmFsc2U7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdHBhZ2FtZW50b1ZhbGlkID0gZmFsc2U7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBwYWdhbWVudG9WYWxpZDtcclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHRtb2RhbGl0YUNvbXBhcmF0b3IobTE6IE1vZGFsaXRhUGFnYW1lbnRvRFRPLCBtMjogTW9kYWxpdGFQYWdhbWVudG9EVE8sKSB7XHJcblx0XHRyZXR1cm4gKG0xIHx8IHt9KS5pZE1vZGFsaXRhUGFnYW1lbnRvID09IChtMiB8fCB7fSkuaWRNb2RhbGl0YVBhZ2FtZW50bztcclxuXHR9XHJcblxyXG5cdHJlc2V0UGFnYW1lbnRpKCkge1xyXG5cdFx0dGhpcy5jaGFuZ2VzVmFnbGlhQmRpJC5uZXh0KFxyXG5cdFx0XHRDb21wb25lbnRPdXRwdXRTdGF0dXMub2YodHJ1ZSwgKHA6IFBhZ2FtZW50b0RUTykgPT4gcC52YWdsaWFCREkgPSBudWxsKVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHNldFJpbWJvcnNvKHJpbWJvcnNvOiBNb2RhbGl0YVBhZ2FtZW50b0RUTykge1xyXG5cdFx0Ly8gY29uc29sZS5sb2coJ1tzZXRSaW1ib3Jzb10nLCByaW1ib3Jzbyk7XHJcblx0XHR0aGlzLnJlc2V0TW9kYWxpdGFQYWdhbWVudG8oKTtcclxuXHRcdHRoaXMucGFnYW1lbnRvLmlkTW9kYWxpdGFQYWdhbWVudG8gPSByaW1ib3Jzby5pZE1vZGFsaXRhUGFnYW1lbnRvO1xyXG5cdFx0c3dpdGNoIChyaW1ib3Jzby50aXBvbG9naWFQYWdhbWVudG8uY29kaWNlKSB7XHJcblx0XHRcdGNhc2UgKENvZGljZVRpcG9QYWdhbWVudG8uQ09ESUNFX0JPTklGSUNPX1NFUEEpOlxyXG5cdFx0XHRcdHRoaXMucGFnYW1lbnRvLmJvbmlmaWNvID0gdG9Cb25pZmljb1NlcGEocmltYm9yc28pO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIChDb2RpY2VUaXBvUGFnYW1lbnRvLkNPRElDRV9CT05JRklDT19FWFRSQV9TRVBBKTpcclxuXHRcdFx0XHR0aGlzLnBhZ2FtZW50by5ib25pZmljb0V4dHJhU2VwYSA9IHRvQm9uaWZpY29FeHRyYVNlcGEocmltYm9yc28pO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIChDb2RpY2VUaXBvUGFnYW1lbnRvLkNPRElDRV9URVNPUkVSSUEpOlxyXG5cdFx0XHRcdHRoaXMucGFnYW1lbnRvLnRlc29yZXJpYSA9IHRvVGVzb3JlcmlhKHJpbWJvcnNvKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAoQ29kaWNlVGlwb1BhZ2FtZW50by5DT0RJQ0VfVkFHTElBKTpcclxuXHRcdFx0XHR0aGlzLnBhZ2FtZW50by52YWdsaWFCREkgPSB0b1ZhZ2xpYUJkaShyaW1ib3Jzbyk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXNldE1vZGFsaXRhUGFnYW1lbnRvKCkge1xyXG5cdFx0dGhpcy5wYWdhbWVudG8uaWRNb2RhbGl0YVBhZ2FtZW50byA9IG51bGw7XHJcblx0XHR0aGlzLnBhZ2FtZW50by52YWdsaWFCREkgPSBudWxsO1xyXG5cdFx0dGhpcy5wYWdhbWVudG8udGVzb3JlcmlhID0gbnVsbDtcclxuXHRcdHRoaXMucGFnYW1lbnRvLmJvbmlmaWNvRXh0cmFTZXBhID0gbnVsbDtcclxuXHRcdHRoaXMucGFnYW1lbnRvLmJvbmlmaWNvID0gbnVsbDtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBoYXNTZWxlY3RlZE1vZGFsaXRhRGlQYWdhbWVudG9BbmQodjogYm9vbGVhbikge1xyXG5cdFx0cmV0dXJuIHRoaXMuaGFzU2VsZWN0ZWRNb2RhbGl0YURpUGFnYW1lbnRvKCkgJiYgdjtcclxuXHR9XHJcblx0cHVibGljIGhhc1NlbGVjdGVkTW9kYWxpdGFEaVBhZ2FtZW50bygpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLm1vZGFsaXRhUGFnYW1lbnRvLnZhbHVlO1xyXG5cdH1cclxuXHJcblx0Ly9UT0RPXHJcblx0cHVibGljIGlzQXV0b3JpdGFHaXVkaXppYXJpYSgpIHtcclxuXHRcdHJldHVybiB0aGlzLmhhc1NlbGVjdGVkTW9kYWxpdGFEaVBhZ2FtZW50b0FuZChcclxuXHRcdFx0Q29kaWNlVGlwb1BhZ2FtZW50by5DT0RJQ0VfQk9OSUZJQ09fU0VQQSA9PSB0aGlzLnRpcG9Nb2RhbGl0YVBhZ2FtZW50by52YWx1ZVxyXG5cdFx0KVxyXG5cdH1cclxuXHJcblx0Zm9yd2FyZChfKSB7XHJcblx0XHR0aGlzLm5leHRTdGVwLmVtaXQodGhpcy5wYWdhbWVudG8pO1xyXG5cdH1cclxuXHJcblx0b25TYWx2YUJvenphKF8pIHtcclxuXHRcdHRoaXMuc2FsdmFCb3p6YS5lbWl0KHRoaXMucGFnYW1lbnRvKTtcclxuXHR9XHJcblxyXG5cdGJhY2t3YXJkKF8pIHtcclxuXHRcdHRoaXMucHJldmlvdXNTdGVwLmVtaXQodGhpcy5wYWdhbWVudG8pO1xyXG5cdH1cclxuXHJcblx0Y29tcGxldGUoXykgeyB9XHJcblxyXG5cdGluaXRQYWdhbWVudG8oKSB7XHJcblx0XHR0aGlzLnBhZ2FtZW50byA9IG5ldyBQYWdhbWVudG9EVE8oKTtcclxuXHR9XHJcblxyXG5cdC8vVE9ET1xyXG5cdGF0dG9QaWdub3JhbWVudG9SZWFkeShhdHRvUGlnbm9yYW1uZXRvU3RhdHVzOiBDb21wb25lbnRPdXRwdXRTdGF0dXM8QXR0b1BpZ25vcmFtbmV0b0RUTz4pIHtcclxuXHRcdC8vIGNvbnNvbGUubG9nKCdbYXR0b1BpZ25vcmFtZW50b1JlYWR5XScsIGF0dG9QaWdub3JhbW5ldG9TdGF0dXMpO1xyXG5cdFx0dGhpcy5jaGFuZ2VzQXR0b1BpZ25vcmFtZW50byQubmV4dChcclxuXHRcdFx0YXR0b1BpZ25vcmFtbmV0b1N0YXR1cy5tYXBWYWx1ZShcclxuXHRcdFx0XHQocGlnbikgPT4gKGF0OiBQYWdhbWVudG9EVE8pID0+XHJcblx0XHRcdFx0XHRhdC50cmlidW5hbGUgPSBwaWduXHJcblx0XHRcdClcclxuXHRcdCk7XHJcblx0fVxyXG59XHJcbiJdfQ==