@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.userId)) {
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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Q08sd0JBQXdCLENBQUMsV0FBd0I7UUFDdkQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHdCQUF3QixDQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGlCQUFpQixFQUFFLEVBQUU7WUFDekMsSUFBSSxpQkFBaUIsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzlEO2lCQUFNO2dCQUNILFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDOUI7UUFDTCxDQUFDLENBQUMsRUFDRixJQUFJLENBQUMsU0FBUyxDQUNqQixDQUFDO0lBQ04sQ0FBQzt3R0FsS1EsbUJBQW1CLDJOQVVSLG1CQUFtQjs0R0FWOUIsbUJBQW1COzs0RkFBbkIsbUJBQW1CO2tCQUQvQixVQUFVOzswQkFXTSxNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QXNzaWduUG9saWN5fSBmcm9tICcuLi8uLi90YXNrLWNvbnRlbnQvbW9kZWwvcG9saWN5JztcbmltcG9ydCB7VGFza0hhbmRsaW5nU2VydmljZX0gZnJvbSAnLi90YXNrLWhhbmRsaW5nLXNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrQ29udGVudFNlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy90YXNrLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tEYXRhU2VydmljZX0gZnJvbSAnLi90YXNrLWRhdGEuc2VydmljZSc7XG5pbXBvcnQge0Fzc2lnblRhc2tTZXJ2aWNlfSBmcm9tICcuL2Fzc2lnbi10YXNrLnNlcnZpY2UnO1xuaW1wb3J0IHtDYW5jZWxUYXNrU2VydmljZX0gZnJvbSAnLi9jYW5jZWwtdGFzay5zZXJ2aWNlJztcbmltcG9ydCB7RmluaXNoUG9saWN5U2VydmljZX0gZnJvbSAnLi9maW5pc2gtcG9saWN5LnNlcnZpY2UnO1xuaW1wb3J0IHtOQUVfVEFTS19PUEVSQVRJT05TfSBmcm9tICcuLi9tb2RlbHMvdGFzay1vcGVyYXRpb25zLWluamVjdGlvbi10b2tlbic7XG5pbXBvcnQge1Rhc2tPcGVyYXRpb25zfSBmcm9tICcuLi9pbnRlcmZhY2VzL3Rhc2stb3BlcmF0aW9ucyc7XG5pbXBvcnQge0NhbGxDaGFpblNlcnZpY2V9IGZyb20gJy4uLy4uL3V0aWxpdHkvY2FsbC1jaGFpbi9jYWxsLWNoYWluLnNlcnZpY2UnO1xuaW1wb3J0IHtyYWNlLCBTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7VXNlckNvbXBhcmF0b3JTZXJ2aWNlfSBmcm9tICcuLi8uLi91c2VyL3NlcnZpY2VzL3VzZXItY29tcGFyYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7QWZ0ZXJBY3Rpb259IGZyb20gJy4uLy4uL3V0aWxpdHkvY2FsbC1jaGFpbi9hZnRlci1hY3Rpb24nO1xuaW1wb3J0IHtQZXJtaXNzaW9uU2VydmljZX0gZnJvbSAnLi4vLi4vYXV0aG9yaXphdGlvbi9wZXJtaXNzaW9uL3Blcm1pc3Npb24uc2VydmljZSc7XG5pbXBvcnQge1Blcm1pc3Npb25UeXBlfSBmcm9tICcuLi8uLi9wcm9jZXNzL3Blcm1pc3Npb25zJztcbmltcG9ydCB7VXNlclNlcnZpY2V9IGZyb20gXCIuLi8uLi91c2VyL3NlcnZpY2VzL3VzZXIuc2VydmljZVwiO1xuaW1wb3J0IHtmaWx0ZXIsIHRha2V9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG4vKipcbiAqIEhhbmRsZXMgdGhlIHNlcXVlbmNlIG9mIGFjdGlvbnMgdGhhdCBhcmUgcGVyZm9ybWVkIHdoZW4gYSB0YXNrIGlzIGJlaW5nIGFzc2lnbmVkLCBiYXNlZCBvbiB0aGUgdGFzaydzIGNvbmZpZ3VyYXRpb24uXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBc3NpZ25Qb2xpY3lTZXJ2aWNlIGV4dGVuZHMgVGFza0hhbmRsaW5nU2VydmljZSB7XG5cbiAgICBwcml2YXRlIF9pc0ZvcmNlZCA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF90YXNrRGF0YVNlcnZpY2U6IFRhc2tEYXRhU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2Fzc2lnblRhc2tTZXJ2aWNlOiBBc3NpZ25UYXNrU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2NhbmNlbFRhc2tTZXJ2aWNlOiBDYW5jZWxUYXNrU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2ZpbmlzaFBvbGljeVNlcnZpY2U6IEZpbmlzaFBvbGljeVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9jYWxsY2hhaW46IENhbGxDaGFpblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF91c2VyQ29tcGFyYXRvclNlcnZpY2U6IFVzZXJDb21wYXJhdG9yU2VydmljZSxcbiAgICAgICAgICAgICAgICBASW5qZWN0KE5BRV9UQVNLX09QRVJBVElPTlMpIHByb3RlY3RlZCBfdGFza09wZXJhdGlvbnM6IFRhc2tPcGVyYXRpb25zLFxuICAgICAgICAgICAgICAgIHRhc2tDb250ZW50U2VydmljZTogVGFza0NvbnRlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfcGVybWlzc2lvblNlcnZpY2U6IFBlcm1pc3Npb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKHRhc2tDb250ZW50U2VydmljZSk7XG4gICAgfVxuXG4gICAgZ2V0IGZvcmNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRm9yY2VkO1xuICAgIH1cblxuICAgIHNldCBmb3JjZWQoYm9vbDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9pc0ZvcmNlZCA9IGJvb2w7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIGFjdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBwb2xpY3kgZGVmaW5lZCBieSB0aGUgVGFzayBvbiBpdCdzIGFzc2lnbm1lbnQuXG4gICAgICogQHBhcmFtIHRhc2tPcGVuZWQgd2hldGhlciB0aGUgVGFzayB3YXMgJ29wZW5lZCcgKGVnLiB0YXNrIHBhbmVsIGlzIGV4cGFuZGluZykgb3IgJ2Nsb3NlZCcgKGVnLiB0YXNrIHBhbmVsIGlzIGNvbGxhcHNpbmcpXG4gICAgICogQHBhcmFtIGFmdGVyQWN0aW9uIHRoZSBhY3Rpb24gdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIHdoZW4gdGhlIGFzc2lnbiBwb2xpY3kgKGFuZCBhbGwgZm9sbG93aW5nIHBvbGljaWVzKSBmaW5pc2hlc1xuICAgICAqL1xuICAgIHB1YmxpYyBwZXJmb3JtQXNzaWduUG9saWN5KHRhc2tPcGVuZWQ6IGJvb2xlYW4sIGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiA9IG5ldyBBZnRlckFjdGlvbigpKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fdXNlclNlcnZpY2UuaXNDdXJyZW50VXNlckVtcHR5KCkpIHtcbiAgICAgICAgICAgIHRoaXMucGVyZm9ybUFzc2lnbih0YXNrT3BlbmVkLCBhZnRlckFjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByYWNlKFtcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VyU2VydmljZS5hbm9ueW1vdXNVc2VyJCxcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VyU2VydmljZS51c2VyJFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIodXNlciA9PiAhdGhpcy5fdXNlclNlcnZpY2UuaXNVc2VyRW1wdHkodXNlcikpKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSh1c2VyID0+IHRoaXMucGVyZm9ybUFzc2lnbih0YXNrT3BlbmVkLCBhZnRlckFjdGlvbikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwZXJmb3JtQXNzaWduKHRhc2tPcGVuZWQ6IGJvb2xlYW4sIGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiA9IG5ldyBBZnRlckFjdGlvbigpKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9zYWZlVGFzay5hc3NpZ25Qb2xpY3kgPT09IEFzc2lnblBvbGljeS5hdXRvXG4gICAgICAgICAgICAmJiB0aGlzLl9wZXJtaXNzaW9uU2VydmljZS5oYXNUYXNrUGVybWlzc2lvbih0aGlzLl9zYWZlVGFzaywgUGVybWlzc2lvblR5cGUuQVNTSUdOKSkge1xuICAgICAgICAgICAgdGhpcy5hdXRvQXNzaWduUG9saWN5KHRhc2tPcGVuZWQsIGFmdGVyQWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWFudWFsQXNzaWduUG9saWN5KHRhc2tPcGVuZWQsIGFmdGVyQWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIHRoZSBhY3Rpb25zIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgW0F1dG8gQXNzaWduIFBvbGljeV17QGxpbmsgQXNzaWduUG9saWN5I2F1dG99LlxuICAgICAqIEBwYXJhbSB0YXNrT3BlbmVkIHdoZXRoZXIgdGhlIFRhc2sgd2FzICdvcGVuZWQnIChlZy4gdGFzayBwYW5lbCBpcyBleHBhbmRpbmcpIG9yICdjbG9zZWQnIChlZy4gdGFzayBwYW5lbCBpcyBjb2xsYXBzaW5nKVxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBhc3NpZ24gcG9saWN5IChhbmQgYWxsIGZvbGxvd2luZyBwb2xpY2llcykgZmluaXNoZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXV0b0Fzc2lnblBvbGljeSh0YXNrT3BlbmVkOiBib29sZWFuLCBhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRhc2tPcGVuZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b0Fzc2lnbk9wZW5lZFBvbGljeShhZnRlckFjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9Bc3NpZ25DbG9zZWRQb2xpY3koYWZ0ZXJBY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIGFjdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBbQXV0byBBc3NpZ24gUG9saWN5XXtAbGluayBBc3NpZ25Qb2xpY3kjYXV0b31cbiAgICAgKiB3aGVuIGEgdGFzayBpcyAnb3BlbmluZycgKGVnLiB0YXNrIHBhbmVsIGlzIGV4cGFuZGluZykuXG4gICAgICpcbiAgICAgKiBBc3NpZ25zIHRoZSB0YXNrLCByZWxvYWRzIHRoZSBjdXJyZW50IHRhc2sgcGFnZSwgbG9hZHMgdGFzayBkYXRhIGFuZCBwZXJmb3JtcyB0aGUgZmluaXNoIHBvbGljeS5cbiAgICAgKlxuICAgICAqIFNlZSBbZmluaXNoIHBvbGljeV17QGxpbmsgRmluaXNoUG9saWN5U2VydmljZSNwZXJmb3JtRmluaXNoUG9saWN5fSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBhc3NpZ24gcG9saWN5IChhbmQgYWxsIGZvbGxvd2luZyBwb2xpY2llcykgZmluaXNoZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXV0b0Fzc2lnbk9wZW5lZFBvbGljeShhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYXNzaWduVGFza1NlcnZpY2UuYXNzaWduKFxuICAgICAgICAgICAgdGhpcy5fY2FsbGNoYWluLmNyZWF0ZSgoYXNzaWduU3VjY2VzcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZnRlckFzc2lnbk9wZW5Qb2xpY3koYXNzaWduU3VjY2VzcywgYWZ0ZXJBY3Rpb24pO1xuICAgICAgICAgICAgfSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsb2FkcyB0aGUgY3VycmVudCBwYWdlIG9mIHRhc2tzIGlmIHRoZSBwcmVjZWRpbmcgYXNzaWduIG9wZXJhdGlvbiBzdWNjZWVkZWQuIFRoZW4gaW5pdGlhbGl6ZXMgdGhlIHRhc2sncyBkYXRhIGZpZWxkcy5cbiAgICAgKiBAcGFyYW0gYXNzaWduU3VjY2VzcyB3aGV0aGVyIHRoZSBwcmVjZWRpbmcgYXNzaWduIHN1Y2NlZWRlZCBvciBub3RcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgYXNzaWduIHBvbGljeSAoYW5kIGFsbCBmb2xsb3dpbmcgcG9saWNpZXMpIGZpbmlzaGVzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFmdGVyQXNzaWduT3BlblBvbGljeShhc3NpZ25TdWNjZXNzOiBib29sZWFuLCBhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFhc3NpZ25TdWNjZXNzKSB7XG4gICAgICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Rhc2tEYXRhU2VydmljZS5pbml0aWFsaXplVGFza0RhdGFGaWVsZHMoXG4gICAgICAgICAgICB0aGlzLl9jYWxsY2hhaW4uY3JlYXRlKChyZXF1ZXN0U3VjY2Vzc2Z1bCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0U3VjY2Vzc2Z1bCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9maW5pc2hQb2xpY3lTZXJ2aWNlLnBlcmZvcm1GaW5pc2hQb2xpY3koYWZ0ZXJBY3Rpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFmdGVyQWN0aW9uLnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGhpcy5faXNGb3JjZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0cyBhIHJlbG9hZCBvZiB0aGUgdGFzayBhbmQgdGhlbiByZXF1ZXN0cyB0aGUgdGFzayB0byBiZSBjbG9zZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgYXNzaWduIHBvbGljeSAoYW5kIGFsbCBmb2xsb3dpbmcgcG9saWNpZXMpIGZpbmlzaGVzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGF1dG9Bc3NpZ25DbG9zZWRQb2xpY3koYWZ0ZXJBY3Rpb246IFN1YmplY3Q8Ym9vbGVhbj4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl91c2VyQ29tcGFyYXRvclNlcnZpY2UuY29tcGFyZVVzZXJzKHRoaXMuX3Rhc2sudXNlcklkKSkge1xuICAgICAgICAgICAgdGhpcy5fdGFza09wZXJhdGlvbnMuY2xvc2UoKTtcbiAgICAgICAgICAgIGFmdGVyQWN0aW9uLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgYWZ0ZXJBY3Rpb24uY29tcGxldGUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYW5jZWxUYXNrU2VydmljZS5jYW5jZWwoXG4gICAgICAgICAgICB0aGlzLl9jYWxsY2hhaW4uY3JlYXRlKChyZXF1ZXN0U3VjY2VzcykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tPcGVyYXRpb25zLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb24ubmV4dChyZXF1ZXN0U3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb24uY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIGFjdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBbTWFudWFsIEFzc2lnbiBQb2xpY3lde0BsaW5rIEFzc2lnblBvbGljeSNtYW51YWx9LlxuICAgICAqIEBwYXJhbSB0YXNrT3BlbmVkIHdoZXRoZXIgdGhlIFRhc2sgd2FzICdvcGVuZWQnIChlZy4gdGFzayBwYW5lbCBpcyBleHBhbmRpbmcpIG9yICdjbG9zZWQnIChlZy4gdGFzayBwYW5lbCBpcyBjb2xsYXBzaW5nKVxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBhc3NpZ24gcG9saWN5IChhbmQgYWxsIGZvbGxvd2luZyBwb2xpY2llcykgZmluaXNoZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFudWFsQXNzaWduUG9saWN5KHRhc2tPcGVuZWQ6IGJvb2xlYW4sIGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAodGFza09wZW5lZCkge1xuICAgICAgICAgICAgdGhpcy5tYW51YWxBc3NpZ25PcGVuZWRQb2xpY3koYWZ0ZXJBY3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWZ0ZXJBY3Rpb24ucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyB0aGUgYWN0aW9ucyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIFtNYW51YWwgQXNzaWduIFBvbGljeV17QGxpbmsgQXNzaWduUG9saWN5I21hbnVhbH1cbiAgICAgKiB3aGVuIGEgdGFzayBpcyAnb3BlbmluZycgKGVnLiB0YXNrIHBhbmVsIGlzIGV4cGFuZGluZykuXG4gICAgICpcbiAgICAgKiBMb2FkcyB0YXNrIGRhdGEgYW5kIHBlcmZvcm1zIHRoZSBbZmluaXNoIHBvbGljeV17QGxpbmsgRmluaXNoUG9saWN5U2VydmljZSNwZXJmb3JtRmluaXNoUG9saWN5fS5cbiAgICAgKlxuICAgICAqIFNlZSBbZmluaXNoIHBvbGljeV17QGxpbmsgRmluaXNoUG9saWN5U2VydmljZSNwZXJmb3JtRmluaXNoUG9saWN5fSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBhc3NpZ24gcG9saWN5IChhbmQgYWxsIGZvbGxvd2luZyBwb2xpY2llcykgZmluaXNoZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFudWFsQXNzaWduT3BlbmVkUG9saWN5KGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLl90YXNrRGF0YVNlcnZpY2UuaW5pdGlhbGl6ZVRhc2tEYXRhRmllbGRzKFxuICAgICAgICAgICAgdGhpcy5fY2FsbGNoYWluLmNyZWF0ZSgocmVxdWVzdFN1Y2Nlc3NmdWwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFN1Y2Nlc3NmdWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmluaXNoUG9saWN5U2VydmljZS5wZXJmb3JtRmluaXNoUG9saWN5KGFmdGVyQWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMuX2lzRm9yY2VkXG4gICAgICAgICk7XG4gICAgfVxufVxuIl19