UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

184 lines 31.1 kB
import { Inject, Injectable, Optional } from '@angular/core'; import { TaskHandlingService } from './task-handling-service'; import { NAE_TASK_OPERATIONS } from '../models/task-operations-injection-token'; import { createTaskEventNotification } from '../../task-content/model/task-event-notification'; import { TaskEvent } from '../../task-content/model/task-event'; import { take } from 'rxjs/operators'; import { QueuedEvent } from '../../event-queue/model/queued-event'; import { AfterAction } from '../../utility/call-chain/after-action'; import * as i0 from "@angular/core"; import * as i1 from "../../logger/services/logger.service"; import * as i2 from "../../task-content/services/task-event.service"; import * as i3 from "../../resources/engine-endpoint/task-resource.service"; import * as i4 from "@ngx-translate/core"; import * as i5 from "../../snack-bar/services/snack-bar.service"; import * as i6 from "./task-request-state.service"; import * as i7 from "../../user/services/user-comparator.service"; import * as i8 from "./task-data.service"; import * as i9 from "../../event-queue/services/event-queue.service"; import * as i10 from "../../event/services/event.service"; import * as i11 from "../../changed-fields/services/changed-fields.service"; import * as i12 from "./selected-case.service"; import * as i13 from "../../view/task-view/service/task-view.service"; import * as i14 from "../../task-content/services/task-content.service"; import * as i15 from "../../authorization/permission/permission.service"; import * as i16 from "../../actions/services/front-action.service"; /** * Service that handles the logic of canceling a task. */ export class CancelTaskService extends TaskHandlingService { _log; _taskEventService; _taskResourceService; _translate; _snackBar; _taskState; _userComparator; _taskEvent; _taskDataService; _eventQueue; _eventService; _changedFieldsService; _taskOperations; _taskViewService; permissionService; _frontActionService; constructor(_log, _taskEventService, _taskResourceService, _translate, _snackBar, _taskState, _userComparator, _taskEvent, _taskDataService, _eventQueue, _eventService, _changedFieldsService, _taskOperations, _selectedCaseService, _taskViewService, _taskContentService, permissionService, _frontActionService) { super(_taskContentService, _selectedCaseService); this._log = _log; this._taskEventService = _taskEventService; this._taskResourceService = _taskResourceService; this._translate = _translate; this._snackBar = _snackBar; this._taskState = _taskState; this._userComparator = _userComparator; this._taskEvent = _taskEvent; this._taskDataService = _taskDataService; this._eventQueue = _eventQueue; this._eventService = _eventService; this._changedFieldsService = _changedFieldsService; this._taskOperations = _taskOperations; this._taskViewService = _taskViewService; this.permissionService = permissionService; this._frontActionService = _frontActionService; } /** * Performs the 'cancel' operation on the task held by {@link TaskContentService}. * * Doesn't send any requests if the loading indicator is in it's active state. * Otherwise sets the indicator to the active state and disables it once the request response is received. * * The argument can be used to chain operations together, * or to execute code conditionally based on the success state of the cancel operation. * * If the task held within the {@link TaskContentService} changes before a response is received, the response will be ignored * and the `afterAction` will not be executed. * @param afterAction if cancel completes successfully `true` will be emitted into this Subject, otherwise `false` will be emitted */ cancel(afterAction = new AfterAction()) { this._eventQueue.scheduleEvent(new QueuedEvent(() => this.permissionService.canCancel(this._safeTask), nextEvent => { this.performCancelRequest(afterAction, nextEvent, this._taskViewService !== null && !this._taskViewService.allowMultiOpen); }, nextEvent => { this.completeActions(afterAction, nextEvent, false); })); } /** * Performs a `cancel` request on the task currently stored in the `taskContent` service * @param afterAction the action that should be performed after the request is processed * @param nextEvent indicates to the event queue that the next event can be processed * @param forceReload whether a force reload of the task data should be performed after cancel. * If set to `false` a regular reload is performed instead. */ performCancelRequest(afterAction, nextEvent, forceReload) { const canceledTaskId = this._safeTask.stringId; // this is probably no longer necessary because of the event queue if (this._taskState.isLoading(canceledTaskId)) { nextEvent.resolve(true); return; } this._taskState.startLoading(canceledTaskId); this.cancelRequest(afterAction, canceledTaskId, nextEvent, forceReload); } /** * Calls the endpoint and processes the possible responses. * @param afterAction the action that should be performed after the request is processed * @param canceledTaskId the id of the task that is being canceled * @param nextEvent indicates to the event queue that the next event can be processed * @param forceReload whether a force reload of the task data should be performed after cancel. * If set to `false` a regular reload is performed instead. */ cancelRequest(afterAction = new AfterAction(), canceledTaskId, nextEvent = new AfterAction(), forceReload) { this._taskResourceService.cancelTask(this._safeTask.stringId).pipe(take(1)).subscribe((outcomeResource) => { this._taskState.stopLoading(canceledTaskId); if (!this.isTaskRelevant(canceledTaskId)) { this._log.debug('current task changed before the cancel response could be received, discarding...'); nextEvent.resolve(false); return; } if (outcomeResource.success) { this._taskContentService.updateStateData(outcomeResource.outcome); const changedFieldsMap = this._eventService .parseChangedFieldsFromOutcomeTree(outcomeResource.outcome); const frontActions = this._eventService.parseFrontActionsFromOutcomeTree(outcomeResource.outcome); if (!!changedFieldsMap) { this._changedFieldsService.emitChangedFields(changedFieldsMap); } if (frontActions?.length > 0) { this._frontActionService.runAll(frontActions); } forceReload ? this._taskOperations.forceReload() : this._taskOperations.reload(); this.completeActions(afterAction, nextEvent, true, outcomeResource.outcome); } else if (outcomeResource.error !== undefined) { if (outcomeResource.error !== '') { this._snackBar.openErrorSnackBar(outcomeResource.error); } if (outcomeResource.outcome !== undefined) { const changedFieldsMap = this._eventService.parseChangedFieldsFromOutcomeTree(outcomeResource.outcome); this._changedFieldsService.emitChangedFields(changedFieldsMap); } this.completeActions(afterAction, nextEvent, false); } }, error => { this._taskState.stopLoading(canceledTaskId); this._log.debug('canceling task failed', error); if (!this.isTaskRelevant(canceledTaskId)) { this._log.debug('current task changed before the cancel error could be received'); nextEvent.resolve(false); return; } this._snackBar.openErrorSnackBar(`${this._translate.instant('tasks.snackbar.cancelTask')} ${this._task} ${this._translate.instant('tasks.snackbar.failed')}`); this.completeActions(afterAction, nextEvent, false); }); } /** * complete all action streams and send notification with selected boolean */ completeActions(afterAction, nextEvent, bool, outcome) { this.sendNotification(bool, outcome); afterAction.resolve(bool); nextEvent.resolve(bool); } /** * Publishes a cancel notification to the {@link TaskEventService} * @param success whether the cancel operation was successful or not * @param outcome */ sendNotification(success, outcome) { this._taskEvent.publishTaskEvent(createTaskEventNotification(this._safeTask, TaskEvent.CANCEL, success, outcome)); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CancelTaskService, deps: [{ token: i1.LoggerService }, { token: i2.TaskEventService }, { token: i3.TaskResourceService }, { token: i4.TranslateService }, { token: i5.SnackBarService }, { token: i6.TaskRequestStateService }, { token: i7.UserComparatorService }, { token: i2.TaskEventService }, { token: i8.TaskDataService }, { token: i9.EventQueueService }, { token: i10.EventService }, { token: i11.ChangedFieldsService }, { token: NAE_TASK_OPERATIONS }, { token: i12.SelectedCaseService, optional: true }, { token: i13.TaskViewService, optional: true }, { token: i14.TaskContentService }, { token: i15.PermissionService }, { token: i16.FrontActionService }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CancelTaskService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CancelTaskService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.LoggerService }, { type: i2.TaskEventService }, { type: i3.TaskResourceService }, { type: i4.TranslateService }, { type: i5.SnackBarService }, { type: i6.TaskRequestStateService }, { type: i7.UserComparatorService }, { type: i2.TaskEventService }, { type: i8.TaskDataService }, { type: i9.EventQueueService }, { type: i10.EventService }, { type: i11.ChangedFieldsService }, { type: undefined, decorators: [{ type: Inject, args: [NAE_TASK_OPERATIONS] }] }, { type: i12.SelectedCaseService, decorators: [{ type: Optional }] }, { type: i13.TaskViewService, decorators: [{ type: Optional }] }, { type: i14.TaskContentService }, { type: i15.PermissionService }, { type: i16.FrontActionService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuY2VsLXRhc2suc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvdGFzay9zZXJ2aWNlcy9jYW5jZWwtdGFzay5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQVEzRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUk5RSxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFFOUQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBS3BDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFsRTs7R0FFRztBQUVILE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxtQkFBbUI7SUFFaEM7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQzZCO0lBRWpCO0lBRVo7SUFDQTtJQWpCdEIsWUFBc0IsSUFBbUIsRUFDbkIsaUJBQW1DLEVBQ25DLG9CQUF5QyxFQUN6QyxVQUE0QixFQUM1QixTQUEwQixFQUMxQixVQUFtQyxFQUNuQyxlQUFzQyxFQUN0QyxVQUE0QixFQUM1QixnQkFBaUMsRUFDakMsV0FBOEIsRUFDOUIsYUFBMkIsRUFDM0IscUJBQTJDLEVBQ2QsZUFBK0IsRUFDMUQsb0JBQXlDLEVBQy9CLGdCQUFpQyxF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QyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLGdCQUFnQixDQUFDLE9BQWdCLEVBQUUsT0FBMEI7UUFDbkUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDdEgsQ0FBQzt3R0FuSlEsaUJBQWlCLCtaQWNOLG1CQUFtQjs0R0FkOUIsaUJBQWlCOzs0RkFBakIsaUJBQWlCO2tCQUQ3QixVQUFVOzswQkFlTSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQzFCLFFBQVE7OzBCQUNSLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtMb2dnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9sb2dnZXIvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrQ29udGVudFNlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy90YXNrLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tFdmVudFNlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy90YXNrLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrUmVzb3VyY2VTZXJ2aWNlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvZW5naW5lLWVuZHBvaW50L3Rhc2stcmVzb3VyY2Uuc2VydmljZSc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtTbmFja0JhclNlcnZpY2V9IGZyb20gJy4uLy4uL3NuYWNrLWJhci9zZXJ2aWNlcy9zbmFjay1iYXIuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tSZXF1ZXN0U3RhdGVTZXJ2aWNlfSBmcm9tICcuL3Rhc2stcmVxdWVzdC1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7VGFza0hhbmRsaW5nU2VydmljZX0gZnJvbSAnLi90YXNrLWhhbmRsaW5nLXNlcnZpY2UnO1xuaW1wb3J0IHtOQUVfVEFTS19PUEVSQVRJT05TfSBmcm9tICcuLi9tb2RlbHMvdGFzay1vcGVyYXRpb25zLWluamVjdGlvbi10b2tlbic7XG5pbXBvcnQge1Rhc2tPcGVyYXRpb25zfSBmcm9tICcuLi9pbnRlcmZhY2VzL3Rhc2stb3BlcmF0aW9ucyc7XG5pbXBvcnQge1VzZXJDb21wYXJhdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vdXNlci9zZXJ2aWNlcy91c2VyLWNvbXBhcmF0b3Iuc2VydmljZSc7XG5pbXBvcnQge1NlbGVjdGVkQ2FzZVNlcnZpY2V9IGZyb20gJy4vc2VsZWN0ZWQtY2FzZS5zZXJ2aWNlJztcbmltcG9ydCB7Y3JlYXRlVGFza0V2ZW50Tm90aWZpY2F0aW9ufSBmcm9tICcuLi8uLi90YXNrLWNvbnRlbnQvbW9kZWwvdGFzay1ldmVudC1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHtUYXNrRXZlbnR9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9tb2RlbC90YXNrLWV2ZW50JztcbmltcG9ydCB7VGFza0RhdGFTZXJ2aWNlfSBmcm9tICcuL3Rhc2stZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7dGFrZX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtUYXNrVmlld1NlcnZpY2V9IGZyb20gJy4uLy4uL3ZpZXcvdGFzay12aWV3L3NlcnZpY2UvdGFzay12aWV3LnNlcnZpY2UnO1xuaW1wb3J0IHtDYW5jZWxUYXNrRXZlbnRPdXRjb21lfSBmcm9tICcuLi8uLi9ldmVudC9tb2RlbC9ldmVudC1vdXRjb21lcy90YXNrLW91dGNvbWVzL2NhbmNlbC10YXNrLWV2ZW50LW91dGNvbWUnO1xuaW1wb3J0IHtFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2V9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvbWVzc2FnZS1yZXNvdXJjZSc7XG5pbXBvcnQge0V2ZW50UXVldWVTZXJ2aWNlfSBmcm9tICcuLi8uLi9ldmVudC1xdWV1ZS9zZXJ2aWNlcy9ldmVudC1xdWV1ZS5zZXJ2aWNlJztcbmltcG9ydCB7UXVldWVkRXZlbnR9IGZyb20gJy4uLy4uL2V2ZW50LXF1ZXVlL21vZGVsL3F1ZXVlZC1ldmVudCc7XG5pbXBvcnQge0FmdGVyQWN0aW9ufSBmcm9tICcuLi8uLi91dGlsaXR5L2NhbGwtY2hhaW4vYWZ0ZXItYWN0aW9uJztcbmltcG9ydCB7UGVybWlzc2lvblNlcnZpY2V9IGZyb20gJy4uLy4uL2F1dGhvcml6YXRpb24vcGVybWlzc2lvbi9wZXJtaXNzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtDaGFuZ2VkRmllbGRzU2VydmljZX0gZnJvbSAnLi4vLi4vY2hhbmdlZC1maWVsZHMvc2VydmljZXMvY2hhbmdlZC1maWVsZHMuc2VydmljZSc7XG5pbXBvcnQge0V2ZW50U2VydmljZX0gZnJvbSAnLi4vLi4vZXZlbnQvc2VydmljZXMvZXZlbnQuc2VydmljZSc7XG5pbXBvcnQge0NoYW5nZWRGaWVsZHNNYXB9IGZyb20gJy4uLy4uL2V2ZW50L3NlcnZpY2VzL2ludGVyZmFjZXMvY2hhbmdlZC1maWVsZHMtbWFwJztcbmltcG9ydCB7VGFza0V2ZW50T3V0Y29tZX0gZnJvbSAnLi4vLi4vZXZlbnQvbW9kZWwvZXZlbnQtb3V0Y29tZXMvdGFzay1vdXRjb21lcy90YXNrLWV2ZW50LW91dGNvbWUnO1xuaW1wb3J0IHtGcm9udEFjdGlvblNlcnZpY2V9IGZyb20gJy4uLy4uL2FjdGlvbnMvc2VydmljZXMvZnJvbnQtYWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtGcm9udEFjdGlvbn0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvbW9kZWxzL2NoYW5nZWQtZmllbGRzJztcbi8qKlxuICogU2VydmljZSB0aGF0IGhhbmRsZXMgdGhlIGxvZ2ljIG9mIGNhbmNlbGluZyBhIHRhc2suXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDYW5jZWxUYXNrU2VydmljZSBleHRlbmRzIFRhc2tIYW5kbGluZ1NlcnZpY2Uge1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9sb2c6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90YXNrRXZlbnRTZXJ2aWNlOiBUYXNrRXZlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdGFza1Jlc291cmNlU2VydmljZTogVGFza1Jlc291cmNlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3RyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3NuYWNrQmFyOiBTbmFja0JhclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90YXNrU3RhdGU6IFRhc2tSZXF1ZXN0U3RhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdXNlckNvbXBhcmF0b3I6IFVzZXJDb21wYXJhdG9yU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Rhc2tFdmVudDogVGFza0V2ZW50U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Rhc2tEYXRhU2VydmljZTogVGFza0RhdGFTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfZXZlbnRRdWV1ZTogRXZlbnRRdWV1ZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9ldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2NoYW5nZWRGaWVsZHNTZXJ2aWNlOiBDaGFuZ2VkRmllbGRzU2VydmljZSxcbiAgICAgICAgICAgICAgICBASW5qZWN0KE5BRV9UQVNLX09QRVJBVElPTlMpIHByb3RlY3RlZCBfdGFza09wZXJhdGlvbnM6IFRhc2tPcGVyYXRpb25zLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIF9zZWxlY3RlZENhc2VTZXJ2aWNlOiBTZWxlY3RlZENhc2VTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBfdGFza1ZpZXdTZXJ2aWNlOiBUYXNrVmlld1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgX3Rhc2tDb250ZW50U2VydmljZTogVGFza0NvbnRlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBwZXJtaXNzaW9uU2VydmljZTogUGVybWlzc2lvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9mcm9udEFjdGlvblNlcnZpY2U6IEZyb250QWN0aW9uU2VydmljZVxuKSB7XG4gICAgICAgIHN1cGVyKF90YXNrQ29udGVudFNlcnZpY2UsIF9zZWxlY3RlZENhc2VTZXJ2aWNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyB0aGUgJ2NhbmNlbCcgb3BlcmF0aW9uIG9uIHRoZSB0YXNrIGhlbGQgYnkge0BsaW5rIFRhc2tDb250ZW50U2VydmljZX0uXG4gICAgICpcbiAgICAgKiBEb2Vzbid0IHNlbmQgYW55IHJlcXVlc3RzIGlmIHRoZSBsb2FkaW5nIGluZGljYXRvciBpcyBpbiBpdCdzIGFjdGl2ZSBzdGF0ZS5cbiAgICAgKiBPdGhlcndpc2Ugc2V0cyB0aGUgaW5kaWNhdG9yIHRvIHRoZSBhY3RpdmUgc3RhdGUgYW5kIGRpc2FibGVzIGl0IG9uY2UgdGhlIHJlcXVlc3QgcmVzcG9uc2UgaXMgcmVjZWl2ZWQuXG4gICAgICpcbiAgICAgKiBUaGUgYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gY2hhaW4gb3BlcmF0aW9ucyB0b2dldGhlcixcbiAgICAgKiBvciB0byBleGVjdXRlIGNvZGUgY29uZGl0aW9uYWxseSBiYXNlZCBvbiB0aGUgc3VjY2VzcyBzdGF0ZSBvZiB0aGUgY2FuY2VsIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIElmIHRoZSB0YXNrIGhlbGQgd2l0aGluIHRoZSB7QGxpbmsgVGFza0NvbnRlbnRTZXJ2aWNlfSBjaGFuZ2VzIGJlZm9yZSBhIHJlc3BvbnNlIGlzIHJlY2VpdmVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBiZSBpZ25vcmVkXG4gICAgICogYW5kIHRoZSBgYWZ0ZXJBY3Rpb25gIHdpbGwgbm90IGJlIGV4ZWN1dGVkLlxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiBpZiBjYW5jZWwgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSBgdHJ1ZWAgd2lsbCBiZSBlbWl0dGVkIGludG8gdGhpcyBTdWJqZWN0LCBvdGhlcndpc2UgYGZhbHNlYCB3aWxsIGJlIGVtaXR0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FuY2VsKGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiA9IG5ldyBBZnRlckFjdGlvbigpKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50UXVldWUuc2NoZWR1bGVFdmVudChuZXcgUXVldWVkRXZlbnQoXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnBlcm1pc3Npb25TZXJ2aWNlLmNhbkNhbmNlbCh0aGlzLl9zYWZlVGFzayksXG4gICAgICAgICAgICBuZXh0RXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGVyZm9ybUNhbmNlbFJlcXVlc3QoYWZ0ZXJBY3Rpb24sIG5leHRFdmVudCwgdGhpcy5fdGFza1ZpZXdTZXJ2aWNlICE9PSBudWxsICYmICF0aGlzLl90YXNrVmlld1NlcnZpY2UuYWxsb3dNdWx0aU9wZW4pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRFdmVudCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZUFjdGlvbnMoYWZ0ZXJBY3Rpb24sIG5leHRFdmVudCwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIGBjYW5jZWxgIHJlcXVlc3Qgb24gdGhlIHRhc2sgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgYHRhc2tDb250ZW50YCBzZXJ2aWNlXG4gICAgICogQHBhcmFtIGFmdGVyQWN0aW9uIHRoZSBhY3Rpb24gdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIGFmdGVyIHRoZSByZXF1ZXN0IGlzIHByb2Nlc3NlZFxuICAgICAqIEBwYXJhbSBuZXh0RXZlbnQgaW5kaWNhdGVzIHRvIHRoZSBldmVudCBxdWV1ZSB0aGF0IHRoZSBuZXh0IGV2ZW50IGNhbiBiZSBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gZm9yY2VSZWxvYWQgd2hldGhlciBhIGZvcmNlIHJlbG9hZCBvZiB0aGUgdGFzayBkYXRhIHNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgY2FuY2VsLlxuICAgICAqIElmIHNldCB0byBgZmFsc2VgIGEgcmVndWxhciByZWxvYWQgaXMgcGVyZm9ybWVkIGluc3RlYWQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHBlcmZvcm1DYW5jZWxSZXF1ZXN0KGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiwgbmV4dEV2ZW50OiBBZnRlckFjdGlvbiwgZm9yY2VSZWxvYWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgY2FuY2VsZWRUYXNrSWQgPSB0aGlzLl9zYWZlVGFzay5zdHJpbmdJZDtcblxuICAgICAgICAvLyB0aGlzIGlzIHByb2JhYmx5IG5vIGxvbmdlciBuZWNlc3NhcnkgYmVjYXVzZSBvZiB0aGUgZXZlbnQgcXVldWVcbiAgICAgICAgaWYgKHRoaXMuX3Rhc2tTdGF0ZS5pc0xvYWRpbmcoY2FuY2VsZWRUYXNrSWQpKSB7XG4gICAgICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdGFydExvYWRpbmcoY2FuY2VsZWRUYXNrSWQpO1xuICAgICAgICB0aGlzLmNhbmNlbFJlcXVlc3QoYWZ0ZXJBY3Rpb24sIGNhbmNlbGVkVGFza0lkLCBuZXh0RXZlbnQsIGZvcmNlUmVsb2FkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyB0aGUgZW5kcG9pbnQgYW5kIHByb2Nlc3NlcyB0aGUgcG9zc2libGUgcmVzcG9uc2VzLlxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gY2FuY2VsZWRUYXNrSWQgdGhlIGlkIG9mIHRoZSB0YXNrIHRoYXQgaXMgYmVpbmcgY2FuY2VsZWRcbiAgICAgKiBAcGFyYW0gbmV4dEV2ZW50IGluZGljYXRlcyB0byB0aGUgZXZlbnQgcXVldWUgdGhhdCB0aGUgbmV4dCBldmVudCBjYW4gYmUgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIGZvcmNlUmVsb2FkIHdoZXRoZXIgYSBmb3JjZSByZWxvYWQgb2YgdGhlIHRhc2sgZGF0YSBzaG91bGQgYmUgcGVyZm9ybWVkIGFmdGVyIGNhbmNlbC5cbiAgICAgKiBJZiBzZXQgdG8gYGZhbHNlYCBhIHJlZ3VsYXIgcmVsb2FkIGlzIHBlcmZvcm1lZCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjYW5jZWxSZXF1ZXN0KGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiA9IG5ldyBBZnRlckFjdGlvbigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGVkVGFza0lkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50OiBBZnRlckFjdGlvbiA9IG5ldyBBZnRlckFjdGlvbigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUmVsb2FkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Rhc2tSZXNvdXJjZVNlcnZpY2UuY2FuY2VsVGFzayh0aGlzLl9zYWZlVGFzay5zdHJpbmdJZCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAob3V0Y29tZVJlc291cmNlOiBFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdG9wTG9hZGluZyhjYW5jZWxlZFRhc2tJZCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNUYXNrUmVsZXZhbnQoY2FuY2VsZWRUYXNrSWQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdjdXJyZW50IHRhc2sgY2hhbmdlZCBiZWZvcmUgdGhlIGNhbmNlbCByZXNwb25zZSBjb3VsZCBiZSByZWNlaXZlZCwgZGlzY2FyZGluZy4uLicpO1xuICAgICAgICAgICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvdXRjb21lUmVzb3VyY2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS51cGRhdGVTdGF0ZURhdGEob3V0Y29tZVJlc291cmNlLm91dGNvbWUgYXMgQ2FuY2VsVGFza0V2ZW50T3V0Y29tZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlZEZpZWxkc01hcDogQ2hhbmdlZEZpZWxkc01hcCA9IHRoaXMuX2V2ZW50U2VydmljZVxuICAgICAgICAgICAgICAgICAgICAucGFyc2VDaGFuZ2VkRmllbGRzRnJvbU91dGNvbWVUcmVlKG91dGNvbWVSZXNvdXJjZS5vdXRjb21lKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9udEFjdGlvbnM6IEFycmF5PEZyb250QWN0aW9uPiA9IHRoaXMuX2V2ZW50U2VydmljZS5wYXJzZUZyb250QWN0aW9uc0Zyb21PdXRjb21lVHJlZShvdXRjb21lUmVzb3VyY2Uub3V0Y29tZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoISFjaGFuZ2VkRmllbGRzTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRGaWVsZHNTZXJ2aWNlLmVtaXRDaGFuZ2VkRmllbGRzKGNoYW5nZWRGaWVsZHNNYXApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZnJvbnRBY3Rpb25zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Zyb250QWN0aW9uU2VydmljZS5ydW5BbGwoZnJvbnRBY3Rpb25zKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3JjZVJlbG9hZCA/IHRoaXMuX3Rhc2tPcGVyYXRpb25zLmZvcmNlUmVsb2FkKCkgOiB0aGlzLl90YXNrT3BlcmF0aW9ucy5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlQWN0aW9ucyhhZnRlckFjdGlvbiwgbmV4dEV2ZW50LCB0cnVlLCBvdXRjb21lUmVzb3VyY2Uub3V0Y29tZSBhcyBDYW5jZWxUYXNrRXZlbnRPdXRjb21lKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0Y29tZVJlc291cmNlLmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAob3V0Y29tZVJlc291cmNlLmVycm9yICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuRXJyb3JTbmFja0JhcihvdXRjb21lUmVzb3VyY2UuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3V0Y29tZVJlc291cmNlLm91dGNvbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VkRmllbGRzTWFwID0gdGhpcy5fZXZlbnRTZXJ2aWNlLnBhcnNlQ2hhbmdlZEZpZWxkc0Zyb21PdXRjb21lVHJlZShvdXRjb21lUmVzb3VyY2Uub3V0Y29tZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRGaWVsZHNTZXJ2aWNlLmVtaXRDaGFuZ2VkRmllbGRzKGNoYW5nZWRGaWVsZHNNYXApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlQWN0aW9ucyhhZnRlckFjdGlvbiwgbmV4dEV2ZW50LCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdG9wTG9hZGluZyhjYW5jZWxlZFRhc2tJZCk7XG4gICAgICAgICAgICB0aGlzLl9sb2cuZGVidWcoJ2NhbmNlbGluZyB0YXNrIGZhaWxlZCcsIGVycm9yKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVGFza1JlbGV2YW50KGNhbmNlbGVkVGFza0lkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnY3VycmVudCB0YXNrIGNoYW5nZWQgYmVmb3JlIHRoZSBjYW5jZWwgZXJyb3IgY291bGQgYmUgcmVjZWl2ZWQnKTtcbiAgICAgICAgICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuRXJyb3JTbmFja0JhcihgJHt0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIuY2FuY2VsVGFzaycpfVxuICAgICAgICAgICAgICR7dGhpcy5fdGFza30gJHt0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIuZmFpbGVkJyl9YCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlQWN0aW9ucyhhZnRlckFjdGlvbiwgbmV4dEV2ZW50LCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNvbXBsZXRlIGFsbCBhY3Rpb24gc3RyZWFtcyBhbmQgc2VuZCBub3RpZmljYXRpb24gd2l0aCBzZWxlY3RlZCBib29sZWFuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXBsZXRlQWN0aW9ucyhhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24sIG5leHRFdmVudDogQWZ0ZXJBY3Rpb24sIGJvb2w6IGJvb2xlYW4sIG91dGNvbWU/OiBUYXNrRXZlbnRPdXRjb21lKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VuZE5vdGlmaWNhdGlvbihib29sLCBvdXRjb21lKTtcbiAgICAgICAgYWZ0ZXJBY3Rpb24ucmVzb2x2ZShib29sKTtcbiAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUoYm9vbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHVibGlzaGVzIGEgY2FuY2VsIG5vdGlmaWNhdGlvbiB0byB0aGUge0BsaW5rIFRhc2tFdmVudFNlcnZpY2V9XG4gICAgICogQHBhcmFtIHN1Y2Nlc3Mgd2hldGhlciB0aGUgY2FuY2VsIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBvciBub3RcbiAgICAgKiBAcGFyYW0gb3V0Y29tZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzZW5kTm90aWZpY2F0aW9uKHN1Y2Nlc3M6IGJvb2xlYW4sIG91dGNvbWU/OiBUYXNrRXZlbnRPdXRjb21lKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Rhc2tFdmVudC5wdWJsaXNoVGFza0V2ZW50KGNyZWF0ZVRhc2tFdmVudE5vdGlmaWNhdGlvbih0aGlzLl9zYWZlVGFzaywgVGFza0V2ZW50LkNBTkNFTCwgc3VjY2Vzcywgb3V0Y29tZSkpO1xuICAgIH1cbn1cbiJdfQ==