UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

226 lines 34.1 kB
import { Inject, Injectable, Optional } from '@angular/core'; import { AbstractSortableViewComponent } from '../abstract/sortable-view'; import { BehaviorSubject, of } from 'rxjs'; import { Net } from '../../process/net'; import { catchError, concatMap, map, mergeMap, scan, tap } from 'rxjs/operators'; import { HttpParams } from '@angular/common/http'; import { LoadingEmitter } from '../../utility/loading-emitter'; import { hasContent } from '../../utility/pagination/page-has-content'; import { NAE_WORKFLOW_SERVICE_CONFIRM_DELETE, NAE_WORKFLOW_SERVICE_FILTER } from './models/injection-token-workflow-service'; import { arrayToObservable } from '../../utility/array-to-observable'; import { PaginationParams } from '../../utility/pagination/pagination-params'; import * as i0 from "@angular/core"; import * as i1 from "../../resources/engine-endpoint/petri-net-resource.service"; import * as i2 from "../../logger/services/logger.service"; import * as i3 from "../../dialog/services/dialog.service"; import * as i4 from "../../snack-bar/services/snack-bar.service"; import * as i5 from "@ngx-translate/core"; import * as i6 from "../../search/search-keyword-resolver-service/search-index-resolver.service"; export class WorkflowViewService extends AbstractSortableViewComponent { _petriNetResource; _log; _dialogService; _snackBarService; _translate; // TODO 19.10.2020 - Add support for requests with context (filter), same as Case- and TaskViewServices _loading$; _workflows$; _clear; _nextPage$; _endOfData; _pagination; _baseFilter; _showDeleteConfirmationDialog; constructor(_petriNetResource, _log, _dialogService, _snackBarService, _translate, resolver, injectedBaseFilter, confirmDelete) { super(resolver); this._petriNetResource = _petriNetResource; this._log = _log; this._dialogService = _dialogService; this._snackBarService = _snackBarService; this._translate = _translate; this._loading$ = new LoadingEmitter(); this._clear = false; this._endOfData = false; this._pagination = { size: 25, totalElements: undefined, totalPages: undefined, number: -1 }; this._nextPage$ = new BehaviorSubject(Object.assign({}, this._pagination, { number: 0 })); this._baseFilter = injectedBaseFilter !== null ? injectedBaseFilter : {}; this._showDeleteConfirmationDialog = confirmDelete === null || confirmDelete; const workflowsMap = this._nextPage$.pipe(mergeMap(p => this.loadPage(p)), map(petriNets => { if (this._clear) { // we set an empty value to the virtual scroll and then replace it by the real value forcing it to redraw its content const results = [{ content: [], stopLoading: false }, { content: petriNets, stopLoading: true }]; return arrayToObservable(results); } else { return of({ content: petriNets, stopLoading: true }); } }), concatMap(o => o), map(o => { if (o.stopLoading) { this._loading$.off(); } return o.content; }), map(petriNets => { return petriNets.reduce((acc, cur) => { return { ...acc, [cur.stringId]: cur }; }, {}); }), scan((acc, petriNetsMap) => { if (this._clear) { this._clear = false; return { ...petriNetsMap }; } return { ...acc, ...petriNetsMap }; }, {})); this._workflows$ = workflowsMap.pipe(map(v => Object.values(v))); } ngOnDestroy() { super.ngOnDestroy(); this._loading$.complete(); this._nextPage$.complete(); } get loading() { return this._loading$.isActive; } get loading$() { return this._loading$.asObservable(); } get workflows$() { return this._workflows$; } setSearchTitle(title) { this._baseFilter.title = title; this.reload(); } clearSearchTitle() { this._baseFilter.title = undefined; this.reload(); } loadPage(pageRequest) { if (pageRequest.number < 0) { return of([]); } let params = new HttpParams(); params = this.addSortParams(params); params = this.addPageParams(params, pageRequest); this._loading$.on(); let request; if (this._baseFilter.title !== undefined) { request = this._petriNetResource.searchElasticPetriNets(this._baseFilter, params); } else { request = this._petriNetResource.searchPetriNets(this._baseFilter, params); } return request.pipe(catchError(err => { this._log.error('Loading Petri nets has failed!', err); return of({ content: [], pagination: { ...this._pagination } }); }), tap(res => { Object.assign(this._pagination, res.pagination); }), tap(res => { this._endOfData = !hasContent(res) || res.pagination.number === res.pagination.totalPages - 1; }), map((netsPage) => { if (hasContent(netsPage)) { const array = []; netsPage.content.forEach(net => { array.push(new Net(net)); }); return array; } return []; })); } nextPage(renderedRange, totalLoaded, pagination) { if (this._endOfData) { return; } if (renderedRange.end === totalLoaded) { let p = pagination; if (p === undefined) { p = Object.assign({}, this._pagination); p.number += 1; } this._nextPage$.next(p); } } reload() { if (!this._workflows$ || !this._pagination) { return; } this._endOfData = false; this._clear = true; const p = Object.assign({}, this._pagination); p.number = 0; const range = { start: -1, end: 0 }; this.nextPage(range, 0, p); } /** * Opens a dialog (if configured) and then asks the service to delete the selected workflow. * @param workflow the workflow that should be deleted */ deleteWorkflow(workflow) { if (this._showDeleteConfirmationDialog) { const confirmationText = this._translate.instant('workflow.delete').toUpperCase(); this._dialogService.openPromptDialog(this._translate.instant('workflow.dialog.header', { name: workflow.title, version: workflow.version }), this._translate.instant('workflow.dialog.content'), this._translate.instant('workflow.dialog.typeToConfirm', { delete: confirmationText })) .afterClosed().subscribe(result => { if (result !== undefined && result.prompt === confirmationText) { this._deleteWorkflow(workflow); } else { this._snackBarService.openGenericSnackBar(this._translate.instant('workflow.snackBar.deleteCanceled'), 'info'); } }); } else { this._deleteWorkflow(workflow); } } /** * Sends the workflow delete to backend and processes the result. * @param workflow the workflow that should be deleted */ _deleteWorkflow(workflow) { this._petriNetResource.deletePetriNet(workflow.stringId).subscribe(response => { this._snackBarService.openSuccessSnackBar(this._translate.instant('workflow.snackBar.deleteInProgress')); this._log.info('Process delete success. Server response: ' + response.success); this.reload(); }, error => { this._snackBarService.openErrorSnackBar(this._translate.instant('workflow.snackBar.deleteError')); this._log.error('Process delete failed. Server response: ' + error); }); } getMetaFieldSortId() { return this._lastHeaderSearchState.fieldIdentifier; } getDefaultSortParam() { // TODO 7.4.2020 - workflow sorting and searching return ''; } addPageParams(params, pagination) { params = params.set(PaginationParams.PAGE_SIZE, `${pagination.size}`); params = params.set(PaginationParams.PAGE_NUMBER, `${pagination.number}`); return params; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WorkflowViewService, deps: [{ token: i1.PetriNetResourceService }, { token: i2.LoggerService }, { token: i3.DialogService }, { token: i4.SnackBarService }, { token: i5.TranslateService }, { token: i6.SearchIndexResolverService }, { token: NAE_WORKFLOW_SERVICE_FILTER, optional: true }, { token: NAE_WORKFLOW_SERVICE_CONFIRM_DELETE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WorkflowViewService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WorkflowViewService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.PetriNetResourceService }, { type: i2.LoggerService }, { type: i3.DialogService }, { type: i4.SnackBarService }, { type: i5.TranslateService }, { type: i6.SearchIndexResolverService }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_WORKFLOW_SERVICE_FILTER] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_WORKFLOW_SERVICE_CONFIRM_DELETE] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctdmlldy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi92aWV3L3dvcmtmbG93LXZpZXcvd29ya2Zsb3ctdmlldy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUV4RSxPQUFPLEVBQUMsZUFBZSxFQUFjLEVBQUUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDdEMsT0FBTyxFQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHL0UsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRWhELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUc3RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFFckUsT0FBTyxFQUNILG1DQUFtQyxFQUNuQywyQkFBMkIsRUFDOUIsTUFBTSwyQ0FBMkMsQ0FBQztBQUluRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUVwRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQzs7Ozs7Ozs7QUFJNUUsTUFBTSxPQUFPLG1CQUFvQixTQUFRLDZCQUE2QjtJQVk1QztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBZHRCLHVHQUF1RztJQUM3RixTQUFTLENBQWlCO0lBQzFCLFdBQVcsQ0FBeUI7SUFDcEMsTUFBTSxD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QUM7SUFDZCxDQUFDO0lBRVMsYUFBYSxDQUFDLE1BQWtCLEVBQUUsVUFBc0I7UUFDOUQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDMUUsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQzt3R0FuT1EsbUJBQW1CLDROQWtCSSwyQkFBMkIsNkJBQzNCLG1DQUFtQzs0R0FuQjFELG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFEL0IsVUFBVTs7MEJBbUJNLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsMkJBQTJCOzswQkFDOUMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxtQ0FBbUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0U29ydGFibGVWaWV3Q29tcG9uZW50fSBmcm9tICcuLi9hYnN0cmFjdC9zb3J0YWJsZS12aWV3JztcbmltcG9ydCB7UGV0cmlOZXRSZXNvdXJjZVNlcnZpY2V9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9lbmdpbmUtZW5kcG9pbnQvcGV0cmktbmV0LXJlc291cmNlLnNlcnZpY2UnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7TmV0fSBmcm9tICcuLi8uLi9wcm9jZXNzL25ldCc7XG5pbXBvcnQge2NhdGNoRXJyb3IsIGNvbmNhdE1hcCwgbWFwLCBtZXJnZU1hcCwgc2NhbiwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge1BldHJpTmV0UmVmZXJlbmNlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL3BldHJpLW5ldC1yZWZlcmVuY2UnO1xuaW1wb3J0IHtIdHRwUGFyYW1zfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1BhZ2luYXRpb259IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvcGFnaW5hdGlvbic7XG5pbXBvcnQge0xvYWRpbmdFbWl0dGVyfSBmcm9tICcuLi8uLi91dGlsaXR5L2xvYWRpbmctZW1pdHRlcic7XG5pbXBvcnQge1BhZ2V9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvcGFnZSc7XG5pbXBvcnQge0xpc3RSYW5nZX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7aGFzQ29udGVudH0gZnJvbSAnLi4vLi4vdXRpbGl0eS9wYWdpbmF0aW9uL3BhZ2UtaGFzLWNvbnRlbnQnO1xuaW1wb3J0IHtQZXRyaU5ldFJlcXVlc3RCb2R5fSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL3BldHJpLW5ldC1yZXF1ZXN0LWJvZHknO1xuaW1wb3J0IHtcbiAgICBOQUVfV09SS0ZMT1dfU0VSVklDRV9DT05GSVJNX0RFTEVURSxcbiAgICBOQUVfV09SS0ZMT1dfU0VSVklDRV9GSUxURVJcbn0gZnJvbSAnLi9tb2RlbHMvaW5qZWN0aW9uLXRva2VuLXdvcmtmbG93LXNlcnZpY2UnO1xuaW1wb3J0IHtEaWFsb2dTZXJ2aWNlfSBmcm9tICcuLi8uLi9kaWFsb2cvc2VydmljZXMvZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHtTbmFja0JhclNlcnZpY2V9IGZyb20gJy4uLy4uL3NuYWNrLWJhci9zZXJ2aWNlcy9zbmFjay1iYXIuc2VydmljZSc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHthcnJheVRvT2JzZXJ2YWJsZX0gZnJvbSAnLi4vLi4vdXRpbGl0eS9hcnJheS10by1vYnNlcnZhYmxlJztcbmltcG9ydCB7U2VhcmNoSW5kZXhSZXNvbHZlclNlcnZpY2V9IGZyb20gJy4uLy4uL3NlYXJjaC9zZWFyY2gta2V5d29yZC1yZXNvbHZlci1zZXJ2aWNlL3NlYXJjaC1pbmRleC1yZXNvbHZlci5zZXJ2aWNlJztcbmltcG9ydCB7UGFnaW5hdGlvblBhcmFtc30gZnJvbSAnLi4vLi4vdXRpbGl0eS9wYWdpbmF0aW9uL3BhZ2luYXRpb24tcGFyYW1zJztcblxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dWaWV3U2VydmljZSBleHRlbmRzIEFic3RyYWN0U29ydGFibGVWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICAgIC8vIFRPRE8gMTkuMTAuMjAyMCAtIEFkZCBzdXBwb3J0IGZvciByZXF1ZXN0cyB3aXRoIGNvbnRleHQgKGZpbHRlciksIHNhbWUgYXMgQ2FzZS0gYW5kIFRhc2tWaWV3U2VydmljZXNcbiAgICBwcm90ZWN0ZWQgX2xvYWRpbmckOiBMb2FkaW5nRW1pdHRlcjtcbiAgICBwcm90ZWN0ZWQgX3dvcmtmbG93cyQ6IE9ic2VydmFibGU8QXJyYXk8TmV0Pj47XG4gICAgcHJvdGVjdGVkIF9jbGVhcjogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgX25leHRQYWdlJDogQmVoYXZpb3JTdWJqZWN0PFBhZ2luYXRpb24+O1xuICAgIHByb3RlY3RlZCBfZW5kT2ZEYXRhOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfcGFnaW5hdGlvbjogUGFnaW5hdGlvbjtcbiAgICBwcm90ZWN0ZWQgX2Jhc2VGaWx0ZXI6IFBldHJpTmV0UmVxdWVzdEJvZHk7XG4gICAgcHJvdGVjdGVkIF9zaG93RGVsZXRlQ29uZmlybWF0aW9uRGlhbG9nOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9wZXRyaU5ldFJlc291cmNlOiBQZXRyaU5ldFJlc291cmNlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZzogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2RpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9zbmFja0JhclNlcnZpY2U6IFNuYWNrQmFyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3RyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICByZXNvbHZlcjogU2VhcmNoSW5kZXhSZXNvbHZlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChOQUVfV09SS0ZMT1dfU0VSVklDRV9GSUxURVIpIGluamVjdGVkQmFzZUZpbHRlcjogUGV0cmlOZXRSZXF1ZXN0Qm9keSxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5BRV9XT1JLRkxPV19TRVJWSUNFX0NPTkZJUk1fREVMRVRFKSBjb25maXJtRGVsZXRlOiBib29sZWFuKSB7XG4gICAgICAgIHN1cGVyKHJlc29sdmVyKTtcbiAgICAgICAgdGhpcy5fbG9hZGluZyQgPSBuZXcgTG9hZGluZ0VtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fY2xlYXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZW5kT2ZEYXRhID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb24gPSB7XG4gICAgICAgICAgICBzaXplOiAyNSxcbiAgICAgICAgICAgIHRvdGFsRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRvdGFsUGFnZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG51bWJlcjogLTFcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fbmV4dFBhZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQYWdpbmF0aW9uPihcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3BhZ2luYXRpb24sIHtudW1iZXI6IDB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuX2Jhc2VGaWx0ZXIgPSBpbmplY3RlZEJhc2VGaWx0ZXIgIT09IG51bGwgPyBpbmplY3RlZEJhc2VGaWx0ZXIgOiB7fTtcbiAgICAgICAgdGhpcy5fc2hvd0RlbGV0ZUNvbmZpcm1hdGlvbkRpYWxvZyA9IGNvbmZpcm1EZWxldGUgPT09IG51bGwgfHwgY29uZmlybURlbGV0ZTtcblxuICAgICAgICBjb25zdCB3b3JrZmxvd3NNYXAgPSB0aGlzLl9uZXh0UGFnZSQucGlwZShcbiAgICAgICAgICAgIG1lcmdlTWFwKHAgPT4gdGhpcy5sb2FkUGFnZShwKSksXG4gICAgICAgICAgICBtYXAocGV0cmlOZXRzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2xlYXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2V0IGFuIGVtcHR5IHZhbHVlIHRvIHRoZSB2aXJ0dWFsIHNjcm9sbCBhbmQgdGhlbiByZXBsYWNlIGl0IGJ5IHRoZSByZWFsIHZhbHVlIGZvcmNpbmcgaXQgdG8gcmVkcmF3IGl0cyBjb250ZW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbe2NvbnRlbnQ6IFtdLCBzdG9wTG9hZGluZzogZmFsc2V9LCB7Y29udGVudDogcGV0cmlOZXRzLCBzdG9wTG9hZGluZzogdHJ1ZX1dO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlUb09ic2VydmFibGUocmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHtjb250ZW50OiBwZXRyaU5ldHMsIHN0b3BMb2FkaW5nOiB0cnVlfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjb25jYXRNYXAobyA9PiBvKSxcbiAgICAgICAgICAgIG1hcChvID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoby5zdG9wTG9hZGluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2FkaW5nJC5vZmYoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG8uY29udGVudDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWFwKHBldHJpTmV0cyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBldHJpTmV0cy5yZWR1Y2UoKGFjYywgY3VyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7Li4uYWNjLCBbY3VyLnN0cmluZ0lkXTogY3VyfTtcbiAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNjYW4oKGFjYywgcGV0cmlOZXRzTWFwKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NsZWFyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7Li4ucGV0cmlOZXRzTWFwfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsuLi5hY2MsIC4uLnBldHJpTmV0c01hcH07XG4gICAgICAgICAgICB9LCB7fSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLl93b3JrZmxvd3MkID0gd29ya2Zsb3dzTWFwLnBpcGUoXG4gICAgICAgICAgICBtYXAodiA9PiBPYmplY3QudmFsdWVzKHYpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICB0aGlzLl9sb2FkaW5nJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9uZXh0UGFnZSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkaW5nJC5pc0FjdGl2ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvYWRpbmckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB3b3JrZmxvd3MkKCk6IE9ic2VydmFibGU8QXJyYXk8TmV0Pj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2Zsb3dzJDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U2VhcmNoVGl0bGUodGl0bGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9iYXNlRmlsdGVyLnRpdGxlID0gdGl0bGU7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyU2VhcmNoVGl0bGUoKSB7XG4gICAgICAgIHRoaXMuX2Jhc2VGaWx0ZXIudGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRQYWdlKHBhZ2VSZXF1ZXN0OiBQYWdpbmF0aW9uKTogT2JzZXJ2YWJsZTxBcnJheTxOZXQ+PiB7XG4gICAgICAgIGlmIChwYWdlUmVxdWVzdC5udW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgICAgICBwYXJhbXMgPSB0aGlzLmFkZFNvcnRQYXJhbXMocGFyYW1zKTtcbiAgICAgICAgcGFyYW1zID0gdGhpcy5hZGRQYWdlUGFyYW1zKHBhcmFtcywgcGFnZVJlcXVlc3QpO1xuICAgICAgICB0aGlzLl9sb2FkaW5nJC5vbigpO1xuXG4gICAgICAgIGxldCByZXF1ZXN0OiBPYnNlcnZhYmxlPFBhZ2U8UGV0cmlOZXRSZWZlcmVuY2U+PjtcbiAgICAgICAgaWYgKHRoaXMuX2Jhc2VGaWx0ZXIudGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVxdWVzdCA9IHRoaXMuX3BldHJpTmV0UmVzb3VyY2Uuc2VhcmNoRWxhc3RpY1BldHJpTmV0cyh0aGlzLl9iYXNlRmlsdGVyLCBwYXJhbXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVxdWVzdCA9IHRoaXMuX3BldHJpTmV0UmVzb3VyY2Uuc2VhcmNoUGV0cmlOZXRzKHRoaXMuX2Jhc2VGaWx0ZXIsIHBhcmFtcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcXVlc3QucGlwZShcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoJ0xvYWRpbmcgUGV0cmkgbmV0cyBoYXMgZmFpbGVkIScsIGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKHtjb250ZW50OiBbXSwgcGFnaW5hdGlvbjogey4uLnRoaXMuX3BhZ2luYXRpb259fSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRhcChyZXMgPT4ge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fcGFnaW5hdGlvbiwgcmVzLnBhZ2luYXRpb24pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0YXAocmVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbmRPZkRhdGEgPSAhaGFzQ29udGVudChyZXMpXG4gICAgICAgICAgICAgICAgICAgIHx8IHJlcy5wYWdpbmF0aW9uLm51bWJlciA9PT0gcmVzLnBhZ2luYXRpb24udG90YWxQYWdlcyAtIDE7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1hcCgobmV0c1BhZ2U6IFBhZ2U8UGV0cmlOZXRSZWZlcmVuY2U+KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0NvbnRlbnQobmV0c1BhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5OiBBcnJheTxOZXQ+ID0gW107XG4gICAgICAgICAgICAgICAgICAgIG5ldHNQYWdlLmNvbnRlbnQuZm9yRWFjaChuZXQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChuZXcgTmV0KG5ldCkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZXh0UGFnZShyZW5kZXJlZFJhbmdlOiBMaXN0UmFuZ2UsIHRvdGFsTG9hZGVkOiBudW1iZXIsIHBhZ2luYXRpb24/OiBQYWdpbmF0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbmRPZkRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZW5kZXJlZFJhbmdlLmVuZCA9PT0gdG90YWxMb2FkZWQpIHtcbiAgICAgICAgICAgIGxldCBwID0gcGFnaW5hdGlvbjtcbiAgICAgICAgICAgIGlmIChwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcGFnaW5hdGlvbik7XG4gICAgICAgICAgICAgICAgcC5udW1iZXIgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX25leHRQYWdlJC5uZXh0KHApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlbG9hZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl93b3JrZmxvd3MkIHx8ICF0aGlzLl9wYWdpbmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lbmRPZkRhdGEgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY2xlYXIgPSB0cnVlO1xuICAgICAgICBjb25zdCBwID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcGFnaW5hdGlvbik7XG4gICAgICAgIHAubnVtYmVyID0gMDtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB7XG4gICAgICAgICAgICBzdGFydDogLTEsXG4gICAgICAgICAgICBlbmQ6IDBcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5uZXh0UGFnZShyYW5nZSwgMCwgcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgYSBkaWFsb2cgKGlmIGNvbmZpZ3VyZWQpIGFuZCB0aGVuIGFza3MgdGhlIHNlcnZpY2UgdG8gZGVsZXRlIHRoZSBzZWxlY3RlZCB3b3JrZmxvdy5cbiAgICAgKiBAcGFyYW0gd29ya2Zsb3cgdGhlIHdvcmtmbG93IHRoYXQgc2hvdWxkIGJlIGRlbGV0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlV29ya2Zsb3cod29ya2Zsb3c6IE5ldCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fc2hvd0RlbGV0ZUNvbmZpcm1hdGlvbkRpYWxvZykge1xuICAgICAgICAgICAgY29uc3QgY29uZmlybWF0aW9uVGV4dCA9IHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCd3b3JrZmxvdy5kZWxldGUnKS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICAgICAgICB0aGlzLl9kaWFsb2dTZXJ2aWNlLm9wZW5Qcm9tcHREaWFsb2coXG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3dvcmtmbG93LmRpYWxvZy5oZWFkZXInLCB7bmFtZTogd29ya2Zsb3cudGl0bGUsIHZlcnNpb246IHdvcmtmbG93LnZlcnNpb259KSxcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgnd29ya2Zsb3cuZGlhbG9nLmNvbnRlbnQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgnd29ya2Zsb3cuZGlhbG9nLnR5cGVUb0NvbmZpcm0nLCB7ZGVsZXRlOiBjb25maXJtYXRpb25UZXh0fSkpXG4gICAgICAgICAgICAgICAgLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdC5wcm9tcHQgPT09IGNvbmZpcm1hdGlvblRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsZXRlV29ya2Zsb3cod29ya2Zsb3cpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyU2VydmljZS5vcGVuR2VuZXJpY1NuYWNrQmFyKHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCd3b3JrZmxvdy5zbmFja0Jhci5kZWxldGVDYW5jZWxlZCcpLCAnaW5mbycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZGVsZXRlV29ya2Zsb3cod29ya2Zsb3cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgdGhlIHdvcmtmbG93IGRlbGV0ZSB0byBiYWNrZW5kIGFuZCBwcm9jZXNzZXMgdGhlIHJlc3VsdC5cbiAgICAgKiBAcGFyYW0gd29ya2Zsb3cgdGhlIHdvcmtmbG93IHRoYXQgc2hvdWxkIGJlIGRlbGV0ZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2RlbGV0ZVdvcmtmbG93KHdvcmtmbG93OiBOZXQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcGV0cmlOZXRSZXNvdXJjZS5kZWxldGVQZXRyaU5ldCh3b3JrZmxvdy5zdHJpbmdJZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zbmFja0JhclNlcnZpY2Uub3BlblN1Y2Nlc3NTbmFja0Jhcih0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgnd29ya2Zsb3cuc25hY2tCYXIuZGVsZXRlSW5Qcm9ncmVzcycpKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2cuaW5mbygnUHJvY2VzcyBkZWxldGUgc3VjY2Vzcy4gU2VydmVyIHJlc3BvbnNlOiAnICsgcmVzcG9uc2Uuc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc25hY2tCYXJTZXJ2aWNlLm9wZW5FcnJvclNuYWNrQmFyKHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCd3b3JrZmxvdy5zbmFja0Jhci5kZWxldGVFcnJvcicpKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoJ1Byb2Nlc3MgZGVsZXRlIGZhaWxlZC4gU2VydmVyIHJlc3BvbnNlOiAnICsgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRNZXRhRmllbGRTb3J0SWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RIZWFkZXJTZWFyY2hTdGF0ZS5maWVsZElkZW50aWZpZXI7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldERlZmF1bHRTb3J0UGFyYW0oKTogc3RyaW5nIHtcbiAgICAgICAgLy8gVE9ETyA3LjQuMjAyMCAtIHdvcmtmbG93IHNvcnRpbmcgYW5kIHNlYXJjaGluZ1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFkZFBhZ2VQYXJhbXMocGFyYW1zOiBIdHRwUGFyYW1zLCBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uKTogSHR0cFBhcmFtcyB7XG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoUGFnaW5hdGlvblBhcmFtcy5QQUdFX1NJWkUsIGAke3BhZ2luYXRpb24uc2l6ZX1gKTtcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNldChQYWdpbmF0aW9uUGFyYW1zLlBBR0VfTlVNQkVSLCBgJHtwYWdpbmF0aW9uLm51bWJlcn1gKTtcbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG5cbn1cbiJdfQ==