@valtimo/task 12.2.1 → 12.4.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 (31) hide show
  1. package/esm2022/lib/components/assign-user-to-task/assign-user-to-task.component.mjs +8 -5
  2. package/esm2022/lib/components/task-detail-content/task-detail-content.component.mjs +317 -0
  3. package/esm2022/lib/components/task-detail-intermediate-save/task-detail-intermediate-save.component.mjs +144 -0
  4. package/esm2022/lib/components/task-detail-modal/task-detail-modal.component.mjs +53 -272
  5. package/esm2022/lib/components/task-list/task-list.component.mjs +5 -5
  6. package/esm2022/lib/models/task.model.mjs +1 -1
  7. package/esm2022/lib/services/index.mjs +2 -1
  8. package/esm2022/lib/services/task-intermediate-save.service.mjs +18 -3
  9. package/esm2022/lib/task.module.mjs +17 -6
  10. package/esm2022/public_api.mjs +9 -6
  11. package/fesm2022/valtimo-task.mjs +637 -405
  12. package/fesm2022/valtimo-task.mjs.map +1 -1
  13. package/lib/components/assign-user-to-task/assign-user-to-task.component.d.ts +1 -1
  14. package/lib/components/assign-user-to-task/assign-user-to-task.component.d.ts.map +1 -1
  15. package/lib/components/task-detail-content/task-detail-content.component.d.ts +79 -0
  16. package/lib/components/task-detail-content/task-detail-content.component.d.ts.map +1 -0
  17. package/lib/components/task-detail-intermediate-save/task-detail-intermediate-save.component.d.ts +41 -0
  18. package/lib/components/task-detail-intermediate-save/task-detail-intermediate-save.component.d.ts.map +1 -0
  19. package/lib/components/task-detail-modal/task-detail-modal.component.d.ts +22 -65
  20. package/lib/components/task-detail-modal/task-detail-modal.component.d.ts.map +1 -1
  21. package/lib/models/task.model.d.ts +5 -1
  22. package/lib/models/task.model.d.ts.map +1 -1
  23. package/lib/services/index.d.ts +1 -0
  24. package/lib/services/index.d.ts.map +1 -1
  25. package/lib/services/task-intermediate-save.service.d.ts +7 -1
  26. package/lib/services/task-intermediate-save.service.d.ts.map +1 -1
  27. package/lib/task.module.d.ts +14 -12
  28. package/lib/task.module.d.ts.map +1 -1
  29. package/package.json +1 -1
  30. package/public_api.d.ts +8 -5
  31. package/public_api.d.ts.map +1 -1
@@ -0,0 +1,144 @@
1
+ /*
2
+ * Copyright 2015-2024 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 { CommonModule } from '@angular/common';
17
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, signal, } from '@angular/core';
18
+ import { RecentlyViewed16 } from '@carbon/icons';
19
+ import { TranslateModule } from '@ngx-translate/core';
20
+ import { ConfirmationModalModule, TooltipModule } from '@valtimo/components';
21
+ import { ButtonModule, IconModule, ModalModule } from 'carbon-components-angular';
22
+ import moment from 'moment';
23
+ import { BehaviorSubject, combineLatest, switchMap, take } from 'rxjs';
24
+ import * as i0 from "@angular/core";
25
+ import * as i1 from "@valtimo/config";
26
+ import * as i2 from "carbon-components-angular";
27
+ import * as i3 from "@ngx-translate/core";
28
+ import * as i4 from "../../services";
29
+ import * as i5 from "ngx-toastr";
30
+ import * as i6 from "@angular/common";
31
+ import * as i7 from "@valtimo/components";
32
+ export class TaskDetailIntermediateSaveComponent {
33
+ set task(value) {
34
+ if (!value)
35
+ return;
36
+ this.taskService
37
+ .getTaskProcessLink(value.id)
38
+ .pipe(take(1))
39
+ .subscribe(res => {
40
+ if (res !== null && res.type === 'form-flow')
41
+ this.formFlowInstanceId$.next(res.properties.formFlowInstanceId);
42
+ });
43
+ this.taskValue.set(value);
44
+ this.page.set({
45
+ title: value.name,
46
+ subtitle: `${this.translateService.instant('taskDetail.taskCreated')} ${value.created}`,
47
+ });
48
+ this.getCurrentProgress(value);
49
+ }
50
+ constructor(configService, iconService, translateService, taskIntermediateSaveService, taskService, toastr) {
51
+ this.configService = configService;
52
+ this.iconService = iconService;
53
+ this.translateService = translateService;
54
+ this.taskIntermediateSaveService = taskIntermediateSaveService;
55
+ this.taskService = taskService;
56
+ this.toastr = toastr;
57
+ this.currentIntermediateSaveEvent = new EventEmitter();
58
+ this.showModalEvent = new EventEmitter();
59
+ this.formFlowInstanceId$ = new BehaviorSubject(undefined);
60
+ this.showConfirmationModal$ = new BehaviorSubject(false);
61
+ this.taskValue = signal(null);
62
+ this.page = signal(null);
63
+ this.canAssignUserToTask = signal(false);
64
+ this.submission$ = this.taskIntermediateSaveService.submission$;
65
+ this.formIoFormData$ = this.taskIntermediateSaveService.formIoFormData$;
66
+ this.intermediateSaveEnabled = false;
67
+ this.currentIntermediateSave = null;
68
+ this.intermediateSaveEnabled = !!this.configService.featureToggles?.enableIntermediateSave;
69
+ this.iconService.registerAll([RecentlyViewed16]);
70
+ }
71
+ saveCurrentProgress() {
72
+ combineLatest([this.submission$, this.formIoFormData$])
73
+ .pipe(switchMap(([submission, formIoFormData]) => {
74
+ const intermediateSaveRequest = {
75
+ submission: submission?.data ? submission.data : formIoFormData,
76
+ taskInstanceId: this.taskValue()?.id ?? '',
77
+ };
78
+ return this.taskIntermediateSaveService.storeIntermediateSubmission(intermediateSaveRequest);
79
+ }), take(1))
80
+ .subscribe({
81
+ next: intermediateSubmission => {
82
+ this.toastr.success(this.translateService.instant('formManagement.intermediateSave.success'));
83
+ this.currentIntermediateSave = this.formatIntermediateSubmission(intermediateSubmission);
84
+ this.currentIntermediateSaveEvent.emit(this.currentIntermediateSave);
85
+ },
86
+ error: () => {
87
+ this.toastr.error(this.translateService.instant('formManagement.intermediateSave.error'));
88
+ },
89
+ });
90
+ }
91
+ revertSaveClick() {
92
+ if (this.showModalEvent.observed) {
93
+ this.showModalEvent.emit();
94
+ return;
95
+ }
96
+ this.showConfirmationModal$.next(true);
97
+ }
98
+ clearCurrentProgress() {
99
+ this.taskIntermediateSaveService
100
+ .clearIntermediateSubmission(this.taskValue()?.id ?? '')
101
+ .pipe(take(1))
102
+ .subscribe(() => {
103
+ this.taskIntermediateSaveService.setSubmission({ data: {} });
104
+ this.currentIntermediateSave = null;
105
+ this.currentIntermediateSaveEvent.emit(this.currentIntermediateSave);
106
+ });
107
+ }
108
+ formatIntermediateSubmission(intermediateSubmission) {
109
+ intermediateSubmission.createdOn = moment(intermediateSubmission.createdOn).format('DD MMM YYYY HH:mm');
110
+ if (intermediateSubmission.editedOn) {
111
+ intermediateSubmission.editedOn = moment(new Date(intermediateSubmission.editedOn)).format('DD MMM YYYY HH:mm');
112
+ }
113
+ return intermediateSubmission;
114
+ }
115
+ getCurrentProgress(task) {
116
+ this.taskIntermediateSaveService
117
+ .getIntermediateSubmission(task.id ?? '')
118
+ .pipe(take(1))
119
+ .subscribe(intermediateSave => {
120
+ this.currentIntermediateSave = this.formatIntermediateSubmission(intermediateSave);
121
+ });
122
+ }
123
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskDetailIntermediateSaveComponent, deps: [{ token: i1.ConfigService }, { token: i2.IconService }, { token: i3.TranslateService }, { token: i4.TaskIntermediateSaveService }, { token: i4.TaskService }, { token: i5.ToastrService }], target: i0.ɵɵFactoryTarget.Component }); }
124
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TaskDetailIntermediateSaveComponent, isStandalone: true, selector: "valtimo-task-detail-intermediate-save", inputs: { task: "task" }, outputs: { currentIntermediateSaveEvent: "currentIntermediateSaveEvent", showModalEvent: "showModalEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 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@if (intermediateSaveEnabled && (formFlowInstanceId$ | async) === undefined) {\n <button\n cdsButton=\"ghost\"\n iconOnly=\"true\"\n cdsIcon=\"save\"\n [vTooltip]=\"'formManagement.intermediateSave.save' | translate\"\n (click)=\"saveCurrentProgress()\"\n ></button>\n\n <button\n cdsButton=\"ghost\"\n iconOnly=\"true\"\n cdsIcon=\"recently-viewed\"\n [disabled]=\"!currentIntermediateSave\"\n [vTooltip]=\"'formManagement.intermediateSave.clear' | translate\"\n (click)=\"revertSaveClick()\"\n ></button>\n}\n\n<valtimo-confirmation-modal\n [showModalSubject$]=\"showConfirmationModal$\"\n (confirmEvent)=\"clearCurrentProgress()\"\n (cancelEvent)=\"showConfirmationModal$.next(false)\"\n cancelButtonType=\"ghost\"\n confirmButtonTextTranslationKey=\"interface.confirm\"\n titleTranslationKey=\"formManagement.intermediateSave.clear\"\n contentTranslationKey=\"formManagement.intermediateSave.clearConfirm\"\n></valtimo-confirmation-modal>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "ngmodule", type: ConfirmationModalModule }, { kind: "component", type: i7.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "showOptionalButton", "optionalButtonText", "optionalButtonTextTranslationKey", "optionalButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm", "outputOnOptional", "spacerAfterCancelButton"], outputs: ["confirmEvent", "optionalEvent", "cancelEvent"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i2.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "ngmodule", type: ModalModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.TooltipDirective, selector: "[vTooltip]", inputs: ["vTooltip", "onBottom", "tooltipDisabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
125
+ }
126
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskDetailIntermediateSaveComponent, decorators: [{
127
+ type: Component,
128
+ args: [{ selector: 'valtimo-task-detail-intermediate-save', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
129
+ CommonModule,
130
+ TranslateModule,
131
+ ButtonModule,
132
+ ConfirmationModalModule,
133
+ IconModule,
134
+ ModalModule,
135
+ TooltipModule,
136
+ ], template: "<!--\n ~ Copyright 2015-2024 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@if (intermediateSaveEnabled && (formFlowInstanceId$ | async) === undefined) {\n <button\n cdsButton=\"ghost\"\n iconOnly=\"true\"\n cdsIcon=\"save\"\n [vTooltip]=\"'formManagement.intermediateSave.save' | translate\"\n (click)=\"saveCurrentProgress()\"\n ></button>\n\n <button\n cdsButton=\"ghost\"\n iconOnly=\"true\"\n cdsIcon=\"recently-viewed\"\n [disabled]=\"!currentIntermediateSave\"\n [vTooltip]=\"'formManagement.intermediateSave.clear' | translate\"\n (click)=\"revertSaveClick()\"\n ></button>\n}\n\n<valtimo-confirmation-modal\n [showModalSubject$]=\"showConfirmationModal$\"\n (confirmEvent)=\"clearCurrentProgress()\"\n (cancelEvent)=\"showConfirmationModal$.next(false)\"\n cancelButtonType=\"ghost\"\n confirmButtonTextTranslationKey=\"interface.confirm\"\n titleTranslationKey=\"formManagement.intermediateSave.clear\"\n contentTranslationKey=\"formManagement.intermediateSave.clearConfirm\"\n></valtimo-confirmation-modal>\n" }]
137
+ }], ctorParameters: () => [{ type: i1.ConfigService }, { type: i2.IconService }, { type: i3.TranslateService }, { type: i4.TaskIntermediateSaveService }, { type: i4.TaskService }, { type: i5.ToastrService }], propDecorators: { task: [{
138
+ type: Input
139
+ }], currentIntermediateSaveEvent: [{
140
+ type: Output
141
+ }], showModalEvent: [{
142
+ type: Output
143
+ }] } });
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1kZXRhaWwtaW50ZXJtZWRpYXRlLXNhdmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvY29tcG9uZW50cy90YXNrLWRldGFpbC1pbnRlcm1lZGlhdGUtc2F2ZS90YXNrLWRldGFpbC1pbnRlcm1lZGlhdGUtc2F2ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL3Rhc2svc3JjL2xpYi9jb21wb25lbnRzL3Rhc2stZGV0YWlsLWludGVybWVkaWF0ZS1zYXZlL3Rhc2stZGV0YWlsLWludGVybWVkaWF0ZS1zYXZlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFDLGVBQWUsRUFBbUIsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsYUFBYSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFM0UsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQWUsV0FBVyxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDN0YsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7OztBQW1CckUsTUFBTSxPQUFPLG1DQUFtQztJQUM5QyxJQUFv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U0FBUzsrQkFDRSx1Q0FBdUMsbUJBRWhDLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osZUFBZTt3QkFDZixZQUFZO3dCQUNaLHVCQUF1Qjt3QkFDdkIsVUFBVTt3QkFDVixXQUFXO3dCQUNYLGFBQWE7cUJBQ2Q7Mk9BR21CLElBQUk7c0JBQXZCLEtBQUs7Z0JBaUJvQiw0QkFBNEI7c0JBQXJELE1BQU07Z0JBRW1CLGNBQWM7c0JBQXZDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1JlY2VudGx5Vmlld2VkMTZ9IGZyb20gJ0BjYXJib24vaWNvbnMnO1xuaW1wb3J0IHtUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtDb25maXJtYXRpb25Nb2RhbE1vZHVsZSwgVG9vbHRpcE1vZHVsZX0gZnJvbSAnQHZhbHRpbW8vY29tcG9uZW50cyc7XG5pbXBvcnQge0NvbmZpZ1NlcnZpY2V9IGZyb20gJ0B2YWx0aW1vL2NvbmZpZyc7XG5pbXBvcnQge0J1dHRvbk1vZHVsZSwgSWNvbk1vZHVsZSwgSWNvblNlcnZpY2UsIE1vZGFsTW9kdWxlfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7VG9hc3RyU2VydmljZX0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgc3dpdGNoTWFwLCB0YWtlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7SW50ZXJtZWRpYXRlU2F2ZVJlcXVlc3QsIEludGVybWVkaWF0ZVN1Ym1pc3Npb24sIFRhc2t9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge1Rhc2tJbnRlcm1lZGlhdGVTYXZlU2VydmljZSwgVGFza1NlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsdGltby10YXNrLWRldGFpbC1pbnRlcm1lZGlhdGUtc2F2ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90YXNrLWRldGFpbC1pbnRlcm1lZGlhdGUtc2F2ZS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBCdXR0b25Nb2R1bGUsXG4gICAgQ29uZmlybWF0aW9uTW9kYWxNb2R1bGUsXG4gICAgSWNvbk1vZHVsZSxcbiAgICBNb2RhbE1vZHVsZSxcbiAgICBUb29sdGlwTW9kdWxlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBUYXNrRGV0YWlsSW50ZXJtZWRpYXRlU2F2ZUNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgdGFzayh2YWx1ZTogVGFzayB8IG51bGwpIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgdGhpcy50YXNrU2VydmljZVxuICAgICAgLmdldFRhc2tQcm9jZXNzTGluayh2YWx1ZS5pZClcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIGlmIChyZXMgIT09IG51bGwgJiYgcmVzLnR5cGUgPT09ICdmb3JtLWZsb3cnKVxuICAgICAgICAgIHRoaXMuZm9ybUZsb3dJbnN0YW5jZUlkJC5uZXh0KHJlcy5wcm9wZXJ0aWVzLmZvcm1GbG93SW5zdGFuY2VJZCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMudGFza1ZhbHVlLnNldCh2YWx1ZSk7XG4gICAgdGhpcy5wYWdlLnNldCh7XG4gICAgICB0aXRsZTogdmFsdWUubmFtZSxcbiAgICAgIHN1YnRpdGxlOiBgJHt0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgndGFza0RldGFpbC50YXNrQ3JlYXRlZCcpfSAke3ZhbHVlLmNyZWF0ZWR9YCxcbiAgICB9KTtcbiAgICB0aGlzLmdldEN1cnJlbnRQcm9ncmVzcyh2YWx1ZSk7XG4gIH1cbiAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBjdXJyZW50SW50ZXJtZWRpYXRlU2F2ZUV2ZW50ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPEludGVybWVkaWF0ZVN1Ym1pc3Npb24gfCBudWxsPigpO1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IHNob3dNb2RhbEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHB1YmxpYyByZWFkb25seSBmb3JtRmxvd0luc3RhbmNlSWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHB1YmxpYyByZWFkb25seSBzaG93Q29uZmlybWF0aW9uTW9kYWwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHRhc2tWYWx1ZSA9IHNpZ25hbDxUYXNrIHwgbnVsbD4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlID0gc2lnbmFsPHt0aXRsZTogc3RyaW5nOyBzdWJ0aXRsZTogc3RyaW5nfSB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgY2FuQXNzaWduVXNlclRvVGFzayA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyByZWFkb25seSBzdWJtaXNzaW9uJCA9IHRoaXMudGFza0ludGVybWVkaWF0ZVNhdmVTZXJ2aWNlLnN1Ym1pc3Npb24kO1xuICBwdWJsaWMgcmVhZG9ubHkgZm9ybUlvRm9ybURhdGEkID0gdGhpcy50YXNrSW50ZXJtZWRpYXRlU2F2ZVNlcnZpY2UuZm9ybUlvRm9ybURhdGEkO1xuXG4gIHB1YmxpYyBpbnRlcm1lZGlhdGVTYXZlRW5hYmxlZCA9IGZhbHNlO1xuICBwdWJsaWMgY3VycmVudEludGVybWVkaWF0ZVNhdmU6IEludGVybWVkaWF0ZVN1Ym1pc3Npb24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpY29uU2VydmljZTogSWNvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFza0ludGVybWVkaWF0ZVNhdmVTZXJ2aWNlOiBUYXNrSW50ZXJtZWRpYXRlU2F2ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0YXNrU2VydmljZTogVGFza1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0b2FzdHI6IFRvYXN0clNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5pbnRlcm1lZGlhdGVTYXZlRW5hYmxlZCA9ICEhdGhpcy5jb25maWdTZXJ2aWNlLmZlYXR1cmVUb2dnbGVzPy5lbmFibGVJbnRlcm1lZGlhdGVTYXZlO1xuICAgIHRoaXMuaWNvblNlcnZpY2UucmVnaXN0ZXJBbGwoW1JlY2VudGx5Vmlld2VkMTZdKTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQ3VycmVudFByb2dyZXNzKCk6IHZvaWQge1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuc3VibWlzc2lvbiQsIHRoaXMuZm9ybUlvRm9ybURhdGEkXSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKFtzdWJtaXNzaW9uLCBmb3JtSW9Gb3JtRGF0YV0pID0+IHtcbiAgICAgICAgICBjb25zdCBpbnRlcm1lZGlhdGVTYXZlUmVxdWVzdDogSW50ZXJtZWRpYXRlU2F2ZVJlcXVlc3QgPSB7XG4gICAgICAgICAgICBzdWJtaXNzaW9uOiBzdWJtaXNzaW9uPy5kYXRhID8gc3VibWlzc2lvbi5kYXRhIDogZm9ybUlvRm9ybURhdGEsXG4gICAgICAgICAgICB0YXNrSW5zdGFuY2VJZDogdGhpcy50YXNrVmFsdWUoKT8uaWQgPz8gJycsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJldHVybiB0aGlzLnRhc2tJbnRlcm1lZGlhdGVTYXZlU2VydmljZS5zdG9yZUludGVybWVkaWF0ZVN1Ym1pc3Npb24oXG4gICAgICAgICAgICBpbnRlcm1lZGlhdGVTYXZlUmVxdWVzdFxuICAgICAgICAgICk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlKDEpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogaW50ZXJtZWRpYXRlU3VibWlzc2lvbiA9PiB7XG4gICAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcyhcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdmb3JtTWFuYWdlbWVudC5pbnRlcm1lZGlhdGVTYXZlLnN1Y2Nlc3MnKVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50SW50ZXJtZWRpYXRlU2F2ZSA9IHRoaXMuZm9ybWF0SW50ZXJtZWRpYXRlU3VibWlzc2lvbihpbnRlcm1lZGlhdGVTdWJtaXNzaW9uKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRJbnRlcm1lZGlhdGVTYXZlRXZlbnQuZW1pdCh0aGlzLmN1cnJlbnRJbnRlcm1lZGlhdGVTYXZlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcih0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnZm9ybU1hbmFnZW1lbnQuaW50ZXJtZWRpYXRlU2F2ZS5lcnJvcicpKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJldmVydFNhdmVDbGljaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG93TW9kYWxFdmVudC5vYnNlcnZlZCkge1xuICAgICAgdGhpcy5zaG93TW9kYWxFdmVudC5lbWl0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zaG93Q29uZmlybWF0aW9uTW9kYWwkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJDdXJyZW50UHJvZ3Jlc3MoKTogdm9pZCB7XG4gICAgdGhpcy50YXNrSW50ZXJtZWRpYXRlU2F2ZVNlcnZpY2VcbiAgICAgIC5jbGVhckludGVybWVkaWF0ZVN1Ym1pc3Npb24odGhpcy50YXNrVmFsdWUoKT8uaWQgPz8gJycpXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMudGFza0ludGVybWVkaWF0ZVNhdmVTZXJ2aWNlLnNldFN1Ym1pc3Npb24oe2RhdGE6IHt9fSk7XG4gICAgICAgIHRoaXMuY3VycmVudEludGVybWVkaWF0ZVNhdmUgPSBudWxsO1xuICAgICAgICB0aGlzLmN1cnJlbnRJbnRlcm1lZGlhdGVTYXZlRXZlbnQuZW1pdCh0aGlzLmN1cnJlbnRJbnRlcm1lZGlhdGVTYXZlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRJbnRlcm1lZGlhdGVTdWJtaXNzaW9uKFxuICAgIGludGVybWVkaWF0ZVN1Ym1pc3Npb246IEludGVybWVkaWF0ZVN1Ym1pc3Npb25cbiAgKTogSW50ZXJtZWRpYXRlU3VibWlzc2lvbiB7XG4gICAgaW50ZXJtZWRpYXRlU3VibWlzc2lvbi5jcmVhdGVkT24gPSBtb21lbnQoaW50ZXJtZWRpYXRlU3VibWlzc2lvbi5jcmVhdGVkT24pLmZvcm1hdChcbiAgICAgICdERCBNTU0gWVlZWSBISDptbSdcbiAgICApO1xuICAgIGlmIChpbnRlcm1lZGlhdGVTdWJtaXNzaW9uLmVkaXRlZE9uKSB7XG4gICAgICBpbnRlcm1lZGlhdGVTdWJtaXNzaW9uLmVkaXRlZE9uID0gbW9tZW50KG5ldyBEYXRlKGludGVybWVkaWF0ZVN1Ym1pc3Npb24uZWRpdGVkT24pKS5mb3JtYXQoXG4gICAgICAgICdERCBNTU0gWVlZWSBISDptbSdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVybWVkaWF0ZVN1Ym1pc3Npb247XG4gIH1cblxuICBwcml2YXRlIGdldEN1cnJlbnRQcm9ncmVzcyh0YXNrOiBUYXNrKTogdm9pZCB7XG4gICAgdGhpcy50YXNrSW50ZXJtZWRpYXRlU2F2ZVNlcnZpY2VcbiAgICAgIC5nZXRJbnRlcm1lZGlhdGVTdWJtaXNzaW9uKHRhc2suaWQgPz8gJycpXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZShpbnRlcm1lZGlhdGVTYXZlID0+IHtcbiAgICAgICAgdGhpcy5jdXJyZW50SW50ZXJtZWRpYXRlU2F2ZSA9IHRoaXMuZm9ybWF0SW50ZXJtZWRpYXRlU3VibWlzc2lvbihpbnRlcm1lZGlhdGVTYXZlKTtcbiAgICAgIH0pO1xuICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG5cbkBpZiAoaW50ZXJtZWRpYXRlU2F2ZUVuYWJsZWQgJiYgKGZvcm1GbG93SW5zdGFuY2VJZCQgfCBhc3luYykgPT09IHVuZGVmaW5lZCkge1xuICA8YnV0dG9uXG4gICAgY2RzQnV0dG9uPVwiZ2hvc3RcIlxuICAgIGljb25Pbmx5PVwidHJ1ZVwiXG4gICAgY2RzSWNvbj1cInNhdmVcIlxuICAgIFt2VG9vbHRpcF09XCInZm9ybU1hbmFnZW1lbnQuaW50ZXJtZWRpYXRlU2F2ZS5zYXZlJyB8IHRyYW5zbGF0ZVwiXG4gICAgKGNsaWNrKT1cInNhdmVDdXJyZW50UHJvZ3Jlc3MoKVwiXG4gID48L2J1dHRvbj5cblxuICA8YnV0dG9uXG4gICAgY2RzQnV0dG9uPVwiZ2hvc3RcIlxuICAgIGljb25Pbmx5PVwidHJ1ZVwiXG4gICAgY2RzSWNvbj1cInJlY2VudGx5LXZpZXdlZFwiXG4gICAgW2Rpc2FibGVkXT1cIiFjdXJyZW50SW50ZXJtZWRpYXRlU2F2ZVwiXG4gICAgW3ZUb29sdGlwXT1cIidmb3JtTWFuYWdlbWVudC5pbnRlcm1lZGlhdGVTYXZlLmNsZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgKGNsaWNrKT1cInJldmVydFNhdmVDbGljaygpXCJcbiAgPjwvYnV0dG9uPlxufVxuXG48dmFsdGltby1jb25maXJtYXRpb24tbW9kYWxcbiAgW3Nob3dNb2RhbFN1YmplY3QkXT1cInNob3dDb25maXJtYXRpb25Nb2RhbCRcIlxuICAoY29uZmlybUV2ZW50KT1cImNsZWFyQ3VycmVudFByb2dyZXNzKClcIlxuICAoY2FuY2VsRXZlbnQpPVwic2hvd0NvbmZpcm1hdGlvbk1vZGFsJC5uZXh0KGZhbHNlKVwiXG4gIGNhbmNlbEJ1dHRvblR5cGU9XCJnaG9zdFwiXG4gIGNvbmZpcm1CdXR0b25UZXh0VHJhbnNsYXRpb25LZXk9XCJpbnRlcmZhY2UuY29uZmlybVwiXG4gIHRpdGxlVHJhbnNsYXRpb25LZXk9XCJmb3JtTWFuYWdlbWVudC5pbnRlcm1lZGlhdGVTYXZlLmNsZWFyXCJcbiAgY29udGVudFRyYW5zbGF0aW9uS2V5PVwiZm9ybU1hbmFnZW1lbnQuaW50ZXJtZWRpYXRlU2F2ZS5jbGVhckNvbmZpcm1cIlxuPjwvdmFsdGltby1jb25maXJtYXRpb24tbW9kYWw+XG4iXX0=