@valtimo/task 12.14.0 → 13.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 (60) hide show
  1. package/fesm2022/valtimo-task.mjs +218 -173
  2. package/fesm2022/valtimo-task.mjs.map +1 -1
  3. package/lib/components/assign-user-to-task/assign-user-to-task.component.d.ts +1 -1
  4. package/lib/components/task-detail-content/task-detail-content.component.d.ts +3 -4
  5. package/lib/components/task-detail-content/task-detail-content.component.d.ts.map +1 -1
  6. package/lib/components/task-detail-intermediate-save/task-detail-intermediate-save.component.d.ts +5 -6
  7. package/lib/components/task-detail-intermediate-save/task-detail-intermediate-save.component.d.ts.map +1 -1
  8. package/lib/components/task-detail-modal/task-detail-modal.component.d.ts +10 -4
  9. package/lib/components/task-detail-modal/task-detail-modal.component.d.ts.map +1 -1
  10. package/lib/components/task-list/task-list.component.d.ts +8 -4
  11. package/lib/components/task-list/task-list.component.d.ts.map +1 -1
  12. package/lib/models/index.d.ts +1 -0
  13. package/lib/models/index.d.ts.map +1 -1
  14. package/lib/models/task-list.model.d.ts +2 -2
  15. package/lib/models/task-list.model.d.ts.map +1 -1
  16. package/lib/models/task-sse-event.model.d.ts +8 -0
  17. package/lib/models/task-sse-event.model.d.ts.map +1 -0
  18. package/lib/models/task.model.d.ts +1 -1
  19. package/lib/services/task-intermediate-save.service.d.ts +1 -1
  20. package/lib/services/task-intermediate-save.service.d.ts.map +1 -1
  21. package/lib/services/task-list-pagination.service.d.ts +1 -1
  22. package/lib/services/task-list-search.service.d.ts +1 -1
  23. package/lib/services/task-list-sort.service.d.ts +1 -1
  24. package/lib/services/task-list.service.d.ts +4 -7
  25. package/lib/services/task-list.service.d.ts.map +1 -1
  26. package/lib/services/task.service.d.ts +4 -4
  27. package/lib/services/task.service.d.ts.map +1 -1
  28. package/lib/task-permissions.d.ts +1 -1
  29. package/lib/task-permissions.d.ts.map +1 -1
  30. package/lib/task.module.d.ts +9 -10
  31. package/lib/task.module.d.ts.map +1 -1
  32. package/package.json +4 -7
  33. package/esm2022/lib/components/assign-user-to-task/assign-user-to-task.component.mjs +0 -210
  34. package/esm2022/lib/components/set-task-due-date/set-task-due-date.component.mjs +0 -128
  35. package/esm2022/lib/components/task-detail-content/task-detail-content.component.mjs +0 -398
  36. package/esm2022/lib/components/task-detail-intermediate-save/task-detail-intermediate-save.component.mjs +0 -168
  37. package/esm2022/lib/components/task-detail-modal/task-detail-modal.component.mjs +0 -151
  38. package/esm2022/lib/components/task-list/task-list.component.mjs +0 -361
  39. package/esm2022/lib/constants/index.mjs +0 -17
  40. package/esm2022/lib/constants/task-list.constants.mjs +0 -22
  41. package/esm2022/lib/models/index.mjs +0 -21
  42. package/esm2022/lib/models/task-definition.model.mjs +0 -17
  43. package/esm2022/lib/models/task-intermediate-save.model.mjs +0 -17
  44. package/esm2022/lib/models/task-list-search-field.model.mjs +0 -43
  45. package/esm2022/lib/models/task-list.model.mjs +0 -22
  46. package/esm2022/lib/models/task.model.mjs +0 -17
  47. package/esm2022/lib/services/index.mjs +0 -23
  48. package/esm2022/lib/services/task-intermediate-save.service.mjs +0 -73
  49. package/esm2022/lib/services/task-list-column.service.mjs +0 -193
  50. package/esm2022/lib/services/task-list-pagination.service.mjs +0 -74
  51. package/esm2022/lib/services/task-list-query-param.service.mjs +0 -53
  52. package/esm2022/lib/services/task-list-search.service.mjs +0 -99
  53. package/esm2022/lib/services/task-list-sort.service.mjs +0 -116
  54. package/esm2022/lib/services/task-list.service.mjs +0 -60
  55. package/esm2022/lib/services/task.service.mjs +0 -104
  56. package/esm2022/lib/task-permissions.mjs +0 -44
  57. package/esm2022/lib/task-routing.module.mjs +0 -45
  58. package/esm2022/lib/task.module.mjs +0 -158
  59. package/esm2022/public_api.mjs +0 -31
  60. package/esm2022/valtimo-task.mjs +0 -5
@@ -1,398 +0,0 @@
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, Inject, Input, Optional, Output, ViewChild, ViewContainerRef, } from '@angular/core';
18
- import { RecentlyViewed16 } from '@carbon/icons';
19
- import { TranslateModule } from '@ngx-translate/core';
20
- import { FormIoModule, FormioOptionsImpl, } from '@valtimo/components';
21
- import { FORM_VIEW_MODEL_TOKEN } from '@valtimo/config';
22
- import { FORM_CUSTOM_COMPONENT_TOKEN, ProcessLinkModule, } from '@valtimo/process-link';
23
- import { BehaviorSubject, combineLatest, distinctUntilChanged, filter, map, Subscription, switchMap, take, } from 'rxjs';
24
- import { CAN_ASSIGN_TASK_PERMISSION, TASK_DETAIL_PERMISSION_RESOURCE } from '../../task-permissions';
25
- import * as i0 from "@angular/core";
26
- import * as i1 from "@valtimo/config";
27
- import * as i2 from "@valtimo/document";
28
- import * as i3 from "carbon-components-angular";
29
- import * as i4 from "ngx-logger";
30
- import * as i5 from "@valtimo/components";
31
- import * as i6 from "@valtimo/access-control";
32
- import * as i7 from "@valtimo/process-link";
33
- import * as i8 from "@angular/router";
34
- import * as i9 from "../../services";
35
- import * as i10 from "ngx-toastr";
36
- import * as i11 from "@ngx-translate/core";
37
- import * as i12 from "@angular/common";
38
- export class TaskDetailContentComponent {
39
- set task(value) {
40
- if (!value)
41
- return;
42
- this.loadTaskDetails(value);
43
- }
44
- set taskAndProcessLink(value) {
45
- if (!value)
46
- return;
47
- this.loadTaskDetails(value.task, value.processLinkActivityResult);
48
- }
49
- set modalClosed(closed) {
50
- // save form flow data on modal closed
51
- if (this.formFlow)
52
- this.formFlow.saveData();
53
- if (closed) {
54
- this.closeModalEvent.emit();
55
- }
56
- }
57
- get viewInitialized$() {
58
- return this._viewInitialized$.pipe(filter(initialized => initialized));
59
- }
60
- constructor(configService, documentService, iconService, logger, modalService, permissionService, processLinkService, router, stateService, taskIntermediateSaveService, taskService, toastr, translateService, formViewModel, formCustomComponentConfig, urlResolverService) {
61
- this.configService = configService;
62
- this.documentService = documentService;
63
- this.iconService = iconService;
64
- this.logger = logger;
65
- this.modalService = modalService;
66
- this.permissionService = permissionService;
67
- this.processLinkService = processLinkService;
68
- this.router = router;
69
- this.stateService = stateService;
70
- this.taskIntermediateSaveService = taskIntermediateSaveService;
71
- this.taskService = taskService;
72
- this.toastr = toastr;
73
- this.translateService = translateService;
74
- this.formViewModel = formViewModel;
75
- this.formCustomComponentConfig = formCustomComponentConfig;
76
- this.urlResolverService = urlResolverService;
77
- this.closeModalEvent = new EventEmitter();
78
- this.formSubmit = new EventEmitter();
79
- this.activeChange = new EventEmitter();
80
- this.canAssignUserToTask$ = new BehaviorSubject(false);
81
- this.errorMessage$ = new BehaviorSubject(null);
82
- this.formDefinition$ = new BehaviorSubject(null);
83
- this.formDefinitionId$ = new BehaviorSubject(null);
84
- this.formFlowInstanceId$ = new BehaviorSubject(null);
85
- this.formioOptions$ = new BehaviorSubject(null);
86
- this.formIoFormData$ = new BehaviorSubject(null);
87
- this.formName$ = new BehaviorSubject(null);
88
- this.loading$ = new BehaviorSubject(true);
89
- this.page$ = new BehaviorSubject(null);
90
- this.submission$ = this.taskIntermediateSaveService.submission$;
91
- this.task$ = new BehaviorSubject(null);
92
- this.taskInstanceId$ = new BehaviorSubject(null);
93
- this.intermediateSaveEnabled = false;
94
- this._taskProcessLinkType$ = new BehaviorSubject(null);
95
- this.processLinkIsForm$ = this._taskProcessLinkType$.pipe(map((type) => type === 'form'));
96
- this.processLinkIsFormViewModel$ = this._taskProcessLinkType$.pipe(map((type) => type === 'form-view-model'));
97
- this.processLinkIsFormFlow$ = this._taskProcessLinkType$.pipe(map((type) => type === 'form-flow'));
98
- this.processLinkIsUiComponent$ = this._taskProcessLinkType$.pipe(map((type) => type === 'ui-component'));
99
- this._processLinkId$ = new BehaviorSubject(null);
100
- this._subscriptions = new Subscription();
101
- this._formCustomComponentConfig$ = new BehaviorSubject({});
102
- this._viewInitialized$ = new BehaviorSubject(false);
103
- this.intermediateSaveEnabled = !!this.configService.featureToggles?.enableIntermediateSave;
104
- this.iconService.registerAll([RecentlyViewed16]);
105
- const options = new FormioOptionsImpl();
106
- options.disableAlerts = true;
107
- this.formioOptions$.next(options);
108
- this._formCustomComponentConfig$.next(formCustomComponentConfig);
109
- }
110
- ngOnInit() {
111
- this.openPermissionSubscription();
112
- }
113
- ngOnDestroy() {
114
- this._subscriptions.unsubscribe();
115
- this.taskIntermediateSaveService.setSubmission({});
116
- this._viewInitialized$.next(false);
117
- }
118
- ngAfterViewInit() {
119
- this._viewInitialized$.next(true);
120
- }
121
- onSubmit(submission) {
122
- if (submission.data) {
123
- this.taskIntermediateSaveService.setFormIoFormData(submission.data);
124
- this.formIoFormData$.next(submission.data);
125
- }
126
- combineLatest([this._processLinkId$, this._taskProcessLinkType$, this.task$])
127
- .pipe(take(1))
128
- .subscribe(([processLinkId, taskProcessLinkType, task]) => {
129
- if (taskProcessLinkType === 'form') {
130
- if (processLinkId) {
131
- this.processLinkService
132
- .submitForm(processLinkId, submission.data, task?.businessKey, task?.id)
133
- .subscribe({
134
- next: (_) => {
135
- this.completeTask(task);
136
- },
137
- error: errors => {
138
- this.form.showErrors(errors);
139
- },
140
- });
141
- }
142
- }
143
- else if (taskProcessLinkType === 'form-view-model') {
144
- this.completeTask(task);
145
- }
146
- });
147
- }
148
- completeTask(task) {
149
- if (!task)
150
- return;
151
- this.toastr.success(`${task.name} ${this.translateService.instant('taskDetail.taskCompleted')}`);
152
- this.task$.next(null);
153
- this.formSubmit.emit();
154
- this.closeModalEvent.emit();
155
- this.activeChange.emit(false);
156
- if (this.formFlow)
157
- this.formFlow.saveData();
158
- }
159
- onChange(event) {
160
- if (event.data) {
161
- this.taskIntermediateSaveService.setFormIoFormData(event.data);
162
- this.formIoFormData$.next(event.data);
163
- this.activeChange.emit(true);
164
- }
165
- }
166
- onFormFlowChangeEvent() {
167
- this.activeChange.emit(true);
168
- }
169
- loadTaskDetails(task, processLink) {
170
- this.resetTaskProcessLinkType();
171
- this.resetFormDefinition();
172
- this.taskInstanceId$.next(task.id);
173
- if (!processLink) {
174
- this.getTaskProcessLink(task.id);
175
- }
176
- else {
177
- this.setTaskProcessLink(processLink);
178
- }
179
- this.setDocumentDefinitionNameInService(task);
180
- const documentId = task.businessKey;
181
- this.stateService.setDocumentId(documentId);
182
- this.task$.next(task);
183
- this.page$.next({
184
- title: task.name,
185
- subtitle: `${this.translateService.instant('taskDetail.taskCreated')} ${task.created}`,
186
- });
187
- }
188
- getCurrentProgress(formViewModelComponentRef) {
189
- this.taskInstanceId$
190
- .pipe(filter(value => !!value), take(1), switchMap((taskInstanceId) => this.taskIntermediateSaveService.getIntermediateSubmission(taskInstanceId ?? '')))
191
- .subscribe({
192
- next: (intermediateSubmission) => {
193
- this.taskIntermediateSaveService.setSubmission({
194
- data: intermediateSubmission?.submission || {},
195
- });
196
- if (formViewModelComponentRef) {
197
- formViewModelComponentRef.instance.submission = {
198
- data: intermediateSubmission.submission,
199
- };
200
- }
201
- },
202
- });
203
- }
204
- getTaskProcessLink(taskId) {
205
- this.taskService.getTaskProcessLink(taskId).subscribe({
206
- next: res => {
207
- this.setTaskProcessLink(res);
208
- },
209
- error: _ => {
210
- this.loading$.next(false);
211
- },
212
- });
213
- }
214
- setTaskProcessLink(processLinkResult) {
215
- if (processLinkResult !== null) {
216
- switch (processLinkResult?.type) {
217
- case 'form':
218
- this._taskProcessLinkType$.next('form');
219
- this._processLinkId$.next(processLinkResult.processLinkId);
220
- if (this.intermediateSaveEnabled)
221
- this.getCurrentProgress();
222
- this.setFormDefinition(processLinkResult.properties.prefilledForm);
223
- break;
224
- case 'form-flow':
225
- this._taskProcessLinkType$.next('form-flow');
226
- this.formFlowInstanceId$.next(processLinkResult.properties.formFlowInstanceId ?? '');
227
- break;
228
- case 'form-view-model':
229
- this._taskProcessLinkType$.next('form-view-model');
230
- this._processLinkId$.next(processLinkResult.processLinkId);
231
- this.formDefinition$.next(processLinkResult.properties.formDefinition);
232
- this.formName$.next(processLinkResult.properties.formName ?? '');
233
- this.setFormViewModelComponent();
234
- break;
235
- case 'url':
236
- this._taskProcessLinkType$.next('url');
237
- this._processLinkId$.next(processLinkResult.processLinkId);
238
- combineLatest([this.processLinkService.getVariables(), this.task$])
239
- .pipe(take(1))
240
- .subscribe(([variables, task]) => {
241
- let url = this.urlResolverService.resolveUrlVariables(processLinkResult.properties.url, variables.variables);
242
- window.open(url, '_blank').focus();
243
- this.processLinkService
244
- .submitURLProcessLink(processLinkResult.processLinkId, task.businessKey, task.id)
245
- .subscribe(() => {
246
- this.completeTask(task);
247
- });
248
- });
249
- break;
250
- case 'ui-component':
251
- this._taskProcessLinkType$.next('ui-component');
252
- this._processLinkId$.next(processLinkResult.processLinkId);
253
- this.formDefinition$.next(null);
254
- this.formName$.next('');
255
- this.setFormCustomComponent(processLinkResult.properties.componentKey);
256
- break;
257
- }
258
- this.loading$.next(false);
259
- }
260
- }
261
- openPermissionSubscription() {
262
- this._subscriptions.add(this.task$.subscribe(task => {
263
- if (task) {
264
- this.logger.debug('Checking if user allowed to assign a user to Task with id:', task.id);
265
- this.permissionService
266
- .requestPermission(CAN_ASSIGN_TASK_PERMISSION, {
267
- resource: TASK_DETAIL_PERMISSION_RESOURCE.task,
268
- identifier: task.id,
269
- })
270
- .subscribe((allowed) => {
271
- this.canAssignUserToTask$.next(allowed);
272
- });
273
- }
274
- else {
275
- this.logger.debug('Reset is user allowed to assign a user to Task as task is null');
276
- this.canAssignUserToTask$.next(false);
277
- }
278
- }));
279
- }
280
- setFormDefinition(formDefinition) {
281
- this._taskProcessLinkType$.next('form');
282
- this.formDefinition$.next(formDefinition);
283
- }
284
- setFormViewModelComponent() {
285
- combineLatest([this._viewInitialized$, this.processLinkIsFormViewModel$]).subscribe(([viewInitialized, isFvm]) => {
286
- if (viewInitialized && isFvm) {
287
- this.formViewModelDynamicContainer.clear();
288
- if (!this.formViewModel) {
289
- return;
290
- }
291
- const formViewModelComponent = this.formViewModelDynamicContainer.createComponent(this.formViewModel.component);
292
- formViewModelComponent.instance.form = this.formDefinition$.getValue();
293
- formViewModelComponent.instance.formName = this.formName$.getValue();
294
- formViewModelComponent.instance.taskInstanceId = this.taskInstanceId$.getValue();
295
- formViewModelComponent.instance.isStartForm = false;
296
- formViewModelComponent.instance.formSubmit
297
- .pipe(switchMap(() => this.task$), take(1))
298
- .subscribe((task) => {
299
- this.completeTask(task);
300
- });
301
- if (this.intermediateSaveEnabled) {
302
- this._subscriptions.add(formViewModelComponent.instance.submission$.subscribe(submission => {
303
- this.taskIntermediateSaveService.setSubmission(submission);
304
- }));
305
- this._subscriptions.add(this.submission$.pipe(distinctUntilChanged()).subscribe((submission) => {
306
- if (submission?.data && Object.keys(submission.data).length === 0) {
307
- formViewModelComponent.instance.submission = { data: {} };
308
- }
309
- }));
310
- this.getCurrentProgress(formViewModelComponent);
311
- }
312
- this._subscriptions.add(this.closeModalEvent.subscribe(() => {
313
- formViewModelComponent.destroy();
314
- }));
315
- }
316
- });
317
- }
318
- setFormCustomComponent(formCustomComponentKey) {
319
- combineLatest([this._viewInitialized$, this.processLinkIsUiComponent$]).subscribe(([viewInitialized, isUiComponent]) => {
320
- if (viewInitialized && isUiComponent) {
321
- this.formCustomComponentDynamicContainer.clear();
322
- if (!this.formCustomComponentConfig) {
323
- return;
324
- }
325
- let renderedComponent;
326
- this._subscriptions.add(this._formCustomComponentConfig$.subscribe(formCustomComponentConfig => {
327
- const customComponent = formCustomComponentConfig[formCustomComponentKey];
328
- renderedComponent = this.formCustomComponentDynamicContainer.createComponent(customComponent);
329
- renderedComponent.instance.taskInstanceId = this.taskInstanceId$.value;
330
- renderedComponent.instance.submittedEvent.subscribe(() => {
331
- this.closeModalEvent.emit();
332
- });
333
- }));
334
- this._subscriptions.add(this.closeModalEvent.subscribe(() => {
335
- renderedComponent.destroy();
336
- }));
337
- }
338
- });
339
- }
340
- resetFormDefinition() {
341
- this.formDefinition$.next(null);
342
- this.loading$.next(true);
343
- }
344
- resetTaskProcessLinkType() {
345
- this._taskProcessLinkType$.next(null);
346
- this._processLinkId$.next(null);
347
- }
348
- setDocumentDefinitionNameInService(task) {
349
- this.documentService
350
- .getProcessDocumentDefinitionFromProcessInstanceId(task.processInstanceId)
351
- .subscribe(processDocumentDefinition => {
352
- const documentDefinitionName = processDocumentDefinition.id.documentDefinitionId.name;
353
- this.modalService.setDocumentDefinitionName(documentDefinitionName);
354
- this.stateService.setDocumentDefinitionName(documentDefinitionName);
355
- });
356
- }
357
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskDetailContentComponent, deps: [{ token: i1.ConfigService }, { token: i2.DocumentService }, { token: i3.IconService }, { token: i4.NGXLogger }, { token: i5.ValtimoModalService }, { token: i6.PermissionService }, { token: i7.ProcessLinkService }, { token: i8.Router }, { token: i5.FormIoStateService }, { token: i9.TaskIntermediateSaveService }, { token: i9.TaskService }, { token: i10.ToastrService }, { token: i11.TranslateService }, { token: FORM_VIEW_MODEL_TOKEN, optional: true }, { token: FORM_CUSTOM_COMPONENT_TOKEN, optional: true }, { token: i7.UrlResolverService }], target: i0.ɵɵFactoryTarget.Component }); }
358
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TaskDetailContentComponent, isStandalone: true, selector: "valtimo-task-detail-content", inputs: { task: "task", taskAndProcessLink: "taskAndProcessLink", modalClosed: "modalClosed" }, outputs: { closeModalEvent: "closeModalEvent", formSubmit: "formSubmit", activeChange: "activeChange" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["form"], descendants: true }, { propertyName: "formViewModelDynamicContainer", first: true, predicate: ["formViewModelComponent"], descendants: true, read: ViewContainerRef }, { propertyName: "formFlow", first: true, predicate: ["formFlow"], descendants: true }, { propertyName: "formCustomComponentDynamicContainer", first: true, predicate: ["formCustomComponent"], descendants: true, read: ViewContainerRef }], 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<ng-container\n *ngIf=\"{\n loading: loading$ | async,\n page: page$ | async,\n task: task$ | async,\n taskId: taskInstanceId$ | async,\n formDefinition: formDefinition$ | async,\n formDefinitionId: formDefinitionId$ | async,\n formName: formName$ | async,\n formIoFormData: formIoFormData$ | async,\n submission: submission$ | async,\n processLinkIsForm: processLinkIsForm$ | async,\n processLinkIsFormViewModel: processLinkIsFormViewModel$ | async,\n processLinkIsUiComponent: processLinkIsUiComponent$ | async,\n formioOptions: formioOptions$ | async,\n processLinkIsFormFlow: processLinkIsFormFlow$ | async,\n formFlowInstanceId: formFlowInstanceId$ | async,\n errorMessage: errorMessage$ | async,\n canAssignUserToTask: canAssignUserToTask$ | async,\n } as obs\"\n>\n <valtimo-form-io\n #form\n *ngIf=\"obs.formDefinition && obs.processLinkIsForm && !obs.processLinkIsUiComponent && !obs.processLinkIsFormViewModel\"\n [form]=\"obs.formDefinition\"\n [submission]=\"obs.submission\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n [options]=\"obs.formioOptions\"\n ></valtimo-form-io>\n\n <valtimo-form-flow\n #formFlow\n *ngIf=\"obs.processLinkIsFormFlow\"\n [formIoFormData]=\"formIoFormData$\"\n [formFlowInstanceId]=\"obs.formFlowInstanceId\"\n (formFlowComplete)=\"completeTask(obs.task)\"\n (formFlowChange)=\"onFormFlowChangeEvent()\"\n ></valtimo-form-flow>\n\n <div *ngIf=\"obs.loading\" class=\"text-black mb-0 p-3 text-center\">\n {{ 'formManagement.loading' | translate }}\n </div>\n\n <div\n *ngIf=\"\n obs.loading === false &&\n !obs.formDefinition &&\n !obs.formFlowInstanceId &&\n !obs.errorMessage &&\n !obs.processLinkIsUiComponent\n \"\n class=\"bg-warning text-black mb-0 p-3 text-center\"\n >\n {{\n (isAdmin$ | async)\n ? ('formManagement.noFormDefinitionFoundAdmin' | translate)\n : ('formManagement.noFormDefinitionFoundUser' | translate)\n }}\n </div>\n\n <div *ngIf=\"obs.errorMessage\" class=\"bg-danger text-black mb-0 p-3 text-center\">\n {{ obs.errorMessage }}\n </div>\n\n <div class=\"m-2\">\n <ng-template #formViewModelComponent></ng-template>\n <ng-template #formCustomComponent></ng-template>\n </div>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i12.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormIoModule }, { kind: "component", type: i5.FormioComponent, selector: "valtimo-form-io", inputs: ["options", "submission", "form", "readOnly", "formRefresh$"], outputs: ["submit", "change", "event"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i11.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ProcessLinkModule }, { kind: "component", type: i7.FormFlowComponent, selector: "valtimo-form-flow", inputs: ["formIoFormData", "formFlowInstanceId"], outputs: ["formFlowComplete", "formFlowChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
359
- }
360
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskDetailContentComponent, decorators: [{
361
- type: Component,
362
- args: [{ selector: 'valtimo-task-detail-content', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, FormIoModule, TranslateModule, ProcessLinkModule], 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<ng-container\n *ngIf=\"{\n loading: loading$ | async,\n page: page$ | async,\n task: task$ | async,\n taskId: taskInstanceId$ | async,\n formDefinition: formDefinition$ | async,\n formDefinitionId: formDefinitionId$ | async,\n formName: formName$ | async,\n formIoFormData: formIoFormData$ | async,\n submission: submission$ | async,\n processLinkIsForm: processLinkIsForm$ | async,\n processLinkIsFormViewModel: processLinkIsFormViewModel$ | async,\n processLinkIsUiComponent: processLinkIsUiComponent$ | async,\n formioOptions: formioOptions$ | async,\n processLinkIsFormFlow: processLinkIsFormFlow$ | async,\n formFlowInstanceId: formFlowInstanceId$ | async,\n errorMessage: errorMessage$ | async,\n canAssignUserToTask: canAssignUserToTask$ | async,\n } as obs\"\n>\n <valtimo-form-io\n #form\n *ngIf=\"obs.formDefinition && obs.processLinkIsForm && !obs.processLinkIsUiComponent && !obs.processLinkIsFormViewModel\"\n [form]=\"obs.formDefinition\"\n [submission]=\"obs.submission\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n [options]=\"obs.formioOptions\"\n ></valtimo-form-io>\n\n <valtimo-form-flow\n #formFlow\n *ngIf=\"obs.processLinkIsFormFlow\"\n [formIoFormData]=\"formIoFormData$\"\n [formFlowInstanceId]=\"obs.formFlowInstanceId\"\n (formFlowComplete)=\"completeTask(obs.task)\"\n (formFlowChange)=\"onFormFlowChangeEvent()\"\n ></valtimo-form-flow>\n\n <div *ngIf=\"obs.loading\" class=\"text-black mb-0 p-3 text-center\">\n {{ 'formManagement.loading' | translate }}\n </div>\n\n <div\n *ngIf=\"\n obs.loading === false &&\n !obs.formDefinition &&\n !obs.formFlowInstanceId &&\n !obs.errorMessage &&\n !obs.processLinkIsUiComponent\n \"\n class=\"bg-warning text-black mb-0 p-3 text-center\"\n >\n {{\n (isAdmin$ | async)\n ? ('formManagement.noFormDefinitionFoundAdmin' | translate)\n : ('formManagement.noFormDefinitionFoundUser' | translate)\n }}\n </div>\n\n <div *ngIf=\"obs.errorMessage\" class=\"bg-danger text-black mb-0 p-3 text-center\">\n {{ obs.errorMessage }}\n </div>\n\n <div class=\"m-2\">\n <ng-template #formViewModelComponent></ng-template>\n <ng-template #formCustomComponent></ng-template>\n </div>\n</ng-container>\n" }]
363
- }], ctorParameters: () => [{ type: i1.ConfigService }, { type: i2.DocumentService }, { type: i3.IconService }, { type: i4.NGXLogger }, { type: i5.ValtimoModalService }, { type: i6.PermissionService }, { type: i7.ProcessLinkService }, { type: i8.Router }, { type: i5.FormIoStateService }, { type: i9.TaskIntermediateSaveService }, { type: i9.TaskService }, { type: i10.ToastrService }, { type: i11.TranslateService }, { type: undefined, decorators: [{
364
- type: Optional
365
- }, {
366
- type: Inject,
367
- args: [FORM_VIEW_MODEL_TOKEN]
368
- }] }, { type: undefined, decorators: [{
369
- type: Optional
370
- }, {
371
- type: Inject,
372
- args: [FORM_CUSTOM_COMPONENT_TOKEN]
373
- }] }, { type: i7.UrlResolverService }], propDecorators: { form: [{
374
- type: ViewChild,
375
- args: ['form']
376
- }], formViewModelDynamicContainer: [{
377
- type: ViewChild,
378
- args: ['formViewModelComponent', { static: false, read: ViewContainerRef }]
379
- }], formFlow: [{
380
- type: ViewChild,
381
- args: ['formFlow']
382
- }], formCustomComponentDynamicContainer: [{
383
- type: ViewChild,
384
- args: ['formCustomComponent', { static: false, read: ViewContainerRef }]
385
- }], task: [{
386
- type: Input
387
- }], taskAndProcessLink: [{
388
- type: Input
389
- }], modalClosed: [{
390
- type: Input
391
- }], closeModalEvent: [{
392
- type: Output
393
- }], formSubmit: [{
394
- type: Output
395
- }], activeChange: [{
396
- type: Output
397
- }] } });
398
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1kZXRhaWwtY29udGVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL3Rhc2svc3JjL2xpYi9jb21wb25lbnRzL3Rhc2stZGV0YWlsLWNvbnRlbnQvdGFzay1kZXRhaWwtY29udGVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL3Rhc2svc3JjL2xpYi9jb21wb25lbnRzL3Rhc2stZGV0YWlsLWNvbnRlbnQvdGFzay1kZXRhaWwtY29udGVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRS9DLE9BQU8sRUFBQyxlQUFlLEVBQW1CLE1BQU0scUJBQXFCLENBQUM7QUFFdEUsT0FBTyxFQUVMLFlBQVksRUFDWixpQkFBaUIsR0FLbEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQWdCLHFCQUFxQixFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBRXBGLE9BQU8sRUFDTCwyQkFBMkIsRUFLM0IsaUJBQWlCLEdBTWxCLE1BQU0sdUJBQXVCLENBQUM7QUFJL0IsT0FBTyxFQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBYyxZQUFZLEVBQUUsU0FBUyxFQUFFLElBQUksR0FBRSxNQUFNLE1BQU0sQ0FBQztBQUdu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NE5BR25CLGdCQUFnQiw2QkNoRjFFLHE4RkFzRkEsMkNEYlksWUFBWSx5TEFBRSxZQUFZLDJOQUFFLGVBQWUsNEZBQUUsaUJBQWlCOzs0RkFFN0QsMEJBQTBCO2tCQVB0QyxTQUFTOytCQUNFLDZCQUE2QixjQUUzQixJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsQ0FBQzs7MEJBc0Z0RSxRQUFROzswQkFBSSxNQUFNOzJCQUFDLHFCQUFxQjs7MEJBQ3hDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsMkJBQTJCOzBFQXBGOUIsSUFBSTtzQkFBdEIsU0FBUzt1QkFBQyxNQUFNO2dCQUVWLDZCQUE2QjtzQkFEbkMsU0FBUzt1QkFBQyx3QkFBd0IsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFDO2dCQUU5QyxRQUFRO3NCQUFyQyxTQUFTO3VCQUFDLFVBQVU7Z0JBRWQsbUNBQW1DO3NCQUR6QyxTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUM7Z0JBRXJELElBQUk7c0JBQXZCLEtBQUs7Z0JBS2Msa0JBQWtCO3NCQUFyQyxLQUFLO2dCQUtjLFdBQVc7c0JBQTlCLEtBQUs7Z0JBUW9CLGVBQWU7c0JBQXhDLE1BQU07Z0JBQ21CLFVBQVU7c0JBQW5DLE1BQU07Z0JBQ21CLFlBQVk7c0JBQXJDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1JvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7UmVjZW50bHlWaWV3ZWQxNn0gZnJvbSAnQGNhcmJvbi9pY29ucyc7XG5pbXBvcnQge0Zvcm1pb0Zvcm19IGZyb20gJ0Bmb3JtaW8vYW5ndWxhcic7XG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1Blcm1pc3Npb25TZXJ2aWNlfSBmcm9tICdAdmFsdGltby9hY2Nlc3MtY29udHJvbCc7XG5pbXBvcnQge1xuICBGb3JtaW9Db21wb25lbnQsXG4gIEZvcm1Jb01vZHVsZSxcbiAgRm9ybWlvT3B0aW9uc0ltcGwsXG4gIEZvcm1Jb1N0YXRlU2VydmljZSxcbiAgRm9ybWlvU3VibWlzc2lvbixcbiAgVmFsdGltb0Zvcm1pb09wdGlvbnMsXG4gIFZhbHRpbW9Nb2RhbFNlcnZpY2UsXG59IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtDb25maWdTZXJ2aWNlLCBGT1JNX1ZJRVdfTU9ERUxfVE9LRU4sIEZvcm1WaWV3TW9kZWx9IGZyb20gJ0B2YWx0aW1vL2NvbmZpZyc7XG5pbXBvcnQge0RvY3VtZW50U2VydmljZX0gZnJvbSAnQHZhbHRpbW8vZG9jdW1lbnQnO1xuaW1wb3J0IHtcbiAgRk9STV9DVVNUT01fQ09NUE9ORU5UX1RPS0VOLFxuICBGb3JtQ3VzdG9tQ29tcG9uZW50LFxuICBGb3JtQ3VzdG9tQ29tcG9uZW50Q29uZmlnLFxuICBGb3JtRmxvd0NvbXBvbmVudCxcbiAgRm9ybVN1Ym1pc3Npb25SZXN1bHQsXG4gIFByb2Nlc3NMaW5rTW9kdWxlLFxuICBQcm9jZXNzTGlua1NlcnZpY2UsXG4gIFRhc2tQcm9jZXNzTGlua1Jlc3VsdCxcbiAgVGFza1Byb2Nlc3NMaW5rVHlwZSxcbiAgVGFza1dpdGhQcm9jZXNzTGluayxcbiAgVXJsUmVzb2x2ZXJTZXJ2aWNlLFxufSBmcm9tICdAdmFsdGltby9wcm9jZXNzLWxpbmsnO1xuaW1wb3J0IHtJY29uU2VydmljZX0gZnJvbSAnY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhcic7XG5pbXBvcnQge05HWExvZ2dlcn0gZnJvbSAnbmd4LWxvZ2dlcic7XG5pbXBvcnQge1RvYXN0clNlcnZpY2V9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBzd2l0Y2hNYXAsIHRha2UsfSBmcm9tICdyeGpzJztcbmltcG9ydCB7SW50ZXJtZWRpYXRlU3VibWlzc2lvbiwgVGFza30gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7VGFza0ludGVybWVkaWF0ZVNhdmVTZXJ2aWNlLCBUYXNrU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtDQU5fQVNTSUdOX1RBU0tfUEVSTUlTU0lPTiwgVEFTS19ERVRBSUxfUEVSTUlTU0lPTl9SRVNPVVJDRX0gZnJvbSAnLi4vLi4vdGFzay1wZXJtaXNzaW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbHRpbW8tdGFzay1kZXRhaWwtY29udGVudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90YXNrLWRldGFpbC1jb250ZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1Jb01vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLCBQcm9jZXNzTGlua01vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIFRhc2tEZXRhaWxDb250ZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuICBAVmlld0NoaWxkKCdmb3JtJykgZm9ybTogRm9ybWlvQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdmb3JtVmlld01vZGVsQ29tcG9uZW50Jywge3N0YXRpYzogZmFsc2UsIHJlYWQ6IFZpZXdDb250YWluZXJSZWZ9KVxuICBwdWJsaWMgZm9ybVZpZXdNb2RlbER5bmFtaWNDb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoJ2Zvcm1GbG93JykgcHVibGljIGZvcm1GbG93OiBGb3JtRmxvd0NvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgnZm9ybUN1c3RvbUNvbXBvbmVudCcsIHtzdGF0aWM6IGZhbHNlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmfSlcbiAgcHVibGljIGZvcm1DdXN0b21Db21wb25lbnREeW5hbWljQ29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuICBASW5wdXQoKSBwdWJsaWMgc2V0IHRhc2sodmFsdWU6IFRhc2sgfCBudWxsKSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5sb2FkVGFza0RldGFpbHModmFsdWUpO1xuICB9XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgdGFza0FuZFByb2Nlc3NMaW5rKHZhbHVlOiBUYXNrV2l0aFByb2Nlc3NMaW5rIHwgbnVsbCkge1xuICAgIGlmICghdmFsdWUpIHJldHVybjtcblxuICAgIHRoaXMubG9hZFRhc2tEZXRhaWxzKHZhbHVlLnRhc2sgYXMgYW55LCB2YWx1ZS5wcm9jZXNzTGlua0FjdGl2aXR5UmVzdWx0KTtcbiAgfVxuICBASW5wdXQoKSBwdWJsaWMgc2V0IG1vZGFsQ2xvc2VkKGNsb3NlZDogYm9vbGVhbikge1xuICAgIC8vIHNhdmUgZm9ybSBmbG93IGRhdGEgb24gbW9kYWwgY2xvc2VkXG4gICAgaWYgKHRoaXMuZm9ybUZsb3cpIHRoaXMuZm9ybUZsb3cuc2F2ZURhdGEoKTtcblxuICAgIGlmIChjbG9zZWQpIHtcbiAgICAgIHRoaXMuY2xvc2VNb2RhbEV2ZW50LmVtaXQoKTtcbiAgICB9XG4gIH1cbiAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBjbG9zZU1vZGFsRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgcmVhZG9ubHkgZm9ybVN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBhY3RpdmVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNhbkFzc2lnblVzZXJUb1Rhc2skID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyByZWFkb25seSBlcnJvck1lc3NhZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IGZvcm1EZWZpbml0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Rm9ybWlvRm9ybSB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgZm9ybURlZmluaXRpb25JZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgZm9ybUZsb3dJbnN0YW5jZUlkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBmb3JtaW9PcHRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VmFsdGltb0Zvcm1pb09wdGlvbnMgfCBudWxsPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IGZvcm1Jb0Zvcm1EYXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IGZvcm1OYW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBsb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IHN1Ym1pc3Npb24kID0gdGhpcy50YXNrSW50ZXJtZWRpYXRlU2F2ZVNlcnZpY2Uuc3VibWlzc2lvbiQ7XG4gIHB1YmxpYyByZWFkb25seSB0YXNrJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFzayB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgdGFza0luc3RhbmNlSWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcHVibGljIGludGVybWVkaWF0ZVNhdmVFbmFibGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfdGFza1Byb2Nlc3NMaW5rVHlwZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRhc2tQcm9jZXNzTGlua1R5cGUgfCBudWxsPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IHByb2Nlc3NMaW5rSXNGb3JtJCA9IHRoaXMuX3Rhc2tQcm9jZXNzTGlua1R5cGUkLnBpcGUoXG4gICAgbWFwKCh0eXBlOiBzdHJpbmcgfCBudWxsKSA9PiB0eXBlID09PSAnZm9ybScpXG4gICk7XG4gIHB1YmxpYyByZWFkb25seSBwcm9jZXNzTGlua0lzRm9ybVZpZXdNb2RlbCQgPSB0aGlzLl90YXNrUHJvY2Vzc0xpbmtUeXBlJC5waXBlKFxuICAgIG1hcCgodHlwZTogc3RyaW5nIHwgbnVsbCkgPT4gdHlwZSA9PT0gJ2Zvcm0tdmlldy1tb2RlbCcpXG4gICk7XG4gIHB1YmxpYyByZWFkb25seSBwcm9jZXNzTGlua0lzRm9ybUZsb3ckID0gdGhpcy5fdGFza1Byb2Nlc3NMaW5rVHlwZSQucGlwZShcbiAgICBtYXAoKHR5cGU6IHN0cmluZyB8IG51bGwpID0+IHR5cGUgPT09ICdmb3JtLWZsb3cnKVxuICApO1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvY2Vzc0xpbmtJc1VpQ29tcG9uZW50JCA9IHRoaXMuX3Rhc2tQcm9jZXNzTGlua1R5cGUkLnBpcGUoXG4gICAgbWFwKCh0eXBlOiBzdHJpbmcgfCBudWxsKSA9PiB0eXBlID09PSAndWktY29tcG9uZW50JylcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9wcm9jZXNzTGlua0lkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Zvcm1DdXN0b21Db21wb25lbnRDb25maWckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBGb3JtQ3VzdG9tQ29tcG9uZW50Q29uZmlnIHwge31cbiAgPih7fSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfdmlld0luaXRpYWxpemVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHB1YmxpYyBnZXQgdmlld0luaXRpYWxpemVkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fdmlld0luaXRpYWxpemVkJC5waXBlKGZpbHRlcihpbml0aWFsaXplZCA9PiBpbml0aWFsaXplZCkpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnRTZXJ2aWNlOiBEb2N1bWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpY29uU2VydmljZTogSWNvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IE5HWExvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsU2VydmljZTogVmFsdGltb01vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBlcm1pc3Npb25TZXJ2aWNlOiBQZXJtaXNzaW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb2Nlc3NMaW5rU2VydmljZTogUHJvY2Vzc0xpbmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZVNlcnZpY2U6IEZvcm1Jb1N0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhc2tJbnRlcm1lZGlhdGVTYXZlU2VydmljZTogVGFza0ludGVybWVkaWF0ZVNhdmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFza1NlcnZpY2U6IFRhc2tTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEZPUk1fVklFV19NT0RFTF9UT0tFTikgcHJpdmF0ZSByZWFkb25seSBmb3JtVmlld01vZGVsOiBGb3JtVmlld01vZGVsLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRk9STV9DVVNUT01fQ09NUE9ORU5UX1RPS0VOKSBwcml2YXRlIHJlYWRvbmx5IGZvcm1DdXN0b21Db21wb25lbnRDb25maWc6IEZvcm1DdXN0b21Db21wb25lbnRDb25maWcsXG4gICAgcHJpdmF0ZSByZWFkb25seSB1cmxSZXNvbHZlclNlcnZpY2U6IFVybFJlc29sdmVyU2VydmljZVxuICApIHtcbiAgICB0aGlzLmludGVybWVkaWF0ZVNhdmVFbmFibGVkID0gISF0aGlzLmNvbmZpZ1NlcnZpY2UuZmVhdHVyZVRvZ2dsZXM/LmVuYWJsZUludGVybWVkaWF0ZVNhdmU7XG5cbiAgICB0aGlzLmljb25TZXJ2aWNlLnJlZ2lzdGVyQWxsKFtSZWNlbnRseVZpZXdlZDE2XSk7XG5cbiAgICBjb25zdCBvcHRpb25zID0gbmV3IEZvcm1pb09wdGlvbnNJbXBsKCk7XG4gICAgb3B0aW9ucy5kaXNhYmxlQWxlcnRzID0gdHJ1ZTtcbiAgICB0aGlzLmZvcm1pb09wdGlvbnMkLm5leHQob3B0aW9ucyk7XG4gICAgdGhpcy5fZm9ybUN1c3RvbUNvbXBvbmVudENvbmZpZyQubmV4dChmb3JtQ3VzdG9tQ29tcG9uZW50Q29uZmlnKTtcbiAgfVxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuUGVybWlzc2lvblN1YnNjcmlwdGlvbigpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnRhc2tJbnRlcm1lZGlhdGVTYXZlU2VydmljZS5zZXRTdWJtaXNzaW9uKHt9KTtcbiAgICB0aGlzLl92aWV3SW5pdGlhbGl6ZWQkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl92aWV3SW5pdGlhbGl6ZWQkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgb25TdWJtaXQoc3VibWlzc2lvbjogRm9ybWlvU3VibWlzc2lvbik6IHZvaWQge1xuICAgIGlmIChzdWJtaXNzaW9uLmRhdGEpIHtcbiAgICAgIHRoaXMudGFza0ludGVybWVkaWF0ZVNhdmVTZXJ2aWNlLnNldEZvcm1Jb0Zvcm1EYXRhKHN1Ym1pc3Npb24uZGF0YSk7XG4gICAgICB0aGlzLmZvcm1Jb0Zvcm1EYXRhJC5uZXh0KHN1Ym1pc3Npb24uZGF0YSk7XG4gICAgfVxuXG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5fcHJvY2Vzc0xpbmtJZCQsIHRoaXMuX3Rhc2tQcm9jZXNzTGlua1R5cGUkLCB0aGlzLnRhc2skXSlcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKChbcHJvY2Vzc0xpbmtJZCwgdGFza1Byb2Nlc3NMaW5rVHlwZSwgdGFza10pID0+IHtcbiAgICAgICAgaWYgKHRhc2tQcm9jZXNzTGlua1R5cGUgPT09ICdmb3JtJykge1xuICAgICAgICAgIGlmIChwcm9jZXNzTGlua0lkKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NMaW5rU2VydmljZVxuICAgICAgICAgICAgICAuc3VibWl0Rm9ybShwcm9jZXNzTGlua0lkLCBzdWJtaXNzaW9uLmRhdGEsIHRhc2s/LmJ1c2luZXNzS2V5LCB0YXNrPy5pZClcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogKF86IEZvcm1TdWJtaXNzaW9uUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlVGFzayh0YXNrKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcnMgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLnNob3dFcnJvcnMoZXJyb3JzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGFza1Byb2Nlc3NMaW5rVHlwZSA9PT0gJ2Zvcm0tdmlldy1tb2RlbCcpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlVGFzayh0YXNrKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY29tcGxldGVUYXNrKHRhc2s6IFRhc2sgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCF0YXNrKSByZXR1cm47XG5cbiAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKFxuICAgICAgYCR7dGFzay5uYW1lfSAke3RoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd0YXNrRGV0YWlsLnRhc2tDb21wbGV0ZWQnKX1gXG4gICAgKTtcbiAgICB0aGlzLnRhc2skLm5leHQobnVsbCk7XG4gICAgdGhpcy5mb3JtU3VibWl0LmVtaXQoKTtcbiAgICB0aGlzLmNsb3NlTW9kYWxFdmVudC5lbWl0KCk7XG4gICAgdGhpcy5hY3RpdmVDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICBpZiAodGhpcy5mb3JtRmxvdykgdGhpcy5mb3JtRmxvdy5zYXZlRGF0YSgpO1xuICB9XG5cbiAgcHVibGljIG9uQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuZGF0YSkge1xuICAgICAgdGhpcy50YXNrSW50ZXJtZWRpYXRlU2F2ZVNlcnZpY2Uuc2V0Rm9ybUlvRm9ybURhdGEoZXZlbnQuZGF0YSk7XG4gICAgICB0aGlzLmZvcm1Jb0Zvcm1EYXRhJC5uZXh0KGV2ZW50LmRhdGEpO1xuICAgICAgdGhpcy5hY3RpdmVDaGFuZ2UuZW1pdCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25Gb3JtRmxvd0NoYW5nZUV2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRUYXNrRGV0YWlscyh0YXNrOiBUYXNrLCBwcm9jZXNzTGluaz86IFRhc2tQcm9jZXNzTGlua1Jlc3VsdCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRUYXNrUHJvY2Vzc0xpbmtUeXBlKCk7XG4gICAgdGhpcy5yZXNldEZvcm1EZWZpbml0aW9uKCk7XG5cbiAgICB0aGlzLnRhc2tJbnN0YW5jZUlkJC5uZXh0KHRhc2suaWQpO1xuXG4gICAgaWYgKCFwcm9jZXNzTGluaykge1xuICAgICAgdGhpcy5nZXRUYXNrUHJvY2Vzc0xpbmsodGFzay5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0VGFza1Byb2Nlc3NMaW5rKHByb2Nlc3NMaW5rKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldERvY3VtZW50RGVmaW5pdGlvbk5hbWVJblNlcnZpY2UodGFzayk7XG4gICAgY29uc3QgZG9jdW1lbnRJZCA9IHRhc2suYnVzaW5lc3NLZXk7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0RG9jdW1lbnRJZChkb2N1bWVudElkKTtcblxuICAgIHRoaXMudGFzayQubmV4dCh0YXNrKTtcbiAgICB0aGlzLnBhZ2UkLm5leHQoe1xuICAgICAgdGl0bGU6IHRhc2submFtZSxcbiAgICAgIHN1YnRpdGxlOiBgJHt0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgndGFza0RldGFpbC50YXNrQ3JlYXRlZCcpfSAke3Rhc2suY3JlYXRlZH1gLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDdXJyZW50UHJvZ3Jlc3MoZm9ybVZpZXdNb2RlbENvbXBvbmVudFJlZj86IENvbXBvbmVudFJlZjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy50YXNrSW5zdGFuY2VJZCRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIodmFsdWUgPT4gISF2YWx1ZSksXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgodGFza0luc3RhbmNlSWQ6IHN0cmluZyB8IG51bGwpID0+XG4gICAgICAgICAgdGhpcy50YXNrSW50ZXJtZWRpYXRlU2F2ZVNlcnZpY2UuZ2V0SW50ZXJtZWRpYXRlU3VibWlzc2lvbih0YXNrSW5zdGFuY2VJZCA/PyAnJylcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChpbnRlcm1lZGlhdGVTdWJtaXNzaW9uOiBJbnRlcm1lZGlhdGVTdWJtaXNzaW9uKSA9PiB7XG4gICAgICAgICAgdGhpcy50YXNrSW50ZXJtZWRpYXRlU2F2ZVNlcnZpY2Uuc2V0U3VibWlzc2lvbih7XG4gICAgICAgICAgICBkYXRhOiBpbnRlcm1lZGlhdGVTdWJtaXNzaW9uPy5zdWJtaXNzaW9uIHx8IHt9LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKGZvcm1WaWV3TW9kZWxDb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIGZvcm1WaWV3TW9kZWxDb21wb25lbnRSZWYuaW5zdGFuY2Uuc3VibWlzc2lvbiA9IHtcbiAgICAgICAgICAgICAgZGF0YTogaW50ZXJtZWRpYXRlU3VibWlzc2lvbi5zdWJtaXNzaW9uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFza1Byb2Nlc3NMaW5rKHRhc2tJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50YXNrU2VydmljZS5nZXRUYXNrUHJvY2Vzc0xpbmsodGFza0lkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgdGhpcy5zZXRUYXNrUHJvY2Vzc0xpbmsocmVzKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogXyA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUYXNrUHJvY2Vzc0xpbmsocHJvY2Vzc0xpbmtSZXN1bHQ6IFRhc2tQcm9jZXNzTGlua1Jlc3VsdCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAocHJvY2Vzc0xpbmtSZXN1bHQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocHJvY2Vzc0xpbmtSZXN1bHQ/LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICAgICAgdGhpcy5fdGFza1Byb2Nlc3NMaW5rVHlwZSQubmV4dCgnZm9ybScpO1xuICAgICAgICAgIHRoaXMuX3Byb2Nlc3NMaW5rSWQkLm5leHQocHJvY2Vzc0xpbmtSZXN1bHQucHJvY2Vzc0xpbmtJZCk7XG4gICAgICAgICAgaWYgKHRoaXMuaW50ZXJtZWRpYXRlU2F2ZUVuYWJsZWQpIHRoaXMuZ2V0Q3VycmVudFByb2dyZXNzKCk7XG4gICAgICAgICAgdGhpcy5zZXRGb3JtRGVmaW5pdGlvbihwcm9jZXNzTGlua1Jlc3VsdC5wcm9wZXJ0aWVzLnByZWZpbGxlZEZvcm0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdmb3JtLWZsb3cnOlxuICAgICAgICAgIHRoaXMuX3Rhc2tQcm9jZXNzTGlua1R5cGUkLm5leHQoJ2Zvcm0tZmxvdycpO1xuICAgICAgICAgIHRoaXMuZm9ybUZsb3dJbnN0YW5jZUlkJC5uZXh0KHByb2Nlc3NMaW5rUmVzdWx0LnByb3BlcnRpZXMuZm9ybUZsb3dJbnN0YW5jZUlkID8/ICcnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZm9ybS12aWV3LW1vZGVsJzpcbiAgICAgICAgICB0aGlzLl90YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KCdmb3JtLXZpZXctbW9kZWwnKTtcbiAgICAgICAgICB0aGlzLl9wcm9jZXNzTGlua0lkJC5uZXh0KHByb2Nlc3NMaW5rUmVzdWx0LnByb2Nlc3NMaW5rSWQpO1xuICAgICAgICAgIHRoaXMuZm9ybURlZmluaXRpb24kLm5leHQocHJvY2Vzc0xpbmtSZXN1bHQucHJvcGVydGllcy5mb3JtRGVmaW5pdGlvbik7XG4gICAgICAgICAgdGhpcy5mb3JtTmFtZSQubmV4dChwcm9jZXNzTGlua1Jlc3VsdC5wcm9wZXJ0aWVzLmZvcm1OYW1lID8/ICcnKTtcbiAgICAgICAgICB0aGlzLnNldEZvcm1WaWV3TW9kZWxDb21wb25lbnQoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgICB0aGlzLl90YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KCd1cmwnKTtcbiAgICAgICAgICB0aGlzLl9wcm9jZXNzTGlua0lkJC5uZXh0KHByb2Nlc3NMaW5rUmVzdWx0LnByb2Nlc3NMaW5rSWQpO1xuICAgICAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMucHJvY2Vzc0xpbmtTZXJ2aWNlLmdldFZhcmlhYmxlcygpLCB0aGlzLnRhc2skXSlcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChbdmFyaWFibGVzLCB0YXNrXSkgPT4ge1xuICAgICAgICAgICAgICBsZXQgdXJsID0gdGhpcy51cmxSZXNvbHZlclNlcnZpY2UucmVzb2x2ZVVybFZhcmlhYmxlcyhcbiAgICAgICAgICAgICAgICBwcm9jZXNzTGlua1Jlc3VsdC5wcm9wZXJ0aWVzLnVybCxcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXMudmFyaWFibGVzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpLmZvY3VzKCk7XG4gICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xpbmtTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLnN1Ym1pdFVSTFByb2Nlc3NMaW5rKHByb2Nlc3NMaW5rUmVzdWx0LnByb2Nlc3NMaW5rSWQsIHRhc2suYnVzaW5lc3NLZXksIHRhc2suaWQpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlVGFzayh0YXNrKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd1aS1jb21wb25lbnQnOlxuICAgICAgICAgIHRoaXMuX3Rhc2tQcm9jZXNzTGlua1R5cGUkLm5leHQoJ3VpLWNvbXBvbmVudCcpO1xuICAgICAgICAgIHRoaXMuX3Byb2Nlc3NMaW5rSWQkLm5leHQocHJvY2Vzc0xpbmtSZXN1bHQucHJvY2Vzc0xpbmtJZCk7XG4gICAgICAgICAgdGhpcy5mb3JtRGVmaW5pdGlvbiQubmV4dChudWxsKTtcbiAgICAgICAgICB0aGlzLmZvcm1OYW1lJC5uZXh0KCcnKTtcbiAgICAgICAgICB0aGlzLnNldEZvcm1DdXN0b21Db21wb25lbnQocHJvY2Vzc0xpbmtSZXN1bHQucHJvcGVydGllcy5jb21wb25lbnRLZXkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb3BlblBlcm1pc3Npb25TdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc2skLnN1YnNjcmliZSh0YXNrID0+IHtcbiAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ2hlY2tpbmcgaWYgdXNlciBhbGxvd2VkIHRvIGFzc2lnbiBhIHVzZXIgdG8gVGFzayB3aXRoIGlkOicsIHRhc2suaWQpO1xuICAgICAgICAgIHRoaXMucGVybWlzc2lvblNlcnZpY2VcbiAgICAgICAgICAgIC5yZXF1ZXN0UGVybWlzc2lvbihDQU5fQVNTSUdOX1RBU0tfUEVSTUlTU0lPTiwge1xuICAgICAgICAgICAgICByZXNvdXJjZTogVEFTS19ERVRBSUxfUEVSTUlTU0lPTl9SRVNPVVJDRS50YXNrLFxuICAgICAgICAgICAgICBpZGVudGlmaWVyOiB0YXNrLmlkLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGFsbG93ZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5jYW5Bc3NpZ25Vc2VyVG9UYXNrJC5uZXh0KGFsbG93ZWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1Jlc2V0IGlzIHVzZXIgYWxsb3dlZCB0byBhc3NpZ24gYSB1c2VyIHRvIFRhc2sgYXMgdGFzayBpcyBudWxsJyk7XG4gICAgICAgICAgdGhpcy5jYW5Bc3NpZ25Vc2VyVG9UYXNrJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRGb3JtRGVmaW5pdGlvbihmb3JtRGVmaW5pdGlvbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fdGFza1Byb2Nlc3NMaW5rVHlwZSQubmV4dCgnZm9ybScpO1xuICAgIHRoaXMuZm9ybURlZmluaXRpb24kLm5leHQoZm9ybURlZmluaXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRGb3JtVmlld01vZGVsQ29tcG9uZW50KCkge1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuX3ZpZXdJbml0aWFsaXplZCQsIHRoaXMucHJvY2Vzc0xpbmtJc0Zvcm1WaWV3TW9kZWwkXSkuc3Vic2NyaWJlKFxuICAgICAgKFt2aWV3SW5pdGlhbGl6ZWQsIGlzRnZtXSkgPT4ge1xuICAgICAgICBpZiAodmlld0luaXRpYWxpemVkICYmIGlzRnZtKSB7XG4gICAgICAgICAgdGhpcy5mb3JtVmlld01vZGVsRHluYW1pY0NvbnRhaW5lci5jbGVhcigpO1xuICAgICAgICAgIGlmICghdGhpcy5mb3JtVmlld01vZGVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGZvcm1WaWV3TW9kZWxDb21wb25lbnQgPSB0aGlzLmZvcm1WaWV3TW9kZWxEeW5hbWljQ29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChcbiAgICAgICAgICAgIHRoaXMuZm9ybVZpZXdNb2RlbC5jb21wb25lbnRcbiAgICAgICAgICApO1xuICAgICAgICAgIGZvcm1WaWV3TW9kZWxDb21wb25lbnQuaW5zdGFuY2UuZm9ybSA9IHRoaXMuZm9ybURlZmluaXRpb24kLmdldFZhbHVlKCk7XG4gICAgICAgICAgZm9ybVZpZXdNb2RlbENvbXBvbmVudC5pbnN0YW5jZS5mb3JtTmFtZSA9IHRoaXMuZm9ybU5hbWUkLmdldFZhbHVlKCk7XG4gICAgICAgICAgZm9ybVZpZXdNb2RlbENvbXBvbmVudC5pbnN0YW5jZS50YXNrSW5zdGFuY2VJZCA9IHRoaXMudGFza0luc3RhbmNlSWQkLmdldFZhbHVlKCk7XG4gICAgICAgICAgZm9ybVZpZXdNb2RlbENvbXBvbmVudC5pbnN0YW5jZS5pc1N0YXJ0Rm9ybSA9IGZhbHNlO1xuXG4gICAgICAgICAgZm9ybVZpZXdNb2RlbENvbXBvbmVudC5pbnN0YW5jZS5mb3JtU3VibWl0XG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMudGFzayQpLFxuICAgICAgICAgICAgICB0YWtlKDEpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh0YXNrOiBUYXNrIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlVGFzayh0YXNrKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHRoaXMuaW50ZXJtZWRpYXRlU2F2ZUVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgICAgICAgICBmb3JtVmlld01vZGVsQ29tcG9uZW50Lmluc3RhbmNlLnN1Ym1pc3Npb24kLnN1YnNjcmliZShzdWJtaXNzaW9uID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhc2tJbnRlcm1lZGlhdGVTYXZlU2VydmljZS5zZXRTdWJtaXNzaW9uKHN1Ym1pc3Npb24pO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgICAgICAgICB0aGlzLnN1Ym1pc3Npb24kLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSkuc3Vic2NyaWJlKChzdWJtaXNzaW9uPykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdWJtaXNzaW9uPy5kYXRhICYmIE9iamVjdC5rZXlzKHN1Ym1pc3Npb24uZGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICBmb3JtVmlld01vZGVsQ29tcG9uZW50Lmluc3RhbmNlLnN1Ym1pc3Npb24gPSB7ZGF0YToge319O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmdldEN1cnJlbnRQcm9ncmVzcyhmb3JtVmlld01vZGVsQ29tcG9uZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgIHRoaXMuY2xvc2VNb2RhbEV2ZW50LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIGZvcm1WaWV3TW9kZWxDb21wb25lbnQuZGVzdHJveSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Rm9ybUN1c3RvbUNvbXBvbmVudChmb3JtQ3VzdG9tQ29tcG9uZW50S2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLl92aWV3SW5pdGlhbGl6ZWQkLCB0aGlzLnByb2Nlc3NMaW5rSXNVaUNvbXBvbmVudCRdKS5zdWJzY3JpYmUoXG4gICAgICAoW3ZpZXdJbml0aWFsaXplZCwgaXNVaUNvbXBvbmVudF0pID0+IHtcbiAgICAgICAgaWYgKHZpZXdJbml0aWFsaXplZCAmJiBpc1VpQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhpcy5mb3JtQ3VzdG9tQ29tcG9uZW50RHluYW1pY0NvbnRhaW5lci5jbGVhcigpO1xuICAgICAgICAgIGlmICghdGhpcy5mb3JtQ3VzdG9tQ29tcG9uZW50Q29uZmlnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCByZW5kZXJlZENvbXBvbmVudDpDb21wb25lbnRSZWY8Rm9ybUN1c3RvbUNvbXBvbmVudD47XG4gICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgICAgICB0aGlzLl9mb3JtQ3VzdG9tQ29tcG9uZW50Q29uZmlnJC5zdWJzY3JpYmUoZm9ybUN1c3RvbUNvbXBvbmVudENvbmZpZyA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUNvbXBvbmVudCA9IGZvcm1DdXN0b21Db21wb25lbnRDb25maWdbZm9ybUN1c3RvbUNvbXBvbmVudEtleV07XG4gICAgICAgICAgICAgIHJlbmRlcmVkQ29tcG9uZW50ID0gdGhpcy5mb3JtQ3VzdG9tQ29tcG9uZW50RHluYW1pY0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoXG4gICAgICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50XG4gICAgICAgICAgICAgICkgYXMgQ29tcG9uZW50UmVmPEZvcm1DdXN0b21Db21wb25lbnQ+O1xuXG4gICAgICAgICAgICAgIHJlbmRlcmVkQ29tcG9uZW50Lmluc3RhbmNlLnRhc2tJbnN0YW5jZUlkID0gdGhpcy50YXNrSW5zdGFuY2VJZCQudmFsdWU7XG4gICAgICAgICAgICAgIHJlbmRlcmVkQ29tcG9uZW50Lmluc3RhbmNlLnN1Ym1pdHRlZEV2ZW50LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZU1vZGFsRXZlbnQuZW1pdCgpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgIHRoaXMuY2xvc2VNb2RhbEV2ZW50LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHJlbmRlcmVkQ29tcG9uZW50LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Rm9ybURlZmluaXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtRGVmaW5pdGlvbiQubmV4dChudWxsKTtcbiAgICB0aGlzLmxvYWRpbmckLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0VGFza1Byb2Nlc3NMaW5rVHlwZSgpOiB2b2lkIHtcbiAgICB0aGlzLl90YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX3Byb2Nlc3NMaW5rSWQkLm5leHQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIHNldERvY3VtZW50RGVmaW5pdGlvbk5hbWVJblNlcnZpY2UodGFzazogVGFzayk6IHZvaWQge1xuICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlXG4gICAgICAuZ2V0UHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbkZyb21Qcm9jZXNzSW5zdGFuY2VJZCh0YXNrLnByb2Nlc3NJbnN0YW5jZUlkKVxuICAgICAgLnN1YnNjcmliZShwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uID0+IHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9IHByb2Nlc3NEb2N1bWVudERlZmluaXRpb24uaWQuZG9jdW1lbnREZWZpbml0aW9uSWQubmFtZTtcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uuc2V0RG9jdW1lbnREZWZpbml0aW9uTmFtZShkb2N1bWVudERlZmluaXRpb25OYW1lKTtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0RG9jdW1lbnREZWZpbml0aW9uTmFtZShkb2N1bWVudERlZmluaXRpb25OYW1lKTtcbiAgICAgIH0pO1xuICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG5cbjxuZy1jb250YWluZXJcbiAgKm5nSWY9XCJ7XG4gICAgbG9hZGluZzogbG9hZGluZyQgfCBhc3luYyxcbiAgICBwYWdlOiBwYWdlJCB8IGFzeW5jLFxuICAgIHRhc2s6IHRhc2skIHwgYXN5bmMsXG4gICAgdGFza0lkOiB0YXNrSW5zdGFuY2VJZCQgfCBhc3luYyxcbiAgICBmb3JtRGVmaW5pdGlvbjogZm9ybURlZmluaXRpb24kIHwgYXN5bmMsXG4gICAgZm9ybURlZmluaXRpb25JZDogZm9ybURlZmluaXRpb25JZCQgfCBhc3luYyxcbiAgICBmb3JtTmFtZTogZm9ybU5hbWUkIHwgYXN5bmMsXG4gICAgZm9ybUlvRm9ybURhdGE6IGZvcm1Jb0Zvcm1EYXRhJCB8IGFzeW5jLFxuICAgIHN1Ym1pc3Npb246IHN1Ym1pc3Npb24kIHwgYXN5bmMsXG4gICAgcHJvY2Vzc0xpbmtJc0Zvcm06IHByb2Nlc3NMaW5rSXNGb3JtJCB8IGFzeW5jLFxuICAgIHByb2Nlc3NMaW5rSXNGb3JtVmlld01vZGVsOiBwcm9jZXNzTGlua0lzRm9ybVZpZXdNb2RlbCQgfCBhc3luYyxcbiAgICBwcm9jZXNzTGlua0lzVWlDb21wb25lbnQ6IHByb2Nlc3NMaW5rSXNVaUNvbXBvbmVudCQgfCBhc3luYyxcbiAgICBmb3JtaW9PcHRpb25zOiBmb3JtaW9PcHRpb25zJCB8IGFzeW5jLFxuICAgIHByb2Nlc3NMaW5rSXNGb3JtRmxvdzogcHJvY2Vzc0xpbmtJc0Zvcm1GbG93JCB8IGFzeW5jLFxuICAgIGZvcm1GbG93SW5zdGFuY2VJZDogZm9ybUZsb3dJbnN0YW5jZUlkJCB8IGFzeW5jLFxuICAgIGVycm9yTWVzc2FnZTogZXJyb3JNZXNzYWdlJCB8IGFzeW5jLFxuICAgIGNhbkFzc2lnblVzZXJUb1Rhc2s6IGNhbkFzc2lnblVzZXJUb1Rhc2skIHwgYXN5bmMsXG4gIH0gYXMgb2JzXCJcbj5cbiAgPHZhbHRpbW8tZm9ybS1pb1xuICAgICNmb3JtXG4gICAgKm5nSWY9XCJvYnMuZm9ybURlZmluaXRpb24gJiYgb2JzLnByb2Nlc3NMaW5rSXNGb3JtICYmICFvYnMucHJvY2Vzc0xpbmtJc1VpQ29tcG9uZW50ICYmICFvYnMucHJvY2Vzc0xpbmtJc0Zvcm1WaWV3TW9kZWxcIlxuICAgIFtmb3JtXT1cIm9icy5mb3JtRGVmaW5pdGlvblwiXG4gICAgW3N1Ym1pc3Npb25dPVwib2JzLnN1Ym1pc3Npb25cIlxuICAgIChzdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiXG4gICAgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICBbb3B0aW9uc109XCJvYnMuZm9ybWlvT3B0aW9uc1wiXG4gID48L3ZhbHRpbW8tZm9ybS1pbz5cblxuICA8dmFsdGltby1mb3JtLWZsb3dcbiAgICAjZm9ybUZsb3dcbiAgICAqbmdJZj1cIm9icy5wcm9jZXNzTGlua0lzRm9ybUZsb3dcIlxuICAgIFtmb3JtSW9Gb3JtRGF0YV09XCJmb3JtSW9Gb3JtRGF0YSRcIlxuICAgIFtmb3JtRmxvd0luc3RhbmNlSWRdPVwib2JzLmZvcm1GbG93SW5zdGFuY2VJZFwiXG4gICAgKGZvcm1GbG93Q29tcGxldGUpPVwiY29tcGxldGVUYXNrKG9icy50YXNrKVwiXG4gICAgKGZvcm1GbG93Q2hhbmdlKT1cIm9uRm9ybUZsb3dDaGFuZ2VFdmVudCgpXCJcbiAgPjwvdmFsdGltby1mb3JtLWZsb3c+XG5cbiAgPGRpdiAqbmdJZj1cIm9icy5sb2FkaW5nXCIgY2xhc3M9XCJ0ZXh0LWJsYWNrIG1iLTAgcC0zIHRleHQtY2VudGVyXCI+XG4gICAge3sgJ2Zvcm1NYW5hZ2VtZW50LmxvYWRpbmcnIHwgdHJhbnNsYXRlIH19XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICAqbmdJZj1cIlxuICAgICAgb2JzLmxvYWRpbmcgPT09IGZhbHNlICYmXG4gICAgICAhb2JzLmZvcm1EZWZpbml0aW9uICYmXG4gICAgICAhb2JzLmZvcm1GbG93SW5zdGFuY2VJZCAmJlxuICAgICAgIW9icy5lcnJvck1lc3NhZ2UgJiZcbiAgICAgICFvYnMucHJvY2Vzc0xpbmtJc1VpQ29tcG9uZW50XG4gICAgXCJcbiAgICBjbGFzcz1cImJnLXdhcm5pbmcgdGV4dC1ibGFjayBtYi0wIHAtMyB0ZXh0LWNlbnRlclwiXG4gID5cbiAgICB7e1xuICAgICAgKGlzQWRtaW4kIHwgYXN5bmMpXG4gICAgICAgID8gKCdmb3JtTWFuYWdlbWVudC5ub0Zvcm1EZWZpbml0aW9uRm91bmRBZG1pbicgfCB0cmFuc2xhdGUpXG4gICAgICAgIDogKCdmb3JtTWFuYWdlbWVudC5ub0Zvcm1EZWZpbml0aW9uRm91bmRVc2VyJyB8IHRyYW5zbGF0ZSlcbiAgICB9fVxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwib2JzLmVycm9yTWVzc2FnZVwiIGNsYXNzPVwiYmctZGFuZ2VyIHRleHQtYmxhY2sgbWItMCBwLTMgdGV4dC1jZW50ZXJcIj5cbiAgICB7eyBvYnMuZXJyb3JNZXNzYWdlIH19XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJtLTJcIj5cbiAgICA8bmctdGVtcGxhdGUgI2Zvcm1WaWV3TW9kZWxDb21wb25lbnQ+PC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2Zvcm1DdXN0b21Db21wb25lbnQ+PC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==