@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
186 lines • 25.9 kB
JavaScript
import { Inject, Injectable } from '@angular/core';
import { AssignPolicy } from '../../task-content/model/policy';
import { TaskHandlingService } from './task-handling-service';
import { NAE_TASK_OPERATIONS } from '../models/task-operations-injection-token';
import { race } from 'rxjs';
import { AfterAction } from '../../utility/call-chain/after-action';
import { PermissionType } from '../../process/permissions';
import { filter, take } from "rxjs/operators";
import * as i0 from "@angular/core";
import * as i1 from "./task-data.service";
import * as i2 from "./assign-task.service";
import * as i3 from "./cancel-task.service";
import * as i4 from "./finish-policy.service";
import * as i5 from "../../utility/call-chain/call-chain.service";
import * as i6 from "../../user/services/user-comparator.service";
import * as i7 from "../../task-content/services/task-content.service";
import * as i8 from "../../authorization/permission/permission.service";
import * as i9 from "../../user/services/user.service";
/**
* Handles the sequence of actions that are performed when a task is being assigned, based on the task's configuration.
*/
export class AssignPolicyService extends TaskHandlingService {
_taskDataService;
_assignTaskService;
_cancelTaskService;
_finishPolicyService;
_callchain;
_userComparatorService;
_taskOperations;
_permissionService;
_userService;
_isForced = false;
constructor(_taskDataService, _assignTaskService, _cancelTaskService, _finishPolicyService, _callchain, _userComparatorService, _taskOperations, taskContentService, _permissionService, _userService) {
super(taskContentService);
this._taskDataService = _taskDataService;
this._assignTaskService = _assignTaskService;
this._cancelTaskService = _cancelTaskService;
this._finishPolicyService = _finishPolicyService;
this._callchain = _callchain;
this._userComparatorService = _userComparatorService;
this._taskOperations = _taskOperations;
this._permissionService = _permissionService;
this._userService = _userService;
}
get forced() {
return this._isForced;
}
set forced(bool) {
this._isForced = bool;
}
/**
* Performs the actions that correspond to the policy defined by the Task on it's assignment.
* @param taskOpened whether the Task was 'opened' (eg. task panel is expanding) or 'closed' (eg. task panel is collapsing)
* @param afterAction the action that should be performed when the assign policy (and all following policies) finishes
*/
performAssignPolicy(taskOpened, afterAction = new AfterAction()) {
if (!this._userService.isCurrentUserEmpty()) {
this.performAssign(taskOpened, afterAction);
}
else {
race([
this._userService.anonymousUser$,
this._userService.user$
])
.pipe(filter(user => !this._userService.isUserEmpty(user)))
.pipe(take(1))
.subscribe(user => this.performAssign(taskOpened, afterAction));
}
}
performAssign(taskOpened, afterAction = new AfterAction()) {
if (this._safeTask.assignPolicy === AssignPolicy.auto
&& this._permissionService.hasTaskPermission(this._safeTask, PermissionType.ASSIGN)) {
this.autoAssignPolicy(taskOpened, afterAction);
}
else {
this.manualAssignPolicy(taskOpened, afterAction);
}
}
/**
* Performs the actions that correspond to the [Auto Assign Policy]{@link AssignPolicy#auto}.
* @param taskOpened whether the Task was 'opened' (eg. task panel is expanding) or 'closed' (eg. task panel is collapsing)
* @param afterAction the action that should be performed when the assign policy (and all following policies) finishes
*/
autoAssignPolicy(taskOpened, afterAction) {
if (taskOpened) {
this.autoAssignOpenedPolicy(afterAction);
}
else {
this.autoAssignClosedPolicy(afterAction);
}
}
/**
* Performs the actions that correspond to the [Auto Assign Policy]{@link AssignPolicy#auto}
* when a task is 'opening' (eg. task panel is expanding).
*
* Assigns the task, reloads the current task page, loads task data and performs the finish policy.
*
* See [finish policy]{@link FinishPolicyService#performFinishPolicy} for more information.
*
* @param afterAction the action that should be performed when the assign policy (and all following policies) finishes
*/
autoAssignOpenedPolicy(afterAction) {
this._assignTaskService.assign(this._callchain.create((assignSuccess => {
this.afterAssignOpenPolicy(assignSuccess, afterAction);
})));
}
/**
* Reloads the current page of tasks if the preceding assign operation succeeded. Then initializes the task's data fields.
* @param assignSuccess whether the preceding assign succeeded or not
* @param afterAction the action that should be performed when the assign policy (and all following policies) finishes
*/
afterAssignOpenPolicy(assignSuccess, afterAction) {
if (!assignSuccess) {
afterAction.resolve(false);
return;
}
this._taskDataService.initializeTaskDataFields(this._callchain.create((requestSuccessful) => {
if (requestSuccessful) {
this._finishPolicyService.performFinishPolicy(afterAction);
}
else {
afterAction.resolve(false);
}
}), this._isForced);
}
/**
* Requests a reload of the task and then requests the task to be closed.
*
* @param afterAction the action that should be performed when the assign policy (and all following policies) finishes
*/
autoAssignClosedPolicy(afterAction) {
if (!this._userComparatorService.compareUsers(this._task.assignee?.id)) {
this._taskOperations.close();
afterAction.next(false);
afterAction.complete();
return;
}
this._cancelTaskService.cancel(this._callchain.create((requestSuccess) => {
this._taskOperations.close();
afterAction.next(requestSuccess);
afterAction.complete();
}));
}
/**
* Performs the actions that correspond to the [Manual Assign Policy]{@link AssignPolicy#manual}.
* @param taskOpened whether the Task was 'opened' (eg. task panel is expanding) or 'closed' (eg. task panel is collapsing)
* @param afterAction the action that should be performed when the assign policy (and all following policies) finishes
*/
manualAssignPolicy(taskOpened, afterAction) {
if (taskOpened) {
this.manualAssignOpenedPolicy(afterAction);
}
else {
afterAction.resolve(false);
}
}
/**
* Performs the actions that correspond to the [Manual Assign Policy]{@link AssignPolicy#manual}
* when a task is 'opening' (eg. task panel is expanding).
*
* Loads task data and performs the [finish policy]{@link FinishPolicyService#performFinishPolicy}.
*
* See [finish policy]{@link FinishPolicyService#performFinishPolicy} for more information.
*
* @param afterAction the action that should be performed when the assign policy (and all following policies) finishes
*/
manualAssignOpenedPolicy(afterAction) {
this._taskDataService.initializeTaskDataFields(this._callchain.create((requestSuccessful) => {
if (requestSuccessful) {
this._finishPolicyService.performFinishPolicy(afterAction);
}
else {
afterAction.resolve(false);
}
}), this._isForced);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AssignPolicyService, deps: [{ token: i1.TaskDataService }, { token: i2.AssignTaskService }, { token: i3.CancelTaskService }, { token: i4.FinishPolicyService }, { token: i5.CallChainService }, { token: i6.UserComparatorService }, { token: NAE_TASK_OPERATIONS }, { token: i7.TaskContentService }, { token: i8.PermissionService }, { token: i9.UserService }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AssignPolicyService });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AssignPolicyService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.TaskDataService }, { type: i2.AssignTaskService }, { type: i3.CancelTaskService }, { type: i4.FinishPolicyService }, { type: i5.CallChainService }, { type: i6.UserComparatorService }, { type: undefined, decorators: [{
type: Inject,
args: [NAE_TASK_OPERATIONS]
}] }, { type: i7.TaskContentService }, { type: i8.PermissionService }, { type: i9.UserService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaWduLXBvbGljeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi90YXNrL3NlcnZpY2VzL2Fzc2lnbi1wb2xpY3kuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDN0QsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFNNUQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFHOUUsT0FBTyxFQUFDLElBQUksRUFBVSxNQUFNLE1BQU0sQ0FBQztBQUVuQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFFbEUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBRXpELE9BQU8sRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0FBRTVDOztHQUVHO0FBRUgsTUFBTSxPQUFPLG1CQUFvQixTQUFRLG1CQUFtQjtJQUlsQztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDNkI7SUFFN0I7SUFDQTtJQVhkLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFFMUIsWUFBc0IsZ0JBQWlDLEVBQ2pDLGtCQUFxQyxFQUNyQyxrQkFBcUMsRUFDckMsb0JBQXlDLEVBQ3pDLFVBQTRCLEVBQzVCLHNCQUE2QyxFQUNoQixlQUErQixFQUN0RSxrQkFBc0MsRUFDNUIsa0JBQXFDLEVBQ3JDLFlBQXlCO1FBQzNDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBVlIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQUNqQyx1QkFBa0Is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Ozs7T0FTRztJQUNPLHdCQUF3QixDQUFDLFdBQXdCO1FBQ3ZELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FDMUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFO1lBQ3pDLElBQUksaUJBQWlCLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUM5RDtpQkFBTTtnQkFDSCxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzlCO1FBQ0wsQ0FBQyxDQUFDLEVBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FDakIsQ0FBQztJQUNOLENBQUM7d0dBbEtRLG1CQUFtQiwyTkFVUixtQkFBbUI7NEdBVjlCLG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFEL0IsVUFBVTs7MEJBV00sTUFBTTsyQkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Fzc2lnblBvbGljeX0gZnJvbSAnLi4vLi4vdGFzay1jb250ZW50L21vZGVsL3BvbGljeSc7XG5pbXBvcnQge1Rhc2tIYW5kbGluZ1NlcnZpY2V9IGZyb20gJy4vdGFzay1oYW5kbGluZy1zZXJ2aWNlJztcbmltcG9ydCB7VGFza0NvbnRlbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi90YXNrLWNvbnRlbnQvc2VydmljZXMvdGFzay1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrRGF0YVNlcnZpY2V9IGZyb20gJy4vdGFzay1kYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHtBc3NpZ25UYXNrU2VydmljZX0gZnJvbSAnLi9hc3NpZ24tdGFzay5zZXJ2aWNlJztcbmltcG9ydCB7Q2FuY2VsVGFza1NlcnZpY2V9IGZyb20gJy4vY2FuY2VsLXRhc2suc2VydmljZSc7XG5pbXBvcnQge0ZpbmlzaFBvbGljeVNlcnZpY2V9IGZyb20gJy4vZmluaXNoLXBvbGljeS5zZXJ2aWNlJztcbmltcG9ydCB7TkFFX1RBU0tfT1BFUkFUSU9OU30gZnJvbSAnLi4vbW9kZWxzL3Rhc2stb3BlcmF0aW9ucy1pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHtUYXNrT3BlcmF0aW9uc30gZnJvbSAnLi4vaW50ZXJmYWNlcy90YXNrLW9wZXJhdGlvbnMnO1xuaW1wb3J0IHtDYWxsQ2hhaW5TZXJ2aWNlfSBmcm9tICcuLi8uLi91dGlsaXR5L2NhbGwtY2hhaW4vY2FsbC1jaGFpbi5zZXJ2aWNlJztcbmltcG9ydCB7cmFjZSwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1VzZXJDb21wYXJhdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vdXNlci9zZXJ2aWNlcy91c2VyLWNvbXBhcmF0b3Iuc2VydmljZSc7XG5pbXBvcnQge0FmdGVyQWN0aW9ufSBmcm9tICcuLi8uLi91dGlsaXR5L2NhbGwtY2hhaW4vYWZ0ZXItYWN0aW9uJztcbmltcG9ydCB7UGVybWlzc2lvblNlcnZpY2V9IGZyb20gJy4uLy4uL2F1dGhvcml6YXRpb24vcGVybWlzc2lvbi9wZXJtaXNzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtQZXJtaXNzaW9uVHlwZX0gZnJvbSAnLi4vLi4vcHJvY2Vzcy9wZXJtaXNzaW9ucyc7XG5pbXBvcnQge1VzZXJTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vdXNlci9zZXJ2aWNlcy91c2VyLnNlcnZpY2VcIjtcbmltcG9ydCB7ZmlsdGVyLCB0YWtlfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuLyoqXG4gKiBIYW5kbGVzIHRoZSBzZXF1ZW5jZSBvZiBhY3Rpb25zIHRoYXQgYXJlIHBlcmZvcm1lZCB3aGVuIGEgdGFzayBpcyBiZWluZyBhc3NpZ25lZCwgYmFzZWQgb24gdGhlIHRhc2sncyBjb25maWd1cmF0aW9uLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXNzaWduUG9saWN5U2VydmljZSBleHRlbmRzIFRhc2tIYW5kbGluZ1NlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBfaXNGb3JjZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfdGFza0RhdGFTZXJ2aWNlOiBUYXNrRGF0YVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9hc3NpZ25UYXNrU2VydmljZTogQXNzaWduVGFza1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9jYW5jZWxUYXNrU2VydmljZTogQ2FuY2VsVGFza1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9maW5pc2hQb2xpY3lTZXJ2aWNlOiBGaW5pc2hQb2xpY3lTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfY2FsbGNoYWluOiBDYWxsQ2hhaW5TZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdXNlckNvbXBhcmF0b3JTZXJ2aWNlOiBVc2VyQ29tcGFyYXRvclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgQEluamVjdChOQUVfVEFTS19PUEVSQVRJT05TKSBwcm90ZWN0ZWQgX3Rhc2tPcGVyYXRpb25zOiBUYXNrT3BlcmF0aW9ucyxcbiAgICAgICAgICAgICAgICB0YXNrQ29udGVudFNlcnZpY2U6IFRhc2tDb250ZW50U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Blcm1pc3Npb25TZXJ2aWNlOiBQZXJtaXNzaW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3VzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSkge1xuICAgICAgICBzdXBlcih0YXNrQ29udGVudFNlcnZpY2UpO1xuICAgIH1cblxuICAgIGdldCBmb3JjZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0ZvcmNlZDtcbiAgICB9XG5cbiAgICBzZXQgZm9yY2VkKGJvb2w6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5faXNGb3JjZWQgPSBib29sO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIHRoZSBhY3Rpb25zIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgcG9saWN5IGRlZmluZWQgYnkgdGhlIFRhc2sgb24gaXQncyBhc3NpZ25tZW50LlxuICAgICAqIEBwYXJhbSB0YXNrT3BlbmVkIHdoZXRoZXIgdGhlIFRhc2sgd2FzICdvcGVuZWQnIChlZy4gdGFzayBwYW5lbCBpcyBleHBhbmRpbmcpIG9yICdjbG9zZWQnIChlZy4gdGFzayBwYW5lbCBpcyBjb2xsYXBzaW5nKVxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBhc3NpZ24gcG9saWN5IChhbmQgYWxsIGZvbGxvd2luZyBwb2xpY2llcykgZmluaXNoZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgcGVyZm9ybUFzc2lnblBvbGljeSh0YXNrT3BlbmVkOiBib29sZWFuLCBhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24gPSBuZXcgQWZ0ZXJBY3Rpb24oKSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX3VzZXJTZXJ2aWNlLmlzQ3VycmVudFVzZXJFbXB0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnBlcmZvcm1Bc3NpZ24odGFza09wZW5lZCwgYWZ0ZXJBY3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmFjZShbXG4gICAgICAgICAgICAgICAgdGhpcy5fdXNlclNlcnZpY2UuYW5vbnltb3VzVXNlciQsXG4gICAgICAgICAgICAgICAgdGhpcy5fdXNlclNlcnZpY2UudXNlciRcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKHVzZXIgPT4gIXRoaXMuX3VzZXJTZXJ2aWNlLmlzVXNlckVtcHR5KHVzZXIpKSlcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUodXNlciA9PiB0aGlzLnBlcmZvcm1Bc3NpZ24odGFza09wZW5lZCwgYWZ0ZXJBY3Rpb24pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcGVyZm9ybUFzc2lnbih0YXNrT3BlbmVkOiBib29sZWFuLCBhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24gPSBuZXcgQWZ0ZXJBY3Rpb24oKSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fc2FmZVRhc2suYXNzaWduUG9saWN5ID09PSBBc3NpZ25Qb2xpY3kuYXV0b1xuICAgICAgICAgICAgJiYgdGhpcy5fcGVybWlzc2lvblNlcnZpY2UuaGFzVGFza1Blcm1pc3Npb24odGhpcy5fc2FmZVRhc2ssIFBlcm1pc3Npb25UeXBlLkFTU0lHTikpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b0Fzc2lnblBvbGljeSh0YXNrT3BlbmVkLCBhZnRlckFjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1hbnVhbEFzc2lnblBvbGljeSh0YXNrT3BlbmVkLCBhZnRlckFjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyB0aGUgYWN0aW9ucyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIFtBdXRvIEFzc2lnbiBQb2xpY3lde0BsaW5rIEFzc2lnblBvbGljeSNhdXRvfS5cbiAgICAgKiBAcGFyYW0gdGFza09wZW5lZCB3aGV0aGVyIHRoZSBUYXNrIHdhcyAnb3BlbmVkJyAoZWcuIHRhc2sgcGFuZWwgaXMgZXhwYW5kaW5nKSBvciAnY2xvc2VkJyAoZWcuIHRhc2sgcGFuZWwgaXMgY29sbGFwc2luZylcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgYXNzaWduIHBvbGljeSAoYW5kIGFsbCBmb2xsb3dpbmcgcG9saWNpZXMpIGZpbmlzaGVzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGF1dG9Bc3NpZ25Qb2xpY3kodGFza09wZW5lZDogYm9vbGVhbiwgYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmICh0YXNrT3BlbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9Bc3NpZ25PcGVuZWRQb2xpY3koYWZ0ZXJBY3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hdXRvQXNzaWduQ2xvc2VkUG9saWN5KGFmdGVyQWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIHRoZSBhY3Rpb25zIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgW0F1dG8gQXNzaWduIFBvbGljeV17QGxpbmsgQXNzaWduUG9saWN5I2F1dG99XG4gICAgICogd2hlbiBhIHRhc2sgaXMgJ29wZW5pbmcnIChlZy4gdGFzayBwYW5lbCBpcyBleHBhbmRpbmcpLlxuICAgICAqXG4gICAgICogQXNzaWducyB0aGUgdGFzaywgcmVsb2FkcyB0aGUgY3VycmVudCB0YXNrIHBhZ2UsIGxvYWRzIHRhc2sgZGF0YSBhbmQgcGVyZm9ybXMgdGhlIGZpbmlzaCBwb2xpY3kuXG4gICAgICpcbiAgICAgKiBTZWUgW2ZpbmlzaCBwb2xpY3lde0BsaW5rIEZpbmlzaFBvbGljeVNlcnZpY2UjcGVyZm9ybUZpbmlzaFBvbGljeX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgYXNzaWduIHBvbGljeSAoYW5kIGFsbCBmb2xsb3dpbmcgcG9saWNpZXMpIGZpbmlzaGVzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGF1dG9Bc3NpZ25PcGVuZWRQb2xpY3koYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Fzc2lnblRhc2tTZXJ2aWNlLmFzc2lnbihcbiAgICAgICAgICAgIHRoaXMuX2NhbGxjaGFpbi5jcmVhdGUoKGFzc2lnblN1Y2Nlc3MgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJBc3NpZ25PcGVuUG9saWN5KGFzc2lnblN1Y2Nlc3MsIGFmdGVyQWN0aW9uKTtcbiAgICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbG9hZHMgdGhlIGN1cnJlbnQgcGFnZSBvZiB0YXNrcyBpZiB0aGUgcHJlY2VkaW5nIGFzc2lnbiBvcGVyYXRpb24gc3VjY2VlZGVkLiBUaGVuIGluaXRpYWxpemVzIHRoZSB0YXNrJ3MgZGF0YSBmaWVsZHMuXG4gICAgICogQHBhcmFtIGFzc2lnblN1Y2Nlc3Mgd2hldGhlciB0aGUgcHJlY2VkaW5nIGFzc2lnbiBzdWNjZWVkZWQgb3Igbm90XG4gICAgICogQHBhcmFtIGFmdGVyQWN0aW9uIHRoZSBhY3Rpb24gdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIHdoZW4gdGhlIGFzc2lnbiBwb2xpY3kgKGFuZCBhbGwgZm9sbG93aW5nIHBvbGljaWVzKSBmaW5pc2hlc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBhZnRlckFzc2lnbk9wZW5Qb2xpY3koYXNzaWduU3VjY2VzczogYm9vbGVhbiwgYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmICghYXNzaWduU3VjY2Vzcykge1xuICAgICAgICAgICAgYWZ0ZXJBY3Rpb24ucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90YXNrRGF0YVNlcnZpY2UuaW5pdGlhbGl6ZVRhc2tEYXRhRmllbGRzKFxuICAgICAgICAgICAgdGhpcy5fY2FsbGNoYWluLmNyZWF0ZSgocmVxdWVzdFN1Y2Nlc3NmdWwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFN1Y2Nlc3NmdWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmluaXNoUG9saWN5U2VydmljZS5wZXJmb3JtRmluaXNoUG9saWN5KGFmdGVyQWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMuX2lzRm9yY2VkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdHMgYSByZWxvYWQgb2YgdGhlIHRhc2sgYW5kIHRoZW4gcmVxdWVzdHMgdGhlIHRhc2sgdG8gYmUgY2xvc2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFmdGVyQWN0aW9uIHRoZSBhY3Rpb24gdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIHdoZW4gdGhlIGFzc2lnbiBwb2xpY3kgKGFuZCBhbGwgZm9sbG93aW5nIHBvbGljaWVzKSBmaW5pc2hlc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBhdXRvQXNzaWduQ2xvc2VkUG9saWN5KGFmdGVyQWN0aW9uOiBTdWJqZWN0PGJvb2xlYW4+KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fdXNlckNvbXBhcmF0b3JTZXJ2aWNlLmNvbXBhcmVVc2Vycyh0aGlzLl90YXNrLmFzc2lnbmVlPy5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rhc2tPcGVyYXRpb25zLmNsb3NlKCk7XG4gICAgICAgICAgICBhZnRlckFjdGlvbi5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgIGFmdGVyQWN0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2FuY2VsVGFza1NlcnZpY2UuY2FuY2VsKFxuICAgICAgICAgICAgdGhpcy5fY2FsbGNoYWluLmNyZWF0ZSgocmVxdWVzdFN1Y2Nlc3MpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl90YXNrT3BlcmF0aW9ucy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIGFmdGVyQWN0aW9uLm5leHQocmVxdWVzdFN1Y2Nlc3MpO1xuICAgICAgICAgICAgICAgIGFmdGVyQWN0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIHRoZSBhY3Rpb25zIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgW01hbnVhbCBBc3NpZ24gUG9saWN5XXtAbGluayBBc3NpZ25Qb2xpY3kjbWFudWFsfS5cbiAgICAgKiBAcGFyYW0gdGFza09wZW5lZCB3aGV0aGVyIHRoZSBUYXNrIHdhcyAnb3BlbmVkJyAoZWcuIHRhc2sgcGFuZWwgaXMgZXhwYW5kaW5nKSBvciAnY2xvc2VkJyAoZWcuIHRhc2sgcGFuZWwgaXMgY29sbGFwc2luZylcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgYXNzaWduIHBvbGljeSAoYW5kIGFsbCBmb2xsb3dpbmcgcG9saWNpZXMpIGZpbmlzaGVzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1hbnVhbEFzc2lnblBvbGljeSh0YXNrT3BlbmVkOiBib29sZWFuLCBhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRhc2tPcGVuZWQpIHtcbiAgICAgICAgICAgIHRoaXMubWFudWFsQXNzaWduT3BlbmVkUG9saWN5KGFmdGVyQWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFmdGVyQWN0aW9uLnJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIGFjdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBbTWFudWFsIEFzc2lnbiBQb2xpY3lde0BsaW5rIEFzc2lnblBvbGljeSNtYW51YWx9XG4gICAgICogd2hlbiBhIHRhc2sgaXMgJ29wZW5pbmcnIChlZy4gdGFzayBwYW5lbCBpcyBleHBhbmRpbmcpLlxuICAgICAqXG4gICAgICogTG9hZHMgdGFzayBkYXRhIGFuZCBwZXJmb3JtcyB0aGUgW2ZpbmlzaCBwb2xpY3lde0BsaW5rIEZpbmlzaFBvbGljeVNlcnZpY2UjcGVyZm9ybUZpbmlzaFBvbGljeX0uXG4gICAgICpcbiAgICAgKiBTZWUgW2ZpbmlzaCBwb2xpY3lde0BsaW5rIEZpbmlzaFBvbGljeVNlcnZpY2UjcGVyZm9ybUZpbmlzaFBvbGljeX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgYXNzaWduIHBvbGljeSAoYW5kIGFsbCBmb2xsb3dpbmcgcG9saWNpZXMpIGZpbmlzaGVzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1hbnVhbEFzc2lnbk9wZW5lZFBvbGljeShhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdGFza0RhdGFTZXJ2aWNlLmluaXRpYWxpemVUYXNrRGF0YUZpZWxkcyhcbiAgICAgICAgICAgIHRoaXMuX2NhbGxjaGFpbi5jcmVhdGUoKHJlcXVlc3RTdWNjZXNzZnVsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RTdWNjZXNzZnVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmlzaFBvbGljeVNlcnZpY2UucGVyZm9ybUZpbmlzaFBvbGljeShhZnRlckFjdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb24ucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLl9pc0ZvcmNlZFxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==