@valtimo/task 10.7.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/esm2022/lib/assign-user-to-task/assign-user-to-task.component.mjs +122 -0
  2. package/esm2022/lib/models/task-list.model.mjs +28 -0
  3. package/{esm2020 → esm2022}/lib/models/task.model.mjs +1 -1
  4. package/esm2022/lib/task-detail-modal/task-detail-modal.component.mjs +210 -0
  5. package/esm2022/lib/task-list/task-list.component.mjs +252 -0
  6. package/esm2022/lib/task-permissions.mjs +34 -0
  7. package/{esm2020 → esm2022}/lib/task-routing.module.mjs +5 -5
  8. package/esm2022/lib/task.module.mjs +119 -0
  9. package/esm2022/lib/task.service.mjs +72 -0
  10. package/esm2022/public_api.mjs +26 -0
  11. package/fesm2022/valtimo-task.mjs +912 -0
  12. package/fesm2022/valtimo-task.mjs.map +1 -0
  13. package/lib/assign-user-to-task/assign-user-to-task.component.d.ts +7 -7
  14. package/lib/assign-user-to-task/assign-user-to-task.component.d.ts.map +1 -1
  15. package/lib/models/task-list.model.d.ts +0 -1
  16. package/lib/models/task-list.model.d.ts.map +1 -1
  17. package/lib/models/task.model.d.ts +7 -7
  18. package/lib/models/task.model.d.ts.map +1 -1
  19. package/lib/task-detail-modal/task-detail-modal.component.d.ts +30 -33
  20. package/lib/task-detail-modal/task-detail-modal.component.d.ts.map +1 -1
  21. package/lib/task-list/task-list.component.d.ts +22 -16
  22. package/lib/task-list/task-list.component.d.ts.map +1 -1
  23. package/lib/task-permissions.d.ts +8 -0
  24. package/lib/task-permissions.d.ts.map +1 -0
  25. package/lib/task.module.d.ts +1 -1
  26. package/lib/task.module.d.ts.map +1 -1
  27. package/lib/task.service.d.ts +4 -4
  28. package/lib/task.service.d.ts.map +1 -1
  29. package/package.json +10 -16
  30. package/public_api.d.ts +1 -0
  31. package/public_api.d.ts.map +1 -1
  32. package/esm2020/lib/assign-user-to-task/assign-user-to-task.component.mjs +0 -129
  33. package/esm2020/lib/models/task-list.model.mjs +0 -29
  34. package/esm2020/lib/task-detail-modal/task-detail-modal.component.mjs +0 -260
  35. package/esm2020/lib/task-list/task-list.component.mjs +0 -222
  36. package/esm2020/lib/task.module.mjs +0 -113
  37. package/esm2020/lib/task.service.mjs +0 -69
  38. package/esm2020/public_api.mjs +0 -25
  39. package/fesm2015/valtimo-task.mjs +0 -857
  40. package/fesm2015/valtimo-task.mjs.map +0 -1
  41. package/fesm2020/valtimo-task.mjs +0 -895
  42. package/fesm2020/valtimo-task.mjs.map +0 -1
  43. /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
  44. /package/{esm2020 → esm2022}/lib/models/task-definition.model.mjs +0 -0
  45. /package/{esm2020 → esm2022}/valtimo-task.mjs +0 -0
package/package.json CHANGED
@@ -1,21 +1,17 @@
1
1
  {
2
2
  "name": "@valtimo/task",
3
3
  "license": "EUPL-1.2",
4
- "version": "10.7.0",
4
+ "version": "11.0.0",
5
5
  "peerDependencies": {
6
- "@angular/common": "^14.3.0",
7
- "@angular/core": "^14.3.0"
6
+ "@angular/common": "^16.2.0",
7
+ "@angular/core": "^16.2.0"
8
8
  },
9
9
  "dependencies": {
10
- "ngx-toastr": "^15.2.2",
11
- "moment": "^2.29.4",
12
- "tslib": "^2.5.0"
10
+ "ngx-toastr": "17.0.2",
11
+ "moment": "2.29.4",
12
+ "tslib": "2.6.2"
13
13
  },
14
- "module": "fesm2015/valtimo-task.mjs",
15
- "es2020": "fesm2020/valtimo-task.mjs",
16
- "esm2020": "esm2020/valtimo-task.mjs",
17
- "fesm2020": "fesm2020/valtimo-task.mjs",
18
- "fesm2015": "fesm2015/valtimo-task.mjs",
14
+ "module": "fesm2022/valtimo-task.mjs",
19
15
  "typings": "index.d.ts",
20
16
  "exports": {
21
17
  "./package.json": {
@@ -23,11 +19,9 @@
23
19
  },
24
20
  ".": {
25
21
  "types": "./index.d.ts",
26
- "esm2020": "./esm2020/valtimo-task.mjs",
27
- "es2020": "./fesm2020/valtimo-task.mjs",
28
- "es2015": "./fesm2015/valtimo-task.mjs",
29
- "node": "./fesm2015/valtimo-task.mjs",
30
- "default": "./fesm2020/valtimo-task.mjs"
22
+ "esm2022": "./esm2022/valtimo-task.mjs",
23
+ "esm": "./esm2022/valtimo-task.mjs",
24
+ "default": "./fesm2022/valtimo-task.mjs"
31
25
  }
32
26
  },
33
27
  "sideEffects": false
package/public_api.d.ts CHANGED
@@ -4,4 +4,5 @@ export * from './lib/task.module';
4
4
  export * from './lib/task-detail-modal/task-detail-modal.component';
5
5
  export * from './lib/task-list/task-list.component';
6
6
  export * from './lib/assign-user-to-task/assign-user-to-task.component';
7
+ export * from './lib/task-permissions';
7
8
  //# sourceMappingURL=public_api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public_api.d.ts","sourceRoot":"","sources":["../../../projects/valtimo/task/src/public_api.ts"],"names":[],"mappings":"AAoBA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qDAAqD,CAAC;AACpE,cAAc,qCAAqC,CAAC;AACpD,cAAc,yDAAyD,CAAC"}
1
+ {"version":3,"file":"public_api.d.ts","sourceRoot":"","sources":["../../../projects/valtimo/task/src/public_api.ts"],"names":[],"mappings":"AAoBA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qDAAqD,CAAC;AACpE,cAAc,qCAAqC,CAAC;AACpD,cAAc,yDAAyD,CAAC;AACxE,cAAc,wBAAwB,CAAC"}
@@ -1,129 +0,0 @@
1
- /*
2
- * Copyright 2015-2023 Ritense BV, the Netherlands.
3
- *
4
- * Licensed under EUPL, Version 1.2 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" basis,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import { Component, EventEmitter, Input, Output, } from '@angular/core';
17
- import { BehaviorSubject, combineLatest, Subscription } from 'rxjs';
18
- import { take, tap } from 'rxjs/operators';
19
- import * as i0 from "@angular/core";
20
- import * as i1 from "../task.service";
21
- import * as i2 from "@angular/common";
22
- import * as i3 from "@valtimo/components";
23
- import * as i4 from "@ngx-translate/core";
24
- export class AssignUserToTaskComponent {
25
- constructor(taskService) {
26
- this.taskService = taskService;
27
- this.assignmentOfTaskChanged = new EventEmitter();
28
- this.candidateUsersForTask$ = new BehaviorSubject(undefined);
29
- this.disabled$ = new BehaviorSubject(true);
30
- this.assignedEmailOnServer$ = new BehaviorSubject(null);
31
- this.userEmailToAssign = null;
32
- this.assignedUserFullName$ = new BehaviorSubject(null);
33
- this._subscriptions = new Subscription();
34
- }
35
- ngOnInit() {
36
- this._subscriptions.add(this.taskService.getCandidateUsers(this.taskId).subscribe(candidateUsers => {
37
- this.candidateUsersForTask$.next(candidateUsers);
38
- if (this.assigneeEmail) {
39
- this.assignedEmailOnServer$.next(this.assigneeEmail);
40
- this.userEmailToAssign = this.assigneeEmail;
41
- this.assignedUserFullName$.next(this.getAssignedUserName(candidateUsers, this.assigneeEmail));
42
- }
43
- this.enable();
44
- }));
45
- }
46
- ngOnChanges(changes) {
47
- const assigneeEmail = changes.assigneeEmail;
48
- if (assigneeEmail) {
49
- this.candidateUsersForTask$.pipe(take(1)).subscribe(candidateUsers => {
50
- const currentUserEmail = assigneeEmail.currentValue;
51
- this.assignedEmailOnServer$.next(currentUserEmail || null);
52
- this.userEmailToAssign = currentUserEmail || null;
53
- this.assignedUserFullName$.next(this.getAssignedUserName(candidateUsers, currentUserEmail));
54
- });
55
- }
56
- else {
57
- this.clear();
58
- }
59
- }
60
- ngOnDestroy() {
61
- this._subscriptions.unsubscribe();
62
- }
63
- assignTask(userEmail) {
64
- this.disable();
65
- combineLatest([
66
- this.candidateUsersForTask$,
67
- this.taskService.assignTask(this.taskId, { assignee: userEmail }),
68
- ])
69
- .pipe(take(1), tap(([candidateUsers]) => {
70
- this.userEmailToAssign = userEmail;
71
- this.assignedEmailOnServer$.next(userEmail);
72
- this.assignedUserFullName$.next(this.getAssignedUserName(candidateUsers, userEmail));
73
- this.emitChange();
74
- this.enable();
75
- }))
76
- .subscribe();
77
- }
78
- unassignTask() {
79
- this.disable();
80
- this.taskService
81
- .unassignTask(this.taskId)
82
- .pipe(tap(() => {
83
- this.clear();
84
- this.emitChange();
85
- this.enable();
86
- }))
87
- .subscribe();
88
- }
89
- getAssignedUserName(users, userEmail) {
90
- if (users && userEmail) {
91
- const findUser = users.find(user => user.email === userEmail);
92
- return findUser ? findUser.fullName : '';
93
- }
94
- return '';
95
- }
96
- mapUsersForDropdown(users) {
97
- return (users &&
98
- users
99
- .map(user => ({ ...user, lastName: user.lastName?.split(' ').splice(-1)[0] || '' }))
100
- .sort((a, b) => a.lastName.localeCompare(b.lastName))
101
- .map(user => ({ text: user.fullName, id: user.email })));
102
- }
103
- clear() {
104
- this.assignedEmailOnServer$.next(null);
105
- this.userEmailToAssign = null;
106
- }
107
- emitChange() {
108
- this.assignmentOfTaskChanged.emit();
109
- }
110
- enable() {
111
- this.disabled$.next(false);
112
- }
113
- disable() {
114
- this.disabled$.next(true);
115
- }
116
- }
117
- AssignUserToTaskComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AssignUserToTaskComponent, deps: [{ token: i1.TaskService }], target: i0.ɵɵFactoryTarget.Component });
118
- AssignUserToTaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: AssignUserToTaskComponent, selector: "valtimo-assign-user-to-task", inputs: { taskId: "taskId", assigneeEmail: "assigneeEmail" }, outputs: { assignmentOfTaskChanged: "assignmentOfTaskChanged" }, usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2023 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n candidateUsers: candidateUsersForTask$ | async,\n disabled: disabled$ | async,\n emailOnServer: assignedEmailOnServer$ | async\n } as obs\"\n>\n <div class=\"container-fluid\">\n <div class=\"row mt-2 mb-2\">\n <div class=\"col-12 pl-0 d-flex flex-row align-items-center\">\n <ng-container *ngIf=\"obs.candidateUsers; else loading\">\n <valtimo-searchable-dropdown-select\n [style]=\"'underlinedText'\"\n [items]=\"mapUsersForDropdown(obs.candidateUsers)\"\n [buttonText]=\"'assignTask.header' | translate\"\n [searchText]=\"'interface.typeToSearch' | translate\"\n [noResultsText]=\"'interface.noSearchResults' | translate\"\n [disabled]=\"obs.disabled\"\n [selectedText]=\"'assignTask.assignedTo' | translate\"\n [selectedTextValue]=\"assignedUserFullName$ | async\"\n [clearSelectionButtonTitle]=\"'assignTask.remove' | translate\"\n [hasSelection]=\"userEmailToAssign === obs.emailOnServer && obs.emailOnServer !== null\"\n [width]=\"250\"\n (itemSelected)=\"assignTask($event)\"\n (clearSelection)=\"unassignTask()\"\n >\n </valtimo-searchable-dropdown-select>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-container>\n\n<ng-template #loading>\n <h5>\n <b>{{ 'assignTask.fetchingUsers' | translate }}</b>\n </h5>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2023 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */.container-fluid{color:#959595}i{font-size:13px}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.SearchableDropdownSelectComponent, selector: "valtimo-searchable-dropdown-select", inputs: ["style", "items", "buttonText", "searchText", "noResultsText", "disabled", "selectedText", "selectedTextValue", "clearSelectionButtonTitle", "hasSelection", "width", "hasPermission"], outputs: ["itemSelected", "clearSelection"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }] });
119
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AssignUserToTaskComponent, decorators: [{
120
- type: Component,
121
- args: [{ selector: 'valtimo-assign-user-to-task', template: "<!--\n ~ Copyright 2015-2023 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n candidateUsers: candidateUsersForTask$ | async,\n disabled: disabled$ | async,\n emailOnServer: assignedEmailOnServer$ | async\n } as obs\"\n>\n <div class=\"container-fluid\">\n <div class=\"row mt-2 mb-2\">\n <div class=\"col-12 pl-0 d-flex flex-row align-items-center\">\n <ng-container *ngIf=\"obs.candidateUsers; else loading\">\n <valtimo-searchable-dropdown-select\n [style]=\"'underlinedText'\"\n [items]=\"mapUsersForDropdown(obs.candidateUsers)\"\n [buttonText]=\"'assignTask.header' | translate\"\n [searchText]=\"'interface.typeToSearch' | translate\"\n [noResultsText]=\"'interface.noSearchResults' | translate\"\n [disabled]=\"obs.disabled\"\n [selectedText]=\"'assignTask.assignedTo' | translate\"\n [selectedTextValue]=\"assignedUserFullName$ | async\"\n [clearSelectionButtonTitle]=\"'assignTask.remove' | translate\"\n [hasSelection]=\"userEmailToAssign === obs.emailOnServer && obs.emailOnServer !== null\"\n [width]=\"250\"\n (itemSelected)=\"assignTask($event)\"\n (clearSelection)=\"unassignTask()\"\n >\n </valtimo-searchable-dropdown-select>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-container>\n\n<ng-template #loading>\n <h5>\n <b>{{ 'assignTask.fetchingUsers' | translate }}</b>\n </h5>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2023 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */.container-fluid{color:#959595}i{font-size:13px}\n"] }]
122
- }], ctorParameters: function () { return [{ type: i1.TaskService }]; }, propDecorators: { taskId: [{
123
- type: Input
124
- }], assigneeEmail: [{
125
- type: Input
126
- }], assignmentOfTaskChanged: [{
127
- type: Output
128
- }] } });
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaWduLXVzZXItdG8tdGFzay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL3Rhc2svc3JjL2xpYi9hc3NpZ24tdXNlci10by10YXNrL2Fzc2lnbi11c2VyLXRvLXRhc2suY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvYXNzaWduLXVzZXItdG8tdGFzay9hc3NpZ24tdXNlci10by10YXNrLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDbEUsT0FBTyxFQUFDLElBQUksRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBU3pDLE1BQU0sT0FBTyx5QkFBeUI7SUFZcEMsWUFBb0IsV0FBd0I7UUFBeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFUbEMsNEJBQXVCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV2RCwyQkFBc0IsR0FBRyxJQUFJLGVBQWUsQ0FBUyxTQUFTLENBQUMsQ0FBQztRQUNoRSxjQUFTLEdBQUcsSUFBSSxlQUFlLENBQVUsSUFBSSxDQUFDLENBQUM7UUFDL0MsMkJBQXNCLEdBQUcsSUFBSSxlQUFlLENBQVMsSUFBSSxDQUFDLENBQUM7UUFDM0Qsc0JBQWlCLEdBQVcsSUFBSSxDQUFDO1FBQ2pDLDBCQUFxQixHQUFHLElBQUksZUFBZSxDQUFTLElBQUksQ0FBQyxDQUFDO1FBQ2xELG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVHLENBQUM7SUFF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QyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVPLFVBQVU7UUFDaEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFTyxNQUFNO1FBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVPLE9BQU87UUFDYixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDOztzSEFsSFUseUJBQXlCOzBHQUF6Qix5QkFBeUIsdU5DckN0QyxnbUVBc0RBOzJGRGpCYSx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0UsNkJBQTZCO2tHQUs5QixNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDSSx1QkFBdUI7c0JBQWhDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyMyBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Ryb3Bkb3duSXRlbX0gZnJvbSAnQHZhbHRpbW8vY29tcG9uZW50cyc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7dGFrZSwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1Rhc2tTZXJ2aWNlfSBmcm9tICcuLi90YXNrLnNlcnZpY2UnO1xuaW1wb3J0IHtVc2VyfSBmcm9tICdAdmFsdGltby9jb25maWcnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLWFzc2lnbi11c2VyLXRvLXRhc2snLFxuICB0ZW1wbGF0ZVVybDogJy4vYXNzaWduLXVzZXItdG8tdGFzay5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Fzc2lnbi11c2VyLXRvLXRhc2suY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQXNzaWduVXNlclRvVGFza0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSB0YXNrSWQ6IHN0cmluZztcbiAgQElucHV0KCkgYXNzaWduZWVFbWFpbDogc3RyaW5nO1xuICBAT3V0cHV0KCkgYXNzaWdubWVudE9mVGFza0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY2FuZGlkYXRlVXNlcnNGb3JUYXNrJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlcltdPih1bmRlZmluZWQpO1xuICBkaXNhYmxlZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICBhc3NpZ25lZEVtYWlsT25TZXJ2ZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KG51bGwpO1xuICB1c2VyRW1haWxUb0Fzc2lnbjogc3RyaW5nID0gbnVsbDtcbiAgYXNzaWduZWRVc2VyRnVsbE5hbWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KG51bGwpO1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdGFza1NlcnZpY2U6IFRhc2tTZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNrU2VydmljZS5nZXRDYW5kaWRhdGVVc2Vycyh0aGlzLnRhc2tJZCkuc3Vic2NyaWJlKGNhbmRpZGF0ZVVzZXJzID0+IHtcbiAgICAgICAgdGhpcy5jYW5kaWRhdGVVc2Vyc0ZvclRhc2skLm5leHQoY2FuZGlkYXRlVXNlcnMpO1xuICAgICAgICBpZiAodGhpcy5hc3NpZ25lZUVtYWlsKSB7XG4gICAgICAgICAgdGhpcy5hc3NpZ25lZEVtYWlsT25TZXJ2ZXIkLm5leHQodGhpcy5hc3NpZ25lZUVtYWlsKTtcbiAgICAgICAgICB0aGlzLnVzZXJFbWFpbFRvQXNzaWduID0gdGhpcy5hc3NpZ25lZUVtYWlsO1xuICAgICAgICAgIHRoaXMuYXNzaWduZWRVc2VyRnVsbE5hbWUkLm5leHQoXG4gICAgICAgICAgICB0aGlzLmdldEFzc2lnbmVkVXNlck5hbWUoY2FuZGlkYXRlVXNlcnMsIHRoaXMuYXNzaWduZWVFbWFpbClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc3QgYXNzaWduZWVFbWFpbCA9IGNoYW5nZXMuYXNzaWduZWVFbWFpbDtcbiAgICBpZiAoYXNzaWduZWVFbWFpbCkge1xuICAgICAgdGhpcy5jYW5kaWRhdGVVc2Vyc0ZvclRhc2skLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGNhbmRpZGF0ZVVzZXJzID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudFVzZXJFbWFpbCA9IGFzc2lnbmVlRW1haWwuY3VycmVudFZhbHVlO1xuICAgICAgICB0aGlzLmFzc2lnbmVkRW1haWxPblNlcnZlciQubmV4dChjdXJyZW50VXNlckVtYWlsIHx8IG51bGwpO1xuICAgICAgICB0aGlzLnVzZXJFbWFpbFRvQXNzaWduID0gY3VycmVudFVzZXJFbWFpbCB8fCBudWxsO1xuICAgICAgICB0aGlzLmFzc2lnbmVkVXNlckZ1bGxOYW1lJC5uZXh0KHRoaXMuZ2V0QXNzaWduZWRVc2VyTmFtZShjYW5kaWRhdGVVc2VycywgY3VycmVudFVzZXJFbWFpbCkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBhc3NpZ25UYXNrKHVzZXJFbWFpbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmNhbmRpZGF0ZVVzZXJzRm9yVGFzayQsXG4gICAgICB0aGlzLnRhc2tTZXJ2aWNlLmFzc2lnblRhc2sodGhpcy50YXNrSWQsIHthc3NpZ25lZTogdXNlckVtYWlsfSksXG4gICAgXSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICB0YXAoKFtjYW5kaWRhdGVVc2Vyc10pID0+IHtcbiAgICAgICAgICB0aGlzLnVzZXJFbWFpbFRvQXNzaWduID0gdXNlckVtYWlsO1xuICAgICAgICAgIHRoaXMuYXNzaWduZWRFbWFpbE9uU2VydmVyJC5uZXh0KHVzZXJFbWFpbCk7XG4gICAgICAgICAgdGhpcy5hc3NpZ25lZFVzZXJGdWxsTmFtZSQubmV4dCh0aGlzLmdldEFzc2lnbmVkVXNlck5hbWUoY2FuZGlkYXRlVXNlcnMsIHVzZXJFbWFpbCkpO1xuICAgICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgICAgICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICB1bmFzc2lnblRhc2soKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgdGhpcy50YXNrU2VydmljZVxuICAgICAgLnVuYXNzaWduVGFzayh0aGlzLnRhc2tJZClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICAgICAgICB0aGlzLmVuYWJsZSgpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgZ2V0QXNzaWduZWRVc2VyTmFtZSh1c2VyczogVXNlcltdLCB1c2VyRW1haWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHVzZXJzICYmIHVzZXJFbWFpbCkge1xuICAgICAgY29uc3QgZmluZFVzZXIgPSB1c2Vycy5maW5kKHVzZXIgPT4gdXNlci5lbWFpbCA9PT0gdXNlckVtYWlsKTtcbiAgICAgIHJldHVybiBmaW5kVXNlciA/IGZpbmRVc2VyLmZ1bGxOYW1lIDogJyc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIG1hcFVzZXJzRm9yRHJvcGRvd24odXNlcnM6IFVzZXJbXSk6IERyb3Bkb3duSXRlbVtdIHtcbiAgICByZXR1cm4gKFxuICAgICAgdXNlcnMgJiZcbiAgICAgIHVzZXJzXG4gICAgICAgIC5tYXAodXNlciA9PiAoey4uLnVzZXIsIGxhc3ROYW1lOiB1c2VyLmxhc3ROYW1lPy5zcGxpdCgnICcpLnNwbGljZSgtMSlbMF0gfHwgJyd9KSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubGFzdE5hbWUubG9jYWxlQ29tcGFyZShiLmxhc3ROYW1lKSlcbiAgICAgICAgLm1hcCh1c2VyID0+ICh7dGV4dDogdXNlci5mdWxsTmFtZSwgaWQ6IHVzZXIuZW1haWx9KSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2lnbmVkRW1haWxPblNlcnZlciQubmV4dChudWxsKTtcbiAgICB0aGlzLnVzZXJFbWFpbFRvQXNzaWduID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2lnbm1lbnRPZlRhc2tDaGFuZ2VkLmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQkLm5leHQodHJ1ZSk7XG4gIH1cbn1cbiIsIjwhLS1cbiAgfiBDb3B5cmlnaHQgMjAxNS0yMDIzIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAgflxuICB+IExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgflxuICB+IGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAgflxuICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAtLT5cblxuPG5nLWNvbnRhaW5lclxuICAqbmdJZj1cIntcbiAgICBjYW5kaWRhdGVVc2VyczogY2FuZGlkYXRlVXNlcnNGb3JUYXNrJCB8IGFzeW5jLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCQgfCBhc3luYyxcbiAgICBlbWFpbE9uU2VydmVyOiBhc3NpZ25lZEVtYWlsT25TZXJ2ZXIkIHwgYXN5bmNcbiAgfSBhcyBvYnNcIlxuPlxuICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XG4gICAgPGRpdiBjbGFzcz1cInJvdyBtdC0yIG1iLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgcGwtMCBkLWZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvYnMuY2FuZGlkYXRlVXNlcnM7IGVsc2UgbG9hZGluZ1wiPlxuICAgICAgICAgIDx2YWx0aW1vLXNlYXJjaGFibGUtZHJvcGRvd24tc2VsZWN0XG4gICAgICAgICAgICBbc3R5bGVdPVwiJ3VuZGVybGluZWRUZXh0J1wiXG4gICAgICAgICAgICBbaXRlbXNdPVwibWFwVXNlcnNGb3JEcm9wZG93bihvYnMuY2FuZGlkYXRlVXNlcnMpXCJcbiAgICAgICAgICAgIFtidXR0b25UZXh0XT1cIidhc3NpZ25UYXNrLmhlYWRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW3NlYXJjaFRleHRdPVwiJ2ludGVyZmFjZS50eXBlVG9TZWFyY2gnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtub1Jlc3VsdHNUZXh0XT1cIidpbnRlcmZhY2Uubm9TZWFyY2hSZXN1bHRzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwib2JzLmRpc2FibGVkXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZFRleHRdPVwiJ2Fzc2lnblRhc2suYXNzaWduZWRUbycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW3NlbGVjdGVkVGV4dFZhbHVlXT1cImFzc2lnbmVkVXNlckZ1bGxOYW1lJCB8IGFzeW5jXCJcbiAgICAgICAgICAgIFtjbGVhclNlbGVjdGlvbkJ1dHRvblRpdGxlXT1cIidhc3NpZ25UYXNrLnJlbW92ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2hhc1NlbGVjdGlvbl09XCJ1c2VyRW1haWxUb0Fzc2lnbiA9PT0gb2JzLmVtYWlsT25TZXJ2ZXIgJiYgb2JzLmVtYWlsT25TZXJ2ZXIgIT09IG51bGxcIlxuICAgICAgICAgICAgW3dpZHRoXT1cIjI1MFwiXG4gICAgICAgICAgICAoaXRlbVNlbGVjdGVkKT1cImFzc2lnblRhc2soJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2xlYXJTZWxlY3Rpb24pPVwidW5hc3NpZ25UYXNrKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3ZhbHRpbW8tc2VhcmNoYWJsZS1kcm9wZG93bi1zZWxlY3Q+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZz5cbiAgPGg1PlxuICAgIDxiPnt7ICdhc3NpZ25UYXNrLmZldGNoaW5nVXNlcnMnIHwgdHJhbnNsYXRlIH19PC9iPlxuICA8L2g1PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -1,29 +0,0 @@
1
- /*
2
- * Copyright 2015-2023 Ritense BV, the Netherlands.
3
- *
4
- * Licensed under EUPL, Version 1.2 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" basis,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- export class TaskList {
17
- constructor() {
18
- this.tasks = [];
19
- this.fields = [];
20
- this.pagination = {
21
- collectionSize: 0,
22
- page: 1,
23
- size: 10,
24
- maxPaginationItemSize: 5,
25
- };
26
- this.page = 0;
27
- }
28
- }
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1saXN0Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvbW9kZWxzL3Rhc2stbGlzdC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE1BQU0sT0FBTyxRQUFRO0lBQXJCO1FBQ1MsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNsQixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osZUFBVSxHQUFHO1lBQ1gsY0FBYyxFQUFFLENBQUM7WUFDakIsSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsRUFBRTtZQUNSLHFCQUFxQixFQUFFLENBQUM7U0FDekIsQ0FBQztRQUNGLFNBQUksR0FBRyxDQUFDLENBQUM7SUFDWCxDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyMyBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgY2xhc3MgVGFza0xpc3Qge1xuICBwdWJsaWMgdGFza3MgPSBbXTtcbiAgZmllbGRzID0gW107XG4gIHBhZ2luYXRpb24gPSB7XG4gICAgY29sbGVjdGlvblNpemU6IDAsXG4gICAgcGFnZTogMSxcbiAgICBzaXplOiAxMCxcbiAgICBtYXhQYWdpbmF0aW9uSXRlbVNpemU6IDUsXG4gIH07XG4gIHBhZ2UgPSAwO1xufVxuIl19
@@ -1,260 +0,0 @@
1
- /*
2
- * Copyright 2015-2023 Ritense BV, the Netherlands.
3
- *
4
- * Licensed under EUPL, Version 1.2 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" basis,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import { Component, EventEmitter, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
17
- import { FormioOptionsImpl, } from '@valtimo/components';
18
- import moment from 'moment';
19
- import { map, take } from 'rxjs/operators';
20
- import { BehaviorSubject, distinctUntilChanged, Subscription, tap } from 'rxjs';
21
- import * as i0 from "@angular/core";
22
- import * as i1 from "ngx-toastr";
23
- import * as i2 from "@valtimo/form-link";
24
- import * as i3 from "@angular/router";
25
- import * as i4 from "ngx-logger";
26
- import * as i5 from "../task.service";
27
- import * as i6 from "@valtimo/security";
28
- import * as i7 from "@valtimo/components";
29
- import * as i8 from "@valtimo/document";
30
- import * as i9 from "@ngx-translate/core";
31
- import * as i10 from "@angular/common";
32
- import * as i11 from "../assign-user-to-task/assign-user-to-task.component";
33
- moment.locale(localStorage.getItem('langKey') || '');
34
- export class TaskDetailModalComponent {
35
- constructor(toastr, formLinkService, processLinkService, formFlowService, router, logger, route, taskService, userProviderService, modalService, documentService, translateService) {
36
- this.toastr = toastr;
37
- this.formLinkService = formLinkService;
38
- this.processLinkService = processLinkService;
39
- this.formFlowService = formFlowService;
40
- this.router = router;
41
- this.logger = logger;
42
- this.route = route;
43
- this.taskService = taskService;
44
- this.userProviderService = userProviderService;
45
- this.modalService = modalService;
46
- this.documentService = documentService;
47
- this.translateService = translateService;
48
- this.formSubmit = new EventEmitter();
49
- this.assignmentOfTaskChanged = new EventEmitter();
50
- this.task = null;
51
- this.page = null;
52
- this.errorMessage = null;
53
- this.isAdmin$ = this.userProviderService
54
- .getUserSubject()
55
- .pipe(map(userIdentity => userIdentity?.roles?.includes('ROLE_ADMIN')));
56
- this.taskProcessLinkType$ = new BehaviorSubject(null);
57
- this.processLinkIsForm$ = this.taskProcessLinkType$.pipe(map(type => type === 'form'));
58
- this.processLinkIsFormFlow$ = this.taskProcessLinkType$.pipe(map(type => type === 'form-flow'));
59
- this.formIoFormData$ = new BehaviorSubject(null);
60
- this._subscriptions = new Subscription();
61
- this.formioOptions = new FormioOptionsImpl();
62
- this.formioOptions.disableAlerts = true;
63
- }
64
- ngAfterViewInit() {
65
- this._subscriptions.add(this.modal.modalShowing$
66
- .pipe(distinctUntilChanged(), tap(modalShowing => {
67
- if (!modalShowing) {
68
- if (this.formFlow) {
69
- this.formFlow.saveData();
70
- }
71
- }
72
- }))
73
- .subscribe());
74
- }
75
- ngOnDestroy() {
76
- this._subscriptions.unsubscribe();
77
- }
78
- openTaskDetails(task) {
79
- this.resetTaskProcessLinkType();
80
- this.resetFormDefinition();
81
- this.getTaskProcessLink(task.id);
82
- this.setDocumentDefinitionNameInService(task);
83
- this.task = task;
84
- this.page = {
85
- title: task.name,
86
- subtitle: `${this.translateService.instant('taskDetail.taskCreated')} ${task.created}`,
87
- };
88
- //only load from formlink when process link failed for backwards compatibility
89
- if (!this.taskProcessLinkType$.getValue()) {
90
- this.formLinkService
91
- .getPreFilledFormDefinitionByFormLinkId(task.processDefinitionKey, task.businessKey, task.taskDefinitionKey, task.id // taskInstanceId
92
- )
93
- .subscribe(formDefinition => {
94
- this.formAssociation = formDefinition.formAssociation;
95
- const className = this.formAssociation.formLink.className.split('.');
96
- const linkType = className[className.length - 1];
97
- switch (linkType) {
98
- case 'BpmnElementFormIdLink':
99
- this.setFormDefinitionAndOpenModal(formDefinition);
100
- break;
101
- case 'BpmnElementFormFlowIdLink':
102
- // We can't use the formDefinition here because the form definition is provided per form flow step
103
- // I'm still leaving this in here in case we want to add form flow specific code.
104
- this.modal.show();
105
- break;
106
- case 'BpmnElementUrlLink':
107
- this.openUrlLink(formDefinition);
108
- break;
109
- case 'BpmnElementAngularStateUrlLink':
110
- this.openAngularStateUrlLink(task, formDefinition);
111
- break;
112
- default:
113
- this.logger.fatal('Unsupported class name');
114
- }
115
- }, errors => {
116
- if (errors?.error?.detail) {
117
- this.errorMessage = errors.error.detail;
118
- }
119
- this.modal.show();
120
- });
121
- }
122
- }
123
- gotoFormLinkScreen() {
124
- this.modal.hide();
125
- this.router.navigate(['form-links']);
126
- }
127
- onChange(event) {
128
- if (event.data) {
129
- this.formIoFormData$.next(event.data);
130
- }
131
- }
132
- onSubmit(submission) {
133
- if (submission.data) {
134
- this.formIoFormData$.next(submission.data);
135
- }
136
- if (this.taskProcessLinkType$.getValue() === 'form') {
137
- if (this.processLinkId) {
138
- this.processLinkService
139
- .submitForm(this.processLinkId, submission.data, this.task.businessKey, this.task.id)
140
- .subscribe({
141
- next: (_) => {
142
- this.completeTask();
143
- },
144
- error: errors => {
145
- this.form.showErrors(errors);
146
- },
147
- });
148
- }
149
- else {
150
- this.formLinkService
151
- .onSubmit(this.task.processDefinitionKey, this.formAssociation.formLink.id, submission.data, this.task.businessKey, this.task.id)
152
- .subscribe((_) => {
153
- this.completeTask();
154
- }, errors => {
155
- this.form.showErrors(errors);
156
- });
157
- }
158
- }
159
- }
160
- resetFormDefinition() {
161
- this.formDefinition = null;
162
- }
163
- getTaskProcessLink(taskId) {
164
- this.taskService.getTaskProcessLink(taskId).subscribe({
165
- next: res => {
166
- if (res != null) {
167
- switch (res?.type) {
168
- case 'form':
169
- this.taskProcessLinkType$.next('form');
170
- this.processLinkId = res.processLinkId;
171
- this.setFormDefinitionAndOpenModal(res.properties.prefilledForm);
172
- break;
173
- case 'form-flow':
174
- this.taskProcessLinkType$.next('form-flow');
175
- this.formFlowInstanceId = res.properties.formFlowInstanceId;
176
- break;
177
- }
178
- }
179
- else {
180
- this.getLegacyTaskProcessLink(taskId);
181
- }
182
- },
183
- error: _ => {
184
- this.getLegacyTaskProcessLink(taskId);
185
- },
186
- });
187
- }
188
- completeTask() {
189
- this.toastr.success(`${this.task.name} ${this.translateService.instant('taskDetail.taskCompleted')}`);
190
- this.modal.hide();
191
- this.task = null;
192
- this.formSubmit.emit();
193
- }
194
- getLegacyTaskProcessLink(taskId) {
195
- this.taskService.getTaskProcessLinkV1(taskId).subscribe(resV1 => {
196
- switch (resV1?.type) {
197
- case 'form':
198
- this.taskProcessLinkType$.next('form');
199
- break;
200
- case 'form-flow':
201
- this.taskProcessLinkType$.next('form-flow');
202
- this.formFlowInstanceId = resV1.properties.formFlowInstanceId;
203
- break;
204
- }
205
- });
206
- }
207
- resetTaskProcessLinkType() {
208
- this.taskProcessLinkType$.next(null);
209
- this.processLinkId = null;
210
- this.formAssociation = null;
211
- }
212
- setFormDefinitionAndOpenModal(formDefinition) {
213
- this.taskProcessLinkType$.next('form');
214
- this.formDefinition = formDefinition;
215
- this.modal.show();
216
- }
217
- openUrlLink(formDefinition) {
218
- const url = this.router.serializeUrl(this.router.createUrlTree([formDefinition.formAssociation.formLink.url]));
219
- window.open(url, '_blank');
220
- }
221
- openAngularStateUrlLink(task, formDefinition) {
222
- this.route.params.pipe(take(1)).subscribe(params => {
223
- const taskId = task?.id;
224
- const documentId = params?.documentId;
225
- this.router.navigate([formDefinition.formAssociation.formLink.url], {
226
- state: {
227
- ...(taskId && { taskId }),
228
- ...(documentId && { documentId }),
229
- },
230
- });
231
- });
232
- }
233
- setDocumentDefinitionNameInService(task) {
234
- this.documentService
235
- .getProcessDocumentDefinitionFromProcessInstanceId(task.processInstanceId)
236
- .subscribe(processDocumentDefinition => {
237
- this.modalService.setDocumentDefinitionName(processDocumentDefinition.id.documentDefinitionId.name);
238
- });
239
- }
240
- }
241
- TaskDetailModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TaskDetailModalComponent, deps: [{ token: i1.ToastrService }, { token: i2.FormLinkService }, { token: i2.ProcessLinkService }, { token: i2.FormFlowService }, { token: i3.Router }, { token: i4.NGXLogger }, { token: i3.ActivatedRoute }, { token: i5.TaskService }, { token: i6.UserProviderService }, { token: i7.ValtimoModalService }, { token: i8.DocumentService }, { token: i9.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
242
- TaskDetailModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TaskDetailModalComponent, selector: "valtimo-task-detail-modal", outputs: { formSubmit: "formSubmit", assignmentOfTaskChanged: "assignmentOfTaskChanged" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["form"], descendants: true }, { propertyName: "formFlow", first: true, predicate: ["formFlow"], descendants: true }, { propertyName: "modal", first: true, predicate: ["taskDetailModal"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2023 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<valtimo-modal\n #taskDetailModal\n elementId=\"taskDetailModal\"\n [title]=\"page?.title\"\n [subtitle]=\"page?.subtitle\"\n [templateBelowSubtitle]=\"assignUserToTask\"\n>\n <div body *ngIf=\"formDefinition && (processLinkIsForm$ | async)\">\n <valtimo-form-io\n #form\n [form]=\"formDefinition\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n [options]=\"formioOptions\"\n ></valtimo-form-io>\n </div>\n <div body *ngIf=\"processLinkIsFormFlow$ | async\">\n <valtimo-form-flow\n #formFlow\n [formIoFormData]=\"formIoFormData$\"\n [formFlowInstanceId]=\"formFlowInstanceId\"\n (formFlowComplete)=\"completeTask()\"\n ></valtimo-form-flow>\n </div>\n <div body *ngIf=\"!formDefinition && !formFlowInstanceId && !errorMessage\">\n <div class=\"bg-warning text-black mb-0 p-3 text-center\">\n {{\n (isAdmin$ | async)\n ? ('formManagement.noFormDefinitionFoundAdmin' | translate)\n : ('formManagement.noFormDefinitionFoundUser' | translate)\n }}\n </div>\n </div>\n <div body *ngIf=\"errorMessage\">\n <div class=\"bg-danger text-black mb-0 p-3 text-center\">\n {{ errorMessage }}\n </div>\n </div>\n <div footer>\n <div class=\"mb-0 p-3 text-center\" *ngIf=\"!formDefinition\">\n <button\n class=\"btn btn-secondary btn-space\"\n type=\"button\"\n (click)=\"gotoFormLinkScreen()\"\n id=\"form-link-button\"\n >\n {{ 'formManagement.gotoFormLinksButton' | translate }}\n </button>\n </div>\n </div>\n</valtimo-modal>\n\n<ng-template #assignUserToTask>\n <valtimo-assign-user-to-task\n *ngIf=\"task && assignmentOfTaskChanged\"\n [taskId]=\"task.id\"\n [assigneeEmail]=\"task.assignee\"\n (assignmentOfTaskChanged)=\"assignmentOfTaskChanged.emit()\"\n ></valtimo-assign-user-to-task>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2023 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */#taskDetailModal .formio-component-submit{text-align:right}\n"], dependencies: [{ kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.FormioComponent, selector: "valtimo-form-io", inputs: ["form", "options", "submission", "readOnly", "formRefresh$"], outputs: ["submit", "change"] }, { kind: "component", type: i7.ModalComponent, selector: "valtimo-modal", inputs: ["elementId", "title", "subtitle", "templateBelowSubtitle", "showFooter"] }, { kind: "component", type: i2.FormFlowComponent, selector: "valtimo-form-flow", inputs: ["formIoFormData", "formFlowInstanceId"], outputs: ["formFlowComplete"] }, { kind: "component", type: i11.AssignUserToTaskComponent, selector: "valtimo-assign-user-to-task", inputs: ["taskId", "assigneeEmail"], outputs: ["assignmentOfTaskChanged"] }, { kind: "pipe", type: i10.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None });
243
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TaskDetailModalComponent, decorators: [{
244
- type: Component,
245
- args: [{ selector: 'valtimo-task-detail-modal', encapsulation: ViewEncapsulation.None, template: "<!--\n ~ Copyright 2015-2023 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<valtimo-modal\n #taskDetailModal\n elementId=\"taskDetailModal\"\n [title]=\"page?.title\"\n [subtitle]=\"page?.subtitle\"\n [templateBelowSubtitle]=\"assignUserToTask\"\n>\n <div body *ngIf=\"formDefinition && (processLinkIsForm$ | async)\">\n <valtimo-form-io\n #form\n [form]=\"formDefinition\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n [options]=\"formioOptions\"\n ></valtimo-form-io>\n </div>\n <div body *ngIf=\"processLinkIsFormFlow$ | async\">\n <valtimo-form-flow\n #formFlow\n [formIoFormData]=\"formIoFormData$\"\n [formFlowInstanceId]=\"formFlowInstanceId\"\n (formFlowComplete)=\"completeTask()\"\n ></valtimo-form-flow>\n </div>\n <div body *ngIf=\"!formDefinition && !formFlowInstanceId && !errorMessage\">\n <div class=\"bg-warning text-black mb-0 p-3 text-center\">\n {{\n (isAdmin$ | async)\n ? ('formManagement.noFormDefinitionFoundAdmin' | translate)\n : ('formManagement.noFormDefinitionFoundUser' | translate)\n }}\n </div>\n </div>\n <div body *ngIf=\"errorMessage\">\n <div class=\"bg-danger text-black mb-0 p-3 text-center\">\n {{ errorMessage }}\n </div>\n </div>\n <div footer>\n <div class=\"mb-0 p-3 text-center\" *ngIf=\"!formDefinition\">\n <button\n class=\"btn btn-secondary btn-space\"\n type=\"button\"\n (click)=\"gotoFormLinkScreen()\"\n id=\"form-link-button\"\n >\n {{ 'formManagement.gotoFormLinksButton' | translate }}\n </button>\n </div>\n </div>\n</valtimo-modal>\n\n<ng-template #assignUserToTask>\n <valtimo-assign-user-to-task\n *ngIf=\"task && assignmentOfTaskChanged\"\n [taskId]=\"task.id\"\n [assigneeEmail]=\"task.assignee\"\n (assignmentOfTaskChanged)=\"assignmentOfTaskChanged.emit()\"\n ></valtimo-assign-user-to-task>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2023 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */#taskDetailModal .formio-component-submit{text-align:right}\n"] }]
246
- }], ctorParameters: function () { return [{ type: i1.ToastrService }, { type: i2.FormLinkService }, { type: i2.ProcessLinkService }, { type: i2.FormFlowService }, { type: i3.Router }, { type: i4.NGXLogger }, { type: i3.ActivatedRoute }, { type: i5.TaskService }, { type: i6.UserProviderService }, { type: i7.ValtimoModalService }, { type: i8.DocumentService }, { type: i9.TranslateService }]; }, propDecorators: { form: [{
247
- type: ViewChild,
248
- args: ['form']
249
- }], formFlow: [{
250
- type: ViewChild,
251
- args: ['formFlow']
252
- }], modal: [{
253
- type: ViewChild,
254
- args: ['taskDetailModal']
255
- }], formSubmit: [{
256
- type: Output
257
- }], assignmentOfTaskChanged: [{
258
- type: Output
259
- }] } });
260
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvdGFzay1kZXRhaWwtbW9kYWwvdGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvdGFzay1kZXRhaWwtbW9kYWwvdGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFFWixNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBRUwsaUJBQWlCLEdBS2xCLE1BQU0scUJBQXFCLENBQUM7QUFXN0IsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRzVCLE9BQU8sRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFekMsT0FBTyxFQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBYyxZQUFZLEVBQUUsR0FBRyxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7O0FBSzFGLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQVFyRCxNQUFNLE9BQU8sd0JBQXdCO0lBd0JuQyxZQUNtQixNQUFxQixFQUNyQixlQUFnQyxFQUNoQyxrQkFBc0MsRUFDdEMsZUFBZ0MsRUFDaEMsTUFBYyxFQUNkLE1BQWlCLEVBQ2pCLEtBQXFCLEVBQ3JCLFdBQXdCLEVBQ3hCLG1CQUF3QyxFQUN4QyxZQUFpQyxFQUNqQyxlQUFnQyxFQUNoQyxnQkFBa0M7UUFYbEMsV0FBTSxHQUFOLE1BQU0sQ0FB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QUFjLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbEUsS0FBSyxFQUFFO29CQUNMLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBQyxNQUFNLEVBQUMsQ0FBQztvQkFDdkIsR0FBRyxDQUFDLFVBQVUsSUFBSSxFQUFDLFVBQVUsRUFBQyxDQUFDO2lCQUNoQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGtDQUFrQyxDQUFDLElBQVU7UUFDbkQsSUFBSSxDQUFDLGVBQWU7YUFDakIsaURBQWlELENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2FBQ3pFLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMseUJBQXlCLENBQ3pDLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQ3ZELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7O3FIQXZRVSx3QkFBd0I7eUdBQXhCLHdCQUF3Qiw0YUM5RHJDLHlnRkE0RUE7MkZEZGEsd0JBQXdCO2tCQU5wQyxTQUFTOytCQUNFLDJCQUEyQixpQkFHdEIsaUJBQWlCLENBQUMsSUFBSTtzYUFHbEIsSUFBSTtzQkFBdEIsU0FBUzt1QkFBQyxNQUFNO2dCQUNNLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVTtnQkFDUyxLQUFLO3NCQUFsQyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFDbEIsVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyx1QkFBdUI7c0JBQWhDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyMyBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgRm9ybWlvQ29tcG9uZW50LFxuICBGb3JtaW9PcHRpb25zSW1wbCxcbiAgRm9ybWlvU3VibWlzc2lvbixcbiAgTW9kYWxDb21wb25lbnQsXG4gIFZhbHRpbW9Gb3JtaW9PcHRpb25zLFxuICBWYWx0aW1vTW9kYWxTZXJ2aWNlLFxufSBmcm9tICdAdmFsdGltby9jb21wb25lbnRzJztcbmltcG9ydCB7VGFzaywgVGFza1Byb2Nlc3NMaW5rVHlwZX0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG4gIEZvcm1Bc3NvY2lhdGlvbixcbiAgRm9ybUZsb3dDb21wb25lbnQsXG4gIEZvcm1GbG93U2VydmljZSxcbiAgRm9ybUxpbmtTZXJ2aWNlLFxuICBGb3JtU3VibWlzc2lvblJlc3VsdCxcbiAgUHJvY2Vzc0xpbmtTZXJ2aWNlLFxufSBmcm9tICdAdmFsdGltby9mb3JtLWxpbmsnO1xuaW1wb3J0IHtGb3JtaW9Gb3JtfSBmcm9tICdAZm9ybWlvL2FuZ3VsYXInO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtOR1hMb2dnZXJ9IGZyb20gJ25neC1sb2dnZXInO1xuaW1wb3J0IHtUb2FzdHJTZXJ2aWNlfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7bWFwLCB0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1Rhc2tTZXJ2aWNlfSBmcm9tICcuLi90YXNrLnNlcnZpY2UnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIHRhcH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1VzZXJQcm92aWRlclNlcnZpY2V9IGZyb20gJ0B2YWx0aW1vL3NlY3VyaXR5JztcbmltcG9ydCB7RG9jdW1lbnRTZXJ2aWNlfSBmcm9tICdAdmFsdGltby9kb2N1bWVudCc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5tb21lbnQubG9jYWxlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsYW5nS2V5JykgfHwgJycpO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLXRhc2stZGV0YWlsLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rhc2stZGV0YWlsLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgVGFza0RldGFpbE1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgnZm9ybScpIGZvcm06IEZvcm1pb0NvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgnZm9ybUZsb3cnKSBmb3JtRmxvdzogRm9ybUZsb3dDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3Rhc2tEZXRhaWxNb2RhbCcpIG1vZGFsOiBNb2RhbENvbXBvbmVudDtcbiAgQE91dHB1dCgpIGZvcm1TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBhc3NpZ25tZW50T2ZUYXNrQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgdGFzazogVGFzayB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgZm9ybURlZmluaXRpb246IEZvcm1pb0Zvcm07XG4gIHB1YmxpYyBmb3JtRmxvd0luc3RhbmNlSWQ6IHN0cmluZztcbiAgcHVibGljIHBhZ2U6IGFueSA9IG51bGw7XG4gIHB1YmxpYyBmb3JtaW9PcHRpb25zOiBWYWx0aW1vRm9ybWlvT3B0aW9ucztcbiAgcHVibGljIGVycm9yTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcbiAgcmVhZG9ubHkgaXNBZG1pbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnVzZXJQcm92aWRlclNlcnZpY2VcbiAgICAuZ2V0VXNlclN1YmplY3QoKVxuICAgIC5waXBlKG1hcCh1c2VySWRlbnRpdHkgPT4gdXNlcklkZW50aXR5Py5yb2xlcz8uaW5jbHVkZXMoJ1JPTEVfQURNSU4nKSkpO1xuICBwcml2YXRlIGZvcm1Bc3NvY2lhdGlvbjogRm9ybUFzc29jaWF0aW9uO1xuICBwcml2YXRlIHByb2Nlc3NMaW5rSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSB0YXNrUHJvY2Vzc0xpbmtUeXBlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFza1Byb2Nlc3NMaW5rVHlwZSB8IG51bGw+KG51bGwpO1xuICBwcm9jZXNzTGlua0lzRm9ybSQgPSB0aGlzLnRhc2tQcm9jZXNzTGlua1R5cGUkLnBpcGUobWFwKHR5cGUgPT4gdHlwZSA9PT0gJ2Zvcm0nKSk7XG4gIHByb2Nlc3NMaW5rSXNGb3JtRmxvdyQgPSB0aGlzLnRhc2tQcm9jZXNzTGlua1R5cGUkLnBpcGUobWFwKHR5cGUgPT4gdHlwZSA9PT0gJ2Zvcm0tZmxvdycpKTtcbiAgZm9ybUlvRm9ybURhdGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZm9ybUxpbmtTZXJ2aWNlOiBGb3JtTGlua1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9jZXNzTGlua1NlcnZpY2U6IFByb2Nlc3NMaW5rU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZvcm1GbG93U2VydmljZTogRm9ybUZsb3dTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IE5HWExvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhc2tTZXJ2aWNlOiBUYXNrU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVzZXJQcm92aWRlclNlcnZpY2U6IFVzZXJQcm92aWRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBtb2RhbFNlcnZpY2U6IFZhbHRpbW9Nb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudFNlcnZpY2U6IERvY3VtZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5mb3JtaW9PcHRpb25zID0gbmV3IEZvcm1pb09wdGlvbnNJbXBsKCk7XG4gICAgdGhpcy5mb3JtaW9PcHRpb25zLmRpc2FibGVBbGVydHMgPSB0cnVlO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5tb2RhbC5tb2RhbFNob3dpbmckXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgdGFwKG1vZGFsU2hvd2luZyA9PiB7XG4gICAgICAgICAgICBpZiAoIW1vZGFsU2hvd2luZykge1xuICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtRmxvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUZsb3cuc2F2ZURhdGEoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG9wZW5UYXNrRGV0YWlscyh0YXNrOiBUYXNrKSB7XG4gICAgdGhpcy5yZXNldFRhc2tQcm9jZXNzTGlua1R5cGUoKTtcbiAgICB0aGlzLnJlc2V0Rm9ybURlZmluaXRpb24oKTtcbiAgICB0aGlzLmdldFRhc2tQcm9jZXNzTGluayh0YXNrLmlkKTtcbiAgICB0aGlzLnNldERvY3VtZW50RGVmaW5pdGlvbk5hbWVJblNlcnZpY2UodGFzayk7XG5cbiAgICB0aGlzLnRhc2sgPSB0YXNrO1xuICAgIHRoaXMucGFnZSA9IHtcbiAgICAgIHRpdGxlOiB0YXNrLm5hbWUsXG4gICAgICBzdWJ0aXRsZTogYCR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3Rhc2tEZXRhaWwudGFza0NyZWF0ZWQnKX0gJHt0YXNrLmNyZWF0ZWR9YCxcbiAgICB9O1xuXG4gICAgLy9vbmx5IGxvYWQgZnJvbSBmb3JtbGluayB3aGVuIHByb2Nlc3MgbGluayBmYWlsZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgaWYgKCF0aGlzLnRhc2tQcm9jZXNzTGlua1R5cGUkLmdldFZhbHVlKCkpIHtcbiAgICAgIHRoaXMuZm9ybUxpbmtTZXJ2aWNlXG4gICAgICAgIC5nZXRQcmVGaWxsZWRGb3JtRGVmaW5pdGlvbkJ5Rm9ybUxpbmtJZChcbiAgICAgICAgICB0YXNrLnByb2Nlc3NEZWZpbml0aW9uS2V5LFxuICAgICAgICAgIHRhc2suYnVzaW5lc3NLZXksXG4gICAgICAgICAgdGFzay50YXNrRGVmaW5pdGlvbktleSxcbiAgICAgICAgICB0YXNrLmlkIC8vIHRhc2tJbnN0YW5jZUlkXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICBmb3JtRGVmaW5pdGlvbiA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Bc3NvY2lhdGlvbiA9IGZvcm1EZWZpbml0aW9uLmZvcm1Bc3NvY2lhdGlvbjtcblxuICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5mb3JtQXNzb2NpYXRpb24uZm9ybUxpbmsuY2xhc3NOYW1lLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBjb25zdCBsaW5rVHlwZSA9IGNsYXNzTmFtZVtjbGFzc05hbWUubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgICAgIHN3aXRjaCAobGlua1R5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAnQnBtbkVsZW1lbnRGb3JtSWRMaW5rJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvcm1EZWZpbml0aW9uQW5kT3Blbk1vZGFsKGZvcm1EZWZpbml0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnQnBtbkVsZW1lbnRGb3JtRmxvd0lkTGluayc6XG4gICAgICAgICAgICAgICAgLy8gV2UgY2FuJ3QgdXNlIHRoZSBmb3JtRGVmaW5pdGlvbiBoZXJlIGJlY2F1c2UgdGhlIGZvcm0gZGVmaW5pdGlvbiBpcyBwcm92aWRlZCBwZXIgZm9ybSBmbG93IHN0ZXBcbiAgICAgICAgICAgICAgICAvLyBJJ20gc3RpbGwgbGVhdmluZyB0aGlzIGluIGhlcmUgaW4gY2FzZSB3ZSB3YW50IHRvIGFkZCBmb3JtIGZsb3cgc3BlY2lmaWMgY29kZS5cbiAgICAgICAgICAgICAgICB0aGlzLm1vZGFsLnNob3coKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnQnBtbkVsZW1lbnRVcmxMaW5rJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5VcmxMaW5rKGZvcm1EZWZpbml0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnQnBtbkVsZW1lbnRBbmd1bGFyU3RhdGVVcmxMaW5rJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5Bbmd1bGFyU3RhdGVVcmxMaW5rKHRhc2ssIGZvcm1EZWZpbml0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5mYXRhbCgnVW5zdXBwb3J0ZWQgY2xhc3MgbmFtZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3JzID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcnM/LmVycm9yPy5kZXRhaWwpIHtcbiAgICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvcnMuZXJyb3IuZGV0YWlsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm1vZGFsLnNob3coKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdvdG9Gb3JtTGlua1NjcmVlbigpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGFsLmhpZGUoKTtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2Zvcm0tbGlua3MnXSk7XG4gIH1cblxuICBwdWJsaWMgb25DaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmIChldmVudC5kYXRhKSB7XG4gICAgICB0aGlzLmZvcm1Jb0Zvcm1EYXRhJC5uZXh0KGV2ZW50LmRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblN1Ym1pdChzdWJtaXNzaW9uOiBGb3JtaW9TdWJtaXNzaW9uKTogdm9pZCB7XG4gICAgaWYgKHN1Ym1pc3Npb24uZGF0YSkge1xuICAgICAgdGhpcy5mb3JtSW9Gb3JtRGF0YSQubmV4dChzdWJtaXNzaW9uLmRhdGEpO1xuICAgIH1cbiAgICBpZiAodGhpcy50YXNrUHJvY2Vzc0xpbmtUeXBlJC5nZXRWYWx1ZSgpID09PSAnZm9ybScpIHtcbiAgICAgIGlmICh0aGlzLnByb2Nlc3NMaW5rSWQpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGlua1NlcnZpY2VcbiAgICAgICAgICAuc3VibWl0Rm9ybSh0aGlzLnByb2Nlc3NMaW5rSWQsIHN1Ym1pc3Npb24uZGF0YSwgdGhpcy50YXNrLmJ1c2luZXNzS2V5LCB0aGlzLnRhc2suaWQpXG4gICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAoXzogRm9ybVN1Ym1pc3Npb25SZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZVRhc2soKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZXJyb3JzID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5mb3JtLnNob3dFcnJvcnMoZXJyb3JzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvcm1MaW5rU2VydmljZVxuICAgICAgICAgIC5vblN1Ym1pdChcbiAgICAgICAgICAgIHRoaXMudGFzay5wcm9jZXNzRGVmaW5pdGlvbktleSxcbiAgICAgICAgICAgIHRoaXMuZm9ybUFzc29jaWF0aW9uLmZvcm1MaW5rLmlkLFxuICAgICAgICAgICAgc3VibWlzc2lvbi5kYXRhLFxuICAgICAgICAgICAgdGhpcy50YXNrLmJ1c2luZXNzS2V5LFxuICAgICAgICAgICAgdGhpcy50YXNrLmlkXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAoXzogRm9ybVN1Ym1pc3Npb25SZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZVRhc2soKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcnMgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmZvcm0uc2hvd0Vycm9ycyhlcnJvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEZvcm1EZWZpbml0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybURlZmluaXRpb24gPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYXNrUHJvY2Vzc0xpbmsodGFza0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRhc2tTZXJ2aWNlLmdldFRhc2tQcm9jZXNzTGluayh0YXNrSWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICBpZiAocmVzICE9IG51bGwpIHtcbiAgICAgICAgICBzd2l0Y2ggKHJlcz8udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICAgICAgICAgIHRoaXMudGFza1Byb2Nlc3NMaW5rVHlwZSQubmV4dCgnZm9ybScpO1xuICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NMaW5rSWQgPSByZXMucHJvY2Vzc0xpbmtJZDtcbiAgICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGVmaW5pdGlvbkFuZE9wZW5Nb2RhbChyZXMucHJvcGVydGllcy5wcmVmaWxsZWRGb3JtKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmb3JtLWZsb3cnOlxuICAgICAgICAgICAgICB0aGlzLnRhc2tQcm9jZXNzTGlua1R5cGUkLm5leHQoJ2Zvcm0tZmxvdycpO1xuICAgICAgICAgICAgICB0aGlzLmZvcm1GbG93SW5zdGFuY2VJZCA9IHJlcy5wcm9wZXJ0aWVzLmZvcm1GbG93SW5zdGFuY2VJZDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZ2V0TGVnYWN5VGFza1Byb2Nlc3NMaW5rKHRhc2tJZCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogXyA9PiB7XG4gICAgICAgIHRoaXMuZ2V0TGVnYWN5VGFza1Byb2Nlc3NMaW5rKHRhc2tJZCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgY29tcGxldGVUYXNrKCkge1xuICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoXG4gICAgICBgJHt0aGlzLnRhc2submFtZX0gJHt0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgndGFza0RldGFpbC50YXNrQ29tcGxldGVkJyl9YFxuICAgICk7XG4gICAgdGhpcy5tb2RhbC5oaWRlKCk7XG4gICAgdGhpcy50YXNrID0gbnVsbDtcbiAgICB0aGlzLmZvcm1TdWJtaXQuZW1pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMZWdhY3lUYXNrUHJvY2Vzc0xpbmsodGFza0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRhc2tTZXJ2aWNlLmdldFRhc2tQcm9jZXNzTGlua1YxKHRhc2tJZCkuc3Vic2NyaWJlKHJlc1YxID0+IHtcbiAgICAgIHN3aXRjaCAocmVzVjE/LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICAgICAgdGhpcy50YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KCdmb3JtJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Zvcm0tZmxvdyc6XG4gICAgICAgICAgdGhpcy50YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KCdmb3JtLWZsb3cnKTtcbiAgICAgICAgICB0aGlzLmZvcm1GbG93SW5zdGFuY2VJZCA9IHJlc1YxLnByb3BlcnRpZXMuZm9ybUZsb3dJbnN0YW5jZUlkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFRhc2tQcm9jZXNzTGlua1R5cGUoKTogdm9pZCB7XG4gICAgdGhpcy50YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KG51bGwpO1xuICAgIHRoaXMucHJvY2Vzc0xpbmtJZCA9IG51bGw7XG4gICAgdGhpcy5mb3JtQXNzb2NpYXRpb24gPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRGb3JtRGVmaW5pdGlvbkFuZE9wZW5Nb2RhbChmb3JtRGVmaW5pdGlvbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy50YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KCdmb3JtJyk7XG4gICAgdGhpcy5mb3JtRGVmaW5pdGlvbiA9IGZvcm1EZWZpbml0aW9uO1xuICAgIHRoaXMubW9kYWwuc2hvdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuVXJsTGluayhmb3JtRGVmaW5pdGlvbjogYW55KTogdm9pZCB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5yb3V0ZXIuc2VyaWFsaXplVXJsKFxuICAgICAgdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbZm9ybURlZmluaXRpb24uZm9ybUFzc29jaWF0aW9uLmZvcm1MaW5rLnVybF0pXG4gICAgKTtcblxuICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuQW5ndWxhclN0YXRlVXJsTGluayh0YXNrOiBUYXNrLCBmb3JtRGVmaW5pdGlvbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgIGNvbnN0IHRhc2tJZCA9IHRhc2s/LmlkO1xuICAgICAgY29uc3QgZG9jdW1lbnRJZCA9IHBhcmFtcz8uZG9jdW1lbnRJZDtcblxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Zvcm1EZWZpbml0aW9uLmZvcm1Bc3NvY2lhdGlvbi5mb3JtTGluay51cmxdLCB7XG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgLi4uKHRhc2tJZCAmJiB7dGFza0lkfSksXG4gICAgICAgICAgLi4uKGRvY3VtZW50SWQgJiYge2RvY3VtZW50SWR9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREb2N1bWVudERlZmluaXRpb25OYW1lSW5TZXJ2aWNlKHRhc2s6IFRhc2spOiB2b2lkIHtcbiAgICB0aGlzLmRvY3VtZW50U2VydmljZVxuICAgICAgLmdldFByb2Nlc3NEb2N1bWVudERlZmluaXRpb25Gcm9tUHJvY2Vzc0luc3RhbmNlSWQodGFzay5wcm9jZXNzSW5zdGFuY2VJZClcbiAgICAgIC5zdWJzY3JpYmUocHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbiA9PiB7XG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLnNldERvY3VtZW50RGVmaW5pdGlvbk5hbWUoXG4gICAgICAgICAgcHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbi5pZC5kb2N1bWVudERlZmluaXRpb25JZC5uYW1lXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgfVxufVxuIiwiPCEtLVxuICB+IENvcHlyaWdodCAyMDE1LTIwMjMgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICB+XG4gIH4gTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICB+XG4gIH4gaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICB+XG4gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gIC0tPlxuXG48dmFsdGltby1tb2RhbFxuICAjdGFza0RldGFpbE1vZGFsXG4gIGVsZW1lbnRJZD1cInRhc2tEZXRhaWxNb2RhbFwiXG4gIFt0aXRsZV09XCJwYWdlPy50aXRsZVwiXG4gIFtzdWJ0aXRsZV09XCJwYWdlPy5zdWJ0aXRsZVwiXG4gIFt0ZW1wbGF0ZUJlbG93U3VidGl0bGVdPVwiYXNzaWduVXNlclRvVGFza1wiXG4+XG4gIDxkaXYgYm9keSAqbmdJZj1cImZvcm1EZWZpbml0aW9uICYmIChwcm9jZXNzTGlua0lzRm9ybSQgfCBhc3luYylcIj5cbiAgICA8dmFsdGltby1mb3JtLWlvXG4gICAgICAjZm9ybVxuICAgICAgW2Zvcm1dPVwiZm9ybURlZmluaXRpb25cIlxuICAgICAgKHN1Ym1pdCk9XCJvblN1Ym1pdCgkZXZlbnQpXCJcbiAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICBbb3B0aW9uc109XCJmb3JtaW9PcHRpb25zXCJcbiAgICA+PC92YWx0aW1vLWZvcm0taW8+XG4gIDwvZGl2PlxuICA8ZGl2IGJvZHkgKm5nSWY9XCJwcm9jZXNzTGlua0lzRm9ybUZsb3ckIHwgYXN5bmNcIj5cbiAgICA8dmFsdGltby1mb3JtLWZsb3dcbiAgICAgICNmb3JtRmxvd1xuICAgICAgW2Zvcm1Jb0Zvcm1EYXRhXT1cImZvcm1Jb0Zvcm1EYXRhJFwiXG4gICAgICBbZm9ybUZsb3dJbnN0YW5jZUlkXT1cImZvcm1GbG93SW5zdGFuY2VJZFwiXG4gICAgICAoZm9ybUZsb3dDb21wbGV0ZSk9XCJjb21wbGV0ZVRhc2soKVwiXG4gICAgPjwvdmFsdGltby1mb3JtLWZsb3c+XG4gIDwvZGl2PlxuICA8ZGl2IGJvZHkgKm5nSWY9XCIhZm9ybURlZmluaXRpb24gJiYgIWZvcm1GbG93SW5zdGFuY2VJZCAmJiAhZXJyb3JNZXNzYWdlXCI+XG4gICAgPGRpdiBjbGFzcz1cImJnLXdhcm5pbmcgdGV4dC1ibGFjayBtYi0wIHAtMyB0ZXh0LWNlbnRlclwiPlxuICAgICAge3tcbiAgICAgICAgKGlzQWRtaW4kIHwgYXN5bmMpXG4gICAgICAgICAgPyAoJ2Zvcm1NYW5hZ2VtZW50Lm5vRm9ybURlZmluaXRpb25Gb3VuZEFkbWluJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICA6ICgnZm9ybU1hbmFnZW1lbnQubm9Gb3JtRGVmaW5pdGlvbkZvdW5kVXNlcicgfCB0cmFuc2xhdGUpXG4gICAgICB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBib2R5ICpuZ0lmPVwiZXJyb3JNZXNzYWdlXCI+XG4gICAgPGRpdiBjbGFzcz1cImJnLWRhbmdlciB0ZXh0LWJsYWNrIG1iLTAgcC0zIHRleHQtY2VudGVyXCI+XG4gICAgICB7eyBlcnJvck1lc3NhZ2UgfX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgZm9vdGVyPlxuICAgIDxkaXYgY2xhc3M9XCJtYi0wIHAtMyB0ZXh0LWNlbnRlclwiICpuZ0lmPVwiIWZvcm1EZWZpbml0aW9uXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNwYWNlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJnb3RvRm9ybUxpbmtTY3JlZW4oKVwiXG4gICAgICAgIGlkPVwiZm9ybS1saW5rLWJ1dHRvblwiXG4gICAgICA+XG4gICAgICAgIHt7ICdmb3JtTWFuYWdlbWVudC5nb3RvRm9ybUxpbmtzQnV0dG9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC92YWx0aW1vLW1vZGFsPlxuXG48bmctdGVtcGxhdGUgI2Fzc2lnblVzZXJUb1Rhc2s+XG4gIDx2YWx0aW1vLWFzc2lnbi11c2VyLXRvLXRhc2tcbiAgICAqbmdJZj1cInRhc2sgJiYgYXNzaWdubWVudE9mVGFza0NoYW5nZWRcIlxuICAgIFt0YXNrSWRdPVwidGFzay5pZFwiXG4gICAgW2Fzc2lnbmVlRW1haWxdPVwidGFzay5hc3NpZ25lZVwiXG4gICAgKGFzc2lnbm1lbnRPZlRhc2tDaGFuZ2VkKT1cImFzc2lnbm1lbnRPZlRhc2tDaGFuZ2VkLmVtaXQoKVwiXG4gID48L3ZhbHRpbW8tYXNzaWduLXVzZXItdG8tdGFzaz5cbjwvbmctdGVtcGxhdGU+XG4iXX0=